82 lines
3.4 KiB
Python
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()
|