Improve management of multiple servers, and unreachable-at-boot servers
This commit is contained in:
parent
cd15ba4538
commit
df3a5f608d
|
@ -72,19 +72,19 @@ func FetchCurrentCert(proxy *Proxy, proto string, pk ed25519.PublicKey, serverAd
|
||||||
tsBegin := binary.BigEndian.Uint32(binCert[116:120])
|
tsBegin := binary.BigEndian.Uint32(binCert[116:120])
|
||||||
tsEnd := binary.BigEndian.Uint32(binCert[120:124])
|
tsEnd := binary.BigEndian.Uint32(binCert[120:124])
|
||||||
if now > tsEnd || now < tsBegin {
|
if now > tsEnd || now < tsBegin {
|
||||||
dlog.Infof("[%v] Certificate not valid at the current date", providerName)
|
dlog.Debugf("[%v] Certificate not valid at the current date", providerName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if serial < highestSerial {
|
if serial < highestSerial {
|
||||||
dlog.Infof("[%v] Superseded by a previous certificate", providerName)
|
dlog.Debugf("[%v] Superseded by a previous certificate", providerName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if serial == highestSerial {
|
if serial == highestSerial {
|
||||||
if cryptoConstruction < certInfo.CryptoConstruction {
|
if cryptoConstruction < certInfo.CryptoConstruction {
|
||||||
dlog.Infof("[%v] Keeping the previous, preferred crypto construction", providerName)
|
dlog.Debugf("[%v] Keeping the previous, preferred crypto construction", providerName)
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
dlog.Infof("[%v] Upgrading the construction from %v to %v", providerName, certInfo.CryptoConstruction, cryptoConstruction)
|
dlog.Debugf("[%v] Upgrading the construction from %v to %v", providerName, certInfo.CryptoConstruction, cryptoConstruction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if cryptoConstruction != XChacha20Poly1305 && cryptoConstruction != XSalsa20Poly1305 {
|
if cryptoConstruction != XChacha20Poly1305 && cryptoConstruction != XSalsa20Poly1305 {
|
||||||
|
@ -108,7 +108,7 @@ func FetchCurrentCert(proxy *Proxy, proto string, pk ed25519.PublicKey, serverAd
|
||||||
certInfo.CryptoConstruction = cryptoConstruction
|
certInfo.CryptoConstruction = cryptoConstruction
|
||||||
copy(certInfo.ServerPk[:], serverPk[:])
|
copy(certInfo.ServerPk[:], serverPk[:])
|
||||||
copy(certInfo.MagicQuery[:], binCert[104:112])
|
copy(certInfo.MagicQuery[:], binCert[104:112])
|
||||||
dlog.Noticef("[%v] Valid cert found", providerName)
|
dlog.Noticef("[%v] Valid cert (crypto version %d) found", providerName, cryptoConstruction)
|
||||||
}
|
}
|
||||||
if certInfo.CryptoConstruction == UndefinedConstruction {
|
if certInfo.CryptoConstruction == UndefinedConstruction {
|
||||||
return certInfo, errors.New("No useable certificate found")
|
return certInfo, errors.New("No useable certificate found")
|
||||||
|
|
|
@ -138,7 +138,13 @@ func (proxy *Proxy) StartProxy() {
|
||||||
dlog.Fatal(err)
|
dlog.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dlog.Notice("dnscrypt-proxy is ready")
|
liveServers, err := proxy.serversInfo.refresh(proxy)
|
||||||
|
if liveServers > 0 {
|
||||||
|
dlog.Noticef("dnscrypt-proxy is ready - live servers: %d", liveServers)
|
||||||
|
} else if err != nil {
|
||||||
|
dlog.Error(err)
|
||||||
|
dlog.Notice("dnscrypt-proxy is waiting for at least one server to be reachable")
|
||||||
|
}
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
delay := proxy.certRefreshDelay
|
delay := proxy.certRefreshDelay
|
||||||
|
|
|
@ -62,6 +62,20 @@ type ServersInfo struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (serversInfo *ServersInfo) registerServer(proxy *Proxy, name string, stamp ServerStamp) error {
|
func (serversInfo *ServersInfo) registerServer(proxy *Proxy, name string, stamp ServerStamp) error {
|
||||||
|
newRegisteredServer := RegisteredServer{name: name, stamp: stamp}
|
||||||
|
serversInfo.Lock()
|
||||||
|
defer serversInfo.Unlock()
|
||||||
|
for i, oldRegisteredServer := range serversInfo.registeredServers {
|
||||||
|
if oldRegisteredServer.name == name {
|
||||||
|
serversInfo.registeredServers[i] = newRegisteredServer
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
serversInfo.registeredServers = append(serversInfo.registeredServers, newRegisteredServer)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (serversInfo *ServersInfo) refreshServer(proxy *Proxy, name string, stamp ServerStamp) error {
|
||||||
serversInfo.Lock()
|
serversInfo.Lock()
|
||||||
defer serversInfo.Unlock()
|
defer serversInfo.Unlock()
|
||||||
newServer, err := serversInfo.fetchServerInfo(proxy, name, stamp)
|
newServer, err := serversInfo.fetchServerInfo(proxy, name, stamp)
|
||||||
|
@ -88,7 +102,7 @@ func (serversInfo *ServersInfo) refresh(proxy *Proxy) (int, error) {
|
||||||
liveServers := 0
|
liveServers := 0
|
||||||
var err error
|
var err error
|
||||||
for _, registeredServer := range registeredServers {
|
for _, registeredServer := range registeredServers {
|
||||||
if err = serversInfo.registerServer(proxy, registeredServer.name, registeredServer.stamp); err == nil {
|
if err = serversInfo.refreshServer(proxy, registeredServer.name, registeredServer.stamp); err == nil {
|
||||||
liveServers++
|
liveServers++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,7 +111,7 @@ func (serversInfo *ServersInfo) refresh(proxy *Proxy) (int, error) {
|
||||||
|
|
||||||
func (serversInfo *ServersInfo) liveServers() int {
|
func (serversInfo *ServersInfo) liveServers() int {
|
||||||
serversInfo.RLock()
|
serversInfo.RLock()
|
||||||
liveServers := len(serversInfo.registeredServers)
|
liveServers := len(serversInfo.inner)
|
||||||
serversInfo.RUnlock()
|
serversInfo.RUnlock()
|
||||||
return liveServers
|
return liveServers
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue