I am not an expert in python, so any help is my appreciated.  My
threaded program consumed everything in the queue but is not
exiting... What is the problem with this program?

#!/opt/gspython-2.5/bin/python

""" Intention of this program: given a list of host names in a file,
get the .rhosts file, remove the newline and create a single record or
tuple
for each server.
"""

import paramiko
import os
import sys
import Queue
import threading
import pdb

SPath = "/.rhosts"              #location of .rhosts in Solaris
LPath = "/root/.rhosts" #location of .rhosts in Linux

#Globals starts with Capital letter
Q_in    = Queue.Queue()

class   ProcessThreads(threading.Thread):
        """ Threaded remote execution and data gathering """
        def __init__(self, Q_in):
                threading.Thread.__init__(self)
                self.Q_in = Q_in


        def run(self):
                while True:
                        #grabs host and path from Q_in
                        host, path = self.Q_in.get()


                        #print "host = ", host, "file = ", path
                        if host is None:
                                break # reached end of queue

                        ssh_c = paramiko.SSHClient()
                        ssh_c.load_system_host_keys()
                        user = 'root'
                        port = 22
                        #remotely execute the commands
                        try:
                                ssh_c.connect(host, port, user, timeout=20)
                        except Exception, e:
                                print "ssh exception %s for %s" %( e, host)
                                break


                        stdin, stdout, stderr = ssh_c.exec_command('cat ' + 
path)
                        output = stdout.readlines()
                        outputs = ''.join(output).replace('\n',',')
                        print host,": ", outputs

                        #signals to queue job is done
                        self.Q_in.task_done()


def usage():
        nargs = len(sys.argv)
        if  nargs < 2:
                print "USAGE: %s <input-file>"  % os.path.basename(sys.argv[0])
                print "<input-file> contains records of hostnames, one host per
line"
                sys.exit(1)

def load_ssh():
        paramiko.util.log_to_file('/var/tmp/paramiko.log')


if __name__ == "__main__":
        #pdb.set_trace()
        usage()
        hostfile = sys.argv[1]
        fh = open(hostfile, 'r')
        records = fh.readlines()
        fh.close()
        load_ssh()

        #spawn a pool of thread and spawn them queue instance
        for i in range(5):
                t = ProcessThreads(Q_in)
                t.setDaemon(True)
                t.start()

        #populate queue with data

        for recs in records:
                hostinfo = recs.strip()
                host, os = hostinfo.split()
                if os == "Linux":
                        path = LPath
                else:
                        path = SPath
                Q_in.put([host, path])

        for i in range(5):
                Q_in.put([None, None])  # end of queue signal

        Q_in.join()
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to