Support env lookup for some values

This commit is contained in:
Nicholas Dart 2024-05-30 20:03:12 +10:00
parent e749217090
commit 7b7d9db560
3 changed files with 48 additions and 14 deletions

View file

@ -59,6 +59,7 @@ jobs:
docker buildx build \ docker buildx build \
--platform "$BUILD_PLATFORMS" \ --platform "$BUILD_PLATFORMS" \
--tag "$CONTAINER_NAME:$CONTAINER_TAG" \ --tag "$CONTAINER_NAME:$CONTAINER_TAG" \
--tag "$CONTAINER_NAME:$GITHUB_SHA" \
--label "org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" \ --label "org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" \
--label "org.opencontainers.image.documentation=${{ github.server_url }}/${{ github.repository }}" \ --label "org.opencontainers.image.documentation=${{ github.server_url }}/${{ github.repository }}" \
--label "org.opencontainers.image.url=${{ github.server_url }}/${{ github.repository }}/packages" \ --label "org.opencontainers.image.url=${{ github.server_url }}/${{ github.repository }}/packages" \

View file

@ -76,6 +76,7 @@ Instructions for using wireproxy with Firefox container tabs and auto-start on M
Address = 10.200.200.2/32 # The subnet should be /32 and /128 for IPv4 and v6 respectively Address = 10.200.200.2/32 # The subnet should be /32 and /128 for IPv4 and v6 respectively
# MTU = 1420 (optional) # MTU = 1420 (optional)
PrivateKey = uCTIK+56CPyCvwJxmU5dBfuyJvPuSXAq1FzHdnIxe1Q= PrivateKey = uCTIK+56CPyCvwJxmU5dBfuyJvPuSXAq1FzHdnIxe1Q=
# PrivateKey = $MY_WIREGUARD_PRIVATE_KEY # Alternatively, reference environment variables
DNS = 10.200.200.1 DNS = 10.200.200.1
[Peer] [Peer]

View file

@ -5,6 +5,7 @@ import (
"encoding/hex" "encoding/hex"
"errors" "errors"
"net" "net"
"os"
"strings" "strings"
"github.com/go-ini/ini" "github.com/go-ini/ini"
@ -68,6 +69,18 @@ func parseString(section *ini.Section, keyName string) (string, error) {
if key == nil { if key == nil {
return "", errors.New(keyName + " should not be empty") return "", errors.New(keyName + " should not be empty")
} }
value := key.String()
if strings.HasPrefix(value, "$") {
if strings.HasPrefix(value, "$$") {
return strings.Replace(value, "$$", "$", 1), nil
}
var ok bool
value, ok = os.LookupEnv(strings.TrimPrefix(value, "$"))
if !ok {
return "", errors.New(keyName + " references unset environment variable " + key.String())
}
return value, nil
}
return key.String(), nil return key.String(), nil
} }
@ -122,15 +135,21 @@ func encodeBase64ToHex(key string) (string, error) {
} }
func parseNetIP(section *ini.Section, keyName string) ([]netip.Addr, error) { func parseNetIP(section *ini.Section, keyName string) ([]netip.Addr, error) {
key := section.Key(keyName) key, err := parseString(section, keyName)
if key == nil { if err != nil {
if strings.Contains(err.Error(), "should not be empty") {
return []netip.Addr{}, nil return []netip.Addr{}, nil
} }
return nil, err
}
keys := key.StringsWithShadows(",") keys := strings.Split(key, ",")
var ips = make([]netip.Addr, 0, len(keys)) var ips = make([]netip.Addr, 0, len(keys))
for _, str := range keys { for _, str := range keys {
str = strings.TrimSpace(str) str = strings.TrimSpace(str)
if len(str) == 0 {
continue
}
ip, err := netip.ParseAddr(str) ip, err := netip.ParseAddr(str)
if err != nil { if err != nil {
return nil, err return nil, err
@ -141,14 +160,21 @@ func parseNetIP(section *ini.Section, keyName string) ([]netip.Addr, error) {
} }
func parseCIDRNetIP(section *ini.Section, keyName string) ([]netip.Addr, error) { func parseCIDRNetIP(section *ini.Section, keyName string) ([]netip.Addr, error) {
key := section.Key(keyName) key, err := parseString(section, keyName)
if key == nil { if err != nil {
if strings.Contains(err.Error(), "should not be empty") {
return []netip.Addr{}, nil return []netip.Addr{}, nil
} }
return nil, err
}
keys := key.StringsWithShadows(",") keys := strings.Split(key, ",")
var ips = make([]netip.Addr, 0, len(keys)) var ips = make([]netip.Addr, 0, len(keys))
for _, str := range keys { for _, str := range keys {
str = strings.TrimSpace(str)
if len(str) == 0 {
continue
}
prefix, err := netip.ParsePrefix(str) prefix, err := netip.ParsePrefix(str)
if err != nil { if err != nil {
return nil, err return nil, err
@ -161,14 +187,21 @@ func parseCIDRNetIP(section *ini.Section, keyName string) ([]netip.Addr, error)
} }
func parseAllowedIPs(section *ini.Section) ([]netip.Prefix, error) { func parseAllowedIPs(section *ini.Section) ([]netip.Prefix, error) {
key := section.Key("AllowedIPs") key, err := parseString(section, "AllowedIPs")
if key == nil { if err != nil {
if strings.Contains(err.Error(), "should not be empty") {
return []netip.Prefix{}, nil return []netip.Prefix{}, nil
} }
return nil, err
}
keys := key.StringsWithShadows(",") keys := strings.Split(key, ",")
var ips = make([]netip.Prefix, 0, len(keys)) var ips = make([]netip.Prefix, 0, len(keys))
for _, str := range keys { for _, str := range keys {
str = strings.TrimSpace(str)
if len(str) == 0 {
continue
}
prefix, err := netip.ParsePrefix(str) prefix, err := netip.ParsePrefix(str)
if err != nil { if err != nil {
return nil, err return nil, err
@ -288,8 +321,7 @@ func ParsePeers(cfg *ini.File, peers *[]PeerConfig) error {
peer.PreSharedKey = value peer.PreSharedKey = value
} }
if sectionKey, err := section.GetKey("Endpoint"); err == nil { if value, err := parseString(section, "Endpoint"); err == nil {
value := sectionKey.String()
decoded, err = resolveIPPAndPort(strings.ToLower(value)) decoded, err = resolveIPPAndPort(strings.ToLower(value))
if err != nil { if err != nil {
return err return err