from .SimpleService import SimpleService
from ..lib import processes

import glob

class PIDChangeService(SimpleService):

    pid_globs = []
    proc_names = []

    def __init__(self):
        SimpleService.__init__(self)
        self.pid_cache_file = '/tmp/zabbix_pidcache_{m}'.format(m=self.module_name)

    def _get_raw_data(self):
        pid = self.get_pid()
        if not pid:
            return 2
        pid_cache = self.get_pid_cache()

        self.put_pid_cache(pid)

        if not pid_cache or pid == pid_cache:
            return 0
        else:
            return 1

    def get_pid(self):
        for pid_glob in self.pid_globs:
            for pid_file in glob.glob(pid_glob):
                try:
                    with open(pid_file, 'r') as f:
                        pid = f.read().strip()
                        if self.pid_check(pid):
                            return pid
                except IOError:
                    pass

        return False

    def pid_check(self, pid):
        try:
            process = processes.Process.from_pid(pid)
        except IOError:
            # Couldn't open the proc's files. Returning False
            return False
        
        if process.status_fields['Name'] in self.proc_names:
            return True

        return False

    def get_pid_cache(self):
        try:
            with open(self.pid_cache_file, 'r') as f:
                return f.read()
        except IOError:
            return False

    def put_pid_cache(self, pid):
        with open(self.pid_cache_file, 'w') as f:
            return f.write(pid)

    def get_data(self):
        return self._get_raw_data()

    def check(self):
        return bool(self.get_data())