TheChief
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Понять бы ещё как им пользоваться. | Вдумчиво курить мануал. Вот примерно так я получал инфу о загруженности каналов OpenVPN-клиентами: ------------------------------------------------------ """ импортируем библиотеки """ from openvpn_status import parse_status import json import urllib.request import http.cookiejar server = "https://192.168.108.1:4081" serverRC = "https://192.168.112.1:4081" username = "admin" usernameRC = "admin" password = "офигеть-пароль-от-центрального-фоиса" passwordRC = "офигеть-пароль-от-офиса-2" instanceips = [["188.233.32.53","116"],["213.234.12.10","120"],["37.29.79.198","124"]] scalefactor = 3.0 loadlist = [] """ инициализируем хранилище кук """ jar = http.cookiejar.CookieJar() """ инициализируем библиотеку urllib с хранилищем кук """ opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar)) urllib.request.install_opener(opener) """ объявляем функцию вызова методов """ def callMethod(toserver, method, params, token = None, debug = None): """ дёргаем API с переданными параметрами method - строка с именем метода params - строка с параметрами метода token - полученный при логине (метод Session.login) токен """ data = {"method": method ,"id":1, "jsonrpc":"2.0", "params": params} """ формируем url для http запроса через urllib """ req = urllib.request.Request(url = toserver + '/admin/api/jsonrpc/') """ добавляем заголовок для http запроса через urllib """ req.add_header('Content-Type', 'application/json') """ добавляем в заголовок токен, если он есть """ if (token is not None): req.add_header('X-Token', token) """ делаем http запрос через urllib """ httpResponse = urllib.request.urlopen(req, json.dumps(data).encode()) """ если сервер ответил 200 OK, то читаем и декодируем вывод urllib, вывод сервера парсим через json и возвращаем его в ассоциированном массиве """ if (httpResponse.status == 200): body = httpResponse.read().decode() jsonret = json.loads(body) if (debug is True): print(json.dumps(jsonret, indent=2, sort_keys=True)) return jsonret """ Здесь у нас main() — это Питон, детка, здесь всё построено на отступах! """ """ залогинимся """ session = callMethod(server, "Session.login", {"userName":username, "password":password, "application":{"vendor":"Kerio", "name":"Control Api Demo", "version":"8.4.0"}}) """ из результатов выдернем токен """ token = session["result"]["token"] """ callMethod(server, "ActiveConnections.get", {"query":{"start":0, "limit":-1, "orderBy":[] }, "refresh":True, "hostid":[]}, token, True) """ """ вызываем метод Получить интерфейсы с параметрами и полученным при логине токеном """ ifaces = callMethod(server, "Interfaces.get", {"query":{"orderBy":[],"conditions":[]}, "sortByGroup": True}, token) ifaceList = ifaces["result"]["list"] """ print(json.dumps(ifaces, indent=4, sort_keys=True)) """ for iface in ifaceList: if (iface["enabled"] == True and iface["group"] == "Internet" and iface["linkStatus"] == "Up" and iface["connectivityParameters"]["loadBalancingWeight"]["enabled"] == True ): ifaceWeight = iface["connectivityParameters"]["loadBalancingWeight"]["value"] """ print("id=", iface["id"], ", ", iface["name"], " (", iface["ip"], ") loadBalancingWeight(",ifaceWeight,")", sep="" ) """ for tryip in range(len(instanceips)): if (iface["ip"] == instanceips[tryip][0]): with open('/var/log/'+instanceips[tryip][1]+'-openvpn-status.log') as logfile: status = parse_status(logfile.read()) ovpn_clients = status.client_list """ print(iface["ip"],'{:.0f}'.format(float(ifaceWeight)*scalefactor*100/len(ovpn_clients)), sep=" ") """ loadlist.append( [ iface["ip"], int(float(ifaceWeight)*scalefactor*100/len(ovpn_clients))]) loadlist.sort(key=lambda x:x[1], reverse=True) print(loadlist[0][0], sep=" ") """ разлогинимся """ callMethod(server, "Session.logout",{}, token) -------------------------------------------------- За качество кода извЕните — это первое и единственное, что я написал на Питоне. | Всего записей: 63 | Зарегистр. 08-11-2002 | Отправлено: 14:01 28-07-2019 | Исправлено: TheChief, 14:06 28-07-2019 |
|