#!/usr/bin/env python # # Author: Martin Matusiak # Licensed under the GNU Public License, version 3. import os import re import sys import time import urllib ip_factory = "192.168.2.1" password = "" inet_host = "yahoo.com" def write(s): sys.stdout.write(s) sys.stdout.flush() def grep(needle, haystack): if needle and haystack: m = re.search(needle, haystack) if m and m.groups(): return m.groups()[0] def invoke(cmd): (sin, sout) = os.popen2(cmd) return sout.read() def ping(host): cmd = 'ping -c1 -n -w2 ' + host + ' 2>&1' res = invoke(cmd) v = grep("rtt min/avg/max/mdev = [0-9.]+/([0-9.]+)/[0-9.]+/[0-9.]+ ms", res) if v: return int(float(v)) def find_lan_gateway(): cmd = "route -n" res = invoke(cmd) v = grep("[0-9.]+\s+([0-9.]+)\s+[0-9.]+\s+UG", res) if v: return v def load_url(url, params=None): data = None if params: data = urllib.urlencode(params) f = urllib.urlopen(url, data) return f.read() def router_login(): form = {"page": "login", "pws": password} load_url("http://%s/login.htm" % ip, form) def check_router_state(): state = { "conn": None, "gateway": None, "dns1": None } router_login() s = load_url("http://%s/js/js_status_main.htm" % ip) if s: v = grep("var bWanConnected=([0-9]);", s) if v == "1": state['conn'] = True elif v == "0": state['conn'] = False if state['conn']: g = grep('writit\("([0-9.]+)","GATEWAY"\);', s) if g and g != "0.0.0.0": state['gateway'] = g g = grep('writit\("([0-9.]+)","DNSIP"\);', s) if g and g != "0.0.0.0": state['dns1'] = g return state def renew_router_connection(): router_login() form = {"page": "status_main", "button": "dhcprenew"} s = load_url("http://%s/status_main.htm" % ip, form) return s ip = find_lan_gateway() if not ip: ip = ip_factory write("LAN gateway detection failed, using factory ip %s for router\n" % ip_factory) else: write("Router ip: %s\n" % ip) while True: try: router = check_router_state() t = time.strftime("%H:%M:%S", time.localtime()) if router['conn']: hosts = [(inet_host, inet_host), ("dns1", router['dns1']), ("gateway", router['gateway'])] connectivity = "" write("[%s] Connected " % t) for (name, host) in hosts: delay = ping(host) if delay: write("(%s: %s) " % (name, delay)) break else: write("(%s !!) " % name) write("\n") else: write("[%s] NOT CONNECTED, attempting reconnect\n" % t) renew_router_connection() except Exception, e: cls = grep("