replica-omnisciente/hardware_bridge_server.py

82 lines
3.4 KiB
Python

import http.server
import socketserver
import json
import subprocess
import logging
PORT = 8010
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
class HardwareBridgeHandler(http.server.SimpleHTTPRequestHandler):
def do_POST(self):
if self.path == '/api/printers/clean':
self.run_command(['hp-clean', '-i'])
elif self.path == '/api/printers/align':
self.run_command(['hp-align', '-i'])
elif self.path == '/api/printers/firmware':
self.run_command(['hp-firmware', '-n'])
elif self.path == '/api/printers/reset':
# Cancel all jobs
subprocess.run(['cancel', '-a'], check=False)
# Restart CUPS
subprocess.run(['systemctl', 'restart', 'cups'], check=False)
# Enable all printers (parsing lpstat -a)
try:
result = subprocess.run(['lpstat', '-a'], capture_output=True, text=True)
for line in result.stdout.splitlines():
printer = line.split()[0]
subprocess.run(['cupsenable', printer], check=False)
subprocess.run(['cupsaccept', printer], check=False)
except Exception as e:
logging.error(f"Failed to enable printers: {e}")
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps({"status": "success", "message": "Hard reset completed"}).encode())
else:
self.send_response(404)
self.end_headers()
def run_command(self, cmd):
try:
logging.info(f"Executing: {cmd}")
# we use -i usually, but we need to run non-interactively if possible.
# actually hp-clean might need specific printer -p
content_length = int(self.headers.get('Content-Length', 0))
post_data = b""
if content_length > 0:
post_data = self.rfile.read(content_length)
printer_id = None
if post_data:
try:
data = json.loads(post_data.decode('utf-8'))
printer_id = data.get('printer_id')
except:
pass
if printer_id:
cmd.extend(['-p', printer_id])
result = subprocess.run(cmd, capture_output=True, text=True)
response = {
"status": "success" if result.returncode == 0 else "error",
"stdout": result.stdout,
"stderr": result.stderr,
"returncode": result.returncode
}
self.send_response(200 if result.returncode == 0 else 500)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(response).encode())
except Exception as e:
logging.error(f"Error executing {cmd}: {e}")
self.send_response(500)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps({"status": "error", "message": str(e)}).encode())
if __name__ == "__main__":
with socketserver.TCPServer(("", PORT), HardwareBridgeHandler) as httpd:
logging.info(f"Hardware Bridge Server listening on port {PORT}")
httpd.serve_forever()