Ejemplo n.º 1
0
class ServiceIPConfiguration(object):
    def __init__(self, service):
        self._service = service
        self.onChanged = []
        self.onMethodChanged = []
        method_choices_ip4 = {
            eNetworkService.METHOD_DHCP: "dhcp",
            eNetworkService.METHOD_MANUAL: _("manual"),
            eNetworkService.METHOD_OFF: _("off")
        }
        #IPv4
        self._config_ip4_method = ConfigSelection(
            method_choices_ip4, default=eNetworkService.METHOD_DHCP)
        self._config_ip4_address = ConfigIP(default=[0, 0, 0, 0])
        self._config_ip4_mask = ConfigIP(default=[0, 0, 0, 0])
        self._config_ip4_gw = ConfigIP(default=[0, 0, 0, 0])
        #IPv6
        method_choices_ip6 = {
            eNetworkService.METHOD_AUTO: _("auto"),
            eNetworkService.METHOD_6TO4: "6to4",
            eNetworkService.METHOD_MANUAL: _("manual"),
            eNetworkService.METHOD_OFF: _("off")
        }
        choices_privacy_ip6 = {
            eNetworkService.IPV6_PRIVACY_DISABLED: _("Disabled"),
            eNetworkService.IPV6_PRIVACY_ENABLED: _("Enabled"),
            eNetworkService.IPV6_PRIVACY_PREFERRED: _("Preferred")
        }
        self._config_ip6_method = ConfigSelection(
            method_choices_ip6, default=eNetworkService.METHOD_DHCP)
        self._config_ip6_address = ConfigIP6()
        self._config_ip6_prefix_length = ConfigInteger(0, limits=(1, 128))
        self._config_ip6_gw = ConfigIP6()
        self._config_ip6_privacy = ConfigSelection(choices_privacy_ip6,
                                                   default="disabled")

        self._isReloading = False
        self._ipv4Changed = False
        self._ipv6Changed = False
        self._addNotifiers()
        self._service_conn = [
            self._service.ipv4Changed.connect(self._serviceChanged),
            self._service.ipv6Changed.connect(self._serviceChanged),
            self._service.ipv4ConfigChanged.connect(self._serviceChanged),
            self._service.ipv6ConfigChanged.connect(self._serviceChanged),
        ]

    def _serviceChanged(self, *args):
        self.reload(force=False)

    def _addNotifiers(self):
        #Setup refresh
        self._config_ip4_method.addNotifier(self._methodChanged,
                                            initial_call=False)
        self._config_ip6_method.addNotifier(self._methodChanged,
                                            initial_call=False)

        #change tracking
        #ipv4
        self._config_ip4_method.addNotifier(self._changedIP4,
                                            initial_call=False)
        self._config_ip4_address.addNotifier(self._changedIP4,
                                             initial_call=False)
        self._config_ip4_mask.addNotifier(self._changedIP4, initial_call=False)
        self._config_ip4_gw.addNotifier(self._changedIP4, initial_call=False)
        #ipv6
        self._config_ip6_method.addNotifier(self._changedIP6,
                                            initial_call=False)
        self._config_ip6_address.addNotifier(self._changedIP6,
                                             initial_call=False)
        self._config_ip6_prefix_length.addNotifier(self._changedIP6,
                                                   initial_call=False)
        self._config_ip6_gw.addNotifier(self._changedIP6, initial_call=False)
        self._config_ip6_privacy.addNotifier(self._changedIP6,
                                             initial_call=False)

    def _changedIP4(self, element):
        if not self._isReloading:
            self._ipv4Changed = True
        self._changed(element)

    def _changedIP6(self, element):
        if not self._isReloading:
            self._ipv6Changed = True
        self._changed(element)

    def _changed(self, element):
        if not self._isReloading:
            Log.i()
            for fnc in self.onChanged:
                fnc()

    def _methodChanged(self, element):
        if not self._isReloading:
            Log.i()
            for fnc in self.onMethodChanged:
                fnc()

    def reload(self, force=True):
        self._isReloading = True
        if force:
            self._ipv4Changed = False
            self._ipv6Changed = False
        if not self._ipv6Changed:
            ip4 = self._service.ipv4()
            if not dict(ip4):
                ip6 = self._service.ipv4Config()
            self._config_ip4_method.value = ip4.get(eNetworkService.KEY_METHOD,
                                                    eNetworkService.METHOD_OFF)
            self._config_ip4_address.value = toIP4List(
                ip4.get("Address", "0.0.0.0"))
            self._config_ip4_mask.value = toIP4List(
                ip4.get(eNetworkService.KEY_NETMASK, "0.0.0.0"))
            self._config_ip4_gw.value = toIP4List(
                ip4.get(eNetworkService.KEY_GATEWAY, "0.0.0.0"))
        if not self._ipv6Changed:
            ip6 = self._service.ipv6()
            Log.i("%s / %s" % (dict(ip6), dict(self._service.ipv6Config())))
            if not dict(ip6):
                ip6 = self._service.ipv6Config()
            self._config_ip6_method.value = ip6.get(eNetworkService.KEY_METHOD,
                                                    eNetworkService.METHOD_OFF)
            self._config_ip6_address.value = ip6.get(
                eNetworkService.KEY_ADDRESS, "::")
            self._config_ip6_prefix_length.value = ord(
                ip6.get(eNetworkService.KEY_PREFIX_LENGTH, chr(1)) or chr(1))
            self._config_ip6_gw.value = ip6.get(eNetworkService.KEY_GATEWAY,
                                                "::")
            self._config_ip6_privacy.value = ip6.get(
                eNetworkService.KEY_PRIVACY,
                eNetworkService.IPV6_PRIVACY_DISABLED)
        self._isReloading = False
        self._changed(None)

    def getList(self):
        if self._config_ip4_method.value == eNetworkService.METHOD_MANUAL:
            self._config_ip4_address.enabled = True
            self._config_ip4_mask.enabled = True
            self._config_ip4_gw.enabled = True
        else:
            self._config_ip4_address.enabled = False
            self._config_ip4_mask.enabled = False
            self._config_ip4_gw.enabled = False
        if self._config_ip6_method.value == eNetworkService.METHOD_MANUAL:
            self._config_ip6_address.enabled = True
            self._config_ip6_prefix_length.enabled = True
            self._config_ip6_gw.enabled = True
        else:
            self._config_ip6_address.enabled = False
            self._config_ip6_prefix_length.enabled = False
            self._config_ip6_gw.enabled = False

        l = [
            getConfigListEntry(_("Method (IPv4)"), self._config_ip4_method),
        ]
        if self._config_ip4_method.value != eNetworkService.METHOD_OFF:
            l.extend([
                getConfigListEntry(_("Address (IPv4)"),
                                   self._config_ip4_address),
                getConfigListEntry(_("Mask (IPv4)"), self._config_ip4_mask),
                getConfigListEntry(_("Gateway (IPv4)"), self._config_ip4_gw),
            ])
        l.append(
            getConfigListEntry(_("Method (IPv6)"), self._config_ip6_method))
        if self._config_ip6_method.value != eNetworkService.METHOD_OFF:
            l.extend([
                getConfigListEntry(_("Address (IPv6)"),
                                   self._config_ip6_address),
                getConfigListEntry(_("Prefix length (IPv6)"),
                                   self._config_ip6_prefix_length),
                getConfigListEntry(_("Gateway (IPv6)"), self._config_ip6_gw),
            ])
        if self._config_ip6_method.value in (eNetworkService.METHOD_AUTO,
                                             eNetworkService.METHOD_6TO4):
            l.append(
                getConfigListEntry(_("Privacy (IPv6)"),
                                   self._config_ip6_privacy))
        return l

    def save(self):
        if self._ipv4Changed:
            Log.i("IPv4 Changed, saving!")
            if self._config_ip4_method.value == eNetworkService.METHOD_MANUAL:
                ip4_config = {
                    eNetworkService.KEY_METHOD:
                    self._config_ip4_method.value,
                    eNetworkService.KEY_ADDRESS:
                    toIP4String(self._config_ip4_address),
                    eNetworkService.KEY_NETMASK:
                    toIP4String(self._config_ip4_mask),
                    eNetworkService.KEY_GATEWAY:
                    toIP4String(self._config_ip4_gw),
                }
            else:
                ip4_config = {
                    eNetworkService.KEY_METHOD: self._config_ip4_method.value
                }
            Log.i(ip4_config)
            self._service.setIpv4Config(ip4_config)

        if self._ipv6Changed:
            Log.i("IPv6 Changed, saving!")
            if self._config_ip6_method.value == eNetworkService.METHOD_MANUAL:
                ip6_config = {
                    eNetworkService.KEY_METHOD:
                    self._config_ip6_method.value,
                    eNetworkService.KEY_ADDRESS:
                    self._config_ip6_address.value,
                    eNetworkService.KEY_PREFIX_LENGTH:
                    self._config_ip6_prefix_length.value,
                    eNetworkService.KEY_GATEWAY:
                    self._config_ip6_gw.value,
                    eNetworkService.KEY_PRIVACY:
                    self._config_ip6_privacy.value,
                }
            else:
                val = self._config_ip6_method.value  #avoid config element overhead here
                #one can not configure 6to4, it will automatically be applied by connman if applicable -> change it to auto
                if val == eNetworkService.METHOD_6TO4:
                    val = eNetworkService.METHOD_AUTO

                ip6_config = {eNetworkService.KEY_METHOD: val}
                if val != eNetworkService.METHOD_OFF:
                    ip6_config[eNetworkService.
                               KEY_PRIVACY] = self._config_ip6_privacy.value
            Log.i(ip6_config)
            self._service.setIpv6Config(ip6_config)
Ejemplo n.º 2
0
class ServiceIPConfiguration(object):
	def __init__(self, service):
		self._service = service
		self.onChanged = []
		self.onMethodChanged = []
		method_choices_ip4 = {eNetworkService.METHOD_DHCP : "dhcp", eNetworkService.METHOD_MANUAL : _("manual"), eNetworkService.METHOD_OFF : _("off")}
		#IPv4
		self._config_ip4_method = ConfigSelection(method_choices_ip4, default=eNetworkService.METHOD_DHCP)
		self._config_ip4_address = ConfigIP(default=[0,0,0,0])
		self._config_ip4_mask = ConfigIP(default=[0,0,0,0])
		self._config_ip4_gw = ConfigIP(default=[0,0,0,0])
		#IPv6
		method_choices_ip6 = {eNetworkService.METHOD_AUTO : _("auto"), eNetworkService.METHOD_6TO4 : "6to4", eNetworkService.METHOD_MANUAL : _("manual"), eNetworkService.METHOD_OFF : _("off")}
		choices_privacy_ip6 = {eNetworkService.IPV6_PRIVACY_DISABLED : _("Disabled"), eNetworkService.IPV6_PRIVACY_ENABLED : _("Enabled"), eNetworkService.IPV6_PRIVACY_PREFERRED : _("Preferred")}
		self._config_ip6_method = ConfigSelection(method_choices_ip6, default=eNetworkService.METHOD_DHCP)
		self._config_ip6_address = ConfigIP6()
		self._config_ip6_prefix_length = ConfigInteger(0, limits=(1, 128))
		self._config_ip6_gw = ConfigIP6()
		self._config_ip6_privacy = ConfigSelection(choices_privacy_ip6, default="disabled")

		self._isReloading = False
		self._ipv4Changed = False
		self._ipv6Changed = False
		self._addNotifiers()
		self._service_conn = [
			self._service.ipv4Changed.connect(self._serviceChanged),
			self._service.ipv6Changed.connect(self._serviceChanged),
			self._service.ipv4ConfigChanged.connect(self._serviceChanged),
			self._service.ipv6ConfigChanged.connect(self._serviceChanged),
		]

	def _serviceChanged(self, *args):
		self.reload(force=False)

	def _addNotifiers(self):
		#Setup refresh
		self._config_ip4_method.addNotifier(self._methodChanged, initial_call=False)
		self._config_ip6_method.addNotifier(self._methodChanged, initial_call=False)

		#change tracking
		#ipv4
		self._config_ip4_method.addNotifier(self._changedIP4, initial_call=False)
		self._config_ip4_address.addNotifier(self._changedIP4, initial_call=False)
		self._config_ip4_mask.addNotifier(self._changedIP4, initial_call=False)
		self._config_ip4_gw.addNotifier(self._changedIP4, initial_call=False)
		#ipv6
		self._config_ip6_method.addNotifier(self._changedIP6, initial_call=False)
		self._config_ip6_address.addNotifier(self._changedIP6, initial_call=False)
		self._config_ip6_prefix_length.addNotifier(self._changedIP6, initial_call=False)
		self._config_ip6_gw.addNotifier(self._changedIP6, initial_call=False)
		self._config_ip6_privacy.addNotifier(self._changedIP6, initial_call=False)

	def _changedIP4(self, element):
		if not self._isReloading:
			self._ipv4Changed = True
		self._changed(element)

	def _changedIP6(self, element):
		if not self._isReloading:
			self._ipv6Changed = True
		self._changed(element)

	def _changed(self, element):
		if not self._isReloading:
			Log.i()
			for fnc in self.onChanged:
				fnc()

	def _methodChanged(self, element):
		if not self._isReloading:
			Log.i()
			for fnc in self.onMethodChanged:
				fnc()

	def reload(self, force=True):
		self._isReloading = True
		if force:
			self._ipv4Changed = False
			self._ipv6Changed = False
		if not self._ipv6Changed:
			ip4 = self._service.ipv4()
			if not dict(ip4):
				ip6 = self._service.ipv4Config()
			self._config_ip4_method.value = ip4.get(eNetworkService.KEY_METHOD, eNetworkService.METHOD_OFF)
			self._config_ip4_address.value = toIP4List( ip4.get("Address", "0.0.0.0") )
			self._config_ip4_mask.value = toIP4List( ip4.get(eNetworkService.KEY_NETMASK, "0.0.0.0") )
			self._config_ip4_gw.value = toIP4List( ip4.get(eNetworkService.KEY_GATEWAY, "0.0.0.0") )
		if not self._ipv6Changed:
			ip6 = self._service.ipv6()
			Log.i("%s / %s" %(dict(ip6), dict(self._service.ipv6Config())) )
			if not dict(ip6):
				ip6 = self._service.ipv6Config()
			self._config_ip6_method.value = ip6.get(eNetworkService.KEY_METHOD, eNetworkService.METHOD_OFF)
			self._config_ip6_address.value = ip6.get(eNetworkService.KEY_ADDRESS, "::")
			self._config_ip6_prefix_length.value = ord( ip6.get(eNetworkService.KEY_PREFIX_LENGTH, chr(1)) or chr(1) )
			self._config_ip6_gw.value = ip6.get(eNetworkService.KEY_GATEWAY, "::")
			self._config_ip6_privacy.value = ip6.get(eNetworkService.KEY_PRIVACY, eNetworkService.IPV6_PRIVACY_DISABLED)
		self._isReloading = False
		self._changed(None)

	def getList(self):
		if self._config_ip4_method.value == eNetworkService.METHOD_MANUAL:
			self._config_ip4_address.enabled = True
			self._config_ip4_mask.enabled = True
			self._config_ip4_gw.enabled = True
		else:
			self._config_ip4_address.enabled = False
			self._config_ip4_mask.enabled = False
			self._config_ip4_gw.enabled = False
		if self._config_ip6_method.value == eNetworkService.METHOD_MANUAL:
			self._config_ip6_address.enabled = True
			self._config_ip6_prefix_length.enabled = True
			self._config_ip6_gw.enabled = True
		else:
			self._config_ip6_address.enabled = False
			self._config_ip6_prefix_length.enabled = False
			self._config_ip6_gw.enabled = False

		l = [ getConfigListEntry(_("Method (IPv4)"), self._config_ip4_method), ]
		if self._config_ip4_method.value != eNetworkService.METHOD_OFF:
			l.extend([
				getConfigListEntry(_("Address (IPv4)"), self._config_ip4_address),
				getConfigListEntry(_("Mask (IPv4)"), self._config_ip4_mask),
				getConfigListEntry(_("Gateway (IPv4)"), self._config_ip4_gw),
			])
		l.append( getConfigListEntry(_("Method (IPv6)"), self._config_ip6_method))
		if self._config_ip6_method.value != eNetworkService.METHOD_OFF:
			l.extend([
				getConfigListEntry(_("Address (IPv6)"), self._config_ip6_address),
				getConfigListEntry(_("Prefix length (IPv6)"), self._config_ip6_prefix_length),
				getConfigListEntry(_("Gateway (IPv6)"), self._config_ip6_gw),
			])
		if self._config_ip6_method.value in (eNetworkService.METHOD_AUTO, eNetworkService.METHOD_6TO4):
			l.append( getConfigListEntry(_("Privacy (IPv6)"), self._config_ip6_privacy) )
		return l

	def save(self):
		if self._ipv4Changed:
			Log.i("IPv4 Changed, saving!")
			if self._config_ip4_method.value == eNetworkService.METHOD_MANUAL:
				ip4_config = {
						eNetworkService.KEY_METHOD : self._config_ip4_method.value,
						eNetworkService.KEY_ADDRESS : toIP4String(self._config_ip4_address),
						eNetworkService.KEY_NETMASK : toIP4String(self._config_ip4_mask),
						eNetworkService.KEY_GATEWAY : toIP4String(self._config_ip4_gw),
					}
			else:
				ip4_config = { eNetworkService.KEY_METHOD : self._config_ip4_method.value }
			Log.i(ip4_config)
			self._service.setIpv4Config(ip4_config)

		if self._ipv6Changed:
			Log.i("IPv6 Changed, saving!")
			if self._config_ip6_method.value == eNetworkService.METHOD_MANUAL:
				ip6_config = {
						eNetworkService.KEY_METHOD : self._config_ip6_method.value,
						eNetworkService.KEY_ADDRESS : self._config_ip6_address.value,
						eNetworkService.KEY_PREFIX_LENGTH : self._config_ip6_prefix_length.value,
						eNetworkService.KEY_GATEWAY : self._config_ip6_gw.value,
						eNetworkService.KEY_PRIVACY : self._config_ip6_privacy.value,
					}
			else:
				val = self._config_ip6_method.value #avoid config element overhead here
				#one can not configure 6to4, it will automatically be applied by connman if applicable -> change it to auto
				if val == eNetworkService.METHOD_6TO4:
					val = eNetworkService.METHOD_AUTO

				ip6_config = { eNetworkService.KEY_METHOD : val }
				if val != eNetworkService.METHOD_OFF:
					ip6_config[eNetworkService.KEY_PRIVACY] = self._config_ip6_privacy.value
			Log.i(ip6_config)
			self._service.setIpv6Config(ip6_config)