def set_package_info(target): """Set Package and Dependencies field""" if not os.path.isfile(target): raise SystemError("%s is not a file" % target) report = Report() with open(target, 'rb') as f: try: report.load(f) except Exception as exc: raise SystemError("Cannot load file %s: %s" % (target, exc)) additional_deps = "" if 'ExecutablePath' in report and re.search('samba', report['ExecutablePath']): try: for pkg_name in ('openchangeserver', 'openchange-rpcproxy', 'openchange-ocsmanager', 'sogo-openchange'): packaging.get_version(pkg_name) report.add_package_info(pkg_name) if additional_deps: additional_deps += '\n' additional_deps += report['Package'] + "\n" + report['Dependencies'] except ValueError: # Any of previous packages is not installed pass # Add executable deps report.add_package_info() if additional_deps: report['Dependencies'] += '\n' + additional_deps report['Dependencies'] = '\n'.join(sorted(set(report['Dependencies'].split('\n')))) with open(target, 'wb') as f: report.write(f)
def test_get_version(self): '''get_version().''' ver = impl.get_version('bash') self.assertNotEqual(ver, None) ver = impl.get_version('alsa-utils') self.assertNotEqual(ver, None)
def package_versions(*packages): '''Return a text listing of package names and versions. Arguments may be package names or globs, e. g. "foo*" ''' versions = [] for package_pattern in packages: if not package_pattern: continue matching_packages = packaging.package_name_glob(package_pattern) if not matching_packages: versions.append((package_pattern, 'N/A')) for package in sorted(matching_packages): try: version = packaging.get_version(package) except ValueError: version = 'N/A' if version is None: version = 'N/A' versions.append((package, version)) package_width, version_width = \ map(max, [map(len, t) for t in zip(*versions)]) fmt = '%%-%ds %%s' % package_width return '\n'.join([fmt % v for v in versions])
def package_versions(*packages): """Return a text listing of package names and versions. Arguments may be package names or globs, e. g. "foo*" """ versions = [] for package_pattern in packages: if not package_pattern: continue matching_packages = packaging.package_name_glob(package_pattern) if not matching_packages: versions.append((package_pattern, "N/A")) for package in sorted(matching_packages): try: version = packaging.get_version(package) except ValueError: version = "N/A" if version is None: version = "N/A" versions.append((package, version)) package_width, version_width = map(max, [map(len, t) for t in zip(*versions)]) fmt = "%%-%ds %%s" % package_width return "\n".join([fmt % v for v in versions])
def test_install_packages_system(self): '''install_packages() with system configuration''' # trigger an unrelated package query here to get the cache set up, # reproducing an install failure when the internal caches are not # reset properly impl.get_version('dash') self._setup_foonux_config() result = impl.install_packages(self.rootdir, None, None, [ ('coreutils', impl.get_version('coreutils')), ('tzdata', '1.1'), ], False, self.cachedir) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) # complains about obsolete packages self.assertGreaterEqual(len(result.splitlines()), 1) self.assertTrue('tzdata' in result) self.assertTrue('1.1' in result) # caches packages cache = os.listdir( os.path.join(self.cachedir, 'system', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertEqual('coreutils-dbgsym' in cache_names, self.has_dbgsym) self.assertTrue('tzdata' in cache_names) # works with relative paths and existing cache os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) os.unlink(os.path.join(self.rootdir, 'packages.txt')) orig_cwd = os.getcwd() try: os.chdir(self.workdir) impl.install_packages('root', None, None, [('coreutils', None)], False, 'cache') finally: os.chdir(orig_cwd) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat')))
def collect_dpkg_info(report, inifile): try: # find deb package that owns this inifile pkg = apport.fileutils.find_file_package(inifile) ver = packaging.get_version(pkg) report['Package'] = '%s %s' % (pkg, ver) report['SourcePackage'] = packaging.get_source(pkg) except: pass
def test_install_packages_system(self): '''install_packages() with system configuration''' # trigger an unrelated package query here to get the cache set up, # reproducing an install failure when the internal caches are not # reset properly impl.get_version('dash') self._setup_foonux_config() result = impl.install_packages(self.rootdir, None, None, [('coreutils', impl.get_version('coreutils')), ('tzdata', '1.1'), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) # complains about obsolete packages self.assertEqual(len(result.splitlines()), 1) self.assertTrue('tzdata' in result) self.assertTrue('1.1' in result) # caches packages cache = os.listdir(os.path.join(self.cachedir, 'system', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertEqual('coreutils-dbgsym' in cache_names, self.has_dbgsym) self.assertTrue('tzdata' in cache_names) # works with relative paths and existing cache os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) orig_cwd = os.getcwd() try: os.chdir(self.workdir) impl.install_packages('root', None, None, [('coreutils', None)], False, 'cache') finally: os.chdir(orig_cwd) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat')))
def test_get_dependencies(self): '''get_dependencies().''' # package with both Depends: and Pre-Depends: d = impl.get_dependencies('bash') self.assertTrue(len(d) > 2) self.assertTrue('libc6' in d) for dep in d: self.assertTrue(impl.get_version(dep)) # Pre-Depends: only d = impl.get_dependencies('coreutils') self.assertTrue(len(d) >= 1) self.assertTrue('libc6' in d) for dep in d: self.assertTrue(impl.get_version(dep)) # Depends: only d = impl.get_dependencies('libc6') self.assertTrue(len(d) >= 1) for dep in d: self.assertTrue(impl.get_version(dep))
def test_get_version(self): '''get_version().''' self.assertTrue(impl.get_version('libc6').startswith('2')) self.assertRaises(ValueError, impl.get_version, 'nonexisting') self.assertRaises(ValueError, impl.get_version, 'wukrainian')
def test_install_packages_versioned(self): '''install_packages() with versions and with cache''' self._setup_foonux_config(updates=True) obsolete = impl.install_packages( self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', '8.13-3ubuntu3'), # should not come from updates ('libc6', '2.15-0ubuntu10'), ('tzdata', None), # should come from -updates, > 2012b-1 ], False, self.cachedir) def sandbox_ver(pkg): with gzip.open( os.path.join(self.rootdir, 'usr/share/doc', pkg, 'changelog.Debian.gz')) as f: return f.readline().decode().split()[1][1:-1] self.assertEqual(obsolete, '') # packages get installed self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), impl.get_system_architecture()) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # their versions are as expected self.assertEqual(sandbox_ver('coreutils'), '8.13-3ubuntu3') self.assertEqual(sandbox_ver('libc6'), '2.15-0ubuntu10') self.assertEqual(sandbox_ver('libc6-dbg'), '2.15-0ubuntu10') self.assertGreater(sandbox_ver('tzdata'), '2012b-1') with open(os.path.join(self.rootdir, 'packages.txt')) as f: pkglist = f.read().splitlines() self.assertIn('coreutils 8.13-3ubuntu3', pkglist) self.assertIn('coreutils-dbgsym 8.13-3ubuntu3', pkglist) self.assertIn('libc6 2.15-0ubuntu10', pkglist) self.assertIn('libc6-dbg 2.15-0ubuntu10', pkglist) self.assertIn('tzdata ' + sandbox_ver('tzdata'), pkglist) self.assertEqual(len(pkglist), 5, str(pkglist)) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual( sorted(os.listdir(os.path.join(self.configdir, 'Foonux 1.2'))), ['armhf', 'codename', 'sources.list']) self.assertEqual( os.listdir(os.path.join(self.configdir, 'Foonux 1.2', 'armhf')), ['sources.list']) # caches packages, and their versions are as expected cache = os.listdir( os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) cache_versions = {} for p in cache: try: (name, ver) = p.split('_')[:2] cache_versions[name] = ver except ValueError: pass # not a .deb, ignore self.assertEqual(cache_versions['coreutils'], '8.13-3ubuntu3') self.assertEqual(cache_versions['coreutils-dbgsym'], '8.13-3ubuntu3') self.assertIn('tzdata', cache_versions) self.assertEqual(cache_versions['libc6'], '2.15-0ubuntu10') self.assertEqual(cache_versions['libc6-dbg'], '2.15-0ubuntu10') # installs cached packages os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) os.unlink(os.path.join(self.rootdir, 'packages.txt')) obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', '8.13-3ubuntu3'), ], False, self.cachedir) self.assertEqual(obsolete, '') self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) # complains about obsolete packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('gnome-common', '1.1')]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('gnome-common' in result) self.assertTrue('1.1' in result) # ... but installs the current version anyway self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/bin/gnome-autogen.sh'))) self.assertGreaterEqual(sandbox_ver('gnome-common'), '3.1.0-0ubuntu1') # does not crash on nonexisting packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('buggerbogger', None)]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('buggerbogger' in result) self.assertTrue('not exist' in result) # can interleave with other operations dpkg = subprocess.Popen(['dpkg-query', '-Wf${Version}', 'dash'], stdout=subprocess.PIPE) dash_version = dpkg.communicate()[0].decode() self.assertEqual(dpkg.returncode, 0) self.assertEqual(impl.get_version('dash'), dash_version) self.assertRaises(ValueError, impl.get_available_version, 'buggerbogger') # still installs packages after above operations os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) os.unlink(os.path.join(self.rootdir, 'packages.txt')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', '8.13-3ubuntu3'), ('dpkg', None), ], False, self.cachedir) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/dpkg')))
def test_install_packages_versioned(self): '''install_packages() with versions and with cache''' self._setup_foonux_config() impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '7.4-2ubuntu2'), ('libc6', '2.11.1-0ubuntu7'), ('tzdata', '2010i-1'), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual(os.listdir(os.path.join(self.configdir, 'Foonux 1.2')), ['sources.list']) # caches packages cache = os.listdir(os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertTrue('coreutils-dbgsym' in cache_names) self.assertTrue('tzdata' in cache_names) self.assertTrue('libc6' in cache_names) self.assertTrue('libc6-dbg' in cache_names) # installs cached packages os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '7.4-2ubuntu2'), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) # complains about obsolete packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('gnome-common', '1.1')]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('gnome-common' in result) self.assertTrue('1.1' in result) # ... but installs the current version anyway self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/gnome-autogen.sh'))) # does not crash on nonexisting packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('buggerbogger', None)]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('buggerbogger' in result) self.assertTrue('not exist' in result) # can interleave with other operations dpkg = subprocess.Popen(['dpkg-query', '-Wf${Version}', 'dash'], stdout=subprocess.PIPE) coreutils_version = dpkg.communicate()[0].decode() self.assertEqual(dpkg.returncode, 0) self.assertEqual(impl.get_version('dash'), coreutils_version) self.assertRaises(ValueError, impl.get_available_version, 'buggerbogger') # still installs packages after above operations os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '7.4-2ubuntu2'), ('dpkg', None), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/dpkg')))
def test_install_packages_versioned(self): '''install_packages() with versions and with cache''' self._setup_foonux_config() obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '8.13-3ubuntu3'), ('libc6', '2.15-0ubuntu10'), ('tzdata', '2012b-1'), ], False, self.cachedir) self.assertEqual(obsolete, '') self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), impl.get_system_architecture()) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual(sorted(os.listdir(os.path.join(self.configdir, 'Foonux 1.2'))), ['armhf', 'codename', 'sources.list']) self.assertEqual(os.listdir(os.path.join(self.configdir, 'Foonux 1.2', 'armhf')), ['sources.list']) # caches packages cache = os.listdir(os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertTrue('coreutils-dbgsym' in cache_names) self.assertTrue('tzdata' in cache_names) self.assertTrue('libc6' in cache_names) self.assertTrue('libc6-dbg' in cache_names) # installs cached packages os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '8.13-3ubuntu3'), ], False, self.cachedir) self.assertEqual(obsolete, '') self.assertTrue(os.path.exists( os.path.join(self.rootdir, 'usr/bin/stat'))) # complains about obsolete packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('gnome-common', '1.1')]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('gnome-common' in result) self.assertTrue('1.1' in result) # ... but installs the current version anyway self.assertTrue(os.path.exists( os.path.join(self.rootdir, 'usr/bin/gnome-autogen.sh'))) # does not crash on nonexisting packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('buggerbogger', None)]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('buggerbogger' in result) self.assertTrue('not exist' in result) # can interleave with other operations dpkg = subprocess.Popen(['dpkg-query', '-Wf${Version}', 'dash'], stdout=subprocess.PIPE) coreutils_version = dpkg.communicate()[0].decode() self.assertEqual(dpkg.returncode, 0) self.assertEqual(impl.get_version('dash'), coreutils_version) self.assertRaises(ValueError, impl.get_available_version, 'buggerbogger') # still installs packages after above operations os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '8.13-3ubuntu3'), ('dpkg', None), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/dpkg')))