linuxOS_AP05/debian/test/usr/lib/blueman/blueman-mechanism
2025-09-26 09:40:02 +08:00

170 lines
4.3 KiB
Python
Executable File

#! /usr/bin/python3
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from __future__ import unicode_literals
import sys
import os
timeout = 30
#support running uninstalled
_dirname = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if os.path.exists(os.path.join(_dirname, "CHANGELOG.md")):
sys.path.insert(0, _dirname)
timeout = 9999
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
try: import __builtin__ as builtins
except ImportError: import builtins
from gi.repository import GObject
import syslog
loop = GObject.MainLoop()
from _blueman import set_probe_debug
from blueman.Constants import POLKIT
from blueman.Functions import set_proc_title
import blueman.plugins.mechanism
from blueman.plugins.MechanismPlugin import MechanismPlugin
from blueman.main.DbusService import DbusService
class Tee(object):
def __init__(self):
self.stdout = sys.stdout
self.stderr = sys.stderr
sys.stdout = self
sys.stderr = self
self.buffer = ""
def __del__(self):
if self:
sys.stdout = self.stdout
sys.stderr = self.stderr
def write(self, data):
self.buffer += data
if self.buffer.endswith("\n"):
self.stdout.write(self.buffer)
if self.buffer != "\n":
syslog.syslog(self.buffer)
self.buffer = ""
def flush(self):
pass
# Python 2, call str() to convert to a byte string.
syslog.openlog(str("blueman-mechanism"), 0, syslog.LOG_DAEMON)
a = Tee()
def prnt(*args):
s = ""
for a in args:
s += (str(a) + " ")
print(s)
builtins.dprint = prnt
dprint("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 = 0
self.stopped = False
GObject.timeout_add(1000, self.tick)
def tick(self):
if not self.stopped:
self.time += 1
if self.time == timeout:
dprint("Exiting")
loop.quit()
return True
def reset(self):
self.time = 0
def stop(self):
self.stopped = True
def resume(self):
self.stopped = False
self.reset()
class conf_service(DbusService):
def __init__(self):
DbusService.__init__(self, "org.blueman.Mechanism", "/", dbus.SystemBus)
self.timer = Timer()
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 = None
else:
self.pk = None
path = os.path.dirname(blueman.plugins.mechanism.__file__)
plugins = []
for root, dirs, files in os.walk(path):
for f in files:
if f.endswith(".py") and not (f.endswith(".pyc") or f.endswith("_.py")):
plugins.append(f[0:-3])
for plugin in plugins:
try:
__import__("blueman.plugins.mechanism.%s" % plugin, None, None, [])
except ImportError as e:
dprint("Skipping plugin %s\n%s" % (plugin, e))
classes = MechanismPlugin.__subclasses__()
for cls in classes:
dprint("loading", cls.__name__)
cls(self)
def confirm_authorization(self, busname, action_id):
self.timer.reset()
if not POLKIT:
return
else:
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) = res
if not is_authorized:
raise dbus.DBusException("Not authorized")
set_proc_title()
conf_service()
loop.run()