summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvery Pennarun <apenwarr@gmail.com>2011-01-18 18:44:58 -0800
committerAvery Pennarun <apenwarr@gmail.com>2011-01-22 16:43:44 -0800
commitd301184184fe48c039a4b11b99570f6cd6029112 (patch)
tree2f20ae1c2d7400075fbdcf0220813db5d59555f7
parent659a57beb2fa7140cbb60e0dc5a309286c995b78 (diff)
ui-macos: Much better connection status reporting.
-rw-r--r--ui-macos/MainMenu.xib60
-rw-r--r--ui-macos/main.py69
-rw-r--r--ui-macos/models.py36
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 @@
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="302"/>
+ <integer value="227"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -68,7 +68,7 @@
<object class="NSTabViewItem" id="762265164">
<string key="NSIdentifier">1</string>
<object class="NSView" key="NSView" id="60314308">
- <nil key="NSNextResponder"/>
+ <reference key="NSNextResponder" ref="389252804"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -683,6 +683,7 @@
</object>
</object>
<string key="NSFrame">{{10, 33}, {607, 327}}</string>
+ <reference key="NSSuperview" ref="389252804"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
</object>
<string key="NSLabel">SSH Servers</string>
@@ -753,7 +754,7 @@
<object class="NSTabViewItem" id="975859087">
<string key="NSIdentifier">Log Messages</string>
<object class="NSView" key="NSView" id="311013698">
- <reference key="NSNextResponder" ref="389252804"/>
+ <nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -897,7 +898,6 @@
</object>
</object>
<string key="NSFrame">{{10, 33}, {607, 327}}</string>
- <reference key="NSSuperview" ref="389252804"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
</object>
<string key="NSLabel">Log Messages</string>
@@ -905,13 +905,13 @@
<reference key="NSTabView" ref="389252804"/>
</object>
</object>
- <reference key="NSSelectedTabViewItem" ref="975859087"/>
+ <reference key="NSSelectedTabViewItem" ref="762265164"/>
<reference key="NSFont" ref="696441443"/>
<int key="NSTvFlags">0</int>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="311013698"/>
+ <reference ref="60314308"/>
</object>
</object>
</object>
@@ -956,10 +956,6 @@
<string key="NSClassName">SshuttleController</string>
</object>
<object class="NSUserDefaultsController" id="582889489">
- <object class="NSMutableArray" key="NSDeclaredKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>autoReconnect</string>
- </object>
<bool key="NSSharedInstance">YES</bool>
</object>
<object class="NSCustomObject" id="735871403">
@@ -973,7 +969,9 @@
<string>autoNets</string>
<string>nets</string>
<string>netsHidden</string>
- <string>connected</string>
+ <string>wantConnect</string>
+ <string>statusMsg</string>
+ <string>status</string>
</object>
<string key="NSObjectClassName">SshuttleServer</string>
<bool key="NSEditable">YES</bool>
@@ -1188,22 +1186,6 @@
<int key="connectionID">503</int>
</object>
<object class="IBConnectionRecord">
- <object class="IBBindingConnection" key="connection">
- <string key="label">value: arrangedObjects.connected</string>
- <reference key="source" ref="401421410"/>
- <reference key="destination" ref="59237012"/>
- <object class="NSNibBindingConnector" key="connector">
- <reference key="NSSource" ref="401421410"/>
- <reference key="NSDestination" ref="59237012"/>
- <string key="NSLabel">value: arrangedObjects.connected</string>
- <string key="NSBinding">value</string>
- <string key="NSKeyPath">arrangedObjects.connected</string>
- <int key="NSNibBindingConnectorVersion">2</int>
- </object>
- </object>
- <int key="connectionID">508</int>
- </object>
- <object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">add:</string>
<reference key="source" ref="958467473"/>
@@ -1380,6 +1362,22 @@
</object>
<int key="connectionID">549</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: arrangedObjects.wantConnect</string>
+ <reference key="source" ref="401421410"/>
+ <reference key="destination" ref="59237012"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="401421410"/>
+ <reference key="NSDestination" ref="59237012"/>
+ <string key="NSLabel">value: arrangedObjects.wantConnect</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">arrangedObjects.wantConnect</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">550</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -1945,6 +1943,7 @@
<string>476.IBPluginDependency</string>
<string>477.IBPluginDependency</string>
<string>486.IBPluginDependency</string>
+ <string>504.IBPluginDependency</string>
<string>506.IBPluginDependency</string>
<string>509.IBPluginDependency</string>
<string>510.IBPluginDependency</string>
@@ -1969,9 +1968,9 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<boolean value="YES"/>
- <string>{{498, 573}, {611, 369}}</string>
+ <string>{{498, 387}, {611, 369}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>{{498, 573}, {611, 369}}</string>
+ <string>{{498, 387}, {611, 369}}</string>
<boolean value="YES"/>
<boolean value="NO"/>
<boolean value="YES"/>
@@ -2107,6 +2106,7 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSMutableDictionary">
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
@@ -2146,7 +2146,7 @@
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">549</int>
+ <int key="maxID">550</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
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()
-