|
@@ -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
|
|
|
|
|
+}
|