def test_equality(self): p1 = Package("foo") p2 = Package("foo") p3 = Package("bar") self.assertEquals(p1, p2) self.assertNotEquals(p1, p3)
def _file_provided_by(self, file): find_owner = FileOwner(early_out=True) packages = find_owner([file]) if packages: package = packages[0][0] name = package.category + '/' + package.name p = Package(name) p.category = package.category return p return None
def test_packages_intersection(self): p1 = Package("foo") p2 = Package("bar") p3 = Package("baz") p4 = Package("qux", 123) p5 = Package("qux") c1 = PackagesCollection([p1, p2, p3, p4]) self.assertEqual(c1.intersection([p1, p3]).sorted("name"), PackagesCollection([p1, p3]).sorted("name")) self.assertEqual(c1.intersection(None), c1) self.assertIsNotNone(c1.intersection([p5])[0].modified)
def _file_provided_by(self, file): """Returns name of package which provides given file""" ts = rpm.TransactionSet() db = ts.dbMatch("basenames", file) if db.count() == 0: return None pkg = next(db) p = Package(pkg[rpm.RPMTAG_NAME].decode()) p.category = pkg[rpm.RPMTAG_GROUP].decode() return p
def packages_newer_than(self, unix_time): """ Returns list of packages which were modified between unix_time and present Requires root permissions. """ if not os.access('/var/log/emerge.log', os.R_OK): raise DatabasePermissions newer = PackagesCollection() process = subprocess.Popen(['qlop', '-lC'], stdout=subprocess.PIPE) packages = process.communicate()[0] for package in packages.decode().split('\n')[:-1]: package = package.split(" >>> ") # There actually should be %e instead of %d modified = time.mktime( time.strptime(package[0], "%a %b %d %H:%M:%S %Y")) if modified >= unix_time: pkg_name = package[ 1] # Package name with version, let's cut it off pkg_name = self._pkg_name_without_version(pkg_name) newer.append(Package(pkg_name, modified)) return newer
def package_info(self, app_name): """Returns package object with all attributes""" name = self.provided_by(app_name) description = None process = subprocess.Popen(['rpm', '-qi', name], stdout=subprocess.PIPE) out = process.communicate()[0] out = out.split('\n') for line in out: if line.startswith("Summary"): description = line.split("Summary :")[1].strip() package = Package(name) package.description = description return package
def run(): args = parser.parse_args() # If there is something on stdin (that means piped into tracer) stdin_packages = [] if not sys.stdin.isatty(): stdin_packages = sys.stdin.readline().split() # All input packages enchanced by actual time (as modified time) packages = [] for package in args.packages + args.pkgs + stdin_packages: packages.append(Package(package, time.time() if args.now else None)) try: router = Router(args, packages) return router.dispatch() except (UnsupportedDistribution, PathNotFound, LockedDatabase) as ex: print(ex) exit(1) except DatabasePermissions as ex: print(ex) print("You will probably need to run tracer as root") exit(1) except (KeyboardInterrupt, EOFError): print("")
def provided_by(self, app_name): """Returns name of package which provides given application""" command = ['dlocate', '-S', app_name] process = subprocess.Popen(command, stdout=subprocess.PIPE) pkg_name = process.communicate()[0] pkg_name = pkg_name.decode().split('\n')[0] return Package(pkg_name.split(':')[0])
def packages_newer_than(self, unix_time): """ Returns list of packages which were modified between unix_time and present """ new_pkgs = PackagesCollection() for pkg in self.db.pkgcache: if pkg.installdate > unix_time: new_pkgs.append(Package(pkg.name, pkg.installdate)) return new_pkgs
def _file_provided_by(self, file_name): """ Returns name of package which provides given file """ # This is a bit slow for pkg in self.db.pkgcache: files = [f[0] for f in pkg.files] if self._bsearch_list(files, file_name[1:]): return Package(pkg.name, pkg.installdate) else: return None
def packages_newer_than(self, unix_time): """ Returns list of packages which were modified between unix_time and present Requires root permissions. """ # Package manager wasn't used yet if not os.path.exists(self.history_path): return PackagesCollection([]) if self.opts.get('modern_swdb'): sql = """ SELECT DISTINCT rpm.name, trans.dt_end AS end FROM trans JOIN trans_item JOIN rpm ON trans.id=trans_item.trans_id AND trans_item.item_id=rpm.item_id WHERE trans.dt_begin > ? ORDER BY rpm.name """ else: sql = """ SELECT DISTINCT pkgtups.name, trans_end.timestamp AS end FROM trans_beg JOIN trans_end JOIN trans_data_pkgs JOIN pkgtups ON trans_beg.tid=trans_end.tid AND trans_data_pkgs.tid=trans_beg.tid AND trans_data_pkgs.pkgtupid=pkgtups.pkgtupid WHERE trans_beg.timestamp > ? ORDER BY pkgtups.name """ try: packages = PackagesCollection() sqlite = self._database_file() conn = sqlite3.connect(sqlite) conn.row_factory = sqlite3.Row cursor = conn.cursor() cursor.execute(sql, [unix_time]) for result in cursor.fetchall(): packages.append(Package(result['name'], result['end'])) return packages except sqlite3.OperationalError as e: raise LockedDatabase() if str( e) == 'database is locked' else DatabasePermissions()
def test_helper(self): processes = [ ProcessMock(2, "foo", 1234, ["file1", "file2"]), ProcessMock(3, "foo", 5678, ["file2", "file3"]), ] package = Package("foopackage") package.modified = None package.description = "Foo package description" package.category = "categ" package.files = ["file1", "file2"] a1 = AffectedProcessMock(2) a1.packages = set([package]) affected_by = [a1] view = HelperView(self.out) view.assign("args", ArgsMock(verbose=2)) view.assign("processes", processes) view.assign("application", Applications.find("foo")) view.assign("package", package) view.assign("affected_by", affected_by) view.assign("affects", None) view.render() self.assertEquals(self.out.getvalue(), ( "* foo\n" " Package: foopackage\n" " Description: Foo package description\n" " Type: Application\n" " State: foo has been started by None some-time ago. PID - 2\n" " foo has been started by None some-time ago. PID - 3\n" "\n" " Affected by:\n" " foopackage\n" " file1\n" " file2\n" ))
def packages_newer_than(self, unix_time): """ Returns list of packages which were modified between unix_time and present Requires root permissions. """ newer = PackagesCollection() log = open(self.dpkg_log, 'r') for line in log: line = line.split(" ") if line[2] != "upgrade": continue # There actually should be %e instead of %d modified = time.mktime( time.strptime(line[0] + " " + line[1], "%Y-%m-%d %H:%M:%S")) if modified >= unix_time: pkg_name = line[3].split(":")[0] newer.append(Package(pkg_name, modified)) return newer
def test_helper(self): processes = [ ProcessMock(2, "foo", 1234, ["file1", "file2"]), ProcessMock(3, "foo", 5678, ["file2", "file3"]), ] package = Package("foopackage") package.modified = None package.description = "Foo package description" package.category = "categ" package.files = ["file1", "file2"] a1 = AffectedProcessMock(2) a1.packages = set([package]) affected_by = [a1] view = HelperView(self.out) view.assign("args", ArgsMock(verbose=2)) view.assign("processes", processes) view.assign("application", Applications.find("foo")) view.assign("package", package) view.assign("affected_by", affected_by) view.assign("affects", None) view.render() self.assertEquals(self.out.getvalue(), ( "* foo\n" " Package: foopackage\n" " Description: Foo package description\n" " Type: Application\n" " State: foo has been started by None some-time ago. PID - 2\n" " foo has been started by None some-time ago. PID - 3\n" "\n" " Affected by:\n" " foopackage\n" " file1\n" " file2\n"))
def test_representation(self): package = Package("foo") self.assertEquals(repr(package), "<Package:foo>")