go-tunnel/cmd/client/main.go

70 lines
1.4 KiB
Go
Raw Permalink Normal View History

2020-10-21 18:00:15 +02:00
package main
import (
"context"
"flag"
2020-10-26 19:42:07 +01:00
"fmt"
2020-10-21 18:00:15 +02:00
"math/rand"
"time"
"cdr.dev/slog"
"forge.cadoles.com/wpetit/go-tunnel"
"gitlab.com/wpetit/goweb/logger"
)
const salt = "go-tunnel"
func main() {
var (
2020-10-26 19:42:07 +01:00
clientID = fmt.Sprintf("client-%d", time.Now().Unix())
serverAddr = "127.0.0.1:36543"
sharedKey = "go-tunnel"
2020-10-21 18:00:15 +02:00
)
2020-10-26 19:42:07 +01:00
flag.StringVar(&sharedKey, "shared-key", sharedKey, "shared key")
flag.StringVar(&clientID, "id", clientID, "Client ID")
flag.StringVar(&serverAddr, "server-addr", serverAddr, "server address")
2020-10-21 18:00:15 +02:00
flag.Parse()
ctx := context.Background()
ctx = logger.With(ctx, logger.F("clientID", clientID))
logger.SetLevel(slog.LevelDebug)
client := tunnel.NewClient(
2020-10-26 19:42:07 +01:00
tunnel.WithClientServerAddress(serverAddr),
2020-10-21 18:00:15 +02:00
tunnel.WithClientCredentials(clientID),
)
defer client.Close()
2020-10-26 19:42:07 +01:00
initialBackoff := time.Second * 2
2020-10-21 18:00:15 +02:00
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()
}
}