From: NeilBrown Date: Thu, 24 Jan 2013 23:22:29 +0000 (+1100) Subject: netman: support configuring wifi networks. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=bdfa7459bf53d959ff74dee01791ead6d778be90;p=plato.git netman: support configuring wifi networks. We can now add or forget wifi networks, and set the password. Signed-off-by: NeilBrown --- diff --git a/netman/netman.py b/netman/netman.py index 1c53fd6..1b37aa1 100644 --- a/netman/netman.py +++ b/netman/netman.py @@ -26,6 +26,13 @@ # make sure to save config # kill supplicant when done? #DONE - ensure label is refreshed on different connect and disconnect stages. +# +# Adding a network involves: +# add_network - returns $N +# set_network $N ssid "Netid" +# set_network $N key_mgmt WPA-PSK +# set_network $N psk "Password" +# enable_network $N # Manage networks for the openmoko phoenux # There are 4 devices (unless I add VPN support) @@ -357,6 +364,8 @@ class WLAN_iface(iface): self.take_list(r) elif self.pending == 'SCAN_RESULTS': self.take_scan(r) + elif self.pending == 'ADD_NETWORK': + self.got_network(r) self.pending = None if len(self.to_send) > 0: @@ -387,8 +396,9 @@ class WLAN_iface(iface): if p > 0: id = mesg[p+3:].split()[0] for ssid in self.netlist: - if id == self.netlist[ssid]: + if id == self.netlist[ssid][0]: self.ssid = ssid + self.request('LIST_NETWORKS') self.set_label() self.checker = gobject.timeout_add(30000, self.reassoc) return self.restart_dhcp() @@ -398,6 +408,7 @@ class WLAN_iface(iface): self.udhcpc_close() self.set_label() self.parent.update_active() + self.request('LIST_NETWORKS') return if mesg[:23] == 'CTRL-EVENT-SCAN-RESULTS': self.request('SCAN_RESULTS') @@ -422,8 +433,8 @@ class WLAN_iface(iface): for line in mesg.split('\n'): if line != '' and line[0:7] != 'network': l = line.split('\t') - self.netlist[l[1]] = l[0] - print 'netlist', self.netlist + # number name 'any' '[CURRENT]'-or-'[DISABLED]' + self.netlist[l[1]] = (int(l[0]),l[3]) self.fill_list() def take_scan(self, mesg): @@ -463,10 +474,17 @@ class WLAN_iface(iface): bb.set_homogeneous(True) bb.set_size_request(-1, 80) + ls.connect('selected', self.select) + entry.modify_font(self.parent.fd) - self.add_button(bb, 'Allow', self.allow) - self.add_button(bb, 'Forget', self.forget) - self.add_button(bb, 'Set Key', self.set_key) + self.enable_btn = self.add_button(bb, 'Enable', self.enable) + self.disable_btn = self.add_button(bb, 'Disable', self.disable) + self.set_key_btn = self.add_button(bb, 'Set Key', self.set_key) + self.forget_btn = self.add_button(bb, 'Forget', self.forget) + self.enable_btn.hide() + self.disable_btn.hide() + self.set_key_btn.hide() + self.forget_btn.hide() self.add_button(bb, 'Done', self.done) self.cfg = cfg @@ -480,15 +498,101 @@ class WLAN_iface(iface): btn.show() bb.pack_start(btn, expand = True) btn.connect('clicked', cmd) + return btn + + def selected_net(self): + net = self.net_ls.selected_str + if net == None: + return (None, None, None) + net = net[1:] + l=None + s=None + if net in self.netlist: + l = self.netlist[net] + if net in self.scanlist: + s = self.scanlist[net] + return (net, l,s) + + def select(self, s, n): + net = self.selected_net() + if net[1]: + (num,st) = net[1] + if st == '[DISABLED]': + self.enable_btn.show() + self.disable_btn.hide() + self.set_key_btn.hide() + self.forget_btn.show() + else: + self.enable_btn.hide() + self.disable_btn.show() + self.set_key_btn.show() + self.forget_btn.hide() + else: + # don't know this one + self.enable_btn.show() + self.disable_btn.hide() + self.set_key_btn.show() + self.forget_btn.hide() + + def create_network(self, ssid, sec, key): + if sec == '[ESS]': + self.settings = [('ssid "%s"' % ssid), + 'key_mgmt NONE', + ] + else: + self.settings = [('ssid "%s"' % ssid), + 'key_mgmt WPA-PSK', + ('psk "%s"' % key), + ] + self.request('ADD_NETWORK') + def got_network(self, r): + n = int(r) + for l in self.settings: + self.request('SET_NETWORK %d %s' % (n, l)) + self.request('ENABLE_NETWORK %d' % n) + self.request('SAVE_CONFIG') + self.request('LIST_NETWORKS') + self.request('REASSOCIATE') + + def enable(self, x): + net = self.selected_net() + if net[1]: + num = net[1][0] + self.request('ENABLE_NETWORK %d'% num) + self.request('SAVE_CONFIG') + self.request('LIST_NETWORKS') + return + if net[2]: + self.create_network(net[0],net[2][1],"xxxxxxxx") + + def disable(self, x): + net = self.selected_net() + if net[1]: + num = net[1][0] + self.request('DISABLE_NETWORK %d'% num) + self.request('SAVE_CONFIG') + self.request('LIST_NETWORKS') - def allow(self, x): - self.net_ls.reconfig(self.net_ls,1) - print 'alloc is', self.net_ls.get_allocation() - pass - def forget(self, x): - pass def set_key(self, x): - pass + net = self.selected_net() + if net[1]: + self.request('SET_NETWORK %d psk "%s"' % + (net[1][0], self.key_entry.get_text())) + self.key_entry.set_text('') + self.request('SAVE_CONFIG') + self.request('REASSOCIATE') + elif net[2]: + self.create_network(net[0],net[2][1],self.key_entry.get_text()) + self.key_entry.set_text('') + + def forget(self, x): + net = self.selected_net() + if net[1]: + num = net[1][0] + self.request('REMOVE_NETWORK %d'% num) + self.request('SAVE_CONFIG') + self.request('LIST_NETWORKS') + def done(self, x): self.configing = False self.parent.deconfig() @@ -496,7 +600,7 @@ class WLAN_iface(iface): def fill_list(self): if not self.configing: return - l = [('none','green')] + l = [] for i in self.scanlist: strength =self.scanlist[i][0] sec = self.scanlist[i][1] @@ -510,15 +614,22 @@ class WLAN_iface(iface): else: t='?' if i in self.netlist: - l.append((t+i, 'blue')) + if self.netlist[i][1] == '[DISABLED]': + t='-' + if self.netlist[i][1] == '[CURRENT]': + l.append((t+i, 'magenta')) + else: + l.append((t+i, 'blue')) else: l.append((t+i, 'black')) for i in self.netlist: if i not in self.scanlist: - l.append((i, 'red')) - print 'filled list', l + l.append(('-'+i, 'red')) + if not l: + l = [('none','green')] self.net_ls.list = l self.net_ls.list_changed() + self.select(self.net_ls, self.net_ls.selected) def config_hotspot(self): self.rfkill('unblock')