Help us shape the future of Go! Take the 2026 Go Developer Survey

commands

package
v1.3.104 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 31, 2026 License: AGPL-3.0 Imports: 15 Imported by: 0

Documentation

Overview

Package commands cmd/dmsg/dmsgprobe/commands/dmsgprobe.go c1-net-dmsg

Index

Constants

This section is empty.

Variables

View Source
var RootCmd = &cobra.Command{
	Use:   "probe <public-key> <port>",
	Short: "Standalone DMSG port-reachability probe",
	Long: calvin.AsciiFont("dmsg-probe") + `
	Standalone DMSG port-reachability probe — its own dmsg client, no visor.

	Performs a full noise handshake to <pk>:<port> over dmsg; a completed
	handshake means a listener is active (reachable). With --server it forces
	the probe through a specific dmsg server. With --via tcp://<pk>@host:port
	it instead probes a direct noise-TCP connection (no dmsg at all).`,
	SilenceErrors:         true,
	SilenceUsage:          true,
	DisableFlagsInUseLine: true,
	Version:               buildinfo.Version(),
	Args: func(cmd *cobra.Command, args []string) error {
		if probeVia != "" {
			return nil
		}
		return cobra.ExactArgs(2)(cmd, args)
	},
	RunE: func(_ *cobra.Command, args []string) error {
		if logLvl != "" {
			if lvl, e := logging.LevelFromString(logLvl); e == nil {
				logging.SetLevel(lvl)
			}
		}

		pk, err := sk.PubKey()
		if err != nil {
			_, sk = cipher.GenerateKeyPair()
			pk, err = sk.PubKey()
			if err != nil {
				return fmt.Errorf("derive public key: %w", err)
			}
		}

		if probeVia != "" {
			rPK, hostPort, perr := parseViaTCP(probeVia)
			if perr != nil {
				return perr
			}
			ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
			defer cancel()
			startT := time.Now()
			conn, derr := tcpnoise.Dial(ctx, hostPort, pk, sk, rPK)
			lat := time.Since(startT).Round(time.Millisecond)
			if derr != nil {
				cmdutil.Printf("tcp://%s@%s — unreachable (%s)\n", rPK, hostPort, lat)
				return nil
			}
			_ = conn.Close()
			cmdutil.Printf("tcp://%s@%s — reachable (%s)\n", rPK, hostPort, lat)
			return nil
		}

		var dpk cipher.PubKey
		if e := dpk.Set(args[0]); e != nil {
			return fmt.Errorf("invalid public key: %w", e)
		}
		p64, e := strconv.ParseUint(args[1], 10, 16)
		if e != nil {
			return fmt.Errorf("invalid port: %w", e)
		}
		port := uint16(p64)

		var serverPK cipher.PubKey
		serverSet := probeServer != ""
		if serverSet {
			if e := serverPK.Set(probeServer); e != nil {
				return fmt.Errorf("invalid --server pk: %w", e)
			}
		}

		ctx, cancel := cmdutil.SignalContext(context.Background(), plog)
		defer cancel()
		probeCtx, probeCancel := context.WithTimeout(ctx, 30*time.Second)
		defer probeCancel()

		dest := "dmsg://" + dpk.Hex() + ":" + strconv.Itoa(int(port))
		dmsgC, stop, err := dmsgclient.InitDmsgWithFlags(probeCtx, plog, pk, sk, &http.Client{}, dest)
		if err != nil || dmsgC == nil {
			return fmt.Errorf("failed to start dmsg client: %w", err)
		}
		defer stop()

		startT := time.Now()
		var reachable bool
		if serverSet {
			reachable = dmsgC.ProbeViaServer(probeCtx, dpk, port, serverPK)
		} else {
			reachable = dmsgC.Probe(probeCtx, dpk, port)
		}
		lat := time.Since(startT).Round(time.Millisecond)

		suffix := ""
		if serverSet {
			suffix = " (via " + probeServer[:min(8, len(probeServer))] + "…)"
		}
		state := "unreachable"
		if reachable {
			state = "reachable"
		}
		cmdutil.Printf("dmsg://%s:%d%s — %s (%s)\n", dpk, port, suffix, state, lat)
		return nil
	},
}

RootCmd is the standalone `dmsg probe` command. It is the standalone (no-visor) counterpart to `skywire cli dmsg probe`: same reachability check, but it always bootstraps its own dmsg client (mirrors the dmsgcurl ↔ `cli dmsg curl` split). There is no RPC mode here because a standalone binary has no visor to ask.

Functions

func Execute

func Execute()

Execute executes the RootCmd.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL