126 | 126 |
print "Process %s (PID: %d) " % (process.program, process.pid)
|
127 | 127 |
process.listDeleted()
|
128 | 128 |
|
|
129 |
lc_all_c_env = os.environ
|
|
130 |
lc_all_c_env['LC_ALL'] = 'C'
|
129 | 131 |
|
130 | 132 |
packages = {}
|
131 | 133 |
diverted = None
|
132 | |
dpkgQuery = ["dpkg", "--search"] + programs.keys()
|
133 | |
dpkgProc = subprocess.Popen(dpkgQuery, stdout=subprocess.PIPE, stderr=None)
|
|
134 |
dpkgQuery = ["dpkg-query", "--search"] + programs.keys()
|
|
135 |
dpkgProc = subprocess.Popen(dpkgQuery, stdout=subprocess.PIPE, stderr=None,
|
|
136 |
env = lc_all_c_env)
|
134 | 137 |
for line in dpkgProc.stdout.readlines():
|
135 | 138 |
if line.startswith('local diversion'):
|
136 | 139 |
continue
|
|
145 | 148 |
packagename, program = m.group(1), diverted
|
146 | 149 |
else:
|
147 | 150 |
packagename, program = line[:-1].split(': ')
|
|
151 |
if program == diverted:
|
|
152 |
# dpkg prints a summary line after the diversion, name both
|
|
153 |
# packages of the diversion, so ignore this line
|
|
154 |
# mutt-patched, mutt: /usr/bin/mutt
|
|
155 |
continue
|
148 | 156 |
|
149 | 157 |
packages.setdefault(packagename,Package(packagename))
|
150 | 158 |
packages[packagename].processes.extend(programs[program])
|
|
159 | 167 |
for package in packages.values():
|
160 | 168 |
if package == 'util-linux':
|
161 | 169 |
continue
|
162 | |
dpkgQuery = ["dpkg", "--listfiles", package.name]
|
|
170 |
dpkgQuery = ["dpkg-query", "--listfiles", package.name]
|
163 | 171 |
dpkgProc = subprocess.Popen(dpkgQuery, stdout=subprocess.PIPE, stderr=None)
|
164 | 172 |
for line in dpkgProc.stdout.readlines():
|
165 | 173 |
path = line[:-1]
|
|
259 | 267 |
# Or about files under /tmp
|
260 | 268 |
if f.startswith('/tmp/'):
|
261 | 269 |
return 0
|
|
270 |
# Or about files under /var/tmp
|
|
271 |
if f.startswith('/var/tmp/'):
|
|
272 |
return 0
|
262 | 273 |
# Or /dev/zero
|
263 | 274 |
if f.startswith('/dev/zero'):
|
264 | 275 |
return 0
|
|
271 | 282 |
# Skip automatically generated files
|
272 | 283 |
if f.endswith('icon-theme.cache'):
|
273 | 284 |
return 0
|
274 | |
# Skip mutt files
|
275 | |
if re.compile("/tmp/mutt-\w+-[\-0-9]").search(f):
|
276 | |
return 0
|
277 | 285 |
# Skip font files
|
278 | 286 |
if f.startswith('/var/cache/fontconfig/'):
|
279 | 287 |
return 0
|
280 | 288 |
# Skip, if asked to, files that do not belong to any package
|
281 | 289 |
if onlyPackageFiles:
|
282 | |
dpkgQuery = ["dpkg", "--search", f]
|
|
290 |
dpkgQuery = ["dpkg-query", "--search", f]
|
283 | 291 |
dpkgProc = subprocess.Popen(dpkgQuery, stdout=subprocess.PIPE, stderr=None)
|
284 | 292 |
for line in dpkgProc.stdout.readlines():
|
285 | 293 |
if line.endswith(f):
|
|
379 | 387 |
self.files = []
|
380 | 388 |
self.descriptors = []
|
381 | 389 |
self.links = []
|
|
390 |
self.program = ''
|
382 | 391 |
|
383 | 392 |
try:
|
384 | |
self.program = self.cleanFile(os.readlink('/proc/%d/exe' % self.pid))
|
|
393 |
self.program = os.readlink('/proc/%d/exe' % self.pid)
|
385 | 394 |
except OSError, e:
|
386 | 395 |
if e.errno != 2:
|
387 | 396 |
raise
|
|
397 |
self.program = self.cleanFile(self.program)
|
388 | 398 |
|
389 | 399 |
def cleanFile(self, f):
|
390 | 400 |
# /proc/pid/exe has all kinds of junk in it sometimes
|