diff --git a/.changes/unreleased/Feature-20241112-102508.yaml b/.changes/unreleased/Feature-20241112-102508.yaml new file mode 100644 index 00000000..369f3333 --- /dev/null +++ b/.changes/unreleased/Feature-20241112-102508.yaml @@ -0,0 +1,3 @@ +kind: Feature +body: Added count flag for services list. Added user delete on import csv +time: 2024-11-12T10:25:08.084783-05:00 diff --git a/src/cmd/service.go b/src/cmd/service.go index 233370d2..2f3c4c79 100644 --- a/src/cmd/service.go +++ b/src/cmd/service.go @@ -92,6 +92,10 @@ var listServiceCmd = &cobra.Command{ client := getClientGQL() resp, err := client.ListServices(nil) cobra.CheckErr(err) + if ok, _ := cmd.Flags().GetBool("count"); ok { + fmt.Println(len(resp.Nodes)) + return + } for _, service := range resp.Nodes { if !isJsonOutput() { list = append(list, service) @@ -249,6 +253,7 @@ func init() { listServiceCmd.PersistentFlags().Bool("dependencies", false, "Include dependencies of each service") listServiceCmd.PersistentFlags().Bool("dependents", false, "Include dependents of each service") listServiceCmd.PersistentFlags().Bool("properties", false, "Include properties of each service") + listServiceCmd.PersistentFlags().Bool("count", false, "Print the service count") importCmd.AddCommand(importServicesCmd) } diff --git a/src/cmd/user.go b/src/cmd/user.go index 452135d6..9a2c39f7 100644 --- a/src/cmd/user.go +++ b/src/cmd/user.go @@ -215,6 +215,41 @@ EOF }, } +var bulkDeleteUsersCmd = &cobra.Command{ + Use: "delete users", + Aliases: []string{"bulk delete users"}, + Short: "Deletes users from a CSV", + Long: `Deletes a list of users from a CSV file with the column headers: +Email`, + Example: ` +cat << EOF | opslevel import delete users -f - +Email +kyle@opslevel.com +toms@opslevel.com +ian@opslevel.com +EOF +`, + Run: func(cmd *cobra.Command, args []string) { + reader, err := readImportFilepathAsCSV() + cobra.CheckErr(err) + for reader.Rows() { + email := reader.Text("Email") + if email == "" { + log.Error().Msgf("user has invalid email '%s'", email) + continue + } else { + err := getClientGQL().DeleteUser(email) + if err != nil { + log.Error().Err(err).Msgf("error deleting user '%s'", email) + continue + } else { + log.Info().Msgf("deleted user '%s'", email) + } + } + } + }, +} + func init() { createUserCmd.Flags().Bool("skip-welcome-email", false, "If this flag is set the welcome e-mail will be skipped from being sent") listUserCmd.Flags().Bool("ignore-deactivated", false, "If this flag is set only return active users") @@ -226,4 +261,5 @@ func init() { listCmd.AddCommand(listUserCmd) deleteCmd.AddCommand(deleteUserCmd) importCmd.AddCommand(importUsersCmd) + importCmd.AddCommand(bulkDeleteUsersCmd) }