From 8e35cdb3dafd925c8988a7ddc2bd2a8efc88f88f Mon Sep 17 00:00:00 2001 From: Alex Vandiver Date: Wed, 19 Jan 2022 23:58:13 +0000 Subject: [PATCH] scripts: Add a supervisor package, to use the XMLRPC Supervisor API. For many uses, shelling out to `supervisorctl` is going to produce better error messages. However, for instances where we wish to parse the output of `supervisorctl`, using the API directly is less brittle. --- scripts/lib/supervisor.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 scripts/lib/supervisor.py diff --git a/scripts/lib/supervisor.py b/scripts/lib/supervisor.py new file mode 100644 index 0000000000..fda2f0a5ee --- /dev/null +++ b/scripts/lib/supervisor.py @@ -0,0 +1,27 @@ +import socket +from http.client import HTTPConnection +from typing import Dict, List, Optional, Tuple, Union +from xmlrpc import client + + +class UnixStreamHTTPConnection(HTTPConnection): + def connect(self) -> None: + self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.connect(self.host) + + +class UnixStreamTransport(client.Transport, object): + def __init__(self, socket_path: str) -> None: + self.socket_path = socket_path + super(UnixStreamTransport, self).__init__() + + def make_connection( + self, host: Union[Tuple[str, Dict[str, str]], str] + ) -> UnixStreamHTTPConnection: + return UnixStreamHTTPConnection(self.socket_path) + + +def rpc() -> client.ServerProxy: + return client.ServerProxy( + "http://localhost", transport=UnixStreamTransport("/var/run/supervisor.sock") + )