· last year · Jul 10, 2024, 03:35 PM
1import requests
2from prometheus_client import start_http_server, Gauge
3import time
4
5# API endpoints
6login_url = "http://1.1.1.1/api/login"
7status_url = "http://1.1.1.1/api/wireless/interfaces/status"
8
9# Login credentials
10login_payload = {
11 "username": "admin",
12 "password": "admin"
13}
14
15# Prometheus metrics
16frequency_gauge = Gauge('wireless_interface_frequency', 'Frequency of wireless interfaces', ['interface'])
17signal_gauge = Gauge('wireless_interface_signal', 'Signal strength of wireless interfaces', ['interface'])
18tx_rate_gauge = Gauge('wireless_interface_tx_rate', 'TX rate of wireless interfaces', ['interface'])
19rx_rate_gauge = Gauge('wireless_interface_rx_rate', 'RX rate of wireless interfaces', ['interface'])
20macaddr_gauge = Gauge('wireless_interface_macaddr', 'MAC address of clients', ['interface', 'macaddr'])
21
22def get_token():
23 """Perform the login POST request and retrieve the token."""
24 response = requests.post(login_url, json=login_payload)
25 if response.status_code == 200:
26 response_json = response.json()
27 print("Login response JSON:")
28 print(response_json)
29 token = response_json.get('token')
30 if not token:
31 print("Available keys in the response:", response_json.keys())
32 for key in response_json.keys():
33 if isinstance(response_json[key], dict):
34 token = response_json[key].get('token')
35 if token:
36 break
37 print(f"Extracted token: {token}")
38 return token
39 else:
40 print(f"Login failed: {response.status_code}")
41 print(response.text)
42 return None
43
44def fetch_and_update_metrics(token):
45 """Fetch wireless interface status and update Prometheus metrics."""
46 headers = {
47 "Authorization": f"Bearer {token}"
48 }
49 status_response = requests.get(status_url, headers=headers)
50 if status_response.status_code == 200:
51 status_data = status_response.json()
52 print("Wireless Interfaces Status:")
53 print(status_data)
54 # Update metrics with the status data
55 interfaces = status_data.get('data', [])
56 for interface in interfaces:
57 interface_name = interface.get('ifname')
58 frequency = interface.get('freq')
59 signal = interface.get('signal')
60
61 # Extract tx_rate, rx_rate, and macaddr for clients
62 clients = interface.get('clients', [])
63 for client in clients:
64 tx_rate = client.get('tx_rate')
65 rx_rate = client.get('rx_rate')
66 macaddr = client.get('macaddr')
67
68 if tx_rate is not None:
69 tx_rate_gauge.labels(interface=interface_name).set(tx_rate)
70 if rx_rate is not None:
71 rx_rate_gauge.labels(interface=interface_name).set(rx_rate)
72 if macaddr is not None:
73 macaddr_gauge.labels(interface=interface_name, macaddr=macaddr).set(1) # Setting it to 1 to indicate presence
74
75 if interface_name == "wlan0-1":
76 if frequency is not None:
77 frequency_gauge.labels(interface=interface_name).set(frequency)
78 if signal is not None:
79 signal_gauge.labels(interface=interface_name).set(signal)
80 else:
81 print(f"Failed to get status: {status_response.status_code}")
82 print(status_response.text)
83
84def main():
85 # Start the Prometheus exporter
86 start_http_server(8000)
87 print("Prometheus exporter started on port 8000")
88
89 while True:
90 token = get_token()
91 if token:
92 fetch_and_update_metrics(token)
93 # Sleep for 60 seconds before fetching the data again
94 time.sleep(60)
95
96if __name__ == "__main__":
97 main()