Skip to content
Snippets Groups Projects
Commit a565bdd5 authored by cody burkard's avatar cody burkard
Browse files

fix popen to work with shell

parent cf5bbd59
No related branches found
No related tags found
No related merge requests found
...@@ -60,10 +60,9 @@ def sshd( network, cmd='/usr/sbin/sshd', opts='-D', ...@@ -60,10 +60,9 @@ def sshd( network, cmd='/usr/sbin/sshd', opts='-D',
connectToRootNS( network, switch, ip, routes ) connectToRootNS( network, switch, ip, routes )
for host in network.hosts: for host in network.hosts:
host.cmd( cmd + ' ' + opts + '&' ) host.cmd( cmd + ' ' + opts + '&' )
client = network.switches[ 0 ]
# wait until each host's sshd has started up # wait until each host's sshd has started up
for server in network.hosts: for server in network.hosts:
waitListening( client, server, 22, timeout=5 ) waitListening( server=server, port=22, timeout=5 )
print print
print "*** Hosts are running sshd at the following addresses:" print "*** Hosts are running sshd at the following addresses:"
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
from fcntl import fcntl, F_GETFL, F_SETFL from fcntl import fcntl, F_GETFL, F_SETFL
from os import O_NONBLOCK from os import O_NONBLOCK
import os import os
from functools import partial
# Command execution support # Command execution support
...@@ -61,12 +62,6 @@ def errRun( *cmd, **kwargs ): ...@@ -61,12 +62,6 @@ def errRun( *cmd, **kwargs ):
stderr: STDOUT to merge stderr with stdout stderr: STDOUT to merge stderr with stdout
shell: run command using shell shell: run command using shell
echo: monitor output to console""" echo: monitor output to console"""
# Allow passing in a list or a string
if len( cmd ) == 1:
cmd = cmd[ 0 ]
if isinstance( cmd, str ):
cmd = cmd.split( ' ' )
cmd = [ str( arg ) for arg in cmd ]
# By default we separate stderr, don't run in a shell, and don't echo # By default we separate stderr, don't run in a shell, and don't echo
stderr = kwargs.get( 'stderr', PIPE ) stderr = kwargs.get( 'stderr', PIPE )
shell = kwargs.get( 'shell', False ) shell = kwargs.get( 'shell', False )
...@@ -74,6 +69,14 @@ def errRun( *cmd, **kwargs ): ...@@ -74,6 +69,14 @@ def errRun( *cmd, **kwargs ):
if echo: if echo:
# cmd goes to stderr, output goes to stdout # cmd goes to stderr, output goes to stdout
info( cmd, '\n' ) info( cmd, '\n' )
if len( cmd ) == 1:
cmd = cmd[ 0 ]
# Allow passing in a list or a string
if isinstance( cmd, str ) and not shell:
cmd = cmd.split( ' ' )
cmd = [ str( arg ) for arg in cmd ]
elif isinstance( cmd, list ) and shell:
cmd = " ".join( arg for arg in cmd )
popen = Popen( cmd, stdout=PIPE, stderr=stderr, shell=shell ) popen = Popen( cmd, stdout=PIPE, stderr=stderr, shell=shell )
# We use poll() because select() doesn't work with large fd numbers, # We use poll() because select() doesn't work with large fd numbers,
# and thus communicate() doesn't work either # and thus communicate() doesn't work either
...@@ -539,18 +542,20 @@ def ensureRoot(): ...@@ -539,18 +542,20 @@ def ensureRoot():
exit( 1 ) exit( 1 )
return return
def waitListening( client, server, port, timeout=None ): def waitListening( client=None, server='127.0.0.1', port=80, timeout=None ):
"Wait until server is listening on port" "Wait until server is listening on port"
if not client.cmd( 'which telnet' ): run = ( client.cmd if client else
partial( quietRun, shell=True ) )
if not run( 'which telnet' ):
raise Exception('Could not find telnet' ) raise Exception('Could not find telnet' )
cmd = ( 'sh -c "echo A | telnet -e A %s %s"' % cmd = ( 'sh -c "echo A | telnet -e A %s %s"' %
( server.IP(), port ) ) ( server.IP(), port ) )
time = 0 time = 0
while 'Connected' not in client.cmd( cmd ): while 'Connected' not in run( cmd ):
if timeout: if timeout:
if time >= timeout: if time >= timeout:
error( 'could not connect to %s on port %d\n' error( 'could not connect to %s on port %d\n'
% ( client, port ) ) % ( server, port ) )
break break
output('waiting for', server, output('waiting for', server,
'to listen on port', port, '\n') 'to listen on port', port, '\n')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment