@@ -7,51 +7,92 @@ import (
77 "github.com/qdm12/gluetun/internal/models"
88)
99
10- type nameToServer map [string ]models.Server
10+ type nameToServer map [string ][] models.Server
1111
1212func (nts nameToServer ) add (name , hostname , region string ,
13- tcp , udp , portForward bool , ip netip.Addr ) (change bool ) {
14- server , ok := nts [name ]
15- if ! ok {
16- change = true
17- server .VPN = vpn .OpenVPN
18- server .ServerName = name
19- server .Hostname = hostname
20- server .Region = region
21- server .PortForward = portForward
22- }
13+ serverType string , tcp , udp , portForward bool , ip netip.Addr ) (change bool ) {
2314
24- if ! server .TCP && tcp {
25- change = true
26- server .TCP = tcp
27- }
28- if ! server .UDP && udp {
29- change = true
30- server .UDP = udp
31- }
15+ var server models.Server
3216
33- ipFound := false
34- for _ , existingIP := range server .IPs {
35- if ip == existingIP {
36- ipFound = true
17+ // Check for existing server for this name.
18+ servers := nts [name ]
19+ for i , existingServer := range servers {
20+ if existingServer .ServerName != name || existingServer .VPN != serverType {
21+ continue
22+ }
23+
24+ server = existingServer
25+
26+ switch existingServer .VPN {
27+ case vpn .OpenVPN :
28+ // Update OpenVPN supported protocols and return
29+ if ! existingServer .TCP {
30+ servers [i ].TCP = tcp
31+ change = true
32+ }
33+ if ! existingServer .UDP {
34+ servers [i ].UDP = udp
35+ change = true
36+ }
37+ ipFound := false
38+ for _ , existingIP := range server .IPs {
39+ if ip == existingIP {
40+ ipFound = true
41+ break
42+ }
43+ }
44+ if ! ipFound {
45+ server .IPs = append (server .IPs , ip )
46+ change = true
47+ }
48+ break
49+ case vpn .Wireguard :
50+ // Update IPs and return
51+ ipFound := false
52+ for _ , existingIP := range server .IPs {
53+ if ip == existingIP {
54+ ipFound = true
55+ break
56+ }
57+ }
58+ if ! ipFound {
59+ server .IPs = append (server .IPs , ip )
60+ change = true
61+ }
3762 break
3863 }
64+
65+ break
3966 }
4067
41- if ! ipFound {
68+ if server . ServerName == "" {
4269 change = true
43- server .IPs = append (server .IPs , ip )
70+ nts [name ] = append (servers , models.Server {
71+ VPN : vpn .OpenVPN ,
72+ Region : region ,
73+ Hostname : hostname ,
74+ PortForward : portForward ,
75+ ServerName : name ,
76+ TCP : tcp ,
77+ UDP : udp ,
78+ })
79+ nts [name ] = append (servers , models.Server {
80+ VPN : vpn .Wireguard ,
81+ Region : region ,
82+ Hostname : hostname ,
83+ PortForward : portForward ,
84+ ServerName : name ,
85+ IPs : []netip.Addr {ip },
86+ })
4487 }
4588
46- nts [name ] = server
47-
4889 return change
4990}
5091
5192func (nts nameToServer ) toServersSlice () (servers []models.Server ) {
5293 servers = make ([]models.Server , 0 , len (nts ))
53- for _ , server := range nts {
54- servers = append (servers , server )
94+ for _ , hostServers := range nts {
95+ servers = append (servers , hostServers ... )
5596 }
5697 return servers
5798}
0 commit comments