chore(settings): refactor settings processing (#756)
- Better settings tree structure logged using `qdm12/gotree` - Read settings from environment variables, then files, then secret files - Settings methods to default them, merge them and override them - `DNS_PLAINTEXT_ADDRESS` default changed to `127.0.0.1` to use DoT. Warning added if set to something else. - `HTTPPROXY_LISTENING_ADDRESS` instead of `HTTPPROXY_PORT` (with retro-compatibility)
This commit is contained in:
45
internal/configuration/settings/helpers/belong.go
Normal file
45
internal/configuration/settings/helpers/belong.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func IsOneOf(value string, choices ...string) (ok bool) {
|
||||
for _, choice := range choices {
|
||||
if value == choice {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
var ErrValueNotOneOf = errors.New("value is not one of the possible choices")
|
||||
|
||||
func AreAllOneOf(values, choices []string) (err error) {
|
||||
set := make(map[string]struct{}, len(choices))
|
||||
for _, choice := range choices {
|
||||
choice = strings.ToLower(choice)
|
||||
set[choice] = struct{}{}
|
||||
}
|
||||
|
||||
for _, value := range values {
|
||||
_, ok := set[value]
|
||||
if !ok {
|
||||
return fmt.Errorf("%w: value %q, choices available are %s",
|
||||
ErrValueNotOneOf, value, strings.Join(choices, ", "))
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func Uint16IsOneOf(port uint16, choices []uint16) (ok bool) {
|
||||
for _, choice := range choices {
|
||||
if port == choice {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
190
internal/configuration/settings/helpers/copy.go
Normal file
190
internal/configuration/settings/helpers/copy.go
Normal file
@@ -0,0 +1,190 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/qdm12/golibs/logging"
|
||||
"inet.af/netaddr"
|
||||
)
|
||||
|
||||
func CopyStringPtr(original *string) (copied *string) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = new(string)
|
||||
*copied = *original
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyBoolPtr(original *bool) (copied *bool) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = new(bool)
|
||||
*copied = *original
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyUint8Ptr(original *uint8) (copied *uint8) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = new(uint8)
|
||||
*copied = *original
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyUint16Ptr(original *uint16) (copied *uint16) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = new(uint16)
|
||||
*copied = *original
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyIntPtr(original *int) (copied *int) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = new(int)
|
||||
*copied = *original
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyDurationPtr(original *time.Duration) (copied *time.Duration) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = new(time.Duration)
|
||||
*copied = *original
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyLogLevelPtr(original *logging.Level) (copied *logging.Level) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = new(logging.Level)
|
||||
*copied = *original
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyIP(original net.IP) (copied net.IP) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
copied = make(net.IP, len(original))
|
||||
copy(copied, original)
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyIPNet(original net.IPNet) (copied net.IPNet) {
|
||||
if original.IP != nil {
|
||||
copied.IP = make(net.IP, len(original.IP))
|
||||
copy(copied.IP, original.IP)
|
||||
}
|
||||
|
||||
if original.Mask != nil {
|
||||
copied.Mask = make(net.IPMask, len(original.Mask))
|
||||
copy(copied.Mask, original.Mask)
|
||||
}
|
||||
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyIPNetPtr(original *net.IPNet) (copied *net.IPNet) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
copied = new(net.IPNet)
|
||||
*copied = CopyIPNet(*original)
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyNetaddrIP(original netaddr.IP) (copied netaddr.IP) {
|
||||
b, err := original.MarshalBinary()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = copied.UnmarshalBinary(b)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyIPPrefix(original netaddr.IPPrefix) (copied netaddr.IPPrefix) {
|
||||
b, err := original.MarshalText()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = copied.UnmarshalText(b)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyStringSlice(original []string) (copied []string) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
copied = make([]string, len(original))
|
||||
copy(copied, original)
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyUint16Slice(original []uint16) (copied []uint16) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
copied = make([]uint16, len(original))
|
||||
copy(copied, original)
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyIPNetSlice(original []net.IPNet) (copied []net.IPNet) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
copied = make([]net.IPNet, len(original))
|
||||
for i := range original {
|
||||
copied[i] = CopyIPNet(original[i])
|
||||
}
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyIPPrefixSlice(original []netaddr.IPPrefix) (copied []netaddr.IPPrefix) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
copied = make([]netaddr.IPPrefix, len(original))
|
||||
for i := range original {
|
||||
copied[i] = CopyIPPrefix(original[i])
|
||||
}
|
||||
return copied
|
||||
}
|
||||
|
||||
func CopyNetaddrIPsSlice(original []netaddr.IP) (copied []netaddr.IP) {
|
||||
if original == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
copied = make([]netaddr.IP, len(original))
|
||||
for i := range original {
|
||||
copied[i] = CopyNetaddrIP(original[i])
|
||||
}
|
||||
|
||||
return copied
|
||||
}
|
||||
93
internal/configuration/settings/helpers/default.go
Normal file
93
internal/configuration/settings/helpers/default.go
Normal file
@@ -0,0 +1,93 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/qdm12/golibs/logging"
|
||||
)
|
||||
|
||||
func DefaultInt(existing *int, defaultValue int) (
|
||||
result *int) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
result = new(int)
|
||||
*result = defaultValue
|
||||
return result
|
||||
}
|
||||
|
||||
func DefaultUint8(existing *uint8, defaultValue uint8) (
|
||||
result *uint8) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
result = new(uint8)
|
||||
*result = defaultValue
|
||||
return result
|
||||
}
|
||||
|
||||
func DefaultUint16(existing *uint16, defaultValue uint16) (
|
||||
result *uint16) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
result = new(uint16)
|
||||
*result = defaultValue
|
||||
return result
|
||||
}
|
||||
|
||||
func DefaultBool(existing *bool, defaultValue bool) (
|
||||
result *bool) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
result = new(bool)
|
||||
*result = defaultValue
|
||||
return result
|
||||
}
|
||||
|
||||
func DefaultString(existing string, defaultValue string) (
|
||||
result string) {
|
||||
if existing != "" {
|
||||
return existing
|
||||
}
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
func DefaultStringPtr(existing *string, defaultValue string) (result *string) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
result = new(string)
|
||||
*result = defaultValue
|
||||
return result
|
||||
}
|
||||
|
||||
func DefaultDuration(existing *time.Duration,
|
||||
defaultValue time.Duration) (result *time.Duration) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
result = new(time.Duration)
|
||||
*result = defaultValue
|
||||
return result
|
||||
}
|
||||
|
||||
func DefaultLogLevel(existing *logging.Level,
|
||||
defaultValue logging.Level) (result *logging.Level) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
result = new(logging.Level)
|
||||
*result = defaultValue
|
||||
return result
|
||||
}
|
||||
|
||||
func DefaultIP(existing net.IP, defaultValue net.IP) (
|
||||
result net.IP) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
return defaultValue
|
||||
}
|
||||
31
internal/configuration/settings/helpers/files.go
Normal file
31
internal/configuration/settings/helpers/files.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrFileDoesNotExist = errors.New("file does not exist")
|
||||
ErrFileRead = errors.New("cannot read file")
|
||||
ErrFileClose = errors.New("cannot close file")
|
||||
)
|
||||
|
||||
func FileExists(path string) (err error) {
|
||||
path = filepath.Clean(path)
|
||||
|
||||
f, err := os.Open(path)
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
return fmt.Errorf("%w: %s", ErrFileDoesNotExist, path)
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrFileRead, err)
|
||||
}
|
||||
|
||||
if err := f.Close(); err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrFileClose, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
226
internal/configuration/settings/helpers/merge.go
Normal file
226
internal/configuration/settings/helpers/merge.go
Normal file
@@ -0,0 +1,226 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/qdm12/golibs/logging"
|
||||
"inet.af/netaddr"
|
||||
)
|
||||
|
||||
func MergeWithBool(existing, other *bool) (result *bool) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
} else if other == nil {
|
||||
return nil
|
||||
}
|
||||
result = new(bool)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeWithString(existing, other string) (result string) {
|
||||
if existing != "" {
|
||||
return existing
|
||||
}
|
||||
return other
|
||||
}
|
||||
|
||||
func MergeWithStringPtr(existing, other *string) (result *string) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
} else if other == nil {
|
||||
return nil
|
||||
}
|
||||
result = new(string)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeWithInt(existing, other *int) (result *int) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
} else if other == nil {
|
||||
return nil
|
||||
}
|
||||
result = new(int)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeWithUint8(existing, other *uint8) (result *uint8) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
} else if other == nil {
|
||||
return nil
|
||||
}
|
||||
result = new(uint8)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeWithUint16(existing, other *uint16) (result *uint16) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
} else if other == nil {
|
||||
return nil
|
||||
}
|
||||
result = new(uint16)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeWithIP(existing, other net.IP) (result net.IP) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
} else if other == nil {
|
||||
return nil
|
||||
}
|
||||
result = make(net.IP, len(other))
|
||||
copy(result, other)
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeWithDuration(existing, other *time.Duration) (result *time.Duration) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
}
|
||||
return other
|
||||
}
|
||||
|
||||
func MergeWithLogLevel(existing, other *logging.Level) (result *logging.Level) {
|
||||
if existing != nil {
|
||||
return existing
|
||||
} else if other == nil {
|
||||
return nil
|
||||
}
|
||||
result = new(logging.Level)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeStringSlices(a, b []string) (result []string) {
|
||||
if a == nil && b == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
seen := make(map[string]struct{}, len(a)+len(b))
|
||||
result = make([]string, 0, len(a)+len(b))
|
||||
for _, s := range a {
|
||||
if _, ok := seen[s]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, s)
|
||||
seen[s] = struct{}{}
|
||||
}
|
||||
for _, s := range b {
|
||||
if _, ok := seen[s]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, s)
|
||||
seen[s] = struct{}{}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeUint16Slices(a, b []uint16) (result []uint16) {
|
||||
if a == nil && b == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
seen := make(map[uint16]struct{}, len(a)+len(b))
|
||||
result = make([]uint16, 0, len(a)+len(b))
|
||||
for _, n := range a {
|
||||
if _, ok := seen[n]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, n)
|
||||
seen[n] = struct{}{}
|
||||
}
|
||||
for _, n := range b {
|
||||
if _, ok := seen[n]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, n)
|
||||
seen[n] = struct{}{}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeIPNetsSlices(a, b []net.IPNet) (result []net.IPNet) {
|
||||
if a == nil && b == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
seen := make(map[string]struct{}, len(a)+len(b))
|
||||
result = make([]net.IPNet, 0, len(a)+len(b))
|
||||
for _, ipNet := range a {
|
||||
key := ipNet.String()
|
||||
if _, ok := seen[key]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, ipNet)
|
||||
seen[key] = struct{}{}
|
||||
}
|
||||
for _, ipNet := range b {
|
||||
key := ipNet.String()
|
||||
if _, ok := seen[key]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, ipNet)
|
||||
seen[key] = struct{}{}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeNetaddrIPsSlices(a, b []netaddr.IP) (result []netaddr.IP) {
|
||||
if a == nil && b == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
seen := make(map[string]struct{}, len(a)+len(b))
|
||||
result = make([]netaddr.IP, 0, len(a)+len(b))
|
||||
for _, ip := range a {
|
||||
key := ip.String()
|
||||
if _, ok := seen[key]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, ip)
|
||||
seen[key] = struct{}{}
|
||||
}
|
||||
for _, ip := range b {
|
||||
key := ip.String()
|
||||
if _, ok := seen[key]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, ip)
|
||||
seen[key] = struct{}{}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func MergeIPPrefixesSlices(a, b []netaddr.IPPrefix) (result []netaddr.IPPrefix) {
|
||||
if a == nil && b == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
seen := make(map[string]struct{}, len(a)+len(b))
|
||||
result = make([]netaddr.IPPrefix, 0, len(a)+len(b))
|
||||
for _, ipPrefix := range a {
|
||||
key := ipPrefix.String()
|
||||
if _, ok := seen[key]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, ipPrefix)
|
||||
seen[key] = struct{}{}
|
||||
}
|
||||
for _, ipPrefix := range b {
|
||||
key := ipPrefix.String()
|
||||
if _, ok := seen[key]; ok {
|
||||
continue // duplicate
|
||||
}
|
||||
result = append(result, ipPrefix)
|
||||
seen[key] = struct{}{}
|
||||
}
|
||||
return result
|
||||
}
|
||||
29
internal/configuration/settings/helpers/messages.go
Normal file
29
internal/configuration/settings/helpers/messages.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ChoicesOrString(choices []string) string {
|
||||
return strings.Join(
|
||||
choices[:len(choices)-1], ", ") +
|
||||
" or " + choices[len(choices)-1]
|
||||
}
|
||||
|
||||
func PortChoicesOrString(ports []uint16) (s string) {
|
||||
switch len(ports) {
|
||||
case 0:
|
||||
return "there is no allowed port"
|
||||
case 1:
|
||||
return "allowed port is " + fmt.Sprint(ports[0])
|
||||
}
|
||||
|
||||
s = "allowed ports are "
|
||||
portStrings := make([]string, len(ports))
|
||||
for i := range ports {
|
||||
portStrings[i] = fmt.Sprint(ports[i])
|
||||
}
|
||||
s += ChoicesOrString(portStrings)
|
||||
return s
|
||||
}
|
||||
25
internal/configuration/settings/helpers/obfuscate.go
Normal file
25
internal/configuration/settings/helpers/obfuscate.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package helpers
|
||||
|
||||
func ObfuscateWireguardKey(fullKey string) (obfuscatedKey string) {
|
||||
const minKeyLength = 10
|
||||
if len(fullKey) < minKeyLength {
|
||||
return "(too short)"
|
||||
}
|
||||
|
||||
lastIndex := len(fullKey) - 1
|
||||
return fullKey[0:2] + "..." + fullKey[lastIndex-2:]
|
||||
}
|
||||
|
||||
func ObfuscatePassword(password string) (obfuscatedPassword string) {
|
||||
if password != "" {
|
||||
return "[set]"
|
||||
}
|
||||
return "[not set]"
|
||||
}
|
||||
|
||||
func ObfuscateData(data string) (obfuscated string) {
|
||||
if data != "" {
|
||||
return "[set]"
|
||||
}
|
||||
return "[not set]"
|
||||
}
|
||||
133
internal/configuration/settings/helpers/override.go
Normal file
133
internal/configuration/settings/helpers/override.go
Normal file
@@ -0,0 +1,133 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/qdm12/golibs/logging"
|
||||
"inet.af/netaddr"
|
||||
)
|
||||
|
||||
func OverrideWithBool(existing, other *bool) (result *bool) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = new(bool)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithString(existing, other string) (result string) {
|
||||
if other == "" {
|
||||
return existing
|
||||
}
|
||||
return other
|
||||
}
|
||||
|
||||
func OverrideWithStringPtr(existing, other *string) (result *string) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = new(string)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithInt(existing, other *int) (result *int) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = new(int)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithUint8(existing, other *uint8) (result *uint8) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = new(uint8)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithUint16(existing, other *uint16) (result *uint16) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = new(uint16)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithIP(existing, other net.IP) (result net.IP) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = make(net.IP, len(other))
|
||||
copy(result, other)
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithDuration(existing, other *time.Duration) (result *time.Duration) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = new(time.Duration)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithLogLevel(existing, other *logging.Level) (result *logging.Level) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = new(logging.Level)
|
||||
*result = *other
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithStringSlice(existing, other []string) (result []string) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = make([]string, len(other))
|
||||
copy(result, other)
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithUint16Slice(existing, other []uint16) (result []uint16) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = make([]uint16, len(other))
|
||||
copy(result, other)
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithIPNetsSlice(existing, other []net.IPNet) (result []net.IPNet) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = make([]net.IPNet, len(other))
|
||||
copy(result, other)
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithNetaddrIPsSlice(existing, other []netaddr.IP) (result []netaddr.IP) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = make([]netaddr.IP, len(other))
|
||||
copy(result, other)
|
||||
return result
|
||||
}
|
||||
|
||||
func OverrideWithIPPrefixesSlice(existing, other []netaddr.IPPrefix) (result []netaddr.IPPrefix) {
|
||||
if other == nil {
|
||||
return existing
|
||||
}
|
||||
result = make([]netaddr.IPPrefix, len(other))
|
||||
copy(result, other)
|
||||
return result
|
||||
}
|
||||
11
internal/configuration/settings/helpers/pointers.go
Normal file
11
internal/configuration/settings/helpers/pointers.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package helpers
|
||||
|
||||
import "time"
|
||||
|
||||
// StringPtr returns a pointer to the string value
|
||||
// passed as argument.
|
||||
func StringPtr(s string) *string { return &s }
|
||||
|
||||
// DurationPtr returns a pointer to the duration value
|
||||
// passed as argument.
|
||||
func DurationPtr(d time.Duration) *time.Duration { return &d }
|
||||
15
internal/configuration/settings/helpers/string.go
Normal file
15
internal/configuration/settings/helpers/string.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package helpers
|
||||
|
||||
func BoolPtrToYesNo(b *bool) string {
|
||||
if *b {
|
||||
return "yes"
|
||||
}
|
||||
return "no"
|
||||
}
|
||||
|
||||
func TCPPtrToString(tcp *bool) string {
|
||||
if *tcp {
|
||||
return "TCP"
|
||||
}
|
||||
return "UDP"
|
||||
}
|
||||
Reference in New Issue
Block a user