Last active 1450408174

ISP usage checker / router disabler

Revision f134deca1ccd69c35cb8de624deaf12c9b97f307

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