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)