Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/cliStorage/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ type Handler struct {
}

type Data struct {
Token string
RegionData region.Item
ScopeProjectId uuid.ProjectIdNull
VpnKeys map[uuid.ProjectId]entity.VpnKey
Token string
RegionData region.Item
ScopeProjectId uuid.ProjectIdNull
ProjectVpnKeyRegistry map[uuid.ProjectId]entity.VpnKey
}
4 changes: 3 additions & 1 deletion src/cmd/vpn.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,7 @@ func vpnCmd() *cmdBuilder.Cmd {
Short(i18n.T(i18n.CmdDescVpn)).
HelpFlag(i18n.T(i18n.CmdHelpVpn)).
AddChildrenCmd(vpnUpCmd()).
AddChildrenCmd(vpnDownCmd())
AddChildrenCmd(vpnDownCmd()).
AddChildrenCmd(vpnClearCmd()).
AddChildrenCmd(vpnKeyCmd())
}
62 changes: 62 additions & 0 deletions src/cmd/vpnClear.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package cmd

import (
"context"

"github.com/zeropsio/zcli/src/cliStorage"
"github.com/zeropsio/zcli/src/cmdBuilder"
"github.com/zeropsio/zerops-go/dto/input/body"
"github.com/zeropsio/zerops-go/dto/input/path"
"github.com/zeropsio/zerops-go/types"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)

func vpnClearCmd() *cmdBuilder.Cmd {
return cmdBuilder.NewCmd().
Use("clear").
Short("Disconnects Zerops VPN, removes registered public key from the project via API and deletes locally stored wg key.").
ScopeLevel(cmdBuilder.ScopeProject()).
HelpFlag("Help for the 'vpn clear' command.").
LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error {
project, err := cmdData.Project.Expect("project is null")
if err != nil {
return err
}

if vpnDownErr := disconnectVpn(ctx, cmdData.UxBlocks); vpnDownErr != nil {
cmdData.UxBlocks.PrintWarningTextf("vpn down: %s", vpnDownErr)
}

if vpnKey, ok := cmdData.CliStorage.Data().ProjectVpnKeyRegistry[project.Id]; ok {
wgKey, err := wgtypes.ParseKey(vpnKey.Key)
if err != nil {
return err
}

deleteResponse, err := cmdData.RestApiClient.DeleteProjectVpn(
ctx,
path.ProjectId{Id: project.Id},
body.PostProjectVpn{PublicKey: types.String(wgKey.PublicKey().String())},
)
if err != nil {
return err
}
if err := deleteResponse.Err(); err != nil {
return err
}

cmdData.UxBlocks.PrintSuccessTextf("Removed registered public key from project via API: %s", wgKey.PublicKey().String())

_, err = cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data {
delete(data.ProjectVpnKeyRegistry, project.Id)
cmdData.UxBlocks.PrintSuccessText("Deleted locally stored wg keys.")
return data
})
if err != nil {
return err
}
}

return nil
})
}
14 changes: 14 additions & 0 deletions src/cmd/vpnKey.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package cmd

import (
"github.com/zeropsio/zcli/src/cmdBuilder"
)

func vpnKeyCmd() *cmdBuilder.Cmd {
return cmdBuilder.NewCmd().
Use("key").
Short("VPN keys commands group.").
HelpFlag("Help for the 'vpn key' commands.").
AddChildrenCmd(vpnKeyListCmd()).
AddChildrenCmd(vpnKeyRemoveCmd())
}
42 changes: 42 additions & 0 deletions src/cmd/vpnKeyList.go.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package cmd

import (
"context"

"github.com/zeropsio/zcli/src/cmdBuilder"
"github.com/zeropsio/zerops-go/dto/input/path"
"github.com/zeropsio/zerops-go/dto/input/query"
)

func vpnKeyListCmd() *cmdBuilder.Cmd {
return cmdBuilder.NewCmd().
Use("list").
Short("Lists all registered VPN public keys of the project.").
ScopeLevel(cmdBuilder.ScopeProject()).
HelpFlag("Help for the 'vpn key list' command.").
LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error {
project, err := cmdData.Project.Expect("project is null")
if err != nil {
return err
}

listResponse, err := cmdData.RestApiClient.GetProjectVpnList(
ctx,
path.ProjectId{Id: project.Id},
query.GetProjectVpn{},
)
if err != nil {
return err
}
list, err := listResponse.Output()
if err != nil {
return err
}

for _, peer := range list.Peers {
cmdData.Stdout.Println(peer.PublicKey)
}

return nil
})
}
61 changes: 61 additions & 0 deletions src/cmd/vpnKeyRemove.go.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package cmd

import (
"context"
"encoding/base64"

"github.com/zeropsio/zcli/src/cmdBuilder"
"github.com/zeropsio/zerops-go/dto/input/body"
"github.com/zeropsio/zerops-go/dto/input/path"
"github.com/zeropsio/zerops-go/dto/input/query"
"github.com/zeropsio/zerops-go/types"
)

func vpnKeyRemoveCmd() *cmdBuilder.Cmd {
return cmdBuilder.NewCmd().
Use("remove").
Short("Removes registered VPN public keys from project via API.").
ScopeLevel(cmdBuilder.ScopeProject()).
Arg("public-keys", cmdBuilder.OptionalArg(), cmdBuilder.ArrayArg(), cmdBuilder.OptionalArgLabel("[ public-keys ... ]")).
HelpFlag("Help for the 'vpn key remove' command.").
LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error {
project, err := cmdData.Project.Expect("project is null")
if err != nil {
return err
}

for _, publicKey := range cmdData.Args["public-keys"] {
getResponse, err := cmdData.RestApiClient.GetProjectVpn(
ctx,
path.ProjectIdBase64PublicKey{
Id: project.Id,
Base64PublicKey: types.String(base64.URLEncoding.EncodeToString([]byte(publicKey))),
},
query.GetProjectVpn{},
)
if err != nil {
return err
}
if getResponse.Err() != nil {
cmdData.UxBlocks.PrintWarningTextf("Public key not found: %s", publicKey)
continue
}

deleteResponse, err := cmdData.RestApiClient.DeleteProjectVpn(
ctx,
path.ProjectId{Id: project.Id},
body.PostProjectVpn{PublicKey: types.String(publicKey)},
)
if err != nil {
return err
}
if err := deleteResponse.Err(); err != nil {
return err
}

cmdData.UxBlocks.PrintSuccessTextf("Removed registered public key from project via API: %s", publicKey)
}

return nil
})
}
6 changes: 3 additions & 3 deletions src/cmd/vpnUp.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,10 @@ func vpnUpCmd() *cmdBuilder.Cmd {
uxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(i18n.VpnConfigSaved), filePath))

_, err = cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data {
if data.VpnKeys == nil {
data.VpnKeys = make(map[uuid.ProjectId]entity.VpnKey)
if data.ProjectVpnKeyRegistry == nil {
data.ProjectVpnKeyRegistry = make(map[uuid.ProjectId]entity.VpnKey)
}
data.VpnKeys[project.Id] = entity.VpnKey{
data.ProjectVpnKeyRegistry[project.Id] = entity.VpnKey{
ProjectId: project.Id,
Key: privateKey.String(),
CreatedAt: time.Now(),
Expand Down
2 changes: 1 addition & 1 deletion src/cmdBuilder/createRunFunc.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func createCmdRunFunc(

cmdData := &LoggedUserCmdData{
GuestCmdData: guestCmdData,
VpnKeys: storedData.VpnKeys,
VpnKeys: storedData.ProjectVpnKeyRegistry,
}

host := storedData.RegionData.Address
Expand Down
17 changes: 17 additions & 0 deletions src/uxBlock/logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package uxBlock
import (
"bufio"
"bytes"
"fmt"

"github.com/zeropsio/zcli/src/logger"
"github.com/zeropsio/zcli/src/uxBlock/styles"
Expand All @@ -27,13 +28,21 @@ func (b *Blocks) PrintSuccessText(in string) {
}
}

func (b *Blocks) PrintSuccessTextf(format string, args ...any) {
b.PrintSuccessText(fmt.Sprintf(format, args...))
}

func (b *Blocks) PrintInfoText(in string) {
scan := bufio.NewScanner(bytes.NewBufferString(in))
for scan.Scan() {
b.PrintInfo(styles.InfoLine(scan.Text()))
}
}

func (b *Blocks) PrintInfoTextf(format string, args ...any) {
b.PrintInfoText(fmt.Sprintf(format, args...))
}

func (b *Blocks) PrintInfo(line styles.Line) {
b.outputLogger.Info(line)
b.debugFileLogger.Info(line.DisableStyle())
Expand All @@ -46,6 +55,10 @@ func (b *Blocks) PrintWarningText(in string) {
}
}

func (b *Blocks) PrintWarningTextf(format string, args ...any) {
b.PrintWarningText(fmt.Sprintf(format, args...))
}

func (b *Blocks) PrintWarning(line styles.Line) {
b.outputLogger.Warning(line)
b.debugFileLogger.Warning(line.DisableStyle())
Expand All @@ -58,6 +71,10 @@ func (b *Blocks) PrintErrorText(in string) {
}
}

func (b *Blocks) PrintErrorTextf(format string, args ...any) {
b.PrintErrorText(fmt.Sprintf(format, args...))
}

func (b *Blocks) PrintError(line styles.Line) {
b.outputLogger.Error(line)
b.debugFileLogger.Error(line.DisableStyle())
Expand Down