Last active 1450408174

ISP usage checker / router disabler

Revision ade6f164d344deaf70312717a17da8677d6a1745

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
7# your daily usage. -blha303
8# BSD license.
9username = "USERNAME"
10password = "PASSWORD"
11routerpass = "routerpass"
12
13import urllib2
14from BeautifulSoup import BeautifulSoup
15import urllib
16import cookielib
17import time
18
19def getnumbers(inp): # For parsing "100,000MB" to an integer
20 return int(inp[:-2].replace(",", ""))
21
22url = "https://myaccount2.westnet.com.au/" # login page url
23# what the server sees as the client ID
24desc = "westnet usage alert script by blha303. https://gist.github.com/blha303/5788199 for source"
25
26logindata = urllib.urlencode({"hdnLoginType": "myaccount", # login POST data
27 "action": "login",
28 "username": username,
29 "password": password})
30
31cj = cookielib.CookieJar() # Cookie jar, used to store login session
32opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
33opener.addheaders = [('User-Agent', desc)] # set client ID to desc
34
35login = opener.open(url, logindata) # log in, save session data to cookie jar
36
37page = opener.open(url) # reopen same url (westnet has both login and homepage on the same url)
38soup = BeautifulSoup(page.read()) # make soup from page
39usage = soup.findAll('div',{'class':'usage_text'})[0].text # get usage string "XXX,XXXMB out of XXX,XXXMB"
40count = getnumbers(usage.split(" ")[0]) # get count integer, first part of usage string above as integer
41total = getnumbers(usage.split(" ")[-1]) # get total integer, last part of usage string above as integer
42suggested = getnumbers(soup.findAll('a',{'href':'#suggested_anytime_tooltip'})[0].text) # get suggested integer
43trend = getnumbers(soup.findAll('a',{'href':'#trend_anytime_tooltip'})[0].text) # get trend integer
44#print "usage: " + usage
45#print "count: " + str(count)
46#print "total: " + str(total)
47#print "suggested: " + str(suggested)
48#print "trend: " + str(trend)
49
50boblogin = "http://10.1.1.1/login.cgi" # router login url
51# router login info as POST data
52bobdata = urllib.urlencode({"login_option": "0", "password": routerpass, "passwordtemp": ""})
53wdisurl = "http://10.1.1.1/wireless_id.wl?wlSsidIdx=0&wlEnbl=0" # router disable wireless url as GET data
54wenurl = "http://10.1.1.1/wireless_id.wl?wlEnbl=1&wlSsidIdx=0" # router enable wireless url as GET data
55
56ts = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()) # timestamp for status webpage
57
58def logintoBob():
59 opener.open(boblogin, bobdata) # log into router, save session to cookie jar
60
61def enableWireless(f):
62 logintoBob()
63 opener.open(wenurl) # send wireless enable request using login info from cookiejar
64 f.write("%s: Enable wireless<br>" % ts)
65
66def disableWireless(f):
67 logintoBob()
68 opener.open(wdisurl) # send wireless disable request using login info from cookiejar
69 f.write("%s: Disable wireless<br>" % ts)
70
71if count > total:
72 shaped = True
73else:
74 shaped = False
75
76#print "shaped: " + str(shaped)
77
78f = open("/var/www/westnet.html", "a") # Append to web-accessible file
79if trend > suggested and not shaped:
80 disableWireless(f)
81elif shaped or trend <= suggested:
82 enableWireless(f)
83f.close()
84