#!/usr/bin/python import os import sys import dbus, dbus.mainloop.glib import gobject import glib mainloop = dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) sb = dbus.SystemBus() loop = gobject.MainLoop() try: nm = sb.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager') nmi = dbus.Interface(nm, 'org.freedesktop.NetworkManager') dpi = dbus.Interface(nm, 'org.freedesktop.DBus.Properties') state = dpi.Get('org.freedesktop.NetworkManager', 'state') except dbus.exceptions.DBusException, e: nm = sb.get_object('net.connman', '/') nmi = dbus.Interface(nm, 'net.connman.Manager') state = nmi.GetState() child = 0 timer = 0 args = ['ssh'] args.extend(sys.argv[1:]) def launch_child(): global child, args, timer [child, n, n, n] = glib.spawn_async(args, flags = glib.SPAWN_CHILD_INHERITS_STDIN | glib.SPAWN_SEARCH_PATH | glib.SPAWN_DO_NOT_REAP_CHILD) glib.child_watch_add(child, child_handler) timer = 0 return False def child_handler(pid, condition): global timer, child if child > 0: print "\033[2J\033[1;1H\033[0mChild died, spawning in 5...\r" timer = glib.timeout_add_seconds(5, launch_child) child = 0 def handler(state): global child, timer if state == 3 or state == 70 or state == 'online': if child == 0: print "\033[2J\033[1;1H\033[0mConnected, launching child...\r" timer = glib.timeout_add(500, launch_child) else: print "\033[2J\033[1;1H\033[0mWaiting for connection...\r" if child > 0: try: os.kill(child, 15) except OSError: pass child = 0 if timer > 0: glib.source_remove(timer) handler(state) nmi.connect_to_signal('StateChanged', handler) loop.run()