Spaces:
Paused
Paused
| import gradio as gr | |
| import json | |
| import time | |
| status_file = "status.json" | |
| command_file = "command.json" | |
| output_file = "output.json" | |
| HEARTBEAT_TIMEOUT = 20 # seconds | |
| # Initialize storage files | |
| with open(status_file, "w") as f: | |
| json.dump({}, f) | |
| with open(command_file, "w") as f: | |
| json.dump({"command": ""}, f) | |
| with open(output_file, "w") as f: | |
| json.dump({"output": ""}, f) | |
| # Register PC as online | |
| def register_pc(name, password): | |
| with open(status_file, "r") as f: | |
| status = json.load(f) | |
| status[name] = {"password": password, "timestamp": time.time()} | |
| with open(status_file, "w") as f: | |
| json.dump(status, f) | |
| return f"PC '{name}' registered as online." | |
| # Check if PC is online | |
| def check_pc(name): | |
| with open(status_file, "r") as f: | |
| status = json.load(f) | |
| if name in status and time.time() - status[name]["timestamp"] < HEARTBEAT_TIMEOUT: | |
| return "Online" | |
| return "Offline" | |
| # Send command (or register if command is "REGISTER") | |
| def send_command(name, password, command): | |
| if command == "REGISTER": | |
| return register_pc(name, password) | |
| with open(status_file, "r") as f: | |
| status = json.load(f) | |
| if name in status and status[name]["password"] == password: | |
| with open(command_file, "w") as f: | |
| json.dump({"command": command}, f) | |
| return f"Command sent to {name}." | |
| return "Authentication failed." | |
| # Get command (for PC side polling) | |
| def get_command(): | |
| with open(command_file, "r") as f: | |
| cmd_data = json.load(f) | |
| return cmd_data.get("command", "") | |
| # Upload command output from PC with timestamps | |
| def upload_output(name, password, output, sent_time): | |
| with open(status_file, "r") as f: | |
| status = json.load(f) | |
| if name in status and status[name]["password"] == password: | |
| received_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) | |
| # Format the output with "Time Sent", a divider, then "Time Received", another divider, and the actual output. | |
| combined_output = ( | |
| f"Time Sent: {sent_time}\n" | |
| "--------------------\n" | |
| f"Time Received: {received_time}\n" | |
| "--------------------\n" | |
| f"{output}" | |
| ) | |
| with open(output_file, "w") as f: | |
| json.dump({"output": combined_output}, f) | |
| return "Output uploaded successfully." | |
| return "Authentication failed." | |
| # Retrieve command output (to view on Hugging Face) | |
| def get_output(): | |
| with open(output_file, "r") as f: | |
| data = json.load(f) | |
| return data.get("output", "") | |
| with gr.Blocks() as ui: | |
| # PC info and status | |
| with gr.Row(): | |
| name_input = gr.Textbox(label="PC Name") | |
| pass_input = gr.Textbox(label="Password", type="password") | |
| check_btn = gr.Button("Check Online Status") | |
| check_output = gr.Textbox(label="Status") | |
| check_btn.click(check_pc, inputs=name_input, outputs=check_output) | |
| # Command sending row | |
| with gr.Row(): | |
| cmd_input = gr.Textbox(label="Command", lines=5) # Multi-line for larger scripts | |
| send_btn = gr.Button("Send Command") | |
| send_output = gr.Textbox(label="Response", lines=2) | |
| send_btn.click(send_command, inputs=[name_input, pass_input, cmd_input], outputs=send_output) | |
| # Visible output display row | |
| with gr.Row(): | |
| get_output_btn = gr.Button("Get Command Output") | |
| output_display = gr.Textbox(label="Command Output", lines=10) | |
| get_output_btn.click(get_output, inputs=[], outputs=output_display) | |
| # Hidden endpoints for PC polling and uploading output: | |
| hidden_get_cmd_btn = gr.Button("Hidden Get Command", visible=False) | |
| hidden_cmd_output = gr.Textbox(visible=False) | |
| hidden_get_cmd_btn.click(get_command, inputs=[], outputs=hidden_cmd_output, api_name="/get_command") | |
| # Hidden components for uploading output: includes a textbox for sent_time. | |
| output_input = gr.Textbox(label="Output", visible=False) | |
| sent_time_input = gr.Textbox(label="Sent Time", visible=False) | |
| hidden_upload_btn = gr.Button("Hidden Upload Output", visible=False) | |
| hidden_upload_output = gr.Textbox(visible=False) | |
| hidden_upload_btn.click( | |
| upload_output, | |
| inputs=[name_input, pass_input, output_input, sent_time_input], | |
| outputs=hidden_upload_output, | |
| api_name="/upload_output" | |
| ) | |
| ui.launch(share=True) | |