# Lint as: python2, python3
"""
Sets up a subprocess to run any generic command in the background every
few seconds (by default the interval is 60 secs)
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import time, os, subprocess
from six.moves import zip

from autotest_lib.client.bin import profiler
from autotest_lib.client.common_lib import utils, error

class cmdprofile(profiler.profiler):
    version = 2
    supports_reboot = True


    def initialize(self, cmds=['ps'], interval=60, outputfile='cmdprofile',
                   outputfiles=None):

        # do some basic sanity checking on the parameters
        if not outputfiles and not outputfile:
            raise error.TestError(
                'cmdprofile cannot run if neither outputfile nor outputfile '
                'is specified')
        elif outputfiles and len(outputfiles) != len(cmds):
            raise error.TestError(
                'cmdprofile paramter outputfiles has length %d and cmds has '
                'length %d, but both lists must have the same length' %
                (len(outputfiles), len(cmds)))

        self.interval = interval
        self.cmds = cmds
        if outputfiles:
            # outputfiles overrides outputfile
            self.outputfiles = outputfiles
        else:
            self.outputfiles = [outputfile] * len(cmds)


    def start(self, test):
        self.pid = os.fork()
        if self.pid:  # parent
            return
        else:  # child
            while True:
                for cmd, outputfile in zip(self.cmds, self.outputfiles):
                    logfile = open(os.path.join(test.profdir, outputfile), 'a')
                    utils.run(cmd, stdout_tee=logfile, stderr_tee=logfile)
                    logfile.write('\n')
                    logfile.close()
                time.sleep(self.interval)


    def stop(self, test):
        utils.nuke_pid(self.pid)
