From d301184184fe48c039a4b11b99570f6cd6029112 Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Tue, 18 Jan 2011 18:44:58 -0800 Subject: ui-macos: Much better connection status reporting. --- ui-macos/MainMenu.xib | 60 ++++++++++++++++++++++---------------------- ui-macos/main.py | 69 +++++++++++++++++++++++++++++++++++---------------- ui-macos/models.py | 36 +++++++++++++++++++-------- 3 files changed, 104 insertions(+), 61 deletions(-) diff --git a/ui-macos/MainMenu.xib b/ui-macos/MainMenu.xib index 1dbb94b..613eb9b 100644 --- a/ui-macos/MainMenu.xib +++ b/ui-macos/MainMenu.xib @@ -12,7 +12,7 @@ YES - + YES @@ -68,7 +68,7 @@ 1 - + 256 YES @@ -683,6 +683,7 @@ {{10, 33}, {607, 327}} + 2 SSH Servers @@ -753,7 +754,7 @@ Log Messages - + 256 YES @@ -897,7 +898,6 @@ {{10, 33}, {607, 327}} - 2 Log Messages @@ -905,13 +905,13 @@ - + 0 YES YES - + @@ -956,10 +956,6 @@ SshuttleController - - YES - autoReconnect - YES @@ -973,7 +969,9 @@ autoNets nets netsHidden - connected + wantConnect + statusMsg + status SshuttleServer YES @@ -1187,22 +1185,6 @@ 503 - - - value: arrangedObjects.connected - - - - - - value: arrangedObjects.connected - value - arrangedObjects.connected - 2 - - - 508 - add: @@ -1380,6 +1362,22 @@ 549 + + + value: arrangedObjects.wantConnect + + + + + + value: arrangedObjects.wantConnect + value + arrangedObjects.wantConnect + 2 + + + 550 + @@ -1945,6 +1943,7 @@ 476.IBPluginDependency 477.IBPluginDependency 486.IBPluginDependency + 504.IBPluginDependency 506.IBPluginDependency 509.IBPluginDependency 510.IBPluginDependency @@ -1969,9 +1968,9 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{498, 573}, {611, 369}} + {{498, 387}, {611, 369}} com.apple.InterfaceBuilder.CocoaPlugin - {{498, 573}, {611, 369}} + {{498, 387}, {611, 369}} @@ -2107,6 +2106,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin ToolTip @@ -2146,7 +2146,7 @@ - 549 + 550 diff --git a/ui-macos/main.py b/ui-macos/main.py index 69e32df..4719826 100644 --- a/ui-macos/main.py +++ b/ui-macos/main.py @@ -2,12 +2,8 @@ import sys, os, pty from AppKit import * import my, models -NET_ALL=0 -NET_AUTO=1 -NET_MANUAL=2 - def sshuttle_args(host, auto_nets, auto_hosts, nets): - argv = [my.bundle_path('sshuttle/sshuttle', ''), '-v', '-r', host] + argv = [my.bundle_path('sshuttle/sshuttle', ''), '-r', host] assert(argv[0]) if auto_nets: argv.append('--auto-nets') @@ -33,7 +29,7 @@ class Callback: class Runner: - def __init__(self, argv, logfunc, promptfunc): + def __init__(self, argv, logfunc, promptfunc, serverobj): print 'in __init__' self.id = argv self.rv = None @@ -41,8 +37,10 @@ class Runner: self.fd = None self.logfunc = logfunc self.promptfunc = promptfunc + self.serverobj = serverobj self.buf = '' print 'will run: %r' % argv + self.serverobj.setConnected_(False) pid,fd = pty.fork() if pid == 0: # child @@ -74,6 +72,8 @@ class Runner: self.rv = os.WEXITSTATUS(code) else: self.rv = -os.WSTOPSIG(code) + self.serverobj.setConnected_(False) + self.serverobj.setError_('VPN process died') print 'wait_result: %r' % self.rv return self.rv @@ -88,6 +88,7 @@ class Runner: print 'killing: pid=%r rv=%r' % (self.pid, self.rv) if self.rv == None: os.kill(self.pid, 15) + self.serverobj.setConnected_(False) def gotdata(self, notification): print 'gotdata!' @@ -105,7 +106,7 @@ class Runner: self.file.writeData_(my.Data(resp + '\n')) self.file.waitForDataInBackgroundAndNotify() self.poll() - print 'gotdata done!' + #print 'gotdata done!' class SshuttleApp(NSObject): @@ -136,20 +137,21 @@ class SshuttleController(NSObject): .initWithString_(msg)) def promptfunc(prompt): print 'prompt! %r' % prompt - return 'scs' + return 'scss' nets_mode = server.autoNets() - if nets_mode == NET_MANUAL: + if nets_mode == models.NET_MANUAL: manual_nets = ["%s/%d" % (i.subnet(), i.width()) for i in server.nets()] - elif nets_mode == NET_ALL: + elif nets_mode == models.NET_ALL: manual_nets = ['0/0'] else: manual_nets = [] conn = Runner(sshuttle_args(host, - auto_nets = nets_mode == NET_AUTO, + auto_nets = nets_mode == models.NET_AUTO, auto_hosts = server.autoHosts(), nets = manual_nets), - logfunc=logfunc, promptfunc=promptfunc) + logfunc=logfunc, promptfunc=promptfunc, + serverobj=server) self.conns[host] = conn def _disconnect(self, server): @@ -163,12 +165,12 @@ class SshuttleController(NSObject): @objc.IBAction def cmd_connect(self, sender): server = sender.representedObject() - server.setConnected_(True) + server.setWantConnect_(True) @objc.IBAction def cmd_disconnect(self, sender): server = sender.representedObject() - server.setConnected_(False) + server.setWantConnect_(False) @objc.IBAction def cmd_show(self, sender): @@ -189,32 +191,57 @@ class SshuttleController(NSObject): it.setRepresentedObject_(obj) it.setTarget_(self) it.setAction_(func) + def addnote(name): + additem(name, None, None) - any_conn = False - err = None + any_inprogress = None + any_conn = None + any_err = None if len(self.servers): for i in self.servers: host = i.host() + want = i.wantConnect() + connected = i.connected() if not host: additem('Connect Untitled', None, i) - elif i.connected(): + elif want: any_conn = i additem('Disconnect %s' % host, self.cmd_disconnect, i) else: additem('Connect %s' % host, self.cmd_connect, i) + if not want: + msg = 'Off' + elif i.error(): + msg = 'ERROR - try reconnecting' + any_err = i + elif connected: + msg = 'Connected' + else: + msg = 'Connecting...' + any_inprogress = i + addnote(' State: %s' % msg) + if i.autoNets() == 0: + addnote(' Routes: All') + elif i.autoNets() == 2: + addnote(' Routes: Auto') + else: + addnote(' Routes: Custom') else: - additem('No servers defined yet', None, None) + addnote('No servers defined yet') menu.addItem_(NSMenuItem.separatorItem()) additem('Preferences...', self.cmd_show, None) additem('Quit Sshuttle VPN', self.cmd_quit, None) - if err: + if any_err: self.statusitem.setImage_(self.img_err) self.statusitem.setTitle_('Error!') elif any_conn: self.statusitem.setImage_(self.img_running) - self.statusitem.setTitle_('') + if any_inprogress: + self.statusitem.setTitle_('Connecting...') + else: + self.statusitem.setTitle_('') else: self.statusitem.setImage_(self.img_idle) self.statusitem.setTitle_('') @@ -296,7 +323,7 @@ class SshuttleController(NSObject): models.configchange_callback = my.DelayedCallback(self.save_servers) def sc(server): - if server.connected(): + if server.wantConnect(): self._connect(server) else: self._disconnect(server) diff --git a/ui-macos/models.py b/ui-macos/models.py index 4e47719..b5554d3 100644 --- a/ui-macos/models.py +++ b/ui-macos/models.py @@ -41,7 +41,7 @@ class SshuttleNet(NSObject): config_changed() @objc.accessor def validateSubnet_error_(self, value, error): - print 'validateSubnet!' + #print 'validateSubnet!' return True, _validate_ip(value), error def width(self): @@ -51,9 +51,12 @@ class SshuttleNet(NSObject): config_changed() @objc.accessor def validateWidth_error_(self, value, error): - print 'validateWidth!' + #print 'validateWidth!' return True, _validate_width(value), error +NET_ALL = 0 +NET_AUTO = 1 +NET_MANUAL = 2 class SshuttleServer(NSObject): def init(self): @@ -61,12 +64,27 @@ class SshuttleServer(NSObject): config_changed() return self + def wantConnect(self): + return getattr(self, '_k_wantconnect', False) + def setWantConnect_(self, v): + self._k_wantconnect = v + self.setError_(None) + config_changed() + if setconnect_callback: setconnect_callback(self) + def connected(self): return getattr(self, '_k_connected', False) def setConnected_(self, v): + print 'setConnected of %r to %r' % (self, v) self._k_connected = v + if v: self.setError_(None) # connected ok, so no error + config_changed() + + def error(self): + return getattr(self, '_k_error', None) + def setError_(self, v): + self._k_error = v config_changed() - if setconnect_callback: setconnect_callback(self) def host(self): return getattr(self, '_k_host', None) @@ -75,7 +93,7 @@ class SshuttleServer(NSObject): config_changed() @objc.accessor def validateHost_error_(self, value, error): - print 'validatehost! %r %r %r' % (self, value, error) + #print 'validatehost! %r %r %r' % (self, value, error) while value.startswith('-'): value = value[1:] return True, value, error @@ -86,15 +104,14 @@ class SshuttleServer(NSObject): self._k_nets = v config_changed() def netsHidden(self): - print 'checking netsHidden' - return self.autoNets() != 2 + #print 'checking netsHidden' + return self.autoNets() != NET_MANUAL def setNetsHidden_(self, v): config_changed() - print 'setting netsHidden to %r' % v - pass + #print 'setting netsHidden to %r' % v def autoNets(self): - return getattr(self, '_k_autoNets', 1) + return getattr(self, '_k_autoNets', NET_AUTO) def setAutoNets_(self, v): self._k_autoNets = v self.setNetsHidden_(-1) @@ -105,4 +122,3 @@ class SshuttleServer(NSObject): def setAutoHosts_(self, v): self._k_autoHosts = v config_changed() - -- cgit v1.2.3