summaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
authorTom Fawssett <tom.fawssett@gmail.com>2017-06-24 16:01:41 +0100
committerTom Fawssett <tom.fawssett@gmail.com>2017-06-24 16:01:41 +0100
commit0a1d7d9cd8ad1ac01c8fcd4d3b4fef57cffd4cb0 (patch)
tree8b7df0eddd9493426d5830d428775ff8599cb18b /system
parent30dea40a20e45bdb0d32fd7c373f07e1dccbe794 (diff)
Add Backup function to search
Diffstat (limited to 'system')
-rw-r--r--system/admin/handlers.go9
-rw-r--r--system/search/backup.go57
2 files changed, 66 insertions, 0 deletions
diff --git a/system/admin/handlers.go b/system/admin/handlers.go
index 3933d3d..aac9ec2 100644
--- a/system/admin/handlers.go
+++ b/system/admin/handlers.go
@@ -23,6 +23,7 @@ import (
"github.com/ponzu-cms/ponzu/system/api/analytics"
"github.com/ponzu-cms/ponzu/system/db"
"github.com/ponzu-cms/ponzu/system/item"
+ "github.com/ponzu-cms/ponzu/system/search"
"github.com/gorilla/schema"
emailer "github.com/nilslice/email"
@@ -224,6 +225,14 @@ func backupHandler(res http.ResponseWriter, req *http.Request) {
return
}
+ case "search":
+ err := search.Backup(ctx, res)
+ if err != nil {
+ log.Println("Failed to run backup on search:", err)
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
default:
res.WriteHeader(http.StatusBadRequest)
}
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
+}