У меня есть скрипт python в моей установке check_mk для отправки электронной почты и SMS для виртуальных хостов и сервисов в критических случаях.Я хочу убедиться, что в течение часа будет отправлено не более 15 SMS / электронных писем, чтобы избежать спама, если физический сервер был недоступен или не работает, чтобы уведомление не отправлялось для каждой виртуальной машины и службы.Есть ли способ сделать это без файла счетчика?Может быть, работающий сервер?
Я бы сделал что-то вроде этого:
import urllib
import urllib2
from os import environ
# parameters
hosts = ['192.168.1.10', '192.168.1.11']
login = 'user'
password = 'secret'
number = 'xxxxxxxxxxxx'
def message():
if environ['NOTIFY_WHAT'] == 'HOST':
msg = "%s %s: %s (%s)" % (
environ['NOTIFY_NOTIFICATIONTYPE'],
environ['NOTIFY_HOSTNAME'],
environ['NOTIFY_HOSTOUTPUT'],
environ['NOTIFY_SHORTDATETIME'])
elif environ['NOTIFY_WHAT'] == 'SERVICE':
msg = "%s %s: %s %s (%s)" % (
environ['NOTIFY_NOTIFICATIONTYPE'],
environ['NOTIFY_HOSTNAME'],
environ['NOTIFY_SERVICEDESC'],
environ['NOTIFY_SERVICEOUTPUT'],
environ['NOTIFY_SHORTDATETIME'])
else:
msg = "Unknown: " + environ['NOTIFY_WHAT']
return msg
def sendSMS(receiver, message):
args = {'login': login, 'pass': password, 'to': receiver, 'message': message}
enc_args = urllib.urlencode(args)
sent = False
error = ''
for host in hosts:
url = 'http://%s/index.php/http_api/send_sms?%s' % (host, enc_args)
if not sent:
try:
result = urllib2.urlopen(url).read()
except urllib2.HTTPError, e:
print('sending sms via host %s failed: %s' % (host, str(e.code)))
except urllib2.URLError, e:
print('sending sms via host %s failed: %s' % (host, str(e.args)))
else:
if result.startswith('OK;'):
sent = True
print('SMS successfully sent via %s to %s.' % (host, receiver))
break
else:
sent = False
print 'Sending SMS via host %s failed: %s' % (host, result.rstrip()))
return
message = message()
sendSMS(number, message)
Скрипт читается и выполняется check_mk, он управляется через WATO.Так что я не имею власти над казнью.
Большое спасибо