huawei_lte_exporter/huwawei_lte_exporter
SebClem dd658be7ef
All checks were successful
ci / docker (push) Successful in 15s
Logout user
2024-03-28 11:00:54 +01:00

86 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import pprint
import configparser
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():
# Auth to router
conn ='http://'+config['DEFAULT']['ROUTER_USER']+':'+config['DEFAULT']['ROUTER_PASS']+'@'+config['DEFAULT']['ROUTER_ADDRESS']+'/'
connection = AuthorizedConnection(conn)
# Initiatise client
client = Client(connection)
if os.environ.get('VERBOSE') is not None:
pprint.pprint(client.device.signal())
pprint.pprint(client.device.information())
# 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:
deviceband = 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", "")
info['value'] = info['value'].replace(">=", "")
# 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'])
client.user.logout()
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())
#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))
config = configparser.ConfigParser()
config.read('huwawei_lte_exporter.ini')
MANDATORY_ENV_VARS = ["ROUTER_ADDRESS", "ROUTER_USER", "ROUTER_PASS", "PROM_PORT"]
for var in MANDATORY_ENV_VARS:
if var in os.environ:
config['DEFAULT'][var] = os.environ[var]
Handler = GetHandler
httpd = SocketServer.TCPServer(("", int(config['DEFAULT']['PROM_PORT'])), Handler)
httpd.serve_forever()