Python‎ > ‎

Pinger


__main__.py

#/bin/env python
# -*- coding: UTF-8 -*-
#
# (c) Roberto Gambuzzi
# Creato:          09/11/2010 20.14.58
# Ultima Modifica: 07/03/2011 12.34.55
#
# v 0.0.1.4
#
# file: C:\workspace\gbinside.gambuzzi.name\trunk\sviluppo-brutta-copia\ping\__main__.py
# auth: Roberto Gambuzzi <gambuzzi@gmail.com>
# desc: this program record on a html+excel file the pingtime of a list of hosts
#
# $Id: __main__.py 07/03/2011 12.34.55 roberto $
# --------------
"""
pinger: this program record on a html+excel file the pingtime of a list of hosts

Copyright (C) 2010 Roberto Gambuzzi

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

import os
from os.path import join
import re
import time
import urllib
import sys

def excelDate(t):
    return "%f" % (float(t-time.timezone+3600)/86400.0+25569.0)

ips = [
  '8.8.8.8', #dns di google
  'www.gbinside.com',
]
pingtime = re.compile(r"durata=(\d+)ms")

def oneShot():
    myPath = os.path.dirname(sys.argv[0])
    pingFile = join(myPath, 'ping.xls')
    if os.path.exists(pingFile): # aggiungo solo le righe
        templateText = open(pingFile,'r').read()
        text = '<tr>'
    else: #creo anche l'intestazione
        import template
        templateText = template.excel
        text = '<tr><td></td><td>'+'</td><td>'.join(ips+['Stato'])+'</td></tr>\n<tr>' # creo intestazioni colonne
    
    #metto la data-ora
    text = text + '<td class="xlDate" x:num>' + excelDate(time.time()) + '</td>\n'
    
    for host in ips:
       print host,
       pingaling = os.popen("ping -n 2 "+host,"r")
       sys.stdout.flush()
       better = ''
       while 1:          
          line = pingaling.readline()
          if not line: break
          igot = pingtime.findall(line)
          if igot:
               if better:
                   better = min(better, int(igot[0]))
               else:
                   better = int(igot[0])
       if not better:
           pre = time.time()
           try: 
              html = urllib.urlopen('http://'+host).read()
              better = int((time.time()-pre) * 100) 
           except:
              pass              
       text = text +'<td class="style0" x:num>'+ str(better) + '</td>\n'
    
    ref = str(templateText.count('<!-- -->') + 2)
    ref = 'B'+ref+':'+ chr(65+len(ips)) + ref
    text = text +'<td x:fmla=\'=IF(MAX('+ref+')=0,"GIU","SU")\'></td>\n'
    text = text + '</tr>\n'
    text = '-->\n ' + text + '<!-- %s' #lascio il punto per la prossima volta
    
    open(pingFile,'w').write(templateText % text )
    print ''

def main():
    while 1:
        try:
            oneShot()
        except:
            pass
        time.sleep(60)

if __name__=="__main__":
    main()
 


template.py

# -*- coding: UTF-8 -*-
#
# (c) Roberto Gambuzzi
# Creato:          09/11/2010 20.10.58
# Ultima Modifica: 07/03/2011 12.36.41
#
# v 0.0.1.1
#
# file: C:\workspace\gbinside.gambuzzi.name\trunk\sviluppo-brutta-copia\ping\template.py
# auth: Roberto Gambuzzi <gambuzzi@gmail.com>
# desc: 
#
# $Id: template.py 07/03/2011 12.36.41 roberto $
# --------------
"""
Copyright (C) 2010 Roberto Gambuzzi

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""


excel_ima = """
<v:rect style='position:absolute; margin-left:3pt;margin-top:3pt;width:120pt;height:%ipt;z-index:1'>
<v:imagedata src="%s" />
</v:rect>"""

excel = """<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 11">

<style>
<!--table
{mso-displayed-decimal-separator:"\,";
mso-displayed-thousand-separator:"\.";}   
@page
  {
  mso-page-orientation:landscape;
  margin:.25in .25in .5in .25in;
  mso-header-margin:.5in;    
  mso-footer-margin:.25in;
  mso-footer-data:"&R&P of &N";
  mso-horizontal-page-align:center;
  mso-vertical-page-align:center;
  }   
.style0
{mso-number-format:General;
text-align:general;
vertical-align:bottom;
white-space:nowrap;
mso-rotate:0;
mso-background-source:auto;
mso-pattern:auto;
color:windowtext;
font-size:10.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Arial;
mso-generic-font-family:auto;
mso-font-charset:0;
border:none;
mso-protection:locked visible;
mso-style-name:Normale;
mso-style-id:0;}
.xl24 {
  mso-style-parent:style0;
  font-weight:700;
}
.xlDate
 {
  mso-style-parent:style0;
  mso-number-format:"dd\/mm\/yyyy\\ hh\:mm\:ss\;\@";
 }-->
</style>

<!--[if gte mso 9]><xml>
<x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
    <x:Name>PINGER</x:Name>
    <x:WorksheetOptions>
     <x:Print>
      <x:ValidPrinterInfo/>
      <x:HorizontalResolution>600</x:HorizontalResolution>
      <x:VerticalResolution>600</x:VerticalResolution>
     </x:Print>
     <x:Selected/>
     <x:Panes>
      <x:Pane>
       <x:Number>3</x:Number>
       <x:ActiveCol>4</x:ActiveCol>
      </x:Pane>
     </x:Panes>
     <x:ProtectContents>False</x:ProtectContents>
     <x:ProtectObjects>False</x:ProtectObjects>
     <x:ProtectScenarios>False</x:ProtectScenarios>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
  <x:WindowHeight>11340</x:WindowHeight>
  <x:WindowWidth>17055</x:WindowWidth>
  <x:WindowTopX>120</x:WindowTopX>
  <x:WindowTopY>30</x:WindowTopY>
  <x:ProtectStructure>False</x:ProtectStructure>
  <x:ProtectWindows>False</x:ProtectWindows>
</x:ExcelWorkbook>
</xml><![endif]-->
</head>

<body>

<div align=center x:publishsource="Excel">

<table x:str border=0 cellpadding=0 cellspacing=0 width=320 style='border-collapse:collapse;table-layout:fixed;width:240pt'>
 <col width=132 style='width:99pt'> 
 <col width=132 style='width:99pt'> 
 <col width=132 style='width:99pt'> 
 <col width=132 style='width:99pt'> 
 <col width=132 style='width:99pt'> 
  
 <!-- %s -->
   
 <![if supportMisalignedColumns]>
 <tr height=0 style='display:none'>
  <td width=132 style='width:99pt'></td>
  <td width=132 style='width:99pt'></td>
  <td width=132 style='width:99pt'></td>
  <td width=132 style='width:99pt'></td>
  <td width=132 style='width:99pt'></td>
 </tr>
 <![endif]>
</table>

</div>

</body>

</html>
"""

grafico = """
<!--[if gte vml 1]><v:shapetype id="_x0000_t201"
   coordsize="21600,21600" o:spt="201" path="m,l,21600r21600,l21600,xe">
   <v:stroke joinstyle="miter"/>
   <v:path shadowok="f" o:extrusionok="f" strokeok="f" fillok="f"
    o:connecttype="rect"/>
   <o:lock v:ext="edit" shapetype="t"/>
  </v:shapetype><v:shape id="_x0000_s1026" type="#_x0000_t201" style='position:absolute;
   margin-left:.75pt;margin-top:0;width:760.5pt;height:411pt;z-index:1'
   fillcolor="window [78]" stroked="f" strokecolor="windowText [77]"
   strokeweight="3e-5mm" o:insetmode="auto">
   <v:fill color2="windowText [77]"/>
   <o:lock v:ext="edit" rotation="t" text="t"/>
   <x:ClientData ObjectType="Chart">
    <x:AutoLine>False</x:AutoLine>
    <x:WebChart>
     <x:Scaling>
      <x:ScaleID>0</x:ScaleID>
      <x:Orientation>MinMax</x:Orientation>
     </x:Scaling>
     <x:Scaling>
      <x:ScaleID>1</x:ScaleID>
      <x:Orientation>MinMax</x:Orientation>
     </x:Scaling>
     <x:Scaling>
      <x:ScaleID>2</x:ScaleID>
      <x:Orientation>MinMax</x:Orientation>
     </x:Scaling>
     <x:Chart>
      <x:Name>Grafico 2</x:Name>
      <x:Options>
       <x:SizeWithWindow/>
      </x:Options>
      <x:PageSetup>
       <x:ChartSize>FullPage</x:ChartSize>
       <x:PageMargins Bottom="0.984251969" Left="0.78740157499999996"
        Right="0.78740157499999996" Top="0.984251969"/>
      </x:PageSetup>
      <x:Border>
       <x:ColorIndex>None</x:ColorIndex>
      </x:Border>
      <x:Font>
       <x:FontName>Arial</x:FontName>
       <x:Size>9.25</x:Size>
       <x:AutoScale/>
      </x:Font>
      <x:Left>0</x:Left>
      <x:Top>0</x:Top>
      <x:Width>15224.9853515625</x:Width>
      <x:Height>8235</x:Height>
      <x:View3D>
       <x:Elevation>-1</x:Elevation>
       <x:Rotation>10</x:Rotation>
      </x:View3D>
      <x:Floor>
       <x:Interior>
        <x:ColorIndex>14</x:ColorIndex>
        <x:BGColorIndex>1</x:BGColorIndex>
       </x:Interior>
      </x:Floor>
      <x:Walls>
       <x:Border>
        <x:ColorIndex>55</x:ColorIndex>
        <x:LineStyle>Solid</x:LineStyle>
        <x:Weight>Narrow</x:Weight>
       </x:Border>
       <x:Interior>
        <x:ColorIndex>1</x:ColorIndex>
        <x:BGColorIndex>0</x:BGColorIndex>
       </x:Interior>
      </x:Walls>
      <x:ChartGrowth>
       <x:HorzGrowth>1</x:HorzGrowth>
       <x:VertGrowth>1</x:VertGrowth>
      </x:ChartGrowth>
      <x:PlotArea>
       <x:Left>45.674956054687499</x:Left>
       <x:Top>0</x:Top>
       <x:Width>15164.085410156251</x:Width>
       <x:Height>7868.5424999999996</x:Height>
       <x:Border>
        <x:ColorIndex>None</x:ColorIndex>
       </x:Border>
       <x:Interior>
        <x:ColorIndex>None</x:ColorIndex>
       </x:Interior>
       <x:Font>
        <x:FontName>Arial</x:FontName>
        <x:Size>9.25</x:Size>
        <x:AutoScale/>
       </x:Font>
       <x:Graph>
        <x:Type>Column</x:Type>
        <x:SubType>3D</x:SubType>
        <x:GapDepth>150</x:GapDepth>
        <x:ScaleID>0</x:ScaleID>
        <x:ScaleID>1</x:ScaleID>
        <x:ScaleID>2</x:ScaleID>
        <x:Series>
         <x:Index>0</x:Index>
         <x:Caption>
          <x:DataSource>-1</x:DataSource>
          <x:Data>&quot;N Visitatori&quot;</x:Data>
         </x:Caption>
         <x:Name>N Visitatori</x:Name>
         <x:Border>
          <x:ColorIndex>None</x:ColorIndex>
         </x:Border>
         <x:Interior>
          <x:ColorIndex>8</x:ColorIndex>
          <x:BGColorIndex>1</x:BGColorIndex>
         </x:Interior>
         <x:Category>
          <x:DataSource>0</x:DataSource>
          <x:Data>$B2:$B100</x:Data>
         </x:Category>
         <x:Value>
          <x:DataSource>0</x:DataSource>
          <x:Data>$C2:$C100</x:Data>
         </x:Value>
        </x:Series>
        <x:Series>
         <x:Index>1</x:Index>
         <x:Caption>
          <x:DataSource>-1</x:DataSource>
          <x:Data>&quot;Visitatori&quot;</x:Data>
         </x:Caption>
         <x:Name>Visitatori</x:Name>
         <x:Border>
          <x:ColorIndex>None</x:ColorIndex>
         </x:Border>
         <x:Interior>
          <x:ColorIndex>44</x:ColorIndex>
          <x:BGColorIndex>1</x:BGColorIndex>
         </x:Interior>
         <x:Category>
          <x:DataSource>0</x:DataSource>
          <x:Data>$B2:$B100</x:Data>
         </x:Category>
         <x:Value>
          <x:DataSource>0</x:DataSource>
          <x:Data>$B2:$B100</x:Data>
         </x:Value>
        </x:Series>
        <x:Series>
         <x:Index>2</x:Index>
         <x:Caption>
          <x:DataSource>-1</x:DataSource>
          <x:Data>&quot;Pagine&quot;</x:Data>
         </x:Caption>
         <x:Name>Pagine</x:Name>
         <x:Border>
          <x:ColorIndex>None</x:ColorIndex>
         </x:Border>
         <x:Interior>
          <x:ColorIndex>48</x:ColorIndex>
          <x:BGColorIndex>1</x:BGColorIndex>
         </x:Interior>
         <x:Category>
          <x:DataSource>0</x:DataSource>
          <x:Data>$B2:$B100</x:Data>
         </x:Category>
         <x:Value>
          <x:DataSource>0</x:DataSource>
          <x:Data>$B2:$B100</x:Data>
         </x:Value>
        </x:Series>
        <x:PlotVisible/>
       </x:Graph>
       <x:Axis>
        <x:Placement>Bottom</x:Placement>
        <x:AxisID>0</x:AxisID>
        <x:ScaleID>0</x:ScaleID>
        <x:MajorGridlines/>
        <x:CrossingAxis>1</x:CrossingAxis>
        <x:Font>
         <x:FontName>Tahoma</x:FontName>
         <x:Size>9.25</x:Size>
         <x:B/>
         <x:ColorIndex>55</x:ColorIndex>
         <x:AutoScale/>
        </x:Font>
        <x:Number>
         <x:SourceLinked/>
         <x:BuiltInFormat>0</x:BuiltInFormat>
        </x:Number>
        <x:TickLabelPosition>Low</x:TickLabelPosition>
        <x:TickLabelSkip>1</x:TickLabelSkip>
        <x:TickMarkSkip>1</x:TickMarkSkip>
        <x:Type>Automatic</x:Type>
       </x:Axis>
       <x:Axis>
        <x:Placement>Left</x:Placement>
        <x:AxisID>1</x:AxisID>
        <x:ScaleID>1</x:ScaleID>
        <x:MajorGridlines/>
        <x:CrossingAxis>0</x:CrossingAxis>
        <x:CrossesAt>Minimum</x:CrossesAt>
        <x:CrossBetween>Between</x:CrossBetween>
        <x:Font>
         <x:FontName>Tahoma</x:FontName>
         <x:Size>9.25</x:Size>
         <x:B/>
         <x:ColorIndex>55</x:ColorIndex>
         <x:AutoScale/>
        </x:Font>
        <x:Number>
         <x:SourceLinked/>
         <x:BuiltInFormat>3</x:BuiltInFormat>
        </x:Number>
        <x:Type>Value</x:Type>
       </x:Axis>
       <x:Axis>
        <x:Delete/>
        <x:Placement>Right</x:Placement>
        <x:AxisID>2</x:AxisID>
        <x:ScaleID>2</x:ScaleID>
        <x:CrossingAxis>0</x:CrossingAxis>
        <x:CrossesAt>Minimum</x:CrossesAt>
        <x:CrossBetween>Between</x:CrossBetween>
        <x:Type>Series</x:Type>
       </x:Axis>
      </x:PlotArea>
      <x:Legend>
       <x:Type>Horizontal</x:Type>
       <x:Placement>Custom</x:Placement>
       <x:Left>6021.4817065429688</x:Left>
       <x:Top>137.93625</x:Top>
       <x:Border>
        <x:ColorIndex>None</x:ColorIndex>
       </x:Border>
       <x:Interior>
        <x:ColorIndex>None</x:ColorIndex>
       </x:Interior>
       <x:Font>
        <x:FontName>Tahoma</x:FontName>
        <x:Size>8.75</x:Size>
        <x:B/>
       </x:Font>
      </x:Legend>
     </x:Chart>
    </x:WebChart>
   </x:ClientData>
  </v:shape><![endif]--><![if !vml]>"""
Comments