#!/usr/bin/env python3 import os import pprint import http.server as SimpleHTTPServer import socketserver as SocketServer from huawei_lte_api.Client import Client from huawei_lte_api.AuthorizedConnection import AuthorizedConnection from huawei_lte_api.Connection import Connection def prom_exporter(): MANDATORY_ENV_VARS = ["ROUTER_ADDRESS", "ROUTER_USER", "ROUTER_PASS", "PROM_PORT"] for var in MANDATORY_ENV_VARS: if var not in os.environ: raise EnvironmentError("Failed because {} is not set.".format(var)) # Auth to router conn ='http://'+os.environ.get('ROUTER_USER')+':'+os.environ.get('ROUTER_PASS')+'@'+os.environ.get('ROUTER_ADDRESS')+'/' connection = AuthorizedConnection(conn) # Initiatise client client = Client(connection) if os.environ.get('VERBOSE') is not None: pprint.pprint(client.device.signal()) # Can be accessed without authorization pprint.pprint(client.device.information()) # Needs valid authorization, will throw exception if invalid credentials are passed in URL # Set common response attributes band = client.device.signal().get('band') device = 'deviceName="'+ client.device.information().get('DeviceName')+'",iccid="'+client.device.information().get('Iccid')+'"' deviceband = device if band is not None: devband = device+',band="'+band+'"' # Retrieve attributes signal = { 'band': { 'help': 'The signal band the LTE connection is using', 'type': 'gauge', 'device': device, 'value': band}, 'rsrp': { 'help': 'The average power received from a single Reference signal in dBm', 'type': 'gauge', 'device': deviceband, 'value': client.device.signal().get('rsrp')}, 'rsrq': { 'help': 'Indicates quality of the received signal in db', 'type': 'gauge', 'device': deviceband, 'value': client.device.signal().get('rsrq')}, 'rssi': { 'help': 'Represents the entire received power including the wanted power from the serving cell as well as all co-channel power and other sources of noise in dBm', 'type': 'gauge', 'device': deviceband, 'value': client.device.signal().get('rssi')}, 'rscp': { 'help': 'Denotes the power measured by a receiver on a particular physical communication channel in dBm', 'type': 'gauge', 'device': deviceband, 'value': client.device.signal().get('rscp')}, 'sinr': { 'help': 'The signal-to-noise ratio of the given signal in dB', 'type': 'gauge', 'device': deviceband, 'value': client.device.signal().get('sinr')}, 'ecio': { 'help': 'The EC/IO is a measure of the quality/cleanliness of the signal from the tower to the modem and indicates the signal-to noise ratio in dB', 'type': 'gauge', 'device': deviceband, 'value': client.device.signal().get('ecio')} } if os.environ.get('VERBOSE') is not None: pprint.pprint(signal) # Cleanse data for attribute, info in signal.items(): if info['value'] is not None: info['value'] = info['value'].replace("dBm", "") info['value'] = info['value'].replace("dB", "") # Populate response response=[] for attribute, info in signal.items(): if attribute is not None and info['value'] is not None: response.append('#HELP '+attribute+' '+info['help']) response.append('#TYPE '+attribute+' '+info['type']) response.append(attribute+'{'+info['device']+'} '+info['value']) return '\n'.join(response) class GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): timeout=5 def do_GET(self): self.send_response(200) self.end_headers() self.wfile.write(prom_exporter().encode()) Handler = GetHandler httpd = SocketServer.TCPServer(("", int(os.environ.get('PROM_PORT'))), Handler) httpd.serve_forever()