github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/cli/backup/users.go (about) 1 package backup 2 3 import ( 4 "context" 5 "github.com/bep/simplecobra" 6 "github.com/esnet/gdg/cli/support" 7 "github.com/esnet/gdg/internal/config" 8 "github.com/esnet/gdg/internal/service" 9 "github.com/jedib0t/go-pretty/v6/table" 10 "github.com/spf13/cobra" 11 "log/slog" 12 "strings" 13 ) 14 15 func newUsersCommand() simplecobra.Commander { 16 description := "Manage users" 17 return &support.SimpleCommand{ 18 NameP: "users", 19 Short: description, 20 Long: `Provides some utility to manage grafana users from the CLI. Please note, as the credentials cannot be imported, the export with generate a default password for any user not already present`, 21 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 22 cmd.Aliases = []string{"user", "u"} 23 cmd.PersistentFlags().StringP("authlabel", "", "", "filter by a given auth label") 24 }, 25 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 26 return cd.CobraCommand.Help() 27 }, 28 CommandsList: []simplecobra.Commander{ 29 newUsersListCmd(), 30 newUsersDownloadCmd(), 31 newUsersUploadCmd(), 32 newUsersClearCmd(), 33 }, 34 } 35 36 } 37 38 func newUsersListCmd() simplecobra.Commander { 39 description := "list users from grafana" 40 return &support.SimpleCommand{ 41 NameP: "list", 42 Short: description, 43 Long: description, 44 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 45 cmd.Aliases = []string{"l"} 46 }, 47 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 48 authLabel, _ := cd.CobraCommand.Flags().GetString("authlabel") 49 slog.Info("Listing users for context", "context", config.Config().GetGDGConfig().GetContext()) 50 rootCmd.TableObj.AppendHeader(table.Row{"id", "login", "name", "email", "admin", "disabled", "default Password", "authLabels"}) 51 users := rootCmd.GrafanaSvc().ListUsers(service.NewUserFilter(authLabel)) 52 if len(users) == 0 { 53 slog.Info("No users found") 54 } else { 55 cfg := config.Config().GetDefaultGrafanaConfig() 56 var defaultPassword = "Unknown" 57 for _, user := range users { 58 var labels string 59 if len(user.AuthLabels) > 0 { 60 labels = strings.Join(user.AuthLabels, ", ") 61 } 62 if !cfg.GetUserSettings().RandomPassword { 63 defaultPassword = cfg.GetUserSettings().GetPassword(user.Login) 64 } 65 rootCmd.TableObj.AppendRow(table.Row{user.ID, user.Login, user.Name, user.Email, user.IsAdmin, 66 user.IsDisabled, defaultPassword, labels}) 67 } 68 rootCmd.Render(cd.CobraCommand, users) 69 } 70 71 return nil 72 }, 73 } 74 } 75 func newUsersDownloadCmd() simplecobra.Commander { 76 description := "download users from grafana" 77 return &support.SimpleCommand{ 78 NameP: "download", 79 Short: description, 80 Long: description, 81 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 82 cmd.Aliases = []string{"d"} 83 }, 84 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 85 authLabel, _ := cd.CobraCommand.Flags().GetString("authlabel") 86 savedFiles := rootCmd.GrafanaSvc().DownloadUsers(service.NewUserFilter(authLabel)) 87 slog.Info("Importing Users for context", "context", config.Config().GetGDGConfig().GetContext()) 88 rootCmd.TableObj.AppendHeader(table.Row{"type", "filename"}) 89 if len(savedFiles) == 0 { 90 slog.Info("No users found") 91 } else { 92 for _, file := range savedFiles { 93 rootCmd.TableObj.AppendRow(table.Row{"user", file}) 94 } 95 rootCmd.Render(cd.CobraCommand, savedFiles) 96 } 97 return nil 98 }, 99 } 100 } 101 func newUsersUploadCmd() simplecobra.Commander { 102 description := "upload users to grafana" 103 return &support.SimpleCommand{ 104 NameP: "upload", 105 Short: description, 106 Long: description, 107 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 108 cmd.Aliases = []string{"u"} 109 }, 110 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 111 authLabel, _ := cd.CobraCommand.Flags().GetString("authlabel") 112 slog.Info("Uploading Users to context", "context", config.Config().GetGDGConfig().GetContext()) 113 savedFiles := rootCmd.GrafanaSvc().UploadUsers(service.NewUserFilter(authLabel)) 114 rootCmd.TableObj.AppendHeader(table.Row{"id", "login", "name", "email", "grafanaAdmin", "disabled", "default Password", "authLabels"}) 115 if len(savedFiles) == 0 { 116 slog.Info("No users found") 117 } else { 118 for _, user := range savedFiles { 119 var labels string 120 if len(user.AuthLabels) > 0 { 121 labels = strings.Join(user.AuthLabels, ", ") 122 } 123 rootCmd.TableObj.AppendRow(table.Row{user.ID, user.Login, user.Name, user.Email, 124 user.IsGrafanaAdmin, user.IsDisabled, user.Password, labels}) 125 } 126 rootCmd.Render(cd.CobraCommand, savedFiles) 127 } 128 return nil 129 }, 130 } 131 } 132 func newUsersClearCmd() simplecobra.Commander { 133 description := "delete all users" 134 return &support.SimpleCommand{ 135 NameP: "clear", 136 Short: description, 137 Long: description, 138 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 139 cmd.Aliases = []string{"c"} 140 }, 141 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 142 authLabel, _ := cd.CobraCommand.Flags().GetString("authlabel") 143 savedFiles := rootCmd.GrafanaSvc().DeleteAllUsers(service.NewUserFilter(authLabel)) 144 slog.Info("Delete Users for context", "context", config.Config().GetGDGConfig().GetContext()) 145 rootCmd.TableObj.AppendHeader(table.Row{"type", "filename"}) 146 if len(savedFiles) == 0 { 147 slog.Info("No users found") 148 } else { 149 for _, file := range savedFiles { 150 rootCmd.TableObj.AppendRow(table.Row{"user", file}) 151 } 152 rootCmd.Render(cd.CobraCommand, savedFiles) 153 } 154 return nil 155 }, 156 } 157 }