Server : Apache/2.4.18 (Ubuntu) System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64 User : oppastar ( 1041) PHP Version : 7.0.33-0ubuntu0.16.04.15 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,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, Directory : /usr/lib/python2.7/dist-packages/landscape/manager/ |
Upload File : |
import os import signal import logging from datetime import datetime from landscape.lib.process import ProcessInformation from landscape.manager.plugin import ManagerPlugin class ProcessNotFoundError(Exception): pass class ProcessMismatchError(Exception): pass class SignalProcessError(Exception): pass class ProcessKiller(ManagerPlugin): """ A management plugin that signals processes upon receiving a message from the server. """ def __init__(self, process_info=None): if process_info is None: process_info = ProcessInformation() self.process_info = process_info def register(self, registry): super(ProcessKiller, self).register(registry) registry.register_message("signal-process", self._handle_signal_process) def _handle_signal_process(self, message): self.call_with_operation_result(message, self.signal_process, message["pid"], message["name"], message["start-time"], message["signal"]) def signal_process(self, pid, name, start_time, signame): logging.info("Sending %s signal to the process with PID %d.", signame, pid) process_info = self.process_info.get_process_info(pid) if not process_info: start_time = datetime.utcfromtimestamp(start_time) message = ("The process %s with PID %d that started at %s UTC was " "not found") % (name, pid, start_time) raise ProcessNotFoundError(message) elif abs(process_info["start-time"] - start_time) > 2: # We don't check that the start time matches precisely because # the way we obtain boot times isn't very precise, and this may # cascade into having imprecise process start times. expected_time = datetime.utcfromtimestamp(start_time) actual_time = datetime.utcfromtimestamp(process_info["start-time"]) message = ("The process %s with PID %d that started at " "%s UTC was not found. A process with the same " "PID that started at %s UTC was found and not " "sent the %s signal") % (name, pid, expected_time, actual_time, signame) raise ProcessMismatchError(message) signum = getattr(signal, "SIG%s" % (signame,)) try: os.kill(pid, signum) except: # XXX Nothing is indicating what the problem was. message = ("Attempting to send the %s signal to the process " "%s with PID %d failed") % (signame, name, pid) raise SignalProcessError(message)