Execute netstat and kill as the right user in runsics.py.

Also reduced feedback whent start, stopping and checking SICS status.
This commit is contained in:
Ferdi Franceschini
2013-05-19 16:33:34 +10:00
parent d5b90fddbc
commit 36445471bf

View File

@ -37,8 +37,8 @@ inst_test_sockoffset = {
deflt_dir = '/usr/local/sics/server' deflt_dir = '/usr/local/sics/server'
deflt_sockoffset = 'none' deflt_sockoffset = 'none'
deflt_user = inst_user deflt_user = inst_user
sics_killer = 'root' sics_killer = inst_user
sics_checker = inst_user sics_checker = 'root'
if os.environ.has_key('TEST_SICS'): if os.environ.has_key('TEST_SICS'):
deflt_test = os.environ['TEST_SICS'] deflt_test = os.environ['TEST_SICS']
else: else:
@ -50,7 +50,7 @@ def sics_preexec():
# TODO Launch simulated devices if TEST_SICS=fakedev. Must write launch script first. # TODO Launch simulated devices if TEST_SICS=fakedev. Must write launch script first.
def start_cmd(server, args): 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 print '%s is already running. Cowardly refusing to launch it twice' % server
return return
if (args.sockoffset != 'none'): if (args.sockoffset != 'none'):
@ -80,64 +80,71 @@ def start_cmd(server, args):
def stop_cmd(server, args): def stop_cmd(server, args):
INTMSG = 'SICSINT 6' INTMSG = 'SICSINT 6'
ret = status_cmd(server, args) (serv_port, pid) = status_cmd(server, args)
if ret: if pid:
(serv_port, pid) = ret
if (args.sockoffset == 'none'): if (args.sockoffset == 'none'):
int_port = server_port[server]['interrupt'] int_port = server_port[server]['interrupt']
else: else:
int_port = server_port[server]['interrupt'] + inst_test_sockoffset[args.sockoffset] int_port = server_port[server]['interrupt'] + inst_test_sockoffset[args.sockoffset]
print 'STOP %s(%d) listening on %d' % (server, pid, serv_port) print "STOP %s(%d) by sending '%s' to socket %d" % (server, pid, INTMSG, int_port)
print "Sending '%s' to %d" % (INTMSG, int_port)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto( INTMSG + '\n\r', ('localhost', int_port) ) sock.sendto( INTMSG + '\n\r', ('localhost', int_port) )
sock.close() sock.close()
if status_cmd(server, args): if status_cmd(server, args) != (0,0):
sys.stdout.write('Waiting ')
for n in range(3): for n in range(3):
print 'Waiting' sys.stdout.write('.')
time.sleep(1) time.sleep(1)
if status_cmd(server, args): if status_fn(server, args) != (0,0):
continue continue
else: else:
break break
print '' print ''
if status_cmd(server, args): else:
return
if status_fn(server, args) != (0,0):
print 'Failed to stop %s' % server print 'Failed to stop %s' % server
print "Fragging PID %d with default KILL" % (pid) print "Fragging PID %d with default KILL" % (pid)
subprocess.call(shlex.split('sudo -u %s /bin/kill %d' % (sics_killer, pid))) subprocess.call(shlex.split('sudo -u %s /bin/kill %d' % (sics_killer, pid)))
else: else:
return return
if status_cmd(server, args): if status_fn(server, args) != (0,0):
print 'Failed again!' print 'Failed again!'
print "Terminating PID %d with EXTREME PREJUDICE (-15)" % (pid) print "Terminating PID %d with EXTREME PREJUDICE (-15)" % (pid)
subprocess.call(shlex.split('sudo -u %s /bin/kill -15 %d' % sics_killer, (pid))) subprocess.call(shlex.split('sudo -u %s /bin/kill -15 %d' % sics_killer, (pid)))
else: else:
return return
if status_cmd(server, args): if status_cmd(server, args) != (0,0):
print 'Why wont you die, Powers!!??' print 'Why wont you die, Powers!!??'
print 'I give up. Try calling a SICS programmer or sysadmin' 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'): if (args.sockoffset == 'none'):
sock = server_port[server]['server'] sock = server_port[server]['server']
else: else:
sock = server_port[server]['server'] + inst_test_sockoffset[args.sockoffset] sock = server_port[server]['server'] + inst_test_sockoffset[args.sockoffset]
status_cmd = 'sudo -u %s netstat -nltp' % sics_checker status_str = 'sudo -u %s netstat -nltp' % sics_checker
netstat_str, err = subprocess.Popen(shlex.split(status_cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 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 # 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: # 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 #Find PID of SICServer listening on server port
m = re.search(':%d .* (\d+)\/SICServer' % sock, netstat_str) m = re.search(':%d .* (\d+)\/SICServer' % sock, netstat_str)
if m: if m:
pid = int(m.group(1)) pid = int(m.group(1))
print '%s listening on port %d, PID=%d' % (server, sock, pid)
return (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: else:
print '%s not running' % server print '%s not running' % server
return '' return (sock, pid)
def main(**kwargs): def main(**kwargs):
global sics_killer, sics_checker global sics_killer, sics_checker