Esempio n. 1
0
    def dhcp_acquire(self, device: str) -> None:
        if device not in self.quering:
            self.quering.append(device)
        else:
            return

        if device != "":
            def reply(_obj: Mechanism, result: str, _user_data: None) -> None:
                logging.info(result)
                Notification(_("Bluetooth Network"),
                             _("Interface %(0)s bound to IP address %(1)s") % {"0": device, "1": result},
                             icon_name="network-workgroup").show()

                self.quering.remove(device)

            def err(_obj: Mechanism, result: GLib.Error, _user_data: None) -> None:
                logging.warning(result)
                Notification(_("Bluetooth Network"), _("Failed to obtain an IP address on %s") % device,
                             icon_name="network-workgroup").show()

                self.quering.remove(device)

            Notification(_("Bluetooth Network"), _("Trying to obtain an IP address on %s\nPlease wait…" % device),
                         icon_name="network-workgroup").show()

            m = Mechanism()
            m.DhcpClient('(s)', device, result_handler=reply, error_handler=err, timeout=120 * 1000)
Esempio n. 2
0
    def on_apply(self):

        if self.on_query_apply_state():
            logging.info("network apply")

            m = Mechanism()
            nap_enable = self.Builder.get_object("nap-enable")
            if nap_enable.props.active:

                if self.Builder.get_object("r_dhcpd").props.active:
                    stype = "DhcpdHandler"
                elif self.Builder.get_object("r_dnsmasq").props.active:
                    stype = "DnsMasqHandler"
                elif self.Builder.get_object("r_udhcpd").props.active:
                    stype = "UdhcpdHandler"

                net_ip = self.Builder.get_object("net_ip")

                try:
                    m.EnableNetwork('(ayays)', inet_aton(net_ip.props.text), inet_aton("255.255.255.0"), stype)

                    if not self.Config["nap-enable"]:
                        self.Config["nap-enable"] = True
                except Exception as e:
                    d = ErrorDialog("<b>Failed to apply network settings</b>",
                                    excp=e, parent=self.widget.get_toplevel())

                    d.run()
                    d.destroy()
                    return
            else:
                self.Config["nap-enable"] = False
                m.DisableNetwork()

            self.clear_options()
Esempio n. 3
0
    def connect(self) -> bool:
        c = Config("org.blueman.gsmsetting", f"/org/blueman/gsmsettings/{self.service.device['Address']}/")

        m = Mechanism()
        m.PPPConnect('(uss)', self.port, c["number"], c["apn"], result_handler=self.on_connected,
                     error_handler=self.on_error)

        return False
Esempio n. 4
0
    def connect(self):
        c = Config(
            "org.blueman.gsmsetting",
            "/org/blueman/gsmsettings/%s/" % self.service.device['Address'])

        m = Mechanism()
        m.PPPConnect('(sss)',
                     self.port,
                     c["number"],
                     c["apn"],
                     result_handler=self.on_connected,
                     error_handler=self.on_error)
Esempio n. 5
0
    def connect(self, reply_handler=None, error_handler=None):
        channel = get_rfcomm_channel(self.short_uuid, self.device['Address'])
        if channel == 0:
            error = RFCOMMError("Failed to get rfcomm channel")
            if error_handler:
                error_handler(error)
                return True
            else:
                raise error

        try:
            port_id = create_rfcomm_device(
                Adapter(self.device["Adapter"])['Address'],
                self.device["Address"], channel)
            filename = '/dev/rfcomm%d' % port_id
            logging.info('Starting rfcomm watcher as root')
            Mechanism().open_rfcomm('(d)', port_id)
            mon = Gio.File.new_for_path(filename).monitor_file(
                Gio.FileMonitorFlags.NONE)
            self.file_changed_handler = mon.connect('changed',
                                                    self.on_file_changed,
                                                    port_id)
            self.try_replace_root_watcher(mon, filename, port_id)

            if reply_handler:
                reply_handler(filename)
        except RFCOMMError as e:
            if error_handler:
                error_handler(e)
            else:
                raise e
        return True
Esempio n. 6
0
    def connect(
        self,
        reply_handler: Optional[Callable[[int], None]] = None,
        error_handler: Optional[Callable[[RFCOMMError], None]] = None
    ) -> bool:
        # We expect this service to have a reserved UUID
        uuid = self.short_uuid
        assert uuid
        channel = get_rfcomm_channel(uuid, self.device['Address'])
        if channel is None or channel == 0:
            error = RFCOMMError("Failed to get rfcomm channel")
            if error_handler:
                error_handler(error)
                return True
            else:
                raise error

        try:
            port_id = create_rfcomm_device(Adapter(obj_path=self.device["Adapter"])['Address'], self.device["Address"],
                                           channel)
            filename = '/dev/rfcomm%d' % port_id
            logging.info('Starting rfcomm watcher as root')
            Mechanism().OpenRFCOMM('(d)', port_id)
            mon = Gio.File.new_for_path(filename).monitor_file(Gio.FileMonitorFlags.NONE)
            self._handlerids[port_id] = mon.connect('changed', self.on_file_changed, port_id)
            self.try_replace_root_watcher(mon, filename, port_id)

            if reply_handler:
                reply_handler(port_id)
        except RFCOMMError as e:
            if error_handler:
                error_handler(e)
            else:
                raise e
        return True
Esempio n. 7
0
    def load_nap_settings(self):
        logging.info("Loading NAP settings")

        def reply(*_):
            pass

        def err(_obj, result, _user_data):
            d = ErrorDialog("<b>Failed to apply network settings</b>",
                            "You might not be able to connect to the Bluetooth network via this machine",
                            result,
                            margin_left=9)

            d.run()
            d.destroy()

        m = Mechanism()
        m.ReloadNetwork(result_handler=reply, error_handler=err)
Esempio n. 8
0
    def try_replace_root_watcher(self, monitor, path, port):
        if not os.access(path, os.R_OK | os.W_OK):
            return

        logging.info('User was granted access to %s' % path)
        logging.info('Replacing root watcher')
        Mechanism().close_rfcomm('(d)', port)
        subprocess.Popen([RFCOMM_WATCHER_PATH, path])
        monitor.disconnect(self.file_changed_handler)
Esempio n. 9
0
    def try_replace_root_watcher(self, monitor: Gio.FileMonitor, path: str,
                                 port: int) -> None:
        if not os.access(path, os.R_OK | os.W_OK):
            return

        logging.info('User was granted access to %s' % path)
        logging.info('Replacing root watcher')
        Mechanism().CloseRFCOMM('(d)', port)
        subprocess.Popen([RFCOMM_WATCHER_PATH, path])
        monitor.disconnect_by_func(self.on_file_changed, port)
Esempio n. 10
0
    def on_apply(self) -> None:

        if self.on_query_apply_state():
            logging.info("network apply")

            m = Mechanism()
            nap_enable = self._builder.get_widget("nap-enable",
                                                  Gtk.CheckButton)
            if nap_enable.props.active:

                if self._builder.get_widget("r_dhcpd",
                                            Gtk.RadioButton).props.active:
                    stype = "DhcpdHandler"
                elif self._builder.get_widget("r_dnsmasq",
                                              Gtk.RadioButton).props.active:
                    stype = "DnsMasqHandler"
                elif self._builder.get_widget("r_udhcpd",
                                              Gtk.RadioButton).props.active:
                    stype = "UdhcpdHandler"

                net_ip = self._builder.get_widget("net_ip", Gtk.Entry)

                try:
                    m.EnableNetwork('(sss)', net_ip.props.text,
                                    "255.255.255.0", stype)

                    if not self.Config["nap-enable"]:
                        self.Config["nap-enable"] = True
                except Exception as e:
                    parent = self.widget.get_toplevel()
                    assert isinstance(parent, Gtk.Container)
                    d = ErrorDialog("<b>Failed to apply network settings</b>",
                                    excp=e,
                                    parent=parent)

                    d.run()
                    d.destroy()
                    return
            else:
                self.Config["nap-enable"] = False
                m.DisableNetwork()

            self.clear_options()
Esempio n. 11
0
    def disconnect(self, port_id, reply_handler=None, error_handler=None):
        try:
            Mechanism().close_rfcomm('(d)', port_id)
        except GLib.Error as e:
            if error_handler:
                error_handler(e.message)
            else:
                raise

        if reply_handler:
            reply_handler()
Esempio n. 12
0
    def try_replace_root_watcher(self, monitor: Gio.FileMonitor, path: str, port: int) -> None:
        if not os.access(path, os.R_OK | os.W_OK):
            return

        logging.info(f'User was granted access to {path}')
        logging.info('Replacing root watcher')
        Mechanism().CloseRFCOMM('(d)', port)
        subprocess.Popen([RFCOMM_WATCHER_PATH, path])
        if port in self._handlerids:
            handler_id = self._handlerids.pop(port)
            monitor.disconnect(handler_id)
        else:
            logging.warning(f"No handler id for {port}")
Esempio n. 13
0
    def disconnect(
            self,
            port_id: int,
            reply_handler: Optional[Callable[[], None]] = None,
            error_handler: Optional[Callable[[str], None]] = None) -> None:
        try:
            Mechanism().CloseRFCOMM('(d)', port_id)
        except GLib.Error as e:
            if error_handler:
                error_handler(e.message)
            else:
                raise

        if reply_handler:
            reply_handler()
Esempio n. 14
0
    def on_power_state_change_requested(self, _, state, cb):
        logging.info(state)

        def reply(*_):
            cb(True)

        def error(*_):
            cb(False)

        if self._connman_proxy:
            logging.debug("Using connman to set state: %s" % state)
            self._connman_proxy.SetProperty('(sv)', 'Powered', GLib.Variant.new_boolean(state),
                                            result_handler=reply, error_handler=error)
        else:
            logging.debug("Using mechanism to set state: %s" % state)
            Mechanism().SetRfkillState('(b)', state, result_handler=reply, error_handler=error)
Esempio n. 15
0
    def on_power_state_change_requested(self, _: PowerManager, state: bool, cb: Callable[[bool], None]) -> None:
        logging.info(state)

        def reply(*_: Any) -> None:
            cb(True)

        def error(*_: Any) -> None:
            cb(False)

        if self._connman_proxy:
            logging.debug(f"Using connman to set state: {state}")
            self._connman_proxy.SetProperty('(sv)', 'Powered', GLib.Variant.new_boolean(state),
                                            result_handler=reply, error_handler=error)
        else:
            logging.debug(f"Using mechanism to set state: {state}")
            Mechanism().SetRfkillState('(b)', state, result_handler=reply, error_handler=error)