Exemple #1
0
    def test_equality(self):
        p1 = Package("foo")
        p2 = Package("foo")
        p3 = Package("bar")

        self.assertEquals(p1, p2)
        self.assertNotEquals(p1, p3)
Exemple #2
0
		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
Exemple #3
0
	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)
Exemple #4
0
 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
Exemple #5
0
		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
Exemple #6
0
		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
Exemple #7
0
        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
Exemple #8
0
	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
Exemple #9
0
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("")
Exemple #10
0
 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])
Exemple #11
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
Exemple #12
0
        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
Exemple #13
0
        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()
Exemple #14
0
	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"
		))
Exemple #15
0
        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
Exemple #16
0
    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"))
Exemple #17
0
 def test_representation(self):
     package = Package("foo")
     self.assertEquals(repr(package), "<Package:foo>")