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