Checkpoint
parent
ad6a0b4cd2
commit
a56db9263f
@ -0,0 +1,2 @@
|
|||||||
|
env
|
||||||
|
*~
|
||||||
@ -0,0 +1 @@
|
|||||||
|
export SUSPEND_SECRET=some-password
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
echo $SCRIPT_DIR
|
||||||
|
|
||||||
|
sudo tee /etc/systemd/system/game-runner.service <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Game runner http server. Listens on http://192.168.1.140:8111/?game=kodi and runs a game
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/bin/python3 $SCRIPT_DIR/game-runner.py
|
||||||
|
WorkingDirectory=/home/kuba/
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
User=kuba
|
||||||
|
Environment=PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
@ -0,0 +1 @@
|
|||||||
|
kuba@bazzite.6047:1784385156
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
from evdev import UInput, ecodes as e
|
||||||
|
import time
|
||||||
|
|
||||||
|
# Create virtual keyboard
|
||||||
|
ui = UInput({
|
||||||
|
e.EV_KEY: [getattr(e, f"KEY_{chr(c).upper()}") for c in range(ord('a'), ord('z')+1)] + [e.KEY_SPACE, e.KEY_UP, e.KEY_DOWN, e.KEY_LEFT, e.KEY_RIGHT, e.KEY_LEFTSHIFT, e.KEY_TAB, e.KEY_ENTER]
|
||||||
|
}, name="virtual-keyboard")
|
||||||
|
|
||||||
|
def press(key):
|
||||||
|
ui.write(e.EV_KEY, key, 1) # key down
|
||||||
|
ui.write(e.EV_KEY, key, 0) # key up
|
||||||
|
ui.syn()
|
||||||
|
|
||||||
|
|
||||||
|
def home():
|
||||||
|
print("Sending shift+tab")
|
||||||
|
ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 1) # Press Ctrl
|
||||||
|
ui.write(e.EV_KEY, e.KEY_TAB, 1) # Press 1
|
||||||
|
ui.syn()
|
||||||
|
time.sleep(0.1)
|
||||||
|
ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 0) # Release 1
|
||||||
|
ui.write(e.EV_KEY, e.KEY_TAB, 0) # Release Ctrl
|
||||||
|
ui.syn()
|
||||||
|
|
||||||
|
|
||||||
|
def type_string(text):
|
||||||
|
for ch in text:
|
||||||
|
if ch == ' ':
|
||||||
|
press(e.KEY_SPACE)
|
||||||
|
elif 'a' <= ch <= 'z':
|
||||||
|
key = getattr(e, f"KEY_{ch.upper()}")
|
||||||
|
press(key)
|
||||||
|
else:
|
||||||
|
# ignore unsupported characters
|
||||||
|
continue
|
||||||
|
|
||||||
|
time.sleep(0.01)
|
||||||
|
|
||||||
|
|
||||||
|
def run_a_game(name):
|
||||||
|
home()
|
||||||
|
press(e.KEY_LEFT)
|
||||||
|
press(e.KEY_LEFT)
|
||||||
|
press(e.KEY_DOWN)
|
||||||
|
press(e.KEY_ENTER)
|
||||||
|
time.sleep(0.3)
|
||||||
|
press(e.KEY_UP)
|
||||||
|
press(e.KEY_UP)
|
||||||
|
press(e.KEY_LEFT)
|
||||||
|
press(e.KEY_LEFT)
|
||||||
|
press(e.KEY_LEFT)
|
||||||
|
press(e.KEY_LEFT)
|
||||||
|
time.sleep(0.1)
|
||||||
|
type_string(name.lower())
|
||||||
|
time.sleep(0.3)
|
||||||
|
press(e.KEY_DOWN)
|
||||||
|
press(e.KEY_DOWN)
|
||||||
|
press(e.KEY_ENTER)
|
||||||
|
time.sleep(0.2)
|
||||||
|
press(e.KEY_ENTER)
|
||||||
|
|
||||||
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||||
|
from urllib.parse import urlparse, parse_qs
|
||||||
|
|
||||||
|
class Handler(BaseHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
# Parse URL
|
||||||
|
parsed = urlparse(self.path)
|
||||||
|
query = parse_qs(parsed.query)
|
||||||
|
|
||||||
|
# Get parameter (e.g. ?=hello)
|
||||||
|
msg = query.get("game", [""])[0]
|
||||||
|
|
||||||
|
print(f"Received msg: {msg}")
|
||||||
|
|
||||||
|
run_a_game(msg)
|
||||||
|
# Send response
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header("Content-type", "text/plain")
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(f"OK: {msg}".encode())
|
||||||
|
|
||||||
|
# Start server
|
||||||
|
port = 8111
|
||||||
|
server = HTTPServer(("0.0.0.0", port), Handler)
|
||||||
|
|
||||||
|
print(f"Listening on http://0.0.0.0:{port}")
|
||||||
|
server.serve_forever()
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
echo $SCRIPT_DIR
|
||||||
|
|
||||||
|
sudo tee /etc/systemd/system/game-runner.service <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Game runner http server. Listens on http://192.168.1.140:8111/?game=kodi and runs a game
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/bin/python3 $SCRIPT_DIR/game-runner.py
|
||||||
|
WorkingDirectory=/home/kuba/
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
User=kuba
|
||||||
|
Environment=PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
import http from "http";
|
||||||
|
import { exec } from 'child_process';
|
||||||
|
|
||||||
|
const PORT = 4321;
|
||||||
|
const SECRET = process.env.SUSPEND_SECRET || 'hushhush';
|
||||||
|
|
||||||
|
const server = http.createServer((req, res) => {
|
||||||
|
if (req.method === 'POST' && req.url === '/suspend') {
|
||||||
|
let body = '';
|
||||||
|
req.on('data', chunk => body += chunk);
|
||||||
|
req.on('end', () => {
|
||||||
|
if (body === SECRET) {
|
||||||
|
exec('systemctl suspend', (err, stdout, stderr) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Suspend failed:', stderr);
|
||||||
|
return res.writeHead(500).end('error');
|
||||||
|
}
|
||||||
|
console.log('Suspending now');
|
||||||
|
res.writeHead(200).end('ok');
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.writeHead(403).end('forbidden');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.writeHead(404).end('not found');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(PORT, () => {
|
||||||
|
console.log(`Suspend-server listening on port ${PORT}`);
|
||||||
|
});
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
echo $SCRIPT_DIR
|
||||||
|
|
||||||
|
sudo tee /etc/systemd/system/suspend-listener.service <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Remote Suspend HTTP Server
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/node $SCRIPT_DIR/index.mjs
|
||||||
|
User=root
|
||||||
|
Environment=SUSPEND_SECRET=$SUSPEND_SECRET
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
Loading…
Reference in New Issue