ui-macos: Much better connection status reporting.

This commit is contained in:
Avery Pennarun 2011-01-18 18:44:58 -08:00
parent 659a57beb2
commit d301184184
3 changed files with 104 additions and 61 deletions

View File

@ -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>
@ -1187,22 +1185,6 @@
</object>
<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>
@ -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">

View File

@ -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)

View File

@ -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()