X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=main.go;h=0dd00294634b1759fa9bc8a59bfeeea79cffd39e;hb=22695332931698776b4075451435025377bdb3d1;hp=3b2dba8eac16e385fcebe8e4b9ab6f8e353dbe8d;hpb=fe8a936176c220bcd4c499ac421136fb586675b8;p=nsscash%2Fnsscash.git diff --git a/main.go b/main.go index 3b2dba8..0dd0029 100644 --- a/main.go +++ b/main.go @@ -18,8 +18,10 @@ package main import ( + "bytes" "flag" "fmt" + "io/ioutil" "log" "os" ) @@ -28,6 +30,7 @@ func main() { flag.Usage = func() { fmt.Fprintf(os.Stderr, "usage: %[1]s [options] fetch \n"+ + "usage: %[1]s [options] convert \n"+ "", os.Args[0]) flag.PrintDefaults() @@ -46,28 +49,101 @@ func main() { break } - cfg, err := LoadConfig(args[1]) - if err != nil { - log.Fatal(err) - } - state, err := LoadState(cfg.StatePath) - if err != nil { - log.Fatal(err) - } - - err = handleFiles(cfg, state) - if err != nil { - log.Fatal(err) - } + err := mainFetch(args[1]) + if err != nil { + log.Fatal(err) + } + return - err = WriteStateIfChanged(cfg.StatePath, state) - if err != nil { - log.Fatal(err) - } + case "convert": + if len(args) != 4 { + break + } + err := mainConvert(args[1], args[2], args[3]) + if err != nil { + log.Fatal(err) + } return } flag.Usage() os.Exit(1) } + +func mainFetch(cfgPath string) error { + cfg, err := LoadConfig(cfgPath) + if err != nil { + return err + } + state, err := LoadState(cfg.StatePath) + if err != nil { + return err + } + err = handleFiles(cfg, state) + if err != nil { + return err + } + // NOTE: Make sure to call WriteState() only if there were no + // errors (see WriteState() and README) + err = WriteState(cfg.StatePath, state) + if err != nil { + return err + } + return nil +} + +func mainConvert(typ, srcPath, dstPath string) error { + var t FileType + err := t.UnmarshalText([]byte(typ)) + if err != nil { + return err + } + + src, err := ioutil.ReadFile(srcPath) + if err != nil { + return err + } + var x bytes.Buffer + if t == FileTypePlain { + x.Write(src) + } else if t == FileTypePasswd { + pws, err := ParsePasswds(bytes.NewReader(src)) + if err != nil { + return err + } + err = SerializePasswds(&x, pws) + if err != nil { + return err + } + } else if t == FileTypeGroup { + grs, err := ParseGroups(bytes.NewReader(src)) + if err != nil { + return err + } + err = SerializeGroups(&x, grs) + if err != nil { + return err + } + } else { + return fmt.Errorf("unsupported file type %v", t) + } + + // We must create the file first or deployFile() will abort + f, err := os.Create(dstPath) + if err != nil { + return err + } + f.Close() + + err = deployFile(&File{ + Type: t, + Url: srcPath, + Path: dstPath, + body: x.Bytes(), + }) + if err != nil { + return err + } + return nil +}