diff --git a/server/server.go b/server/server.go index 6aedb036..f44b61f1 100644 --- a/server/server.go +++ b/server/server.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "html/template" + "io" "io/ioutil" "net/http" "os" @@ -42,6 +43,30 @@ func preload(c *cli.Context) (err error) { return nil } +func moveFile(src, dst string) (err error) { + in, err := os.Open(src) + if err != nil { + return err + } + defer in.Close() + tmp, err := ioutil.TempFile(filepath.Dir(dst), "") + if err != nil { + return err + } + _, err = io.Copy(tmp, in) + if err != nil { + tmp.Close() + os.Remove(tmp.Name()) + return err + } + if err = tmp.Close(); err != nil { + os.Remove(tmp.Name()) + return err + } + defer os.Remove(src) + return os.Rename(tmp.Name(), dst) +} + func main() { app := cli.NewApp() app.Name = "reg-server" @@ -111,7 +136,7 @@ func main() { // create the initial index if err := createStaticIndex(r, staticDir, c.GlobalString("clair")); err != nil { - return err + return cli.NewExitError(fmt.Sprintf("Error creating index: %s", err.Error()), 1) } // parse the duration @@ -278,7 +303,7 @@ func createStaticIndex(r *registry.Registry, staticDir, clairURI string) error { index := filepath.Join(staticDir, "index.html") logrus.Infof("renaming the temporary file %s to %s", f.Name(), index) - if err := os.Rename(f.Name(), index); err != nil { + if err := moveFile(f.Name(), index); err != nil { return fmt.Errorf("renaming result from %s to %s failed: %v", f.Name(), index, err) } updating = false