From d95c5e66745bb1ca5ddd1d3228d51f2dadcf4e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 29 Jan 2015 14:33:50 +0100 Subject: [PATCH] Basic import of json dashboards is working, needs more work to handle updates, and continous watching, #22 --- conf/grafana.ini | 26 ++++----- main.go | 5 +- pkg/cmd/import.go | 120 +++++++++++++++++++++++++++++++++++++++++ pkg/setting/setting.go | 2 - 4 files changed, 137 insertions(+), 16 deletions(-) create mode 100644 pkg/cmd/import.go diff --git a/conf/grafana.ini b/conf/grafana.ini index 74a180a2022..1fea6f41cc4 100644 --- a/conf/grafana.ini +++ b/conf/grafana.ini @@ -11,6 +11,18 @@ router_logging = false static_root_path = public enable_gzip = false +[database] +; Either "mysql", "postgres" or "sqlite3", it's your choice +type = sqlite3 +host = 127.0.0.1:3306 +name = grafana +user = root +password = +; For "postgres" only, either "disable", "require" or "verify-full" +ssl_mode = disable +; For "sqlite3" only +path = data/grafana.db + [session] ; Either "memory", "file", default is "memory" provider = file @@ -47,7 +59,7 @@ login_remember_days = 7 cookie_username = grafana_user cookie_remember_name = grafana_remember ; disable user signup / registration -disable_user_signup = false +; disable_user_signup = false, not implemented yet [account.single] ; Enable this feature to auto assign new users to a single account, suitable for NON multi tenant setups @@ -81,18 +93,6 @@ scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis auth_url = https://accounts.google.com/o/oauth2/auth token_url = https://accounts.google.com/o/oauth2/token -[database] -; Either "mysql", "postgres" or "sqlite3", it's your choice -type = sqlite3 -host = 127.0.0.1:3306 -name = grafana -user = root -password = -; For "postgres" only, either "disable", "require" or "verify-full" -ssl_mode = disable -; For "sqlite3" only -path = data/grafana.db - [log] root_path = ; Either "console", "file", "conn", "smtp" or "database", default is "console" diff --git a/main.go b/main.go index 042faf26e80..fa20bef4e6d 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "strconv" "github.com/torkelo/grafana-pro/pkg/cmd" + "github.com/torkelo/grafana-pro/pkg/log" "github.com/torkelo/grafana-pro/pkg/setting" "github.com/codegangsta/cli" @@ -30,7 +31,9 @@ func main() { app.Name = "Grafana Backend" app.Usage = "grafana web" app.Version = version - app.Commands = []cli.Command{cmd.CmdWeb} + app.Commands = []cli.Command{cmd.CmdWeb, cmd.CmdImportJson} app.Flags = append(app.Flags, []cli.Flag{}...) app.Run(os.Args) + + log.Close() } diff --git a/pkg/cmd/import.go b/pkg/cmd/import.go new file mode 100644 index 00000000000..9f26fb76b00 --- /dev/null +++ b/pkg/cmd/import.go @@ -0,0 +1,120 @@ +package cmd + +import ( + "encoding/json" + "os" + "path/filepath" + "strings" + + "github.com/codegangsta/cli" + "github.com/torkelo/grafana-pro/pkg/bus" + "github.com/torkelo/grafana-pro/pkg/log" + m "github.com/torkelo/grafana-pro/pkg/models" + "github.com/torkelo/grafana-pro/pkg/services/sqlstore" + "github.com/torkelo/grafana-pro/pkg/setting" +) + +var CmdImportJson = cli.Command{ + Name: "import-json", + Usage: "grafana import", + Description: "Starts Grafana import process", + Action: runImport, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "dir", + Usage: "path to folder containing json dashboards", + }, + cli.StringFlag{ + Name: "account", + Usage: "Account name to save dashboards under", + }, + cli.StringFlag{ + Name: "config", + Value: "grafana.ini", + Usage: "path to config file", + }, + }, +} + +func runImport(c *cli.Context) { + dir := c.String("dir") + if len(dir) == 0 { + log.Error(3, "Missing command flag --dir") + return + } + + file, err := os.Stat(dir) + if os.IsNotExist(err) { + log.Error(3, "Directory does not exist: %v", dir) + return + } + + if !file.IsDir() { + log.Error(3, "%v is not a directory", dir) + return + } + + accountName := c.String("account") + if len(accountName) == 0 { + log.Error(3, "Missing command flag --account") + return + } + + setting.NewConfigContext() + sqlstore.NewEngine() + sqlstore.EnsureAdminUser() + + accountQuery := m.GetAccountByNameQuery{Name: accountName} + if err := bus.Dispatch(&accountQuery); err != nil { + log.Error(3, "Failed to find account", err) + return + } + + accountId := accountQuery.Result.Id + + visitor := func(path string, f os.FileInfo, err error) error { + if err != nil { + return err + } + if f.IsDir() { + return nil + } + if strings.HasSuffix(f.Name(), ".json") { + if err := importDashboard(path, accountId); err != nil { + log.Error(3, "Failed to import dashboard file: %v, err: %v", path, err) + } + } + return nil + } + + if err := filepath.Walk(dir, visitor); err != nil { + log.Error(3, "failed to scan dir for json files: %v", err) + } +} + +func importDashboard(path string, accountId int64) error { + log.Info("Importing %v", path) + + reader, err := os.Open(path) + if err != nil { + return err + } + + dash := m.NewDashboard("temp") + jsonParser := json.NewDecoder(reader) + + if err := jsonParser.Decode(&dash.Data); err != nil { + return err + } + + cmd := m.SaveDashboardCommand{ + AccountId: accountId, + Dashboard: dash.Data, + } + + if err := bus.Dispatch(&cmd); err != nil { + return err + } + + return nil +} diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index fc866eb97f9..606887aba33 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -234,6 +234,4 @@ func readSessionConfig() { if SessionOptions.Provider == "file" { os.MkdirAll(path.Dir(SessionOptions.ProviderConfig), os.ModePerm) } - - log.Info("Session Service Enabled") }