Go to the documentation of this file.00001
00002 import os, sys
00003 import urllib2, urllib
00004 import base64
00005 import StringIO
00006 import string
00007 import csv
00008
00009 class DDWRT:
00010 def __init__(self, hostname, username, password):
00011 self.hostname = hostname
00012 self.username = username
00013 self.password = password
00014
00015 def fetch(self, url, args=None):
00016 req = urllib2.Request(url)
00017 base64string = base64.encodestring("%s:%s" % (self.username, self.password))[:-1]
00018
00019 req.add_header("Authorization", "Basic %s" % base64string)
00020 if args:
00021 req.data = urllib.urlencode(args)
00022
00023 fp = urllib2.urlopen(req)
00024 body = fp.read()
00025 fp.close()
00026
00027 return body
00028
00029 def connect(self, essid):
00030 url = "http://%s/apply.cgi" % self.hostname
00031
00032 args = {}
00033 args["submit_button"]="Wireless_Basic"
00034 args["action"]="ApplyTake"
00035 args["change_action"]="gozila_cgi"
00036 args["submit_type"]="save"
00037 args["wl0_nctrlsb"]=""
00038 args["wl1_nctrlsb"]=""
00039 args["iface"]=""
00040 args["wl0_mode"]="sta"
00041 args["wl0_net_mode"]="n-only"
00042 args["wl0_ssid"]=essid
00043 args["wl0_distance"]="500"
00044 args["eth1_bridged"]="1"
00045 args["eth1_multicast"]="0"
00046 args["eth1_nat"]="1"
00047 args["eth1_ipaddr"]="4"
00048 args["eth1_ipaddr_0"]="0"
00049 args["eth1_ipaddr_1"]="0"
00050 args["eth1_ipaddr_2"]="0"
00051 args["eth1_ipaddr_3"]="0"
00052 args["eth1_netmask"]="4"
00053 args["eth1_netmask_0"]="0"
00054 args["eth1_netmask_1"]="0"
00055 args["eth1_netmask_2"]="0"
00056 args["eth1_netmask_3"]="0"
00057 args["wl1_mode"]="ap"
00058 args["wl1_net_mode"]="disabled"
00059 args["wl1_ssid"]="dd-wrt"
00060 args["wl1_closed"]="0"
00061 args["wl1_distance"]="2000"
00062 args["eth2_bridged"]="1"
00063 args["eth2_multicast"]="0"
00064 args["eth2_nat"]="1"
00065 args["eth2_ipaddr"]="4"
00066 args["eth2_ipaddr_0"]="0"
00067 args["eth2_ipaddr_1"]="0"
00068 args["eth2_ipaddr_2"]="0"
00069 args["eth2_ipaddr_3"]="0"
00070 args["eth2_netmask"]="4"
00071 args["eth2_netmask_0"]="0"
00072 args["eth2_netmask_1"]="0"
00073 args["eth2_netmask_2"]="0"
00074 args["eth2_netmask_3"]="0"
00075
00076 body = self.fetch(url, args)
00077
00078 def current_ap(self):
00079 url = "http://%s/Status_Wireless.live.asp" % self.hostname
00080 body = self.fetch(url)
00081
00082 line = None
00083 lines = body.split("\n")
00084
00085 d = {}
00086 for line in lines:
00087 line = line[1:-1]
00088 line = line.replace(" ", "")
00089 parts = line.split("::", 1)
00090 if len(parts) == 2:
00091 d[parts[0]] = parts[1]
00092
00093 essid = d.get('wl_ssid', '')
00094 wl_channel = d.get('wl_channel', '').split()[0]
00095 channel = int(wl_channel)
00096 rate = d.get('wl_rate', '')
00097
00098 signal = None
00099 noise = None
00100 snr = None
00101 quality = None
00102
00103 tx_power = d.get('wl_xmit', '')
00104
00105 active_wireless = d.get('active_wireless', None)
00106 if active_wireless:
00107 active_wireless = active_wireless.replace("'", "")
00108 parts = active_wireless.split(",")
00109 macaddr = parts[0]
00110 interface = parts[1]
00111 if len(parts) == 7:
00112 signal = int(parts[4])
00113 noise = int(parts[5])
00114 snr = int(parts[6])
00115 quality = signal * 1.24 + 116
00116 else:
00117 signal = int(parts[5])
00118 noise = int(parts[6])
00119 snr = int(parts[7])
00120 quality = int(parts[8])/10
00121
00122 print essid
00123
00124 def site_survey(self):
00125 url = "http://%s/Site_Survey.asp" % self.hostname
00126
00127 body = self.fetch(url)
00128
00129 lines = body.split("\n")
00130 for i in range(len(lines)):
00131 if lines[i].startswith("var table = "):
00132 break
00133
00134 aplines = []
00135 for j in range(i+1, len(lines)):
00136 if lines[j].startswith(");"): break
00137 line = lines[j].strip()
00138 if not line: continue
00139 if line[0] == ",": line = line[1:]
00140
00141 aplines.append(line)
00142
00143 aps = {}
00144
00145 fp = StringIO.StringIO(string.join(aplines, '\n'))
00146 reader = csv.reader(fp)
00147 for row in reader:
00148 essid = row[0]
00149 macattr = row[2]
00150 channel = int(row[3])
00151 rssi = int(row[4])
00152 noise = int(row[5])
00153 beacon = int(row[6])
00154
00155 aps[essid] = row
00156
00157 for ap, row in aps.items():
00158 print ap, row[8][:20]
00159
00160 import getopt
00161 def main(argv, stdout, environ):
00162 progname = sys.argv[0]
00163 optlist, args = getopt.getopt(argv[1:], "", ["help"])
00164
00165 dd = DDWRT("192.168.1.1", "root", "admin")
00166
00167 if len(args) == 0:
00168 dd.current_ap()
00169 return
00170
00171 cmd = args[0]
00172 if cmd == "connect":
00173 dd.connect(args[1])
00174 elif cmd == "survey":
00175 dd.site_survey()
00176
00177 if __name__ == "__main__":
00178 main(sys.argv, sys.stdout, os.environ)
00179