feat(cert-checker): add Kubernetes resources for certificate checking functionality
- Implemented a new module for cert-checker with Kubernetes resources including ServiceAccount, Role, RoleBinding, ConfigMap, and CronJob. - Added Python script to check certificate expiry and restart deployments if necessary. - Configured environment variables for deployment name, namespace, and service details. - Included requirements for the Python environment. feat(devolo-exporter): introduce Devolo exporter for Prometheus metrics - Created a new module for Devolo exporter with Kubernetes resources including ServiceAccount, ConfigMap, Deployment, and Service. - Developed Python scripts to scrape metrics from Devolo devices and expose them to Prometheus. - Configured environment variables for Devolo device IP, model, and ports. - Added requirements for the Python environment.
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
import json
|
||||
import websocket
|
||||
import time
|
||||
import requests
|
||||
|
||||
# Step 1: Find Chrome DevTools WebSocket endpoint
|
||||
targets = requests.get("http://localhost:9222/json").json()
|
||||
ws_url = targets[0]["webSocketDebuggerUrl"]
|
||||
|
||||
# Step 2: Connect to the DevTools Protocol
|
||||
ws = websocket.create_connection(ws_url)
|
||||
print(f"Connected to {ws_url}")
|
||||
|
||||
# Helper: receive until we get the response for a given id
|
||||
def recv_until_id(expected_id, timeout=10):
|
||||
ws.settimeout(timeout)
|
||||
while True:
|
||||
msg = json.loads(ws.recv())
|
||||
# Log protocol events to help debugging
|
||||
if "id" not in msg:
|
||||
print(msg)
|
||||
continue
|
||||
if msg["id"] == expected_id:
|
||||
return msg
|
||||
# Optionally log out-of-order responses
|
||||
print(msg)
|
||||
|
||||
# Step 3: Enable runtime
|
||||
ws.send(json.dumps({"id": 1, "method": "Runtime.enable"}))
|
||||
recv_until_id(1)
|
||||
|
||||
# Step 4: Navigate to the page and wait a bit
|
||||
ws.send(json.dumps({"id": 2, "method": "Page.navigate", "params": {"url": "http://192.168.0.199/#/powerline"}}))
|
||||
recv_until_id(2)
|
||||
time.sleep(2) # give the page some time to render
|
||||
|
||||
# Step 5: Evaluate JavaScript to extract device data, and return by value
|
||||
script = """
|
||||
Array.from(document.querySelectorAll('tr[id^="plc-"]')).map(tr => ({
|
||||
id: tr.querySelector('[id^="plc-id-"]')?.innerText?.trim(),
|
||||
mac: tr.querySelector('[id^="plc-mac-"]')?.innerText?.trim(),
|
||||
tx: tr.querySelector('[id^="plc-tx-"]')?.innerText?.trim(),
|
||||
rx: tr.querySelector('[id^="plc-rx-"]')?.innerText?.trim()
|
||||
}))
|
||||
"""
|
||||
ws.send(json.dumps({
|
||||
"id": 3,
|
||||
"method": "Runtime.evaluate",
|
||||
"params": {
|
||||
"expression": script,
|
||||
"returnByValue": True,
|
||||
"awaitPromise": True
|
||||
}
|
||||
}))
|
||||
response = recv_until_id(3)
|
||||
result = response.get("result", {}).get("result", {}).get("value")
|
||||
|
||||
print("\n📡 Device Table:")
|
||||
if result:
|
||||
for dev in result:
|
||||
print(f"ID: {dev['id']:<10} MAC: {dev['mac']:<20} TX: {dev['tx']:<6} RX: {dev['rx']}")
|
||||
else:
|
||||
print("No devices found — maybe the table hasn't loaded yet?")
|
||||
|
||||
ws.close()
|
||||
Executable
+24
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
import websocket
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python wsclient.py ws://localhost:9222/devtools/page/XYZ")
|
||||
sys.exit(1)
|
||||
|
||||
url = sys.argv[1]
|
||||
ws = websocket.WebSocket()
|
||||
ws.connect(url)
|
||||
|
||||
print(f"Connected to {url}")
|
||||
try:
|
||||
while True:
|
||||
msg = input("> ")
|
||||
if msg.lower() in {"exit", "quit"}:
|
||||
break
|
||||
ws.send(msg)
|
||||
print(ws.recv())
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
finally:
|
||||
ws.close()
|
||||
Reference in New Issue
Block a user