mirror of https://github.com/jetkvm/kvm.git
chore: skip websocket client if net isn't up or time sync hasn't complete
This commit is contained in:
parent
65e4a58ad9
commit
1e9adf81d4
26
cloud.go
26
cloud.go
|
@ -90,11 +90,6 @@ func handleCloudRegister(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.CloudToken == "" {
|
|
||||||
cloudLogger.Info("Starting websocket client due to adoption")
|
|
||||||
go RunWebsocketClient()
|
|
||||||
}
|
|
||||||
|
|
||||||
config.CloudToken = tokenResp.SecretToken
|
config.CloudToken = tokenResp.SecretToken
|
||||||
|
|
||||||
provider, err := oidc.NewProvider(c, "https://accounts.google.com")
|
provider, err := oidc.NewProvider(c, "https://accounts.google.com")
|
||||||
|
@ -130,6 +125,7 @@ func runWebsocketClient() error {
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
return fmt.Errorf("cloud token is not set")
|
return fmt.Errorf("cloud token is not set")
|
||||||
}
|
}
|
||||||
|
|
||||||
wsURL, err := url.Parse(config.CloudURL)
|
wsURL, err := url.Parse(config.CloudURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to parse config.CloudURL: %w", err)
|
return fmt.Errorf("failed to parse config.CloudURL: %w", err)
|
||||||
|
@ -253,6 +249,26 @@ func handleSessionRequest(ctx context.Context, c *websocket.Conn, req WebRTCSess
|
||||||
|
|
||||||
func RunWebsocketClient() {
|
func RunWebsocketClient() {
|
||||||
for {
|
for {
|
||||||
|
// If the cloud token is not set, we don't need to run the websocket client.
|
||||||
|
if config.CloudToken == "" {
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the network is not up, well, we can't connect to the cloud.
|
||||||
|
if !networkState.Up {
|
||||||
|
cloudLogger.Warn("waiting for network to be up, will retry in 3 seconds")
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the system time is not synchronized, the API request will fail anyway because the TLS handshake will fail.
|
||||||
|
if isTimeSyncNeeded() && !timeSyncSuccess {
|
||||||
|
cloudLogger.Warn("system time is not synced, will retry in 3 seconds")
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
err := runWebsocketClient()
|
err := runWebsocketClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cloudLogger.Errorf("websocket client error: %v", err)
|
cloudLogger.Errorf("websocket client error: %v", err)
|
||||||
|
|
6
main.go
6
main.go
|
@ -72,11 +72,9 @@ func Main() {
|
||||||
if config.TLSMode != "" {
|
if config.TLSMode != "" {
|
||||||
go RunWebSecureServer()
|
go RunWebSecureServer()
|
||||||
}
|
}
|
||||||
// If the cloud token isn't set, the client won't be started by default.
|
// As websocket client already checks if the cloud token is set, we can start it here.
|
||||||
// However, if the user adopts the device via the web interface, handleCloudRegister will start the client.
|
|
||||||
if config.CloudToken != "" {
|
|
||||||
go RunWebsocketClient()
|
go RunWebsocketClient()
|
||||||
}
|
|
||||||
initSerialPort()
|
initSerialPort()
|
||||||
sigs := make(chan os.Signal, 1)
|
sigs := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
|
33
ntp.go
33
ntp.go
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/beevik/ntp"
|
"github.com/beevik/ntp"
|
||||||
|
@ -20,13 +21,41 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
builtTimestamp string
|
||||||
timeSyncRetryInterval = 0 * time.Second
|
timeSyncRetryInterval = 0 * time.Second
|
||||||
|
timeSyncSuccess = false
|
||||||
defaultNTPServers = []string{
|
defaultNTPServers = []string{
|
||||||
"time.cloudflare.com",
|
"time.cloudflare.com",
|
||||||
"time.apple.com",
|
"time.apple.com",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func isTimeSyncNeeded() bool {
|
||||||
|
if builtTimestamp == "" {
|
||||||
|
logger.Warnf("Built timestamp is not set, time sync is needed")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
ts, err := strconv.Atoi(builtTimestamp)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warnf("Failed to parse built timestamp: %v", err)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// builtTimestamp is UNIX timestamp in seconds
|
||||||
|
builtTime := time.Unix(int64(ts), 0)
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
|
logger.Tracef("Built time: %v, now: %v", builtTime, now)
|
||||||
|
|
||||||
|
if now.Sub(builtTime) < 0 {
|
||||||
|
logger.Warnf("System time is behind the built time, time sync is needed")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func TimeSyncLoop() {
|
func TimeSyncLoop() {
|
||||||
for {
|
for {
|
||||||
if !networkState.checked {
|
if !networkState.checked {
|
||||||
|
@ -40,6 +69,9 @@ func TimeSyncLoop() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if time sync is needed, but do nothing for now
|
||||||
|
isTimeSyncNeeded()
|
||||||
|
|
||||||
logger.Infof("Syncing system time")
|
logger.Infof("Syncing system time")
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
err := SyncSystemTime()
|
err := SyncSystemTime()
|
||||||
|
@ -56,6 +88,7 @@ func TimeSyncLoop() {
|
||||||
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
timeSyncSuccess = true
|
||||||
logger.Infof("Time sync successful, now is: %v, time taken: %v", time.Now(), time.Since(start))
|
logger.Infof("Time sync successful, now is: %v, time taken: %v", time.Now(), time.Since(start))
|
||||||
time.Sleep(timeSyncInterval) // after the first sync is done
|
time.Sleep(timeSyncInterval) // after the first sync is done
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue