Python способ проверить, сколько SMS было отправлено - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть скрипт 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.Так что я не имею власти над казнью.

Большое спасибо

1 Ответ

0 голосов
/ 21 сентября 2018

Вы должны будете иметь возможность вести подсчет того, сколько смс было отправлено в течение определенного периода времени.Вы можете переместить свою функцию sendSMS в простой веб-сервис, который ваш скрипт просто публикует.Таким образом, он может отслеживать скорость вызова sendSMS и действовать соответствующим образом.

Другим способом было бы использовать redis как место для хранения вашего счета, а не как файл.

...