summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--system/admin/upload/backup.go3
-rw-r--r--system/backup/archive.go21
-rw-r--r--system/search/backup.go5
3 files changed, 27 insertions, 2 deletions
diff --git a/system/admin/upload/backup.go b/system/admin/upload/backup.go
index 9dc9e31..d9bc4fb 100644
--- a/system/admin/upload/backup.go
+++ b/system/admin/upload/backup.go
@@ -27,6 +27,9 @@ func Backup(ctx context.Context, res http.ResponseWriter) error {
}
err = backup.ArchiveFS(ctx, "uploads", f)
+ if err != nil {
+ return err
+ }
err = f.Close()
if err != nil {
diff --git a/system/backup/archive.go b/system/backup/archive.go
index 0a8b964..c970abd 100644
--- a/system/backup/archive.go
+++ b/system/backup/archive.go
@@ -16,6 +16,25 @@ func ArchiveFS(ctx context.Context, basedir string, w io.Writer) error {
gz := gzip.NewWriter(w)
tarball := tar.NewWriter(gz)
+ absPath, err := filepath.Abs(basedir)
+ if err != nil {
+ return err
+ }
+
+ info, err := os.Lstat(absPath)
+ if err != nil {
+ return err
+ }
+
+ if info.Mode()&os.ModeSymlink == os.ModeSymlink {
+ // This is a symlink - we need to follow it
+ bdir, err := os.Readlink(absPath)
+ if err != nil {
+ return err
+ }
+ basedir = bdir
+ }
+
errChan := make(chan error, 1)
walkFn := func(path string, info os.FileInfo, err error) error {
if err != nil {
@@ -61,7 +80,7 @@ func ArchiveFS(ctx context.Context, basedir string, w io.Writer) error {
}
// stop processing if we get a cancellation signal
- err := filepath.Walk(basedir, func(path string, info os.FileInfo, err error) error {
+ err = filepath.Walk(basedir, func(path string, info os.FileInfo, err error) error {
go func() { errChan <- walkFn(path, info, err) }()
select {
diff --git a/system/search/backup.go b/system/search/backup.go
index 9223636..4017b15 100644
--- a/system/search/backup.go
+++ b/system/search/backup.go
@@ -26,7 +26,10 @@ func Backup(ctx context.Context, res http.ResponseWriter) error {
return err
}
- backup.ArchiveFS(ctx, "search", f)
+ err = backup.ArchiveFS(ctx, "search", f)
+ if err != nil {
+ return err
+ }
err = f.Close()
if err != nil {