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
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
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)
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
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())
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
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
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())