summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-01-24 10:22:32 -0800
committerSteve Manuel <nilslice@gmail.com>2017-01-24 10:22:32 -0800
commite32aca799bd2ef040d70c9af48c222b98d95acdb (patch)
tree61350d459fb5cbf044e878042c0239acb060c7da
parentb750e1e9f7fa16126e3e1a26ed43e1a43e78ce04 (diff)
adding backup support for analytics.db, system.db, and uploads dir
-rw-r--r--system/admin/upload/backup.go63
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
}