Spaces:
Sleeping
Sleeping
File size: 4,344 Bytes
6fb06ea fdb1b39 6fb06ea fdb1b39 2ceaca7 6fb06ea 2ceaca7 fdb1b39 6fb06ea 2ceaca7 6fb06ea fdb1b39 6fb06ea 2e33767 6fb06ea 2ceaca7 6fb06ea 2e33767 6fb06ea eeb6441 fdb1b39 eeb6441 fdb1b39 eeb6441 fdb1b39 6fb06ea fdb1b39 6fb06ea 2ceaca7 6fb06ea 8eb72ef fdb1b39 8eb72ef fdb1b39 eeb6441 fdb1b39 eeb6441 fdb1b39 eeb6441 fdb1b39 eeb6441 fdb1b39 6fb06ea |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
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 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:
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)
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)
# 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: include an extra 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"
)
# Hidden endpoint to retrieve output
hidden_get_output_btn = gr.Button("Hidden Get Output", visible=False)
hidden_get_output = gr.Textbox(visible=False)
hidden_get_output_btn.click(get_output, inputs=[], outputs=hidden_get_output, api_name="/get_output")
ui.launch(share=True)
|