mirror of
https://github.com/LukeHagar/sailpoint-cli.git
synced 2025-12-06 12:47:44 +00:00
Resolved Bugs, Corrected formatting, Improved some visuals
This commit is contained in:
@@ -2,21 +2,17 @@
|
|||||||
package search
|
package search
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/charmbracelet/log"
|
"github.com/charmbracelet/log"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/config"
|
"github.com/sailpoint-oss/sailpoint-cli/internal/config"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/search"
|
"github.com/sailpoint-oss/sailpoint-cli/internal/search"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/util"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newQueryCmd(folderPath string, save bool) *cobra.Command {
|
func newQueryCmd() *cobra.Command {
|
||||||
|
|
||||||
var indices []string
|
var indices []string
|
||||||
|
|
||||||
var sort []string
|
var sort []string
|
||||||
var searchQuery string
|
var searchQuery string
|
||||||
|
var folderPath string
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "query",
|
Use: "query",
|
||||||
Short: "Manually Search using a specific Query and Indicies",
|
Short: "Manually Search using a specific Query and Indicies",
|
||||||
@@ -24,12 +20,6 @@ func newQueryCmd(folderPath string, save bool) *cobra.Command {
|
|||||||
Example: "sail search query \"(type:provisioning AND created:[now-90d TO now])\" --indices events",
|
Example: "sail search query \"(type:provisioning AND created:[now-90d TO now])\" --indices events",
|
||||||
Aliases: []string{"que"},
|
Aliases: []string{"que"},
|
||||||
Args: cobra.ExactArgs(1),
|
Args: cobra.ExactArgs(1),
|
||||||
PreRun: func(cmd *cobra.Command, args []string) {
|
|
||||||
folderPath, _ := cmd.Flags().GetString("folderPath")
|
|
||||||
if folderPath == "" {
|
|
||||||
cmd.MarkFlagRequired("save")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
err := config.InitConfig()
|
err := config.InitConfig()
|
||||||
@@ -43,7 +33,7 @@ func newQueryCmd(folderPath string, save bool) *cobra.Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
searchQuery = args[0]
|
searchQuery = args[0]
|
||||||
fmt.Println(searchQuery)
|
// fmt.Println(searchQuery)
|
||||||
|
|
||||||
searchObj, err := search.BuildSearch(searchQuery, sort, indices)
|
searchObj, err := search.BuildSearch(searchQuery, sort, indices)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -57,19 +47,16 @@ func newQueryCmd(folderPath string, save bool) *cobra.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if save {
|
err = search.IterateIndices(formattedResponse, searchQuery, folderPath, []string{"json"})
|
||||||
err = search.IterateIndices(formattedResponse, searchQuery, folderPath, []string{"json"})
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cmd.Println(util.PrettyPrint(formattedResponse))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "search_results", "Folder path to save the search results to. If the directory doesn't exist, then it will be created. (defaults to the current working directory)")
|
||||||
cmd.Flags().StringArrayVar(&indices, "indices", []string{}, "indices to perform the search query on (accessprofiles, accountactivities, entitlements, events, identities, roles)")
|
cmd.Flags().StringArrayVar(&indices, "indices", []string{}, "indices to perform the search query on (accessprofiles, accountactivities, entitlements, events, identities, roles)")
|
||||||
cmd.Flags().StringArrayVar(&sort, "sort", []string{}, "the sort value for the api call (displayName, +id...)")
|
cmd.Flags().StringArrayVar(&sort, "sort", []string{}, "the sort value for the api call (displayName, +id...)")
|
||||||
cmd.MarkFlagRequired("indices")
|
cmd.MarkFlagRequired("indices")
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func NewSearchCommand() *cobra.Command {
|
func NewSearchCommand() *cobra.Command {
|
||||||
var folderPath string
|
|
||||||
var save bool
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "search",
|
Use: "search",
|
||||||
Short: "Perform Search operations in IdentityNow with a specific query or a template",
|
Short: "Perform Search operations in IdentityNow with a specific query or a template",
|
||||||
@@ -21,13 +19,10 @@ func NewSearchCommand() *cobra.Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cmd.AddCommand(
|
cmd.AddCommand(
|
||||||
newQueryCmd(folderPath, save),
|
newQueryCmd(),
|
||||||
newTemplateCmd(folderPath, save),
|
newTemplateCmd(),
|
||||||
)
|
)
|
||||||
|
|
||||||
cmd.PersistentFlags().StringVarP(&folderPath, "folderPath", "f", "", "Folder path to save the search results to. If the directory doesn't exist, then it will be created. (defaults to the current working directory)")
|
|
||||||
cmd.PersistentFlags().BoolVarP(&save, "save", "s", false, "Save the search results to a file")
|
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ import (
|
|||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/templates"
|
"github.com/sailpoint-oss/sailpoint-cli/internal/templates"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/terminal"
|
"github.com/sailpoint-oss/sailpoint-cli/internal/terminal"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/types"
|
"github.com/sailpoint-oss/sailpoint-cli/internal/types"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/util"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newTemplateCmd(folderPath string, save bool) *cobra.Command {
|
func newTemplateCmd() *cobra.Command {
|
||||||
|
var folderPath string
|
||||||
var template string
|
var template string
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "template",
|
Use: "template",
|
||||||
@@ -90,17 +90,16 @@ func newTemplateCmd(folderPath string, save bool) *cobra.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if save {
|
err = search.IterateIndices(formattedResponse, selectedTemplate.SearchQuery.Query.GetQuery(), folderPath, []string{"json"})
|
||||||
err = search.IterateIndices(formattedResponse, selectedTemplate.SearchQuery.Query.GetQuery(), folderPath, []string{"json"})
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cmd.Println(util.PrettyPrint(formattedResponse))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "search_results", "Folder path to save the search results to. If the directory doesn't exist, then it will be created. (defaults to the current working directory)")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func TestNewTemplateCommand(t *testing.T) {
|
|||||||
ctrl := gomock.NewController(t)
|
ctrl := gomock.NewController(t)
|
||||||
defer ctrl.Finish()
|
defer ctrl.Finish()
|
||||||
|
|
||||||
cmd := newTemplateCmd("", false)
|
cmd := newTemplateCmd()
|
||||||
|
|
||||||
b := new(bytes.Buffer)
|
b := new(bytes.Buffer)
|
||||||
cmd.SetOut(b)
|
cmd.SetOut(b)
|
||||||
|
|||||||
@@ -3,15 +3,13 @@ package transform
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/charmbracelet/log"
|
"github.com/charmbracelet/log"
|
||||||
sailpoint "github.com/sailpoint-oss/golang-sdk"
|
sailpoint "github.com/sailpoint-oss/golang-sdk"
|
||||||
v3 "github.com/sailpoint-oss/golang-sdk/v3"
|
v3 "github.com/sailpoint-oss/golang-sdk/v3"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/config"
|
"github.com/sailpoint-oss/sailpoint-cli/internal/config"
|
||||||
|
"github.com/sailpoint-oss/sailpoint-cli/internal/output"
|
||||||
"github.com/sailpoint-oss/sailpoint-cli/internal/sdk"
|
"github.com/sailpoint-oss/sailpoint-cli/internal/sdk"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
@@ -22,7 +20,7 @@ func newDownloadCommand() *cobra.Command {
|
|||||||
Use: "download",
|
Use: "download",
|
||||||
Short: "Download all Transforms from IdentityNow",
|
Short: "Download all Transforms from IdentityNow",
|
||||||
Long: "\nDownload all Transforms from IdentityNow\n\n",
|
Long: "\nDownload all Transforms from IdentityNow\n\n",
|
||||||
Example: "sail transform downlooad -d transform_files | sail transform dl",
|
Example: "sail transform download -d transform_files | sail transform dl",
|
||||||
Aliases: []string{"dl"},
|
Aliases: []string{"dl"},
|
||||||
Args: cobra.NoArgs,
|
Args: cobra.NoArgs,
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
@@ -32,33 +30,15 @@ func newDownloadCommand() *cobra.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
transforms, resp, err := sailpoint.PaginateWithDefaults[v3.Transform](apiClient.V3.TransformsApi.ListTransforms(context.TODO()))
|
transforms, resp, err := sailpoint.PaginateWithDefaults[v3.TransformRead](apiClient.V3.TransformsApi.ListTransforms(context.TODO()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sdk.HandleSDKError(resp, err)
|
return sdk.HandleSDKError(resp, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, v := range transforms {
|
for _, v := range transforms {
|
||||||
filename := strings.ReplaceAll(v.Name, " ", "") + ".json"
|
filename := strings.ReplaceAll(v.Name, " ", "")
|
||||||
content, _ := json.MarshalIndent(v, "", " ")
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// Make sure the output dir exists first
|
|
||||||
err = os.MkdirAll(destination, os.ModePerm)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure to create the files if they dont exist
|
|
||||||
file, err := os.OpenFile((filepath.Join(destination, filename)), os.O_RDWR|os.O_CREATE, 0777)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = file.Write(content)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
|
err := output.SaveJSONFile(v, filename, destination)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,15 +52,17 @@ func newCollectCommand(term terminal.Terminal) *cobra.Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
p := mpb.New(mpb.WithWidth(60),
|
p := mpb.New(
|
||||||
mpb.PopCompletedMode(),
|
mpb.PopCompletedMode(),
|
||||||
mpb.WithRefreshRate(180*time.Millisecond),
|
mpb.WithRefreshRate(180*time.Millisecond),
|
||||||
mpb.WithWaitGroup(&wg))
|
mpb.WithWaitGroup(&wg))
|
||||||
|
|
||||||
|
log.SetOutput(p)
|
||||||
|
|
||||||
for i, endpoint := range args {
|
for i, endpoint := range args {
|
||||||
var password string
|
var password string
|
||||||
|
|
||||||
if len(credentials) >= i-1 {
|
if len(credentials) > i {
|
||||||
password = credentials[i]
|
password = credentials[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,11 @@ func newUpdateCommand(term terminal.Terminal) *cobra.Command {
|
|||||||
Args: cobra.MinimumNArgs(1),
|
Args: cobra.MinimumNArgs(1),
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
for i, endpoint := range args {
|
for i, endpoint := range args {
|
||||||
|
var password string
|
||||||
|
|
||||||
password := credentials[i]
|
if len(credentials) > i {
|
||||||
|
password = credentials[i]
|
||||||
|
}
|
||||||
|
|
||||||
if password == "" {
|
if password == "" {
|
||||||
password, _ = term.PromptPassword("Enter Password for " + endpoint + ":")
|
password, _ = term.PromptPassword("Enter Password for " + endpoint + ":")
|
||||||
|
|||||||
@@ -123,7 +123,8 @@ func CollectVAFiles(endpoint string, password string, output string, files []str
|
|||||||
|
|
||||||
err := collectFile(sftp, filePath, outputFolder, endpoint, p)
|
err := collectFile(sftp, filePath, outputFolder, endpoint, p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn("Error collecting file", "file", filePath, "VA", endpoint, "err", err)
|
log.Warn("Skipping file", "file", filePath, "VA", endpoint)
|
||||||
|
log.Debug("Error collecting file", "file", filePath, "VA", endpoint, "err", err)
|
||||||
}
|
}
|
||||||
}(filePath)
|
}(filePath)
|
||||||
}
|
}
|
||||||
@@ -153,9 +154,9 @@ func collectFile(sftp *sftp.Client, filePath, outputFolder, endpoint string, p *
|
|||||||
bar := p.AddBar(remoteFileStats.Size(),
|
bar := p.AddBar(remoteFileStats.Size(),
|
||||||
mpb.BarFillerClearOnComplete(),
|
mpb.BarFillerClearOnComplete(),
|
||||||
mpb.PrependDecorators(
|
mpb.PrependDecorators(
|
||||||
decor.Name(name, decor.WCSyncSpaceR),
|
decor.Name(name, decor.WCSyncWidthR),
|
||||||
decor.Name(":", decor.WCSyncSpaceR),
|
decor.Name(" : ", decor.WCSyncWidthR),
|
||||||
decor.OnComplete(decor.CountersKiloByte("% .2f / % .2f", decor.WCSyncSpaceR), "Complete"),
|
// decor.OnComplete(decor.CountersKiloByte("% .2f / % .2f", decor.WCSyncSpaceR), "Complete"),
|
||||||
decor.TotalKiloByte("% .2f", decor.WCSyncSpaceR),
|
decor.TotalKiloByte("% .2f", decor.WCSyncSpaceR),
|
||||||
),
|
),
|
||||||
mpb.AppendDecorators(
|
mpb.AppendDecorators(
|
||||||
|
|||||||
Reference in New Issue
Block a user