mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-11-28 18:08:51 +03:00
30c6676dc0
Merge in DNS/adguard-home from AG-25392-confmigrate-vol.3 to master Squashed commit of the following: commit 925b35b9fedcdcf18474785530189a1eb504e1d6 Merge: 232f18481581891af2
Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Wed Sep 6 12:48:05 2023 +0300 Merge branch 'master' into AG-25392-confmigrate-vol.3 commit 232f18481bbf3400da0b95bcec7949fb3868bf85 Merge: c0d880bed5bd452516
Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Tue Sep 5 18:54:47 2023 +0300 Merge branch 'master' into AG-25392-confmigrate-vol.3 commit c0d880bed6e3270e88f5377e66b787565e1249ce Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Tue Sep 5 17:21:57 2023 +0300 confmigrate: fix v15 commit 8a27148b708e6d6a61f8097bf7792aefa1055772 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Tue Sep 5 15:47:18 2023 +0300 confmigrate: imp gocognit, overall
118 lines
2.3 KiB
Go
118 lines
2.3 KiB
Go
package confmigrate
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/AdguardTeam/golibs/netutil"
|
|
)
|
|
|
|
// migrateTo10 performs the following changes:
|
|
//
|
|
// # BEFORE:
|
|
// 'schema_version': 9
|
|
// 'dns':
|
|
// 'upstream_dns':
|
|
// - 'quic://some-upstream.com'
|
|
// 'local_ptr_upstreams':
|
|
// - 'quic://some-upstream.com'
|
|
// # …
|
|
// # …
|
|
//
|
|
// # AFTER:
|
|
// 'schema_version': 10
|
|
// 'dns':
|
|
// 'upstream_dns':
|
|
// - 'quic://some-upstream.com:784'
|
|
// 'local_ptr_upstreams':
|
|
// - 'quic://some-upstream.com:784'
|
|
// # …
|
|
// # …
|
|
func migrateTo10(diskConf yobj) (err error) {
|
|
diskConf["schema_version"] = 10
|
|
|
|
dns, ok, err := fieldVal[yobj](diskConf, "dns")
|
|
if !ok {
|
|
return err
|
|
}
|
|
|
|
const quicPort = 784
|
|
|
|
ups, ok, err := fieldVal[yarr](dns, "upstream_dns")
|
|
if err != nil {
|
|
return err
|
|
} else if ok {
|
|
if err = addQUICPorts(ups, quicPort); err != nil {
|
|
return err
|
|
}
|
|
|
|
dns["upstream_dns"] = ups
|
|
}
|
|
|
|
ups, ok, err = fieldVal[yarr](dns, "local_ptr_upstreams")
|
|
if err != nil {
|
|
return err
|
|
} else if ok {
|
|
if err = addQUICPorts(ups, quicPort); err != nil {
|
|
return err
|
|
}
|
|
|
|
dns["local_ptr_upstreams"] = ups
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// addQUICPorts inserts a port into each QUIC upstream's hostname in ups if
|
|
// those are missing.
|
|
func addQUICPorts(ups yarr, port int) (err error) {
|
|
for i, uVal := range ups {
|
|
u, ok := uVal.(string)
|
|
if !ok {
|
|
return fmt.Errorf("unexpected type of upstream field: %T", uVal)
|
|
}
|
|
|
|
ups[i] = addQUICPort(u, port)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// addQUICPort inserts a port into QUIC upstream's hostname if it is missing.
|
|
func addQUICPort(ups string, port int) (withPort string) {
|
|
if ups == "" || ups[0] == '#' {
|
|
return ups
|
|
}
|
|
|
|
var doms string
|
|
withPort = ups
|
|
if strings.HasPrefix(ups, "[/") {
|
|
domsAndUps := strings.Split(strings.TrimPrefix(ups, "[/"), "/]")
|
|
if len(domsAndUps) != 2 {
|
|
return ups
|
|
}
|
|
|
|
doms, withPort = "[/"+domsAndUps[0]+"/]", domsAndUps[1]
|
|
}
|
|
|
|
if !strings.Contains(withPort, "://") {
|
|
return ups
|
|
}
|
|
|
|
upsURL, err := url.Parse(withPort)
|
|
if err != nil || upsURL.Scheme != "quic" {
|
|
return ups
|
|
}
|
|
|
|
var host string
|
|
host, err = netutil.SplitHost(upsURL.Host)
|
|
if err != nil || host != upsURL.Host {
|
|
return ups
|
|
}
|
|
|
|
upsURL.Host = strings.Join([]string{host, strconv.Itoa(port)}, ":")
|
|
|
|
return doms + upsURL.String()
|
|
}
|