]> git.neil.brown.name Git - plato.git/commitdiff
netman: support configuring wifi networks.
authorNeilBrown <neilb@suse.de>
Thu, 24 Jan 2013 23:22:29 +0000 (10:22 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 24 Jan 2013 23:22:29 +0000 (10:22 +1100)
We can now add or forget wifi networks, and set the password.

Signed-off-by: NeilBrown <neilb@suse.de>
netman/netman.py

index 1c53fd6592901a5a4e0181810f9a2787659fad02..1b37aa13b697bcccc05298798aa9f5b9c3ba3581 100644 (file)
 #     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')