from prometheus_client import start_http_server, Gauge
import time
import subprocess
import re
pcs = [
{"ip": "10.10.20.28", "pc":13, "location": "HUB1"},
{"ip": "10.10.20.82", "pc":12, "location": "HUB1"},
{"ip": "10.10.20.76", "pc":11, "location": "HUB1"},
{"ip": "10.10.20.31", "pc":16, "location": "HUB1"},
{"ip": "10.10.20.27", "pc":15, "location": "HUB1"},
{"ip": "10.10.20.26", "pc":14, "location": "HUB1"},
{"ip": "10.10.20.40", "pc":23, "location": "HUB2"},
{"ip": "10.10.20.30", "pc":22, "location": "HUB2"},
{"ip": "10.10.20.43", "pc":21, "location": "HUB2"},
{"ip": "10.10.20.66", "pc":26, "location": "HUB2"},
{"ip": "10.10.20.52", "pc":25, "location": "HUB2"},
{"ip": "10.10.20.34", "pc":24, "location": "HUB2"},
{"ip": "10.10.20.104", "pc":33, "location": "HUB3"},
{"ip": "10.10.20.60", "pc":32, "location": "HUB3"},
{"ip": "10.10.20.4", "pc":31, "location": "HUB3"},
{"ip": "10.10.20.103", "pc":36, "location": "HUB3"},
{"ip": "10.10.20.65", "pc":35, "location": "HUB3"},
{"ip": "10.10.20.5", "pc":34, "location": "HUB3"},
{"ip": "10.10.20.33", "pc":43, "location": "HUB4"},
{"ip": "10.10.20.16", "pc":42, "location": "HUB4"},
{"ip": "10.10.20.22", "pc":41, "location": "HUB4"},
{"ip": "10.10.20.8", "pc":46, "location": "HUB4"},
{"ip": "10.10.20.70", "pc":45, "location": "HUB4"},
{"ip": "10.10.20.29", "pc":44, "location": "HUB4"},
{"ip": "10.10.20.18", "pc":53, "location": "HUB5"},
{"ip": "10.10.20.9", "pc":52, "location": "HUB5"},
{"ip": "10.10.20.46", "pc":51, "location": "HUB5"},
{"ip": "10.10.20.10", "pc":56, "location": "HUB5"},
{"ip": "10.10.20.86", "pc":55, "location": "HUB5"},
{"ip": "10.10.20.127", "pc":54, "location": "HUB5"},
{"ip": "10.10.20.98", "pc":63, "location": "HUB6"},
{"ip": "10.10.20.137", "pc":62, "location": "HUB6"},
{"ip": "10.10.20.15", "pc":61, "location": "HUB6"},
{"ip": "10.10.20.72", "pc":66, "location": "HUB6"},
{"ip": "10.10.20.21", "pc":65, "location": "HUB6"},
{"ip": "10.10.20.90", "pc":64, "location": "HUB6"},
{"ip": "10.10.20.88", "pc":73, "location": "HUB7"},
{"ip": "10.10.20.58", "pc":72, "location": "HUB7"},
{"ip": "10.10.20.132", "pc":71, "location": "HUB7"},
{"ip": "10.10.20.25", "pc":76, "location": "HUB7"},
{"ip": "10.10.20.74", "pc":75, "location": "HUB7"},
{"ip": "10.10.20.87", "pc":74, "location": "HUB7"},
]
pc_status = Gauge('pc_status', 'Status of PCs (1 = online, 0 = offline)', ['ip', 'location', 'pc'])
def run_arp_scan(network):
"""
Run arp-scan command on the network.
Returns a set of IPs that responded.
"""
try:
# Check if arp-scan is installed
try:
subprocess.run(['which', 'arp-scan'], check=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
except:
print("arp-scan not found. Install with: sudo apt-get install arp-scan")
return set()
# Run the scan on the specified network
print(f"Running arp-scan on {network}...")
result = subprocess.run(
['sudo', 'arp-scan', '--interface=wlan0', network],
check=False,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
text=True,
timeout=10
)
# Parse the output to extract IPs
ip_pattern = r'(\d+\.\d+\.\d+\.\d+)'
ips = re.findall(ip_pattern, result.stdout)
print(f"Found {len(ips)} devices with arp-scan")
return set(ips)
except Exception as e:
print(f"Error running arp-scan: {e}")
return set()
def update_metrics():
"""
Update PC status metrics using arp-scan.
"""
start_time = time.time()
# Run arp-scan on the network
online_ips = run_arp_scan("10.10.20.0/24")
# Update metrics for each PC
online_count = 0
for pc in pcs:
ip = pc["ip"]
location = pc["location"]
pc_num = str(pc["pc"])
# Check if the IP is in the set of online IPs
status = ip in online_ips
# Update Prometheus metric
pc_status.labels(ip=ip, location=location, pc=pc_num).set(1 if status else 0)
# Print status
if status:
print(f"PC {pc_num} at {ip} is ONLINE")
online_count += 1
else:
print(f"PC {pc_num} at {ip} is offline")
scan_time = time.time() - start_time
print(f"Scan completed in {scan_time:.2f} seconds, found {online_count} online PCs out of {len(pcs)}")
def check_network_interfaces():
"""
Print available network interfaces
"""
try:
result = subprocess.run(['ip', 'addr'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print("Available network interfaces:")
print(result.stdout)
except Exception as e:
print(f"Error checking network interfaces: {e}")
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='PC Status Monitor for Prometheus')
parser.add_argument('--test', help='Test scan without starting Prometheus server', action='store_true')
parser.add_argument('--check-interfaces', help='Check available network interfaces', action='store_true')
parser.add_argument('--port', help='Port for Prometheus metrics', type=int, default=8003)
args = parser.parse_args()
# Check network interfaces if requested
if args.check_interfaces:
check_network_interfaces()
exit(0)
# Test scan if requested
if args.test:
update_metrics()
exit(0)
# Start the Prometheus HTTP server
port = args.port
start_http_server(port)
print(f"Prometheus metrics server started on port {port}")
# Continuously update metrics
try:
while True:
print("\n--- Updating PC status ---")
update_metrics()
print(f"Waiting 15 seconds before next check...")
time.sleep(15) # Update every 15 seconds
except KeyboardInterrupt:
print("\nMonitoring stopped by user")