summaryrefslogtreecommitdiff
path: root/system/search/backup.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-06-26 16:34:19 -0700
committerSteve Manuel <nilslice@gmail.com>2017-06-26 16:34:19 -0700
commit629725aa84c8c0cf66eb1683107aabd6e20928eb (patch)
treef434af0cca05efedb7aeb8c9c874d58ef39eb859 /system/search/backup.go
parent9105d78ee74858d561f7a60e36f28ed994529452 (diff)
parent08bab226d6b998eb5cf87e4be1db45e89fb9f772 (diff)
Merge branch 'ponzu-dev' of https://github.com/ponzu-cms/ponzu into ponzu-dev
Diffstat (limited to 'system/search/backup.go')
-rw-r--r--system/search/backup.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/system/search/backup.go b/system/search/backup.go
new file mode 100644
index 0000000..9223636
--- /dev/null
+++ b/system/search/backup.go
@@ -0,0 +1,57 @@
+package search
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "net/http"
+ "os"
+ "path/filepath"
+ "time"
+
+ "github.com/ponzu-cms/ponzu/system/backup"
+)
+
+// Backup creates an archive of a project's search index and writes it
+// to the response as a download
+func Backup(ctx context.Context, res http.ResponseWriter) error {
+ ts := time.Now().Unix()
+ filename := fmt.Sprintf("search-%d.bak.tar.gz", ts)
+ tmp := os.TempDir()
+ bk := filepath.Join(tmp, filename)
+
+ // create search-{stamp}.bak.tar.gz
+ f, err := os.Create(bk)
+ if err != nil {
+ return err
+ }
+
+ backup.ArchiveFS(ctx, "search", f)
+
+ err = f.Close()
+ if err != nil {
+ return err
+ }
+
+ // write data to response
+ data, err := os.Open(bk)
+ if err != nil {
+ return err
+ }
+ defer data.Close()
+ defer os.Remove(bk)
+
+ disposition := `attachment; filename=%s`
+ info, err := data.Stat()
+ if err != nil {
+ return err
+ }
+
+ res.Header().Set("Content-Type", "application/octet-stream")
+ res.Header().Set("Content-Disposition", fmt.Sprintf(disposition, ts))
+ res.Header().Set("Content-Length", fmt.Sprintf("%d", info.Size()))
+
+ _, err = io.Copy(res, data)
+
+ return err
+}