1Wieloprocesowy ping i obsługa xlsx w Python
Korzystając z biblioteki openpyxl można w pythonie całkiem wygodnie
korzystać z plików w formacie xlsx. Poniższy programik ilustruje
zarówno czytanie, jak i pisanie do xlsx-a.
Program jest też prostym przykładem wieloprocesowego przetważania. Wykorzystuje bibliotekę standardową multiprocessing, żeby uruchomić w procesach potomnych systemowe polecenie ping (przy pomocy subprocess.Popen). Hosty wczytane z pliku xlsx po kolei są ,,pingane'', a wyniki ping-a zapisywane są do pliku. Jeżeli część pakietów nie powróciła z celu, to komórka arkusza jest kolorowana.
Program jest też prostym przykładem wieloprocesowego przetważania. Wykorzystuje bibliotekę standardową multiprocessing, żeby uruchomić w procesach potomnych systemowe polecenie ping (przy pomocy subprocess.Popen). Hosty wczytane z pliku xlsx po kolei są ,,pingane'', a wyniki ping-a zapisywane są do pliku. Jeżeli część pakietów nie powróciła z celu, to komórka arkusza jest kolorowana.
'''program wysyła ping-a asynchronicznie do hostow podanych jako argument skryptu i zapisuje do xlsx-a wynik dla kazdego hosta. Hosty do ktorych nie wszystkie ping-i doszly zostana pokolorowane na czerwono. ''' import multiprocessing import re import subprocess import sys from openpyxl import load_workbook, Workbook from openpyxl.styles import PatternFill def pingHost(hostname): try: v=subprocess.check_output('ping.exe -n 1 {0}'.format(hostname),shell=True) except subprocess.CalledProcessError as e: v=e.output #zbierz lancuch zawierajacy wyniki pinga i podziel go na linie ping_output = v.decode(errors='ignore').splitlines() straty = '\n'.join([x.strip() for x in ping_output if re.search('straty',x)]) ip = '\n'.join([re.sub('[^0-9.]','',x) for x in ping_output if re.search('badania',x)]) return {'ip':ip,'straty':straty,'hostname':hostname} def write_hosts(filename,host_list): '''zapisz otrzymane wyniki do xlsx''' wb = load_workbook(filename) ws = wb.active ws.cell(row=1,column=2).value='ip' ws.cell(row=1,column=3).value='losses' for i,host in enumerate(host_list): if(host['straty']!='(0% straty),'): ws.cell(row=2+i,column=1).fill=red_pattern_fill() ws.cell(row=2+i,column=2).value=host['ip'] ws.cell(row=2+i,column=3).value=host['straty'] wb.save(filename) def read_hosts(filename): '''wczytaj hosty do pingania z xlsx-a z pominieciem 1 wiersza (naglowka)''' wb = load_workbook(filename) ws = wb.active rows_to_read = range(2,ws.max_row+1) return [ws.cell(row=row,column=1).value for row in rows_to_read] def red_pattern_fill(): '''pomocnicza funkcja definiujaca czerwone wypelnienie''' return PatternFill(start_color='FFFF0000', end_color='FFFF0000', fill_type='solid') if __name__ == '__main__': hosty=read_hosts(sys.argv[1]) pool=multiprocessing.Pool() v=pool.map(pingHost,hosty) write_hosts(sys.argv[1],v)
Brak komentarzy:
Prześlij komentarz