Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add sleep flag #177

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
1 change: 1 addition & 0 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ func init() {
rootCmd.PersistentFlags().StringP("kubernetes-auth-path", "", "", "Authentication mount point within Vault for Kubernetes")
rootCmd.PersistentFlags().BoolP("insecure", "k", false, "Allow insecure server connections when using SSL")
rootCmd.PersistentFlags().StringP("namespace", "n", "", "Namespace within the Vault server (Enterprise only)")
rootCmd.PersistentFlags().IntP("sleep", "s", 0, "Number of milliseconds to sleep after each operation to avoid rate limits")

// AutomaticEnv makes Viper load environment variables
viper.AutomaticEnv()
Expand Down
3 changes: 2 additions & 1 deletion cmd/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ var deleteCmd = &cobra.Command{
namespace, _ := cmd.Flags().GetString("namespace")
engineType, _ := cmd.Flags().GetString("engine-type")
isApproved, _ := cmd.Flags().GetBool("auto-approve")
sleepMillis, _ := cmd.Flags().GetInt("sleep")

// Setup Vault client
client := vaultengine.NewClient(vaultAddr, vaultToken, insecure, namespace, vaultRole, kubernetes, authPath)
Expand All @@ -44,7 +45,7 @@ var deleteCmd = &cobra.Command{
client.SetEngineType(engineType)

// Recursive delete
secretPaths, err := client.CollectPaths(path)
secretPaths, err := client.CollectPaths(path, sleepMillis)
if err != nil {
return err
}
Expand Down
3 changes: 2 additions & 1 deletion cmd/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ var exportCmd = &cobra.Command{
exportFormat, _ := cmd.Flags().GetString("format")
output, _ := cmd.Flags().GetString("output")
keysOnly, _ := cmd.Flags().GetBool("display-keys-only")
sleepMillis, _ := cmd.Flags().GetInt("sleep")

client := vaultengine.NewClient(vaultAddr, vaultToken, insecure, namespace, vaultRole, kubernetes, authPath)
engine, path, err := client.MountpathSplitPrefix(path)
Expand All @@ -50,7 +51,7 @@ var exportCmd = &cobra.Command{
client.UseEngine(engine)
client.SetEngineType(engineType)

exportData, err := client.FolderExport(path)
exportData, err := client.FolderExport(path, sleepMillis)
if err != nil {
fmt.Println(err)
return err
Expand Down
22 changes: 17 additions & 5 deletions pkg/vaultengine/folder_export.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ package vaultengine
import (
"fmt"
"strings"
"time"
)

// Folder defines a level of the Vault structure
type Folder map[string]interface{}

// FolderExport will export all subfolders and secrets from a specified location
func (client *Client) FolderExport(path string) (Folder, error) {
func (client *Client) FolderExport(path string, sleepMillis int) (Folder, error) {
baseFolder := make(Folder)
subFolders := make(Folder)

err := client.PathReader(&subFolders, path)
err := client.PathReader(&subFolders, path, sleepMillis)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -50,8 +51,9 @@ func buildFolderStructure(parentFolder *Folder, parts []string, subFolders Folde
}

// PathReader recursively reads the provided path and all subpaths
func (client *Client) PathReader(parentFolder *Folder, path string) error {
folder, err := client.FolderRead(path)
func (client *Client) PathReader(parentFolder *Folder, path string, sleepMillis int) error {

folder, err := client.FolderRead(path, sleepMillis)
if err != nil {
return err
}
Expand All @@ -64,11 +66,15 @@ func (client *Client) PathReader(parentFolder *Folder, path string) error {
subFolder := make(Folder)
keyName := strings.Replace(strKey, "/", "", -1)

err = client.PathReader(&subFolder, newPath)
err = client.PathReader(&subFolder, newPath, sleepMillis)
if err != nil {
return err
}

if sleepMillis > 0 {
time.Sleep(time.Duration(sleepMillis) * time.Millisecond)
}

if (*parentFolder)[keyName] != nil {
for key, elem := range (*parentFolder)[keyName].(map[string]interface{}) {
subFolder[key] = elem
Expand All @@ -77,10 +83,16 @@ func (client *Client) PathReader(parentFolder *Folder, path string) error {
(*parentFolder)[keyName] = subFolder
} else {
s := client.SecretRead(newPath)

if sleepMillis > 0 {
time.Sleep(time.Duration(sleepMillis) * time.Millisecond)
}

if len(s) > 0 {
(*parentFolder)[strKey] = s
}
}

}

return nil
Expand Down
9 changes: 7 additions & 2 deletions pkg/vaultengine/folder_read.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package vaultengine

import (
"fmt"
"time"
)

//FolderRead reads the subpaths and secrets of the provided path
func (client *Client) FolderRead(path string) ([]interface{}, error) {
// FolderRead reads the subpaths and secrets of the provided path
func (client *Client) FolderRead(path string, sleepMillis int) ([]interface{}, error) {
infix := "/metadata/"

if client.engineType == "kv1" {
Expand All @@ -19,6 +20,10 @@ func (client *Client) FolderRead(path string) ([]interface{}, error) {
return nil, err
}

if sleepMillis > 0 {
time.Sleep(time.Duration(sleepMillis) * time.Millisecond)
}

if secret == nil {
return nil, fmt.Errorf("no keys found using path [%s] on Vault instance [%s]", finalPath, client.addr)
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/vaultengine/secret_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (
)

// CollectPaths will retrieve all paths to secrets defined under the given path
func (client *Client) CollectPaths(path string) ([]string, error) {
func (client *Client) CollectPaths(path string, sleepMillis int) ([]string, error) {
var secretPaths []string
folder, err := client.FolderRead(path)
folder, err := client.FolderRead(path, sleepMillis)
if err != nil {
return nil, err
}
Expand All @@ -21,7 +21,7 @@ func (client *Client) CollectPaths(path string) ([]string, error) {
newPath = CleanupPath(newPath)

if IsFolder(strKey) {
t, err := client.CollectPaths(newPath)
t, err := client.CollectPaths(newPath, sleepMillis)
secretPaths = append(secretPaths, t...)
if err != nil {
return nil, err
Expand Down