// importCommandFunc imports data as either JSON, YAML or TOML. func importCommandFunc(c *cli.Context) { if len(c.Args()) == 0 { fatal("You need to specify directory") } dir := c.Args()[0] // Remove trailing slash. if dir != "/" { dir = strings.TrimRight(dir, "/") } infof("Using dir: %s", dir) if len(c.Args()) == 1 { fatal("You need to specify input file") } input := c.Args()[1] // Get data format. f, err := iodatafmt.Format(c.String("format")) if err != nil { fatal(err.Error()) } // Load configuration file. e := loadConfig(c) // New dir API. ki := newKeyAPI(e) importFunc(dir, input, f, c.Bool("replace"), c.Bool("yes"), e, c, ki) }
func printConfigCommandFunc(c *cli.Context) { // Load configuration file. e := loadConfig(c) // Get data format. f, err := iodatafmt.Format(c.String("format")) if err != nil { fatal(err.Error()) } iodatafmt.Print(e, f) }
func main() { // Get connection env variable. conn := common.GetEnv() // Options. version := flag.Bool("version", false, "Version") node := flag.String("node", "", "Etcd node") port := flag.String("port", "2379", "Etcd port") dir := flag.String("dir", "/", "Etcd directory") format := flag.String("format", "JSON", "Data serialization format YAML, TOML or JSON") output := flag.String("output", "", "Output file") flag.Parse() // Print version. if *version { fmt.Printf("etcd-export %s\n", common.Version) os.Exit(0) } // Validate input. if len(conn) < 1 && *node == "" { log.Fatalf("You need to specify Etcd host.") } // Get data format. f, err := iodatafmt.Format(*format) if err != nil { log.Fatal(err.Error()) } // Setup Etcd client. if *node != "" { conn = []string{fmt.Sprintf("http://%v:%v", *node, *port)} } client := etcd.NewClient(conn) // Export data. res, err := client.Get(*dir, true, true) if err != nil { log.Fatal(err.Error()) } m := etcdmap.Map(res.Node) // Write output. if *output != "" { iodatafmt.Write(*output, m, f) } else { iodatafmt.Print(m, f) } }
// editCommandFunc edit data as either JSON, YAML or TOML. func editCommandFunc(c *cli.Context) { if len(c.Args()) == 0 { fatal("You need to specify directory") } dir := c.Args()[0] // Remove trailing slash. if dir != "/" { dir = strings.TrimRight(dir, "/") } infof("Using dir: %s", dir) // Load configuration file. e := loadConfig(c) // New dir API. ki := newKeyAPI(e) sort := c.Bool("sort") // Get data format. f, err := iodatafmt.Format(c.String("format")) if err != nil { fatal(err.Error()) } // Temporary file append file type to support syntax highlighting tmpfile := c.String("tmp-file") + "." + strings.ToLower(c.String("format")) // Check if dir exists and is a directory. exists, err := dirExists(dir, c, ki) if err != nil { fatal(err.Error()) } if !exists { if askYesNo(fmt.Sprintf("Dir. doesn't exist: %s create it", dir)) { // Create dir. if _, err := ki.Set(context.TODO(), dir, "", &client.SetOptions{Dir: true}); err != nil { fatal(err.Error()) } exists = true } else { os.Exit(1) } } // If file exist's resume editing? if _, err := os.Stat(tmpfile); os.IsNotExist(err) { // Export to file. exportFunc(dir, sort, tmpfile, f, c, ki) } else { if !askYesNo(fmt.Sprintf("Temp. file already exist's resume editing")) { // Export to file. exportFunc(dir, sort, tmpfile, f, c, ki) } } // Get modified time stamp. before, err := os.Stat(tmpfile) if err != nil { fatal(err.Error()) } // Edit file. editFile(c.String("editor"), tmpfile) // Check modified time stamp. after, err := os.Stat(tmpfile) if err != nil { fatal(err.Error()) } // Import from file if it has changed. if before.ModTime() != after.ModTime() { importFunc(dir, tmpfile, f, c.Bool("replace"), c.Bool("yes"), e, c, ki) } else { fmt.Printf("File wasn't modified, skipping import\n") } // Unlink file. if err := os.Remove(tmpfile); err != nil { fatal(err.Error()) } }
func main() { // Get the FileInfo struct describing the standard input. fi, _ := os.Stdin.Stat() // Get connection env variable. conn := common.GetEnv() // Options. version := flag.Bool("version", false, "Version") force := flag.Bool("force", false, "Force delete without asking") delete := flag.Bool("delete", false, "Delete entry before import") node := flag.String("node", "", "Etcd node") port := flag.String("port", "2379", "Etcd port") dir := flag.String("dir", "", "Etcd directory") format := flag.String("format", "JSON", "Data serialization format YAML, TOML or JSON") input := flag.String("input", "", "Input file") flag.Parse() // Print version. if *version { fmt.Printf("etcd-import %s\n", common.Version) os.Exit(0) } // Validate input. if len(conn) < 1 && *node == "" { log.Fatalf("You need to specify Etcd host.") } if *dir == "" { log.Fatalf("You need to specify Etcd dir.") } // Get data format. f, err := iodatafmt.Format(*format) if err != nil { log.Fatal(err.Error()) } // Setup Etcd client. if *node != "" { conn = []string{fmt.Sprintf("http://%v:%v", *node, *port)} } client := etcd.NewClient(conn) // Import data. var m interface{} if (fi.Mode() & os.ModeCharDevice) == 0 { b, _ := ioutil.ReadAll(os.Stdin) var err error m, err = iodatafmt.Unmarshal(b, f) if err != nil { log.Fatal(err.Error()) } } else if *input != "" { var err error m, err = iodatafmt.Load(*input, f) if err != nil { log.Fatal(err.Error()) } } else { log.Fatal("No input provided") } if *delete { if !*force { fmt.Printf("Remove path: %s? [yes|no]", strings.TrimRight(*dir, "/")) var query string fmt.Scanln(&query) if query != "yes" { os.Exit(0) } } if _, err := client.Delete(strings.TrimRight(*dir, "/"), true); err != nil { log.Fatalf(err.Error()) } log.Printf("Removed path: %s", strings.TrimRight(*dir, "/")) } if err = etcdmap.Create(client, strings.TrimRight(*dir, "/"), reflect.ValueOf(m)); err != nil { log.Fatal(err.Error()) } }