func importFunc(dir string, file string, f iodatafmt.DataFmt, replace bool, yes bool, e Etcdtool, c *cli.Context, ki client.KeysAPI) { // Check if dir exists and is a directory. exists, err := dirExists(dir, c, ki) if err != nil { fatalf("Specified dir doesn't exist: %s", dir) } if exists { exist, err := isDir(dir, c, ki) if err != nil { fatal(err.Error()) } if exist { fatalf("Specified dir is not a directory: %s", dir) } } // Load file. m, err := iodatafmt.Load(file, f) if err != nil { fatal(err.Error()) } // Validate data. if c.Bool("validate") { validateFunc(e, dir, m) } if exists { if replace { if !askYesNo(fmt.Sprintf("Do you want to overwrite data in directory: %s", dir)) { os.Exit(1) } // Delete dir. if _, err = ki.Delete(context.TODO(), dir, &client.DeleteOptions{Recursive: true}); err != nil { fatal(err.Error()) } } else { if !yes { if !askYesNo(fmt.Sprintf("Do you want to overwrite data in directory: %s", dir)) { os.Exit(1) } } } } else { // Create dir. if _, err := ki.Set(context.TODO(), dir, "", &client.SetOptions{Dir: true}); err != nil { fatal(err.Error()) } } // Import data. if err = etcdmap.Create(ki, dir, reflect.ValueOf(m)); 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()) } }