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







--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to