Compare with Previous | Blame | Download | View Log
#!/usr/bin/pythonimport sysimport ostimeout = 30#support running uninstalled_dirname = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))if os.path.exists(os.path.join(_dirname,"ChangeLog")):sys.path.insert(0, _dirname)timeout = 9999import dbusimport dbus.servicefrom dbus.mainloop.glib import DBusGMainLoopimport blueman.Functionsimport __builtin__import gobjectimport syslogimport subprocessimport refrom signal import SIGKILLloop = gobject.MainLoop()from blueman.main.NetConf import *from blueman.Lib import set_probe_debugfrom blueman.Constants import POLKITclass Tee(object):def __init__(self):self.stdout = sys.stdoutself.stderr = sys.stderrsys.stdout = selfsys.stderr = selfself.buffer = ""def __del__(self):sys.stdout = self.stdoutsys.stderr = self.stderrdef write(self, data):self.buffer+=dataif self.buffer.endswith("\n"):self.stdout.write(self.buffer)if self.buffer != "\n":syslog.syslog(self.buffer)self.buffer = ""syslog.openlog("blueman-mechanism", 0, syslog.LOG_DAEMON)a = Tee()def prnt(*args):s = ""for a in args:s += (str(a) + " ")print s__builtin__.dprint = prntdprint("Starting blueman-mechanism")DBusGMainLoop(set_as_default=True)if "--debug" in sys.argv:dprint("Enabled verbose output")set_probe_debug(True)os.environ["PATH"] = "/usr/bin:/bin:/usr/sbin:/sbin"dhcp_pids = []class Timer:def __init__(self):self.time = 0self.stopped = Falsegobject.timeout_add(1000, self.tick)def tick(self):if not self.stopped:self.time+=1if self.time == timeout:dprint("Exiting")loop.quit()return Truedef reset(self):self.time = 0def stop(self):self.stopped = Truedef resume(self):self.stopped = Falseself.reset()timer = Timer()class conf_service(dbus.service.Object):def __init__(self):self.bus = dbus.SystemBus();self.bus.request_name("org.blueman.Mechanism")dbus.service.Object.__init__(self, self.bus, "/")if POLKIT:try:o = self.bus.get_object("org.freedesktop.PolicyKit1", "/org/freedesktop/PolicyKit1/Authority", True)self.pk = dbus.proxies.Interface(o, "org.freedesktop.PolicyKit1.Authority")except:self.pk = Noneelse:self.pk = Nonedef confirm_authorization(self, busname, action_id):timer.reset()if not POLKIT:returnelse:if not self.pk:raise dbus.DBusException("Blueman was built with PolicyKit-1 support, but it's not available on the system")res = self.pk.CheckAuthorization(("system-bus-name", {"name": busname}),action_id, dbus.Dictionary({}, dbus.Signature("ss")), 0x1, "")dprint(res)(is_authorized, is_challenge, details) = resif not is_authorized:raise dbus.DBusException, "Not authorized"@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="b", out_signature="", sender_keyword="caller")def SetGN(self, enabled, caller):timer.reset()if enabled:p = subprocess.Popen(["/usr/sbin/avahi-autoipd", "-D", "pan0"], env=os.environ, bufsize=128)else:p = subprocess.Popen(["/usr/sbin/avahi-autoipd", "-k", "pan0"], bufsize=128)#reap the childgobject.child_watch_add(p.pid, lambda pid, cond: 0)@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="b", out_signature="")def SetRfkillState(self, state):from blueman.main.KillSwitchNG import KillSwitchNGk = KillSwitchNG()k.SetGlobalState(state)@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="sbs", out_signature="", sender_keyword="caller")def NetworkSetup(self, ip_address, allow_nat, server_type, caller):timer.reset()dprint(ip_address, allow_nat, server_type)if ip_address == "reload":info = netstatus()nc = Noneif info["ip"] != "0" and not nc_is_running():if info["type"] == "dnsmasq":nc = NetConfDnsMasq(None)elif info["type"] == "dhcpd":nc = NetConfDhcpd(None)if nc:nc.reload_settings()returnself.confirm_authorization(caller, "org.blueman.network.setup")if ip_address == "0":info = netstatus()nc = Nonetry:if info["type"] == "dnsmasq":nc = NetConfDnsMasq(None)elif info["type"] == "dhcpd":nc = NetConfDhcpd(None)except:#fallbacknc = NetConf(None)nc.uninstall()else:if ip_chk(ip_address):nc = Noneif server_type == "dnsmasq":nc = NetConfDnsMasq(ip_address, allow_nat)elif server_type == "dhcpd":nc = NetConfDhcpd(ip_address, allow_nat)if nc:nc.install()else:return dbus.DBusException("IP Invalid")def ppp_connected(self, ppp, port, ok, err):ok(port)timer.resume()def ppp_error(self, ppp, message, ok, err):err(dbus.DBusException(message))timer.resume()@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="sss", out_signature="s", sender_keyword="caller", async_callbacks=("ok", "err"))def PPPConnect(self, port, number, apn, caller, ok, err):timer.stop()from blueman.main.PPPConnection import PPPConnection#self.confirm_authorization(caller, "org.blueman.network.setup")ppp = PPPConnection(port, number, apn)ppp.connect("error-occurred", self.ppp_error, ok, err)ppp.connect("connected", self.ppp_connected, ok, err)ppp.Connect()@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="s", out_signature="s", sender_keyword="caller", async_callbacks=("ok", "err"))def DhcpClient(self, net_interface, caller, ok, err):timer.stop()self.confirm_authorization(caller, "org.blueman.dhcp.client")from blueman.main.DhcpClient import DhcpClientdef dh_error(dh, message, ok, err):err(message)timer.resume()def dh_connected(dh, ip, ok, err):ok(ip)timer.resume()dh = DhcpClient(net_interface)dh.connect("error-occurred", dh_error, ok, err)dh.connect("connected", dh_connected, ok, err)try:dh.Connect()except Exception, e:err(e)@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="ss", out_signature="", async_callbacks=("ok", "err"))def HalRegisterModemPort(self, rfcomm_device, bd_addr, ok, err):from blueman.main.HalManager import HalManagertimer.reset()halmgr = HalManager()dprint("** Registering modem")halmgr.register(rfcomm_device, bd_addr, ok, err)@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="s", out_signature="")def HalUnregisterModemPortAddr(self, address):from blueman.main.HalManager import HalManagertimer.reset()halmgr = HalManager()dprint("** Unregistering modem")halmgr.unregister_addr(address)@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="s", out_signature="")def HalUnregisterModemPortDev(self, rfcomm_device):from blueman.main.HalManager import HalManagertimer.reset()halmgr = HalManager()dprint("** Unregistering modem")halmgr.unregister_dev(rfcomm_device)@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="", out_signature="")def HalRegisterNetDev(self, devicename):from blueman.main.HalManager import HalManagertimer.reset()halmgr = HalManager()halmgr.register_netdev(devicename)@dbus.service.method(dbus_interface='org.blueman.Mechanism', in_signature="", out_signature="")def DevRfkillChmod(self):try:os.chmod("/dev/rfkill", 0655)except:passconf_service()loop.run()