diff options
author | Steve Manuel <nilslice@gmail.com> | 2017-01-24 10:22:32 -0800 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2017-01-24 10:22:32 -0800 |
commit | e32aca799bd2ef040d70c9af48c222b98d95acdb (patch) | |
tree | 61350d459fb5cbf044e878042c0239acb060c7da | |
parent | b750e1e9f7fa16126e3e1a26ed43e1a43e78ce04 (diff) |
adding backup support for analytics.db, system.db, and uploads dir
-rw-r--r-- | system/admin/upload/backup.go | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/system/admin/upload/backup.go b/system/admin/upload/backup.go index a666073..28b1b8e 100644 --- a/system/admin/upload/backup.go +++ b/system/admin/upload/backup.go @@ -17,51 +17,85 @@ func Backup(res http.ResponseWriter) error { ts := time.Now().Unix() filename := fmt.Sprintf("uploads-%d.bak.tar.gz", ts) tmp := os.TempDir() + backup := filepath.Join(tmp, filename) // create uploads-{stamp}.bak.tar.gz - f, err := os.Create(filepath.Join(tmp, filename)) + f, err := os.Create(backup) if err != nil { return err } - defer f.Close() // loop through directory and gzip files // add all to uploads.bak.tar.gz tarball gz := gzip.NewWriter(f) tarball := tar.NewWriter(gz) + err = filepath.Walk("uploads", func(path string, info os.FileInfo, err error) error { if err != nil { return err } - h := &tar.Header{ - Name: info.Name(), - Size: info.Size(), - Mode: int64(info.Mode()), - ModTime: info.ModTime(), - } - - err = tarball.WriteHeader(h) + hdr, err := tar.FileInfoHeader(info, "") if err != nil { return err } - src, err := os.Open(path) + hdr.Name = path + + err = tarball.WriteHeader(hdr) if err != nil { return err } - _, err = io.Copy(tarball, src) + if !info.IsDir() { + src, err := os.Open(path) + if err != nil { + return err + } + defer src.Close() + _, err = io.Copy(tarball, src) + if err != nil { + return err + } - return err + err = tarball.Flush() + if err != nil { + return err + } + + err = gz.Flush() + if err != nil { + return err + } + } + + return nil }) + if err != nil { + fmt.Println(err) + return err + } + + err = gz.Close() + if err != nil { + return err + } + err = tarball.Close() + if err != nil { + return err + } + err = f.Close() + if err != nil { + return err + } // write data to response - data, err := os.Open(filepath.Join(tmp, filename)) + data, err := os.Open(backup) if err != nil { return err } defer data.Close() + defer os.Remove(backup) disposition := `attachment; filename=%s` info, err := data.Stat() @@ -74,5 +108,6 @@ func Backup(res http.ResponseWriter) error { res.Header().Set("Content-Length", fmt.Sprintf("%d", info.Size())) _, err = io.Copy(res, data) + return err } |