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
|
#!/usr/bin/env python
import argparse
import logging
import os
import signal
import socket
import subprocess
import threading
from socketserver import StreamRequestHandler, TCPServer
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
class Handler(StreamRequestHandler):
def handle(self):
while line := self.rfile.readline():
if b"ARCH=" in line:
(
subprocess.Popen(
[
"systemctl",
"--no-block",
"start",
f"update-repo@{line.split(b'=')[1].decode().strip()}",
]
)
).wait()
os.kill(os.getpid(), signal.SIGUSR1)
return
logger.info("Recv: %s", line)
# source: https://gist.github.com/drmalex07/333d8a88c4918954e8e4
class Server(TCPServer):
# The constant would be better initialized by a systemd module
SYSTEMD_FIRST_SOCKET_FD = 3
def __init__(self, server_address, handler_cls):
# Invoke base but omit bind/listen steps (performed by systemd activation!)
TCPServer.__init__(self, server_address, handler_cls, bind_and_activate=False)
# Override socket
self.socket = socket.fromfd(
self.SYSTEMD_FIRST_SOCKET_FD, self.address_family, self.socket_type
)
def main():
def server_shutdown_wrapper(*_args) -> None:
logger.debug("Shutdown the server")
threading.Thread(
target=server.shutdown,
daemon=True,
).start()
server = Server(("localhost", 0), Handler)
signal.signal(signal.SIGUSR1, server_shutdown_wrapper)
server.serve_forever()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
try:
import coloredlogs
coloredlogs.install(
logging.DEBUG,
fmt="%(asctime)s - %(levelname)s - %(funcName)s - %(lineno)d - %(message)s",
)
except ModuleNotFoundError:
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(levelname)s - %(funcName)s - %(lineno)d - %(message)s",
)
main()
|