Source code for autotest.client.profilers.inotify.inotify

"""
inotify logs filesystem activity that may be directly or indirectly caused
by the test that is running. It requires the inotify-tools package, more
specifically, the inotifywait tool.

Heavily inspired / shamelessly copied from the kvm_stat profiler.

:copyright: Red Hat 2013
:author: Cleber Rosa <cleber@redhat.com>
"""
import logging
import os
import subprocess

from autotest.client import profiler, os_dep


[docs]class inotify(profiler.profiler): """ Profiler based on inotifywait from inotify-tools """ version = 1 def _build_command_line(self, paths, test): default_opts = "-m -t 0 --format='%T|%,e|%w|%f' --timefmt '%m/%d %X'" paths_valid = [p for p in paths if os.path.exists(p)] paths_str = ' '.join(paths_valid) output_option = '-o %s' % os.path.join(test.profdir, 'inotify') options = '%s %s' % (default_opts, output_option) return '%s %s %s' % (self.inotifywait, options, paths_str)
[docs] def initialize(self, paths=[]): try: self.inotifywait = os_dep.command('inotifywait') except ValueError: logging.error('Command inotifywait from inotify-tools is not present') self.inotifywait = None self.paths = paths
[docs] def start(self, test): if self.inotifywait is None: logging.error("Profiler inotify won't perform any action because " "the inotifywait tool from inotify-tools is missing " "on this system") return # monitor the test directories by default if not self.paths: self.paths = [test.bindir, test.srcdir, test.tmpdir] self.command_line = self._build_command_line(self.paths, test) logging.debug('running inotify profiler command: %s', self.command_line) p = subprocess.Popen(self.command_line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.pid = p.pid
[docs] def stop(self, test): if self.inotifywait is None: return try: os.kill(self.pid, 15) except OSError: pass
[docs] def report(self, test): return None