64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package peer
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
"vppn/m"
|
|
)
|
|
|
|
func (r *Router) pollHub() {
|
|
u, err := url.Parse(r.conf.HubAddress)
|
|
if err != nil {
|
|
log.Fatalf("Failed to parse hub address %s: %v", r.conf.HubAddress, err)
|
|
}
|
|
u.Path = "/peer/fetch-state/"
|
|
|
|
client := &http.Client{Timeout: 8 * time.Second}
|
|
|
|
req := &http.Request{
|
|
Method: http.MethodGet,
|
|
URL: u,
|
|
Header: http.Header{},
|
|
}
|
|
req.SetBasicAuth("", r.conf.APIKey)
|
|
|
|
// TODO: Before we start polling, load state from the file system.
|
|
r._pollHub(client, req)
|
|
|
|
for range time.Tick(32 * time.Second) {
|
|
r._pollHub(client, req)
|
|
}
|
|
}
|
|
|
|
func (r *Router) _pollHub(client *http.Client, req *http.Request) {
|
|
var state m.NetworkState
|
|
|
|
log.Printf("Fetching peer state from %s...", r.conf.HubAddress)
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
log.Printf("Failed to fetch peer state: %v", err)
|
|
return
|
|
}
|
|
body, err := io.ReadAll(resp.Body)
|
|
_ = resp.Body.Close()
|
|
if err != nil {
|
|
log.Printf("Failed to read body from hub: %v", err)
|
|
return
|
|
}
|
|
|
|
if err := json.Unmarshal(body, &state); err != nil {
|
|
log.Printf("Failed to unmarshal response from hub: %v", err)
|
|
return
|
|
}
|
|
|
|
for i := range r.conns {
|
|
if r.conns[i] != nil {
|
|
r.conns[i].UpdatePeer(peerUpdate{PeerIP: byte(i), Peer: state.Peers[i]})
|
|
}
|
|
}
|
|
}
|