Files
natpass/code/client/run.go
T

54 lines
1.1 KiB
Go

package main
import (
"context"
"natpass/code/client/global"
"natpass/code/client/tunnel"
"natpass/code/network"
"sync"
"github.com/lwch/logging"
"github.com/lwch/runtime"
"google.golang.org/grpc/metadata"
)
func makeContext(id, secret string) context.Context {
return metadata.AppendToOutgoingContext(context.Background(),
"id", id,
"secret", secret)
}
func handshake(cfg *global.Configure, cli network.Natpass_ControlClient) error {
return cli.Send(&network.ControlData{
XType: network.ControlData_come,
})
}
func run(cfg *global.Configure, cli network.NatpassClient) {
ctx := makeContext(cfg.ID, cfg.Secret)
ctlCli, err := cli.Control(ctx)
runtime.Assert(err)
fwdCli, err := cli.Forward(ctx)
runtime.Assert(err)
err = handshake(cfg, ctlCli)
runtime.Assert(err)
logging.Info("connect to server %s ok", cfg.Server)
var wg sync.WaitGroup
wg.Add(len(cfg.Tunnels))
for _, t := range cfg.Tunnels {
tn := tunnel.New(ctx, t, ctlCli, fwdCli)
go func(t global.Tunnel) {
defer func() {
wg.Done()
logging.Error("tunnel for %s closed", t.Name)
}()
tn.Run()
}(t)
}
wg.Wait()
}