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  }