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=