#!/usr/bin/python
# -*- coding: utf-8 -*-
import ping, socket
import os, time, json
# (G)2013 xChaos, Arachne Labs http://arachne.cz + SPOJE.NET http://spoje.net
hosts = "/etc/hosts"
timeout = 1500 #timeout in ms
interval = 200 #ping interval in ms
attempts = 10
tld = ".czf"
domain = ".brevnov.czf"
smokeping_prefix = "Klienti"
smpater_prefix = "Backbone"
smokeping_babble_length = 3
smpater_babble_length = 2
smokeping_html = "/var/www/html/web/sites/sysifos/hosts-ping/index.html"
smpater_html = "/var/www/html/web/sites/sysifos/hosts-ping/backbone.html"
smokeping_avg_html = "/var/www/html/web/sites/sysifos/hosts-ping/avg.html"
smpater_avg_html = "/var/www/html/web/sites/sysifos/hosts-ping/backbone-avg.html"
smokeping_avg_json = "/var/www/html/web/sites/sysifos/hosts-ping/smokeping.json"
smpater_avg_json = "/var/www/html/web/sites/sysifos/hosts-ping/smpater.json"
smokeping_url = "http://sisyfos.brevnov.czf/cgi-bin/smokeping.cgi?filter=%s&target=%s"
smpater_url = "http://tartarus.brevnov.czf/cgi-bin/smokeping.cgi?filter=%s&target=%s"
table_head = """
hosts ping (%s)
# |
hostname |
loss |
avg |
best |
worst |
"""
table_end = """
Page generated by (G)2013 xChaos hosts-ping version 0.2-a
"""
def try_to_ping(host):
sum = 0.0
best = None
worst = None
loss = 0
for i in range(0, attempts):
try:
delay = ping.Ping(host, timeout = timeout).do() #timeout in ms
time.sleep(interval/1000)
if delay:
sum += delay
if not best or best > delay:
best = delay
if not worst or worst < delay:
worst = delay
else:
loss += 1
except socket.error, e:
loss += 1
return (sum/attempts, best, worst, loss)
def smokenam_style(hostname, prefix, babble_length):
if not tld in hostname:
hostname += domain
babble = hostname.split('.')
return '.'.join([prefix,] + [a_tooth for a_tooth in reversed(babble)][1:babble_length] + ['-'.join(babble),])
def append_host(html, host, base_url, counter, red_treshold, green_treshold):
style = {'right': 'text-align: right;'}
columns = ('loss','avg','best','worst')
for kolikaty, column in enumerate(columns):
style[column] = style['right']
if not host[column]:
host[column] = 0 #don't want it to be "None" type
if host[column] > red_treshold[kolikaty]:
style[column] += ' color: red;'
elif host[column] < green_treshold[kolikaty]:
style[column] += ' color: green;'
loss = float(100*host['loss'])/host['attempts']
html.write( ('%d | %s | %.1f%% | ' + "\n")
% (('even', 'odd')[counter % 2], style['right'], counter, base_url % (host['name'], host['smokename']), host['name'], style['loss'], loss))
if host['avg'] and host['best'] and host['worst']:
html.write( ('%.1f | %.1f | %.1f |
' + "\n")
% (style['avg'], host['avg'], style['best'], host['best'], style['worst'], host['worst']))
else:
html.write(3*('- | ' % style['loss']) + "\n")
def merge_json_avgs(filename, smoke_array):
try:
avg_dict = json.load(open(filename))
for host in smoke_array:
avg = avg_dict.get(host['ip'])
if avg:
if host['avg'] and avg['avg'] and avg['attempts']+host['attempts']-avg['loss']-host['loss'] > 0:
host['avg'] = ((avg['attempts']-avg['loss'])*avg['avg']+(host['attempts']-host['loss'])*host['avg'])/(avg['attempts']+host['attempts']-avg['loss']-host['loss'])
else:
host['avg'] = avg['avg']
if not host['best'] or host['best'] > avg['best']:
host['best'] = avg['best']
if not host['worst'] or host['worst'] < avg['worst']:
host['worst'] = avg['worst']
host['attempts'] += avg['attempts']
host['loss'] += avg['loss']
except:
pass #start from scratch...
def save_json(filename, smoke_array):
smoke_dict = {}
for host in smoke_array:
smoke_dict[host['ip']] = host
json.dump(smoke_dict, open(filename, 'w'))
# main program
smokeping = []
smpater = []
for radek in open(hosts):
if radek[0] != '#':
is_smokeping = 'smokeping' in radek and not 'hidden' in radek
is_smpater = 'smpater' in radek
if is_smokeping or is_smpater:
slovo = radek.split("\t")
host = { 'ip': slovo[0], 'name': slovo[1].split(' ')[0], 'attempts': attempts }
(host['avg'], host['best'], host['worst'], host['loss']) = try_to_ping(host['ip'])
if is_smokeping:
host['smokename'] = smokenam_style(host['name'], smokeping_prefix, smokeping_babble_length)
smokeping.append(host)
else:
host['smokename'] = smokenam_style(host['name'], smpater_prefix, smpater_babble_length)
smpater.append(host)
# smokeping
red_treshold = (0, 100, 50, 200)
green_treshold = (0, 7, 5, 20)
html = open(smokeping_html, 'w')
html.write("Aktuální odezva klientských zařízení
");
html.write(table_head % time.ctime());
for kolikaty, host in enumerate(sorted(smokeping, key = lambda host: -host['loss']*host['attempts']*timeout-host['avg'])):
append_host(html, host, smokeping_url, kolikaty+1, red_treshold, green_treshold)
html.write(table_end)
html.close()
# smpater
red_treshold = (0, 50, 20, 100)
green_treshold = (0, 5, 2, 10)
html = open(smpater_html, 'w')
html.write("Aktuální odezva páteřních routerů
");
html.write(table_head % time.ctime());
for kolikaty, host in enumerate(sorted(smpater, key = lambda host: -host['loss']*host['attempts']*timeout-host['avg'])):
append_host(html, host, smpater_url, kolikaty+1, red_treshold, green_treshold)
html.write(table_end)
html.close()
# smokeping average
red_treshold = (1000, 100, 20, 500)
green_treshold = (0, 7, 5, 20)
merge_json_avgs(smokeping_avg_json, smokeping)
html = open(smokeping_avg_html, 'w')
html.write("Průměrná odezva klientských zařízení
");
html.write(table_head % time.ctime());
for kolikaty, host in enumerate(sorted(smokeping, key = lambda host: -host['loss']*host['attempts']*timeout-host['avg'])):
append_host(html, host, smokeping_url, kolikaty+1, red_treshold, green_treshold)
html.write(table_end)
html.close()
save_json(smokeping_avg_json, smokeping)
# smpater average
red_treshold = (100, 50, 10, 200)
green_treshold = (0, 5, 2, 10)
merge_json_avgs(smpater_avg_json, smpater)
html = open(smpater_avg_html, 'w')
html.write("Průměrná odezva páteřních routerů
");
html.write(table_head % time.ctime());
for kolikaty, host in enumerate(sorted(smpater, key = lambda host: -host['loss']*host['attempts']*timeout-host['avg'])):
append_host(html, host, smpater_url, kolikaty+1, red_treshold, green_treshold)
html.write(table_end)
html.close()
save_json(smpater_avg_json, smpater)