@@ -7,51 +7,98 @@ 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
16+
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+ }
3223
33- ipFound := false
34- for _ , existingIP := range server .IPs {
35- if ip == existingIP {
36- ipFound = true
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+ switch serverType {
71+ case vpn .OpenVPN :
72+ nts [name ] = append (servers , models.Server {
73+ VPN : vpn .OpenVPN ,
74+ Region : region ,
75+ Hostname : hostname ,
76+ PortForward : portForward ,
77+ ServerName : name ,
78+ TCP : tcp ,
79+ UDP : udp ,
80+ })
81+ break
82+ case vpn .Wireguard :
83+ nts [name ] = append (servers , models.Server {
84+ VPN : vpn .Wireguard ,
85+ Region : region ,
86+ Hostname : hostname ,
87+ PortForward : portForward ,
88+ ServerName : name ,
89+ IPs : []netip.Addr {ip },
90+ })
91+ break
92+ }
4493 }
4594
46- nts [name ] = server
47-
4895 return change
4996}
5097
5198func (nts nameToServer ) toServersSlice () (servers []models.Server ) {
5299 servers = make ([]models.Server , 0 , len (nts ))
53- for _ , server := range nts {
54- servers = append (servers , server )
100+ for _ , hostServers := range nts {
101+ servers = append (servers , hostServers ... )
55102 }
56103 return servers
57104}
0 commit comments