package zoopb import ( "bufio" "os" "strings" "go.wit.com/lib/fhelp" ) func (m *Machine) IsInstalled(name string) bool { for p := range m.Packages.IterByName() { if name == p.Name { // log.Info("package installed:", p.Name, p.Version, p.PkgName) return true } } // log.Info("package not-installed:", name) return false } func (m *Machine) FindInstalledByName(name string) *Package { if m == nil { panic("m == nil") } if m.Packages == nil { panic("m.Packages == nil") } // log.Info("FindInstalledByName len=", m.Packages.Len()) return m.Packages.FindByName(name) /* for p := range m.Packages.IterByName() { if name == p.Name { // log.Info("package installed:", p.Name, p.Version, p.PkgName) return p } } // log.Info("package not-installed:", name) return nil */ } // looks to see if any package matches a name and version // if version == "", return the first name found func (m *Machine) FindVersion(name string) string { // first check all installed versions for p := range m.Packages.IterByName() { if name == p.Name { return p.Version } } return "" } func (m *Machine) FindInstalledPackage(check *Package) *Package { /* for p := range m.Packages.IterByName() { if (check.Name == p.Name) && (check.Version == p.Version) { return p } } */ for p := range m.Wit.IterByName() { if (check.Name == p.Name) && (check.Version == p.Version) { return p } } return nil } // looks to see if any package matches a name and version // if version == "", return the first name found func (m *Machine) FindByVersion(name string, version string) *Package { // first check all installed versions for p := range m.Packages.IterByName() { if name == p.Name { if version == "" { return p } else { if version == p.Version { return p } } } } // check all wit packages for p := range m.Wit.IterByName() { if name == p.Name { if version == "" { return p } else { if version == p.Version { return p } } } } // log.Info("package not-installed:", name) return nil } // obviously a hack at this point // read the package list file from mirrors.wit.com func (m *Machine) InitWitMirrors() error { m.Wit = NewPackages() err := m.scanPackageListFile("/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 (all *Packages) AddIfNewer(p *Package) { check := all.FindByName(p.Name) 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) } } // breaks up the apt list file into sections // then sends each section to be processed // and added to zoopb.Machine.Wit func (m *Machine) scanPackageListFile(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 := parsePackageInfo(debInfo) m.Wit.AddIfNewer(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) *Package { var name string var version string var filename string var gopath string for _, line := range strings.Split(lines, "\n") { if line == "" { continue } if strings.HasPrefix(line, " ") { // 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) < 2 { continue } if parts[0] == "Package:" { name = parts[1] } if parts[0] == "Version:" { version = parts[1] } if parts[0] == "Filename:" { filename = strings.Join(parts[1:], " ") } if parts[0] == "GoPath:" { gopath = parts[1] } } p := Package{ Name: name, Version: version, PkgName: filename, SrcPath: gopath, } return &p }