diff options
author | Tom Fawssett <tom.fawssett@gmail.com> | 2017-06-24 16:01:41 +0100 |
---|---|---|
committer | Tom Fawssett <tom.fawssett@gmail.com> | 2017-06-24 16:01:41 +0100 |
commit | 0a1d7d9cd8ad1ac01c8fcd4d3b4fef57cffd4cb0 (patch) | |
tree | 8b7df0eddd9493426d5830d428775ff8599cb18b /system/search/backup.go | |
parent | 30dea40a20e45bdb0d32fd7c373f07e1dccbe794 (diff) |
Add Backup function to search
Diffstat (limited to 'system/search/backup.go')
-rw-r--r-- | system/search/backup.go | 57 |
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 +} |