summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurizio Lombardi <mlombard@redhat.com>2019-10-15 11:09:05 +0200
committerGitHub <noreply@github.com>2019-10-15 11:09:05 +0200
commit6e3146fa514042938549d7b0f17724a7aa759e17 (patch)
tree99752234cae1ae7b6efc342f5b5a984060ff4802
parent2a71cece17fcdd40bc022ed1fc009e6f5b9415e8 (diff)
parenta93c8fb860fc11261a5fb11afcd94c66ab865344 (diff)
downloadtargetcli-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-xdaemon/targetclid95
-rwxr-xr-xscripts/targetcli5
-rw-r--r--systemd/targetclid.service5
-rw-r--r--systemd/targetclid.socket2
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