CLI doc edits

This commit is contained in:
james.haytko
2023-11-06 12:26:21 -06:00
parent faf5d00d4d
commit cca1ed9066
52 changed files with 207 additions and 135 deletions

View File

@@ -1,8 +1,8 @@
==Long==
# Sanitize
Sanitize a har file of sensitive data
Specifically removes access tokens and origin urls similar to the examples below:
Run this command to sanitize a HAR file of sensitive data.
Sanitizing a HAR file means specifically removing access tokens and origin URLS from the file to ensure that such sensitive information is secure.
Access Token
```

View File

@@ -1,12 +1,14 @@
# Search
The `search` command makes it easy to search in identitynow using the SailPoint CLI.
In IdentityNow, you can search all the sources connected to your tenant and return virtually any information you have access to. To learn more about search in IdentityNow, refer to [Search](https://documentation.sailpoint.com/saas/help/search/index.html).
The `search` command makes it easy to search in IdentityNow with the SailPoint CLI. Read this guide to learn how to use the `query` and `template` commands to search IdentityNow with the CLI.
- [Search](#search)
- [Query](#query)
- [Command](#command)
- [Flags](#flags)
- [Indicies](#indicies)
- [Indices](#indices)
- [Sort](#sort)
- [Output Types](#output-types)
- [Folder Path](#folder-path)
@@ -18,78 +20,136 @@ The `search` command makes it easy to search in identitynow using the SailPoint
## Query
### Command
Search queries in IdentityNow are flexible - they can be very broad or very narrow, and you can further narrow your results by using IdentityNow's specific syntax to structure your queries. To learn about structuring search queries, refer to [Building a Search Query](https://documentation.sailpoint.com/saas/help/search/building-query.html).
Run the following command to search with manually provided search attributes.
The `query` command allows you to search IdentityNow for a query you specify.
To use the `query` command to search IdentityNow, you must understand how to format your search queries.
The basic format of a query is "field:term", so an example `query` command would like this:
```shell
sail search query <search query string> -indicies <indicie to search on>
sail search query "name:a*" --indices identities
```
The CLI will use the [V3 Search endpoint](https://developer.sailpoint.com/idn/api/v3/search-post) to search for all identities starting with names starting with the letter "a".
The CLI will then generate a JSON file containing the search results. This JSON file will be located in a folder titled "search_results", within the current working directory, unless a folder path is specified.
### Command
This example can help you understand the `query` command structure:
```shell
sail search query <search query string> --indices <index to search>
```
You must start your search query with `sail search query`, and you must specify a query string to search for and a set of indices to search.
### Flags
#### Indicies
You can append a number of flags to the `query` command to refine it:
- The first flag, `indices`, is required. It specifies the indices to run the search operation on.
- The second possible flag, `sort`, allows you to specify the sort strings to use for the search query, as well as the sorting arrangement for the results.
- The third possible flag, `outputTypes`, allows you to specify the output data format as either `json` or `csv`.
- The fourth possible flag, `folderPath`, allows you to specify the folder path where you want to save the search query result files.
Specifies the indicies to run the search operation on
#### Indices
Use the `indices` flag to specify the indices you want to search. The `indices` flag is required to use the `query` command.
Here is an example of a `query` command with specified `indices`:
```shell
sail search query "name:a*" -indicies identities
sail search query "name:a*" --indices identities
```
You can search multiple indicies by added additional flags
You can search multiple indices.
Here is an example of a `query` command with multiple specified `indices`.
```shell
sail search query "name:a*" -indicies identities -indicies accessprofiles
sail search query "name:a*" --indices identities --indices accessprofiles
```
#### Sort
Specified the sort strings used for the search query
Use the `sort` flag to specify the sort strings you want to use to determine the sorting arrangement of your search query results.
When you specify a string to sort by, like `name`, the CLI sorts results by `name` in ascending order. If you add a "-" before the sort string, like `-name`, the CLI will sort the results in descending order instead.
Here is an example of a `query` command that sorts the results in descending order based on the identities' `created` dates:
```shell
sail search query "name:a*" -indicies identities -sort name -sort "-created"
sail search query "name:a*" --indices identities --sort "-created"
```
You can specify multiple sort strings for your search queries.
Here is an example of a `query` command that sorts the results in ascending order based on `name`, as well as in descending order based on the identities' `created` dates:
```shell
sail search query "name:a*" --indices identities --sort name --sort "-created"
```
#### Output Types
Specify the output data format currently `json` and `csv` are the only supported types
Use the `outputTypes` flag to specify the output data format for the search query results. Currently, the only supported output types are `json` and `csv`.
Here is an example of a `query` command that specifies the `json` output type:
```shell
sail search query "name:a*" -indicies identities -outputTypes json
sail search query "name:a*" --indices identities --outputTypes json
```
#### Folder Path
Specify the folder path to save the search results in
Use the `folderPath` flag to specify the folder path to save the search results in.
If you don't specify a `folderPath`, the results will save to a folder called "search_results", located within your current working directory.
Here is an example of a `query` command that specifies a `folderPath`:
```shell
sail search query "name:a*" -indicies identities -folderPath ./local/folder/path
sail search query "name:a*" --indices identities --folderPath ./local/folder/path
```
## Template
For more detailed search queries, you can provide a predefined template instead of constructing the whole query every time. This allows you to run very detailed search queries quickly and easily.
The `template` command allows you to use predefined templates to search IdentityNow.
### Command
Run the following command to search with a predefined template.
This example shows the essential `template` command structure:
```shell
sail search template all-provisioning-events-90-days
```
The specified template file will give the CLI all the information it needs to perform its search in IdentityNow.
### Flags
You can append two flags to the `template` command to refine it:
- The first possible flag, `outputTypes`, allows you to specify the output data format as either `json` or `csv`.
- The second possible flag, `folderPath`, allows you to specify the folder path where you want to save the search query result files.
#### Output Types
Specify the output data format currently `json` and `csv` are the only supported types
Use the `outputTypes` flag to specify the output data format for the search template query results. Currently, the only supported output types are `json` and `csv`.
Here is an example of a `template` command that specifies the `json` output type:
```shell
sail search query "name:a*" -indicies identities -outputTypes json
sail search template all-provisioning-events-90-days --outputTypes json
```
#### Folder Path
Specify the folder path to save the search results in
Use the `folderPath` flag to specify the folder path to save the search results in.
If you don't specify a `folderPath`, the results will save to a folder called "search_results", located within your current working directory.
Here is an example of a `template` command that specifies a `folderPath`:
```shell
sail search query "name:a*" -indicies identities -folderPath ./local/folder/path
sail search template all-provisioning-events-90-days --folderPath ./local/folder/path
```

View File

@@ -15,8 +15,8 @@ func newQueryCmd() *cobra.Command {
var folderPath string
cmd := &cobra.Command{
Use: "query",
Short: "Manually Search using a specific Query and Indicies",
Long: "\nRun a search query in IdentityNow using a specific Query and Indicies\n\n",
Short: "Manually search using a specific query and indices",
Long: "\nRun a search query in IdentityNow, using a specific query and indicies\n\n",
Example: "sail search query \"(type:provisioning AND created:[now-90d TO now])\" --indices events",
Aliases: []string{"que"},
Args: cobra.ExactArgs(1),
@@ -57,8 +57,8 @@ func newQueryCmd() *cobra.Command {
}
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(&sort, "sort", []string{}, "the sort value for the api call (displayName, +id...)")
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.MarkFlagRequired("indices")
return cmd

View File

@@ -8,8 +8,8 @@ import (
func NewSearchCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "search",
Short: "Perform Search operations in IdentityNow with a specific query or a template",
Long: "\nPerform Search operations in IdentityNow with a specific query or a template\n\n",
Short: "Perform search operations in IdentityNow, using a specific query or a template",
Long: "\nPerform search operations in IdentityNow, using a specific query or a template\n\n",
Example: "sail search",
Aliases: []string{"se"},
Args: cobra.MaximumNArgs(1),

View File

@@ -20,8 +20,8 @@ func newTemplateCmd() *cobra.Command {
var template string
cmd := &cobra.Command{
Use: "template",
Short: "Perform Search operations in IdentityNow using a predefined search template",
Long: "\nPerform Search operations in IdentityNow using a predefined search template\n\n",
Short: "Perform search operations in IdentityNow, using a predefined search template",
Long: "\nPerform search operations in IdentityNow, using a predefined search template\n\n",
Example: "sail search template",
Aliases: []string{"temp"},
Args: cobra.MaximumNArgs(1),

View File

@@ -12,7 +12,7 @@ import (
func PromptAuth() (string, error) {
items := []tui.Choice{
{Title: "PAT", Description: "Person Access Token - Single User PAT Configuration"},
{Title: "OAuth", Description: "OAuth2.0 Authentication - Sign in via the IdentityNow Web Portal"},
{Title: "OAuth", Description: "OAuth2.0 Authentication - Sign in via the IdentityNow web portal"},
}
choice, err := tui.PromptList(items, "Choose an authentication method to configure")

View File

@@ -11,8 +11,8 @@ import (
func newDebugCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "debug",
Short: "Enable or Disable Debug Mode for the CLI",
Long: "\nEnable or Disable Debug Mode for the CLI, Primarily used for troubleshooting.\n\n",
Short: "Enable or disable Debug Mode for the CLI",
Long: "\nEnable or disable Debug Mode for the CLI. Primarily used for troubleshooting.\n\n",
Example: "sail set debug disable | sail set debug enable | sail set debug true | sail set debug false",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
@@ -20,12 +20,12 @@ func newDebugCommand() *cobra.Command {
switch strings.ToLower(args[0]) {
case "enable", "true":
viper.Set("debug", true)
log.Info("Debug Enabled")
log.Info("Debug enabled")
case "disable", "false":
viper.Set("debug", false)
log.Info("Debug Disabled")
log.Info("Debug disabled")
default:
log.Error("Invalid Selection")
log.Error("Invalid selection")
}
return nil

View File

@@ -9,8 +9,8 @@ import (
func newExportTemplateCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "exportTemplates",
Short: "Set the custom SPConfig Export templates file path",
Long: "\nSet the custom SPConfig Export templates file path\n\n",
Short: "Set the custom SPConfig export templates file path",
Long: "\nSet the custom SPConfig export templates file path\n\n",
Example: "sail set export full/path/to/export/templates.json",
Aliases: []string{"export"},
Args: cobra.ExactArgs(1),
@@ -18,7 +18,7 @@ func newExportTemplateCommand() *cobra.Command {
filePath := args[0]
if filePath == "" {
log.Error("File Path Cannot Be Blank")
log.Error("File path cannot be blank")
}
config.SetCustomExportTemplatePath(filePath)

View File

@@ -13,8 +13,8 @@ func newPATCommand(term terminal.Terminal) *cobra.Command {
var err error
cmd := &cobra.Command{
Use: "pat",
Short: "Configure PAT Authentication for the currently active environment",
Long: "\nConfigure PAT Authentication for the CLI\n\nPrerequisites:\n\nCreate a Client ID and Client Secret\nhttps://developer.sailpoint.com/idn/api/authentication#personal-access-tokens",
Short: "Configure PAT authentication for the currently active environment",
Long: "\nConfigure PAT authentication for the CLI\n\nPrerequisites:\n\nCreate a client ID and client secret\nhttps://developer.sailpoint.com/idn/api/authentication#personal-access-tokens",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {

View File

@@ -9,8 +9,8 @@ import (
func newSearchTemplateCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "searchTemplates",
Short: "Set the custom IdentityNow Search templates file path",
Long: "\nSet the custom IdentityNow Search templates file path\n\n",
Short: "Set the custom IdentityNow search templates file path",
Long: "\nSet the custom IdentityNow search templates file path\n\n",
Example: "sail set search /path/to/search/templates.json",
Aliases: []string{"search"},
Args: cobra.ExactArgs(1),
@@ -18,7 +18,7 @@ func newSearchTemplateCommand() *cobra.Command {
filePath := args[0]
if filePath == "" {
log.Error("File Path Cannot Be Blank")
log.Error("File path cannot be blank")
}
config.SetCustomSearchTemplatePath(filePath)

View File

@@ -53,9 +53,9 @@ func newDownloadCommand() *cobra.Command {
},
}
cmd.Flags().StringArrayVarP(&importIDs, "import", "", []string{}, "specify the IDs of the import jobs to download results for")
cmd.Flags().StringArrayVarP(&exportIDs, "export", "", []string{}, "specify the IDs of the export jobs to download results for")
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "spconfig-exports", "folder path to save the search results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
cmd.Flags().StringArrayVarP(&importIDs, "import", "", []string{}, "Specify the IDs of the import jobs to download results for")
cmd.Flags().StringArrayVarP(&exportIDs, "export", "", []string{}, "Specify the IDs of the export jobs to download results for")
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "spconfig-exports", "Folder path to save the search results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
return cmd
}

View File

@@ -1,7 +1,7 @@
==Long==
# Download
Download the results of Import or Export jobs from IdentityNow
Download the results of import or export jobs from IdentityNow.
====

View File

@@ -30,7 +30,7 @@ func newExportCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "export",
Short: "Start an Export job in IdentityNow",
Short: "Start an export job in IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"exp"},
@@ -70,12 +70,12 @@ func newExportCommand() *cobra.Command {
},
}
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "spconfig-exports", "folder path to save the search results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
cmd.Flags().StringVarP(&description, "description", "", "", "optional description for the export job")
cmd.Flags().StringArrayVarP(&includeTypes, "include", "i", []string{}, "types to include in export job")
cmd.Flags().StringArrayVarP(&excludeTypes, "exclude", "e", []string{}, "types to exclude in export job")
cmd.Flags().StringVarP(&objectOptions, "objectOptions", "o", "", "options for the object types being exported")
cmd.Flags().BoolVarP(&wait, "wait", "w", false, "wait for the export job to finish, and download the results")
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "spconfig-exports", "Folder path to save the search results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
cmd.Flags().StringVarP(&description, "description", "", "", "Optional description for the export job")
cmd.Flags().StringArrayVarP(&includeTypes, "include", "i", []string{}, "Types to include in export job")
cmd.Flags().StringArrayVarP(&excludeTypes, "exclude", "e", []string{}, "Types to exclude in export job")
cmd.Flags().StringVarP(&objectOptions, "objectOptions", "o", "", "Options for the object types being exported")
cmd.Flags().BoolVarP(&wait, "wait", "w", false, "Wait for the export job to finish, and then download the results")
return cmd
}

View File

@@ -1,8 +1,8 @@
==Long==
# Export
Start an Export job in IdentityNow
Start an export job in IdentityNow.
Valid Types that can be included or excluded are:
You can include or exclude the following valid types:
- ACCESS_PROFILE
- ACCESS_REQUEST_CONFIG
- ATTR_SYNC_SOURCE_CONFIG

View File

@@ -18,8 +18,8 @@ func newImportCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "import",
Short: "Start an Import job in IdentityNow",
Long: "\nStart an Import job in IdentityNow\n\n",
Short: "Start an import job in IdentityNow",
Long: "\nStart an import job in IdentityNow\n\n",
Example: "sail spconfig import",
Aliases: []string{"imp"},
Args: cobra.NoArgs,
@@ -57,9 +57,9 @@ func newImportCommand() *cobra.Command {
},
}
cmd.Flags().StringVarP(&filePath, "filePath", "f", "", "the path to the file containing the import payload")
cmd.Flags().StringVarP(&folderPath, "folderPath", "p", "spconfig-imports", "folder path to save the import results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
cmd.Flags().BoolVarP(&wait, "wait", "w", false, "wait for the import job to finish, and download the results")
cmd.Flags().StringVarP(&filePath, "filePath", "f", "", "Path to the file containing the import payload")
cmd.Flags().StringVarP(&folderPath, "folderPath", "p", "spconfig-imports", "Folder path to save the import results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
cmd.Flags().BoolVarP(&wait, "wait", "w", false, "Wait for the import job to finish, and then download the results")
cmd.MarkFlagRequired("filepath")
return cmd

View File

@@ -1,6 +1,6 @@
==Long==
# SPConfig
Perform SP-Config operations in IdentityNow
Perform SP-Config operations in IdentityNow.
API References:
- https://developer.sailpoint.com/idn/api/beta/sp-config

View File

@@ -14,8 +14,8 @@ func newStatusCommand() *cobra.Command {
var importJobs []string
cmd := &cobra.Command{
Use: "status",
Short: "Get the Status of SPConfig jobs in IdentityNow",
Long: "\nGet the Status of SPConfig jobs in IdentityNow\n\n",
Short: "Get the status of SPConfig jobs in IdentityNow",
Long: "\nGet the status of SPConfig jobs in IdentityNow\n\n",
Example: "sail spconfig status --export 2b3b68f4-cfe7-43a6-8fb0-a518c6218111",
Aliases: []string{"stat"},
Args: cobra.NoArgs,

View File

@@ -28,7 +28,7 @@ func newTemplateCommand() *cobra.Command {
var wait bool
cmd := &cobra.Command{
Use: "template",
Short: "Begin an SPConfig Export task in IdentityNow using a template",
Short: "Begin an SPConfig export task in IdentityNow, using a template",
Long: help.Long,
Example: help.Example,
Aliases: []string{"temp"},
@@ -96,8 +96,8 @@ func newTemplateCommand() *cobra.Command {
},
}
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "spconfig-exports", "folder path to save the search results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
cmd.Flags().BoolVarP(&wait, "wait", "w", false, "wait for the export job to finish, and download the results")
cmd.Flags().StringVarP(&folderPath, "folderPath", "f", "spconfig-exports", "Folder path to save the search results in. If the directory doesn't exist, then it will be automatically created. (default is the current working directory)")
cmd.Flags().BoolVarP(&wait, "wait", "w", false, "Wait for the export job to finish, and then download the results")
return cmd
}

View File

@@ -2,7 +2,7 @@
# Template
Begin an SPConfig Export task in IdentityNow using a template
Begin an SPConfig export task in IdentityNow, using a template.
====

View File

@@ -20,8 +20,8 @@ func newCreateCommand() *cobra.Command {
var filepath string
cmd := &cobra.Command{
Use: "create",
Short: "Create an IdentityNow Transform from a file",
Long: "\nCreate an IdentityNow Transform from a file\n\n",
Short: "Create an IdentityNow transform from a file",
Long: "\nCreate an IdentityNow transform from a file\n\n",
Example: "sail transform c -f /path/to/transform.json\nsail transform c < /path/to/transform.json\necho /path/to/transform.json | sail transform c",
Aliases: []string{"c"},
Args: cobra.NoArgs,
@@ -49,7 +49,7 @@ func newCreateCommand() *cobra.Command {
log.Debug("Transform", "transform", transform)
if transform.GetName() == "" {
return fmt.Errorf("the transform must have a name")
return fmt.Errorf("The transform must have a name")
}
apiClient, err := config.InitAPIClient()

View File

@@ -12,8 +12,8 @@ import (
func newDeleteCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "delete",
Short: "Delete an IdentityNow Transform",
Long: "\nDelete an IdentityNow Transform\n\n",
Short: "Delete an IdentityNow transform",
Long: "\nDelete an IdentityNow transform\n\n",
Example: "sail transform delete 03d5187b-ab96-402c-b5a1-40b74285d77a",
Aliases: []string{"d"},
RunE: func(cmd *cobra.Command, args []string) error {

View File

@@ -18,8 +18,8 @@ func newDownloadCommand() *cobra.Command {
var destination string
cmd := &cobra.Command{
Use: "download",
Short: "Download all Transforms from IdentityNow",
Long: "\nDownload all Transforms from IdentityNow\n\n",
Short: "Download all transforms from IdentityNow",
Long: "\nDownload all transforms from IdentityNow\n\n",
Example: "sail transform download -d transform_files | sail transform dl",
Aliases: []string{"dl"},
Args: cobra.NoArgs,
@@ -50,7 +50,7 @@ func newDownloadCommand() *cobra.Command {
},
}
cmd.Flags().StringVarP(&destination, "destination", "d", "transform_files", "The path to the directory to save the files in (default current working directory). If the directory doesn't exist, then it will be automatically created.")
cmd.Flags().StringVarP(&destination, "destination", "d", "transform_files", "Path to the directory to save the files in (default current working directory). If the directory doesn't exist, then it will be automatically created.")
return cmd
}

View File

@@ -15,8 +15,8 @@ import (
func newListCommand() *cobra.Command {
return &cobra.Command{
Use: "list",
Short: "List all Transforms in IdentityNow",
Long: "\nList all Transforms in IdentityNow\n\n",
Short: "List all transforms in IdentityNow",
Long: "\nList all transforms in IdentityNow\n\n",
Example: "sail transform list | sail transform ls",
Aliases: []string{"ls"},
Args: cobra.NoArgs,

View File

@@ -22,8 +22,8 @@ var implicitInput bool
func newPreviewCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "preview",
Short: "Preview the effects of an IdentityNow Transform",
Long: "\nPreview the effects of an IdentityNow Transform\n\n",
Short: "Preview the effects of an IdentityNow transform",
Long: "\nPreview the effects of an IdentityNow transform\n\n",
Example: "sail transform preview -i 020523e172fb4448b0814643ae52ff32 -a lastname -n ToLower --implicit\nsail transform preview -i 020523e172fb4448b0814643ae52ff32 -a lastname -n ToUpper --implicit\nsail transform p -i 12a199b967b64ffe992ef4ecfd076728 -a lastname -f /path/to/transform.json\nsail transform p -i 12a199b967b64ffe992ef4ecfd076728 -a lastname -n ToLower --implicit",
Aliases: []string{"p"},
Args: cobra.NoArgs,
@@ -204,14 +204,14 @@ func newPreviewCommand() *cobra.Command {
},
}
cmd.Flags().StringP("identity-profile", "i", "", "The GUID of an identity profile (required)")
cmd.Flags().StringP("identity-profile", "i", "", "GUID of an identity profile (required)")
cmd.Flags().StringP("attribute", "a", "", "Attribute name (required)")
cmd.Flags().StringP("name", "n", "", "Transform name. Only needed if using implicit input. The transform must be uploaded to IDN first.")
cmd.Flags().BoolVar(&implicitInput, "implicit", false, "Use implicit input. Default is explicit input defined by the transform.")
cmd.Flags().String("preview-endpoint", previewEndpoint, "Override preview endpoint")
cmd.Flags().String("identity-profile-endpoint", identityProfileEndpoint, "Override identity profile endpoint")
cmd.Flags().String("user-endpoint", userEndpoint, "Override user endpoint")
cmd.Flags().StringP("file", "f", "", "The path to the transform file. Only needed if using explicit input.")
cmd.Flags().StringP("file", "f", "", "Path to the transform file. Only needed if using explicit input.")
cmd.MarkFlagRequired("identity-profile")
cmd.MarkFlagRequired("attribute")

View File

@@ -15,8 +15,8 @@ const (
func NewTransformCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "transform",
Short: "Manage Transforms in IdentityNow",
Long: "\nManage Transforms in IdentityNow\n\n",
Short: "Manage transforms in IdentityNow",
Long: "\nManage transforms in IdentityNow\n\n",
Example: "sail transform | sail tran",
Aliases: []string{"tran"},
Run: func(cmd *cobra.Command, args []string) {

View File

@@ -17,8 +17,8 @@ import (
func newUpdateCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "update",
Short: "Update a Transform in IdentityNow from a File",
Long: "\nUpdate a Transform in IdentityNow from a File\n\n",
Short: "Update a transform in IdentityNow from a file",
Long: "\nUpdate a transform in IdentityNow from a file\n\n",
Example: "sail transform update --file ./assets/demo_update.json\nsail transform u -f /path/to/transform.json\nsail transform u < /path/to/transform.json\necho /path/to/transform.json | sail transform u",
Aliases: []string{"u"},
Args: cobra.NoArgs,
@@ -69,7 +69,7 @@ func newUpdateCommand() *cobra.Command {
},
}
cmd.Flags().StringP("file", "f", "", "The path to the transform file")
cmd.Flags().StringP("file", "f", "", "Path to the transform file")
return cmd
}

View File

@@ -25,7 +25,7 @@ func newCollectCommand(term terminal.Terminal) *cobra.Command {
var config bool
cmd := &cobra.Command{
Use: "collect [-c | -l] [-o output] VA-Network-Address... [-p va-password]",
Short: "Collect files from a SailPoint Virtual Appliance",
Short: "Collect files from a SailPoint virtual appliance",
Long: help.Long,
Example: help.Example,
Args: cobra.MinimumNArgs(1),
@@ -90,10 +90,10 @@ func newCollectCommand(term terminal.Terminal) *cobra.Command {
},
}
cmd.Flags().StringVarP(&output, "output", "o", "", "The path to save the log files")
cmd.Flags().BoolVarP(&logs, "log", "l", false, "retrieve log files")
cmd.Flags().BoolVarP(&config, "config", "c", false, "retrieve config files")
cmd.Flags().StringArrayVarP(&credentials, "passwords", "p", []string{}, "passwords for the servers in the same order that the servers are listed as arguments")
cmd.Flags().StringVarP(&output, "output", "o", "", "Path to save the log files")
cmd.Flags().BoolVarP(&logs, "log", "l", false, "Retrieve log files")
cmd.Flags().BoolVarP(&config, "config", "c", false, "Retrieve config files")
cmd.Flags().StringArrayVarP(&credentials, "passwords", "p", []string{}, "Passwords for the servers in the same order that the servers are listed as arguments")
cmd.MarkFlagsMutuallyExclusive("config", "log")

View File

@@ -1,9 +1,9 @@
==Long==
# Collect
Collect files from a remote Virtual Appliance
Collect files from a remote virtual appliance.
Files are collected over SFTP. Passwords are provided via the --password (-p) flag or they will be prompted for at runtime. Server addresses can be DNS names or IP addresses, and are provided as arguments separated by spaces.
Files are collected over SFTP. Passwords are provided via the --password (-p) flag or they will be prompted for at runtime. Server addresses can be DNS names or IP addresses, and they're provided as arguments, separated by spaces.
Log Files:
```bash

View File

@@ -20,7 +20,7 @@ func newGetCommand() *cobra.Command {
help := util.ParseHelp(getHelp)
cmd := &cobra.Command{
Use: "get",
Short: "Get a Virtual Appliance configuration from IdentityNow",
Short: "Get a virtual appliance configuration from IdentityNow",
Long: help.Long,
Example: help.Example,
RunE: func(cmd *cobra.Command, args []string) error {

View File

@@ -2,7 +2,7 @@
# Get
Get a Virtual Appliance configuration from IdentityNow
Get a virtual appliance configuration from IdentityNow.
====

View File

@@ -20,7 +20,7 @@ func newListCommand() *cobra.Command {
help := util.ParseHelp(listHelp)
cmd := &cobra.Command{
Use: "list",
Short: "List the Virtual Appliances configured in IdentityNow",
Short: "List the virtual appliances configured in IdentityNow",
Long: help.Long,
Example: help.Example,
Args: cobra.NoArgs,

View File

@@ -2,7 +2,7 @@
# List
List the Clusters and Virtual Appliances in the configured IdentityNow tenant
List the clusters and virtual appliances in the configured IdentityNow tenant.
====

View File

@@ -329,7 +329,7 @@ func newParseCommand() *cobra.Command {
var all bool
cmd := &cobra.Command{
Use: "parse",
Short: "Parse Log Files from SailPoint Virtual Appliances",
Short: "Parse log files from SailPoint virtual appliances",
Long: help.Long,
Example: help.Example,
Args: cobra.MinimumNArgs(1),
@@ -345,7 +345,7 @@ func newParseCommand() *cobra.Command {
mpb.WithRefreshRate(180*time.Millisecond),
)
log.Info("Parsing Log Files", "files", args)
log.Info("Parsing log files", "files", args)
log.SetOutput(p)
for _, filepath := range args {
@@ -382,7 +382,7 @@ func newParseCommand() *cobra.Command {
}
cmd.Flags().StringVarP(&fileType, "type", "t", "", "Specifies the log type to parse (ccg, canal)")
cmd.Flags().BoolVarP(&all, "all", "a", false, "Specifies all log traffic should be parsed, not just errors")
cmd.Flags().BoolVarP(&all, "all", "a", false, "Specifies that all log traffic should be parsed, not just errors")
return cmd
}

View File

@@ -1,7 +1,7 @@
==Long==
# Parse
Parse Log Files from SailPoint Virtual Appliances
Parse log files from SailPoint virtual appliances.
====
==Example==

View File

@@ -20,8 +20,8 @@ func NewTroubleshootCmd(term terminal.Terminal) *cobra.Command {
var output string
cmd := &cobra.Command{
Use: "troubleshoot",
Short: "Perform Troubleshooting Operations against a Virtual Appliance",
Long: "\nPerform Troubleshooting Operations against a Virtual Appliance\n\n",
Short: "Perform troubleshooting operations against a virtual appliance",
Long: "\nPerform troubleshooting operations against a virtual appliance\n\n",
Example: "sail va troubleshoot 10.10.10.10",
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
@@ -71,8 +71,8 @@ func NewTroubleshootCmd(term terminal.Terminal) *cobra.Command {
}}
cmd.Flags().StringP("endpoint", "e", "", "The host to troubleshoot")
cmd.Flags().StringVarP(&output, "output", "o", "", "The path to save the log file")
cmd.Flags().StringP("endpoint", "e", "", "Host to troubleshoot")
cmd.Flags().StringVarP(&output, "output", "o", "", "Path to save the log file")
return cmd

View File

@@ -0,0 +1,12 @@
==Long==
# Troubleshoot
Perform troubleshooting operations against a virtual appliance.
====
==Example==
```bash
sail va troubleshoot 10.10.10.10
```
====

View File

@@ -10,18 +10,18 @@ import (
)
func updateAndRebootVA(endpoint, password string) {
log.Info("Attempting to Update", "VA", endpoint)
log.Info("Attempting to update", "VA", endpoint)
update, updateErr := va.RunVACmd(endpoint, password, UpdateCommand)
if updateErr != nil {
log.Error("Problem Updating", "VA", endpoint, "err", updateErr, "resp", update)
log.Error("Problem updating", "VA", endpoint, "err", updateErr, "resp", update)
} else {
log.Info("Virtual Appliance Updating", "VA", endpoint)
log.Info("Virtual appliance updating", "VA", endpoint)
reboot, rebootErr := va.RunVACmd(endpoint, password, RebootCommand)
if rebootErr != nil && rebootErr.Error() != "wait: remote command exited without exit status or exit signal" {
log.Error("Problem Rebooting", "Server", endpoint, "err", rebootErr, "resp", reboot)
log.Error("Problem rebooting", "Server", endpoint, "err", rebootErr, "resp", reboot)
} else {
log.Info("Virtual Appliance Rebooting", "VA", endpoint)
log.Info("Virtual appliance rebooting", "VA", endpoint)
}
}
@@ -32,8 +32,8 @@ func newUpdateCommand(term terminal.Terminal) *cobra.Command {
var credentials []string
cmd := &cobra.Command{
Use: "update",
Short: "Perform Update Operations on a SailPoint Virtual Appliance",
Long: "\nPerform Update Operations on a SailPoint Virtual Appliance\n\n",
Short: "Perform update operations on a SailPoint virtual appliance",
Long: "\nPerform update operations on a SailPoint virtual appliance\n\n",
Example: "sail va update 10.10.10.10 10.10.10.11 -c S@ilp0int -c S@ilp0int",
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
@@ -45,7 +45,7 @@ func newUpdateCommand(term terminal.Terminal) *cobra.Command {
}
if password == "" {
password, _ = term.PromptPassword("Enter Password for " + endpoint + ":")
password, _ = term.PromptPassword("Enter password for " + endpoint + ":")
}
updateAndRebootVA(endpoint, password)
@@ -54,7 +54,7 @@ func newUpdateCommand(term terminal.Terminal) *cobra.Command {
},
}
cmd.Flags().StringArrayVarP(&credentials, "Passwords", "p", []string{}, "You can enter the Passwords for the servers in the same order that the servers are listed as arguments")
cmd.Flags().StringArrayVarP(&credentials, "Passwords", "p", []string{}, "You can enter the passwords for the servers in the same order that the servers are listed as arguments")
return cmd
}

View File

@@ -1,7 +1,7 @@
==Long==
# Update
Update a SailPoint Virtual Appliance
Update a SailPoint virtual appliance.
====
==Example==

View File

@@ -16,7 +16,7 @@ func NewVACommand(term terminal.Terminal) *cobra.Command {
help := util.ParseHelp(vaHelp)
cmd := &cobra.Command{
Use: "va",
Short: "Manage SailPoint Virtual Appliances",
Short: "Manage SailPoint virtual appliances",
Long: help.Long,
Example: help.Example,
Run: func(cmd *cobra.Command, args []string) {

View File

@@ -1,7 +1,7 @@
==Long==
# VA
Manage Virtual Appliances in IdentityNow
Manage virtual appliances in IdentityNow.
====

View File

@@ -24,7 +24,7 @@ func newCreateCommand() *cobra.Command {
var directory bool
cmd := &cobra.Command{
Use: "create [-f file1 file2 ... | -d workflowDirectory ]",
Short: "Create Workflows in IdentityNow",
Short: "Create workflows in IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"cr"},
@@ -112,8 +112,8 @@ func newCreateCommand() *cobra.Command {
},
}
cmd.Flags().BoolVarP(&file, "file", "f", false, "specifies that workflow file paths are provided as arguments to be created")
cmd.Flags().BoolVarP(&directory, "directory", "d", false, "specifies that a directory of workflows is provided to be created")
cmd.Flags().BoolVarP(&file, "file", "f", false, "Specifies that workflow file paths are provided as arguments to be created")
cmd.Flags().BoolVarP(&directory, "directory", "d", false, "Specifies that a directory of workflows is provided to be created")
cmd.MarkFlagsMutuallyExclusive("file", "directory")
return cmd

View File

@@ -1,6 +1,6 @@
==Long==
# Create
Create Workflows in IdentityNow
Create workflows in IdentityNow
## API References:
- https://developer.sailpoint.com/idn/api/beta/create-workflow
@@ -9,7 +9,7 @@ Create Workflows in IdentityNow
==Example==
## File Paths:
**Note:** File paths are relative to the current working directory, and only one workflow is allowed per file path. Multiple Workflows can be provided by specifying multiple file paths as arguments.
**Note:** File paths are relative to the current working directory, and only one workflow is allowed per file path. Multiple workflows can be provided by specifying multiple file paths as arguments.
```bash
sail workflow create -f {file-path}

View File

@@ -19,7 +19,7 @@ func newDeleteCommand() *cobra.Command {
help := util.ParseHelp(deleteHelp)
cmd := &cobra.Command{
Use: "delete workflowID... ",
Short: "Delete a Workflow in IdentityNow",
Short: "Delete a workflow in IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"del"},

View File

@@ -1,6 +1,6 @@
==Long==
# Delete
Delete a workflow in IdentityNow
Delete a workflow in IdentityNow.
## API References:
- https://developer.sailpoint.com/idn/api/beta/delete-workflow

View File

@@ -22,7 +22,7 @@ func newDownloadCommand() *cobra.Command {
var folderPath string
cmd := &cobra.Command{
Use: "download",
Short: "Download Workflows from IdentityNow",
Short: "Download workflows from IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"down"},

View File

@@ -1,6 +1,6 @@
==Long==
# Download
Downloads all Workflows from IdentityNow
Downloads all workflows from IdentityNow.
## API References:
- https://developer.sailpoint.com/idn/api/beta/list-workflows

View File

@@ -20,7 +20,7 @@ func newGetCommand() *cobra.Command {
help := util.ParseHelp(getHelp)
cmd := &cobra.Command{
Use: "get",
Short: "Get Workflows in IdentityNow",
Short: "Get workflows in IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"g"},

View File

@@ -19,7 +19,7 @@ func newListCommand() *cobra.Command {
help := util.ParseHelp(listHelp)
cmd := &cobra.Command{
Use: "list",
Short: "List all Workflows in IdentityNow",
Short: "List all workflows in IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"ls"},

View File

@@ -23,7 +23,7 @@ func newUpdateCommand() *cobra.Command {
var directory bool
cmd := &cobra.Command{
Use: "update",
Short: "Update a Workflow in IdentityNow",
Short: "Update a workflow in IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"up"},

View File

@@ -1,7 +1,7 @@
==Long==
# Update
Update a Workflow in IdentityNow
Update a workflow in IdentityNow.
Arguments can be a list of directories or files.
If a directory is specified, all JSON files in the directory will be parsed and the workflows uploaded.

View File

@@ -15,7 +15,7 @@ func NewWorkflowCommand() *cobra.Command {
help := util.ParseHelp(workflowHelp)
cmd := &cobra.Command{
Use: "workflow",
Short: "Manage Workflows in IdentityNow",
Short: "Manage workflows in IdentityNow",
Long: help.Long,
Example: help.Example,
Aliases: []string{"work"},

View File

@@ -2,7 +2,7 @@
# Workflows
Manage Workflows in IdentityNow
Manage workflows in IdentityNow.
====