@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,97 +0,0 @@
|
|
|
1
|
-
package certReader
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"crypto/x509"
|
|
5
|
-
"encoding/asn1"
|
|
6
|
-
"encoding/base64"
|
|
7
|
-
"encoding/pem"
|
|
8
|
-
"errors"
|
|
9
|
-
"strconv"
|
|
10
|
-
"strings"
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
var userIdType = asn1.ObjectIdentifier([]int{1, 2, 3, 1})
|
|
14
|
-
|
|
15
|
-
type Config struct {
|
|
16
|
-
Token string
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type Handler struct {
|
|
20
|
-
config Config
|
|
21
|
-
|
|
22
|
-
CaData, CertData, KeyData []byte
|
|
23
|
-
|
|
24
|
-
UserId string
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
func New(config Config) (h *Handler, err error) {
|
|
28
|
-
|
|
29
|
-
h = &Handler{
|
|
30
|
-
config: config,
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
tokens := strings.Split(config.Token, ";")
|
|
34
|
-
if len(tokens) != 3 {
|
|
35
|
-
return h, errors.New("invalid credentials, try `login` command")
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if h.CaData, err = readData(tokens[0]); err != nil {
|
|
39
|
-
return
|
|
40
|
-
}
|
|
41
|
-
if h.KeyData, err = readData(tokens[1]); err != nil {
|
|
42
|
-
return
|
|
43
|
-
}
|
|
44
|
-
if h.CertData, err = readData(tokens[2]); err != nil {
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
roots := x509.NewCertPool()
|
|
49
|
-
ok := roots.AppendCertsFromPEM(h.CertData)
|
|
50
|
-
if !ok {
|
|
51
|
-
return nil, errors.New("failed to parse root certificate")
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
block, _ := pem.Decode(h.CertData)
|
|
55
|
-
if block == nil {
|
|
56
|
-
return nil, errors.New("failed to parse certificate PEM")
|
|
57
|
-
}
|
|
58
|
-
cert, err := x509.ParseCertificate(block.Bytes)
|
|
59
|
-
if err != nil {
|
|
60
|
-
return nil, errors.New("failed to parse certificate: " + err.Error())
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
h.UserId, err = func(cert *x509.Certificate) (string, error) {
|
|
64
|
-
for _, name := range cert.Subject.Names {
|
|
65
|
-
switch {
|
|
66
|
-
case name.Type.Equal(userIdType):
|
|
67
|
-
return name.Value.(string), nil
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return "", errors.New("bad certificate, try contact support")
|
|
71
|
-
}(cert)
|
|
72
|
-
if err != nil {
|
|
73
|
-
return
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
func readData(value string) (data []byte, err error) {
|
|
80
|
-
valueB, err := base64.StdEncoding.DecodeString(value)
|
|
81
|
-
if err != nil {
|
|
82
|
-
return nil, err
|
|
83
|
-
}
|
|
84
|
-
value = string(valueB)
|
|
85
|
-
|
|
86
|
-
if strings.Contains(value, `\n`) && !strings.HasPrefix(value, `"`) {
|
|
87
|
-
value = `"` + value + `"`
|
|
88
|
-
}
|
|
89
|
-
if !strings.HasPrefix(value, `"`) {
|
|
90
|
-
return []byte(value), err
|
|
91
|
-
}
|
|
92
|
-
valueCaUnquote, err := strconv.Unquote(value)
|
|
93
|
-
if err != nil {
|
|
94
|
-
return nil, err
|
|
95
|
-
}
|
|
96
|
-
return []byte(valueCaUnquote), nil
|
|
97
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
package httpClient
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"bytes"
|
|
5
|
-
"io/ioutil"
|
|
6
|
-
"net/http"
|
|
7
|
-
"time"
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
type Config struct {
|
|
11
|
-
HttpTimeout time.Duration
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
type Response struct {
|
|
15
|
-
StatusCode int
|
|
16
|
-
Body []byte
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type Handler struct {
|
|
20
|
-
config Config
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
func New(config Config) *Handler {
|
|
24
|
-
return &Handler{
|
|
25
|
-
config: config,
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
type Option func(cfg *optionConfig)
|
|
30
|
-
|
|
31
|
-
func ContentType(contentType string) Option {
|
|
32
|
-
return func(cfg *optionConfig) {
|
|
33
|
-
cfg.headers["Content-Type"] = contentType
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
func BearerAuthorization(token string) Option {
|
|
38
|
-
return func(cfg *optionConfig) {
|
|
39
|
-
cfg.headers["Authorization"] = "Bearer " + token
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
type optionConfig struct {
|
|
44
|
-
headers map[string]string
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
func (h *Handler) Put(url string, data []byte, options ...Option) (Response, error) {
|
|
48
|
-
return h.do("PUT", url, data, options...)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
func (h *Handler) Post(url string, data []byte, options ...Option) (Response, error) {
|
|
52
|
-
return h.do("POST", url, data, options...)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
func (h *Handler) do(method string, url string, data []byte, options ...Option) (Response, error) {
|
|
56
|
-
cfg := &optionConfig{
|
|
57
|
-
headers: map[string]string{
|
|
58
|
-
"Content-Type": "application/json",
|
|
59
|
-
},
|
|
60
|
-
}
|
|
61
|
-
for _, o := range options {
|
|
62
|
-
o(cfg)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
client := &http.Client{Timeout: h.config.HttpTimeout}
|
|
66
|
-
req, err := http.NewRequest(method, url, bytes.NewReader(data))
|
|
67
|
-
if err != nil {
|
|
68
|
-
return Response{}, err
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
for key, value := range cfg.headers {
|
|
72
|
-
req.Header.Add(key, value)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
resp, err := client.Do(req)
|
|
76
|
-
if err != nil {
|
|
77
|
-
return Response{}, err
|
|
78
|
-
}
|
|
79
|
-
defer resp.Body.Close()
|
|
80
|
-
|
|
81
|
-
bodyBytes, err := ioutil.ReadAll(resp.Body)
|
|
82
|
-
if err != nil {
|
|
83
|
-
return Response{}, err
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return Response{
|
|
87
|
-
StatusCode: resp.StatusCode,
|
|
88
|
-
Body: bodyBytes,
|
|
89
|
-
}, nil
|
|
90
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
package logger
|
|
2
|
-
|
|
3
|
-
import "fmt"
|
|
4
|
-
|
|
5
|
-
type Config struct {
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
type Handler struct {
|
|
9
|
-
config Config
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
func New(config Config) *Handler {
|
|
13
|
-
return &Handler{
|
|
14
|
-
config: config,
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
func (h *Handler) Info(a ...interface{}) {
|
|
19
|
-
fmt.Println(a...)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
func (h *Handler) Warning(a ...interface{}) {
|
|
23
|
-
fmt.Println(a...)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
func (h *Handler) Error(a ...interface{}) {
|
|
27
|
-
fmt.Println(a...)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
func (h *Handler) Debug(a ...interface{}) {
|
|
31
|
-
fmt.Println(a...)
|
|
32
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
package params
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"os"
|
|
5
|
-
|
|
6
|
-
"github.com/zerops-io/zcli/src/service/storage"
|
|
7
|
-
|
|
8
|
-
"github.com/spf13/cobra"
|
|
9
|
-
"github.com/spf13/viper"
|
|
10
|
-
loggerPackage "github.com/zerops-io/zcli/src/service/logger"
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
type Handler struct {
|
|
14
|
-
logger loggerPackage.Logger
|
|
15
|
-
storage *storage.Handler
|
|
16
|
-
|
|
17
|
-
params map[string]interface{}
|
|
18
|
-
viper *viper.Viper
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
func New(
|
|
22
|
-
logger loggerPackage.Logger,
|
|
23
|
-
storage *storage.Handler,
|
|
24
|
-
) *Handler {
|
|
25
|
-
return &Handler{
|
|
26
|
-
logger: logger,
|
|
27
|
-
storage: storage,
|
|
28
|
-
|
|
29
|
-
params: make(map[string]interface{}),
|
|
30
|
-
viper: viper.New(),
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
type Option func(cfg *optionConfig)
|
|
35
|
-
|
|
36
|
-
func Persistent() Option {
|
|
37
|
-
return func(cfg *optionConfig) {
|
|
38
|
-
cfg.persistent = true
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
func FromTempData(f func(data *storage.Data) interface{}) Option {
|
|
43
|
-
return func(cfg *optionConfig) {
|
|
44
|
-
cfg.loadFromTempData = f
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
type optionConfig struct {
|
|
49
|
-
persistent bool
|
|
50
|
-
loadFromTempData func(data *storage.Data) interface{}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
func (h *Handler) RegisterString(cmd *cobra.Command, name, defaultValue, description string, options ...Option) {
|
|
54
|
-
var paramValue string
|
|
55
|
-
|
|
56
|
-
cfg := &optionConfig{}
|
|
57
|
-
for _, o := range options {
|
|
58
|
-
o(cfg)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if cfg.persistent {
|
|
62
|
-
cmd.PersistentFlags().StringVar(¶mValue, name, "", description)
|
|
63
|
-
h.viper.BindPFlags(cmd.PersistentFlags())
|
|
64
|
-
} else {
|
|
65
|
-
cmd.Flags().StringVar(¶mValue, name, "", description)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
h.params[name] = func() string {
|
|
69
|
-
if paramValue != "" {
|
|
70
|
-
return paramValue
|
|
71
|
-
}
|
|
72
|
-
if cfg.loadFromTempData != nil {
|
|
73
|
-
value := cfg.loadFromTempData(h.storage.Data)
|
|
74
|
-
if v, ok := value.(string); ok {
|
|
75
|
-
return v
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
if h.viper.GetString(name) != "" {
|
|
79
|
-
return h.viper.GetString(name)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return defaultValue
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
func (h *Handler) GetString(name string) string {
|
|
87
|
-
if param, exists := h.params[name]; exists {
|
|
88
|
-
if v, ok := param.(func() string); ok {
|
|
89
|
-
return v()
|
|
90
|
-
}
|
|
91
|
-
return ""
|
|
92
|
-
}
|
|
93
|
-
return ""
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
func (h *Handler) InitViper() error {
|
|
97
|
-
|
|
98
|
-
path, err := os.Getwd()
|
|
99
|
-
if err != nil {
|
|
100
|
-
return err
|
|
101
|
-
}
|
|
102
|
-
h.viper.AddConfigPath(path)
|
|
103
|
-
h.viper.SetConfigName("zcli.config")
|
|
104
|
-
h.viper.AutomaticEnv()
|
|
105
|
-
|
|
106
|
-
if err := h.viper.ReadInConfig(); err == nil {
|
|
107
|
-
h.logger.Info("Using config file:", h.viper.ConfigFileUsed())
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return nil
|
|
111
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
package storage
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"encoding/json"
|
|
5
|
-
"io/ioutil"
|
|
6
|
-
"os"
|
|
7
|
-
)
|
|
8
|
-
|
|
9
|
-
type Config struct {
|
|
10
|
-
FilePath string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
type Handler struct {
|
|
14
|
-
config Config
|
|
15
|
-
|
|
16
|
-
Data *Data
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type Data struct {
|
|
20
|
-
ProjectId string
|
|
21
|
-
ServerIp string
|
|
22
|
-
Token string
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
func New(config Config) (*Handler, error) {
|
|
26
|
-
|
|
27
|
-
h := &Handler{
|
|
28
|
-
config: config,
|
|
29
|
-
Data: &Data{},
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if fileExists(config.FilePath) {
|
|
33
|
-
f, err := os.Open(config.FilePath)
|
|
34
|
-
if err != nil {
|
|
35
|
-
return nil, err
|
|
36
|
-
}
|
|
37
|
-
defer f.Close()
|
|
38
|
-
|
|
39
|
-
bytes, err := ioutil.ReadAll(f)
|
|
40
|
-
if err != nil {
|
|
41
|
-
return nil, err
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
err = json.Unmarshal(bytes, &h.Data)
|
|
45
|
-
if err != nil {
|
|
46
|
-
return nil, err
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return h, nil
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
func (h *Handler) Save() error {
|
|
54
|
-
data, err := json.Marshal(h.Data)
|
|
55
|
-
if err != nil {
|
|
56
|
-
return err
|
|
57
|
-
}
|
|
58
|
-
err = ioutil.WriteFile(h.config.FilePath, data, 0644)
|
|
59
|
-
if err != nil {
|
|
60
|
-
return err
|
|
61
|
-
}
|
|
62
|
-
return err
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
func fileExists(filename string) bool {
|
|
66
|
-
info, err := os.Stat(filename)
|
|
67
|
-
if os.IsNotExist(err) {
|
|
68
|
-
return false
|
|
69
|
-
}
|
|
70
|
-
return !info.IsDir()
|
|
71
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
package sudoers
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"errors"
|
|
5
|
-
"os/exec"
|
|
6
|
-
|
|
7
|
-
"github.com/zerops-io/zcli/src/helpers/cmdRunner"
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
var IpAlreadySetErr = cmdRunner.IpAlreadySetErr
|
|
11
|
-
var CannotFindDeviceErr = cmdRunner.CannotFindDeviceErr
|
|
12
|
-
var OperationNotPermitted = cmdRunner.OperationNotPermitted
|
|
13
|
-
|
|
14
|
-
type Config struct {
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type Handler struct {
|
|
18
|
-
config Config
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
func New(config Config) *Handler {
|
|
22
|
-
return &Handler{
|
|
23
|
-
config: config,
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// command with installation if operation is not permitted
|
|
28
|
-
func (h *Handler) RunCommand(cmd *exec.Cmd) ([]byte, error) {
|
|
29
|
-
|
|
30
|
-
sudoCmd := exec.Command("sudo", cmd.Args...)
|
|
31
|
-
sudoCmd.Env = cmd.Env
|
|
32
|
-
sudoCmd.Stdin = cmd.Stdin
|
|
33
|
-
sudoCmd.Stderr = cmd.Stderr
|
|
34
|
-
sudoCmd.Stdout = cmd.Stdout
|
|
35
|
-
sudoCmd.Dir = cmd.Dir
|
|
36
|
-
|
|
37
|
-
output, err := cmdRunner.Run(sudoCmd)
|
|
38
|
-
if err != nil {
|
|
39
|
-
if errors.Is(err, OperationNotPermitted) {
|
|
40
|
-
|
|
41
|
-
newCmd := exec.Command("sudo", cmd.Args...)
|
|
42
|
-
|
|
43
|
-
output, err = cmdRunner.Run(newCmd)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return output, err
|
|
48
|
-
|
|
49
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
package tlsConfig
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"crypto/tls"
|
|
5
|
-
"crypto/x509"
|
|
6
|
-
"errors"
|
|
7
|
-
|
|
8
|
-
"github.com/zerops-io/zcli/src/service/certReader"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
func CreateTlsConfig(certReader *certReader.Handler) (tlsConfig *tls.Config, err error) {
|
|
12
|
-
tlsConfig = &tls.Config{}
|
|
13
|
-
tlsConfig.InsecureSkipVerify = true
|
|
14
|
-
tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert
|
|
15
|
-
|
|
16
|
-
var crt tls.Certificate
|
|
17
|
-
crt, err = tls.X509KeyPair(certReader.CertData, certReader.KeyData)
|
|
18
|
-
if err != nil {
|
|
19
|
-
return nil, err
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
tlsConfig.Certificates = []tls.Certificate{crt}
|
|
23
|
-
|
|
24
|
-
var caCertPool *x509.CertPool
|
|
25
|
-
caCertPool, err = x509.SystemCertPool()
|
|
26
|
-
if err != nil {
|
|
27
|
-
return nil, err
|
|
28
|
-
}
|
|
29
|
-
if ok := caCertPool.AppendCertsFromPEM(certReader.CaData); !ok {
|
|
30
|
-
return nil, errors.New("error append cert from PEM")
|
|
31
|
-
}
|
|
32
|
-
tlsConfig.RootCAs = caCertPool
|
|
33
|
-
tlsConfig.ClientCAs = caCertPool
|
|
34
|
-
|
|
35
|
-
return
|
|
36
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
package zipClient
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"archive/zip"
|
|
5
|
-
"errors"
|
|
6
|
-
"io"
|
|
7
|
-
"os"
|
|
8
|
-
"path"
|
|
9
|
-
"path/filepath"
|
|
10
|
-
"strings"
|
|
11
|
-
|
|
12
|
-
"github.com/zerops-io/zcli/src/service/logger"
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
type Config struct {
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
type Handler struct {
|
|
19
|
-
config Config
|
|
20
|
-
logger logger.Logger
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
func New(config Config, logger logger.Logger) *Handler {
|
|
24
|
-
return &Handler{
|
|
25
|
-
config: config,
|
|
26
|
-
logger: logger,
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
func (h *Handler) Zip(w io.Writer, workingDir string, sources ...string) error {
|
|
31
|
-
archive := zip.NewWriter(w)
|
|
32
|
-
defer archive.Close()
|
|
33
|
-
|
|
34
|
-
workingDir, err := filepath.Abs(workingDir)
|
|
35
|
-
if err != nil {
|
|
36
|
-
return err
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
h.logger.Info("working directory: " + workingDir)
|
|
40
|
-
|
|
41
|
-
for _, source := range sources {
|
|
42
|
-
|
|
43
|
-
parts := strings.Split(source, "*")
|
|
44
|
-
if len(parts) > 2 {
|
|
45
|
-
return errors.New("only one *(asterisk) is allowed")
|
|
46
|
-
}
|
|
47
|
-
if len(parts) == 1 {
|
|
48
|
-
parts = []string{
|
|
49
|
-
"", parts[0],
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
source := path.Join(workingDir, path.Join(parts...))
|
|
54
|
-
source, err := filepath.Abs(source)
|
|
55
|
-
if err != nil {
|
|
56
|
-
return err
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
trimPart := path.Join(workingDir, parts[0])
|
|
60
|
-
|
|
61
|
-
fileInfo, err := os.Lstat(source)
|
|
62
|
-
if err != nil {
|
|
63
|
-
return err
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if fileInfo.IsDir() {
|
|
67
|
-
h.logger.Info("packing directory: " + source)
|
|
68
|
-
} else {
|
|
69
|
-
h.logger.Info("packing file: " + source)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
err = filepath.Walk(source, func(filePath string, info os.FileInfo, err error) error {
|
|
73
|
-
if err != nil {
|
|
74
|
-
return err
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
header, err := zip.FileInfoHeader(info)
|
|
78
|
-
if err != nil {
|
|
79
|
-
return err
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
header.Name = strings.TrimPrefix(func(filePath string) string {
|
|
83
|
-
if info.IsDir() {
|
|
84
|
-
filePath += "/"
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
filePath = strings.TrimPrefix(filePath, trimPart)
|
|
88
|
-
|
|
89
|
-
if filePath == parts[0] {
|
|
90
|
-
return ""
|
|
91
|
-
}
|
|
92
|
-
return strings.TrimPrefix(filePath, parts[0])
|
|
93
|
-
|
|
94
|
-
}(filePath), "/")
|
|
95
|
-
|
|
96
|
-
if header.Name == "" {
|
|
97
|
-
return nil
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if !info.IsDir() {
|
|
101
|
-
header.Method = zip.Deflate
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
writer, err := archive.CreateHeader(header)
|
|
105
|
-
if err != nil {
|
|
106
|
-
return err
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if info.IsDir() {
|
|
110
|
-
return nil
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if header.FileInfo().Mode()&os.ModeSymlink != 0 {
|
|
114
|
-
symlink, err := os.Readlink(filePath)
|
|
115
|
-
if err != nil {
|
|
116
|
-
return err
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
_, err = writer.Write([]byte(symlink))
|
|
120
|
-
if err != nil {
|
|
121
|
-
return err
|
|
122
|
-
}
|
|
123
|
-
} else {
|
|
124
|
-
file, err := os.Open(filePath)
|
|
125
|
-
if err != nil {
|
|
126
|
-
return err
|
|
127
|
-
}
|
|
128
|
-
defer file.Close()
|
|
129
|
-
_, err = io.Copy(writer, file)
|
|
130
|
-
if err != nil {
|
|
131
|
-
return err
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return nil
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
if err != nil {
|
|
139
|
-
return err
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return nil
|
|
144
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
symlink
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|