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() } }