ज़ादर्मा ज़ैबिक्स कमरों की निगरानी करना

मैं Zabbix और पायथन स्क्रिप्ट के लिए एक तैयार-किए गए टेम्पलेट की पेशकश करता हूं ताकि नए ज़ेडर्मा प्रदाता संख्याओं (आपके द्वारा खरीदी गई संख्याओं के अर्थ में) का स्वचालित रूप से पता लगाया जा सके।

टेम्पलेट में कई ट्रिगर हैं और कमरों के बारे में बुनियादी जानकारी है। स्क्रिप्ट Zadarma API या MySQL डेटाबेस के साथ काम करती है।

MySQL के साथ काम करने के लिए, यह आवश्यक है कि पहले से ही मुकुट पर या सीधे एक अलग स्क्रिप्ट का उपयोग करके डेटा को डायलन से डाल दिया जाए।

कट के नीचे दोनों स्क्रिप्ट।

zadarma_number.py
स्क्रिप्ट को zabbiz एजेंट के लिए स्क्रिप्ट के साथ निर्देशिका में रखा जाना चाहिए, मेरे पास यह है

/etc/zabbix/scripts/ 

इसके अलावा, इसे चलाने का अधिकार दें और मामले में, मालिक और zabbix के समूह को बदलें:

 chmod +x /etc/zabbix/scripts/zadarma_number.py chown zabbix:zabbix /etc/zabbix/scripts/zadarma_number.py 

 #! /usr/bin/env python3 import json import pymysql import argparse import sys import base64 import hmac import requests from hashlib import sha1, md5 from collections import OrderedDict from urllib.parse import urlencode api_key = '222c2fd22c2d2222a2b2' secret_key = '2a2f2222cee2222f2222' database_address = '192.168.10.18' database_name = 'asterisk' database_user = 'asterisk' database_password = 'dFgXuasfvgas45hAkEb2' zadarma_api_url = 'http://api.zadarma.com' monthly_fee_all = 0 def sql_result(sql): cursor.execute(sql) data = cursor.fetchall() return data def str_for_json(data): json_data = [] for result in data: json_data.append(dict(zip(['{#NUMBER}'], result))) json_data = ({"data":json_data}) return json.dumps(json_data) # return json.dumps(json_data) def createParser(): parser = argparse.ArgumentParser( prog='Zadarma for Zabbix', description='''       Zadarma       zabbiz .''', epilog='''(c)  2018.  ,  ,       .''' ) parser.add_argument('-l', '--allnumbers', action='store_true', help='"Show all found phone numbers in a format suitable for zabbix. ' ' Running a script without parameters (or with the -f option) leads to the same result."') parser.add_argument('-n', '--number', help = '"Phone number and -s or -S or -g or -e or -d or -m or -a "', metavar = 'phone number') parser.add_argument('-S', '--status', action='store_true') parser.add_argument('-g', '--start_date', action='store_true') parser.add_argument('-e', '--stop_date', action='store_true') parser.add_argument('-d', '--description', action='store_true') parser.add_argument('-s', '--sip', action='store_true', help='"can be used in combination with "-c""') parser.add_argument('-m', '--monthly_fee', action='store_true', help='"The amount required to renew a phone number or all phone numbers"') parser.add_argument('-a', '--autorenew', action='store_true') parser.add_argument('-b', '--balance', action='store_true', help='All balance numbers') parser.add_argument('-f', '--force_API', action='store_true',default=False, help = '"Force the use of api, the database is ignored"') parser.add_argument('-c', '--cut', type=int, default=0, help='''Used only in conjunction with "-s" 0 - The whole line, 1- Part of the string before "@", 2 - Part of the line after "@"''', metavar='[0,1,2] or none') return parser def api_zapros(method,data): if not data: data = {'format': 'json'} sorted_dict_params = OrderedDict(sorted(data.items())) query_string = urlencode(sorted_dict_params) h = md5(query_string.encode('utf8')).hexdigest() data = method + query_string + h hashed = hmac.new(secret_key.encode('utf8'), data.encode('utf8'), sha1) auth = api_key + ':' + base64.b64encode(bytes(hashed.hexdigest(), 'utf8')).decode() headers = {'User-Agent': '-', 'Authorization': auth} url = zadarma_api_url + method + '?' + query_string; r = requests.get(url, headers=headers) r.raise_for_status() return json.loads(r.text) def no_sql(*args): number = args[0] parametr = args[1] for number_string in numbers_result['info']: if number_string['number'] == number: if number_string[parametr] == 'true' or number_string[parametr] == 'on': return '0' elif number_string[parametr] == 'false' or number_string[parametr] == 'off': return '1' else: return number_string[parametr] def zapros(*args): if namespace.force_API: return no_sql(namespace.number,args[0]) else: return sql_result(sql)[0][0] parser = createParser() namespace = parser.parse_args(sys.argv[1:]) if not namespace.force_API: try: db = pymysql.connect(database_address, database_user, database_password, database_name) cursor = db.cursor() except pymysql.Error as e: print('\n\t!!!!!!!!!!!SQL no connect!!!!!!!!!!!\n') print(e) exit(1) else: try: numbers_result = api_zapros('/v1/direct_numbers/', '') balance_info = api_zapros('/v1/info/balance/', '') except Exception as e: print('Error connect API zadarma') exit(1) # print('namespace', namespace) if namespace.number and namespace.status: sql = "SELECT status FROM zadarma_numbers WHERE number = %s;" % (namespace.number) print(zapros('status')) elif namespace.number and namespace.start_date: sql = "SELECT start_date FROM zadarma_numbers WHERE number = %s;" % (namespace.number) print(zapros('start_date')) elif namespace.number and namespace.stop_date: sql = "SELECT stop_date FROM zadarma_numbers WHERE number = %s;" % (namespace.number) print(zapros('stop_date')) elif namespace.number and namespace.autorenew: sql = "SELECT autorenew FROM zadarma_numbers WHERE number = %s;" % (namespace.number) print(zapros('autorenew')) elif namespace.number and namespace.description: sql = "SELECT description FROM zadarma_numbers WHERE number = %s;" % (namespace.number) print(zapros('description')) elif namespace.number and namespace.sip: sql = "SELECT sip FROM zadarma_numbers WHERE number = %s;" % (namespace.number) if namespace.cut == 0: print(zapros('sip')) if namespace.cut == 1: try: print(zapros('sip').split('@')[0]) except IndexError: print(zapros('sip')) if namespace.cut == 2: try: print(zapros('sip').split('@')[1]) except IndexError: print(zapros('sip')) elif namespace.number and namespace.monthly_fee: sql = "SELECT monthly_fee FROM zadarma_numbers WHERE number = %s;" % (namespace.number) print(zapros('monthly_fee')) else: if namespace.number: # sql = "SELECT * FROM zadarma_numbers WHERE number = %s;" % (namespace.number) # print(zapros(namespace.number)) print(namespace.number, 'there are not enough arguments or incorrect combination of arguments') sys.exit(1) elif namespace.balance: if namespace.force_API: balance = balance_info['balance'] print(balance) else: print(sql_result('SELECT balance FROM zadarma_balance;')[0][0]) elif namespace.monthly_fee: if namespace.force_API: for result in numbers_result['info']: monthly_fee_all = monthly_fee_all + result['monthly_fee'] print(monthly_fee_all) else: print(sql_result('SELECT monthly_fee FROM zadarma_balance;')[0][0]) elif namespace.allnumbers: if namespace.force_API: json_data = [] for result in numbers_result['info']: print(result['number']) json_data.append(dict(zip(['{#NUMBER}'], [result['number']]))) json_data = ({"data": json_data}) print('jkgkgliuui',json.dumps(json_data)) else: data = sql_result('SELECT number FROM zadarma_numbers WHERE stop_date > date') print(str_for_json(data)) else: if namespace.force_API: json_data = [] for result in numbers_result['info']: json_data.append(dict(zip(['{#NUMBER}'], [result['number']]))) json_data = ({"data": json_data}) print(json.dumps(json_data)) else: data = sql_result('SELECT number FROM zadarma_numbers WHERE stop_date > date') print(str_for_json(data)) if not namespace.force_API: db.close() 


सैद्धांतिक रूप से, दिए गए डेटाबेस के साथ काम करना अधिक प्रासंगिक हो सकता है, क्योंकि प्रत्येक कॉल के बाद जानकारी जोड़ने के लिए एक स्क्रिप्ट चल सकती है। इस प्रकार, डेटाबेस में जानकारी सीधे Zabbix से एपीआई के साथ प्रत्यक्ष काम की तुलना में थोड़ा अधिक प्रासंगिक हो सकती है।

Zabbix टेम्पलेट में, मैक्रो {$ FORCE_API} स्क्रिप्ट को Zadarma API के साथ काम करने के लिए मजबूर करता है।
मैक्रो {$ CUT} का उपयोग SIP-URI अनुरोध स्ट्रिंग को "@" से पहले और बाद के भागों में विभाजित करने के लिए किया जाता है।

स्क्रिप्ट को चलाने के लिए कई कुंजियाँ हैं।

कुंजियों के बिना या -l स्विच के साथ, स्क्रिप्ट जोंस प्रारूप में संख्याओं की एक सूची लौटाएगी, जो zabbix में संख्याओं के ऑटो-डिटेक्शन के लिए उपयुक्त है।

स्क्रिप्ट कुंजी के लिए सहायता:
उपयोग: Zabbix [-h] [-l] [-n फोन नंबर] [-S] [-ग] [-ई] [-ड] [-s] के लिए ज़ादर्मा
[-एम] [-ए] [-बी] [-एफ] [-सी [०,१,२] या कोई नहीं]

यह कार्यक्रम Zadarma प्रदाता की संख्या और निगरानी के लिए बनाया गया है
मूल रूप से zabbiz एजेंट की स्क्रिप्ट के रूप में कल्पना की गई।

 optional arguments: -h, --help show this help message and exit -l, --allnumbers "Show all found phone numbers in a format suitable for zabbix. Running a script without parameters (or with the -f option) leads to the same result." -n phone number, --number phone number "Phone number and -s or -S or -g or -e or -d or -m or -a " -S, --status -g, --start_date -e, --stop_date -d, --description -s, --sip "can be used in combination with "-c"" -m, --monthly_fee "The amount required to renew a phone number or all phone numbers" -a, --autorenew -b, --balance All balance numbers -f, --force_API "Force the use of api, the database is ignored" -c [0,1,2] or none, --cut [0,1,2] or none Used only in conjunction with "-s" 0 - The whole line, 1- Part of the string before "@", 2 - Part of the line after "@" 


चाबियाँ "-S, -s, -g, -e, -d, -a" केवल एक संख्या के साथ संयोजन में उपयोग की जाती हैं
-M स्विच का उपयोग एक नंबर के साथ या उसके बिना किया जा सकता है
की-बी, केवल संख्या के बिना
-सी स्विच केवल -s स्विच के साथ
-F स्विच एपीआई के उपयोग को मजबूर करता है, इसके बिना, डेटाबेस को एक अनुरोध भेजा जाता है और इसे किसी भी स्विच के साथ उपयोग किया जा सकता है।

दूसरी स्क्रिप्ट:

स्क्रिप्ट API_to_MySql
इसलिए इसे चलाने का अधिकार दें:

 chmod +x ./main.py 

स्क्रिप्ट को कैसे कॉल किया जाए और इसे कहां रखा जाए, यह खुद तय करें।

 #! /usr/bin/env python3 from hashlib import sha1, md5 from collections import OrderedDict from urllib.parse import urlencode import hmac import requests import base64 import json import pymysql api_key = '222c2fd22c2d2222a2b2' secret_key = '2a2f2222cee2222f2222' database_address = '192.168.10.18' database_name = 'asterisk' database_user = 'asterisk' database_password = 'dFgXuasfvgas45hAkEb2' zadarma_api_url = 'http://api.zadarma.com' monthly_fee_all = 0 debug = True # debug = False db = pymysql.connect(database_address, database_user, database_password, database_name) cursor = db.cursor() def sql_insert(): sql = "REPLACE zadarma_numbers (id, date, number, number_name, description, sip, start_date, stop_date, monthly_fee, status, channels, autorenew) \ VALUES (NULL, UTC_TIMESTAMP(), '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');" % \ (number,number_name, description, sip, start_date, stop_date, monthly_fee, status, channels, autorenew) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() def zapros(method,data): if not data: data = {'format': 'json'} sorted_dict_params = OrderedDict(sorted(data.items())) query_string = urlencode(sorted_dict_params) h = md5(query_string.encode('utf8')).hexdigest() data = method + query_string + h hashed = hmac.new(secret_key.encode('utf8'), data.encode('utf8'), sha1) auth = api_key + ':' + base64.b64encode(bytes(hashed.hexdigest(), 'utf8')).decode() headers = {'User-Agent': '-', 'Authorization': auth} url = zadarma_api_url + method + '?' + query_string; r = requests.get(url, headers=headers) return json.loads(r.text) # print(r.text) numbers = zapros('/v1/direct_numbers/', '') if debug: print(numbers['info']) for res in numbers['info']: description = res['description'] number = res['number'] number_name = res['number_name'] start_date = res['start_date'] stop_date = res['stop_date'] sip = res['sip'] if res['autorenew'] == 'true': autorenew = 0 else: autorenew = 1 monthly_fee = res['monthly_fee'] if res['status'] == 'on': status = 0 else: status = 1 channels = res['channels'] monthly_fee_all = monthly_fee_all + monthly_fee if debug: print('number', number) print('description', description) print('sip',sip) print('number_name', number_name) print('start_date', start_date) print('stop_date', stop_date) print('monthly_fee',monthly_fee) print('status', status) # print('monthly_fee_all',monthly_fee_all) if autorenew != 0: if debug: print('!!!!!!!!!!!!!!!\nautorenew OFF\n!!!!!!!!!!!!!!!\n') if debug: print() sql_insert() balance_info = zapros('/v1/info/balance/','') balance = balance_info['balance'] if debug: print('balance', balance) print('monthly_fee_all',monthly_fee_all) sql = "REPLACE zadarma_balance (id, date, balance, monthly_fee) VALUES (NULL, UTC_TIMESTAMP(), '%s', '%s');" % (balance, monthly_fee_all) try: cursor.execute(sql) db.commit() except: db.rollback() if debug: print('doplata -->', balance - monthly_fee_all ) print('monthly_fee_all', monthly_fee_all) db.close() <spoiler title="  MySQL  "> 

कंसोल पर जानकारी के आउटपुट को अक्षम करने के लिए, आपको लाइन को अनइंस्टॉल करने की आवश्यकता है
debug = false


काम करने के लिए दोनों लिपियों के लिए, आपको "अनुरोध" स्थापित करने की आवश्यकता होगी

 pip install requests 

संख्या के लिए तालिका
 CREATE TABLE IF NOT EXISTS `zadarma_numbers` ( `id` int(10) NOT NULL, `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `number` varchar(12) DEFAULT NULL, `number_name` varchar(60) DEFAULT NULL, `description` varchar(60) NOT NULL DEFAULT '', `sip` varchar(80) DEFAULT NULL, `start_date` datetime NOT NULL, `stop_date` datetime NOT NULL, `monthly_fee` int(5) DEFAULT NULL, `status` int(1) DEFAULT NULL, `channels` int(3) DEFAULT NULL, `autorenew` int(1) DEFAULT NULL ) ENGINE=InnoDB AUTO_INCREMENT=205 DEFAULT CHARSET=utf8; ALTER TABLE `zadarma_numbers` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `number` (`number`), ADD KEY `calldate` (`date`), ADD KEY `accountcode` (`monthly_fee`); ALTER TABLE `zadarma_numbers` MODIFY `id` int(10) NOT NULL AUTO_INCREMENT; 


संतुलन के लिए तालिका
 CREATE TABLE IF NOT EXISTS `zadarma_balance` ( `id` int(10) NOT NULL, `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `balance` int(10) DEFAULT NULL, `monthly_fee` int(10) DEFAULT NULL ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8; ALTER TABLE `zadarma_balance` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `balance` (`balance`), ADD KEY `calldate` (`date`); ALTER TABLE `zadarma_balance` MODIFY `id` int(10) NOT NULL AUTO_INCREMENT; 


Mysql टेम्पलेट, स्क्रिप्ट और डंप के साथ भंडार

Source: https://habr.com/ru/post/hi416231/


All Articles