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

commands

package
v1.3.104-alpha1 Latest Latest
Warning

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

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

Documentation

Overview

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

Package commands cmd/dmsg/dmsgweb/commands/dmsgwebsrv.go c1-net-dmsg

Package commands cmd/dmsg/dmsgweb/commands/root.go c1-net-dmsg

Index

Constants

This section is empty.

Variables

View Source
var RootCmd = &cobra.Command{
	Use:   dmsgclient.ExecName(),
	Short: "DMSG resolving proxy & browser client",
	Long: `
	┌┬┐┌┬┐┌─┐┌─┐┬ ┬┌─┐┌┐
	 │││││└─┐│ ┬│││├┤ ├┴┐
	─┴┘┴ ┴└─┘└─┘└┴┘└─┘└─┘
DMSG resolving proxy & browser client - access websites, HTTP & TCP interfaces over DMSG` + func() string {
		if _, err := os.Stat(dwcfg); err == nil {
			return `
dmsgweb conf file detected: ` + dwcfg
		}
		return `
.conf file may also be specified with
` + dwenv + `=/path/to/dmsgweb.conf skywire dmsg web`
	}(),
	SilenceErrors:         true,
	SilenceUsage:          true,
	DisableSuggestions:    true,
	DisableFlagsInUseLine: true,
	Version:               buildinfo.Version(),
	PreRun: func(_ *cobra.Command, _ []string) {
		if isEnvs {
			printEnvs(envfileLinux)
		}
		if logLvl != "" {
			if lvl, err := logging.LevelFromString(logLvl); err == nil {
				logging.SetLevel(lvl)
			}
		}
		dlog = logging.MustGetLogger("dmsgweb")

		err = dmsgclient.InitConfig()
		if err != nil {
			dlog.WithError(err).Fatal("Failed to read specified dmsghttp-config")
		}

		if dmsgclient.DmsgDiscURL == "" {
			dlog.Fatal("Dmsg Discovery Server URL not specified")
		}
		if dmsgclient.DmsgDiscAddr == "" {
			dlog.Fatal("Dmsg Discovery Server dmsg address not specified")
		}

		if len(resolveDmsgAddr) > 0 && len(webPort) != len(resolveDmsgAddr) {
			dlog.Fatal("--resolve -t flag cannot contain a different number of elements than --port -p flag")
		}
		if len(resolveDmsgAddr) == 0 && len(webPort) > 1 {
			dlog.Fatal("--port -p flag cannot specify multiple ports without specifying multiple dmsg address:port(s) to --resolve -t flag")
		}

		seenResolveDmsgAddr := make(map[string]bool)
		for _, item := range resolveDmsgAddr {
			if seenResolveDmsgAddr[item] {
				dlog.Fatal("--resolve -t flag cannot contain duplicates")
			}
			seenResolveDmsgAddr[item] = true
		}

		seenWebPort := make(map[uint]bool)
		for _, item := range webPort {
			if seenWebPort[item] {
				dlog.Fatal("--port -p flag cannot contain duplicates")
			}
			seenWebPort[item] = true
		}

		if len(webPort) == 0 {
			dlog.Fatal("webPort is empty. Ensure at least one port is specified.")
		}
		if filterDomainSuffix == "" {
			dlog.Fatal("domain suffix to filter cannot be an empty string")
		}
	},
	Run: func(_ *cobra.Command, _ []string) {
		stopPProf := dmsgcmdutil.InitPProf(dlog, pprofMode, pprofAddr)
		defer stopPProf()

		ctx, cancel := cmdutil.SignalContext(context.Background(), dlog)
		defer cancel()

		pk, err = sk.PubKey()
		if err != nil {
			pk, sk = cipher.GenerateKeyPair()
		}
		dlog.Info("dmsg client pk: ", pk.String())

		targets := make([]dmsgweb.DmsgTarget, 0, len(resolveDmsgAddr))
		for _, raw := range resolveDmsgAddr {
			t, parseErr := dmsgweb.ParseDmsgTarget(raw)
			if parseErr != nil {
				dlog.WithError(parseErr).Fatal("invalid --resolve entry")
			}
			targets = append(targets, t)
		}

		// Set up the outer HTTP client used to bootstrap dmsg itself
		// (mirrors previous behavior — if --proxy is set the dmsg
		// bootstrap fetches go through the upstream SOCKS5 too).
		var outerHTTP *http.Client
		if proxyAddr != "" {
			d, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct)
			if err != nil {
				dlog.WithError(err).Fatal("Error creating SOCKS5 dialer")
			}
			outerHTTP = &http.Client{Transport: &http.Transport{DialContext: d.(proxy.ContextDialer).DialContext}}
		} else {
			outerHTTP = &http.Client{}
		}

		var via *dmsgweb.SkynetVia
		if skynetVia != "" {
			visorPK, addr, err := dmsgweb.ParseSkynetVia(skynetVia)
			if err != nil {
				dlog.WithError(err).Fatal("invalid --skynet")
			}
			via, err = dmsgweb.StartSkynetVia(ctx, dlog, logging.NewMasterLogger(), pk, sk, visorPK, addr, types.Type(skynetType))
			if err != nil {
				dlog.WithError(err).Fatal("skynet via the local visor")
			}
		}

		var (
			dmsgC     *dmsg.Client
			closeDmsg func()
			err       error
		)
		if via != nil && dmsgclient.DmsgAttach == "" {
			dmsgC, closeDmsg, err = via.DmsgClient(ctx, dlog, pk, sk)
		} else {
			dmsgC, closeDmsg, err = dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, outerHTTP, "")
		}
		if err != nil {
			dlog.WithError(err).Error("Error connecting to dmsg network")
			return
		}
		defer closeDmsg()

		cfg := dmsgweb.Config{
			DomainSuffix:  filterDomainSuffix,
			WebPorts:      webPort,
			ProxyPort:     proxyPort,
			ResolveAddr:   targets,
			UpstreamSOCKS: addProxy,
		}
		if via != nil {
			cfg.SkynetDial = via.Dial
		}
		if err := dmsgweb.Run(ctx, dlog, dmsgC, cfg); err != nil && err != context.Canceled {
			dlog.WithError(err).Error("dmsgweb runtime stopped")
		}
	},
}

RootCmd contains the root command for dmsgweb

Functions

func Execute

func Execute()

Execute executes root CLI command.

Types

This section is empty.

Jump to

Keyboard shortcuts

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