From 84557e86259a3278f7abf9219f0862cdba358a3e33d22430a04b1fbdfd21d6e0 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Tue, 27 Aug 2024 10:53:36 -0400 Subject: [PATCH] Initial commit. --- .gitignore | 2 + Chart.yaml | 14 ++ README.md | 2 + templates/config.yaml | 251 +++++++++++++++++++ templates/pod.yaml | 35 +++ values-example.yaml | 233 ++++++++++++++++++ values.schema.json | 554 ++++++++++++++++++++++++++++++++++++++++++ values.yaml | 0 8 files changed, 1091 insertions(+) create mode 100644 .gitignore create mode 100644 Chart.yaml create mode 100644 README.md create mode 100644 templates/config.yaml create mode 100644 templates/pod.yaml create mode 100644 values-example.yaml create mode 100644 values.schema.json create mode 100644 values.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a9cec2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*~ +.*.sw* diff --git a/Chart.yaml b/Chart.yaml new file mode 100644 index 0000000..601ff85 --- /dev/null +++ b/Chart.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: v2 +version: "2024.8.0" +appVersion: "2.17" +name: radvd +description: Linux IPv6 Router Advertisement Daemon +type: application +keywords: + - routing + - network +maintainers: + - name: Jeff Mahoney + email: jeffm@jeffm.io + url: https://github.com/jeff_mahoney diff --git a/README.md b/README.md new file mode 100644 index 0000000..d1b8eb3 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +Helm Chart for RADVD +-------------------- diff --git a/templates/config.yaml b/templates/config.yaml new file mode 100644 index 0000000..8f30608 --- /dev/null +++ b/templates/config.yaml @@ -0,0 +1,251 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Chart.Name }}-config-{{ .Release.Name }} +data: + config: |- + {{- $defaultInterfaceOptions := dict }} + {{- $defaultPrefixOptions := dict }} + {{- $defaultRouteOptions := dict }} + {{- $defaultRdnssOptions := dict }} + {{- $defaultDnsslOptions := dict }} + {{- $defaultAbroOptions := dict }} + {{- if $.Values.defaults }} + {{- range $name, $value := $.Values.defaults.interfaces }} + {{- $_ := set $defaultInterfaceOptions $name $value }} + {{- end }} + {{- range $name, $value := $.Values.defaults.prefixes }} + {{- $_ := set $defaultPrefixOptions $name $value }} + {{- end }} + {{- range $name, $value := $.Values.defaults.routes }} + {{- $_ := set $defaultRouteOptions $name $value }} + {{- end }} + {{- range $name, $value := $.Values.defaults.rdnss }} + {{- $_ := set $defaultRdnssOptions $name $value }} + {{- end }} + {{- range $name, $value := $.Values.defaults.dnssl }} + {{- $_ := set $defaultDnsslOptions $name $value }} + {{- end }} + {{- range $name, $value := $.Values.defaults.abro }} + {{- $_ := set $defaultAbroOptions $name $value }} + {{- end }} + {{- end }} + {{- range $interface := .Values.interfaces }} + interface {{ $interface.name }} { + {{- $interfaceOptions := dict }} + {{- range $name, $value := $interface.options }} + {{- $_ := set $interfaceOptions $name $value }} + {{- end }} + {{- $_ := merge $interfaceOptions $defaultInterfaceOptions $interfaceOptions }} + {{- if hasKey $interfaceOptions "IgnoreIfMissing" }} + IgnoreIfMissing {{get $interfaceOptions "IgnoreIfMissing" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "AdvSendAdvert" }} + AdvSendAdvert {{get $interfaceOptions "AdvSendAdvert" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "UnicastOnly" }} + UnicastOnly {{get $interfaceOptions "UnicastOnly" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "AdvRASolicitedUnicast" }} + AdvRASolicitedUnicast {{get $interfaceOptions "AdvRASolicitedUnicast" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "MaxRtrAdvInterval" }} + MaxRtrAdvInterval {{get $interfaceOptions "MaxRtrAdvInterval" | float64 }}; # seconds + {{- end }} + {{- if hasKey $interfaceOptions "MinRtrAdvInterval" }} + MinRtrAdvInterval {{get $interfaceOptions "MinRtrAdvInterval" | float64 }}; # seconds + {{- end }} + {{- if hasKey $interfaceOptions "MinDelayBetweenRAs" }} + MinDelayBetweenRAs {{get $interfaceOptions "MinDelayBetweenRAs" | float64 }}; # seconds + {{- end }} + {{- if hasKey $interfaceOptions "AdvManagedFlag" }} + AdvManagedFlag {{get $interfaceOptions "AdvManagedFlag" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "AdvOtherConfigFlag" }} + AdvOtherConfigFlag {{get $interfaceOptions "AdvOtherConfigFlag" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "AdvLinkMTU" }} + AdvLinkMTU {{get $interfaceOptions "AdvLinkMTU" | int}}; # integer + {{- end }} + {{- if hasKey $interfaceOptions "AdvReachableTime" }} + AdvReachableTime {{get $interfaceOptions "AdvReachableTime" | int }}; # milliseconds + {{- end }} + {{- if hasKey $interfaceOptions "AdvRetransTimer" }} + AdvRetransTimer {{get $interfaceOptions "AdvRetransTimer" | int }}; # milliseconds + {{- end }} + {{- if hasKey $interfaceOptions "AdvCurHopLimit" }} + AdvCurHopLimit {{get $interfaceOptions "AdvCurHopLimit" | int }}; # integer + {{- end }} + {{- if hasKey $interfaceOptions "AdvDefaultLifetime" }} + AdvDefaultLifetime {{get $interfaceOptions "AdvDefaultLifetime" | int }}; # seconds + {{- end }} + {{- if hasKey $interfaceOptions "AdvDefaultPreference" }} + AdvDefaultPreference {{get $interfaceOptions "AdvDefaultPreference" }}; # low|medium|high + {{- end }} + {{- if hasKey $interfaceOptions "AdvSourceLLAddress" }} + AdvSourceLLAddress {{get $interfaceOptions "AdvSourceLLAddress" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "AdvHomeAgentFlag" }} + AdvHomeAgentFlag {{get $interfaceOptions "AdvHomeAgentFlag" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "AdvHomeAgentInfo" }} + AdvHomeAgentInfo {{get $interfaceOptions "AdvHomeAgentInfo" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "HomeAgentLifetime" }} + HomeAgentLifetime {{get $interfaceOptions "HomeAgentLifetime" | int}}; # seconds + {{- end }} + {{- if hasKey $interfaceOptions "HomeAgentPreference" }} + HomeAgentPreference {{get $interfaceOptions "HomeAgentPreference" | int}}; # integer + {{- end }} + {{- if hasKey $interfaceOptions "AdvMobRtrSupportFlag" }} + AdvMobRtrSupportFlag {{get $interfaceOptions "AdvMobRtrSupportFlag" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $interfaceOptions "AdvIntervalOpt" }} + AdvIntervalOpt {{get $interfaceOptions "AdvIntervalOpt" | ternary "on" "off" }}; + {{- end }} + + {{- range $prefix := $interface.prefixes }} + prefix {{ $prefix.prefix }} { + {{- $prefixOptions := dict }} + {{- range $name, $value := $prefix.options }} + {{- $_ := set $prefixOptions $name $value }} + {{- end }} + {{- $_ := merge $prefixOptions $defaultPrefixOptions $prefixOptions }} + {{- if hasKey $prefixOptions "AdvOnLink" }} + AdvOnLink {{get $prefixOptions "AdvOnLink" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $prefixOptions "AdvAutonomous" }} + AdvAutonomous {{get $prefixOptions "AdvAutonomous" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $prefixOptions "AdvRouterAddr" }} + AdvRouterAddr {{get $prefixOptions "AdvRouterAddr" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $prefixOptions "AdvValidLifetime" }} + {{- if kindIs "string" (get $prefixOptions "AdvValidLifetime") }} + AdvValidLifetime {{get $prefixOptions "AdvValidLifetime" }}; # seconds|infinity + {{- else }} + AdvValidLifetime {{get $prefixOptions "AdvValidLifetime" | int}}; # seconds|infinity + {{- end }} + {{- end }} + {{- if hasKey $prefixOptions "AdvPreferredLifetime" }} + {{- if kindIs "string" (get $prefixOptions "AdvValidLifetime") }} + AdvPreferredLifetime {{get $prefixOptions "AdvPreferredLifetime" }}; # seconds|infinity + {{- else }} + AdvPreferredLifetime {{get $prefixOptions "AdvPreferredLifetime" | int}}; # seconds|infinity + {{- end }} + {{- end }} + {{- if hasKey $prefixOptions "DeprecatePrefix" }} + DeprecatePrefix {{get $prefixOptions "DeprecatePrefix" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $prefixOptions "DecrementLifetimes" }} + DecrementLifetimes {{get $prefixOptions "DecrementLifetimes" | ternary "on" "off" }}; + {{- end }} + {{- if hasKey $prefixOptions "Base6Interface" }} + Base6Interface {{get $prefixOptions "Base6Interface" }}; # name + {{- end }} + {{- if hasKey $prefixOptions "Base6to4Interface" }} + Base6to4Interface {{get $prefixOptions "Base6to4Interface" }}; # name + {{- end }} + } + {{- end }} + + {{- range $route := $interface.routes }} + route {{ $route.route }} { + {{- $routeOptions := dict }} + {{- range $name, $value := $route.options }} + {{- $_ := set $routeOptions $name $value }} + {{- end }} + {{- $_ := merge $routeOptions $defaultRouteOptions $routeOptions }} + {{- if hasKey $routeOptions "AdvRouteLifetime" }} + {{- if kindIs "string" (get $routeOptions "AdvRouteLifetime") }} + AdvRouteLifetime {{get $routeOptions "AdvRouteLifetime" }}; # seconds|infinity + {{- else }} + AdvRouteLifetime {{get $routeOptions "AdvRouteLifetime" | int}}; # seconds|infinity + {{- end }} + {{- end }} + {{- if hasKey $routeOptions "AdvRoutePreference" }} + AdvRoutePreference {{get $routeOptions "AdvRoutePreference" }}; # low|medium|high + {{- end }} + {{- if hasKey $routeOptions "RemoveRoute" }} + RemoveRoute {{get $routeOptions "RemoveRoute" | ternary "on" "off" }}; + {{- end }} + } + {{- end }} + + {{- range $rdnss := $interface.rdnss }} + RDNSS {{ join " " $rdnss.addresses }} { + {{- $rdnssOptions := dict }} + {{- range $name, $value := $rdnss.options }} + {{- $_ := set $rdnssOptions $name $value }} + {{- end }} + {{- $_ := merge $rdnssOptions $defaultRdnssOptions $rdnssOptions }} + {{- if hasKey $rdnssOptions "AdvRDNSSLifetime" }} + {{- if kindIs "string" (get $rdnssOptions "AdvRDNSSLifetime") }} + AdvRDNSSLifetime {{get $rdnssOptions "AdvRDNSSLifetime" }}; # seconds|infinity + {{- else }} + AdvRDNSSLifetime {{get $rdnssOptions "AdvRDNSSLifetime" | int }}; # seconds|infinity + {{- end }} + {{- end }} + {{- if hasKey $rdnssOptions "FlushRDNSS" }} + FlushRDNSS {{get $rdnssOptions "FlushRDNSS" | ternary "on" "off" }}; + {{- end }} + } + {{- end }} + + {{- range $dnssl := .dnssl }} + DNSSL {{ join " " $dnssl.suffixes }} { + {{- $dnsslOptions := dict }} + {{- range $name, $value := $dnssl.options }} + {{- $_ := set $dnsslOptions $name $value }} + {{- end }} + {{- $_ := merge $dnsslOptions $defaultDnsslOptions $dnsslOptions }} + {{- if hasKey $dnsslOptions "AdvDNSSLLifetime" }} + {{ $val := get $dnsslOptions "AdvDNSSLifetime" }} + {{- if kindIs "string" $val }} + AdvDNSSLLifetime {{ $val }}; # seconds|infinity; + {{- else }} + AdvDNSSLLifetime {{ $val | int }}; # seconds|infinity; + {{- end }} + {{- end }} + {{- if hasKey $dnsslOptions "FlushDNSSL" }} + FlushDNSSL {{get $dnsslOptions "FlushDNSSL" | ternary "on" "off" }}; + {{- end }} + } + {{- end }} + + {{- range $abro := .abro }} + {{- $abroOptions := dict }} + {{- range $name, $value := $abro.options }} + {{- $_ := set $abroOptions $name $value }} + {{- end }} + {{- $_ := merge $abroOptions $defaultAbroOptions $abroOptions }} + abro {{ $abro.address }} { + {{- if hasKey $abroOptions "AdvValidLifeTime" }} + AdvValidLifeTime {{get $abroOptions "AdvValidLifeTime" | int }}; # seconds + {{- end }} + {{- if hasKey $abroOptions "AdvVersionLow" }} + AdvVersionLow {{get $abroOptions "AdvVersionLow" | int }}; # unsignedinteger + {{- end }} + {{- if hasKey $abroOptions "AdvVersionHigh" }} + AdvVersionHigh {{get $abroOptions "AdvVersionHigh" | int }}; # unsignedinteger + {{- end }} + } + {{- end }} + + {{- if $interface.clients }} + clients { + {{- range $client := $interface.clients }} + {{- $client }}; + {{- end }} + } + {{- end }} + + {{- if $interface.AdvRASrcAddresses }} + AdvRASrcAddress { + {{- range $address := $interface.AdvRASrcAddresses }} + {{- $address }}; + {{- end }} + } + {{- end }} + } + {{- end }} diff --git a/templates/pod.yaml b/templates/pod.yaml new file mode 100644 index 0000000..fd3a653 --- /dev/null +++ b/templates/pod.yaml @@ -0,0 +1,35 @@ +apiVersion: v1 +kind: Pod +metadata: + name: radvd +spec: + hostNetwork: true + containers: + - name: radvd + image: radvd + command: + - "/usr/bin/radvd" + - "-C" + - "/etc/radvd.conf" + {{- if .Values.debugLevel }} + - "-d" + - {{- .Values.debugLevel | quote }} + {{- end }} + securityContext: + capabilities: + add: + - NET_BIND_SERVICE + - NET_RAW + volumeMounts: + - name: config-volume + mountPath: /etc/radvd.conf + volumes: + - name: config-volume + configMap: + # Provide the name of the ConfigMap containing the files you want + # to add to the container + name: {{ .Chart.Name}}-config-{{ .Release.Name }} + {{- if .Values.nodeSelector }} + nodeSelector: + {{- .Values.nodeSelector | toYaml | nindent 4 }} + {{- end }} diff --git a/values-example.yaml b/values-example.yaml new file mode 100644 index 0000000..64a45b7 --- /dev/null +++ b/values-example.yaml @@ -0,0 +1,233 @@ +defaults: + interfaces: + IgnoreIfMissing: true + AdvSendAdvert: false + UnicastOnly: false + AdvRASolicitedUnicast: true + MaxRtrAdvInterval: 600 + MinRtrAdvInterval: 200 + MinDelayBetweenRAs: 3 + AdvManagedFlag: false + AdvOtherConfigFlag: false + AdvLinkMTU: 0 + AdvReachableTime: 0 + AdvRetransTimer: 0 + AdvCurHopLimit: 64 + AdvDefaultLifetime: 1800 + AdvDefaultPreference: "medium" + AdvSourceLLAddress: true + AdvHomeAgentFlag: false + AdvHomeAgentInfo: false + HomeAgentLifetime: 1800 + HomeAgentPreference: 0 + AdvMobRtrSupportFlag: false + AdvIntervalOpt: false + prefixes: + AdvOnLink: true + AdvAutonomous: true + AdvRouterAddr: false + AdvValidLifetime: 86400 + AdvPreferredLifetime: 14400 + DeprecatePrefix: false + DecrementLifetimes: false + routes: + AdvRouteLifetime: 1800 + AdvRoutePreference: "medium" + RemoveRoute: true + rdnss: + AdvRDNSSLifetime: 1200 + FlushRDNSS: true + dnssl: + AdvDNSSLLifetime: 1200 + FlushDNSSL: true + abro: + AdvValidLifeTime: 0 + AdvVersionLow: 0 + AdvVersionHigh: 0 + +interfaces: + - name: eth0 + options: + IgnoreIfMissing: true + AdvSendAdvert: false + UnicastOnly: false + AdvRASolicitedUnicast: true + MaxRtrAdvInterval: 600 + MinRtrAdvInterval: 200 + MinDelayBetweenRAs: 3 + AdvManagedFlag: false + AdvOtherConfigFlag: false + AdvLinkMTU: 0 + AdvReachableTime: 0 + AdvRetransTimer: 0 + AdvCurHopLimit: 64 + AdvDefaultLifetime: 1800 + AdvDefaultPreference: "medium" + AdvSourceLLAddress: true + AdvHomeAgentFlag: false + AdvHomeAgentInfo: false + HomeAgentLifetime: 1800 + HomeAgentPreference: 0 + AdvMobRtrSupportFlag: false + AdvIntervalOpt: false + + prefixes: + - prefix: fe80::/64 + options: + AdvOnLink: true + AdvAutonomous: true + AdvRouterAddr: false + AdvValidLifetime: 86400 + AdvPreferredLifetime: 14400 + DeprecatePrefix: false + DecrementLifetimes: false + - prefix: fd80::/64 + options: + AdvOnLink: true + AdvAutonomous: true + AdvRouterAddr: false + AdvValidLifetime: 86400 + AdvPreferredLifetime: 14400 + DeprecatePrefix: false + DecrementLifetimes: false + routes: + - route: fe80::/64 + options: + AdvRouteLifetime: 1800 + AdvRoutePreference: "medium" + RemoveRoute: true + - route: fd80::/64 + options: + AdvRouteLifetime: 1800 + AdvRoutePreference: "medium" + rdnss: + - addresses: + - fe80::1 + - fe80::2 + options: + AdvRDNSSLifetime: 1200 + FlushRDNSS: true + - addresses: + - fe80::3 + - fe80::4 + options: + AdvRDNSSLifetime: 1200 + FlushRDNSS: true + dnssl: + - suffixes: + - "home.jeffm.io" + - "work.jeffm.io" + options: + AdvDNSSLLifetime: 1200 + FlushDNSSL: true + clients: + - fe80::1 + - fe80::2 + - fe80::3 + - fe80::4 + abro: + - address: fe80::1/64 + options: + AdvValidLifeTime: 0 + AdvVersionLow: 0 + AdvVersionHigh: 0 + - address: fe80::2/64 + options: + AdvValidLifeTime: 0 + AdvVersionLow: 0 + AdvVersionHigh: 0 + - name: eth1 + options: + IgnoreIfMissing: true + AdvSendAdvert: false + UnicastOnly: false + AdvRASolicitedUnicast: true + MaxRtrAdvInterval: 600 + MinRtrAdvInterval: 200 + MinDelayBetweenRAs: 3 + AdvManagedFlag: false + AdvOtherConfigFlag: false + AdvLinkMTU: 0 + AdvReachableTime: 0 + AdvRetransTimer: 0 + AdvCurHopLimit: 64 + AdvDefaultLifetime: 1800 + AdvDefaultPreference: "medium" + AdvSourceLLAddress: true + AdvHomeAgentFlag: false + AdvHomeAgentInfo: false + HomeAgentLifetime: 1800 + HomeAgentPreference: 0 + AdvMobRtrSupportFlag: false + AdvIntervalOpt: false + + prefixes: + - prefix: fe80::/64 + options: + AdvOnLink: true + AdvAutonomous: true + AdvRouterAddr: false + AdvValidLifetime: 86400 + AdvPreferredLifetime: 14400 + DeprecatePrefix: false + DecrementLifetimes: false + - prefix: fd80::/64 + options: + AdvOnLink: true + AdvAutonomous: true + AdvRouterAddr: false + AdvValidLifetime: 86400 + AdvPreferredLifetime: 14400 + DeprecatePrefix: false + DecrementLifetimes: false + routes: + - route: fe80::/64 + options: + AdvRouteLifetime: 1800 + AdvRoutePreference: "medium" + RemoveRoute: true + - route: fd80::/64 + options: + AdvRouteLifetime: 1800 + AdvRoutePreference: "medium" + rdnss: + - addresses: + - fe80::1 + - fe80::2 + options: + AdvRDNSSLifetime: 1200 + FlushRDNSS: true + - addresses: + - fe80::3 + - fe80::4 + options: + AdvRDNSSLifetime: 1200 + FlushRDNSS: true + dnssl: + - suffixes: + - "home.jeffm.io" + - "work.jeffm.io" + options: + AdvDNSSLLifetime: 1200 + FlushDNSSL: true + clients: + - fe80::1 + - fe80::2 + - fe80::3 + - fe80::4 + abro: + - address: fe80::1/64 + options: + AdvValidLifeTime: 0 + AdvVersionLow: 0 + AdvVersionHigh: 0 + - address: fe80::2/64 + options: + AdvValidLifeTime: 0 + AdvVersionLow: 0 + AdvVersionHigh: 0 + AdvRASrcAddresses: + - fe80::1 + - fe80::2 + - fe80::3 + - fe80::4 diff --git a/values.schema.json b/values.schema.json new file mode 100644 index 0000000..9d4392e --- /dev/null +++ b/values.schema.json @@ -0,0 +1,554 @@ +{ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "type": "object", + "title": "Root Schema", + "required": [ + "interfaces" + ], + "properties": { + "nodeSelector": { + "additionalProperties": false, + "title": "Label to use to select node", + "type": "object", + "additionalProperties": { "type": "string" } + }, + "debugLevel": { + "title": "Debug level", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 5 + }, + "defaults": { + "properties": { + "interfaces": { "$ref": "#/$defs/interface_options" }, + "prefixes": { "$ref": "#/$defs/prefix_options" }, + "routes": { "$ref": "#/$defs/route_options" }, + "rdnss": { "$ref": "#/$defs/rdnss_options" }, + "dnssl": { "$ref": "#/$defs/dnssl_options" }, + "abro": { "$ref": "#/$defs/abro_options" } + }, + "additionalProperties": false, + "title": "Default options for each definition", + "type": "object" + }, + "interfaces": { + "type": "array", + "default": [], + "title": "The RADVD configuration schema", + "items": { + "type": "object", + "title": "RADVD per-interface definition", + "required": [ + "name", + "prefixes" + ], + "properties": { + "name": { + "type": "string", + "title": "The interface name", + "examples": [ + "eth0", + "eth1" + ] + }, + "options": { "$ref": "#/$defs/interface_options" }, + "prefixes": { + "type": "array", + "title": "Prefix(es) definition for the interface", + "items": { + "type": "object", + "title": "Configuration for a single prefix", + "required": [ + "prefix" + ], + "properties": { + "prefix": { + "type": "string", + "title": "The IPv6 prefix to be configured", + "examples": [ + "fe80::/64", + "fd80::/64" + ] + }, + "options": { "$ref": "#/$defs/prefix_options" } + }, + "additionalProperties": false + } + }, + "routes": { + "type": "array", + "title": "Route(s) definition for the interface", + "items": { + "type": "object", + "title": "Configuration for a single route", + "required": [ + "route" + ], + "properties": { + "route": { + "type": "string", + "title": "The route to be configured", + "examples": [ + "fe80::/64", + "fd80::/64" + ] + }, + "options": { "$ref": "#/$defs/route_options" } + }, + "additionalProperties": false + } + }, + "rdnss": { + "type": "array", + "title": "Recursive DNS server definitions for this interface", + "items": { + "type": "object", + "title": "Configuration for one set of DNS servers", + "required": [ + "addresses" + ], + "properties": { + "addresses": { + "type": "array", + "title": "Addresses used by this set of DNS servers", + "items": { + "type": "string", + "title": "Address used by a single DNS server", + "format": "ipv6", + "examples": [ + "fe80::1/64", + "fe80::2/64", + "fe80::3/64", + "fe80::4/64" + ] + } + }, + "options": { "$ref": "#/$defs/rdnss_options" } + }, + "additionalProperties": false + } + }, + "dnssl": { + "type": "array", + "title": "DNS Search List definitions for this interface", + "items": { + "type": "object", + "title": "Definition for one set of suffixes", + "required": [ + "suffixes" + ], + "properties": { + "suffixes": { + "type": "array", + "title": "List of DNS suffixes", + "items": { + "type": "string", + "title": "One DNS suffix", + "examples": [ + "example.com", + "subdomain.example.com" + ] + } + }, + "options": { "$ref": "#/$defs/dnssl_options" } + }, + "additionalProperties": false + } + }, + "clients": { + "type": "array", + "title": "Exclusive unicast client Configuration (disables multicast)", + "items": { + "type": "string", + "format": "ipv6", + "title": "One client to add to the unicast list", + "examples": [ + "fe80::1", + "fe80::2", + "fe80::3", + "fe80::4" + ] + } + }, + "abro": { + "type": "array", + "title": "List of Authoritative Border Router Option definitions", + "items": { + "type": "object", + "title": "A single Authoritative Border Router Option definition", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string", + "title": "Address of border router", + "examples": [ + "fe80::1/64", + "fe80::2/64" + ] + }, + "options": { "$ref": "#/$defs/abro_options" } + }, + "additionalProperties": false + } + }, + "AdvRASrcAddresses": { + "type": "array", + "title": "List of acceptable source addresses", + "items": { + "type": "string", + "format": "ipv6", + "title": "One source address", + "examples": [ + "fe80::1", + "fe80::2", + "fe80::3", + "fe80::4" + ] + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "$defs": { + "interface_options": { + "type": "object", + "title": "The options for an interface", + "properties": { + "IgnoreIfMissing": { + "type": "boolean", + "title": "The IgnoreIfMissing Schema", + "default": true + }, + "AdvSendAdvert": { + "type": "boolean", + "title": "Whether or not the router sends periodic router advertisements and responds to router solicitations", + "default": false + }, + "UnicastOnly": { + "type": "boolean", + "title": "Indicates that the interface link type only supports unicast", + "default": false + }, + "AdvRASolicitedUnicast": { + "type": "boolean", + "title": "Indicates that router solicitations will be responded to with unicast router advertisements, as recommended by RFC7772", + "default" : true + }, + "MaxRtrAdvInterval": { + "type": "number", + "title": "Maximum time allowed between sending unsolicited multicast router advertisements from the interface, in seconds", + "default" : 600, + "exclusiveMinimum" : 0 + }, + "MinRtrAdvInterval": { + "type": "number", + "default" : "0.33 * MaxRtrAdvInterval", + "title": "Minimum time allowed between sending unsolicited multicast router advertisements from the interface, in seconds", + "minimum" : 3 + }, + "MinDelayBetweenRAs": { + "type": "integer", + "title": "Minimum time allowed between sending multicast router advertisements, in seconds", + "type" : "number", + "default" : 3, + "exclusiveMinimum" : 0 + }, + "AdvManagedFlag": { + "type": "boolean", + "default" : false, + "title": "When set, hosts use the administered (stateful) protocol for address autoconfiguration in addition to any addresses autoconfigured using stateless address autoconfiguration" + }, + "AdvOtherConfigFlag": { + "type": "boolean", + "default" : false, + "title": "When set, hosts use the administered (stateful) protocol for autoconfiguration of other (non-address) information" + }, + "AdvLinkMTU": { + "type": "integer", + "title": "The MTU option is used in router advertisement messages to insure that all nodes on a link use the same MTU value in those cases where the link MTU is not well known", + "type" : "integer", + "default" : 0, + "minimum" : 0 + }, + "AdvReachableTime": { + "type": "integer", + "title": "The time, in milliseconds, that a node assumes a neighbor is reachable after having received a reachability confirmation", + "type" : "integer", + "default" : 0, + "minimum" : 0, + "maximum" : 3600000 + }, + "AdvRetransTimer": { + "type": "integer", + "default" : 0, + "minimum" : 0, + "title": "The time, in milliseconds, between retransmitted Neighbor Solicitation messages" + }, + "AdvCurHopLimit": { + "type": "integer", + "default" : 64, + "minimum" : 0, + "title": "The default value that should be placed in the Hop Count field of the IP header for outgoing (unicast) IP packets." + }, + "AdvDefaultLifetime": { + "type": "integer", + "title": "The lifetime associated with the default router in units of seconds", + "minimum" : 0, + "maximum": 65520, + "default" : "3 * MaxRtrAdvInterval (Minimum 1 second)" + }, + "AdvDefaultPreference": { + "type": "string", + "title": "The preference associated with the default router", + "enum" : [ "low", "medium", "high" ] + }, + "AdvSourceLLAddress": { + "type": "boolean", + "title": "When set, the link-layer address of the outgoing interface is included in the RA.", + "default" : true + }, + "AdvHomeAgentFlag": { + "type": "boolean", + "title": "When set, indicates that sending router is able to serve as Mobile IPv6 Home Agent", + "default" : false + }, + "AdvHomeAgentInfo": { + "type": "boolean", + "title": "When set, Home Agent Information Option (specified by Mobile IPv6) is included in Router Advertisements. (Requires AdvHomeAgentFlag=true)", + "default": false + }, + "HomeAgentLifetime": { + "type": "integer", + "title": "The length of time in seconds (relative to the time the packet is sent) that the router is offering Mobile IPv6 Home Agent services. (Requires AdvHomeAgentFlag=true)", + "default" : 0 + }, + "HomeAgentPreference": { + "type": "integer", + "title": "The preference for the Home Agent sending this Router Advertisement (Requires AdvHomeAgentFlag=true)", + "default" : 0 + }, + "AdvMobRtrSupportFlag": { + "type": "boolean", + "title": "When set, the Home Agent signals it supports Mobile Router registrations (specified by NEMO Basic). (Requires AdvHomeAgentFlag=true)", + "default": false + }, + "AdvIntervalOpt": { + "type": "boolean", + "title": "When set, Advertisement Interval Option (specified by Mobile IPv6) is included in Router Advertisements", + "default" : false + } + }, + "additionalProperties": false + }, + "prefix_options": { + "type": "object", + "title": "Options for a prefix", + "properties": { + "AdvOnLink": { + "type": "boolean", + "default": true, + "title": "Indicates that this prefix can be used for on-link determination." + }, + "AdvAutonomous": { + "type": "boolean", + "title": "indicates that this prefix can be used for autonomous address configuration as specified in RFC 4862" + }, + "AdvRouterAddr": { + "type": "boolean", + "default": false, + "title": "When set, indicates that the address of interface is sent instead of network prefix, as is required by Mobile IPv6" + }, + "AdvValidLifetime": { + "anyOf" : [ + { + "type": "integer", + "mininum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "enum" : [ "infinity" ] + } + ], + "default": 86400, + "title": "The length of time in seconds (relative to the time the packet is sent) that the prefix is valid for the purpose of on-link determination", + "examples": [ + 86400, + "infinity" + ] + }, + "AdvPreferredLifetime": { + "anyOf" : [ + { + "type": "integer", + "mininum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "enum" : [ "infinity" ] + } + ], + "default": 14400, + "title": "The length of time in seconds (relative to the time the packet is sent) that addresses generated from the prefix via stateless address autoconfiguration remain preferred", + "examples": [ + 14400, + "infinity" + ] + }, + "DeprecatePrefix": { + "type": "boolean", + "title": "Upon shutdown, this option will cause radvd to deprecate the prefix by announcing it in the radvd shutdown RA with a zero preferred lifetime and a valid lifetime slightly greater than 2 hours", + "default": false + }, + "DecrementLifetimes": { + "type": "boolean", + "title": "This option causes radvd to decrement the values of the preferred and valid lifetimes for the prefix over time", + "default": false + }, + "Base6Interface": { + "type": "string", + "title": "This prefix will be combined with the IPv6 address of the interface specified", + "default": null + }, + "Base6to4Interface": { + "type": "string", + "title": "This prefix will be combined with the IPv4 address of interface name to produce a valid 6to4 prefix", + "default": null + } + }, + "additionalProperties": false + }, + "route_options": { + "type": "object", + "title": "Options for a route", + "properties": { + "AdvRouteLifetime": { + "anyOf" : [ + { + "type": "integer", + "mininum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "enum" : [ "infinity" ] + } + ], + "default": "3 * MaxRtrAdvInterval", + "title": "The AdvRouteLifetime Schema", + "examples": [ + 1800, + "infinity" + ] + }, + "AdvRoutePreference": { + "type": "string", + "title": "The preference associated with the default router", + "enum" : [ "low", "medium", "high" ], + "default": "medium" + }, + "RemoveRoute": { + "type": "boolean", + "title": "Upon shutdown, announce this route with a zero second lifetime", + "default": true + } + }, + "additionalProperties": false + }, + "rdnss_options": { + "type": "object", + "title": "Options for this set of DNS servers", + "properties": { + "AdvRDNSSLifetime": { + "anyOf" : [ + { + "type": "integer", + "mininum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "enum" : [ "infinity" ] + } + ], + "default": "2 * MaxRtrAdvInterval", + "title": "The maximum duration how long the RDNSS entries are used for name resolution.", + "examples": [ + 1200, + "infinity" + ] + }, + "FlushRDNSS": { + "type": "boolean", + "title": "Upon shutdown, announce the RDNSS entries with a zero second lifetime", + "default": true + } + }, + "additionalProperties": false + }, + "dnssl_options": { + "type": "object", + "title": "Options for this set of suffixes", + "properties": { + "AdvDNSSLLifetime": { + "anyOf" : [ + { + "type": "integer", + "mininum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "enum" : [ "infinity" ] + } + ], + "default": "2 * MaxRtrAdvInterval", + "title": "The maximum duration how long the DNSSL entries are used for name resolution", + "examples": [ + 1200, + "infinity" + ] + }, + "FlushDNSSL": { + "type": "boolean", + "title": "Upon shutdown, announce the DNSSL entries with a zero second lifetime", + "default": true + } + }, + "additionalProperties": false + }, + "abro_options": { + "type": "object", + "title": "Options for this Authoritative Border Router Option definition", + "properties": { + "AdvValidLifeTime": { + "type": "integer", + "title": "The time in units of that the set of border router information is valid", + "default": 10000 + }, + "AdvVersionLow": { + "type": "integer", + "title": "The lower 32 bits of a 48-bit version number corresponding to the set of information contained in RA message", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "AdvVersionHigh": { + "type": "integer", + "title": "The upper 16 bits of a 48-bit version number corresponding to the set of information contained in RA message", + "default": 0, + "minimum": 0, + "maximumExclusive": 65536 + } + }, + "additionalProperties": false + } + } +} diff --git a/values.yaml b/values.yaml new file mode 100644 index 0000000..473a0f4