diff --git a/cmd/up/client/client.go b/cmd/up/client/client.go index 2518d77..74f3dcc 100644 --- a/cmd/up/client/client.go +++ b/cmd/up/client/client.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "log" + "net" "os" "os/exec" "os/signal" @@ -55,6 +56,27 @@ type ClientUpCmdOpts struct { UpstreamDNS []string } +// validateDNSIP ensures the given DNS server string is a valid IP address. +// The input may be "ip" or "ip:port"; only the host part is validated. +func validateDNSIP(s, field string) error { + s = strings.TrimSpace(s) + if s == "" { + return fmt.Errorf("%s: DNS server cannot be empty", field) + } + host := s + if strings.Contains(s, ":") { + var err error + host, _, err = net.SplitHostPort(s) + if err != nil { + return fmt.Errorf("%s: invalid address %q: %w", field, s, err) + } + } + if net.ParseIP(host) == nil { + return fmt.Errorf("%s: must be a valid IP address, got %q", field, host) + } + return nil +} + func ClientUpCmd() *cobra.Command { opts := ClientUpCmdOpts{} @@ -72,6 +94,15 @@ func ClientUpCmd() *cobra.Command { return errors.New("--silent and --attached options conflict") } + if err := validateDNSIP(opts.DNS, "netstack-dns"); err != nil { + return err + } + for i, server := range opts.UpstreamDNS { + if err := validateDNSIP(server, fmt.Sprintf("upstream-dns[%d]", i)); err != nil { + return err + } + } + return nil }, Run: func(cmd *cobra.Command, args []string) { @@ -97,8 +128,8 @@ func ClientUpCmd() *cobra.Command { cmd.Flags().DurationVar(&opts.PingTimeout, "ping-timeout", 5*time.Second, "Ping `timeout`") cmd.Flags().BoolVar(&opts.Holepunch, "holepunch", true, "Enable holepunching") cmd.Flags().StringVar(&opts.TlsClientCert, "tls-client-cert", "", "TLS client certificate `path`") - cmd.Flags().BoolVar(&opts.OverrideDNS, "override-dns", true, "Override system DNS for resolving internal resource alias") - cmd.Flags().BoolVar(&opts.TunnelDNS, "tunnel-dns", false, "Use tunnel DNS for internal resource alias resolution") + cmd.Flags().BoolVar(&opts.OverrideDNS, "override-dns", true, "When enabled, the client uses custom DNS servers to resolve internal resources and aliases. This overrides your system's default DNS settings. Queries that cannot be resolved as a Pangolin resource will be forwarded to your configured Upstream DNS Server.") + cmd.Flags().BoolVar(&opts.TunnelDNS, "tunnel-dns", false, "When enabled, DNS queries are routed through the tunnel for remote resolution. To ensure queries are tunneled correctly, you must define the DNS server as a Pangolin resource and enter its address as an Upstream DNS Server.") cmd.Flags().StringSliceVar(&opts.UpstreamDNS, "upstream-dns", []string{defaultDNSServer}, "List of DNS servers to use for external DNS resolution if overriding system DNS") cmd.Flags().BoolVar(&opts.Attached, "attach", false, "Run in attached (foreground) mode, (default: detached (background) mode)") cmd.Flags().BoolVar(&opts.Silent, "silent", false, "Disable TUI and run silently when detached") @@ -196,7 +227,7 @@ func clientUpMain(cmd *cobra.Command, opts *ClientUpCmdOpts, extraArgs []string) } if newCredsGenerated { - fmt.Println("New creds generated saving them") + // fmt.Println("New creds generated saving them") // Update the account in the store since ActiveAccount() returns a copy if err := accountStore.UpdateActiveAccount(activeAccount); err != nil { logger.Error("Failed to update account in store: %v", err) diff --git a/docs/pangolin.md b/docs/pangolin.md index 29cfca1..f03379d 100644 --- a/docs/pangolin.md +++ b/docs/pangolin.md @@ -22,4 +22,4 @@ Pangolin CLI * [pangolin update](pangolin_update.md) - Update Pangolin CLI to the latest version * [pangolin version](pangolin_version.md) - Print the version number -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_apply.md b/docs/pangolin_apply.md index 63b13f8..8a060b0 100644 --- a/docs/pangolin_apply.md +++ b/docs/pangolin_apply.md @@ -17,4 +17,4 @@ Apply resources to the Pangolin server * [pangolin](pangolin.md) - Pangolin CLI * [pangolin apply blueprint](pangolin_apply_blueprint.md) - Apply a blueprint -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_apply_blueprint.md b/docs/pangolin_apply_blueprint.md index 06ab93a..2a8fc6b 100644 --- a/docs/pangolin_apply_blueprint.md +++ b/docs/pangolin_apply_blueprint.md @@ -22,4 +22,4 @@ pangolin apply blueprint [flags] * [pangolin apply](pangolin_apply.md) - Apply commands -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_auth.md b/docs/pangolin_auth.md index 4fb62d5..d39632e 100644 --- a/docs/pangolin_auth.md +++ b/docs/pangolin_auth.md @@ -19,4 +19,4 @@ Manage authentication and sessions * [pangolin auth logout](pangolin_auth_logout.md) - Logout from Pangolin * [pangolin auth status](pangolin_auth_status.md) - Check authentication status -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_auth_login.md b/docs/pangolin_auth_login.md index 0e82a24..ec41ef8 100644 --- a/docs/pangolin_auth_login.md +++ b/docs/pangolin_auth_login.md @@ -20,4 +20,4 @@ pangolin auth login [hostname] [flags] * [pangolin auth](pangolin_auth.md) - Authentication commands -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_auth_logout.md b/docs/pangolin_auth_logout.md index 90ea3a8..c0b4dee 100644 --- a/docs/pangolin_auth_logout.md +++ b/docs/pangolin_auth_logout.md @@ -20,4 +20,4 @@ pangolin auth logout [flags] * [pangolin auth](pangolin_auth.md) - Authentication commands -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_auth_status.md b/docs/pangolin_auth_status.md index 9a8af31..6ec4ffa 100644 --- a/docs/pangolin_auth_status.md +++ b/docs/pangolin_auth_status.md @@ -20,4 +20,4 @@ pangolin auth status [flags] * [pangolin auth](pangolin_auth.md) - Authentication commands -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_down.md b/docs/pangolin_down.md index cb00ef9..9548971 100644 --- a/docs/pangolin_down.md +++ b/docs/pangolin_down.md @@ -24,4 +24,4 @@ pangolin down [flags] * [pangolin](pangolin.md) - Pangolin CLI * [pangolin down client](pangolin_down_client.md) - Stop the client connection -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_down_client.md b/docs/pangolin_down_client.md index fa656d0..305aa29 100644 --- a/docs/pangolin_down_client.md +++ b/docs/pangolin_down_client.md @@ -20,4 +20,4 @@ pangolin down client [flags] * [pangolin down](pangolin_down.md) - Stop a connection -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_login.md b/docs/pangolin_login.md index aceb9ff..5da60b0 100644 --- a/docs/pangolin_login.md +++ b/docs/pangolin_login.md @@ -20,4 +20,4 @@ pangolin login [hostname] [flags] * [pangolin](pangolin.md) - Pangolin CLI -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_logout.md b/docs/pangolin_logout.md index 13172d3..8f7e275 100644 --- a/docs/pangolin_logout.md +++ b/docs/pangolin_logout.md @@ -20,4 +20,4 @@ pangolin logout [flags] * [pangolin](pangolin.md) - Pangolin CLI -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_logs.md b/docs/pangolin_logs.md index 857311c..5722f6a 100644 --- a/docs/pangolin_logs.md +++ b/docs/pangolin_logs.md @@ -17,4 +17,4 @@ View and follow client logs * [pangolin](pangolin.md) - Pangolin CLI * [pangolin logs client](pangolin_logs_client.md) - View client logs -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_logs_client.md b/docs/pangolin_logs_client.md index 2c87767..bd24465 100644 --- a/docs/pangolin_logs_client.md +++ b/docs/pangolin_logs_client.md @@ -22,4 +22,4 @@ pangolin logs client [flags] * [pangolin logs](pangolin_logs.md) - View client logs -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_select.md b/docs/pangolin_select.md index 9d4ba36..1b70d51 100644 --- a/docs/pangolin_select.md +++ b/docs/pangolin_select.md @@ -18,4 +18,4 @@ Select account information to use * [pangolin select account](pangolin_select_account.md) - Select an account * [pangolin select org](pangolin_select_org.md) - Select an organization -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_select_account.md b/docs/pangolin_select_account.md index 654182a..f3fcb79 100644 --- a/docs/pangolin_select_account.md +++ b/docs/pangolin_select_account.md @@ -22,4 +22,4 @@ pangolin select account [flags] * [pangolin select](pangolin_select.md) - Select account information to use -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_select_org.md b/docs/pangolin_select_org.md index 2854326..fcf8604 100644 --- a/docs/pangolin_select_org.md +++ b/docs/pangolin_select_org.md @@ -21,4 +21,4 @@ pangolin select org [flags] * [pangolin select](pangolin_select.md) - Select account information to use -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_status.md b/docs/pangolin_status.md index 5f18add..2c04840 100644 --- a/docs/pangolin_status.md +++ b/docs/pangolin_status.md @@ -25,4 +25,4 @@ pangolin status [flags] * [pangolin](pangolin.md) - Pangolin CLI * [pangolin status client](pangolin_status_client.md) - Show client status -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_status_client.md b/docs/pangolin_status_client.md index c790722..234391b 100644 --- a/docs/pangolin_status_client.md +++ b/docs/pangolin_status_client.md @@ -21,4 +21,4 @@ pangolin status client [flags] * [pangolin status](pangolin_status.md) - Status commands -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_up.md b/docs/pangolin_up.md index 123ffd2..5d07558 100644 --- a/docs/pangolin_up.md +++ b/docs/pangolin_up.md @@ -27,13 +27,13 @@ pangolin up [flags] --mtu int Maximum transmission unit (default 1280) --netstack-dns server DNS server to use for Netstack (default "1.1.1.1") --org string Organization ID (default: selected organization if logged in) - --override-dns Override system DNS for resolving internal resource alias (default true) + --override-dns When enabled, the client uses custom DNS servers to resolve internal resources and aliases. This overrides your system's default DNS settings. Queries that cannot be resolved as a Pangolin resource will be forwarded to your configured Upstream DNS Server. (default true) --ping-interval interval Ping interval (default 5s) --ping-timeout timeout Ping timeout (default 5s) --secret string Client secret (optional, will use user info if not provided) --silent Disable TUI and run silently when detached --tls-client-cert path TLS client certificate path - --tunnel-dns Use tunnel DNS for internal resource alias resolution + --tunnel-dns When enabled, DNS queries are routed through the tunnel for remote resolution. To ensure queries are tunneled correctly, you must define the DNS server as a Pangolin resource and enter its address as an Upstream DNS Server. --upstream-dns strings List of DNS servers to use for external DNS resolution if overriding system DNS (default [1.1.1.1]) ``` @@ -42,4 +42,4 @@ pangolin up [flags] * [pangolin](pangolin.md) - Pangolin CLI * [pangolin up client](pangolin_up_client.md) - Start a client connection -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_up_client.md b/docs/pangolin_up_client.md index d71e9cb..c06108f 100644 --- a/docs/pangolin_up_client.md +++ b/docs/pangolin_up_client.md @@ -24,13 +24,13 @@ pangolin up client [flags] --mtu int Maximum transmission unit (default 1280) --netstack-dns server DNS server to use for Netstack (default "1.1.1.1") --org string Organization ID (default: selected organization if logged in) - --override-dns Override system DNS for resolving internal resource alias (default true) + --override-dns When enabled, the client uses custom DNS servers to resolve internal resources and aliases. This overrides your system's default DNS settings. Queries that cannot be resolved as a Pangolin resource will be forwarded to your configured Upstream DNS Server. (default true) --ping-interval interval Ping interval (default 5s) --ping-timeout timeout Ping timeout (default 5s) --secret string Client secret (optional, will use user info if not provided) --silent Disable TUI and run silently when detached --tls-client-cert path TLS client certificate path - --tunnel-dns Use tunnel DNS for internal resource alias resolution + --tunnel-dns When enabled, DNS queries are routed through the tunnel for remote resolution. To ensure queries are tunneled correctly, you must define the DNS server as a Pangolin resource and enter its address as an Upstream DNS Server. --upstream-dns strings List of DNS servers to use for external DNS resolution if overriding system DNS (default [1.1.1.1]) ``` @@ -38,4 +38,4 @@ pangolin up client [flags] * [pangolin up](pangolin_up.md) - Start a connection -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_update.md b/docs/pangolin_update.md index 9b6d8b6..02eabfb 100644 --- a/docs/pangolin_update.md +++ b/docs/pangolin_update.md @@ -20,4 +20,4 @@ pangolin update [flags] * [pangolin](pangolin.md) - Pangolin CLI -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/docs/pangolin_version.md b/docs/pangolin_version.md index 696eab6..586c8f1 100644 --- a/docs/pangolin_version.md +++ b/docs/pangolin_version.md @@ -20,4 +20,4 @@ pangolin version [flags] * [pangolin](pangolin.md) - Pangolin CLI -###### Auto generated by spf13/cobra on 23-Jan-2026 +###### Auto generated by spf13/cobra on 27-Jan-2026 diff --git a/go.mod b/go.mod index e809787..7722478 100644 --- a/go.mod +++ b/go.mod @@ -76,5 +76,5 @@ require ( // If changes to Olm or Newt are required, use these // replace directives during development. // -// replace github.com/fosrl/olm => ../olm -// replace github.com/fosrl/newt => ../newt +replace github.com/fosrl/olm => ../olm +replace github.com/fosrl/newt => ../newt diff --git a/internal/version/consts.go b/internal/version/consts.go index 2228331..359fca9 100644 --- a/internal/version/consts.go +++ b/internal/version/consts.go @@ -1,4 +1,4 @@ package version // Version is the current version of the Pangolin CLI -const Version = "0.3.0" +const Version = "0.3.1" diff --git a/scripts/set-version.sh b/scripts/set-version.sh new file mode 100755 index 0000000..a5a4297 --- /dev/null +++ b/scripts/set-version.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Bump the CLI version by replacing the version in internal/version/consts.go + +set -e + +VERSION_FILE="internal/version/consts.go" + +if [ -z "$1" ]; then + echo "Usage: $0 " + echo "Example: $0 0.4.0" + exit 1 +fi + +NEW_VERSION="$1" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +cd "$REPO_ROOT" + +if [ ! -f "$VERSION_FILE" ]; then + echo "Error: $VERSION_FILE not found" + exit 1 +fi + +# Replace the version in consts.go (matches: const Version = "X.Y.Z") +case $(uname) in + Darwin) sed -i '' "s/const Version = \"[^\"]*\"/const Version = \"$NEW_VERSION\"/" "$VERSION_FILE" ;; + *) sed -i "s/const Version = \"[^\"]*\"/const Version = \"$NEW_VERSION\"/" "$VERSION_FILE" ;; +esac + +if grep -q "const Version = \"$NEW_VERSION\"" "$VERSION_FILE"; then + echo "Version bumped to $NEW_VERSION in $VERSION_FILE" +else + echo "Error: failed to update version" + exit 1 +fi