コード例 #1
0
    def _affecting_processes(self,
                             process,
                             packages,
                             affected_process_factory=AffectedProcess):
        collection = AffectedProcessesCollection()
        process_files = process.files
        for package in packages:
            matching_files = set()
            for package_file in self._PACKAGE_MANAGER.package_files(
                    package.name):
                package_file = FilenameCleaner.strip(package_file)
                if not package_file in process_files:
                    continue

                if process.create_time() <= package.modified:
                    matching_files.add(package_file)

            if matching_files:
                aff_pkg = package
                aff_pkg.files = matching_files

                affected = affected_process_factory(process.pid)
                affected.__dict__.update(process.__dict__)
                affected.packages.update([aff_pkg])
                collection.update([affected])
        return collection
コード例 #2
0
ファイル: tracer.py プロジェクト: FrostyX/tracer
	def _affecting_children(self, process, packages, affected_process_factory):
		if not self._rules.find(process.name()):
			return {}

		processes = AffectedProcessesCollection()
		for child in process.children():
			processes.update(self._affecting_processes(child, packages, affected_process_factory))
			processes.update(self._affecting_children(child, packages, affected_process_factory))
		return processes
コード例 #3
0
ファイル: test_collections.py プロジェクト: ygemici/tracer
	def test_processes_update(self):
		p1 = AffectedProcess(1234)
		p2 = AffectedProcess(1234)
		p2.files = set(['foo', 'bar', 'baz'])

		c = AffectedProcessesCollection()
		c.update([p1])
		c.update([p2])

		self.assertIn(p1, c)
		self.assertIn('bar', c[c.index(p1)].files)
コード例 #4
0
ファイル: tracer.py プロジェクト: FrostyX/tracer
	def trace_application(self, app, affected_process_factory=AffectedProcess):
		"""
		Returns collection of processes where each of them contains
		packages which affected it. Packages contains only files matching
		with the particular process
		"""
		packages = self._modified_packages()
		processes = AffectedProcessesCollection()
		for process in app.instances:
			processes.update(self._affecting_processes(process, packages, affected_process_factory))
			processes.update(self._affecting_children(process, packages, affected_process_factory))
		return processes
コード例 #5
0
    def trace_affected(self, user=None):
        """
		Returns collection of applications which uses some files that have been modified
		@TODO This function should be hardly optimized
		"""

        memory = self._memory(user)
        packages = self._modified_packages()

        affected = {}
        found = []
        for package in packages.unique_newest():
            for file in self._PACKAGE_MANAGER.package_files(package.name):

                file = FilenameCleaner.strip(file)
                if not file in memory:
                    continue

                for p in memory[file]:
                    if p.pid in found:
                        continue

                    try:
                        if p.create_time() <= package.modified:
                            found.append(p.pid)
                            p = self._apply_rules(p)
                            a = self._applications.find(p.name())

                            if not a.ignore:
                                if a.name not in affected:
                                    if self._erased and not self._PACKAGE_MANAGER.provided_by(
                                            a.name):
                                        a.type = Applications.TYPES["ERASED"]
                                    affected[a.name] = AffectedApplication(
                                        a._attributes)
                                    affected[
                                        a.
                                        name].affected_instances = AffectedProcessesCollection(
                                        )
                                    self._call_hook(affected[a.name])
                                affected[a.name].affected_instances.append(p)
                    except NoSuchProcess:
                        pass
        if self._has_updated_kernel(
        ) and not self._applications.find('kernel').ignore:
            # Add fake AffectedApplication
            affected['kernel'] = AffectedApplication({
                "name":
                "kernel",
                "type":
                Applications.TYPES["STATIC"],
                "helper":
                _("You will have to reboot your computer")
            })

        return ApplicationsCollection(affected.values())
コード例 #6
0
ファイル: tracer.py プロジェクト: FrostyX/tracer
	def _affecting_processes(self, process, packages, affected_process_factory=AffectedProcess):
		collection = AffectedProcessesCollection()
		process_files = process.files
		for package in packages:
			matching_files = set()
			for package_file in self._PACKAGE_MANAGER.package_files(package.name):
				package_file = FilenameCleaner.strip(package_file)
				if not package_file in process_files:
					continue

				if process.create_time() <= package.modified:
					matching_files.add(package_file)

			if matching_files:
				aff_pkg = package
				aff_pkg.files = matching_files

				affected = affected_process_factory(process.pid)
				affected.__dict__.update(process.__dict__)
				affected.packages.update([aff_pkg])
				collection.update([affected])
		return collection
コード例 #7
0
	def _affecting_children(self, process, packages, affected_process_factory):
		if not self._rules.find(process.name()):
			return {}

		processes = AffectedProcessesCollection()
		for child in process.children():
			processes.update(self._affecting_processes(child, packages, affected_process_factory))
			processes.update(self._affecting_children(child, packages, affected_process_factory))
		return processes
コード例 #8
0
	def trace_application(self, app_name, affected_process_factory=AffectedProcess):
		"""
		Returns collection of processes where each of them contains
		packages which affected it. Packages contains only files matching
		with the particular process
		"""
		packages = self._modified_packages()
		processes = AffectedProcessesCollection()
		for process in self._applications.find(app_name).instances:
			processes.update(self._affecting_processes(process, packages, affected_process_factory))
			processes.update(self._affecting_children(process, packages, affected_process_factory))
		return processes
コード例 #9
0
ファイル: tracer.py プロジェクト: ignatenkobrain/tracer
    def trace_affected(self, user=None):
        """
		Returns collection of applications which uses some files that have been modified
		@TODO This function should be hardly optimized
		"""

        memory = self._memory(user)
        packages = self._modified_packages()

        affected = {}
        found = []
        for package in packages.unique_newest():
            for file in self._PACKAGE_MANAGER.package_files(package.name):

                file = FilenameCleaner.strip(file)
                if not file in memory:
                    continue

                for p in memory[file]:
                    if p.pid in found:
                        continue

                    try:
                        if p.create_time() <= package.modified:
                            found.append(p.pid)
                            p = self._apply_rules(p)
                            a = self._applications.find(p.name())

                            if a.name not in affected:
                                if self._erased and not self._PACKAGE_MANAGER.provided_by(
                                        a.name):
                                    a.type = Applications.TYPES["ERASED"]
                                affected[a.name] = a
                                affected[
                                    a.
                                    name].affected_instances = AffectedProcessesCollection(
                                    )
                                self._call_hook(a)
                            affected[a.name].affected_instances.append(p)
                    except NoSuchProcess:
                        pass

        return ApplicationsCollection(affected.values())