which

mk mrkafk at gmail.com
Fri Feb 5 10:52:19 EST 2010


Jean-Michel Pichavant wrote:
> If you can change your program interface, then do it, if not then you're 
> right you don't have much choice as you are suffering from the program 
> poor interface.
> You can fix this problem by explicitly asking for the thing you want to 
> do, instead of guessing by inspecting the argument nature.
> 
> myProg --help
> 
> usage : myProg command [args]
>    command list:
>       - cmd: execute the given <arg1> command line
>       - exec: execute the given script file named <arg1>
>       - copy: copy <arg1> to <arg2>
> 
> example:
>  >myProg cmd "echo that's cool"
>  >myProg exec /etc/init.d/myDaemon
>  >myProg copy /tmp /tmp2
> 

I sure can change the interface since I'm the author of the entire 
program. But I don't see how I can arrange program in a different way: 
the program is supposed to be called with -c parameter (command to run), 
-s script to run, or -y file_or_dir_to_copy.

Then, I start instances of SSHThread class to do precisely that, 
separately for each ip/hostname:


class SSHThread(threading.Thread):
     def __init__(self, lock, cmd, ip, username, sshprivkey=None, 
passw=None, port=22, script=None, remotedir=None):

         threading.Thread.__init__(self)

         self.lock = lock
         if isinstance(cmd, str):
             self.cmd = cmd.replace(r'${ADDR}',ip)
         else:
             self.cmd = cmd
         self.ip = ip
         self.username = username
         self.sshprivkey = sshprivkey
         self.passw = passw
         self.port = port
         self.conobj = None
         self.conerror = ''
         self.msgstr = ''
         self.confailed = True
         if script:
             self.setpathinfo(script, remotedir=remotedir)
         self.sentbytes = 0
         self.finished = False
         self.abort = False

It gets called like this:

th = SSHThread(lock, opts.cmd, ip, username=username, 
sshprivkey=opts.key, passw=passw, port=port, script=opts.script, 
remotedir=opts.remotedir)


..where all the options are parsed by ConfigParser.OptionParser(). So 
they are either strings, or Nones.

So in this context this is fine. But I wanted to make the class more 
robust. Perhaps I should do smth like this before setting self.cmd?

assert isinstance(cmd, basestring) or cmd is None, "cmd should be string 
or None"

and then:

if cmd:
	self.cmd = cmd.replace..


?

Entire source code is here:

http://python.domeny.com/cssh.py

regards,
mk










More information about the Python-list mailing list