feat: Refine `portal-tunnel` CLI flag parsing for `host` and `relay` arguments, update `broccoli` dependency, and improve help message output.

lemon-mint committed Dec 12, 2025 at 12:57 UTC 2a60152fff7149efe3fa74df251084f251d89ea3
4 files changed +25 -22
cmd/portal-tunnel/README.md
+16 -17
@@ -9,8 +9,8 @@ You can run the tunnel using command-line flags or a configuration file.
9 ### Run binary
10
11 ```bash
12 -./bin/portal-tunnel --host localhost --port 8080 \
13 - --relay portal.gosuda.org,portal.thumbgo.kr,portal.iwanhae.kr \
12 +./bin/portal-tunnel --host localhost:8080 \
13 + --relay ws://portal.gosuda.org/relay,ws://portal.thumbgo.kr/relay,ws://portal.iwanhae.kr/relay \
14 --name <service> \
15 --description "Service description" \
16 --tags tag1,tag2 \
@@ -20,19 +20,18 @@ You can run the tunnel using command-line flags or a configuration file.
20 ## Flags
21
22 ```text
23 -Usage:
24 - portal-tunnel [flags]
25 -
26 -Flags:
27 - --config string Path to portal-tunnel config file
28 - --description string Service description metadata
29 - -h, --help help for portal-tunnel
30 - --hide Hide service from discovery (metadata)
31 - --host string Local host to proxy to when config is not provided (default "localhost")
32 - --name string Service name when config is not provided (auto-generated if empty)
33 - --owner string Service owner metadata
34 - --port string Local port to proxy to when config is not provided (default "4018")
35 - --relay string Portal relay server URLs when config is not provided (comma-separated) (default "ws://localhost:4017/relay")
36 - --tags string Service tags metadata (comma-separated)
37 - --thumbnail string Service thumbnail URL metadata
23 +Usage:
24 + portal-tunnel [OPTIONS] [ARGUMENTS]
25 +
26 +Options:
27 + --relay Portal relay server URLs (comma-separated) [default: ws://localhost:4017/relay] [env: RELAYS]
28 + --host Target host to proxy to (host:port or URL) [env: APP_HOST]
29 + --name Service name [env: APP_NAME]
30 + --protocols ALPN protocols (comma-separated) [default: http/1.1,h2] [env: APP_PROTOCOLS]
31 + --description Service description metadata [env: APP_DESCRIPTION]
32 + --tags Service tags metadata (comma-separated) [env: APP_TAGS]
33 + --thumbnail Service thumbnail URL metadata [env: APP_THUMBNAIL]
34 + --owner Service owner metadata [env: APP_OWNER]
35 + --hide Hide service from discovery (metadata) [env: APP_HIDE]
36 + -h, --help Print this help message and exit
37 ```
cmd/portal-tunnel/main.go
+6 -4
@@ -27,7 +27,7 @@ type Config struct {
27 _ struct{} `version:"0.0.1" command:"portal-tunnel" about:"Expose local services through Portal relay"`
28
29 RelayURLs string `flag:"relay" env:"RELAYS" default:"ws://localhost:4017/relay" about:"Portal relay server URLs (comma-separated)"`
30 - Host string `flag:"host" env:"APP_HOST" about:"target host to proxy to (host:port or URL)"`
30 + Host string `flag:"host" env:"APP_HOST" about:"Target host to proxy to (host:port or URL)"`
31 Name string `flag:"name" env:"APP_NAME" about:"Service name"`
32
33 // Metadata
@@ -49,15 +49,17 @@ func main() {
49
50 if _, _, err = app.Bind(&cfg, os.Args[1:]); err != nil {
51 if err == broccoli.ErrHelp {
52 - log.Info().Msg(app.Help())
52 + fmt.Println(app.Help())
53 os.Exit(0)
54 }
55 - log.Error().Err(err).Str("help", app.Help()).Msg("Failed to bind CLI arguments")
55 +
56 + fmt.Println(app.Help())
57 + log.Error().Err(err).Msg("Failed to bind CLI arguments")
58 os.Exit(1)
59 }
60
61 if cfg.Host == "" || cfg.Name == "" {
60 - log.Error().Str("help", app.Help()).Msg("Host and name must be provided")
62 + fmt.Println(app.Help())
63 os.Exit(1)
64 }
65
go.mod
+1 -1
@@ -12,7 +12,7 @@ require (
12 golang.org/x/crypto v0.44.0
13 golang.org/x/net v0.47.0
14 google.golang.org/protobuf v1.36.10
15 - gopkg.eu.org/broccoli v1.2.2
15 + gopkg.eu.org/broccoli v1.2.3
16 )
17
18 require (
go.sum
+2
@@ -42,6 +42,8 @@ google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aO
42 google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
43 gopkg.eu.org/broccoli v1.2.2 h1:/VnfW2PzmROadiYG+hGPz6Hczp7vghiyPvjGGIN1b3o=
44 gopkg.eu.org/broccoli v1.2.2/go.mod h1:eM8HnmLyfiQHAwqh2afErWYnAkkOvi+RXgoXBRhKMCQ=
45 +gopkg.eu.org/broccoli v1.2.3 h1:Lc6+C3n24sRGoFyYxo1qz8iiXQzwB6VcN9bLjnT9vSo=
46 +gopkg.eu.org/broccoli v1.2.3/go.mod h1:eM8HnmLyfiQHAwqh2afErWYnAkkOvi+RXgoXBRhKMCQ=
47 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
48 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
49 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=