fix metadata generator
This commit is contained in:
parent
cb7f2dee54
commit
3e765a7943
4 changed files with 94 additions and 25 deletions
|
|
@ -3,15 +3,19 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"cachefs/pkg/provider"
|
||||
"cachefs/pkg/provider/parse"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
@ -176,7 +180,52 @@ func cp(args []string) (err error) {
|
|||
return
|
||||
}
|
||||
defer df.Close()
|
||||
_, err = io.Copy(df, sf)
|
||||
fi, err := sf.Stat()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
r := &progressReader{
|
||||
f: sf,
|
||||
done: make(chan struct{}),
|
||||
size: fi.Size(),
|
||||
}
|
||||
go r.PrintProgress()
|
||||
_, err = io.Copy(df, r)
|
||||
close(r.done)
|
||||
return
|
||||
}
|
||||
|
||||
type progressReader struct {
|
||||
f provider.File
|
||||
done chan struct{}
|
||||
size int64
|
||||
n int64
|
||||
}
|
||||
|
||||
func (p *progressReader) Read(b []byte) (n int, err error) {
|
||||
n, err = p.f.Read(b)
|
||||
atomic.AddInt64(&p.n, int64(n))
|
||||
return
|
||||
}
|
||||
|
||||
func (p *progressReader) ReadAt(b []byte, off int64) (n int, err error) {
|
||||
n, err = p.f.ReadAt(b, off)
|
||||
atomic.AddInt64(&p.n, int64(n))
|
||||
return
|
||||
}
|
||||
|
||||
func (p *progressReader) PrintProgress() {
|
||||
for {
|
||||
select {
|
||||
case <-p.done:
|
||||
fmt.Println()
|
||||
return
|
||||
case <-time.After(time.Millisecond * 500):
|
||||
}
|
||||
n := atomic.LoadInt64(&p.n)
|
||||
percent := int(math.Round(float64(n) / float64(p.size) * 100))
|
||||
fmt.Printf("progress: %d / %d %d%%\r", n, p.size, percent)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,32 +17,39 @@ var (
|
|||
|
||||
dst string
|
||||
metadata string
|
||||
fstat bool
|
||||
)
|
||||
|
||||
func fatal(err error) {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.StringVar(&dst, "dst", "", "url path to cache files (example: file:///mnt/cache)")
|
||||
flag.StringVar(&dst, "dst", "", "url path to cache files (example: file:///mnt/cache, uses DST_KEY)")
|
||||
flag.StringVar(&metadata, "data", "", "path to metadata file")
|
||||
flag.BoolVar(&fstat, "fstat", false, "use fstat to determine real file size for sparse files")
|
||||
flag.Parse()
|
||||
|
||||
var (
|
||||
dstk []byte
|
||||
err error
|
||||
dstk []byte
|
||||
err error
|
||||
encrypted bool
|
||||
)
|
||||
dstkey := os.Getenv("DST_KEY")
|
||||
if dstkey != "" {
|
||||
dstk, err = hex.DecodeString(dstkey)
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
if err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
encrypted = true
|
||||
}
|
||||
dstfs, err := parse.FS(dst, dstk, true)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
fatal(err)
|
||||
}
|
||||
err = fs.MetadataGenerator(metadata, dstfs)
|
||||
err = fs.MetadataGenerator(metadata, dstfs, fstat, encrypted)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
fatal(err)
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue