99 Commits

Author SHA1 Message Date
renovate[bot]
1c980b4209 Update module github.com/olekukonko/tablewriter to v1 2025-11-25 02:31:03 +00:00
9545c9fd85 Update flake.nix 2025-11-24 21:30:01 -05:00
renovate[bot]
fb9c4800ae Update golangci/golangci-lint-action action to v9 (#161)
* Update golangci/golangci-lint-action action to v9

* Bump golangci-lint to 2.6.2

* Refactor to pass golangcli-lint

* Fix tests

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Dave Gallant <dave.gallant@gmail.com>
Co-authored-by: Dave Gallant <davegallant@proton.me>
2025-11-23 09:13:17 -05:00
903f93895a Update flake.nix 2025-11-23 08:35:48 -05:00
renovate[bot]
1de072bbbf Update dependency go to 1.25 (#156)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-22 07:24:38 -05:00
renovate[bot]
486fc180dd Update module github.com/spf13/cobra to v1.10.1 (#159)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-22 07:23:58 -05:00
renovate[bot]
52cadc8433 Update module github.com/stretchr/testify to v1.11.1 (#158)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-22 07:23:11 -05:00
renovate[bot]
106f8b39d2 Update actions/setup-go action to v6 (#160)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-22 07:22:36 -05:00
renovate[bot]
79c742f274 Update actions/checkout action to v6 (#162)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-22 07:22:23 -05:00
0167804252 Update flake.nix 2025-07-28 20:26:25 -04:00
renovate[bot]
acb938dfdd Update module github.com/stretchr/testify to v1.10.0 (#140)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-25 21:25:00 -04:00
Dave Gallant
5c069cb289 Add flake.nix 2025-04-06 22:05:19 -04:00
renovate[bot]
98bb23ee28 Update module github.com/rs/zerolog to v1.34.0 (#151)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-05 06:47:22 -04:00
9185801b91 Update README.md (#152) 2025-03-29 08:36:03 -04:00
renovate[bot]
4cb7af39c6 Update dependency go to 1.24 (#150)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-14 22:29:41 -04:00
renovate[bot]
552a6e3543 Update module github.com/spf13/cobra to v1.9.1 (#147)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-21 22:38:55 -05:00
renovate[bot]
8811763d7e Update module github.com/spf13/cobra to v1.9.0 (#146)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-15 22:04:52 -05:00
renovate[bot]
4bd470b95e Update module golang.org/x/net to v0.35.0 (#145)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-14 21:24:46 -05:00
renovate[bot]
9fb2a3f171 Update module golang.org/x/net to v0.34.0 (#144)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-10 21:52:17 -05:00
renovate[bot]
4e8cc6b9b7 Update module golang.org/x/net to v0.33.0 [SECURITY] (#142)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-18 23:48:59 -05:00
renovate[bot]
7afc0dd235 Update module golang.org/x/net to v0.32.0 (#141)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-06 22:01:19 -05:00
renovate[bot]
a4391ba6ee Update module golang.org/x/net to v0.31.0 (#139)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-08 19:46:14 -05:00
Dave Gallant
4c66b19a7d Add "386" goarch to .goreleaser.yaml 2024-10-04 22:16:39 -04:00
renovate[bot]
3a03348840 Update module golang.org/x/net to v0.30.0 (#138)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-04 21:40:37 -04:00
renovate[bot]
361d54c96f Update module golang.org/x/net to v0.29.0 (#135)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-06 20:45:37 -04:00
renovate[bot]
f5d788a271 Update module golang.org/x/net to v0.28.0 (#134)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-10 09:05:24 -04:00
Dave Gallant
4b202ae94c Add new asciinema to README.md 2024-07-29 20:50:35 -04:00
Dave Gallant
a72c298292 Update README.md (#133) 2024-07-28 21:29:44 -04:00
Dave Gallant
3e819c5c55 Add initial support and docs for Windows (#132)
- Add initial support for Windows
- Update docs
- Fix issue with openvpn 2.6 data-ciphers
2024-07-28 21:09:57 -04:00
Dave Gallant
885f73db1c Add proxy to list command also 2024-07-24 07:39:27 -04:00
Dave Gallant
c225d77696 Fix typo in help 2024-07-21 15:26:21 -04:00
Dave Gallant
c1548a3378 Update .goreleaser.yaml 2024-07-21 15:21:43 -04:00
Dave Gallant
86a0869bb5 Migrate to goreleaser v2 2024-07-21 15:12:00 -04:00
Dave Gallant
0ec8aa1977 Fix goreleaser action 2024-07-21 14:54:48 -04:00
Dave Gallant
667783899e Bump go-releaser workflow to go 1.22 2024-07-21 14:49:09 -04:00
renovate[bot]
ef99491fa6 Update module golang.org/x/net to v0.27.0 (#130)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-21 14:41:54 -04:00
renovate[bot]
4d458e4d47 Update module golang.org/x/net to v0.23.0 [SECURITY] (#129)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-21 14:40:08 -04:00
Dave Gallant
16aa16c66e Add support for HTTP and SOCKS5 proxies (#127)
As mentioned in https://github.com/davegallant/vpngate/issues/126, adding support for proxies will help bypass issues when vpngate.net is not accessible directly.

This works by:

```sh
# http proxy
sudo vpngate connect --proxy "http://localhost:8080"

# socks5 proxy
sudo vpngate connect --socks5 "127.0.0.1:1080"
```
2024-07-21 14:38:26 -04:00
renovate[bot]
5850876efa Update goreleaser/goreleaser-action action to v6 (#124)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-20 20:35:01 -04:00
renovate[bot]
98426b012d Update module github.com/spf13/cobra to v1.8.1 (#125)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-20 20:34:50 -04:00
Dave Gallant
679a63cc14 Update renovate.json 2024-06-28 12:02:56 -04:00
renovate[bot]
a6e6fc992f Update module github.com/rs/zerolog to v1.33.0 (#123)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-23 07:08:12 -04:00
renovate[bot]
830b40f945 Update golangci/golangci-lint-action action to v6 (#122)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-07 06:57:07 -04:00
renovate[bot]
950ef75855 Update module github.com/stretchr/testify to v1.9.0 (#120)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-02 10:36:32 -05:00
renovate[bot]
9768124578 Update golangci/golangci-lint-action action to v4 (#119)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-09 17:04:37 -05:00
renovate[bot]
88c77db4c2 Update module github.com/rs/zerolog to v1.32.0 (#118)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-04 11:21:05 -05:00
renovate[bot]
12e76d6443 Update module github.com/jszwec/csvutil to v1.10.0 (#117)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-04 09:10:01 -05:00
Dave Gallant
710b69750f Delete .github/dependabot.yml 2024-01-13 17:38:38 -05:00
renovate[bot]
039793cbd6 Add renovate.json (#115)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-13 17:38:26 -05:00
dependabot[bot]
660f20758c Bump actions/setup-go from 4 to 5 (#114)
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4 to 5.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-11 07:47:42 -05:00
dependabot[bot]
a01305cccd Bump github.com/jszwec/csvutil from 1.8.0 to 1.9.0 (#113)
Bumps [github.com/jszwec/csvutil](https://github.com/jszwec/csvutil) from 1.8.0 to 1.9.0.
- [Release notes](https://github.com/jszwec/csvutil/releases)
- [Commits](https://github.com/jszwec/csvutil/compare/v1.8.0...v1.9.0)

---
updated-dependencies:
- dependency-name: github.com/jszwec/csvutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-11 07:47:27 -05:00
dependabot[bot]
b0b36599ed Bump github.com/spf13/afero from 1.10.0 to 1.11.0 (#112)
Bumps [github.com/spf13/afero](https://github.com/spf13/afero) from 1.10.0 to 1.11.0.
- [Release notes](https://github.com/spf13/afero/releases)
- [Commits](https://github.com/spf13/afero/compare/v1.10.0...v1.11.0)

---
updated-dependencies:
- dependency-name: github.com/spf13/afero
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-04 22:14:39 -05:00
dependabot[bot]
e7c2c61335 Bump github.com/spf13/cobra from 1.7.0 to 1.8.0 (#111)
Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/spf13/cobra/releases)
- [Commits](https://github.com/spf13/cobra/compare/v1.7.0...v1.8.0)

---
updated-dependencies:
- dependency-name: github.com/spf13/cobra
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-06 08:27:10 -05:00
dependabot[bot]
41b629c45d Bump github.com/nxadm/tail from 1.4.8 to 1.4.11 (#110)
Bumps [github.com/nxadm/tail](https://github.com/nxadm/tail) from 1.4.8 to 1.4.11.
- [Changelog](https://github.com/nxadm/tail/blob/master/CHANGES.md)
- [Commits](https://github.com/nxadm/tail/compare/v1.4.8...v1.4.11)

---
updated-dependencies:
- dependency-name: github.com/nxadm/tail
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-16 07:40:43 -04:00
Dave Gallant
8fdb73df50 Bump dependencies (#109) 2023-10-05 19:16:04 -04:00
dependabot[bot]
bde340e5fb Bump github.com/rs/zerolog from 1.30.0 to 1.31.0 (#108)
Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.30.0 to 1.31.0.
- [Release notes](https://github.com/rs/zerolog/releases)
- [Commits](https://github.com/rs/zerolog/compare/v1.30.0...v1.31.0)

---
updated-dependencies:
- dependency-name: github.com/rs/zerolog
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-02 08:45:41 -04:00
dependabot[bot]
86b054fd7a Bump github.com/spf13/afero from 1.9.5 to 1.10.0 (#107)
Bumps [github.com/spf13/afero](https://github.com/spf13/afero) from 1.9.5 to 1.10.0.
- [Release notes](https://github.com/spf13/afero/releases)
- [Commits](https://github.com/spf13/afero/compare/v1.9.5...v1.10.0)

---
updated-dependencies:
- dependency-name: github.com/spf13/afero
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-25 07:45:57 -04:00
dependabot[bot]
47b434020c Bump goreleaser/goreleaser-action from 4 to 5 (#106)
Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 4 to 5.
- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)
- [Commits](https://github.com/goreleaser/goreleaser-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: goreleaser/goreleaser-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-18 08:23:26 -04:00
dependabot[bot]
4391374bcd Bump actions/checkout from 3 to 4 (#105)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-11 07:12:17 -04:00
dependabot[bot]
2609e8b969 Bump github.com/rs/zerolog from 1.29.1 to 1.30.0 (#104)
Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.29.1 to 1.30.0.
- [Release notes](https://github.com/rs/zerolog/releases)
- [Commits](https://github.com/rs/zerolog/compare/v1.29.1...v1.30.0)

---
updated-dependencies:
- dependency-name: github.com/rs/zerolog
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-31 06:51:23 -04:00
dependabot[bot]
48c551ef9c Bump github.com/AlecAivazis/survey/v2 from 2.3.6 to 2.3.7 (#103)
Bumps [github.com/AlecAivazis/survey/v2](https://github.com/AlecAivazis/survey) from 2.3.6 to 2.3.7.
- [Release notes](https://github.com/AlecAivazis/survey/releases)
- [Commits](https://github.com/AlecAivazis/survey/compare/v2.3.6...v2.3.7)

---
updated-dependencies:
- dependency-name: github.com/AlecAivazis/survey/v2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-19 13:14:43 -04:00
dependabot[bot]
f69bdce04d Bump github.com/stretchr/testify from 1.8.3 to 1.8.4 (#102)
Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.3 to 1.8.4.
- [Release notes](https://github.com/stretchr/testify/releases)
- [Commits](https://github.com/stretchr/testify/compare/v1.8.3...v1.8.4)

---
updated-dependencies:
- dependency-name: github.com/stretchr/testify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-05 21:47:31 -04:00
dependabot[bot]
0074b2c6c6 Bump github.com/stretchr/testify from 1.8.2 to 1.8.3 (#101)
Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.2 to 1.8.3.
- [Release notes](https://github.com/stretchr/testify/releases)
- [Commits](https://github.com/stretchr/testify/compare/v1.8.2...v1.8.3)

---
updated-dependencies:
- dependency-name: github.com/stretchr/testify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-05-22 08:01:02 -04:00
dependabot[bot]
23d020f9ff Bump github.com/rs/zerolog from 1.29.0 to 1.29.1 (#100)
Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.29.0 to 1.29.1.
- [Release notes](https://github.com/rs/zerolog/releases)
- [Commits](https://github.com/rs/zerolog/compare/v1.29.0...v1.29.1)

---
updated-dependencies:
- dependency-name: github.com/rs/zerolog
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-04-17 09:27:10 -04:00
Dave Gallant
015727c6c7 Update README.md (#99) 2023-04-16 21:28:26 -04:00
dependabot[bot]
d27bcdbc4a Bump github.com/spf13/cobra from 1.6.1 to 1.7.0 (#98)
Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.6.1 to 1.7.0.
- [Release notes](https://github.com/spf13/cobra/releases)
- [Commits](https://github.com/spf13/cobra/compare/v1.6.1...v1.7.0)

---
updated-dependencies:
- dependency-name: github.com/spf13/cobra
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-04-10 21:29:26 -04:00
Dave Gallant
000d5762e8 Strip out quotes (#97)
* Add Retry function

* Strip out quotations from csv
2023-04-02 03:46:28 +00:00
dependabot[bot]
d93b835130 Bump actions/setup-go from 3 to 4 (#95)
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3 to 4.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-20 07:22:29 -04:00
dependabot[bot]
7ef409d307 Bump github.com/spf13/afero from 1.9.4 to 1.9.5 (#94)
Bumps [github.com/spf13/afero](https://github.com/spf13/afero) from 1.9.4 to 1.9.5.
- [Release notes](https://github.com/spf13/afero/releases)
- [Commits](https://github.com/spf13/afero/compare/v1.9.4...v1.9.5)

---
updated-dependencies:
- dependency-name: github.com/spf13/afero
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-13 07:42:40 -04:00
dependabot[bot]
b2b9900a90 Bump github.com/jszwec/csvutil from 1.7.1 to 1.8.0 (#92)
Bumps [github.com/jszwec/csvutil](https://github.com/jszwec/csvutil) from 1.7.1 to 1.8.0.
- [Release notes](https://github.com/jszwec/csvutil/releases)
- [Commits](https://github.com/jszwec/csvutil/compare/v1.7.1...v1.8.0)

---
updated-dependencies:
- dependency-name: github.com/jszwec/csvutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dave Gallant <davegallant@gmail.com>
2023-03-01 20:58:49 -05:00
Dave Gallant
3510f02036 Remove use of ioutil package (#93) 2023-03-01 20:56:27 -05:00
dependabot[bot]
3044ecef5f Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 (#91)
Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.1 to 1.8.2.
- [Release notes](https://github.com/stretchr/testify/releases)
- [Commits](https://github.com/stretchr/testify/compare/v1.8.1...v1.8.2)

---
updated-dependencies:
- dependency-name: github.com/stretchr/testify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-27 08:13:51 -05:00
dependabot[bot]
0acfaef158 Bump github.com/spf13/afero from 1.9.3 to 1.9.4 (#90)
Bumps [github.com/spf13/afero](https://github.com/spf13/afero) from 1.9.3 to 1.9.4.
- [Release notes](https://github.com/spf13/afero/releases)
- [Commits](https://github.com/spf13/afero/compare/v1.9.3...v1.9.4)

---
updated-dependencies:
- dependency-name: github.com/spf13/afero
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-27 08:13:39 -05:00
Dave Gallant
82b8e72d45 Set CGO_ENABLED=0 2023-02-05 09:19:48 -05:00
Dave Gallant
e4673199b9 Bump go.mod to 1.19 2023-02-04 20:29:50 -05:00
dependabot[bot]
9635e01682 Bump github.com/rs/zerolog from 1.28.0 to 1.29.0 (#89)
Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.28.0 to 1.29.0.
- [Release notes](https://github.com/rs/zerolog/releases)
- [Commits](https://github.com/rs/zerolog/compare/v1.28.0...v1.29.0)

---
updated-dependencies:
- dependency-name: github.com/rs/zerolog
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-30 07:21:42 -05:00
dependabot[bot]
9d80017635 Bump goreleaser/goreleaser-action from 3 to 4 (#88)
Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 3 to 4.
- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)
- [Commits](https://github.com/goreleaser/goreleaser-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: goreleaser/goreleaser-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-19 08:30:26 -05:00
Dave Gallant
dee6e9d7d5 Bump go to 1.19 in ci 2022-12-04 22:43:56 -05:00
dependabot[bot]
05a8692e61 Bump github.com/spf13/cobra from 1.5.0 to 1.6.1 (#86)
Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.5.0 to 1.6.1.
- [Release notes](https://github.com/spf13/cobra/releases)
- [Commits](https://github.com/spf13/cobra/compare/v1.5.0...v1.6.1)

---
updated-dependencies:
- dependency-name: github.com/spf13/cobra
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-04 22:38:29 -05:00
dependabot[bot]
a8c0634415 Bump github.com/stretchr/testify from 1.7.0 to 1.8.1 (#85)
Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.7.0 to 1.8.1.
- [Release notes](https://github.com/stretchr/testify/releases)
- [Commits](https://github.com/stretchr/testify/compare/v1.7.0...v1.8.1)

---
updated-dependencies:
- dependency-name: github.com/stretchr/testify
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-02 18:10:33 -05:00
dependabot[bot]
6353dedb61 Bump github.com/spf13/afero from 1.9.2 to 1.9.3 (#87)
Bumps [github.com/spf13/afero](https://github.com/spf13/afero) from 1.9.2 to 1.9.3.
- [Release notes](https://github.com/spf13/afero/releases)
- [Commits](https://github.com/spf13/afero/compare/v1.9.2...v1.9.3)

---
updated-dependencies:
- dependency-name: github.com/spf13/afero
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-02 18:10:18 -05:00
Dave Gallant
da5c1ac3cd Bump dependencies (#82)
* Bump dependencies

* Bump golangci lint

* Pin go version

* Fix make test
2022-10-03 20:02:47 -07:00
dependabot[bot]
5fb1c95141 Bump goreleaser/goreleaser-action from 2 to 3 (#71)
Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 2 to 3.
- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)
- [Commits](https://github.com/goreleaser/goreleaser-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: goreleaser/goreleaser-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-25 09:19:19 -04:00
dependabot[bot]
42747347b9 Bump actions/setup-go from 2 to 3 (#69)
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 2 to 3.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-25 09:19:08 -04:00
dependabot[bot]
c436bfee98 Bump golangci/golangci-lint-action from 2 to 3 (#70)
Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 2 to 3.
- [Release notes](https://github.com/golangci/golangci-lint-action/releases)
- [Commits](https://github.com/golangci/golangci-lint-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: golangci/golangci-lint-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-25 09:18:43 -04:00
dependabot[bot]
bfdfb18671 Bump actions/checkout from 2 to 3 (#68)
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-25 09:18:32 -04:00
Dave G
7b25d0216d Update dependabot.yml 2022-05-25 09:18:16 -04:00
Dave G
71cd791b2f Update dependabot.yml 2022-05-25 09:18:07 -04:00
dependabot[bot]
8caece5b1f Bump github.com/spf13/afero from 1.6.0 to 1.8.2 (#64)
Bumps [github.com/spf13/afero](https://github.com/spf13/afero) from 1.6.0 to 1.8.2.
- [Release notes](https://github.com/spf13/afero/releases)
- [Commits](https://github.com/spf13/afero/compare/v1.6.0...v1.8.2)

---
updated-dependencies:
- dependency-name: github.com/spf13/afero
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dave G <davegallant@gmail.com>
2022-04-30 21:00:42 -04:00
dependabot[bot]
eb445a7334 Bump github.com/AlecAivazis/survey/v2 from 2.3.2 to 2.3.4 (#67)
Bumps [github.com/AlecAivazis/survey/v2](https://github.com/AlecAivazis/survey) from 2.3.2 to 2.3.4.
- [Release notes](https://github.com/AlecAivazis/survey/releases)
- [Commits](https://github.com/AlecAivazis/survey/compare/v2.3.2...v2.3.4)

---
updated-dependencies:
- dependency-name: github.com/AlecAivazis/survey/v2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-30 21:00:01 -04:00
dependabot[bot]
9230fb585e Bump github.com/spf13/cobra from 1.2.1 to 1.3.0 (#56)
Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.2.1 to 1.3.0.
- [Release notes](https://github.com/spf13/cobra/releases)
- [Changelog](https://github.com/spf13/cobra/blob/master/CHANGELOG.md)
- [Commits](https://github.com/spf13/cobra/compare/v1.2.1...v1.3.0)

---
updated-dependencies:
- dependency-name: github.com/spf13/cobra
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-19 00:55:43 -05:00
Dave G
666cbee43a Run gofumpt on the codebase (#58) 2021-12-19 00:55:33 -05:00
dependabot[bot]
389400a974 Bump github.com/jszwec/csvutil from 1.5.1 to 1.6.0 (#55)
Bumps [github.com/jszwec/csvutil](https://github.com/jszwec/csvutil) from 1.5.1 to 1.6.0.
- [Release notes](https://github.com/jszwec/csvutil/releases)
- [Commits](https://github.com/jszwec/csvutil/compare/v1.5.1...v1.6.0)

---
updated-dependencies:
- dependency-name: github.com/jszwec/csvutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-22 23:19:08 -05:00
Dave G
4834323f83 Update README.md 2021-11-19 22:01:09 -05:00
dependabot[bot]
557cfbafca Bump github.com/rs/zerolog from 1.25.0 to 1.26.0 (#54)
Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.25.0 to 1.26.0.
- [Release notes](https://github.com/rs/zerolog/releases)
- [Commits](https://github.com/rs/zerolog/compare/v1.25.0...v1.26.0)

---
updated-dependencies:
- dependency-name: github.com/rs/zerolog
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-02 19:56:24 -04:00
dependabot[bot]
27baa10cb7 Bump github.com/AlecAivazis/survey/v2 from 2.3.1 to 2.3.2 (#52)
Bumps [github.com/AlecAivazis/survey/v2](https://github.com/AlecAivazis/survey) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/AlecAivazis/survey/releases)
- [Commits](https://github.com/AlecAivazis/survey/compare/v2.3.1...v2.3.2)

---
updated-dependencies:
- dependency-name: github.com/AlecAivazis/survey/v2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-13 21:34:14 -04:00
dependabot[bot]
fa46a275f3 Bump github.com/rs/zerolog from 1.24.0 to 1.25.0 (#51)
Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.24.0 to 1.25.0.
- [Release notes](https://github.com/rs/zerolog/releases)
- [Commits](https://github.com/rs/zerolog/compare/v1.24.0...v1.25.0)

---
updated-dependencies:
- dependency-name: github.com/rs/zerolog
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-11 11:21:02 -04:00
Dave Gallant
6fdd19d83d Simplify instructions 2021-09-06 21:51:47 -04:00
DG
b8c6a3f8cf Improve and simplify installation using homebrew (#50) 2021-09-06 21:49:33 -04:00
20 changed files with 1287 additions and 448 deletions

View File

@@ -1,8 +0,0 @@
version: 2
updates:
- package-ecosystem: gomod
directory: "/"
schedule:
interval: daily
time: "10:00"
open-pull-requests-limit: 10

View File

@@ -4,19 +4,22 @@ on:
tags:
- v*
branches:
- master
- main
pull_request:
permissions:
contents: read
jobs:
validate:
name: validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
- uses: actions/setup-go@v6
with:
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
version: v1.29
go-version: 1.25
- uses: actions/checkout@v6
- name: golangci-lint
uses: golangci/golangci-lint-action@v9
with:
version: v2.6.2
- name: test
run: make test

View File

@@ -11,19 +11,20 @@ jobs:
steps:
-
name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v6
with:
fetch-depth: 0
-
name: Set up Go
uses: actions/setup-go@v2
uses: actions/setup-go@v6
with:
go-version: 1.16
go-version: "1.25"
-
name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
uses: goreleaser/goreleaser-action@v6
with:
version: latest
args: release --rm-dist
version: '~> v2'
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
CGO_ENABLED: 0

4
.gitignore vendored
View File

@@ -1 +1,3 @@
dist/
dist
.vscode

View File

@@ -1,36 +1,40 @@
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=jcroql
version: 2
before:
hooks:
- go mod tidy
- go get -v
- rm -rf dist
builds:
-
env:
- CGO_ENABLED=0
ldflags:
- -s -w
goos:
- darwin
- linux
goarch:
- amd64
- arm
- arm64
archives:
- replacements:
darwin: Darwin
linux: Linux
amd64: x86_64
- env:
- CGO_ENABLED=0
goos:
- linux
- darwin
- windows
goarch:
- "386"
- amd64
- arm
- arm64
goarm:
- "7"
ldflags:
- -s -w
mod_timestamp: "{{ .CommitTimestamp }}"
checksum:
name_template: 'checksums.txt'
name_template: "checksums.txt"
snapshot:
name_template: "{{ .Tag }}"
changelog:
sort: asc
use: github
filters:
exclude:
- '^docs:'
- '^test:'
- "^docs:"
- "^test:"
release:
github:
owner: davegallant
@@ -38,12 +42,12 @@ release:
# Check https://goreleaser.com/customization/homebrew/
brews:
- homepage: 'https://github.com/davegallant/homebrew-public'
description: 'a client for vpngate.net'
folder: Formula
- homepage: "https://github.com/davegallant/homebrew-public"
description: "a client for vpngate.net"
directory: Formula
commit_author:
name: davegallant
email: davegallant@gmail.com
tap:
repository:
owner: davegallant
name: homebrew-public

View File

@@ -1,14 +1,15 @@
BIN ?= dist/vpngate
export CGO_ENABLED := 0
build: ## Builds the binary
go build -o $(BIN)
.PHONY: build
test: ## Run unit tests
go get github.com/rakyll/gotest@v0.0.5
gotest -v ./...
go test -v ./...
.PHONY: test
lint: ## Run lint
go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.27.0
@go get github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.6.2
golangci-lint run

View File

@@ -2,11 +2,11 @@
This is a client for [vpngate.net](https://www.vpngate.net/).
![vpngate](https://user-images.githubusercontent.com/4519234/104145615-b6f9f880-5395-11eb-812c-c6597a7aed0f.gif)
![vpngate](https://github.com/user-attachments/assets/dafa2702-8d68-4b5f-badb-2c53ddd68991)
This client fetches the list of available relay servers provided by vpngate.net, and allows you to filter and connect to a server of your liking.
You can check out your current IP address and region at https://nordvpn.com/what-is-my-ip/, or simply run the following command in a terminal:
You can check out your current IP address and region at <https://ipinfo.io/json>, or run the following:
```shell
curl ipinfo.io
@@ -14,28 +14,34 @@ curl ipinfo.io
## Requirements
- [openvpn](https://github.com/OpenVPN/openvpn)
- macOS or Linux
- OpenVPN
- macOS, Linux, or Windows
## Install
The simplest method of installation is using homebrew. You can also build from source.
You can install vpngate in a few different ways, and it will differ slightly depending on your OS.
### from homebrew
### Homebrew (macOS and linux)
vpngate can be installed with [homebrew](https://brew.sh/):
vpngate can be installed with [homebrew](https://brew.sh/) (if on macOS, ensure that xcode is installed before installing homebrew by running `xcode-select --install`).
```shell
# Ensure that Xcode is installed
sudo xcode-select --install
# OpenVPN is required
brew install openvpn
brew install davegallant/public/vpngate
brew install openvpn davegallant/public/vpngate
```
### from source
### Windows
On Windows, install OpenVPN from the [official website](https://openvpn.net/community-downloads/).
As there is no installer at the moment, you will need to download and extract the Windows release from the relevant Github release.
Once the release is extracted, open Command Prompt *as Administrator*, and run vpngate.exe from the location where it was extracted.
<img width="278" alt="image" src="https://github.com/user-attachments/assets/fb47270d-82bb-4790-833a-377b874c8104">
<img width="565" alt="image" src="https://github.com/user-attachments/assets/42287904-6c00-48d1-bff3-9757cf250519">
### Build from source
Ensure that [go](https://golang.org/doc/install) is installed.
@@ -52,6 +58,8 @@ source ~/.profile
## Usage
> If on macOS, you may need to add openvpn to your PATH (if you installed it with brew): `export PATH=$(brew --prefix openvpn)/sbin:$PATH`
### List available servers
```shell
@@ -60,28 +68,12 @@ vpngate list
### Connect to a server
On macOS, `openvpn` may not be within your PATH. To fix this, run:
```shell
export PATH=$(brew --prefix openvpn)/sbin:$PATH
```
The above command can also be added to a bash/zsh profile for future use.
Because openvpn creates a network interface, run the connect command with `sudo` or a user with escalated privileges.
```shell
sudo vpngate connect
```
#### Random
If the country doesn't matter, a random server can be selected:
```shell
sudo vpngate connect --random
```
#### Reconnect
To continually attempt to reconnect (this can be combined with `--random`):
@@ -90,6 +82,36 @@ To continually attempt to reconnect (this can be combined with `--random`):
sudo vpngate connect --reconnect
```
#### Random
If the country doesn't matter, a random server can be selected:
```shell
sudo vpngate connect --random
```
#### Proxy
In some cases, anonymity is necessary to populate the list of available VPN servers.
A proxy is a way to bypass restrictions and in some cases, internet censorship.
##### HTTP/HTTPS
Use the specified HTTP/HTTPS proxy to fetch the server list.
```shell
sudo vpngate connect --proxy "http://localhost:8080"
```
##### SOCKS5
Use the specified SOCKS5 proxy to fetch the server list.
```shell
sudo vpngate connect --socks5 "127.0.0.1:1080"
```
## Notes
- I do not maintain any of the servers on vpngate.net (connect to these servers at your own discretion)

View File

@@ -2,10 +2,7 @@ package cmd
import (
"encoding/base64"
"time"
"fmt"
"io/ioutil"
"math/rand"
"os"
"strings"
@@ -17,26 +14,31 @@ import (
"github.com/spf13/cobra"
)
var flagRandom bool
var flagReconnect bool
var (
flagRandom bool
flagReconnect bool
flagProxy string
flagSocks5Proxy string
)
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")
connectCmd.Flags().StringVarP(&flagProxy, "proxy", "p", "", "provide a http/https proxy server to make requests through (i.e. http://127.0.0.1:8080)")
connectCmd.Flags().StringVarP(&flagSocks5Proxy, "socks5", "s", "", "provide a socks5 proxy server to make requests through (i.e. 127.0.0.1:1080)")
rootCmd.AddCommand(connectCmd)
}
var connectCmd = &cobra.Command{
Use: "connect",
Use: "connect",
Short: "Connect to a vpn server (survey selection appears if hostname is not provided)",
Long: `Connect to a vpn from a list of relay servers`,
Args: cobra.RangeArgs(0, 1),
Run: func(cmd *cobra.Command, args []string) {
vpnServers, err := vpn.GetList()
vpnServers, err := vpn.GetList(flagProxy, flagSocks5Proxy)
if err != nil {
log.Fatal().Msgf(err.Error())
log.Fatal().Msg(err.Error())
os.Exit(1)
}
@@ -82,29 +84,28 @@ var connectCmd = &cobra.Command{
if flagRandom {
// Select a random server
rand.Seed(time.Now().UnixNano())
serverSelected = (*vpnServers)[rand.Intn(len(*vpnServers))]
}
decodedConfig, err := base64.StdEncoding.DecodeString(serverSelected.OpenVpnConfigData)
if err != nil {
log.Fatal().Msgf(err.Error())
log.Fatal().Msg(err.Error())
os.Exit(1)
}
tmpfile, err := ioutil.TempFile("", "vpngate-openvpn-config-")
tmpfile, err := os.CreateTemp("", "vpngate-openvpn-config-")
if err != nil {
log.Fatal().Msgf(err.Error())
log.Fatal().Msg(err.Error())
os.Exit(1)
}
if _, err := tmpfile.Write(decodedConfig); err != nil {
log.Fatal().Msgf(err.Error())
log.Fatal().Msg(err.Error())
os.Exit(1)
}
if err := tmpfile.Close(); err != nil {
log.Fatal().Msgf(err.Error())
log.Fatal().Msg(err.Error())
os.Exit(1)
}
@@ -113,13 +114,16 @@ var connectCmd = &cobra.Command{
err = vpn.Connect(tmpfile.Name())
if err != nil && !flagReconnect {
log.Fatal().Msgf(err.Error())
log.Fatal().Msg(err.Error())
os.Exit(1)
} else {
os.Remove(tmpfile.Name())
err = os.Remove(tmpfile.Name())
if err != nil {
log.Fatal().Msg(err.Error())
os.Exit(1)
}
}
}
},
}

View File

@@ -8,11 +8,14 @@ import (
"github.com/rs/zerolog/log"
"github.com/davegallant/vpngate/pkg/vpn"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(listCmd)
listCmd.Flags().StringVarP(&flagProxy, "proxy", "p", "", "provide a http/https proxy server to make requests through (i.e. http://127.0.0.1:8080)")
listCmd.Flags().StringVarP(&flagSocks5Proxy, "socks5", "s", "", "provide a socks5 proxy server to make requests through (i.e. 127.0.0.1:1080)")
}
var listCmd = &cobra.Command{
@@ -21,10 +24,9 @@ var listCmd = &cobra.Command{
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
vpnServers, err := vpn.GetList()
vpnServers, err := vpn.GetList(flagProxy, flagSocks5Proxy)
if err != nil {
log.Fatal().Msgf(err.Error())
log.Fatal().Msg(err.Error())
os.Exit(1)
}
@@ -35,6 +37,5 @@ var listCmd = &cobra.Command{
table.Append([]string{strconv.Itoa(i + 1), v.HostName, v.CountryLong, v.Ping, strconv.Itoa(v.Score)})
}
table.Render() // Send output
},
}

61
flake.lock generated Normal file
View File

@@ -0,0 +1,61 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1743814133,
"narHash": "sha256-drDyYyUmjeYGiHmwB9eOPTQRjmrq3Yz26knwmMPLZFk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "250b695f41e0e2f5afbf15c6b12480de1fe0001b",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

46
flake.nix Normal file
View File

@@ -0,0 +1,46 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs =
{
self,
nixpkgs,
flake-utils,
}:
let
vpngate =
pkgs:
pkgs.buildGo123Module rec {
name = "vpngate";
src = ./.;
vendorHash = "sha256-CP2sFJdIde88WFJlAq29GlE7c1c0xJ6tHzrrasMzJo8=";
nativeBuildInputs = pkgs.lib.optionals pkgs.stdenv.isLinux [ pkgs.makeWrapper ];
env.CGO_ENABLED = 0;
doCheck = false;
};
flakeForSystem =
nixpkgs: system:
let
pkgs = nixpkgs.legacyPackages.${system};
vg = vpngate pkgs;
in
{
packages = {
default = vg;
vpngate = vg;
};
devShell = pkgs.mkShell {
packages = with pkgs; [
gopls
gotools
go_1_25
];
};
};
in
flake-utils.lib.eachDefaultSystem (system: flakeForSystem nixpkgs system);
}

240
go.mod
View File

@@ -1,17 +1,233 @@
module github.com/davegallant/vpngate
go 1.15
go 1.24.0
toolchain go1.24.9
require (
github.com/jszwec/csvutil v1.5.1
github.com/AlecAivazis/survey/v2 v2.3.1
github.com/juju/errors v0.0.0-20200330140219-3fe23663418f
github.com/juju/testing v0.0.0-20201216035041-2be42bba85f3 // indirect
github.com/mattn/go-colorable v0.1.8 // indirect
github.com/nxadm/tail v1.4.8
github.com/olekukonko/tablewriter v0.0.5
github.com/rs/zerolog v1.24.0
github.com/spf13/afero v1.6.0
github.com/spf13/cobra v1.2.1
github.com/stretchr/testify v1.7.0
github.com/AlecAivazis/survey/v2 v2.3.7
github.com/jszwec/csvutil v1.10.0
github.com/juju/errors v1.0.0
github.com/olekukonko/tablewriter v1.1.1
github.com/rs/zerolog v1.34.0
github.com/spf13/afero v1.14.0
github.com/spf13/cobra v1.10.1
github.com/stretchr/testify v1.11.1
golang.org/x/net v0.46.0
)
require (
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
4d63.com/gochecknoglobals v0.2.2 // indirect
codeberg.org/chavacava/garif v0.2.0 // indirect
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect
dev.gaijin.team/go/golib v0.6.0 // indirect
github.com/4meepo/tagalign v1.4.3 // indirect
github.com/Abirdcfly/dupword v0.1.7 // indirect
github.com/AdminBenni/iota-mixing v1.0.0 // indirect
github.com/AlwxSin/noinlineerr v1.0.5 // indirect
github.com/Antonboom/errname v1.1.1 // indirect
github.com/Antonboom/nilnil v1.1.1 // indirect
github.com/Antonboom/testifylint v1.6.4 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/Djarvur/go-err113 v0.1.1 // indirect
github.com/Masterminds/semver/v3 v3.4.0 // indirect
github.com/MirrexOne/unqueryvet v1.2.1 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
github.com/alecthomas/chroma/v2 v2.20.0 // indirect
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
github.com/alexkohler/prealloc v1.0.0 // indirect
github.com/alfatraining/structtag v1.0.0 // indirect
github.com/alingse/asasalint v0.0.11 // indirect
github.com/alingse/nilnesserr v0.2.0 // indirect
github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect
github.com/ashanbrown/makezero/v2 v2.1.0 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bkielbasa/cyclop v1.2.3 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
github.com/bombsimon/wsl/v5 v5.3.0 // indirect
github.com/breml/bidichk v0.3.3 // indirect
github.com/breml/errchkjson v0.4.1 // indirect
github.com/butuzov/ireturn v0.4.0 // indirect
github.com/butuzov/mirror v1.3.0 // indirect
github.com/catenacyber/perfsprint v0.10.0 // indirect
github.com/ccojocar/zxcvbn-go v1.0.4 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charithe/durationcheck v0.0.11 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/lipgloss v1.1.0 // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/ckaznocha/intrange v0.3.1 // indirect
github.com/clipperhouse/displaywidth v0.3.1 // indirect
github.com/clipperhouse/stringish v0.1.1 // indirect
github.com/clipperhouse/uax29/v2 v2.2.0 // indirect
github.com/curioswitch/go-reassign v0.3.0 // indirect
github.com/daixiang0/gci v0.13.7 // indirect
github.com/dave/dst v0.27.3 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/denis-tingaikin/go-header v0.5.0 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/ettle/strcase v0.2.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/firefart/nonamedreturns v1.0.6 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/ghostiam/protogetter v0.3.17 // indirect
github.com/go-critic/go-critic v0.14.2 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
github.com/go-toolsmith/astcopy v1.1.0 // indirect
github.com/go-toolsmith/astequal v1.2.0 // indirect
github.com/go-toolsmith/astfmt v1.1.0 // indirect
github.com/go-toolsmith/astp v1.1.0 // indirect
github.com/go-toolsmith/strparse v1.1.0 // indirect
github.com/go-toolsmith/typep v1.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/godoc-lint/godoc-lint v0.10.1 // indirect
github.com/gofrs/flock v0.13.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golangci/asciicheck v0.5.0 // indirect
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
github.com/golangci/go-printf-func-name v0.1.1 // indirect
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/golangci-lint/v2 v2.6.2 // indirect
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect
github.com/golangci/misspell v0.7.0 // indirect
github.com/golangci/plugin-module-register v0.1.2 // indirect
github.com/golangci/revgrep v0.8.0 // indirect
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/gordonklaus/ineffassign v0.2.0 // indirect
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
github.com/gostaticanalysis/comment v1.5.0 // indirect
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
github.com/gostaticanalysis/nilerr v0.1.2 // indirect
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jgautheron/goconst v1.8.2 // indirect
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
github.com/jjti/go-spancheck v0.6.5 // indirect
github.com/julz/importas v0.2.0 // indirect
github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/kisielk/errcheck v1.9.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kulti/thelper v0.7.1 // indirect
github.com/kunwardeep/paralleltest v1.0.15 // indirect
github.com/lasiar/canonicalheader v1.1.2 // indirect
github.com/ldez/exptostd v0.4.5 // indirect
github.com/ldez/gomoddirectives v0.7.1 // indirect
github.com/ldez/grignotin v0.10.1 // indirect
github.com/ldez/tagliatelle v0.7.2 // indirect
github.com/ldez/usetesting v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/macabu/inamedparam v0.2.0 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect
github.com/manuelarte/funcorder v0.5.0 // indirect
github.com/maratori/testableexamples v1.0.1 // indirect
github.com/maratori/testpackage v1.1.2 // indirect
github.com/matoous/godox v1.1.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.19 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mgechev/revive v1.12.0 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/moricho/tparallel v0.3.2 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/nakabonne/nestif v0.3.1 // indirect
github.com/nishanths/exhaustive v0.12.0 // indirect
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.21.2 // indirect
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect
github.com/olekukonko/errors v1.1.0 // indirect
github.com/olekukonko/ll v0.1.2 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/polyfloyd/go-errorlint v1.8.0 // indirect
github.com/prometheus/client_golang v1.12.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/quasilyte/go-ruleguard v0.4.5 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/raeperd/recvcheck v0.2.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/ryancurrah/gomodguard v1.4.1 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
github.com/securego/gosec/v2 v2.22.10 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/sivchari/containedctx v1.0.3 // indirect
github.com/sonatard/noctx v0.4.0 // indirect
github.com/sourcegraph/go-diff v0.7.0 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/spf13/viper v1.12.0 // indirect
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/subosito/gotenv v1.4.1 // indirect
github.com/tetafro/godot v1.5.4 // indirect
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
github.com/timonwong/loggercheck v0.11.0 // indirect
github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
github.com/ultraware/funlen v0.2.0 // indirect
github.com/ultraware/whitespace v0.2.0 // indirect
github.com/uudashr/gocognit v1.2.0 // indirect
github.com/uudashr/iface v1.4.1 // indirect
github.com/xen0n/gosmopolitan v1.3.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yagipy/maintidx v1.0.0 // indirect
github.com/yeya24/promlinter v0.3.0 // indirect
github.com/ykadowak/zerologlint v0.1.5 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
go-simpler.org/musttag v0.14.0 // indirect
go-simpler.org/sloglint v0.11.1 // indirect
go.augendre.info/arangolint v0.3.1 // indirect
go.augendre.info/fatcontext v0.9.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/sync v0.18.0 // indirect
golang.org/x/sys v0.37.0 // indirect
golang.org/x/term v0.36.0 // indirect
golang.org/x/text v0.30.0 // indirect
golang.org/x/tools v0.38.0 // indirect
google.golang.org/protobuf v1.36.8 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.6.1 // indirect
mvdan.cc/gofumpt v0.9.2 // indirect
mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect
)

946
go.sum

File diff suppressed because it is too large Load Diff

View File

@@ -1,19 +1,18 @@
package exec
import (
"bytes"
"bufio"
"os"
"os/exec"
"strings"
"github.com/juju/errors"
"github.com/rs/zerolog/log"
)
// Run executes a command in workDir and returns stdout and error.
// The spawned process will exit upon termination of this application
// to ensure a clean exit
func Run(path string, workDir string, args ...string) (string, error) {
func Run(path string, workDir string, args ...string) error {
_, err := exec.LookPath(path)
if err != nil {
log.Error().Msgf("%s is required, please install it", path)
@@ -21,25 +20,28 @@ func Run(path string, workDir string, args ...string) (string, error) {
}
cmd := exec.Command(path, args...)
cmd.Dir = workDir
stdout := &bytes.Buffer{}
stderr := &bytes.Buffer{}
cmd.Stdout = stdout
cmd.Stderr = stderr
log.Debug().Msgf("Executing " + strings.Join(cmd.Args, " "))
err = cmd.Run()
output := strings.TrimSpace(stdout.String())
errOut := strings.TrimSpace(stderr.String())
if output != "" {
log.Debug().Msgf(output)
}
if errOut != "" {
log.Debug().Msgf(errOut)
}
if _, ok := err.(*exec.ExitError); !ok {
return output, errors.Trace(err)
}
log.Debug().Msg("Executing " + strings.Join(cmd.Args, " "))
stdout, err := cmd.StdoutPipe()
if err != nil {
return output, errors.Annotatef(err, path, cmd.Args, errOut)
log.Fatal().Msgf("Failed to get stdout pipe: %v", err)
}
return output, nil
if err := cmd.Start(); err != nil {
log.Fatal().Msgf("Failed to start command: %v", err)
}
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
log.Debug().Msg(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal().Msgf("Error reading stdout: %v", err)
}
if err := cmd.Wait(); err != nil {
log.Fatal().Msgf("Command finished with error: %v", err)
return err
}
return nil
}

18
pkg/util/retry.go Normal file
View File

@@ -0,0 +1,18 @@
package util
import (
"time"
"github.com/rs/zerolog/log"
)
func Retry(attempts int, delay time.Duration,fn func() error) error {
var err error
for i := 0; i < attempts; i++ {
if err = fn(); err == nil {
return nil
}
log.Error().Msgf("Retrying after %d seconds. An error occured: %s", delay, err)
time.Sleep(delay)
}
return err
}

View File

@@ -2,7 +2,7 @@ package vpn
import (
"encoding/json"
"io/ioutil"
"io"
"os"
"path"
"time"
@@ -25,20 +25,18 @@ func getCacheDir() string {
func createCacheDir() error {
cacheDir := getCacheDir()
var AppFs = afero.NewOsFs()
return AppFs.MkdirAll(cacheDir, 0700)
AppFs := afero.NewOsFs()
return AppFs.MkdirAll(cacheDir, 0o700)
}
func getVpnListCache() (*[]Server, error) {
cacheFile := path.Join(getCacheDir(), serverCachefile)
serversFile, err := os.Open(cacheFile)
if err != nil {
return nil, err
}
byteValue, err := ioutil.ReadAll(serversFile)
byteValue, err := io.ReadAll(serversFile)
if err != nil {
return nil, err
}
@@ -55,30 +53,25 @@ func getVpnListCache() (*[]Server, error) {
}
func writeVpnListToCache(servers []Server) error {
err := createCacheDir()
if err != nil {
return err
}
f, err := json.MarshalIndent(servers, "", " ")
if err != nil {
return err
}
cacheFile := path.Join(getCacheDir(), serverCachefile)
err = ioutil.WriteFile(cacheFile, f, 0644)
err = os.WriteFile(cacheFile, f, 0o644)
return err
}
func vpnListCacheIsExpired() bool {
file, err := os.Stat(path.Join(getCacheDir(), serverCachefile))
if err != nil {
return true
}

View File

@@ -1,35 +1,28 @@
package vpn
import (
"io/ioutil"
"os"
"runtime"
"github.com/davegallant/vpngate/pkg/exec"
"github.com/juju/errors"
"github.com/nxadm/tail"
"github.com/rs/zerolog/log"
)
// Connect to a specified OpenVPN configuration
func Connect(configPath string) error {
tmpLogFile, err := ioutil.TempFile("", "vpngate-openvpn-log-")
tmpLogFile, err := os.CreateTemp("", "vpngate-openvpn-log-")
if err != nil {
return errors.Annotate(err, "Unable to create a temporary log file")
}
defer os.Remove(tmpLogFile.Name())
go func() {
// Tail the temporary openvpn log file
t, err := tail.TailFile(tmpLogFile.Name(), tail.Config{Follow: true})
if err != nil {
log.Error().Msgf("%s", err)
}
for line := range t.Lines {
log.Debug().Msg(line.Text)
}
defer func() {
_ = os.Remove(tmpLogFile.Name())
}()
_, err = exec.Run("openvpn", ".", "--verb", "4", "--log", tmpLogFile.Name(), "--config", configPath)
executable := "openvpn"
if runtime.GOOS == "windows" {
executable = "C:\\Program Files\\OpenVPN\\bin\\openvpn.exe"
}
err = exec.Run(executable, ".", "--verb", "4", "--config", configPath, "--data-ciphers", "AES-128-CBC")
return err
}

View File

@@ -1,14 +1,17 @@
package vpn
import (
"net/http"
"bytes"
"io"
"net/http"
"net/url"
"os"
"github.com/jszwec/csvutil"
"github.com/rs/zerolog/log"
"golang.org/x/net/proxy"
"github.com/davegallant/vpngate/pkg/util"
"github.com/juju/errors"
)
@@ -38,7 +41,6 @@ func streamToBytes(stream io.Reader) []byte {
// parse csv
func parseVpnList(r io.Reader) (*[]Server, error) {
var servers []Server
serverList := streamToBytes(r)
@@ -46,21 +48,21 @@ func parseVpnList(r io.Reader) (*[]Server, error) {
// Trim known invalid rows
serverList = bytes.TrimPrefix(serverList, []byte("*vpn_servers\r\n"))
serverList = bytes.TrimSuffix(serverList, []byte("*\r\n"))
serverList = bytes.ReplaceAll(serverList, []byte(`"`), []byte{})
if err := csvutil.Unmarshal(serverList, &servers); err != nil {
return nil, errors.Annotatef(err, "Unable to parse CSV")
}
return &servers, nil
}
// GetList returns a list of vpn servers
func GetList() (*[]Server, error) {
func GetList(httpProxy string, socks5Proxy string) (*[]Server, error) {
cacheExpired := vpnListCacheIsExpired()
var servers *[]Server
var client *http.Client
if !cacheExpired {
servers, err := getVpnListCache()
@@ -77,28 +79,70 @@ func GetList() (*[]Server, error) {
log.Info().Msg("Fetching the latest server list")
r, err := http.Get(vpnList)
if httpProxy != "" {
proxyURL, err := url.Parse(httpProxy)
if err != nil {
log.Error().Msgf("Error parsing proxy: %s", err)
os.Exit(1)
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
}
if err != nil {
return nil, errors.Annotate(err, "Unable to retrieve vpn list")
client = &http.Client{
Transport: transport,
}
} else if socks5Proxy != "" {
dialer, err := proxy.SOCKS5("tcp", socks5Proxy, nil, proxy.Direct)
if err != nil {
log.Error().Msgf("Error creating SOCKS5 dialer: %v", err)
os.Exit(1)
}
httpTransport := &http.Transport{
Dial: dialer.Dial,
}
client = &http.Client{
Transport: httpTransport,
}
} else {
client = &http.Client{}
}
defer r.Body.Close()
var r *http.Response
if r.StatusCode != 200 {
return nil, errors.Annotatef(err, "Unexpected status code when retrieving vpn list: %d", r.StatusCode)
}
err := util.Retry(5, 1, func() error {
var err error
r, err = client.Get(vpnList)
if err != nil {
return err
}
defer func() {
_ = r.Body.Close()
}()
servers, err = parseVpnList(r.Body)
if r.StatusCode != 200 {
return errors.Annotatef(err, "Unexpected status code when retrieving vpn list: %d", r.StatusCode)
}
servers, err = parseVpnList(r.Body)
if err != nil {
return err
}
err = writeVpnListToCache(*servers)
if err != nil {
log.Warn().Msgf("Unable to write servers to cache: %s", err)
}
return nil
})
if err != nil {
return nil, errors.Annotate(err, "unable to parse vpn list")
}
err = writeVpnListToCache(*servers)
if err != nil {
log.Warn().Msgf("Unable to write servers to cache: %s", err)
return nil, err
}
return servers, nil

View File

@@ -9,15 +9,13 @@ import (
// TestGetListReal tests getting the real list of vpn servers
func TestGetListReal(t *testing.T) {
_, err := GetList()
_, err := GetList("", "")
assert.NoError(t, err)
}
// TestParseVpnList parses a local copy of vpn list csv
func TestParseVpnList(t *testing.T) {
dat, err := os.Open("../../test_data/vpn_list.csv")
assert.NoError(t, err)
@@ -31,5 +29,4 @@ func TestParseVpnList(t *testing.T) {
assert.Equal(t, (*servers)[0].HostName, "public-vpn-227")
assert.Equal(t, (*servers)[0].Ping, "13")
assert.Equal(t, (*servers)[0].Score, 2086924)
}

9
renovate.json Normal file
View File

@@ -0,0 +1,9 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"schedule": [
"every weekend"
],
"extends": [
"config:recommended"
]
}