From c3c4bb44ba38c21c09d88613fdf864f3ea70dd48 Mon Sep 17 00:00:00 2001 From: DG Date: Mon, 9 Aug 2021 22:59:45 -0400 Subject: [PATCH] Add --reconnect flag (#43) * Allow --reconnect and --random to work in unison * Fix goreleaser --- .github/workflows/goreleaser.yml | 4 +- README.md | 13 ++++--- cmd/connect.go | 66 ++++++++++++++++++-------------- 3 files changed, 47 insertions(+), 36 deletions(-) diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 61f1f86..6c0ae4a 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -18,7 +18,7 @@ jobs: name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.15 + go-version: 1.16 - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 @@ -26,4 +26,4 @@ jobs: version: latest args: release --rm-dist env: - GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index e051b71..5e8867b 100644 --- a/README.md +++ b/README.md @@ -72,12 +72,15 @@ If the country doesn't matter, a random server can be selected: $ sudo vpngate connect --random ``` +#### Reconnect + +To continually attempt to reconnect (this can be combined with `--random`): + +```console +$ sudo vpngate connect --reconnect +``` + ## Notes - I do not maintain any of the servers on vpngate.net (connect to these servers at your own discretion) - Many of the listed servers claim to have a logging policy of 2 weeks - - -## Todo - -- Allow for servers to be cycled periodically (--cycle) diff --git a/cmd/connect.go b/cmd/connect.go index 057c7ca..3b33a46 100644 --- a/cmd/connect.go +++ b/cmd/connect.go @@ -18,9 +18,11 @@ import ( ) var flagRandom bool +var flagReconnect bool func init() { connectCmd.Flags().BoolVarP(&flagRandom, "random", "r", false, "connect to a random server") + connectCmd.Flags().BoolVarP(&flagReconnect, "reconnect", "t", false, "continually attempt to connect to the server") rootCmd.AddCommand(connectCmd) } @@ -51,11 +53,7 @@ var connectCmd = &cobra.Command{ Options: serverSelection, } - if flagRandom { - // Select a random server - rand.Seed(time.Now().UnixNano()) - serverSelected = (*vpnServers)[rand.Intn(len(*vpnServers))] - } else { + if !flagRandom { if len(args) > 0 { selection = args[0] @@ -80,37 +78,47 @@ var connectCmd = &cobra.Command{ } } - decodedConfig, err := base64.StdEncoding.DecodeString(serverSelected.OpenVpnConfigData) - if err != nil { - log.Fatal().Msgf(err.Error()) - os.Exit(1) - } + for { - tmpfile, err := ioutil.TempFile("", "vpngate-openvpn-config-") - if err != nil { - log.Fatal().Msgf(err.Error()) - os.Exit(1) - } + if flagRandom { + // Select a random server + rand.Seed(time.Now().UnixNano()) + serverSelected = (*vpnServers)[rand.Intn(len(*vpnServers))] + } - defer os.Remove(tmpfile.Name()) + decodedConfig, err := base64.StdEncoding.DecodeString(serverSelected.OpenVpnConfigData) + if err != nil { + log.Fatal().Msgf(err.Error()) + os.Exit(1) + } - if _, err := tmpfile.Write(decodedConfig); err != nil { - log.Fatal().Msgf(err.Error()) - os.Exit(1) - } + tmpfile, err := ioutil.TempFile("", "vpngate-openvpn-config-") + if err != nil { + log.Fatal().Msgf(err.Error()) + os.Exit(1) + } - if err := tmpfile.Close(); err != nil { - log.Fatal().Msgf(err.Error()) - os.Exit(1) - } + if _, err := tmpfile.Write(decodedConfig); err != nil { + log.Fatal().Msgf(err.Error()) + os.Exit(1) + } - log.Info().Msgf("Connecting to %s (%s) in %s", serverSelected.HostName, serverSelected.IPAddr, serverSelected.CountryLong) + if err := tmpfile.Close(); err != nil { + log.Fatal().Msgf(err.Error()) + os.Exit(1) + } - err = vpn.Connect(tmpfile.Name()) + log.Info().Msgf("Connecting to %s (%s) in %s", serverSelected.HostName, serverSelected.IPAddr, serverSelected.CountryLong) + + err = vpn.Connect(tmpfile.Name()) + + if err != nil && !flagReconnect { + log.Fatal().Msgf(err.Error()) + os.Exit(1) + } else { + os.Remove(tmpfile.Name()) + } - if err != nil { - log.Fatal().Msgf(err.Error()) - os.Exit(1) } },