Last active 1450408174

ISP usage checker / router disabler

Revision 2b02f9c4904b4d678d8477c450b7ad092553b865

westnetusage.py Raw
1#!/usr/bin/env python2.7
2version = "r7"
3# This script gets usage from my ISP's website, checks to see if the current average for the month
4# is above their recommended amount per day, then disables the wifi on my router if it is.
5# I made this for a household of people who don't understand the consequences of their actions
6# (namely, that if you abuse our awesome internet, we all have to suffer with being shaped :( )
7# Please, modify this for your own ISP/router and set it up in your own house to help with your daily usage.
8# -blha303
9# Usage: python westnetusage.py [debug]
10# Options:
11# username = Westnet username
12# password = Westnet password
13# routerpass = BoB2 router password
14# always_on_wireless_computer = A laptop or some other device that's always turned on, and connected to the wireless network.
15# and also running a web server (http://address needs to be accessible)
16# timezone = Timezone for logs, in format <country>/<city>
17# BSD license.
18username = "USERNAME"
19password = "PASSWORD"
20routerpass = ""
21always_on_wireless_computer = "ip or hostname"
22timezone = "Australia/Perth"
23
24import urllib2
25from BeautifulSoup import BeautifulSoup
26import urllib
27import cookielib
28import time
29from sys import argv
30import os
31
32debug = False
33try:
34 if argv[1] == "debug":
35 debug = True
36except IndexError:
37 debug = False
38
39def debug(msg):
40 if debug:
41 print msg
42
43debug("Debug active")
44
45def getnumbers(inp): # For parsing "100,000MB" to an integer
46 return int(inp[:-2].replace(",", ""))
47debug("getnumbers function set")
48
49url = "https://myaccount2.westnet.com.au/" # login page url
50desc = "westnet usage alert script %s by blha303. https://gist.github.com/blha303/5788199 for source" % version # what the server sees as the client ID
51debug("url, desc variables set")
52
53logindata = urllib.urlencode({"hdnLoginType": "myaccount", "action": "login", "username": username, "password": password}) # login POST data
54debug("logindata set")
55
56cj = cookielib.CookieJar() # Cookie jar, used to store login session
57opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
58debug("cookie jar set")
59opener.addheaders = [('User-Agent', desc)] # set client ID to desc
60debug("user agent set")
61
62login = opener.open(url, logindata) # log in, save session data to cookie jar
63debug("logged into westnet")
64
65page = opener.open(url) # reopen same url (westnet has both login and homepage on the same url)
66debug("loaded usage page")
67soup = BeautifulSoup(page.read()) # make soup from page
68debug("made soup")
69usage = soup.findAll('div',{'class':'usage_text'})[0].text # get usage string "XXX,XXXMB out of XXX,XXXMB"
70debug("found usage string")
71count = getnumbers(usage.split(" ")[0]) # get count integer, first part of usage string above as integer
72debug("found count")
73total = getnumbers(usage.split(" ")[-1]) # get total integer, last part of usage string above as integer
74debug("found total")
75suggested = getnumbers(soup.findAll('a',{'href':'#suggested_anytime_tooltip'})[0].text) # get suggested integer
76debug("found suggested")
77trend = getnumbers(soup.findAll('a',{'href':'#trend_anytime_tooltip'})[0].text) # get trend integer
78debug("found trend")
79debug("usage: " + usage)
80debug("count: " + str(count))
81debug("total: " + str(total))
82debug("suggested: " + str(suggested))
83debug("trend: " + str(trend))
84
85boblogin = "http://10.1.1.1/login.cgi" # router login url
86bobdata = urllib.urlencode({"login_option": "0", "password": routerpass, "passwordtemp": ""}) # router login info as POST data
87debug("set up bob login data")
88wdisurl = "http://10.1.1.1/wireless_id.wl?wlSsidIdx=0&wlEnbl=0" # router disable wireless url as GET data
89wenurl = "http://10.1.1.1/wireless_id.wl?wlEnbl=1&wlSsidIdx=0" # router enable wireless url as GET data
90debug("set up bob wireless urls")
91
92os.environ['TZ'] = timezone
93time.tzset()
94if debug:
95 ts = time.strftime("%a, %d %b %Y %H:%M:%S %Z", time.localtime()) # timestamp for status webpage
96else:
97 ts = time.strftime("%a, %d %b %Y %H:00:00 %Z", time.localtime()) # as the script is called automatically every hour on the hour, minutes and seconds aren't needed
98debug("set up timestamp")
99
100def logintoBob():
101 opener.open(boblogin, bobdata) # log into router, save session to cookie jar
102debug("set up logintoBob")
103
104def enableWireless(f):
105 try:
106 wireless_test = urllib2.urlopen("http://%s" % always_on_wireless_computer).getcode()
107 debug("Found %s, not re-enabling wireless (avoids annoying disconnection issue)" % always_on_wireless_computer)
108 except urllib2.URLError:
109 debug("Couldn't find %s, telling the router to enable wireless" % always_on_wireless_computer)
110 logintoBob()
111 debug("logged into bob")
112 opener.open(wenurl) # send wireless enable request using login info from cookiejar
113 debug("Wireless enabled. connection may die for a few seconds")
114 f.write("%s: Enable wireless %s %s/%s\n" % (ts, usage, str(trend), str(suggested)))
115 debug("wrote to /var/www/westnet.html")
116debug("set up enableWireless")
117def disableWireless(f):
118 logintoBob()
119 debug("logged into bob")
120 opener.open(wdisurl) # send wireless disable request using login info from cookiejar
121 debug("wireless disabled")
122 f.write("%s: Disable wireless %s %s/%s\n" % (ts, usage, str(trend), str(suggested)))
123 debug("wrote to /var/www/westnet.html")
124debug("set up disableWireless")
125
126if count > total:
127 shaped = True
128else:
129 shaped = False
130
131debug("shaped: " + str(shaped))
132
133f = open("/var/www/westnet.html", "a") # Append to web-accessible file
134debug("/var/www/westnet.html opened for appending")
135if trend > suggested and not shaped:
136 debug("disabling wireless")
137 disableWireless(f)
138elif shaped or trend <= suggested:
139 debug("enabling wireless")
140 enableWireless(f)
141debug("closing file")
142f.close()
143debug("finished")
144