123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- package main
-
- import (
- "bytes"
- "encoding/json"
- "io/ioutil"
- "os"
- "strings"
-
- "config"
- "git"
- "grafana"
-
- "github.com/sirupsen/logrus"
- gogit "gopkg.in/src-d/go-git.v4"
- )
-
-
- type diffVersion struct {
- oldVersion int
- newVersion int
- }
-
-
-
-
-
- func PullGrafanaAndCommit(client *grafana.Client, cfg *config.Config) error {
-
- repo, _, err := git.NewRepository(cfg.Git)
- if err != nil {
- return err
- }
-
- if err = repo.Sync(false); err != nil {
- return err
- }
-
- w, err := repo.Repo.Worktree()
- if err != nil {
- return err
- }
-
-
- logrus.Info("Getting dashboard URIs")
- uris, err := client.GetDashboardsURIs()
- if err != nil {
- return err
- }
-
- dv := make(map[string]diffVersion)
-
-
- logrus.Info("Getting local dashboard versions")
- dbVersions, err := getDashboardsVersions(cfg.Git.ClonePath)
- if err != nil {
- return err
- }
-
-
- for _, uri := range uris {
- logrus.WithFields(logrus.Fields{
- "uri": uri,
- }).Info("Retrieving dashboard")
-
-
- dashboard, err := client.GetDashboard(uri)
- if err != nil {
- return err
- }
-
- if len(cfg.Grafana.IgnorePrefix) > 0 {
- if strings.HasPrefix(dashboard.Slug, cfg.Grafana.IgnorePrefix) {
- logrus.WithFields(logrus.Fields{
- "uri": uri,
- "name": dashboard.Name,
- "prefix": cfg.Grafana.IgnorePrefix,
- }).Info("Dashboard name starts with specified prefix, skipping")
-
- continue
- }
- }
-
-
-
-
-
-
- version, ok := dbVersions[dashboard.Slug]
- if !ok || dashboard.Version > version {
- logrus.WithFields(logrus.Fields{
- "uri": uri,
- "name": dashboard.Name,
- "local_version": version,
- "new_version": dashboard.Version,
- }).Info("Grafana has a newer version, updating")
-
- if err = addDashboardChangesToRepo(
- dashboard, cfg.Git.ClonePath, w,
- ); err != nil {
- return err
- }
-
-
-
-
-
- dv[dashboard.Slug] = diffVersion{
- oldVersion: version,
- newVersion: dashboard.Version,
- }
- }
- }
-
- status, err := w.Status()
- if err != nil {
- return err
- }
-
-
- if !status.IsClean() {
- logrus.Info("Comitting changes")
-
- if err = commitNewVersions(dbVersions, dv, w, cfg); err != nil {
- return err
- }
- }
-
-
-
- if err = repo.Push(); err != nil {
- return err
- }
-
- return nil
- }
-
-
-
-
- func addDashboardChangesToRepo(
- dashboard *grafana.Dashboard, clonePath string, worktree *gogit.Worktree,
- ) error {
- slugExt := dashboard.Slug + ".json"
- if err := rewriteFile(clonePath+"/"+slugExt, dashboard.RawJSON); err != nil {
- return err
- }
-
- if _, err := worktree.Add(slugExt); err != nil {
- return err
- }
-
- return nil
- }
-
-
-
-
-
-
-
-
-
- func rewriteFile(filename string, content []byte) error {
- if err := os.Remove(filename); err != nil {
- pe, ok := err.(*os.PathError)
- if !ok || pe.Err.Error() != "no such file or directory" {
- return err
- }
- }
-
- indentedContent, err := indent(content)
- if err != nil {
- return err
- }
-
- return ioutil.WriteFile(filename, indentedContent, 0644)
- }
-
-
-
-
-
- func indent(srcJSON []byte) (indentedJSON []byte, err error) {
- buf := bytes.NewBuffer(nil)
- if err = json.Indent(buf, srcJSON, "", "\t"); err != nil {
- return
- }
-
- indentedJSON, err = ioutil.ReadAll(buf)
- return
- }
|