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 }