class GlobalConfiguration(Model): gc_hostname = models.CharField( max_length=120, verbose_name=_("Hostname"), default='nas', validators=[RegexValidator(regex=r'^[a-zA-Z\.\-\_0-9]+$', )], ) gc_hostname_b = models.CharField( max_length=120, verbose_name=_("Hostname"), validators=[RegexValidator(regex=r'^[a-zA-Z\.\-\_0-9]+$', )], blank=True, null=True, ) gc_domain = models.CharField( max_length=120, verbose_name=_("Domain"), default='local', validators=[RegexValidator(regex=r'^[a-zA-Z\.\-\_0-9]+$', )], ) gc_ipv4gateway = IP4AddressField( blank=True, default='', verbose_name=_("IPv4 Default Gateway"), ) gc_ipv6gateway = IP6AddressField( blank=True, default='', verbose_name=_("IPv6 Default Gateway"), ) gc_nameserver1 = IPAddressField(blank=True, default='', verbose_name=_("Nameserver 1")) gc_nameserver2 = IPAddressField(default='', blank=True, verbose_name=_("Nameserver 2")) gc_nameserver3 = IPAddressField(default='', blank=True, verbose_name=_("Nameserver 3")) gc_httpproxy = models.CharField( verbose_name=_('HTTP Proxy'), blank=True, max_length=255, ) gc_netwait_enabled = models.BooleanField( verbose_name=_("Enable netwait feature"), help_text=_( "If enabled, delays the start of network-reliant services " "until interface is up and ICMP packets to a destination defined " "in netwait ip list are flowing. Link state is examined first, " "followed by \"pinging\" an IP address to verify network " "usability. If no destination can be reached or timeouts are " "exceeded, network services are started anyway with no guarantee " "that the network is usable."), default=False, ) gc_netwait_ip = models.CharField( verbose_name=_("Netwait IP list"), help_text=_( "Space-delimited list of IP addresses to ping(8). If " "multiple IP addresses are specified, each will be tried until " "one is successful or the list is exhausted. If it is empty the " "default gateway will be used."), blank=True, max_length=300, ) gc_hosts = models.TextField( verbose_name=_("Host name data base"), help_text=_( "This field is appended to /etc/hosts which contains " "information regarding known hosts on the network. hosts(5)"), default='', blank=True, ) def __init__(self, *args, **kwargs): super(GlobalConfiguration, self).__init__(*args, **kwargs) for name in ( 'gc_hostname', 'gc_ipv4gateway', 'gc_ipv6gateway', 'gc_domain', 'gc_nameserver1', 'gc_nameserver2', 'gc_nameserver3', 'gc_httpproxy', ): setattr(self, "_orig_%s" % name, self.__dict__.get(name)) def __str__(self): return str(self.id) def get_hostname(self): _n = notifier() if not _n.is_freenas(): if _n.failover_node() == 'B': return self.gc_hostname_b else: return self.gc_hostname else: return self.gc_hostname def save(self, *args, **kwargs): # See #3437 if self._orig_gc_hostname != self.gc_hostname: try: cifs = CIFS.objects.order_by('-id')[0] cifs.cifs_srv_netbiosname = self.gc_hostname cifs.save() except: pass return super(GlobalConfiguration, self).save(*args, **kwargs) class Meta: verbose_name = _("Global Configuration") verbose_name_plural = _("Global Configuration")
class Interfaces(Model): int_interface = models.CharField(max_length=300, blank=False, verbose_name=_("NIC"), help_text=_("Pick your NIC")) int_name = models.CharField(max_length=120, verbose_name=_("Interface Name"), help_text=_("Name your NIC.")) int_dhcp = models.BooleanField( verbose_name=_("DHCP"), default=False, help_text=_("When enabled, use DHCP to obtain IPv4 address as well" " as default router, etc."), ) int_ipv4address = IPAddressField( verbose_name=_("IPv4 Address"), blank=True, default='', ) int_ipv4address_b = IPAddressField( verbose_name=_("IPv4 Address"), blank=True, default='', ) int_v4netmaskbit = models.CharField(max_length=3, choices=choices.v4NetmaskBitList, blank=True, default='', verbose_name=_("IPv4 Netmask"), help_text="") int_ipv6auto = models.BooleanField( verbose_name=_("Auto configure IPv6"), default=False, help_text=_("When enabled, automatically configurate IPv6 address " "via rtsol(8)."), ) int_ipv6address = IPAddressField( verbose_name=_("IPv6 Address"), blank=True, default='', ) int_v6netmaskbit = models.CharField(max_length=4, choices=choices.v6NetmaskBitList, blank=True, default='', verbose_name=_("IPv6 Prefix Length"), help_text="") int_vip = IPAddressField( verbose_name=_("Virtual IP"), blank=True, null=True, ) int_vhid = models.PositiveIntegerField( verbose_name=_("Virtual Host ID"), null=True, blank=True, ) int_pass = models.CharField( max_length=100, blank=True, verbose_name=_("Password"), editable=False, ) int_critical = models.BooleanField( default=False, verbose_name=_("Critical for Failover"), ) int_group = models.IntegerField( verbose_name=_('Group'), choices=[(i, i) for i in range(1, 33)], null=True, blank=True, ) int_options = models.CharField(max_length=120, verbose_name=_("Options"), blank=True) def __str__(self): if not self.int_name: return self.int_interface return str(self.int_name) def __init__(self, *args, **kwargs): super(Interfaces, self).__init__(*args, **kwargs) self._original_int_options = self.int_options def delete(self): LAGGInterface.objects.filter(lagg_interface__id=self.id).delete() # Delete VLAN entries for this interface VLAN.objects.filter(vlan_vint=self.int_interface).delete() if self.id: super(Interfaces, self).delete() os.system("sleep 2") notifier().start("network") def save(self, *args, **kwargs): if self.int_vip and not self.int_pass: self.int_pass = ''.join([ random.SystemRandom().choice(string.ascii_letters + string.digits) for n in range(16) ]) return super(Interfaces, self).save(*args, **kwargs) class Meta: verbose_name = _("Interface") verbose_name_plural = _("Interfaces") ordering = ["int_interface"] def get_ipv4_addresses(self): """ Includes IPv4 addresses in aliases """ ips = [] if self.int_ipv4address: ips.append("%s/%s" % ( str(self.int_ipv4address), str(self.int_v4netmaskbit), )) if self.int_ipv4address_b: ips.append("%s/%s" % ( str(self.int_ipv4address_b), str(self.int_v4netmaskbit), )) for alias in self.alias_set.exclude(alias_v4address=''): ips.append("%s/%s" % ( str(alias.alias_v4address), str(alias.alias_v4netmaskbit), )) return ips def get_my_ipv4_addresses(self, vip=None): """ Includes IPv4 addresses of this node, aliases of this node, and (optionally) VIPs """ ips = [] _n = notifier() if not _n.is_freenas() and _n.failover_node() == 'B': if self.int_ipv4address_b: ips.append("%s" % str(self.int_ipv4address_b)) for alias in self.alias_set.exclude(alias_v4address_b=''): ips.append("%s" % str(alias.alias_v4address_b)) else: if self.int_ipv4address: ips.append("%s" % str(self.int_ipv4address)) for alias in self.alias_set.exclude(alias_v4address=''): ips.append("%s" % str(alias.alias_v4address)) if vip: if self.int_vip: ips.append("%s" % str(self.int_vip)) for alias in self.alias_set.exclude(alias_vip=''): ips.append("%s" % str(alias.alias_vip)) return ips def get_ipv6_addresses(self): """ Includes IPv6 addresses in aliases """ ips = [] if self.int_ipv6address: ips.append("%s/%s" % ( str(self.int_ipv6address), str(self.int_v6netmaskbit), )) for alias in self.alias_set.exclude(alias_v6address=''): ips.append("%s/%s" % ( str(alias.alias_v6address), str(alias.alias_v6netmaskbit), )) return ips def get_media_status(self): return notifier().iface_media_status(self.int_interface)
class GlobalConfiguration(Model): gc_hostname = models.CharField(max_length=120, verbose_name=_("Hostname")) gc_domain = models.CharField(max_length=120, verbose_name=_("Domain")) gc_ipv4gateway = IP4AddressField( blank=True, default='', verbose_name=_("IPv4 Default Gateway"), ) gc_ipv6gateway = IP6AddressField( blank=True, default='', verbose_name=_("IPv6 Default Gateway"), ) gc_nameserver1 = IPAddressField(blank=True, default='', verbose_name=_("Nameserver 1")) gc_nameserver2 = IPAddressField(default='', blank=True, verbose_name=_("Nameserver 2")) gc_nameserver3 = IPAddressField(default='', blank=True, verbose_name=_("Nameserver 3")) gc_netwait_enabled = models.BooleanField( verbose_name=_("Enable netwait feature"), help_text=_( "If enabled, delays the start of network-reliant services " "until interface is up and ICMP packets to a destination defined " "in netwait ip list are flowing. Link state is examined first, " "followed by \"pinging\" an IP address to verify network " "usability. If no destination can be reached or timeouts are " "exceeded, network services are started anyway with no guarantee " "that the network is usable."), default=False, ) gc_netwait_ip = models.CharField( verbose_name=_("Netwait IP list"), help_text=_( "Space-delimited list of IP addresses to ping(8). If " "multiple IP addresses are specified, each will be tried until " "one is successful or the list is exhausted. If it is empty the " "default gateway will be used."), blank=True, max_length=300, ) gc_hosts = models.TextField( verbose_name=_("Host name data base"), help_text=_( "This field is appended to /etc/hosts which contains " "information regarding known hosts on the network. hosts(5)"), default='', blank=True, ) def __unicode__(self): return u'%s' % self.id class Meta: verbose_name = _("Global Configuration") verbose_name_plural = _("Global Configuration") class FreeAdmin: deletable = False
class Interfaces(Model): int_interface = models.CharField( max_length=300, blank=False, verbose_name=_("NIC"), help_text=_("Pick your NIC") ) int_name = models.CharField( max_length="120", verbose_name=_("Interface Name"), help_text=_("Name your NIC.") ) int_dhcp = models.BooleanField( verbose_name=_("DHCP"), default=False, help_text=_( "When enabled, use DHCP to obtain IPv4 address as well" " as default router, etc." ), ) int_ipv4address = IPAddressField( verbose_name=_("IPv4 Address"), blank=True, default='', ) int_ipv4address_b = IPAddressField( verbose_name=_("IPv4 Address"), blank=True, default='', ) int_v4netmaskbit = models.CharField( max_length=3, choices=choices.v4NetmaskBitList, blank=True, default='', verbose_name=_("IPv4 Netmask"), help_text="" ) int_ipv6auto = models.BooleanField( verbose_name=_("Auto configure IPv6"), default=False, help_text=_( "When enabled, automatically configurate IPv6 address " "via rtsol(8)." ), ) int_ipv6address = IPAddressField( verbose_name=_("IPv6 Address"), blank=True, default='', ) int_v6netmaskbit = models.CharField( max_length=4, choices=choices.v6NetmaskBitList, blank=True, default='', verbose_name=_("IPv6 Prefix Length"), help_text="" ) int_vip = IPAddressField( verbose_name=_("Virtual IP"), blank=True, null=True, ) int_vhid = models.PositiveIntegerField( verbose_name=_("Virtual Host ID"), null=True, blank=True, ) int_pass = models.CharField( max_length=100, blank=True, verbose_name=_("Password"), editable=False, ) int_critical = models.BooleanField( default=False, verbose_name=_("Critical for Failover"), ) int_group = models.IntegerField( verbose_name=_('Group'), choices=[(i, i) for i in range(1, 33)], null=True, blank=True, ) int_options = models.CharField( max_length=120, verbose_name=_("Options"), blank=True ) def __unicode__(self): if not self.int_name: return self.int_interface return u'%s' % self.int_name def __init__(self, *args, **kwargs): super(Interfaces, self).__init__(*args, **kwargs) self._original_int_options = self.int_options def delete(self): with transaction.atomic(): for lagg in self.lagginterface_set.all(): lagg.delete() if self.id: super(Interfaces, self).delete() os.system("sleep 2") notifier().start("network") def save(self, *args, **kwargs): if self.int_vip and not self.int_pass: self.int_pass = ''.join([ random.SystemRandom().choice( string.ascii_letters + string.digits ) for n in xrange(16) ]) super(Interfaces, self).save(*args, **kwargs) if self._original_int_options != self.int_options and \ re.search(r'mtu \d+', self._original_int_options) and \ self.int_options.find("mtu") == -1: notifier().interface_mtu(self.int_interface, "1500") class Meta: verbose_name = _("Interface") verbose_name_plural = _("Interfaces") ordering = ["int_interface"] def get_ipv4_addresses(self): """ Includes IPv4 addresses in aliases """ ips = [] if self.int_ipv4address: ips.append("%s/%s" % ( str(self.int_ipv4address), str(self.int_v4netmaskbit), )) if self.int_ipv4address_b: ips.append("%s/%s" % ( str(self.int_ipv4address_b), str(self.int_v4netmaskbit), )) for alias in self.alias_set.exclude(alias_v4address=''): ips.append("%s/%s" % ( str(alias.alias_v4address), str(alias.alias_v4netmaskbit), )) return ips def get_ipv6_addresses(self): """ Includes IPv6 addresses in aliases """ ips = [] if self.int_ipv6address: ips.append("%s/%s" % ( str(self.int_ipv6address), str(self.int_v6netmaskbit), )) for alias in self.alias_set.exclude(alias_v6address=''): ips.append("%s/%s" % ( str(alias.alias_v6address), str(alias.alias_v6netmaskbit), )) return ips def get_media_status(self): return notifier().iface_media_status(self.int_interface)
class Interfaces(Model): int_interface = models.CharField(max_length=300, blank=False, verbose_name=_("NIC"), help_text=_("Pick your NIC")) int_name = models.CharField(max_length="120", verbose_name=_("Interface Name"), help_text=_("Name your NIC.")) int_dhcp = models.BooleanField( verbose_name=_("DHCP"), help_text=_("When enabled, use DHCP to obtain IPv4 address as well" " as default router, etc.")) int_ipv4address = IPAddressField( verbose_name=_("IPv4 Address"), blank=True, default='', ) int_v4netmaskbit = models.CharField(max_length=3, choices=choices.v4NetmaskBitList, blank=True, default='', verbose_name=_("IPv4 Netmask"), help_text="") int_ipv6auto = models.BooleanField( verbose_name=_("Auto configure IPv6"), help_text=_("When enabled, automatically configurate IPv6 address " "via rtsol(8).")) int_ipv6address = IPAddressField( verbose_name=_("IPv6 Address"), blank=True, default='', ) int_v6netmaskbit = models.CharField(max_length=4, choices=choices.v6NetmaskBitList, blank=True, default='', verbose_name=_("IPv6 Prefix Length"), help_text="") int_options = models.CharField(max_length=120, verbose_name=_("Options"), blank=True) def __unicode__(self): return u'%s' % self.int_name def __init__(self, *args, **kwargs): super(Interfaces, self).__init__(*args, **kwargs) self._original_int_options = self.int_options def delete(self): with transaction.commit_on_success(): for lagg in self.lagginterface_set.all(): lagg.delete() if self.id: super(Interfaces, self).delete() notifier().stop("netif") notifier().start("network") def save(self, *args, **kwargs): super(Interfaces, self).save(*args, **kwargs) if self._original_int_options != self.int_options and \ re.search(r'mtu \d+', self._original_int_options) and \ self.int_options.find("mtu") == -1: notifier().interface_mtu(self.int_interface, "1500") class Meta: verbose_name = _("Interface") verbose_name_plural = _("Interfaces") ordering = ["int_interface"] def get_ipv4_addresses(self): """ Includes IPv4 addresses in aliases """ ips = [] if self.int_ipv4address: ips.append("%s/%s" % ( str(self.int_ipv4address), str(self.int_v4netmaskbit), )) for alias in self.alias_set.exclude(alias_v4address=''): ips.append("%s/%s" % ( str(alias.alias_v4address), str(alias.alias_v4netmaskbit), )) return ips def get_ipv6_addresses(self): """ Includes IPv6 addresses in aliases """ ips = [] if self.int_ipv6address: ips.append("%s/%s" % ( str(self.int_ipv6address), str(self.int_v6netmaskbit), )) for alias in self.alias_set.exclude(alias_v6address=''): ips.append("%s/%s" % ( str(alias.alias_v6address), str(alias.alias_v6netmaskbit), )) return ips