github.com/bosssauce/ponzu@v0.11.1-0.20200102001432-9bc41b703131/system/search/backup.go (about) 1 package search 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "net/http" 8 "os" 9 "path/filepath" 10 "time" 11 12 "github.com/ponzu-cms/ponzu/system/cfg" 13 14 "github.com/ponzu-cms/ponzu/system/backup" 15 ) 16 17 // Backup creates an archive of a project's search index and writes it 18 // to the response as a download 19 func Backup(ctx context.Context, res http.ResponseWriter) error { 20 ts := time.Now().Unix() 21 filename := fmt.Sprintf("search-%d.bak.tar.gz", ts) 22 tmp := os.TempDir() 23 bk := filepath.Join(tmp, filename) 24 25 // create search-{stamp}.bak.tar.gz 26 f, err := os.Create(bk) 27 if err != nil { 28 return err 29 } 30 31 err = backup.ArchiveFS(ctx, cfg.SearchDir(), f) 32 if err != nil { 33 return err 34 } 35 36 err = f.Close() 37 if err != nil { 38 return err 39 } 40 41 // write data to response 42 data, err := os.Open(bk) 43 if err != nil { 44 return err 45 } 46 defer data.Close() 47 defer os.Remove(bk) 48 49 disposition := `attachment; filename=%s` 50 info, err := data.Stat() 51 if err != nil { 52 return err 53 } 54 55 res.Header().Set("Content-Type", "application/octet-stream") 56 res.Header().Set("Content-Disposition", fmt.Sprintf(disposition, ts)) 57 res.Header().Set("Content-Length", fmt.Sprintf("%d", info.Size())) 58 59 _, err = io.Copy(res, data) 60 61 return err 62 }