show-rss/src/asses/one.go

57 lines
1.1 KiB
Go

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
}