X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=main.go;h=a563b511355273983d0a0ea3060a288ad64e456d;hb=78239472f30846add39a4f14455cc92aba8ea79b;hp=cef6c61d41bfe9dfef0c8995ab25cf8b4762d7c9;hpb=01d938ad14224aa2c84f8814ab955bb99f6f5b34;p=nsscash%2Fnsscash.git diff --git a/main.go b/main.go index cef6c61..a563b51 100644 --- a/main.go +++ b/main.go @@ -49,19 +49,7 @@ 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 = WriteStateIfChanged(cfg.StatePath, state) + err := mainFetch(args[1]) if err != nil { log.Fatal(err) } @@ -72,45 +60,90 @@ func main() { break } - var t FileType - err := t.UnmarshalText([]byte(args[1])) + err := mainConvert(args[1], args[2], args[3]) if err != nil { log.Fatal(err) } + return + } - src, err := ioutil.ReadFile(args[2]) - if err != nil { - log.Fatal(err) - } + 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 { - log.Fatal(err) + return err } - var x bytes.Buffer err = SerializePasswds(&x, pws) if err != nil { - log.Fatal(err) + return err } - - // We must create the file first or deployFile() will abort - f, err := os.Create(args[3]) + } else if t == FileTypeGroup { + grs, err := ParseGroups(bytes.NewReader(src)) if err != nil { - log.Fatal(err) + return err } - f.Close() - - err = deployFile(&File{ - Type: t, - Url: args[2], - Path: args[3], - body: x.Bytes(), - }) + err = SerializeGroups(&x, grs) if err != nil { - log.Fatal(err) + return err } - return + } else { + return fmt.Errorf("unsupported file type %v", t) } - flag.Usage() - os.Exit(1) + // 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 }