github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/cli/backup/dashboard_permissions.go (about)

     1  package backup
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"github.com/bep/simplecobra"
     7  	"github.com/esnet/gdg/cli/support"
     8  	"github.com/esnet/gdg/internal/config"
     9  	"github.com/esnet/gdg/internal/service"
    10  	"github.com/esnet/gdg/internal/tools"
    11  	"github.com/jedib0t/go-pretty/v6/table"
    12  	"log/slog"
    13  	"os"
    14  
    15  	"github.com/spf13/cobra"
    16  )
    17  
    18  func newDashboardPermissionCmd() simplecobra.Commander {
    19  	description := "Dashboard Permission"
    20  	return &support.SimpleCommand{
    21  		NameP: "permission",
    22  		Short: description,
    23  		Long:  description,
    24  		WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
    25  			cmd.Aliases = []string{"p", "permissions"}
    26  		},
    27  		CommandsList: []simplecobra.Commander{
    28  			newDashboardPermissionListCmd(),
    29  			newDashboardPermissionDownloadCmd(),
    30  			newDashboardPermissionUploadCmd(),
    31  			newDashboardPermissionClearCmd(),
    32  		},
    33  		RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error {
    34  			return cd.CobraCommand.Help()
    35  		},
    36  	}
    37  }
    38  
    39  // getConnectionTbWriter returns a table object for use with newConnectionsPermissionListCmd
    40  func getDashboardPermTblWriter() table.Writer {
    41  	writer := table.NewWriter()
    42  	writer.SetOutputMirror(os.Stdout)
    43  	writer.SetStyle(table.StyleLight)
    44  	writer.AppendHeader(table.Row{"id", "name", "slug", "type", "uid", "url"}, table.RowConfig{AutoMerge: true})
    45  	return writer
    46  }
    47  
    48  func newDashboardPermissionListCmd() simplecobra.Commander {
    49  	description := "List Dashboard Permissions"
    50  	return &support.SimpleCommand{
    51  		NameP: "list",
    52  		Short: description,
    53  		Long:  description,
    54  		WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
    55  			cmd.Aliases = []string{"l"}
    56  		},
    57  		RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error {
    58  			slog.Info("Listing Dashboard Permissions for context", "context", config.Config().GetGDGConfig().GetContext())
    59  			filters := service.NewDashboardFilter(parseDashboardGlobalFlags(cd.CobraCommand)...)
    60  			permissions, err := rootCmd.GrafanaSvc().ListDashboardPermissions(filters)
    61  			if err != nil {
    62  				slog.Error("Failed to retrieve Dashboard Permissions", "error", err)
    63  				os.Exit(1)
    64  			}
    65  
    66  			if len(permissions) == 0 {
    67  				slog.Info("No Dashboards found")
    68  			} else {
    69  				for _, perms := range permissions {
    70  					writer := getDashboardPermTblWriter()
    71  					urlValue := getDashboardUrl(perms.Dashboard)
    72  					link := perms.Dashboard
    73  					writer.AppendRow(table.Row{
    74  						link.ID, link.Title, link.Slug, link.FolderTitle,
    75  						link.UID, urlValue,
    76  					})
    77  					writer.Render()
    78  					if perms.Permissions != nil {
    79  						twConfigs := table.NewWriter()
    80  						twConfigs.SetOutputMirror(os.Stdout)
    81  						twConfigs.SetStyle(table.StyleColoredCyanWhiteOnBlack)
    82  						twConfigs.AppendHeader(table.Row{"Dashboard UID", "Dashboard Title", "UserId", "Team", "RoleName", "Permission"})
    83  						for _, dashPerm := range perms.Permissions {
    84  							twConfigs.AppendRow(table.Row{link.UID, link.Title, dashPerm.UserID, dashPerm.Team, dashPerm.Role, dashPerm.Permission})
    85  						}
    86  						if len(perms.Permissions) > 0 {
    87  
    88  							twConfigs.Render()
    89  						}
    90  					}
    91  				}
    92  			}
    93  			return nil
    94  		},
    95  	}
    96  }
    97  func newDashboardPermissionClearCmd() simplecobra.Commander {
    98  	description := "Clear Connection Permissions"
    99  	return &support.SimpleCommand{
   100  		NameP: "clear",
   101  		Short: description,
   102  		Long:  description,
   103  		WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
   104  			cmd.Aliases = []string{"c"}
   105  		},
   106  		RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error {
   107  			slog.Info("Clear all Dashboard permissions")
   108  			tools.GetUserConfirmation(fmt.Sprintf("WARNING: this will clear all permission from all Dashboards on: '%s' "+
   109  				"(Or all permission matching your filters).  Do you wish to continue (y/n) ", config.Config().GetGDGConfig().ContextName,
   110  			), "", true)
   111  			rootCmd.TableObj.AppendHeader(table.Row{"cleared Dashboard permissions"})
   112  			filters := service.NewDashboardFilter(parseDashboardGlobalFlags(cd.CobraCommand)...)
   113  			err := rootCmd.GrafanaSvc().ClearDashboardPermissions(filters)
   114  			if err != nil {
   115  				slog.Error("Failed to retrieve Dashboard Permissions", "error", err)
   116  			} else {
   117  				slog.Info("All dashboard permissions have been cleared")
   118  			}
   119  			return nil
   120  		},
   121  	}
   122  }
   123  
   124  func newDashboardPermissionDownloadCmd() simplecobra.Commander {
   125  	description := "Download Connection Permissions"
   126  	return &support.SimpleCommand{
   127  		NameP: "download",
   128  		Short: description,
   129  		Long:  description,
   130  		WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
   131  			cmd.Aliases = []string{"d"}
   132  		},
   133  		RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error {
   134  			slog.Info("Download Connections for context",
   135  				"context", config.Config().GetGDGConfig().GetContext())
   136  			rootCmd.TableObj.AppendHeader(table.Row{"filename"})
   137  			filters := service.NewDashboardFilter(parseDashboardGlobalFlags(cd.CobraCommand)...)
   138  			permissions, err := rootCmd.GrafanaSvc().DownloadDashboardPermissions(filters)
   139  			if err != nil {
   140  				slog.Error("Failed to retrieve Dashboard Permissions", "error", err)
   141  				os.Exit(1)
   142  			}
   143  			slog.Info("Downloading Dashboard permissions")
   144  
   145  			if len(permissions) == 0 {
   146  				slog.Info("No Dashboard permissions")
   147  			} else {
   148  				for _, perm := range permissions {
   149  					rootCmd.TableObj.AppendRow(table.Row{perm})
   150  				}
   151  				rootCmd.Render(cd.CobraCommand, permissions)
   152  			}
   153  			return nil
   154  		},
   155  	}
   156  }
   157  func newDashboardPermissionUploadCmd() simplecobra.Commander {
   158  	description := "Upload Connection Permissions"
   159  	return &support.SimpleCommand{
   160  		NameP: "upload",
   161  		Short: description,
   162  		Long:  description,
   163  		WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
   164  			cmd.Aliases = []string{"u"}
   165  		},
   166  		RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error {
   167  			slog.Info("Uploading dashboard permissions")
   168  			rootCmd.TableObj.AppendHeader(table.Row{"dashboard permission"})
   169  			filters := service.NewDashboardFilter(parseDashboardGlobalFlags(cd.CobraCommand)...)
   170  			permissions, err := rootCmd.GrafanaSvc().UploadDashboardPermissions(filters)
   171  			if err != nil {
   172  				slog.Error("Failed to retrieve Dashboard Permissions", "error", err)
   173  				os.Exit(1)
   174  			}
   175  
   176  			if len(permissions) == 0 {
   177  				slog.Info("No permissions found")
   178  			} else {
   179  				for _, perm := range permissions {
   180  					rootCmd.TableObj.AppendRow(table.Row{perm})
   181  				}
   182  				rootCmd.Render(cd.CobraCommand, permissions)
   183  			}
   184  			return nil
   185  		},
   186  	}
   187  }