From 36445471bf154eb019d0b713b3d4a27c70947d42 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Sun, 19 May 2013 16:33:34 +1000 Subject: [PATCH] Execute netstat and kill as the right user in runsics.py. Also reduced feedback whent start, stopping and checking SICS status. --- site_ansto/instrument/runsics.py | 47 ++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/site_ansto/instrument/runsics.py b/site_ansto/instrument/runsics.py index 36d46867..8171b98a 100755 --- a/site_ansto/instrument/runsics.py +++ b/site_ansto/instrument/runsics.py @@ -37,8 +37,8 @@ inst_test_sockoffset = { deflt_dir = '/usr/local/sics/server' deflt_sockoffset = 'none' deflt_user = inst_user -sics_killer = 'root' -sics_checker = inst_user +sics_killer = inst_user +sics_checker = 'root' if os.environ.has_key('TEST_SICS'): deflt_test = os.environ['TEST_SICS'] else: @@ -50,7 +50,7 @@ def sics_preexec(): # TODO Launch simulated devices if TEST_SICS=fakedev. Must write launch script first. def start_cmd(server, args): - if status_cmd(server, args): + if status_fn(server, args) != (0,0): print '%s is already running. Cowardly refusing to launch it twice' % server return if (args.sockoffset != 'none'): @@ -80,64 +80,71 @@ def start_cmd(server, args): def stop_cmd(server, args): INTMSG = 'SICSINT 6' - ret = status_cmd(server, args) - if ret: - (serv_port, pid) = ret + (serv_port, pid) = status_cmd(server, args) + if pid: if (args.sockoffset == 'none'): int_port = server_port[server]['interrupt'] else: int_port = server_port[server]['interrupt'] + inst_test_sockoffset[args.sockoffset] - print 'STOP %s(%d) listening on %d' % (server, pid, serv_port) - print "Sending '%s' to %d" % (INTMSG, int_port) + print "STOP %s(%d) by sending '%s' to socket %d" % (server, pid, INTMSG, int_port) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto( INTMSG + '\n\r', ('localhost', int_port) ) sock.close() - if status_cmd(server, args): + if status_cmd(server, args) != (0,0): + sys.stdout.write('Waiting ') for n in range(3): - print 'Waiting' + sys.stdout.write('.') time.sleep(1) - if status_cmd(server, args): + if status_fn(server, args) != (0,0): continue else: break print '' - if status_cmd(server, args): + else: + return + if status_fn(server, args) != (0,0): print 'Failed to stop %s' % server print "Fragging PID %d with default KILL" % (pid) subprocess.call(shlex.split('sudo -u %s /bin/kill %d' % (sics_killer, pid))) else: return - if status_cmd(server, args): + if status_fn(server, args) != (0,0): print 'Failed again!' print "Terminating PID %d with EXTREME PREJUDICE (-15)" % (pid) subprocess.call(shlex.split('sudo -u %s /bin/kill -15 %d' % sics_killer, (pid))) else: return - if status_cmd(server, args): + if status_cmd(server, args) != (0,0): print 'Why wont you die, Powers!!??' print 'I give up. Try calling a SICS programmer or sysadmin' -def status_cmd(server, args): +def status_fn(server, args): if (args.sockoffset == 'none'): sock = server_port[server]['server'] else: sock = server_port[server]['server'] + inst_test_sockoffset[args.sockoffset] - status_cmd = 'sudo -u %s netstat -nltp' % sics_checker - netstat_str, err = subprocess.Popen(shlex.split(status_cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + status_str = 'sudo -u %s netstat -nltp' % sics_checker + netstat_str, err = subprocess.Popen(shlex.split(status_str), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() # ffr: We can replace the previous Popen().communicate() line with the following two lines if Python is upgraded to V2.7 # with open(os.devnull) as fp: -# netstat_str = subprocess.check_output(shlex.split(status_cmd), stderr=fp) +# netstat_str = subprocess.check_output(shlex.split(status_str), stderr=fp) # #Find PID of SICServer listening on server port m = re.search(':%d .* (\d+)\/SICServer' % sock, netstat_str) if m: pid = int(m.group(1)) - print '%s listening on port %d, PID=%d' % (server, sock, pid) return (sock, pid) + else: + return (0,0) + +def status_cmd(server, args): + (sock,pid) = status_fn(server, args) + if pid: + print '%s listening on port %d, PID=%d' % (server, sock, pid) else: print '%s not running' % server - return '' + return (sock, pid) def main(**kwargs): global sics_killer, sics_checker