Last active 1450408174

ISP usage checker / router disabler

Revision 96bf7a28c30b02202a6602b4b741b198a2872419

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