74 lines
3.5 KiB
Python
Executable File
74 lines
3.5 KiB
Python
Executable File
#!/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()
|