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 }