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

commands

package
v1.3.103 Latest Latest
Warning

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

Go to latest
Published: Oct 24, 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