Skip to content
File

Blob: cmd/client/validate.go

go87 lines
1package client
2 
3import (
4 "context"
5 "fmt"
6 "net"
7 "os"
8 "os/signal"
9 "syscall"
10 
11 "go.miragespace.co/specter/spec/acme"
12 "go.miragespace.co/specter/tun/client"
13 "go.miragespace.co/specter/tun/client/dialer"
14 
15 "github.com/quic-go/quic-go"
16 "github.com/urfave/cli/v3"
17 "go.uber.org/zap"
18)
19 
20func cmdValidate(ctx context.Context, cmd *cli.Command) error {
21 logger := cmd.Root().Metadata["logger"].(*zap.Logger)
22 
23 hostname := cmd.Args().First()
24 if hostname == "" {
25 return fmt.Errorf("missing hostname in argument")
26 }
27 
28 cfg, err := client.NewConfig(cmd.String("config"))
29 if err != nil {
30 return err
31 }
32 
33 parsed, err := dialer.ParseApex(cfg.Apex)
34 if err != nil {
35 return err
36 }
37 
38 hostname, err = acme.Normalize(hostname)
39 if err != nil {
40 return err
41 }
42 
43 s := make(chan os.Signal, 1)
44 signal.Notify(s, syscall.SIGHUP)
45 
46 listener, err := net.ListenPacket("udp", ":0")
47 if err != nil {
48 return err
49 }
50 defer listener.Close()
51 
52 quicTransport := &quic.Transport{Conn: listener}
53 defer quicTransport.Close()
54 
55 _, transport := createTransport(cmd, transportCfg{
56 logger: logger,
57 quicTp: quicTransport,
58 apex: parsed,
59 })
60 defer transport.Stop()
61 
62 c, err := client.NewClient(ctx, client.ClientConfig{
63 Logger: logger,
64 Configuration: cfg,
65 ServerTransport: transport,
66 ReloadSignal: s,
67 })
68 if err != nil {
69 return err
70 }
71 defer c.Close()
72 
73 if err := c.Register(ctx); err != nil {
74 return err
75 }
76 
77 resp, err := c.RequestAcmeValidation(ctx, hostname)
78 if err != nil {
79 return fmt.Errorf("failed to validate acme setup: %w", err)
80 }
81 
82 fmt.Printf("\n")
83 c.FormatValidate(hostname, resp, os.Stdout)
84 
85 return nil
86}