package asses import ( "context" "crypto/md5" "encoding/base64" "io" "log" "math/rand" "os" "path" "time" ) func One(ctx context.Context, p string) error { shortp := path.Join("...", path.Dir(p), path.Base(p)) last, err := checkLast(ctx, p) if err != nil { return err } if last.T.IsZero() { log.Printf("asses.One(%s) // never seen before", shortp) } else if cksum, err := Cksum(p); err != nil { return err } else if cksum != last.Cksum { log.Printf("asses.One(%s) // cksum changed", shortp) } else if threshold := 20 + time.Duration(rand.Int()%10)*24*time.Hour; time.Since(last.T) < threshold { log.Printf("asses.One(%s) // lt %v since last review", shortp, threshold.Hours()) return nil } log.Printf("asses.deport(%s)...", shortp) if err := deport(ctx, p); err != nil { return err } cksum, err := Cksum(p) if err != nil { return err } return checked(ctx, p, cksum) } func Cksum(p string) (string, error) { f, err := os.Open(p) if err != nil { return "", err } defer f.Close() hasher := md5.New() _, err = io.Copy(hasher, f) return base64.StdEncoding.EncodeToString(hasher.Sum(nil)), err }