2017/01/23

Wieloprocesowy ping i xlsx

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 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