Esempio n. 1
0
    def write_ifup_routes_file(self, settings, prefix=""):
        """write_ifup_routes_file writes /etc/config/ifup.d/10-default-route"""
        filename = prefix + self.ifup_routes_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        self.ifup_route_file = open(filename, "w+")
        file = self.ifup_route_file
        file.write("#!/bin/sh")
        file.write("\n\n")
        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")
        file.write("\n")
        file.write(". /lib/functions/network.sh\n")
        file.write("\n")
        file.write("INTERFACE=$1\n")
        file.write("DEVICE=$2\n")
        file.write("\n")

        if get_number_of_wans(settings) == 1:
            file.write("\n# Only one wan, do nothing\n\n")
        else:
            file.write("TMPFILE=`mktemp -t default-route.XXXXXX`\n")
            file.write("\n")
            file.write("write_rules()\n")
            file.write("{\n")
            file.write("\tnft -f $TMPFILE\n")
            file.write("\tretval=$?\n")
            file.write("\twhile [ $retval -ne 0 ] ; do\n")
            file.write("\t\tnft -f $TMPFILE\n")
            file.write("\t\tretval=$?\n")
            file.write("\tdone\n")
            file.write("\trm $TMPFILE\n")
            file.write("\texit 0\n")
            file.write("}\n\n")

            interfaces = settings.get('network').get('interfaces')
            for intf in interfaces:
                if enabled_wan(intf):
                    if intf.get('v4ConfigType') != 'DISABLED':
                        self.create_ifup_default_route(
                            file, intf.get('interfaceId'),
                            network_util.get_interface_name(
                                settings, intf, 'ipv4'), "ip")

                    if intf.get('v6ConfigType') != 'DISABLED':
                        self.create_ifup_default_route(
                            file, intf.get('interfaceId'),
                            network_util.get_interface_name(
                                settings, intf, 'ipv6'), "ip6")

        file.flush()
        file.close()
        os.chmod(filename, os.stat(filename).st_mode | stat.S_IEXEC)

        print("%s: Wrote %s" % (self.__class__.__name__, filename))
Esempio n. 2
0
    def write_wireless_file(self, settings, prefix=""):
        filename = prefix + self.wireless_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        self.network_file = open(filename, "w+")
        file = self.network_file
        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")

        file.write("\n")

        interfaces = settings['network']['interfaces']
        devidx = 0
        for intf in interfaces:
            if intf.get('type') == 'WIFI':
                file.write("config wifi-device 'radio%d'\n" % devidx)
                file.write("\toption type 'mac80211'\n")
                file.write("\toption channel '%s'\n" % intf['wirelessChannel'])
                file.write("\toption hwmode '%s'\n" % self.get_hwmode(intf))
                file.write("\t%s\n" % self.get_device_id(intf))
                file.write("%s" % self.get_htmode(intf))
                if intf.get('configType') == 'DISABLED':
                    file.write("\toption disabled '1'\n")
                else:
                    file.write("\toption disabled '0'\n")
                self.write_country(file)
                file.write("\n")
                file.write("config wifi-iface 'default_radio%d'\n" % devidx)
                file.write("\toption device 'radio%d'\n" % devidx)
                file.write("\toption ifname '%s'\n" % intf.get('device'))
                if intf.get('configType') == 'BRIDGED':
                    file.write("\toption network '%s'\n" % (network_util.get_bridge_name(settings, intf)))
                elif intf.get('configType') == 'ADDRESSED':
                    file.write("\toption network '%s'\n" % (network_util.get_interface_name(settings, intf)))
                if intf.get('wirelessMode') == 'AP':
                    file.write("\toption mode 'ap'\n")
                else:
                    file.write("\toption mode 'sta'\n")
                file.write("\toption ssid '%s'\n" % intf.get('wirelessSsid'))
                if intf.get('wirelessEncryption') == 'NONE':
                    file.write("\toption encryption 'none'\n")
                elif intf.get('wirelessEncryption') == 'WPA1':
                    file.write("\toption encryption 'psk'\n")
                    file.write("\toption key '%s'\n" % intf.get('wirelessPassword'))
                elif intf.get('wirelessEncryption') == 'WPA12':
                    file.write("\toption encryption 'psk-mixed+tkip+ccmp'\n")
                    file.write("\toption key '%s'\n" % intf.get('wirelessPassword'))
                else:
                    file.write("\toption encryption 'psk2'\n")
                    file.write("\toption key '%s'\n" % intf.get('wirelessPassword'))
                self.write_macaddr(file, intf.get('macaddr'))
                file.write("\n")
                devidx += 1

        file.flush()
        file.close()

        print("%s: Wrote %s" % (self.__class__.__name__, filename))
Esempio n. 3
0
    def write_ifup_routes_file(self, settings, prefix=""):
        """write_ifup_routes_file writes /etc/config/ifup.d/10-default-route"""
        filename = prefix + self.ifup_routes_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        self.ifup_route_file = open(filename, "w+")
        file = self.ifup_route_file
        file.write("#!/bin/sh")
        file.write("\n\n")
        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")
        file.write("\n")
        file.write(". /lib/functions/network.sh\n")
        file.write("\n")
        file.write("INTERFACE=$1\n")
        file.write("DEVICE=$2\n")
        file.write("\n")

        if get_number_of_wans(settings) == 1:
            file.write("\n# Only one wan, do nothing\n\n")
        else:
            interfaces = settings.get('network').get('interfaces')
            for intf in interfaces:
                if enabled_wan(intf):
                    file.write("[ %s = \"$INTERFACE\" ] && {\n" %
                               network_util.get_interface_name(settings, intf))
                    file.write(
                        "\tnft list chain inet wan-routing route-to-default-wan | grep -q mark-for-wan- || {\n"
                    )
                    file.write(
                        "\t\tnft flush chain inet wan-routing route-to-default-wan\n"
                    )
                    file.write(
                        "\t\tnft add rule inet wan-routing route-to-default-wan dict sessions ct id wan_policy long_string set system-default\n"
                    )
                    file.write(
                        "\t\tnft add rule inet wan-routing route-to-default-wan jump mark-for-wan-%d\n"
                        % intf.get('interfaceId'))
                    file.write("\t}\n")
                    file.write("\texit 0\n")
                    file.write("}\n\n")

        file.flush()
        file.close()
        os.chmod(filename, os.stat(filename).st_mode | stat.S_IEXEC)

        print("%s: Wrote %s" % (self.__class__.__name__, filename))
Esempio n. 4
0
    def write_ifup_routes_file(self, settings, prefix=""):
        """write_ifup_routes_file writes /etc/config/ifup.d/10-default-route"""
        filename = prefix + self.ifup_routes_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        self.ifup_route_file = open(filename, "w+")
        file = self.ifup_route_file
        file.write("#!/bin/sh")
        file.write("\n\n")
        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")
        file.write("\n")
        file.write(". /lib/functions/network.sh\n")
        file.write("\n")
        file.write("INTERFACE=$1\n")
        file.write("DEVICE=$2\n")
        file.write("\n")

        if get_number_of_wans(settings) == 1:
            file.write("\n# Only one wan, do nothing\n\n")
        else:
            interfaces = settings.get('network').get('interfaces')
            for intf in interfaces:
                if enabled_wan(intf):
                    file.write("[ %s = \"$INTERFACE\" ] && {\n" % network_util.get_interface_name(settings, intf))
                    file.write("\tnft list chain inet wan-routing route-to-default-wan | grep -q mark-for-wan- || {\n")
                    file.write("\t\tnft flush chain inet wan-routing route-to-default-wan\n")
                    file.write("\t\tnft add rule inet wan-routing route-to-default-wan dict sessions ct id wan_policy long_string set system-default\n")
                    file.write("\t\tnft add rule inet wan-routing route-to-default-wan jump mark-for-wan-%d\n" % intf.get('interfaceId'))
                    file.write("\t}\n")
                    file.write("\texit 0\n")
                    file.write("}\n\n")

        file.flush()
        file.close()
        os.chmod(filename, os.stat(filename).st_mode | stat.S_IEXEC)

        print("%s: Wrote %s" % (self.__class__.__name__, filename))
Esempio n. 5
0
    def write_wireless_file(self, settings, prefix=""):
        filename = prefix + self.wireless_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        self.network_file = open(filename, "w+")
        file = self.network_file
        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")

        file.write("\n")

        interfaces = settings['network']['interfaces']
        devidx = 0
        for intf in interfaces:
            if intf.get('type') == 'WIFI':
                file.write("config wifi-device 'radio%d'\n" % devidx)
                file.write("\toption type 'mac80211'\n")
                file.write("\toption channel '%s'\n" % intf['wirelessChannel'])
                file.write("\toption hwmode '%s'\n" % self.get_hwmode(intf))
                file.write("\t%s\n" % self.get_device_id(intf))
                thruput = intf.get('wirelessThroughput')
                if thruput == None or thruput == "" or thruput == "AUTO":
                    file.write("%s" % self.get_htmode(intf))
                else:
                    file.write("\toption htmode '%s'\n" % thruput)
                if not intf.get('enabled'):
                    file.write("\toption disabled '1'\n")
                else:
                    file.write("\toption disabled '0'\n")
                self.write_country(file)
                file.write("\n")
                file.write("config wifi-iface 'default_radio%d'\n" % devidx)
                file.write("\toption device 'radio%d'\n" % devidx)
                file.write("\toption ifname '%s'\n" % intf.get('device'))
                if intf.get('configType') == 'BRIDGED':
                    file.write("\toption network '%s'\n" % (network_util.get_bridge_name(settings, intf)))
                elif intf.get('configType') == 'ADDRESSED':
                    file.write("\toption network '%s'\n" % (network_util.get_interface_name(settings, intf, 'ipv4')))
                if intf.get('wirelessMode') == 'AP':
                    file.write("\toption mode 'ap'\n")
                else:
                    file.write("\toption mode 'sta'\n")
                file.write("\toption ssid '%s'\n" % intf.get('wirelessSsid'))
                if intf.get('wirelessEncryption') == 'NONE':
                    file.write("\toption encryption 'none'\n")
                elif intf.get('wirelessEncryption') == 'WPA1':
                    file.write("\toption encryption 'psk'\n")
                    file.write("\toption key '%s'\n" % intf.get('wirelessPassword'))
                elif intf.get('wirelessEncryption') == 'WPA12':
                    file.write("\toption encryption 'psk-mixed+tkip+ccmp'\n")
                    file.write("\toption key '%s'\n" % intf.get('wirelessPassword'))
                else:
                    file.write("\toption encryption 'psk2'\n")
                    file.write("\toption key '%s'\n" % intf.get('wirelessPassword'))
                self.write_macaddr(file, intf.get('macaddr'))
                file.write("\n")
                devidx += 1

        file.flush()
        file.close()

        print("%s: Wrote %s" % (self.__class__.__name__, filename))
Esempio n. 6
0
    def write_ifdown_routes_file(self, settings, prefix=""):
        """write_ifdown_routes_file writes /etc/config/ifdown.d/10-default-route"""
        filename = prefix + self.ifdown_routes_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        self.ifdown_route_file = open(filename, "w+")
        file = self.ifdown_route_file
        file.write("#!/bin/sh")
        file.write("\n\n")
        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")
        file.write("\n")
        file.write(". /lib/functions/network.sh\n")
        file.write("\n")
        file.write("INTERFACE=$1\n")

        if get_number_of_wans(settings) == 1:
            file.write("\n# Only one wan, do nothing\n\n")
        else:
            file.write("TMPFILE=`mktemp -t default-route.XXXXXX`\n")
            file.write("\n")
            file.write("write_rules()\n")
            file.write("{\n")
            file.write("\tnft -f $TMPFILE\n")
            file.write("\tretval=$?\n")
            file.write("\twhile [ $retval -ne 0 ] ; do\n")
            file.write("\t\tnft -f $TMPFILE\n")
            file.write("\t\tretval=$?\n")
            file.write("\tdone\n")
            file.write("\trm $TMPFILE\n")
            file.write("\texit 0\n")
            file.write("}\n\n")
            file.write("update_default_route()\n")
            file.write("{\n")
            file.write("\n")
            file.write(
                "\techo flush chain inet wan-routing route-to-default-wan >> $TMPFILE\n"
            )

            interfaces = settings.get('network').get('interfaces')
            for intf in interfaces:
                if enabled_wan(intf):
                    file.write("\tnetwork_is_up %s && {\n" %
                               network_util.get_interface_name(settings, intf))
                    file.write(
                        "\t\techo add rule inet wan-routing route-to-default-wan dict sessions ct id wan_policy long_string set system-default >> $TMPFILE\n"
                    )
                    file.write(
                        "\t\techo add rule inet wan-routing route-to-default-wan jump mark-for-wan-%d >> $TMPFILE\n"
                        % intf.get('interfaceId'))
                    file.write("\t\twrite_rules\n")
                    file.write("\t}\n\n")

            file.write("}\n\n")

            for intf in interfaces:
                if enabled_wan(intf):
                    file.write("[ %s = \"$INTERFACE\" ] && {\n" %
                               network_util.get_interface_name(settings, intf))
                    file.write(
                        "\tnft list chain inet wan-routing route-to-default-wan | grep -q mark-for-wan-%d && {\n"
                        % intf.get('interfaceId'))
                    file.write("\t\tupdate_default_route\n")
                    file.write("\t}\n")
                    file.write("}\n\n")

            file.write("[ -z \"$INTERFACE\" ] && {\n")
            file.write("\tupdate_default_route\n")
            file.write("}\n\n")

        file.flush()
        file.close()
        os.chmod(filename, os.stat(filename).st_mode | stat.S_IEXEC)

        print("%s: Wrote %s" % (self.__class__.__name__, filename))
Esempio n. 7
0
    def write_wan_manager_file(self, settings, prefix=""):
        """write_wan_manager_file writes /etc/config/wan_manager"""
        filename = prefix + self.wan_manager_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        self.wan_manager_file = open(filename, "w+")
        file = self.wan_manager_file

        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")
        file.write("\n\n")
        file.write("# Make sure default route is up to date\n")
        file.write("/etc/config/ifdown.d/10-default-route")
        file.write("\n\n")

        wan = settings['wan']
        policies = wan.get('policies')
        for policy in policies:
            if policy.get('enabled'):
                policyId = policy.get('policyId')
                interfaces = policy.get('interfaces')

                if len(interfaces) == 1 and interfaces[0].get(
                        'interfaceId') == 0:
                    interfaces = get_wan_list(settings)

                for intf in interfaces:
                    interfaceId = intf.get('interfaceId')
                    interfaceName = network_util.get_interface_name(
                        settings, get_interface_by_id(settings, interfaceId))
                    criteria = policy.get('criteria')
                    if criteria is None:
                        file.write("up policy-%d %d %s &\n" %
                                   (policyId, interfaceId, interfaceName))
                    else:
                        down_by_attribute = False
                        for criterion in criteria:
                            if criterion.get('type') == 'ATTRIBUTE':
                                if criterion.get('attribute') == 'VPN':
                                    if intf.get(
                                            'type') != 'OPENVPN' and intf.get(
                                                'type') != 'WIREGUARD':
                                        file.write(
                                            "attribute policy-%d %d %s VPN down &\n"
                                            % (policyId, interfaceId,
                                               interfaceName))
                                        down_by_attribute = True
                                    else:
                                        file.write(
                                            "attribute policy-%d %d %s VPN up &\n"
                                            % (policyId, interfaceId,
                                               interfaceName))
                                elif criterion.get('attribute') == 'NAME':
                                    name_contains = criterion.get(
                                        'name_contains')
                                    if name_contains not in interfaceName:
                                        file.write(
                                            "attribute policy-%d %d %s NAME %s down &\n"
                                            % (policyId, interfaceId,
                                               interfaceName, name_contains))
                                        down_by_attribute = True
                                    else:
                                        file.write(
                                            "attribute policy-%d %d %s NAME %s up &\n"
                                            % (policyId, interfaceId,
                                               interfaceName, name_contains))

                        if down_by_attribute is False:
                            file.write("up policy-%d %d %s &\n" %
                                       (policyId, interfaceId, interfaceName))
                            for criterion in criteria:
                                if criterion.get('type') == 'METRIC':
                                    metric_value = criterion.get(
                                        'metric_value')

                                    metric = criterion.get('metric')
                                    if metric == 'LATENCY':
                                        stat_name = "latency"
                                        metric_name = "1_minute"
                                    elif metric == 'AVAILABLE_BANDWIDTH':
                                        stat_name = "available_bandwidth"
                                        metric_name = "1_minute"
                                    elif metric == 'JITTER':
                                        stat_name = "jitter"
                                        metric_name = "1_minute"
                                    elif metric == 'PACKET_LOSS':
                                        stat_name = "packet_loss"
                                        metric_name = "1_minute"

                                    metric_op = criterion.get('metric_op')
                                    if metric_op == "<":
                                        op = "lt"
                                    elif metric_op == "<=":
                                        op = "le"
                                    elif metric_op == ">":
                                        op = "gt"
                                    elif metric_op == ">=":
                                        op = "ge"

                                    file.write(
                                        "metric policy-%d %d %s %s %s %s %d &\n"
                                        % (policyId, interfaceId,
                                           interfaceName, stat_name,
                                           metric_name, op, metric_value))

                                elif criterion.get('type') == 'CONNECTIVITY':
                                    test_type = criterion.get(
                                        'connectivityTestType')
                                    interval = criterion.get(
                                        'connectivityTestInterval')
                                    timeout = criterion.get(
                                        'connectivityTestTimeout')
                                    threshold = criterion.get(
                                        'connectivityTestFailureThreshold')
                                    target = criterion.get(
                                        'connectivityTestTarget')
                                    if test_type == "PING":
                                        test = "ping"
                                    elif test_type == "HTTP":
                                        test = "http"
                                    elif test_type == "ARP":
                                        test = "arp"
                                    elif test_type == "DNS":
                                        test = "dns"
                                    file.write(
                                        "test policy-%d %d %s %s %d %d %d %s &\n"
                                        % (policyId, interfaceId,
                                           interfaceName, test, interval,
                                           timeout, threshold, target))

                if policy.get('type') == "SPECIFIC_WAN":
                    file.write("specific_wan policy-%d %d &\n" %
                               (policyId, interfaceId))
                elif policy.get('type') == "BEST_OF":
                    best_of_metric = policy.get('best_of_metric')
                    if best_of_metric == "LOWEST_LATENCY":
                        stat_name = "latency"
                        metric_name = "1_minute"
                        op = "le"
                    elif best_of_metric == "LOWEST_JITTER":
                        stat_name = "jitter"
                        metric_name = "1_minute"
                        op = "le"
                    elif best_of_metric == "HIGHEST_AVAILABLE_BANDWIDTH":
                        stat_name = "available_bandwidth"
                        metric_name = "1_minute"
                        op = "ge"
                    elif best_of_metric == "LOWEST_PACKET_LOSS":
                        stat_name = "packet_loss"
                        metric_name = "1_minute"
                        op = "le"
                    file.write("best_of policy-%d %s %s %s &\n" %
                               (policyId, stat_name, metric_name, op))
                elif policy.get('type') == "BALANCE":
                    algorithm = policy.get('balance_algorithm')
                    file.write("balance policy-%d %s &\n" %
                               (policyId, algorithm))

        file.flush()
        file.close()

        print("%s: Wrote %s" % (self.__class__.__name__, filename))
Esempio n. 8
0
    def write_dhcp_file(self, settings, prefix=""):
        """writes prefix/etc/config/dhcp"""
        filename = prefix + self.dhcp_filename
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        system = settings.get('system')
        dns = settings.get('dns')
        dhcp = settings.get('dhcp')

        file = open(filename, "w+")
        file.write("## Auto Generated\n")
        file.write("## DO NOT EDIT. Changes will be overwritten.\n")
        file.write("\n")
        file.write("config dnsmasq\n")

        interfaces = settings['network']['interfaces']

        ## Only enable dns reserver for static Ethernet or PPPoE interfaces,
        ## if those interfaces are enabled.
        dnsmasq_dns_server_template = "\tlist server '{dns_resolver_address}@{device}'\n"
        for intf in interfaces:
            if intf.get('enabled') == True and intf.get(
                    'configType'
            ) == 'ADDRESSED' and intf.get('wan') is True and intf.get(
                    'v4ConfigType') == 'STATIC':
                if intf.get('v4StaticDNS1') != None:
                    file.write(
                        DhcpManager.dnsmasq_dns_server_template.format(
                            dns_resolver_address=intf.get('v4StaticDNS1'),
                            device=intf.get('device')))
                if intf.get('v4StaticDNS2') != None:
                    file.write(
                        DhcpManager.dnsmasq_dns_server_template.format(
                            dns_resolver_address=intf.get('v4StaticDNS2'),
                            device=intf.get('device')))

            if intf.get('enabled') == True and intf.get(
                    'configType'
            ) == 'ADDRESSED' and intf.get('wan') is True and intf.get(
                    'v4ConfigType'
            ) == 'PPPOE' and intf.get('v4PPPoEUsePeerDNS') is False:
                if intf.get('v4PPPoEDNS1') != None:
                    file.write(
                        DhcpManager.dnsmasq_dns_server_template.format(
                            dns_resolver_address=intf.get('v4PPPoEDNS1'),
                            device=intf.get('device')))
                if intf.get('v4PPPoEDNS2') != None:
                    file.write(
                        DhcpManager.dnsmasq_dns_server_template.format(
                            dns_resolver_address=intf.get('v4PPPoEDNS2'),
                            device=intf.get('device')))

        if dns.get('localServers') != None:
            for local_server in dns.get('localServers'):
                file.write("\tlist server '/%s/%s'\n" %
                           (local_server.get('domain'),
                            local_server.get('localServer')))

        if system.get('domainName') != None:
            file.write("\toption domain '%s'\n" % system.get('domainName'))

        file.write("\toption expandhosts '1'\n")
        file.write("\toption nonegcache '0'\n")
        if dhcp.get('dhcpAuthoritative') is True:
            file.write("\toption authoritative '1'\n")
        else:
            file.write("\toption authoritative '0'\n")

        file.write("\tlist interface '*'\n")
        file.write("\toption localise_queries '1'\n")
        file.write("\toption nohosts '1'\n")
        file.write("\toption domainneeded '0'\n")
        file.write("\toption boguspriv '0'\n")
        file.write("\toption filterwin2k '0'\n")
        file.write("\toption readethers '0'\n")
        file.write("\toption rebind_protection '0'\n")
        file.write("\toption rebind_localhost '0'\n")
        file.write("\toption nonwildcard '0'\n")
        file.write("\toption localservice '0'\n")
        file.write("\toption dhcpleasemax '5000'\n")
        file.write("\toption dnsforwardmax '512'\n")
        file.write("\toption leasefile '/tmp/dhcp.leases'\n")
        file.write("\toption resolvfile '/tmp/resolv.conf.auto'\n")
        file.write("\tlist addnhosts '/tmp/hosts.untangle'\n")

        file.write("\n")

        dhcpv6_in_use = False

        # If relay is enabled on a WAN intf. then we need to adjust LAN intf config appropriately
        dhcpv6_relay_enabled = False
        for intf in interfaces:
            if intf.get('v6RelayEnabled'):
                dhcpv6_relay_enabled = True

        for intf in interfaces:
            if intf.get('configType') == 'ADDRESSED':
                interface_name = network_util.get_interface_name(
                    settings, intf, "ipv4")

                file.write("config dhcp '%s'\n" % interface_name)
                if intf.get('dhcpEnabled') is True:
                    if intf.get('v4ConfigType') != 'DISABLED':
                        file.write("\toption interface '%s'\n" %
                                   interface_name)
                        file.write("\toption force 1\n")
                        file.write(
                            "\toption start '%d'\n" %
                            calc_dhcp_range_start(intf.get('v4StaticAddress'),
                                                  intf.get('v4StaticPrefix'),
                                                  intf.get('dhcpRangeStart')))
                        file.write(
                            "\toption limit '%d'\n" %
                            calc_dhcp_range_limit(intf.get('dhcpRangeStart'),
                                                  intf.get('dhcpRangeEnd')))

                        if intf.get('dhcpLeaseDuration') != None and intf.get(
                                'dhcpLeaseDuration') != 0:
                            file.write("\toption leasetime '%d'\n" %
                                       intf.get('dhcpLeaseDuration'))
                        else:
                            file.write("\toption leasetime '3600'\n")

                        if intf.get(
                                'dhcpGatewayOverride') != None and intf.get(
                                    'dhcpGatewayOverride') != "" and intf.get(
                                        'dhcpGatewayOverride') != 0:
                            file.write("\tlist dhcp_option '3,%s'\n" %
                                       intf.get('dhcpGatewayOverride'))
                        else:
                            file.write("\tlist dhcp_option '3,%s'\n" %
                                       intf.get('v4StaticAddress'))

                        if intf.get('dhcpPrefixOverride') != None and intf.get(
                                'dhcpPrefixOverride') != "" and intf.get(
                                    'dhcpPrefixOverride') != 0:
                            file.write("\tlist dhcp_option '1,%s'\n" %
                                       network_util.ipv4_prefix_to_netmask(
                                           intf.get('dhcpPrefixOverride')))
                        else:
                            file.write("\tlist dhcp_option '1,%s'\n" %
                                       network_util.ipv4_prefix_to_netmask(
                                           intf.get('v4StaticPrefix')))

                        if intf.get('dhcpDNSOverride') != None and intf.get(
                                'dhcpDNSOverride') != "":
                            dns_servers = intf.get('dhcpDNSOverride')
                        else:
                            dns_servers = intf.get('v4StaticAddress')

                        file.write("\tlist dhcp_option '6,%s'\n" % dns_servers)

                        if intf.get('dhcpOptions') != None:
                            for dhcp_option in intf.get('dhcpOptions'):
                                if dhcp_option.get(
                                        'enabled'
                                ) is None or not dhcp_option.get('enabled'):
                                    continue
                                file.write("\tlist dhcp_option '%s'\n" %
                                           dhcp_option.get('value'))

                    if intf.get('v6ConfigType') != 'DISABLED':
                        dhcpv6_in_use = True
                        if dhcpv6_relay_enabled:
                            write_relay_options(file, intf.get('wan'))
                        else:
                            file.write("\toption dhcpv6 'server'\n")
                            file.write("\toption ra 'server'\n")

                    file.write("\n")
                else:
                    file.write("\toption interface '%s'\n" % interface_name)
                    # Only add relay options to interfaces that have IPv6 enabled, or if they are a WAN with relay enabled
                    if (intf.get('wan') is False
                            and intf.get('v6ConfigType') is not None
                            and intf.get('v6ConfigType') != 'DISABLED'
                            and dhcpv6_relay_enabled
                        ) or intf.get('v6RelayEnabled'):
                        write_relay_options(file, intf.get('wan'))
                    else:
                        file.write("\toption ignore '1'\n")
                    file.write("\n")

        if dhcpv6_in_use is True:
            file.write("config odhcpd 'odhcpd'\n")
            file.write("\toption maindhcp '0'\n")
            file.write("\toption leasefile '/tmp/hosts/odhcpd'\n")
            file.write("\toption leasetrigger '/usr/sbin/odhcpd-update'\n")
            file.write("\toption loglevel '4'\n")
            file.write("\n")

        if dns.get('staticEntries') != None:
            for entry in dns.get('staticEntries'):
                if entry.get('name') != None and entry.get('address') != None:
                    file.write("config 'domain'\n")
                    file.write("\toption name '%s'\n" % entry.get('name'))
                    file.write("\toption ip '%s'\n" % entry.get('address'))
                    file.write("\n")

        if dhcp.get('staticDhcpEntries') != None:
            for entry in dhcp.get('staticDhcpEntries'):
                if entry.get('macAddress') != None and entry.get(
                        'address') != None:
                    file.write("config 'host'\n")
                    file.write("\toption ip '%s'\n" % entry.get('address'))
                    file.write("\toption mac '%s'\n" % entry.get('macAddress'))
                    file.write("\n")

        file.flush()
        file.close()

        print("%s: Wrote %s" % (self.__class__.__name__, filename))