Add configuration flags & env variables
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
0fb6e0b6e9
commit
52703cb28f
2 changed files with 51 additions and 26 deletions
43
cfg/cfg.go
43
cfg/cfg.go
|
@ -9,26 +9,47 @@ import (
|
||||||
|
|
||||||
type AppSettings struct {
|
type AppSettings struct {
|
||||||
GrafanaURL string
|
GrafanaURL string
|
||||||
Token string
|
GrafanaToken string
|
||||||
|
GitBranch string
|
||||||
|
GitRepoURL string
|
||||||
|
GitUser string
|
||||||
|
GitEmail string
|
||||||
|
GitPass string
|
||||||
|
GPGKey string
|
||||||
}
|
}
|
||||||
|
|
||||||
var cliStruct struct {
|
var cliStruct struct {
|
||||||
GrafanaURL string `name:"grafana-url" env:"GRAFANA_URL" help:"Grafana URL to access the API"`
|
GrafanaURL string `name:"grafana-url" env:"GRAFANA_URL" help:"Grafana URL to access the API"`
|
||||||
AuthToken string `name:"grafana-auth-token" env:"GRAFANA_AUTH_TOKEN" help:"Grafana auth token to access the API"`
|
GrafanaToken string `name:"grafana-auth-token" env:"GRAFANA_AUTH_TOKEN" help:"Grafana auth token to access the API"`
|
||||||
|
GitBranch string `name:"git-branch" env:"GIT_BRANCH" help:"Git branch name" default:"${default_git_branch}"`
|
||||||
|
GitRepoURL string `name:"git-repo-url" env:"GIT_REPO_URL" help:"Complete Git repository URL"`
|
||||||
|
GitUser string `name:"git-user" env:"GIT_USER" help:"Git username"`
|
||||||
|
GitEmail string `name:"git-email" env:"GIT_EMAIL" help:"Git email address"`
|
||||||
|
GitPass string `name:"git-pass" env:"GIT_PASS" help:"Git password"`
|
||||||
|
GPGKey string `name:"signing-key" env:"GIT_SIGNING_KEY" help:"GPG signing key"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Parse() *AppSettings {
|
func Parse() *AppSettings {
|
||||||
ctx := kong.Parse(
|
ctx := kong.Parse(
|
||||||
&cliStruct,
|
&cliStruct,
|
||||||
|
kong.Vars{
|
||||||
|
"default_git_branch": "main",
|
||||||
|
},
|
||||||
kong.Name("grafana-backuper"),
|
kong.Name("grafana-backuper"),
|
||||||
kong.Description("🚀 CLI tool to backup grafana dashboards"),
|
kong.Description("🚀 CLI tool to convert grafana dashboards to git"),
|
||||||
kong.UsageOnError(),
|
kong.UsageOnError(),
|
||||||
)
|
)
|
||||||
|
|
||||||
validateFlags(ctx)
|
validateFlags(ctx)
|
||||||
settings := &AppSettings{
|
settings := &AppSettings{
|
||||||
GrafanaURL: cliStruct.GrafanaURL,
|
GrafanaURL: cliStruct.GrafanaURL,
|
||||||
Token: cliStruct.AuthToken,
|
GrafanaToken: cliStruct.GrafanaToken,
|
||||||
|
GitBranch: cliStruct.GitBranch,
|
||||||
|
GitRepoURL: cliStruct.GitRepoURL,
|
||||||
|
GitUser: cliStruct.GitUser,
|
||||||
|
GitEmail: cliStruct.GitEmail,
|
||||||
|
GitPass: cliStruct.GitPass,
|
||||||
|
GPGKey: cliStruct.GPGKey,
|
||||||
}
|
}
|
||||||
return settings
|
return settings
|
||||||
}
|
}
|
||||||
|
@ -40,10 +61,22 @@ func validateFlags(cliCtx *kong.Context) {
|
||||||
messages = append(messages, "error: invalid grafana URL, must not be blank")
|
messages = append(messages, "error: invalid grafana URL, must not be blank")
|
||||||
flagsValid = false
|
flagsValid = false
|
||||||
}
|
}
|
||||||
if cliStruct.AuthToken == "" {
|
if cliStruct.GrafanaToken == "" {
|
||||||
messages = append(messages, "error: invalid auth token for grafana, must not be blank")
|
messages = append(messages, "error: invalid auth token for grafana, must not be blank")
|
||||||
flagsValid = false
|
flagsValid = false
|
||||||
}
|
}
|
||||||
|
if cliStruct.GitRepoURL == "" {
|
||||||
|
messages = append(messages, "error: invalid repo url for git, must not be blank")
|
||||||
|
flagsValid = false
|
||||||
|
}
|
||||||
|
if cliStruct.GitUser == "" {
|
||||||
|
messages = append(messages, "error: invalid username for git, must not be blank")
|
||||||
|
flagsValid = false
|
||||||
|
}
|
||||||
|
if cliStruct.GitPass == "" {
|
||||||
|
messages = append(messages, "error: invalid password for git, must not be blank")
|
||||||
|
flagsValid = false
|
||||||
|
}
|
||||||
if !flagsValid {
|
if !flagsValid {
|
||||||
cliCtx.PrintUsage(false)
|
cliCtx.PrintUsage(false)
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
|
|
28
main.go
28
main.go
|
@ -6,34 +6,26 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
|
"git.ar21.de/yolokube/grafana-backuper/cfg"
|
||||||
"git.ar21.de/yolokube/grafana-backuper/pkg/git"
|
"git.ar21.de/yolokube/grafana-backuper/pkg/git"
|
||||||
"git.ar21.de/yolokube/grafana-backuper/pkg/grafana"
|
"git.ar21.de/yolokube/grafana-backuper/pkg/grafana"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
grafanaURL = "https://grafana.services.yolokube.de"
|
|
||||||
grafanaAPIKey = ""
|
|
||||||
gitBranch = "main"
|
|
||||||
gitRepoURL = ""
|
|
||||||
gitUsername = ""
|
|
||||||
gitEmail = ""
|
|
||||||
gitPassword = ""
|
|
||||||
privateGPGKeyFile = ""
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
appSettings := cfg.Parse()
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
client, err := grafana.NewClient(grafanaURL, grafanaAPIKey, grafana.DefaultHTTPClient)
|
client, err := grafana.NewClient(appSettings.GrafanaURL, appSettings.GrafanaToken, grafana.DefaultHTTPClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error creating the grafana client: %v", err)
|
log.Fatalf("Error creating the grafana client: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gitdata := git.NewPayload(privateGPGKeyFile)
|
gitdata := git.NewPayload(appSettings.GPGKey)
|
||||||
if err = gitdata.GetRepo(gitRepoURL, gitUsername, gitPassword); err != nil {
|
if err = gitdata.GetRepo(appSettings.GitRepoURL, appSettings.GitUser, appSettings.GitPass); err != nil {
|
||||||
log.Fatalf("Error cloning git repo: %v", err)
|
log.Fatalf("Error cloning git repo: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gitdata.AddCommitter(gitUsername, gitEmail)
|
gitdata.AddCommitter(appSettings.GitUser, appSettings.GitEmail)
|
||||||
|
|
||||||
dashboards, err := client.SearchDashboards(ctx, "", false)
|
dashboards, err := client.SearchDashboards(ctx, "", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -60,7 +52,7 @@ func main() {
|
||||||
for _, version := range versions {
|
for _, version := range versions {
|
||||||
gitdata.UpdateVersion(version)
|
gitdata.UpdateVersion(version)
|
||||||
|
|
||||||
if gitdata.IsVersionCommitted(gitBranch) {
|
if gitdata.IsVersionCommitted(appSettings.GitBranch) {
|
||||||
fmt.Printf("%s/%s - %s: %s -> already committed\n", dashboardInfo.FolderTitle, dashboard.Title, version.CreatedBy, version.Message)
|
fmt.Printf("%s/%s - %s: %s -> already committed\n", dashboardInfo.FolderTitle, dashboard.Title, version.CreatedBy, version.Message)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -85,8 +77,8 @@ func main() {
|
||||||
log.Fatalf("Error creating commit for dashboard %s version %d: %v", dashboard.Title, info.Version, err)
|
log.Fatalf("Error creating commit for dashboard %s version %d: %v", dashboard.Title, info.Version, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = gitdata.PushToRemote(gitUsername, gitPassword); err != nil {
|
if err = gitdata.PushToRemote(appSettings.GitUser, appSettings.GitPass); err != nil {
|
||||||
log.Fatalf("Error pushing to remote repo %s: %v", gitRepoURL, err)
|
log.Fatalf("Error pushing to remote repo %s: %v", appSettings.GitRepoURL, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue