shimizu
13.07.2009, 01:58
для работы нужны модули paramiko и progressbar
#!/usr/bin/env python
"""
sh.imizu@yahoo.com
"""
import sys
import socket
import paramiko
import optparse
import logging
import ftplib
import fileinput
import progressbar as bar
from multiprocessing import Pool, log_to_stderr
from urlparse import urlparse
def parse(file):
f = fileinput.input([file])
q = []
try:
for line in f:
u = urlparse("ftp://" + line[:-1])
try: q.append((u.username,u.password,u.hostname,u.port) )
except ValueError: pass
except IOError:
print "The file does not exist, exiting gracefully."
sys.exit()
f.close()
q[:] = [x for x in q if x is not None]
return q
def ssh_check(q):
on = False
port = 22
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPo licy())
ssh.connect(q[2], username=q[0], password=q[1], port=port, timeout=timeout)
on = True
ssh.close()
except:
pass
return on,q
def ftp_check(q):
on = False
if q[3]: port = q[3]
else: port = 21
try:
socket.setdefaulttimeout = timeout
ftp = ftplib.FTP(q[2],timeout=timeout)
ftp.login(q[0], q[1])
on = True
ftp.close()
except:
pass
return on,q
def write_(a,b):
f = open ( output + "-true", 'w' )
for aa in a:
f.write("+++\t%s:%s@%s\n" % (aa[0],aa[1],aa[2]))
f.close()
fb = open ( output + "-false", 'w' )
for bb in b:
fb.write("---\t%s:%s@%s\n" % (bb[0],bb[1],bb[2]))
fb.close()
def spawn(what,parsed,x):
class line_up():
def update(self, pbar):
return "+" + str(len(a)) + "/-" + str(len(b)) + "/" + str(total)
pool = Pool(processes=x)
a,b,total = [],[],len(parsed)
widgets = [bar.Percentage(), ' ', bar.Bar(marker='-'),' ', bar.ETA(),' ',line_up()]
pbar = bar.ProgressBar(widgets=widgets, maxval=total).start()
results = [pool.apply_async(what, [t]) for t in parsed]
for r in results:
try:
q = r.get()
if q[0]:
a.append(q[1])
else:
b.append(q[1])
try: pbar.update(len(a) + len(b))
except AssertionError: pass
except IndexError:
pass
pbar.finish()
print
return a,b
def main():
p = optparse.OptionParser(description='FTP/SSH list checker',
prog='py-check',
version='0.1',
usage='%prog -m ftp/ssh -t num-of-threads -o out-file-prefix')
p.add_option('-t', type="int", dest="threads", help='Number of threads to spawn', default=5)
p.add_option('-m', type="string", dest="mode", help='Mode to run: ftp/ssh', default="ssh")
p.add_option('-o', type="string", dest="output", help='File to store results', default="check")
p.add_option('-T', type="int", dest="timeout", help='Timeout in seconds', default=10)
options, arguments = p.parse_args()
global timeout,output
timeout,output = options.timeout,options.output
paramiko.util.log_to_file('/dev/null')
if len(arguments) == 1:
if options.mode == "ssh":
what = ssh_check
elif options.mode == "ftp":
what = ftp_check
else:
what = ssh_check
a, b = spawn(what,parse(arguments[0]),options.threads)
write_(a,b)
else:
p.print_help()
if __name__ == '__main__':
main()
#!/usr/bin/env python
"""
sh.imizu@yahoo.com
"""
import sys
import socket
import paramiko
import optparse
import logging
import ftplib
import fileinput
import progressbar as bar
from multiprocessing import Pool, log_to_stderr
from urlparse import urlparse
def parse(file):
f = fileinput.input([file])
q = []
try:
for line in f:
u = urlparse("ftp://" + line[:-1])
try: q.append((u.username,u.password,u.hostname,u.port) )
except ValueError: pass
except IOError:
print "The file does not exist, exiting gracefully."
sys.exit()
f.close()
q[:] = [x for x in q if x is not None]
return q
def ssh_check(q):
on = False
port = 22
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPo licy())
ssh.connect(q[2], username=q[0], password=q[1], port=port, timeout=timeout)
on = True
ssh.close()
except:
pass
return on,q
def ftp_check(q):
on = False
if q[3]: port = q[3]
else: port = 21
try:
socket.setdefaulttimeout = timeout
ftp = ftplib.FTP(q[2],timeout=timeout)
ftp.login(q[0], q[1])
on = True
ftp.close()
except:
pass
return on,q
def write_(a,b):
f = open ( output + "-true", 'w' )
for aa in a:
f.write("+++\t%s:%s@%s\n" % (aa[0],aa[1],aa[2]))
f.close()
fb = open ( output + "-false", 'w' )
for bb in b:
fb.write("---\t%s:%s@%s\n" % (bb[0],bb[1],bb[2]))
fb.close()
def spawn(what,parsed,x):
class line_up():
def update(self, pbar):
return "+" + str(len(a)) + "/-" + str(len(b)) + "/" + str(total)
pool = Pool(processes=x)
a,b,total = [],[],len(parsed)
widgets = [bar.Percentage(), ' ', bar.Bar(marker='-'),' ', bar.ETA(),' ',line_up()]
pbar = bar.ProgressBar(widgets=widgets, maxval=total).start()
results = [pool.apply_async(what, [t]) for t in parsed]
for r in results:
try:
q = r.get()
if q[0]:
a.append(q[1])
else:
b.append(q[1])
try: pbar.update(len(a) + len(b))
except AssertionError: pass
except IndexError:
pass
pbar.finish()
return a,b
def main():
p = optparse.OptionParser(description='FTP/SSH list checker',
prog='py-check',
version='0.1',
usage='%prog -m ftp/ssh -t num-of-threads -o out-file-prefix')
p.add_option('-t', type="int", dest="threads", help='Number of threads to spawn', default=5)
p.add_option('-m', type="string", dest="mode", help='Mode to run: ftp/ssh', default="ssh")
p.add_option('-o', type="string", dest="output", help='File to store results', default="check")
p.add_option('-T', type="int", dest="timeout", help='Timeout in seconds', default=10)
options, arguments = p.parse_args()
global timeout,output
timeout,output = options.timeout,options.output
paramiko.util.log_to_file('/dev/null')
if len(arguments) == 1:
if options.mode == "ssh":
what = ssh_check
elif options.mode == "ftp":
what = ftp_check
else:
what = ssh_check
a, b = spawn(what,parse(arguments[0]),options.threads)
write_(a,b)
else:
p.print_help()
if __name__ == '__main__':
main()