| Server IP : 61.19.30.66 / Your IP : 216.73.216.15 Web Server : Apache/2.2.22 (Ubuntu) System : Linux klw 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 User : www-data ( 33) PHP Version : 5.3.10-1ubuntu3.48 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /usr/share/pyshared/landscape/monitor/ |
Upload File : |
import subprocess
from landscape.diff import diff
from landscape.lib.process import ProcessInformation
from landscape.lib.jiffies import detect_jiffies
from landscape.monitor.plugin import DataWatcher
class ActiveProcessInfo(DataWatcher):
message_type = "active-process-info"
def __init__(self, proc_dir="/proc", boot_time=None, jiffies=None,
uptime=None, popen=subprocess.Popen):
super(ActiveProcessInfo, self).__init__()
self._proc_dir = proc_dir
self._persist_processes = {}
self._previous_processes = {}
self._jiffies_per_sec = jiffies or detect_jiffies()
self._popen = popen
self._first_run = True
self._process_info = ProcessInformation(proc_dir=proc_dir,
jiffies=jiffies,
boot_time=boot_time,
uptime=uptime)
def register(self, manager):
super(ActiveProcessInfo, self).register(manager)
self.call_on_accepted(self.message_type, self.exchange, True)
self.registry.reactor.call_on("resynchronize", self._resynchronize)
def _resynchronize(self):
"""Resynchronize active process data."""
self._first_run = True
self._persist_processes = {}
self._previous_processes = {}
def get_message(self):
message = {}
if self._first_run:
message["kill-all-processes"] = True
message.update(self._detect_process_changes())
if message:
message["type"] = "active-process-info"
return message
return None
def persist_data(self):
self._first_run = False
self._persist_processes = self._previous_processes
self._previous_processes = {}
# This forces the registry to write the persistent store to disk
# This means that the persistent data reflects the state of the
# messages sent.
self.registry.flush()
def _get_processes(self):
processes = {}
for process_info in self._process_info.get_all_process_info():
if process_info["state"] != "X":
processes[process_info["pid"]] = process_info
return processes
def _detect_process_changes(self):
changes = {}
processes = self._get_processes()
creates, updates, deletes = diff(self._persist_processes, processes)
if creates:
changes["add-processes"] = list(creates.itervalues())
if updates:
changes["update-processes"] = list(updates.itervalues())
if deletes:
changes["kill-processes"] = list(deletes.iterkeys())
# Update cached values for use on the next run.
self._previous_processes = processes
return changes