@@ -7,7 +7,9 @@ package conf
7
7
8
8
import (
9
9
"log"
10
+ "net"
10
11
"net/netip"
12
+ "strings"
11
13
"time"
12
14
"unsafe"
13
15
@@ -85,13 +87,74 @@ func resolveHostnameOnce(name string) (resolvedIPString string, err error) {
85
87
return
86
88
}
87
89
90
+ func resolveSrvRecord (name string ) (resolvedIPString string , resolvedPort uint16 , err error ) {
91
+ maxTries := 10
92
+ if services .StartedAtBoot () {
93
+ maxTries *= 4
94
+ }
95
+ var resolvedTargetString string
96
+ resolvedTargetString , resolvedPort , err = resolveSrvRecordOnce (name )
97
+ if err != nil {
98
+ return
99
+ }
100
+ resolvedIPString , err = resolveHostname (resolvedTargetString )
101
+ return resolvedIPString , resolvedPort , err
102
+ }
103
+
104
+ func resolveSrvRecordOnce (name string ) (resolvedTargetString string , resolvedPort uint16 , err error ) {
105
+ _ , records , err := net .LookupSRV ("" , "" , name )
106
+ if err != nil {
107
+ return
108
+ }
109
+ if len (records ) > 0 {
110
+ resolvedTargetString = records [0 ].Target
111
+ resolvedPort = records [0 ].Port
112
+ }
113
+ return
114
+ }
115
+
116
+ func resolveTxtRecordOnce (name string ) (resolvedTargetString string , resolvedPort uint16 , err error ) {
117
+ records , err := net .LookupTXT (name )
118
+ if err != nil {
119
+ return
120
+ }
121
+ if len (records ) > 0 {
122
+ targetString := records [0 ]
123
+ if strings .Contains (records [0 ], "||" ) {
124
+ resolvedTargetStrings := strings .Split (records [0 ], "||" )
125
+ targetString = resolvedTargetStrings [0 ]
126
+ }
127
+ i := strings .LastIndexByte (targetString , ':' )
128
+ if i >= 0 {
129
+ targetString = strings .TrimSpace (targetString )
130
+ var resolvedPortStr string
131
+ resolvedTargetString , resolvedPortStr = targetString [:i ], targetString [i + 1 :]
132
+ resolvedPort , err = parsePort (resolvedPortStr )
133
+ if err != nil {
134
+ return
135
+ }
136
+ }
137
+ }
138
+ return
139
+ }
140
+
88
141
func (config * Config ) ResolveEndpoints () error {
89
142
for i := range config .Peers {
90
143
if config .Peers [i ].Endpoint .IsEmpty () {
91
144
continue
92
145
}
93
146
var err error
94
- config .Peers [i ].Endpoint .Host , err = resolveHostname (config .Peers [i ].Endpoint .Host )
147
+ if config .Peers [i ].Endpoint .Port == 0 {
148
+ // srv记录
149
+ log .Printf ("SRV record start resolve..." )
150
+ config .Peers [i ].Endpoint .Host , config .Peers [i ].Endpoint .Port , err = resolveSrvRecord (config .Peers [i ].Endpoint .Host )
151
+ } else if config .Peers [i ].Endpoint .Port == 1 {
152
+ // txt记录
153
+ log .Printf ("TXT record start resolve..." )
154
+ config .Peers [i ].Endpoint .Host , config .Peers [i ].Endpoint .Port , err = resolveTxtRecordOnce (config .Peers [i ].Endpoint .Host )
155
+ } else {
156
+ config .Peers [i ].Endpoint .Host , err = resolveHostname (config .Peers [i ].Endpoint .Host )
157
+ }
95
158
if err != nil {
96
159
return err
97
160
}
0 commit comments