now writes xattrs! on to Check()...
This commit is contained in:
parent
59bf39aa6d
commit
87d134a877
137
main.go
137
main.go
@ -1,12 +1,15 @@
|
|||||||
|
//3456789112345676892123456789312345678941234567895123456789612345678971234567898
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
//import "crypto/sha256"
|
import "crypto/sha256"
|
||||||
import "fmt"
|
import "fmt"
|
||||||
import "github.com/sirupsen/logrus"
|
import "github.com/sirupsen/logrus"
|
||||||
|
import "github.com/multiformats/go-multihash"
|
||||||
//import "github.com/pkg/xattr"
|
import "github.com/mr-tron/base58"
|
||||||
import "hash"
|
import "github.com/pkg/xattr"
|
||||||
import "os"
|
import "os"
|
||||||
|
import "io"
|
||||||
import "flag"
|
import "flag"
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
@ -16,6 +19,16 @@ var Builduser string
|
|||||||
var Buildarch string
|
var Buildarch string
|
||||||
var log *logrus.Logger
|
var log *logrus.Logger
|
||||||
|
|
||||||
|
const namespacePrefix = "berlin.sneak.xsum"
|
||||||
|
|
||||||
|
//FIXME(sneak) make this parallelize to NUM_CPUS when processing multiple
|
||||||
|
//args
|
||||||
|
|
||||||
|
//FIXME(sneak) add a -r (recursive) flag for directories
|
||||||
|
|
||||||
|
//FIXME(sneak) make checking support reading hash algo type from multihash
|
||||||
|
//instead of assumming sha256
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
os.Exit(xsum())
|
os.Exit(xsum())
|
||||||
}
|
}
|
||||||
@ -40,11 +53,9 @@ func xsum() int {
|
|||||||
)
|
)
|
||||||
|
|
||||||
paths := flag.Args()
|
paths := flag.Args()
|
||||||
fmt.Printf("%+v\n", paths)
|
|
||||||
if len(paths) > 1 {
|
if len(paths) > 1 {
|
||||||
paths = paths[1:]
|
paths = paths[1:]
|
||||||
}
|
}
|
||||||
fmt.Printf("%+v\n", paths)
|
|
||||||
switch flag.Arg(0) {
|
switch flag.Arg(0) {
|
||||||
case "cron":
|
case "cron":
|
||||||
return xsfCheckAndUpdate(paths)
|
return xsfCheckAndUpdate(paths)
|
||||||
@ -67,20 +78,21 @@ func usage() {
|
|||||||
|
|
||||||
func xsfCheck(paths []string) int {
|
func xsfCheck(paths []string) int {
|
||||||
log.Debugf("check")
|
log.Debugf("check")
|
||||||
|
log.Fatalf("not implemented")
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func showError(e *error) {
|
func showError(e error) {
|
||||||
fmt.Fprintf(os.Stderr, "error: %s\n", e)
|
fmt.Fprintf(os.Stderr, "error: %s\n", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
func xsfUpdate(paths []string) int {
|
func xsfUpdate(paths []string) int {
|
||||||
log.Debugf("update")
|
log.Debugf("update")
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
x := NewXsf(path)
|
x := newXsf(path)
|
||||||
err := x.Update()
|
err := x.Update()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
showError(&err)
|
showError(err)
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -96,17 +108,89 @@ func xsfCheckAndUpdate(paths []string) int {
|
|||||||
return xsfUpdate(paths)
|
return xsfUpdate(paths)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func HashFile(fp *os.File) (string, error) {
|
||||||
|
h := sha256.New()
|
||||||
|
|
||||||
|
if _, err := io.Copy(h, fp); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
mHashBuf, err := multihash.EncodeName(h.Sum(nil), "sha1")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return base58.Encode(mHashBuf), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// type xsf
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
type xsf struct {
|
type xsf struct {
|
||||||
path string
|
|
||||||
mtime *time.Time
|
|
||||||
size int64
|
|
||||||
sum *hash.Hash
|
|
||||||
fi *os.FileInfo
|
fi *os.FileInfo
|
||||||
|
fp *os.File
|
||||||
|
hash string
|
||||||
|
mtime string
|
||||||
|
path string
|
||||||
|
size int64
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// constructor
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
type xsf struct {
|
||||||
|
fi *os.FileInfo
|
||||||
|
fp *os.File
|
||||||
|
hash string
|
||||||
|
mtime string
|
||||||
|
path string
|
||||||
|
size int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func newXsf(path string) *xsf {
|
||||||
|
x := xsf{}
|
||||||
|
x.path = path
|
||||||
|
return &x
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *xsf) writeXattrs(fp *os.File) error {
|
||||||
|
log.Infof("writing xattrs")
|
||||||
|
|
||||||
|
var xn string
|
||||||
|
var err error
|
||||||
|
|
||||||
|
xn = fmt.Sprintf("%s.%s", namespacePrefix, "mtime")
|
||||||
|
log.Infof("writing xattr %s=%s", xn, x.mtime)
|
||||||
|
err = xattr.FSet(fp, xn, []byte(x.mtime))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
xn = fmt.Sprintf("%s.%s", namespacePrefix, "size")
|
||||||
|
log.Infof("writing xattr %s=%s", xn, fmt.Sprintf("%d", x.size))
|
||||||
|
err = xattr.FSet(fp, xn, []byte(fmt.Sprintf("%d", x.size)))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
xn = fmt.Sprintf("%s.%s", namespacePrefix, "multihash")
|
||||||
|
log.Infof("writing xattr %s=%s", xn, x.hash)
|
||||||
|
err = xattr.FSet(fp, xn, []byte(x.hash))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *xsf) Update() error {
|
func (x *xsf) Update() error {
|
||||||
fp, e1 := os.Open(x.path)
|
fp, e1 := os.Open(x.path)
|
||||||
defer fp.Close()
|
defer fp.Close()
|
||||||
|
log.Infof("updating file")
|
||||||
|
log.Debugf("path: %s", x.path)
|
||||||
if e1 != nil {
|
if e1 != nil {
|
||||||
return e1
|
return e1
|
||||||
}
|
}
|
||||||
@ -116,13 +200,24 @@ func (x *xsf) Update() error {
|
|||||||
return e2
|
return e2
|
||||||
}
|
}
|
||||||
x.size = fi.Size()
|
x.size = fi.Size()
|
||||||
t := fi.ModTime()
|
log.Debugf("size: %d", x.size)
|
||||||
x.mtime = &t
|
t := fi.ModTime().UTC().Format(time.RFC3339)
|
||||||
|
log.Debugf("modtime: %s", t)
|
||||||
|
x.mtime = t
|
||||||
|
|
||||||
|
log.Debugf("hashing...")
|
||||||
|
h, e3 := HashFile(fp)
|
||||||
|
if e3 != nil {
|
||||||
|
return e3
|
||||||
|
}
|
||||||
|
x.hash = h
|
||||||
|
log.Debugf("hash: %s", h)
|
||||||
|
|
||||||
|
e4 := x.writeXattrs(fp)
|
||||||
|
|
||||||
|
if e4 != nil {
|
||||||
|
return e4
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewXsf(path string) *xsf {
|
|
||||||
x := xsf{}
|
|
||||||
x.path = path
|
|
||||||
return &x
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user