diff options
author | Maurizio Lombardi <mlombard@redhat.com> | 2019-10-15 11:09:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-15 11:09:05 +0200 |
commit | 6e3146fa514042938549d7b0f17724a7aa759e17 (patch) | |
tree | 99752234cae1ae7b6efc342f5b5a984060ff4802 | |
parent | 2a71cece17fcdd40bc022ed1fc009e6f5b9415e8 (diff) | |
parent | a93c8fb860fc11261a5fb11afcd94c66ab865344 (diff) | |
download | targetcli-6e3146fa514042938549d7b0f17724a7aa759e17.tar.gz |
Merge pull request #151 from gonzoleeman/fix-daemon-and-python-3.7-issues-v2
Fix daemon and python 3.7 issues v2
-rwxr-xr-x | daemon/targetclid | 95 | ||||
-rwxr-xr-x | scripts/targetcli | 5 | ||||
-rw-r--r-- | systemd/targetclid.service | 5 | ||||
-rw-r--r-- | systemd/targetclid.socket | 2 |
4 files changed, 65 insertions, 42 deletions
diff --git a/daemon/targetclid b/daemon/targetclid index 98a6fd0..156a25c 100755 --- a/daemon/targetclid +++ b/daemon/targetclid @@ -31,6 +31,7 @@ import socket import struct import fcntl import signal +import errno err = sys.stderr @@ -46,6 +47,7 @@ class TargetCLI: self.pid_file = '/var/run/targetclid.pid' self.NoSignal = True + self.sock = None # shell console methods self.shell = ConfigShell(getenv("TARGETCLI_HOME", '~/.targetcli')) @@ -59,7 +61,7 @@ class TargetCLI: signal.signal(signal.SIGHUP, self.signal_handler) try: - self.pfd = open(self.pid_file, 'w+'); + self.pfd = open(self.pid_file, 'w+') except IOError as e: self.display( self.render( @@ -92,7 +94,7 @@ class TargetCLI: ''' destructor ''' - if not self.pfd.closed: + if hasattr(self, 'pfd'): self.pfd.close() @@ -101,6 +103,8 @@ class TargetCLI: signal handler ''' self.NoSignal = False + if self.sock: + self.sock.close() def try_pidfile_lock(self): @@ -142,14 +146,14 @@ class TargetCLI: # Receive the data in small chunks and retransmit it while still_listen: data = connection.recv(65535) - if "-END@OF@DATA-" in data: + if b'-END@OF@DATA-' in data: connection.close() still_listen = False else: self.con._stdout = self.con._stderr = f = open("/tmp/data.txt", "w") try: # extract multiple commands delimited with '%' - list_data = data.split('%') + list_data = data.decode().split('%') for cmd in list_data: self.shell.run_cmdline(cmd) except Exception as e: @@ -162,10 +166,10 @@ class TargetCLI: with open('/tmp/data.txt', 'r') as f: output = f.read() - - var = struct.pack('i', len(output)) - connection.sendall(var) # length of string - connection.sendall(output) # actual string + var = struct.pack('i', len(output)) + connection.sendall(var) # length of string + if len(output): + connection.sendall(output.encode()) # actual string def usage(): @@ -199,40 +203,56 @@ def main(): to = TargetCLI() - # Make sure file doesn't exist already - try: - unlink(to.socket_path) - except: - pass - - # Create a TCP/IP socket - try: - sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - except socket.error as err: - to.display(to.render(err, 'red')) - sys.exit(1) - - # Bind the socket path - try: - sock.bind(to.socket_path) - except socket.error as err: - to.display(to.render(err, 'red')) - sys.exit(1) - - # Listen for incoming connections - try: - sock.listen(1) - except socket.error as err: - to.display(to.render(err, 'red')) - sys.exit(1) + if getenv('LISTEN_PID'): + # the systemd-activation path, using next available FD + fn = sys.stderr.fileno() + 1 + try: + sock = socket.fromfd(fn, socket.AF_UNIX, socket.SOCK_STREAM) + except socket.error as err: + to.display(to.render(err.strerror, 'red')) + sys.exit(1) + + # save socket so a signal can clea it up + to.sock = sock + else: + # Make sure file doesn't exist already + try: + unlink(to.socket_path) + except: + pass + + # Create a TCP/IP socket + try: + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + except socket.error as err: + to.display(to.render(err.strerror, 'red')) + sys.exit(1) + + # save socket so a signal can clea it up + to.sock = sock + + # Bind the socket path + try: + sock.bind(to.socket_path) + except socket.error as err: + to.display(to.render(err.strerror, 'red')) + sys.exit(1) + + # Listen for incoming connections + try: + sock.listen(1) + except socket.error as err: + to.display(to.render(err.strerror, 'red')) + sys.exit(1) while to.NoSignal: try: # Wait for a connection connection, client_address = sock.accept() except socket.error as err: - to.display(to.render(err, 'red')) - break; + if err.errno != errno.EBADF or to.NoSignal: + to.display(to.render(err.strerror, 'red')) + break thread = Thread(target=to.client_thread, args=(connection,)) thread.start() @@ -245,7 +265,8 @@ def main(): if not to.NoSignal: to.display(to.render("Signal received, quiting gracefully!", 'green')) - sys.exit(1) + sys.exit(0) + sys.exit(1) if __name__ == "__main__": diff --git a/scripts/targetcli b/scripts/targetcli index b7a2467..cb97b2b 100755 --- a/scripts/targetcli +++ b/scripts/targetcli @@ -151,7 +151,7 @@ def call_daemon(shell, req): while amount_received < amount_expected: data = sock.recv(1024) amount_received += len(data) - print(data, end ="") + print(data.decode(), end ="") sock.send(b'-END@OF@DATA-') sock.close() @@ -218,7 +218,8 @@ def main(): use_daemon = True if use_daemon: - call_daemon(shell, get_arguments()) + call_daemon(shell, get_arguments().encode()) + # does not return try: root_node = UIRoot(shell, as_root=is_root) diff --git a/systemd/targetclid.service b/systemd/targetclid.service index 7883998..c337e3b 100644 --- a/systemd/targetclid.service +++ b/systemd/targetclid.service @@ -1,7 +1,7 @@ [Unit] Description=Targetcli daemon -After=network.target targetclid.socket -Requires=targetclid.socket +Documentation=man:targetcli(8) +After=network.target [Service] Type=simple @@ -10,3 +10,4 @@ Restart=on-failure [Install] WantedBy=multi-user.target +Also=targetclid.socket diff --git a/systemd/targetclid.socket b/systemd/targetclid.socket index 809a7c8..079f0c7 100644 --- a/systemd/targetclid.socket +++ b/systemd/targetclid.socket @@ -1,6 +1,6 @@ [Unit] Description=targetclid socket -PartOf=targetclid.service +Documentation=man:targetcli(8) [Socket] ListenStream=/var/run/targetclid.sock |