From 16a4e652efbf61b533ffcfc31b93c5b361b2da10 Mon Sep 17 00:00:00 2001 From: Jan Saidl Date: Thu, 3 Oct 2024 23:20:39 +0200 Subject: [PATCH] Revert "improvement: determine vpn activity by checking existence of 'zerops' network interface, no more pinging" This reverts commit b456f8faa42fb3de68a68f1bb5d35dfa65288ce1. --- src/cmd/logout.go | 2 +- src/cmd/root.go | 2 +- src/cmd/vpnDown.go | 1 - src/cmd/vpnUp.go | 40 ++++++++++++++++++++++----------- src/cmdBuilder/buildCobraCmd.go | 1 - src/cmdBuilder/cmd.go | 6 ----- src/i18n/en.go | 5 ++--- src/i18n/i18n.go | 10 ++++----- src/uxBlock/spinner.go | 6 ++--- 9 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/cmd/logout.go b/src/cmd/logout.go index bc8f8f4f..9a2a0450 100644 --- a/src/cmd/logout.go +++ b/src/cmd/logout.go @@ -27,7 +27,7 @@ func logoutCmd() *cmdBuilder.Cmd { } uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.LogoutVpnDisconnecting))) - if isVpnUp(uxBlocks) { + if isVpnUp(ctx, uxBlocks, 1) { _ = disconnectVpn(ctx, uxBlocks) } uxBlocks.PrintInfo(styles.SuccessLine(i18n.T(i18n.LogoutSuccess))) diff --git a/src/cmd/root.go b/src/cmd/root.go index 366880a3..0b8bb536 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -77,7 +77,7 @@ func rootCmd() *cmdBuilder.Cmd { } var vpnStatusText string - if isVpnUp(cmdData.UxBlocks) { + if isVpnUp(ctx, cmdData.UxBlocks, 1) { vpnStatusText = i18n.T(i18n.VpnCheckingConnectionIsActive) } else { vpnStatusText = i18n.T(i18n.VpnCheckingConnectionIsNotActive) diff --git a/src/cmd/vpnDown.go b/src/cmd/vpnDown.go index 7d7ec9b5..7d2214b3 100644 --- a/src/cmd/vpnDown.go +++ b/src/cmd/vpnDown.go @@ -17,7 +17,6 @@ import ( func vpnDownCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("down"). - Alias("d", "stop"). Short(i18n.T(i18n.CmdDescVpnDown)). HelpFlag(i18n.T(i18n.CmdHelpVpnDown)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { diff --git a/src/cmd/vpnUp.go b/src/cmd/vpnUp.go index d670c9c5..a1e2856d 100644 --- a/src/cmd/vpnUp.go +++ b/src/cmd/vpnUp.go @@ -2,11 +2,12 @@ package cmd import ( "context" - "net" "os" "time" "github.com/pkg/errors" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" + "github.com/zeropsio/zcli/src/cliStorage" "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" @@ -15,6 +16,7 @@ import ( "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/file" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/nettools" "github.com/zeropsio/zcli/src/uxBlock" "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" @@ -23,13 +25,13 @@ import ( "github.com/zeropsio/zerops-go/dto/input/path" "github.com/zeropsio/zerops-go/types" "github.com/zeropsio/zerops-go/types/uuid" - "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) +const vpnCheckAddress = "logger.core.zerops" + func vpnUpCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("up"). - Alias("u", "start"). Short(i18n.T(i18n.CmdDescVpnUp)). ScopeLevel(scope.Project). Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()). @@ -38,7 +40,7 @@ func vpnUpCmd() *cmdBuilder.Cmd { LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks - if isVpnUp(uxBlocks) { + if isVpnUp(ctx, uxBlocks, 1) { if cmdData.Params.GetBool("auto-disconnect") { err := disconnectVpn(ctx, uxBlocks) if err != nil { @@ -131,7 +133,7 @@ func vpnUpCmd() *cmdBuilder.Cmd { } // wait for the vpn to be up - if isVpnUp(uxBlocks) { + if isVpnUp(ctx, uxBlocks, 6) { uxBlocks.PrintInfo(styles.SuccessLine(i18n.T(i18n.VpnUp))) } else { uxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.VpnPingFailed))) @@ -141,16 +143,28 @@ func vpnUpCmd() *cmdBuilder.Cmd { }) } -// errNoSuchInterface copied from 'net' package, because it's private :) -var errNoSuchInterface = errors.New("no such network interface") +func isVpnUp(ctx context.Context, uxBlocks uxBlock.UxBlocks, attempts int) bool { + p := []uxHelpers.Process{ + { + F: func(ctx context.Context) error { + for i := 0; i < attempts; i++ { + err := nettools.Ping(ctx, vpnCheckAddress) + if err == nil { + return nil + } -func isVpnUp(uxBlocks uxBlock.UxBlocks) bool { - _, err := net.InterfaceByName(constants.WgInterfaceName) - opError := &net.OpError{} - // cannot use errors.Is(), because std error package does not implement Is() interface, so we have this abomination - if errors.As(err, &opError) && opError.Err.Error() != errNoSuchInterface.Error() { - uxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.WarnVpnInterface, opError.Err.Error()))) + time.Sleep(time.Millisecond * 500) + } + return errors.New(i18n.T(i18n.VpnPingFailed)) + }, + RunningMessage: i18n.T(i18n.VpnCheckingConnection), + ErrorMessageMessage: "", + SuccessMessage: "", + }, } + + err := uxHelpers.ProcessCheckWithSpinner(ctx, uxBlocks, p) + return err == nil } diff --git a/src/cmdBuilder/buildCobraCmd.go b/src/cmdBuilder/buildCobraCmd.go index 1aa4c7a7..99be8208 100644 --- a/src/cmdBuilder/buildCobraCmd.go +++ b/src/cmdBuilder/buildCobraCmd.go @@ -38,7 +38,6 @@ func buildCobraCmd( argNames[i] = argName } cobraCmd.Use = strings.Join(append([]string{cmd.use}, argNames...), " ") - cobraCmd.Aliases = cmd.aliases if cmd.scopeLevel != nil { cmd.scopeLevel.AddCommandFlags(cmd) diff --git a/src/cmdBuilder/cmd.go b/src/cmdBuilder/cmd.go index a8ffe09f..4d4a7f60 100644 --- a/src/cmdBuilder/cmd.go +++ b/src/cmdBuilder/cmd.go @@ -14,7 +14,6 @@ type ScopeLevel interface { type Cmd struct { use string - aliases []string short string long string helpTemplate string @@ -61,11 +60,6 @@ func (cmd *Cmd) Use(use string) *Cmd { return cmd } -func (cmd *Cmd) Alias(aliases ...string) *Cmd { - cmd.aliases = append(cmd.aliases, aliases...) - return cmd -} - func (cmd *Cmd) SetHelpTemplate(template string) *Cmd { cmd.helpTemplate = template return cmd diff --git a/src/i18n/en.go b/src/i18n/en.go index 07811ecb..957cde63 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -199,9 +199,8 @@ at https://docs.zerops.io/references/cli for further details.`, CmdDescEnv: "Displays global environment variables, their paths and additional options", // vpn - CmdHelpVpn: "the vpn command.", - CmdDescVpn: "VPN commands group", - WarnVpnInterface: "Error getting vpn network interface: %s", + CmdHelpVpn: "the vpn command.", + CmdDescVpn: "VPN commands group", // vpn up CmdHelpVpnUp: "the vpn up command.", diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index 871bf471..60e8a88a 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -2,11 +2,10 @@ package i18n import "fmt" -func T(textConst string, args ...any) string { +func T(textConst string, args ...interface{}) string { translation, exists := en[textConst] if !exists { - format := textConst - return "[missing translation] " + fmt.Sprintf(format, args...) + return "[missing translation] " + textConst } if len(args) > 0 { return fmt.Sprintf(translation, args...) @@ -182,9 +181,8 @@ const ( Documentation = "Documentation" // vpn - CmdHelpVpn = "CmdHelpVpn" - CmdDescVpn = "CmdDescVpn" - WarnVpnInterface = "WarnVpnInterface" + CmdHelpVpn = "CmdHelpVpn" + CmdDescVpn = "CmdDescVpn" // vpn up CmdHelpVpnUp = "CmdHelpVpnUp" diff --git a/src/uxBlock/spinner.go b/src/uxBlock/spinner.go index 4d13452e..46874ceb 100644 --- a/src/uxBlock/spinner.go +++ b/src/uxBlock/spinner.go @@ -58,7 +58,7 @@ type spinnerModel struct { type MergeMessage []tea.Cmd -func sequence(cmdList ...tea.Cmd) func() tea.Msg { +func XXX(cmdList ...tea.Cmd) func() tea.Msg { return func() tea.Msg { return MergeMessage(cmdList) } @@ -69,7 +69,7 @@ func (m *spinnerModel) Init() tea.Cmd { ticks[i] = m.spinners[i].init() } - return sequence(ticks...) + return XXX(ticks...) } func (m *spinnerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { @@ -109,7 +109,7 @@ func (m *spinnerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { }(i) } wg.Wait() - return m, sequence(cmdList...) + return m, XXX(cmdList...) } return m, nil }