Ejemplo n.º 1
0
 def serve(self) -> None:
     """Serve requests, synchronously (no thread or fork)."""
     command = None
     try:
         server = IPCServer(CONNECTION_NAME, self.timeout)
         with open(self.status_file, 'w') as f:
             json.dump(
                 {
                     'pid': os.getpid(),
                     'connection_name': server.connection_name
                 }, f)
             f.write('\n')  # I like my JSON with a trailing newline
         while True:
             with server:
                 data = receive(server)
                 resp = {}  # type: Dict[str, Any]
                 if 'command' not in data:
                     resp = {'error': "No command found in request"}
                 else:
                     command = data['command']
                     if not isinstance(command, str):
                         resp = {'error': "Command is not a string"}
                     else:
                         command = data.pop('command')
                         try:
                             resp = self.run_command(command, data)
                         except Exception:
                             # If we are crashing, report the crash to the client
                             tb = traceback.format_exception(
                                 *sys.exc_info())
                             resp = {
                                 'error': "Daemon crashed!\n" + "".join(tb)
                             }
                             resp.update(self._response_metadata())
                             server.write(json.dumps(resp).encode('utf8'))
                             raise
                 try:
                     resp.update(self._response_metadata())
                     server.write(json.dumps(resp).encode('utf8'))
                 except OSError:
                     pass  # Maybe the client hung up
                 if command == 'stop':
                     reset_global_state()
                     sys.exit(0)
     finally:
         # If the final command is something other than a clean
         # stop, remove the status file. (We can't just
         # simplify the logic and always remove the file, since
         # that could cause us to remove a future server's
         # status file.)
         if command != 'stop':
             os.unlink(self.status_file)
         try:
             server.cleanup()  # try to remove the socket dir on Linux
         except OSError:
             pass
         exc_info = sys.exc_info()
         if exc_info[0] and exc_info[0] is not SystemExit:
             traceback.print_exception(*exc_info)
Ejemplo n.º 2
0
def server(msg: str, q: 'Queue[str]') -> None:
    server = IPCServer(CONNECTION_NAME)
    q.put(server.connection_name)
    data = b''
    while not data:
        with server:
            server.write(msg.encode())
            data = server.read()
    server.cleanup()
Ejemplo n.º 3
0
 def serve(self) -> None:
     """Serve requests, synchronously (no thread or fork)."""
     command = None
     try:
         server = IPCServer(CONNECTION_NAME, self.timeout)
         with open(self.status_file, 'w') as f:
             json.dump({'pid': os.getpid(), 'connection_name': server.connection_name}, f)
             f.write('\n')  # I like my JSON with a trailing newline
         while True:
             with server:
                 data = receive(server)
                 resp = {}  # type: Dict[str, Any]
                 if 'command' not in data:
                     resp = {'error': "No command found in request"}
                 else:
                     command = data['command']
                     if not isinstance(command, str):
                         resp = {'error': "Command is not a string"}
                     else:
                         command = data.pop('command')
                         try:
                             resp = self.run_command(command, data)
                         except Exception:
                             # If we are crashing, report the crash to the client
                             tb = traceback.format_exception(*sys.exc_info())
                             resp = {'error': "Daemon crashed!\n" + "".join(tb)}
                             resp.update(self._response_metadata())
                             server.write(json.dumps(resp).encode('utf8'))
                             raise
                 try:
                     resp.update(self._response_metadata())
                     server.write(json.dumps(resp).encode('utf8'))
                 except OSError:
                     pass  # Maybe the client hung up
                 if command == 'stop':
                     reset_global_state()
                     sys.exit(0)
     finally:
         # If the final command is something other than a clean
         # stop, remove the status file. (We can't just
         # simplify the logic and always remove the file, since
         # that could cause us to remove a future server's
         # status file.)
         if command != 'stop':
             os.unlink(self.status_file)
         try:
             server.cleanup()  # try to remove the socket dir on Linux
         except OSError:
             pass
         exc_info = sys.exc_info()
         if exc_info[0] and exc_info[0] is not SystemExit:
             traceback.print_exception(*exc_info)
Ejemplo n.º 4
0
def server(msg: str, q: 'Queue[str]') -> None:
    server = IPCServer(CONNECTION_NAME)
    q.put(server.connection_name)
    data = b''
    while not data:
        with server:
            server.write(msg.encode())
            data = server.read()
    server.cleanup()