@zerops/zcli 1.0.0 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +12 -7
- package/{tools/npm → utils}/binary.js +8 -4
- package/{tools/npm → utils}/install.js +0 -0
- package/{tools/npm → utils}/run.js +0 -0
- package/{tools/npm → utils}/uninstall.js +0 -0
- package/.github/workflows/master.yml +0 -36
- package/.github/workflows/tag.yml +0 -67
- package/.golangci.yaml +0 -58
- package/LICENSE +0 -1
- package/README.md +0 -2
- package/bin/.gitignore +0 -2
- package/cmd/deploy.go +0 -65
- package/cmd/di.go +0 -65
- package/cmd/login.go +0 -48
- package/cmd/root.go +0 -70
- package/cmd/startVpn.go +0 -59
- package/cmd/stopVpn.go +0 -36
- package/go.mod +0 -21
- package/go.sum +0 -230
- package/main.go +0 -13
- package/src/command/deploy/handler.go +0 -43
- package/src/command/deploy/handler_checkProcess.go +0 -38
- package/src/command/deploy/handler_run.go +0 -126
- package/src/command/login/handler.go +0 -128
- package/src/command/login/handler_parseRestApiError.go +0 -48
- package/src/command/startVpn/handler.go +0 -150
- package/src/command/startVpn/handler_clean_linux.go +0 -24
- package/src/command/startVpn/handler_clean_linux_macos.go +0 -19
- package/src/command/startVpn/handler_generateKeys.go +0 -26
- package/src/command/startVpn/handler_isVpnAlive.go +0 -23
- package/src/command/startVpn/handler_setVpn_linux.go +0 -97
- package/src/command/startVpn/handler_setVpn_macos.go +0 -98
- package/src/command/startVpn/handler_startVpnClient.go +0 -27
- package/src/command/stopVpn/handler.go +0 -55
- package/src/command/stopVpn/handler_clean_linux.go +0 -24
- package/src/command/stopVpn/handler_clean_linux_macos.go +0 -19
- package/src/command/userInfo/handler.go +0 -21
- package/src/helpers/cmdRunner/run.go +0 -40
- package/src/helpers/grpcErrors.go +0 -40
- package/src/helpers/ip.go +0 -11
- package/src/service/certReader/handler.go +0 -97
- package/src/service/httpClient/handler.go +0 -90
- package/src/service/logger/handler.go +0 -32
- package/src/service/logger/interface.go +0 -8
- package/src/service/params/handler.go +0 -111
- package/src/service/storage/handler.go +0 -71
- package/src/service/sudoers/handler.go +0 -49
- package/src/service/tlsConfig/handler.go +0 -36
- package/src/service/zipClient/handler.go +0 -144
- package/src/service/zipClient/test/var/www/dir/file2.1.txt +0 -1
- package/src/service/zipClient/test/var/www/dir/file2.2.txt +0 -0
- package/src/service/zipClient/test/var/www/dir/subDir/file3.1.txt +0 -0
- package/src/service/zipClient/test/var/www/dir/subDir/file3.2.txt +0 -0
- package/src/service/zipClient/test/var/www/file1.1.txt +0 -0
- package/src/service/zipClient/test/zip_test.go +0 -289
- package/src/zeropsApiProtocol/build-pb +0 -13
- package/src/zeropsApiProtocol/build-pb-generate.go +0 -3
- package/src/zeropsApiProtocol/protocol_extra.go +0 -19
- package/src/zeropsApiProtocol/zeropsApiProtocol.pb.go +0 -5518
- package/src/zeropsApiProtocol/zeropsApiProtocol.proto +0 -819
- package/src/zeropsVpnProtocol/build-pb +0 -13
- package/src/zeropsVpnProtocol/build-pb-generate.go +0 -3
- package/src/zeropsVpnProtocol/protocol_extra.go +0 -45
- package/src/zeropsVpnProtocol/zeropsVpnProtocol.pb.go +0 -578
- package/src/zeropsVpnProtocol/zeropsVpnProtocol.proto +0 -58
- package/tools/gomodrun.go +0 -60
- package/tools/install.sh +0 -40
- package/tools/npm/match-version.js +0 -12
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
package startVpn
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"context"
|
|
5
|
-
"errors"
|
|
6
|
-
"net"
|
|
7
|
-
|
|
8
|
-
"github.com/zerops-io/zcli/src/helpers"
|
|
9
|
-
|
|
10
|
-
"github.com/zerops-io/zcli/src/service/logger"
|
|
11
|
-
"github.com/zerops-io/zcli/src/service/storage"
|
|
12
|
-
"github.com/zerops-io/zcli/src/service/sudoers"
|
|
13
|
-
"github.com/zerops-io/zcli/src/zeropsApiProtocol"
|
|
14
|
-
"github.com/zerops-io/zcli/src/zeropsVpnProtocol"
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
const wireguardPort = "51820"
|
|
18
|
-
const vpnApiGrpcPort = ":64510"
|
|
19
|
-
|
|
20
|
-
type Config struct {
|
|
21
|
-
VpnAddress string
|
|
22
|
-
UserId string
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
type RunConfig struct {
|
|
26
|
-
ProjectName string
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
type Handler struct {
|
|
30
|
-
config Config
|
|
31
|
-
logger logger.Logger
|
|
32
|
-
apiGrpcClient zeropsApiProtocol.ZeropsApiProtocolClient
|
|
33
|
-
sudoers *sudoers.Handler
|
|
34
|
-
storage *storage.Handler
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
func New(
|
|
38
|
-
config Config,
|
|
39
|
-
logger logger.Logger,
|
|
40
|
-
apiGrpcClient zeropsApiProtocol.ZeropsApiProtocolClient,
|
|
41
|
-
sudoers *sudoers.Handler,
|
|
42
|
-
storage *storage.Handler,
|
|
43
|
-
) *Handler {
|
|
44
|
-
return &Handler{
|
|
45
|
-
config: config,
|
|
46
|
-
logger: logger,
|
|
47
|
-
apiGrpcClient: apiGrpcClient,
|
|
48
|
-
sudoers: sudoers,
|
|
49
|
-
storage: storage,
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
func (h *Handler) Run(ctx context.Context, config RunConfig) error {
|
|
54
|
-
|
|
55
|
-
if config.ProjectName == "" {
|
|
56
|
-
return errors.New("project name must be filled")
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
projectsResponse, err := h.apiGrpcClient.GetProjectsByName(ctx, &zeropsApiProtocol.GetProjectsByNameRequest{
|
|
60
|
-
Name: config.ProjectName,
|
|
61
|
-
})
|
|
62
|
-
if err := helpers.HandleGrpcApiError(projectsResponse, err); err != nil {
|
|
63
|
-
return err
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
projectsResponse.GetOutput().GetProjects()
|
|
67
|
-
|
|
68
|
-
projects := projectsResponse.GetOutput().GetProjects()
|
|
69
|
-
if len(projects) == 0 {
|
|
70
|
-
return errors.New("project not found")
|
|
71
|
-
}
|
|
72
|
-
if len(projects) > 1 {
|
|
73
|
-
return errors.New("there are multiple project with same name")
|
|
74
|
-
}
|
|
75
|
-
project := projects[0]
|
|
76
|
-
|
|
77
|
-
if h.storage.Data.ProjectId != "" && project.GetId() != h.storage.Data.ProjectId {
|
|
78
|
-
if h.isVpnAlive() {
|
|
79
|
-
return errors.New("vpn is started for another project, use stopVpn first")
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
err = h.cleanVpn()
|
|
84
|
-
if err != nil {
|
|
85
|
-
return err
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
publicKey, privateKey, err := h.generateKeys()
|
|
89
|
-
if err != nil {
|
|
90
|
-
return err
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
apiVpnRequestResponse, err := h.apiGrpcClient.PostVpnRequest(ctx, &zeropsApiProtocol.PostVpnRequestRequest{
|
|
94
|
-
Id: project.GetId(),
|
|
95
|
-
ClientPublicKey: publicKey,
|
|
96
|
-
})
|
|
97
|
-
if err := helpers.HandleGrpcApiError(apiVpnRequestResponse, err); err != nil {
|
|
98
|
-
return err
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
expiry := zeropsApiProtocol.FromProtoTimestamp(apiVpnRequestResponse.GetOutput().GetExpiry())
|
|
102
|
-
signature := apiVpnRequestResponse.GetOutput().GetSignature()
|
|
103
|
-
|
|
104
|
-
ipRecords, err := net.LookupIP(h.config.VpnAddress)
|
|
105
|
-
if err != nil {
|
|
106
|
-
return err
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
vpnAddress := ""
|
|
110
|
-
for _, ip := range ipRecords {
|
|
111
|
-
vpnAddress = helpers.IpToString(ip)
|
|
112
|
-
break
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
vpnGrpcClient, closeFunc, err := h.startVpnClient(ctx, vpnAddress)
|
|
116
|
-
if err != nil {
|
|
117
|
-
return err
|
|
118
|
-
}
|
|
119
|
-
defer closeFunc()
|
|
120
|
-
|
|
121
|
-
startVpnResponse, err := vpnGrpcClient.StartVpn(ctx, &zeropsVpnProtocol.StartVpnRequest{
|
|
122
|
-
InstanceId: project.GetId(),
|
|
123
|
-
UserId: h.config.UserId,
|
|
124
|
-
ClientPublicKey: publicKey,
|
|
125
|
-
Signature: signature,
|
|
126
|
-
Expiry: zeropsVpnProtocol.ToProtoTimestamp(expiry),
|
|
127
|
-
})
|
|
128
|
-
if err := helpers.HandleVpnApiError(startVpnResponse, err); err != nil {
|
|
129
|
-
return err
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
err = h.setVpn(vpnAddress, privateKey, startVpnResponse)
|
|
133
|
-
if err != nil {
|
|
134
|
-
return err
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if h.isVpnAlive() {
|
|
138
|
-
h.logger.Info("\nvpn connection is established\n")
|
|
139
|
-
} else {
|
|
140
|
-
return errors.New("vpn is not connected")
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
h.storage.Data.ProjectId = project.GetId()
|
|
144
|
-
err = h.storage.Save()
|
|
145
|
-
if err != nil {
|
|
146
|
-
return err
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return nil
|
|
150
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// +build linux
|
|
2
|
-
|
|
3
|
-
package startVpn
|
|
4
|
-
|
|
5
|
-
import (
|
|
6
|
-
"errors"
|
|
7
|
-
"os/exec"
|
|
8
|
-
|
|
9
|
-
"github.com/zerops-io/zcli/src/service/sudoers"
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
func (h *Handler) cleanVpn() error {
|
|
13
|
-
|
|
14
|
-
var err error
|
|
15
|
-
|
|
16
|
-
_, err = h.sudoers.RunCommand(exec.Command("ip", "link", "del", "dev", "wg0"))
|
|
17
|
-
if err != nil {
|
|
18
|
-
if !errors.Is(err, sudoers.CannotFindDeviceErr) {
|
|
19
|
-
return err
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return nil
|
|
24
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
// +build darwin
|
|
2
|
-
|
|
3
|
-
package startVpn
|
|
4
|
-
|
|
5
|
-
import "os/exec"
|
|
6
|
-
|
|
7
|
-
func (h *Handler) cleanVpn() error {
|
|
8
|
-
|
|
9
|
-
var err error
|
|
10
|
-
|
|
11
|
-
cmd := "ps aux | grep wireguard | grep -v grep | awk '{print $2}' | xargs sudo kill"
|
|
12
|
-
|
|
13
|
-
_, err = h.sudoers.RunCommand(exec.Command("bash", "-c", cmd))
|
|
14
|
-
if err != nil {
|
|
15
|
-
return err
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return nil
|
|
19
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
package startVpn
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"bytes"
|
|
5
|
-
"os/exec"
|
|
6
|
-
)
|
|
7
|
-
|
|
8
|
-
func (h *Handler) generateKeys() (public, private string, err error) {
|
|
9
|
-
|
|
10
|
-
privateKeyOutput, err := h.sudoers.RunCommand(exec.Command("wg", "genkey"))
|
|
11
|
-
if err != nil {
|
|
12
|
-
return
|
|
13
|
-
}
|
|
14
|
-
privateKey := privateKeyOutput[0 : len(privateKeyOutput)-1]
|
|
15
|
-
|
|
16
|
-
cmd := exec.Command("wg", "pubkey")
|
|
17
|
-
cmd.Stdin = bytes.NewReader(privateKey)
|
|
18
|
-
publicKeyOutput, err := h.sudoers.RunCommand(cmd)
|
|
19
|
-
if err != nil {
|
|
20
|
-
return
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
publicKey := publicKeyOutput[0 : len(publicKeyOutput)-1]
|
|
24
|
-
|
|
25
|
-
return string(publicKey), string(privateKey), nil
|
|
26
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
package startVpn
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"os/exec"
|
|
5
|
-
)
|
|
6
|
-
|
|
7
|
-
func (h *Handler) isVpnAlive() bool {
|
|
8
|
-
|
|
9
|
-
if h.storage.Data.ServerIp == "" {
|
|
10
|
-
return false
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
for i := 0; i < 3; i++ {
|
|
14
|
-
_, err := exec.Command("ping6", h.storage.Data.ServerIp, "-c", "1").Output()
|
|
15
|
-
if err != nil {
|
|
16
|
-
continue
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return true
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return false
|
|
23
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
// +build linux
|
|
2
|
-
|
|
3
|
-
package startVpn
|
|
4
|
-
|
|
5
|
-
import (
|
|
6
|
-
"errors"
|
|
7
|
-
"io/ioutil"
|
|
8
|
-
"os"
|
|
9
|
-
"os/exec"
|
|
10
|
-
"path"
|
|
11
|
-
"strconv"
|
|
12
|
-
|
|
13
|
-
"github.com/google/uuid"
|
|
14
|
-
"github.com/zerops-io/zcli/src/service/sudoers"
|
|
15
|
-
"github.com/zerops-io/zcli/src/zeropsVpnProtocol"
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
func (h *Handler) setVpn(selectedVpnAddress, privateKey string, response *zeropsVpnProtocol.StartVpnResponse) error {
|
|
19
|
-
var err error
|
|
20
|
-
|
|
21
|
-
_, err = h.sudoers.RunCommand(exec.Command("ip", "link", "add", "wg0", "type", "wireguard"))
|
|
22
|
-
if err != nil {
|
|
23
|
-
if !errors.Is(err, sudoers.IpAlreadySetErr) {
|
|
24
|
-
return err
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
_, err = h.sudoers.RunCommand(exec.Command("ip", "link", "set", "mtu", "1420", "up", "dev", "wg0"))
|
|
29
|
-
if err != nil {
|
|
30
|
-
return err
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
{
|
|
34
|
-
privateKeyName := uuid.New().String()
|
|
35
|
-
tempPrivateKeyFile := path.Join(os.TempDir(), privateKeyName)
|
|
36
|
-
err = ioutil.WriteFile(tempPrivateKeyFile, []byte(privateKey), 0755)
|
|
37
|
-
if err != nil {
|
|
38
|
-
return err
|
|
39
|
-
}
|
|
40
|
-
_, err = h.sudoers.RunCommand(exec.Command("wg", "set", "wg0", "private-key", tempPrivateKeyFile))
|
|
41
|
-
if err != nil {
|
|
42
|
-
return err
|
|
43
|
-
}
|
|
44
|
-
err = os.Remove(tempPrivateKeyFile)
|
|
45
|
-
if err != nil {
|
|
46
|
-
return err
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
_, err = h.sudoers.RunCommand(exec.Command("ip", "link", "set", "wg0", "up"))
|
|
51
|
-
if err != nil {
|
|
52
|
-
return err
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
_, err = h.sudoers.RunCommand(exec.Command("wg", "set", "wg0", "listen-port", wireguardPort))
|
|
56
|
-
if err != nil {
|
|
57
|
-
return err
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
clientIp := zeropsVpnProtocol.FromProtoIP(response.GetVpn().GetAssignedClientIp())
|
|
61
|
-
serverIp := zeropsVpnProtocol.FromProtoIP(response.GetVpn().GetServerIp())
|
|
62
|
-
vpnRange := zeropsVpnProtocol.FromProtoIPRange(response.GetVpn().GetVpnIpRange())
|
|
63
|
-
|
|
64
|
-
args := []string{
|
|
65
|
-
"set", "wg0",
|
|
66
|
-
"peer", response.GetVpn().GetServerPublicKey(),
|
|
67
|
-
"allowed-ips", vpnRange.String(),
|
|
68
|
-
"endpoint", selectedVpnAddress + ":" + strconv.Itoa(int(response.GetVpn().GetPort())),
|
|
69
|
-
"persistent-keepalive", "25",
|
|
70
|
-
}
|
|
71
|
-
_, err = h.sudoers.RunCommand(exec.Command("wg", args...))
|
|
72
|
-
if err != nil {
|
|
73
|
-
if !errors.Is(err, sudoers.IpAlreadySetErr) {
|
|
74
|
-
panic(err)
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
_, err = h.sudoers.RunCommand(exec.Command("ip", "-6", "address", "add", clientIp.String(), "dev", "wg0"))
|
|
79
|
-
if err != nil {
|
|
80
|
-
return err
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
_, err = h.sudoers.RunCommand(exec.Command("ip", "route", "add", vpnRange.String(), "dev", "wg0"))
|
|
84
|
-
if err != nil {
|
|
85
|
-
return err
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
h.logger.Debug("assigned client address: " + clientIp.String())
|
|
89
|
-
h.logger.Debug("assigned vpn server: " + selectedVpnAddress + ":" + strconv.Itoa(int(response.GetVpn().GetPort())))
|
|
90
|
-
h.logger.Debug("server public key: " + response.GetVpn().GetServerPublicKey())
|
|
91
|
-
h.logger.Debug("serverIp address: " + serverIp.String())
|
|
92
|
-
h.logger.Debug("vpnRange: " + vpnRange.String())
|
|
93
|
-
|
|
94
|
-
h.storage.Data.ServerIp = serverIp.String()
|
|
95
|
-
|
|
96
|
-
return nil
|
|
97
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
// +build darwin
|
|
2
|
-
|
|
3
|
-
package startVpn
|
|
4
|
-
|
|
5
|
-
import (
|
|
6
|
-
"errors"
|
|
7
|
-
"fmt"
|
|
8
|
-
"io/ioutil"
|
|
9
|
-
"os"
|
|
10
|
-
"os/exec"
|
|
11
|
-
"path"
|
|
12
|
-
"regexp"
|
|
13
|
-
"strconv"
|
|
14
|
-
|
|
15
|
-
"github.com/zerops-io/zcli/src/service/sudoers"
|
|
16
|
-
|
|
17
|
-
"github.com/google/uuid"
|
|
18
|
-
"github.com/zerops-io/zcli/src/zeropsVpnProtocol"
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
func (h *Handler) setVpn(selectedVpnAddress, privateKey string, response *zeropsVpnProtocol.StartVpnResponse) error {
|
|
22
|
-
var err error
|
|
23
|
-
|
|
24
|
-
output, err := h.sudoers.RunCommand(exec.Command("wireguard-go", "utun"))
|
|
25
|
-
if err != nil {
|
|
26
|
-
return err
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
re := regexp.MustCompile(`INFO: \((.*)\)`)
|
|
30
|
-
submatches := re.FindSubmatch(output)
|
|
31
|
-
if len(submatches) != 2 {
|
|
32
|
-
return errors.New("vpn interface not found")
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
interfaceName := string(submatches[1])
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
privateKeyName := uuid.New().String()
|
|
39
|
-
tempPrivateKeyFile := path.Join(os.TempDir(), privateKeyName)
|
|
40
|
-
|
|
41
|
-
fmt.Println(tempPrivateKeyFile)
|
|
42
|
-
err = ioutil.WriteFile(tempPrivateKeyFile, []byte(privateKey), 0755)
|
|
43
|
-
if err != nil {
|
|
44
|
-
return err
|
|
45
|
-
}
|
|
46
|
-
_, err = h.sudoers.RunCommand(exec.Command("wg", "set", interfaceName, "private-key", tempPrivateKeyFile))
|
|
47
|
-
if err != nil {
|
|
48
|
-
return err
|
|
49
|
-
}
|
|
50
|
-
err = os.Remove(tempPrivateKeyFile)
|
|
51
|
-
if err != nil {
|
|
52
|
-
return err
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
_, err = h.sudoers.RunCommand(exec.Command("wg", "set", interfaceName, "listen-port", wireguardPort))
|
|
57
|
-
if err != nil {
|
|
58
|
-
return err
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
clientIp := zeropsVpnProtocol.FromProtoIP(response.GetVpn().GetAssignedClientIp())
|
|
62
|
-
serverIp := zeropsVpnProtocol.FromProtoIP(response.GetVpn().GetServerIp())
|
|
63
|
-
vpnRange := zeropsVpnProtocol.FromProtoIPRange(response.GetVpn().GetVpnIpRange())
|
|
64
|
-
|
|
65
|
-
args := []string{
|
|
66
|
-
"set", interfaceName,
|
|
67
|
-
"peer", response.GetVpn().GetServerPublicKey(),
|
|
68
|
-
"allowed-ips", vpnRange.String(),
|
|
69
|
-
"endpoint", selectedVpnAddress + ":" + strconv.Itoa(int(response.GetVpn().GetPort())),
|
|
70
|
-
"persistent-keepalive", "25",
|
|
71
|
-
}
|
|
72
|
-
_, err = h.sudoers.RunCommand(exec.Command("wg", args...))
|
|
73
|
-
if err != nil {
|
|
74
|
-
if !errors.Is(err, sudoers.IpAlreadySetErr) {
|
|
75
|
-
panic(err)
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
_, err = h.sudoers.RunCommand(exec.Command("ifconfig", interfaceName, "inet6", clientIp.String(), "mtu", "1420"))
|
|
80
|
-
if err != nil {
|
|
81
|
-
return err
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
_, err = h.sudoers.RunCommand(exec.Command("route", "add", "-inet6", vpnRange.String(), serverIp.String()))
|
|
85
|
-
if err != nil {
|
|
86
|
-
return err
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
h.logger.Debug("assigned client address: " + clientIp.String())
|
|
90
|
-
h.logger.Debug("assigned vpn server: " + selectedVpnAddress + ":" + strconv.Itoa(int(response.GetVpn().GetPort())))
|
|
91
|
-
h.logger.Debug("server public key: " + response.GetVpn().GetServerPublicKey())
|
|
92
|
-
h.logger.Debug("serverIp address: " + serverIp.String())
|
|
93
|
-
h.logger.Debug("vpnRange: " + vpnRange.String())
|
|
94
|
-
|
|
95
|
-
h.storage.Data.ServerIp = serverIp.String()
|
|
96
|
-
|
|
97
|
-
return nil
|
|
98
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
package startVpn
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"context"
|
|
5
|
-
|
|
6
|
-
"github.com/zerops-io/zcli/src/zeropsVpnProtocol"
|
|
7
|
-
"google.golang.org/grpc"
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
func (h *Handler) startVpnClient(ctx context.Context, targetAddress string) (_ zeropsVpnProtocol.ZeropsVpnProtocolClient, closeFunc func(), _ error) {
|
|
11
|
-
|
|
12
|
-
var dialOpts []grpc.DialOption
|
|
13
|
-
dialOpts = append(dialOpts, grpc.WithInsecure())
|
|
14
|
-
|
|
15
|
-
connection, err := grpc.DialContext(
|
|
16
|
-
ctx,
|
|
17
|
-
targetAddress+vpnApiGrpcPort,
|
|
18
|
-
dialOpts...,
|
|
19
|
-
)
|
|
20
|
-
if err != nil {
|
|
21
|
-
return nil, nil, err
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return zeropsVpnProtocol.NewZeropsVpnProtocolClient(connection), func() {
|
|
25
|
-
_ = connection.Close()
|
|
26
|
-
}, nil
|
|
27
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
package stopVpn
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"context"
|
|
5
|
-
|
|
6
|
-
"github.com/zerops-io/zcli/src/service/logger"
|
|
7
|
-
"github.com/zerops-io/zcli/src/service/storage"
|
|
8
|
-
"github.com/zerops-io/zcli/src/service/sudoers"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
type Config struct {
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
type RunConfig struct {
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type Handler struct {
|
|
18
|
-
config Config
|
|
19
|
-
logger logger.Logger
|
|
20
|
-
sudoers *sudoers.Handler
|
|
21
|
-
storage *storage.Handler
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
func New(
|
|
25
|
-
config Config,
|
|
26
|
-
logger logger.Logger,
|
|
27
|
-
sudoers *sudoers.Handler,
|
|
28
|
-
storage *storage.Handler,
|
|
29
|
-
) *Handler {
|
|
30
|
-
return &Handler{
|
|
31
|
-
config: config,
|
|
32
|
-
logger: logger,
|
|
33
|
-
sudoers: sudoers,
|
|
34
|
-
storage: storage,
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
func (h *Handler) Run(_ context.Context, _ RunConfig) error {
|
|
39
|
-
|
|
40
|
-
err := h.cleanVpn()
|
|
41
|
-
if err != nil {
|
|
42
|
-
return err
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
h.storage.Data.ProjectId = ""
|
|
46
|
-
h.storage.Data.ServerIp = ""
|
|
47
|
-
err = h.storage.Save()
|
|
48
|
-
if err != nil {
|
|
49
|
-
return err
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
h.logger.Info("\nvpn connection was closed\n")
|
|
53
|
-
|
|
54
|
-
return nil
|
|
55
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// +build linux
|
|
2
|
-
|
|
3
|
-
package stopVpn
|
|
4
|
-
|
|
5
|
-
import (
|
|
6
|
-
"errors"
|
|
7
|
-
"os/exec"
|
|
8
|
-
|
|
9
|
-
"github.com/zerops-io/zcli/src/service/sudoers"
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
func (h *Handler) cleanVpn() error {
|
|
13
|
-
|
|
14
|
-
var err error
|
|
15
|
-
|
|
16
|
-
_, err = h.sudoers.RunCommand(exec.Command("ip", "link", "del", "dev", "wg0"))
|
|
17
|
-
if err != nil {
|
|
18
|
-
if !errors.Is(err, sudoers.CannotFindDeviceErr) {
|
|
19
|
-
return err
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return nil
|
|
24
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
// +build darwin
|
|
2
|
-
|
|
3
|
-
package stopVpn
|
|
4
|
-
|
|
5
|
-
import "os/exec"
|
|
6
|
-
|
|
7
|
-
func (h *Handler) cleanVpn() error {
|
|
8
|
-
|
|
9
|
-
var err error
|
|
10
|
-
|
|
11
|
-
cmd := "ps aux | grep wireguard | grep -v grep | awk '{print $2}' | xargs sudo kill"
|
|
12
|
-
|
|
13
|
-
_, err = h.sudoers.RunCommand(exec.Command("bash", "-c", cmd))
|
|
14
|
-
if err != nil {
|
|
15
|
-
return err
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return nil
|
|
19
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
package userInfo
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"context"
|
|
5
|
-
"fmt"
|
|
6
|
-
|
|
7
|
-
"github.com/zerops-io/zcli/src/helpers"
|
|
8
|
-
"github.com/zerops-io/zcli/src/zeropsApiProtocol"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
func Run(ctx context.Context, apiGrpcClient zeropsApiProtocol.ZeropsApiProtocolClient) error {
|
|
12
|
-
|
|
13
|
-
userInfoResponse, err := apiGrpcClient.GetUserInfo(ctx, &zeropsApiProtocol.GetUserInfoRequest{})
|
|
14
|
-
if err := helpers.HandleGrpcApiError(userInfoResponse, err); err != nil {
|
|
15
|
-
return err
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
fmt.Println(userInfoResponse.GetOutput())
|
|
19
|
-
|
|
20
|
-
return nil
|
|
21
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
package cmdRunner
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"bytes"
|
|
5
|
-
"errors"
|
|
6
|
-
"os/exec"
|
|
7
|
-
"strings"
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
var IpAlreadySetErr = errors.New("RTNETLINK answers: File exists")
|
|
11
|
-
var CannotFindDeviceErr = errors.New(`Cannot find device "wg0"`)
|
|
12
|
-
var OperationNotPermitted = errors.New(`Operation not permitted`)
|
|
13
|
-
|
|
14
|
-
func Run(cmd *exec.Cmd) ([]byte, error) {
|
|
15
|
-
output := &bytes.Buffer{}
|
|
16
|
-
errOutput := &bytes.Buffer{}
|
|
17
|
-
cmd.Stdout = output
|
|
18
|
-
cmd.Stderr = errOutput
|
|
19
|
-
|
|
20
|
-
if err := cmd.Run(); err != nil {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if errOutput.Len() > 0 {
|
|
24
|
-
errOutputString := string(errOutput.Bytes()[0 : errOutput.Len()-1])
|
|
25
|
-
|
|
26
|
-
if strings.Contains(errOutputString, OperationNotPermitted.Error()) {
|
|
27
|
-
return nil, OperationNotPermitted
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
for _, e := range []error{IpAlreadySetErr, CannotFindDeviceErr} {
|
|
31
|
-
if errOutputString == e.Error() {
|
|
32
|
-
return nil, e
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return nil, err
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return output.Bytes(), nil
|
|
40
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
package helpers
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"errors"
|
|
5
|
-
|
|
6
|
-
"github.com/zerops-io/zcli/src/zeropsApiProtocol"
|
|
7
|
-
"github.com/zerops-io/zcli/src/zeropsVpnProtocol"
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
func HandleGrpcApiError(
|
|
11
|
-
response interface {
|
|
12
|
-
GetError() *zeropsApiProtocol.Error
|
|
13
|
-
},
|
|
14
|
-
err error,
|
|
15
|
-
) error {
|
|
16
|
-
if err != nil {
|
|
17
|
-
return err
|
|
18
|
-
}
|
|
19
|
-
if response.GetError().GetCode() != zeropsApiProtocol.ErrorCode_NO_ERROR {
|
|
20
|
-
return errors.New(response.GetError().GetMessage())
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return nil
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
func HandleVpnApiError(
|
|
27
|
-
response interface {
|
|
28
|
-
GetError() *zeropsVpnProtocol.Error
|
|
29
|
-
},
|
|
30
|
-
err error,
|
|
31
|
-
) error {
|
|
32
|
-
if err != nil {
|
|
33
|
-
return err
|
|
34
|
-
}
|
|
35
|
-
if response.GetError().GetCode() != zeropsVpnProtocol.ErrorCode_NO_ERROR {
|
|
36
|
-
return errors.New(response.GetError().GetMessage())
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return nil
|
|
40
|
-
}
|