103 Commits

Author SHA1 Message Date
renovate[bot]
76d6f64119 Update module github.com/spf13/afero to v1.15.0 2025-11-25 02:30:54 +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
DG
990fd072a2 Add arm/arm64 to goreleaser (#49)
Cryptic error (goreleaser/goreleaser#2389) was caused by not publishing arm64 architecture.
2021-09-06 21:17:53 -04:00
dependabot[bot]
5632a1039a Bump github.com/jszwec/csvutil from 1.5.0 to 1.5.1 (#47)
* Bump github.com/jszwec/csvutil from 1.5.0 to 1.5.1

Bumps [github.com/jszwec/csvutil](https://github.com/jszwec/csvutil) from 1.5.0 to 1.5.1.
- [Release notes](https://github.com/jszwec/csvutil/releases)
- [Commits](https://github.com/jszwec/csvutil/compare/v1.5.0...v1.5.1)

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

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

* Update go.mod

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: DG <davegallant@gmail.com>
2021-09-06 20:36:49 -04:00
dependabot[bot]
f47f61cbb8 Bump github.com/rs/zerolog from 1.23.0 to 1.24.0 (#48)
Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.23.0 to 1.24.0.
- [Release notes](https://github.com/rs/zerolog/releases)
- [Commits](https://github.com/rs/zerolog/compare/v1.23.0...v1.24.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-06 20:35:24 -04:00
dependabot[bot]
1ee2b2e0a5 Bump github.com/AlecAivazis/survey/v2 from 2.2.16 to 2.3.1 (#46)
Bumps [github.com/AlecAivazis/survey/v2](https://github.com/AlecAivazis/survey) from 2.2.16 to 2.3.1.
- [Release notes](https://github.com/AlecAivazis/survey/releases)
- [Commits](https://github.com/AlecAivazis/survey/compare/v2.2.16...v2.3.1)

---
updated-dependencies:
- dependency-name: github.com/AlecAivazis/survey/v2
  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-06 20:35:12 -04:00
20 changed files with 1281 additions and 453 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,34 +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:
- env:
- CGO_ENABLED=0
goos:
- linux
- darwin
- windows
goarch:
- "386"
- amd64
- arm
- arm64
goarm:
- "7"
ldflags:
- -s -w
goos:
- darwin
- linux
goarch:
- amd64
archives:
- replacements:
darwin: Darwin
linux: Linux
amd64: x86_64
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
@@ -36,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

108
README.md
View File

@@ -2,86 +2,114 @@
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.
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:
```console
$ curl ipinfo.io
```shell
curl ipinfo.io
```
## Requirements
- [openvpn](https://github.com/OpenVPN/openvpn)
- macOS or Linux
- OpenVPN
- macOS, Linux, or Windows
## Install
You can install vpngate in a few different ways, and it will differ slightly depending on your OS.
### 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`).
```sh
brew install openvpn
brew install davegallant/public/vpngate
```shell
brew install openvpn davegallant/public/vpngate
```
### 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.
```console
$ CGO_ENABLED=0 go get github.com/davegallant/vpngate
```shell
CGO_ENABLED=0 go get github.com/davegallant/vpngate
```
Ensure that the go bin path is discoverable:
```console
$ echo 'export PATH=$PATH:$HOME/go/bin' >> ~/.profile
$ source ~/.profile
```shell
echo 'export PATH=$PATH:$HOME/go/bin' >> ~/.profile
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
```console
$ vpngate list
```shell
vpngate list
```
### Connect to a server
On macOS, `openvpn` may not be within your PATH. To fix this, run:
```console
$ 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.
```console
$ sudo vpngate connect
```
#### Random
If the country doesn't matter, a random server can be selected:
```console
$ sudo vpngate connect --random
```shell
sudo vpngate connect
```
#### Reconnect
To continually attempt to reconnect (this can be combined with `--random`):
```console
$ sudo vpngate connect --reconnect
```shell
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

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",
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);
}

232
go.mod
View File

@@ -1,17 +1,227 @@
module github.com/davegallant/vpngate
go 1.15
go 1.24.0
toolchain go1.24.9
require (
github.com/AlecAivazis/survey/v2 v2.2.16
github.com/jszwec/csvutil v1.5.0
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/AlecAivazis/survey/v2 v2.3.7
github.com/jszwec/csvutil v1.10.0
github.com/juju/errors v1.0.0
github.com/olekukonko/tablewriter v0.0.5
github.com/rs/zerolog v1.23.0
github.com/spf13/afero v1.6.0
github.com/spf13/cobra v1.2.1
github.com/stretchr/testify v1.7.0
github.com/rs/zerolog v1.34.0
github.com/spf13/afero v1.15.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/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.16 // 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/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
)

931
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,22 +79,58 @@ 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 {
return nil, errors.Annotate(err, "Unable to retrieve vpn list")
log.Error().Msgf("Error parsing proxy: %s", err)
os.Exit(1)
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
}
defer r.Body.Close()
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{}
}
var r *http.Response
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()
}()
if r.StatusCode != 200 {
return nil, errors.Annotatef(err, "Unexpected status code when retrieving vpn list: %d", r.StatusCode)
return errors.Annotatef(err, "Unexpected status code when retrieving vpn list: %d", r.StatusCode)
}
servers, err = parseVpnList(r.Body)
if err != nil {
return nil, errors.Annotate(err, "unable to parse vpn list")
return err
}
err = writeVpnListToCache(*servers)
@@ -100,6 +138,12 @@ func GetList() (*[]Server, error) {
if err != nil {
log.Warn().Msgf("Unable to write servers to cache: %s", err)
}
return nil
})
if err != nil {
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"
]
}