package debian import ( "bufio" "os" "strings" "go.wit.com/lib/fhelp" "go.wit.com/lib/protobuf/zoopb" "go.wit.com/log" ) // obviously a hack at this point // read the package list file from mirrors.wit.com func InitWitMirrors(m *zoopb.Machine) error { m.Wit = zoopb.NewPackages() err := scanPackageListFile(m, "/var/lib/apt/lists/mirrors.wit.com_wit_dists_sid_main_binary-amd64_Packages") return err } // adds the package if the name isn't there // if it's newer, remove the old package and use the new one func AddIfNewer(all *zoopb.Packages, p *zoopb.Package) { check := all.FindByPackage(p.Package) if check == nil { all.Append(p) return } v1, _ := fhelp.NewDebVersion(check.Version) v2, _ := fhelp.NewDebVersion(p.Version) if v1.Equal(v2) { // log.Info("do nothing", v1, v2) return } if v1.LessThan(v2) { // log.Info("removing", v1, "using", v2) all.Delete(check) all.Append(p) } else { // log.Info("keeping", v1, "got:", v2) } } func fillPB(p *zoopb.Package, namemap map[string]string) error { for varname, s := range namemap { s = strings.TrimSpace(s) varname = strings.TrimSpace(varname) varname := strings.TrimSuffix(varname, ":") // some junk that was in some that we made if varname == "size" || varname == "servers" || varname == "GoPath" { continue } if varname == "MD5sum" { varname = "MD5SUM" } if varname == "Build-Depends" { varname = "BuildDepends" } if varname == "Package-Build-Date" { varname = "PackageBuildDate" } if varname == "Git-Tag-Date" { varname = "GitTagDate" } if ok, err := SetString(p, varname, s); ok { continue } else { log.Printf("%s: var=%s val=%s err=%v\n", p.Package, varname, s, err) } } // log.Info("") return nil } // breaks up the apt list file into sections // then sends each section to be processed // and added to zoopb.Machine.Wit func scanPackageListFile(m *zoopb.Machine, filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close() scanner := bufio.NewScanner(file) var debInfo string for scanner.Scan() { line := scanner.Text() if line == "" { p, namemap := parsePackageInfo(debInfo) _ = namemap fillPB(p, namemap) AddIfNewer(m.Wit, p) debInfo = "" } debInfo += line + "\n" } p, _ := parsePackageInfo(debInfo) m.Wit.Append(p) return nil } /* func (m *Machine) addPackage(name string, version string, filename string) { if name == "" { return } // log.Info("addPackage:", name, version, filename) var deb *DebPackage var ok bool deb, ok = allp[name] if !ok { deb = NewPackage() deb.name.SetLabel(name) allp[name] = deb } newversion := new(Version) newversion.v = version newversion.file = filename deb.versions = append(deb.versions, newversion) } */ // parses dpkg -s foo.deb func parsePackageInfo(lines string) (*zoopb.Package, map[string]string) { var name string var version string var filename string var gopath string var last string namemap := make(map[string]string) for _, line := range strings.Split(lines, "\n") { if line == "" { continue } if strings.HasPrefix(line, " ") { namemap[last] += line + "\n" // these are usually Description: lines continue } if strings.HasPrefix(line, "#") { // skip comment lines. (probably doesn't happen in debian list files continue } line = strings.TrimSpace(line) parts := strings.Split(line, " ") if len(parts) == 1 { namemap[parts[0]] = "" } if len(parts) < 2 { continue } last = parts[0] namemap[last] = strings.Join(parts[1:], " ") + "\n" if last == "Package:" { name = parts[1] } if last == "Version:" { version = parts[1] } if last == "Filename:" { filename = strings.Join(parts[1:], " ") } if last == "GoPath:" { gopath = parts[1] } } p := zoopb.Package{ Package: name, Version: version, Filename: filename, Namespace: gopath, } return &p, namemap }