package main import ( "crypto/md5" "crypto/sha256" "errors" "fmt" "io" "os" "path/filepath" "strings" "go.wit.com/lib/debian" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/zoopb" "google.golang.org/protobuf/types/known/timestamppb" ) func populateDebInfo(p *zoopb.Package) error { // SIMPLE SANITY CHECKS if p.DebInfo != nil { // already added p.DebInfo return nil } fullname := filepath.Join(me.pb.BaseDir, p.Filename) cmd := []string{"dpkg", "-I", fullname} r := shell.Run(cmd) if r.Error != nil { return r.Error } if r.Exit != 0 { return errors.New("dpkg returned -1") } stat, err := os.Stat(fullname) if err != nil { return err } filedata, err := os.Open(fullname) if err != nil { return err } defer filedata.Close() // SIMPLE SANITY CHECKS END // SHA256 HASH p.DebInfo = new(zoopb.DebInfo) hSHA256 := sha256.New() hMD5 := md5.New() // probably deprecate, but love md5sum too much // hSHA1 := sha1.New() // deprecated // TeeReader allows writing to multiple hashers at once // multiWriter := io.MultiWriter(hMD5, hSHA1, hSHA256) multiWriter := io.MultiWriter(hSHA256, hMD5) if _, err := io.Copy(multiWriter, filedata); err != nil { return err } p.DebInfo.SHA256 = fmt.Sprintf("%x", hSHA256.Sum(nil)) // should be the standard now p.DebInfo.MD5SUM = fmt.Sprintf("%x", hMD5.Sum(nil)) // probably deprecate // p.DebInfo.SHA1 = fmt.Sprintf("%x", hSHA1.Sum(nil)) // deprecated // SHA256 HASH END // set file create time p.Ctime = timestamppb.New(stat.ModTime()) // PARSE "dpkg -I ", then exit as we are done all := strings.Join(r.Stdout, "\n") debian.ParseDpkgOutputIntoPB(p, all) return nil }