From 2db247f179c3ab0f350bb3c9848ccc990ad761bc Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Fri, 18 Apr 2014 12:06:46 +0200 Subject: Split out and test Process --- whatmaps/command.py | 52 ++---------------------------------- whatmaps/process.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 whatmaps/process.py (limited to 'whatmaps') diff --git a/whatmaps/command.py b/whatmaps/command.py index 98de395..502f7d3 100755 --- a/whatmaps/command.py +++ b/whatmaps/command.py @@ -34,61 +34,13 @@ try: except ImportError: lsb_release = None +from whatmaps.process import Process + class PkgError(Exception): pass -class Process(object): - """A process - Linux only so far, needs /proc mounted""" - deleted_re = re.compile(r"(?P.*) \(deleted\)$") - - def __init__(self, pid): - self.pid = pid - self.mapped = [] - try: - self.exe = os.readlink('/proc/%d/exe' % self.pid) - m = self.deleted_re.match(self.exe) - if m: - self.exe = m.group('exe') - logging.debug("Using deleted exe %s", self.exe) - if not os.path.exists(self.exe): - logging.debug("%s doesn't exist", self.exe) - self.cmdline = open('/proc/%d/cmdline' % self.pid).read() - except OSError: - self.exe = None - self.cmdline = None - - def _read_maps(self): - """Read the SOs from /proc//maps""" - try: - f = file('/proc/%d/maps' % self.pid) - except IOError as e: - # ignore killed process - if e.errno != errno.ENOENT: - raise - return - for line in f: - try: - so = line.split()[5].strip() - self.mapped.append(so) - except IndexError: - pass - - def maps(self, path): - """Check if the process maps the object at path""" - if not self.mapped: - self._read_maps() - - if path in self.mapped: - return True - else: - return False - - def __repr__(self): - return "" % self.pid - - class Distro(object): """ A distribution diff --git a/whatmaps/process.py b/whatmaps/process.py new file mode 100644 index 0000000..3fe23f3 --- /dev/null +++ b/whatmaps/process.py @@ -0,0 +1,77 @@ +#!/usr/bin/python -u +# vim: set fileencoding=utf-8 : +# +# (C) 2010,2014 Guido Günther +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import errno +import logging +import os +import re + +class Process(object): + """A process - Linux only so far, needs /proc mounted""" + deleted_re = re.compile(r"(?P.*) \(deleted\)$") + + def __init__(self, pid, procfs=None): + self.procfs = procfs or '/proc' + self.pid = pid + self.mapped = [] + self.deleted = False + try: + self.exe = os.readlink(self._procpath(str(self.pid), 'exe')) + m = self.deleted_re.match(self.exe) + if m: + self.exe = m.group('exe') + self.deleted = True + logging.error("Using deleted exe %s", self.exe) + if not os.path.exists(self.exe): + logging.debug("%s doesn't exist", self.exe) + self.cmdline = open(self._procpath('%d/cmdline' % self.pid)).read() + except OSError: + self.exe = None + self.cmdline = None + + def _procpath(self, *args): + """ + Return a path relative to the current procfs bsae + """ + return os.path.join(self.procfs, *args) + + def _read_maps(self): + """Read the SOs from /proc//maps""" + try: + f = file(self._procpath('%d/maps' % self.pid)) + except IOError as e: + # ignore killed process + if e.errno != errno.ENOENT: + raise + return + for line in f: + try: + so = line.split()[5].strip() + self.mapped.append(so) + except IndexError: + pass + + def maps(self, path): + """Check if the process maps the object at path""" + if not self.mapped: + self._read_maps() + + return True if path in self.mapped else False + + def __repr__(self): + return "" % self.pid -- cgit v1.2.3