go-tunnel/cmd/client/main.go

70 lines
1.4 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"math/rand"
"time"
"cdr.dev/slog"
"forge.cadoles.com/wpetit/go-tunnel"
"gitlab.com/wpetit/goweb/logger"
)
const salt = "go-tunnel"
func main() {
var (
clientID = fmt.Sprintf("client-%d", time.Now().Unix())
serverAddr = "127.0.0.1:36543"
sharedKey = "go-tunnel"
)
flag.StringVar(&sharedKey, "shared-key", sharedKey, "shared key")
flag.StringVar(&clientID, "id", clientID, "Client ID")
flag.StringVar(&serverAddr, "server-addr", serverAddr, "server address")
flag.Parse()
ctx := context.Background()
ctx = logger.With(ctx, logger.F("clientID", clientID))
logger.SetLevel(slog.LevelDebug)
client := tunnel.NewClient(
tunnel.WithClientServerAddress(serverAddr),
tunnel.WithClientCredentials(clientID),
)
defer client.Close()
initialBackoff := time.Second * 2
backoff := initialBackoff
sleep := func() {
backoff = backoff*2 + (time.Duration(rand.Intn(int(initialBackoff))))
logger.Info(ctx, "sleeping", logger.F("duration", backoff))
time.Sleep(backoff)
}
for {
logger.Info(ctx, "connecting")
if err := client.Connect(ctx); err != nil {
logger.Error(ctx, "could not connect", logger.E(err))
sleep()
continue
}
logger.Info(ctx, "waiting for instructions")
if err := client.Listen(ctx); err != nil {
logger.Error(ctx, "error while listening", logger.E(err))
}
logger.Info(ctx, "connection lost")
sleep()
}
}