Beispiel #1
0
    def queue_event_update_config(self, p_hostname, p_config):

        event = admin_event.AdminEvent(
            p_event_type=admin_event.EVENT_TYPE_UPDATE_CONFIG,
            p_hostname=p_hostname,
            p_payload=p_config)
        self.queue_event(p_event=event, p_is_action=True)
Beispiel #2
0
    def queue_event_speak(self, p_hostname, p_username, p_text):

        event = admin_event.AdminEvent(
            p_event_type=admin_event.EVENT_TYPE_SPEAK,
            p_hostname=p_hostname,
            p_username=p_username,
            p_text=p_text)
        self.queue_event(p_event=event, p_is_action=True)
Beispiel #3
0
    def queue_event_historic_process_start(self, p_pinfo):

        event = admin_event.AdminEvent(
            p_event_type=admin_event.EVENT_TYPE_PROCESS_START,
            p_hostname=p_pinfo.hostname,
            p_pid=p_pinfo.pid,
            p_username=p_pinfo.username,
            p_process_start_time=p_pinfo.start_time)
        self.queue_event(p_event=event, p_is_action=True)
Beispiel #4
0
 def create_admin_event_process_downtime_from_pinfo(p_pinfo):
     return admin_event.AdminEvent(
         p_event_type=admin_event.EVENT_TYPE_PROCESS_DOWNTIME,
         p_hostname=p_pinfo.hostname,
         p_username=p_pinfo.username,
         p_processhandler=p_pinfo.processhandler,
         p_process_start_time=p_pinfo.start_time,
         p_downtime=p_pinfo.downtime,
         p_pid=p_pinfo.pid)
Beispiel #5
0
    def queue_event_kill_process(self, p_hostname, p_username,
                                 p_processhandler, p_pid,
                                 p_process_start_time):

        event = admin_event.AdminEvent(
            p_event_type=admin_event.EVENT_TYPE_KILL_PROCESS,
            p_hostname=p_hostname,
            p_username=p_username,
            p_processhandler=p_processhandler,
            p_pid=p_pid,
            p_process_start_time=p_process_start_time)
        self.queue_event(p_event=event, p_is_action=True)
Beispiel #6
0
    def create_admin_event_process_end_from_pinfo(p_pinfo,
                                                  p_reference_time=None):
        if p_reference_time is None:
            p_reference_time = datetime.datetime.now()

        return admin_event.AdminEvent(
            p_event_type=admin_event.EVENT_TYPE_PROCESS_END,
            p_hostname=p_pinfo.hostname,
            p_username=p_pinfo.username,
            p_processhandler=p_pinfo.processhandler,
            p_process_start_time=p_pinfo.start_time,
            p_event_time=p_reference_time,
            p_pid=p_pinfo.pid)
    def scan_processes(self, p_reference_time, p_uid_map, p_host_name,
                       p_process_regex_map):

        current_device_infos = {}
        events = []

        for device_config in self._client_device_configs.values():
            device_is_up = self.ping_device(
                p_client_device_config=device_config)

            if device_is_up:
                current_device_infos[device_config.hostname] = device_config

            else:
                if device_config.hostname in self._process_info_candidates:
                    del (self._process_info_candidates[device_config.hostname])

        for hostname, device_config in current_device_infos.items():
            current_pinfo = self.get_current_active_pinfo(hostname)

            if current_pinfo is None:
                if hostname in self._process_info_candidates:
                    event = self._process_info_candidates[hostname]

                    uptime = (p_reference_time -
                              event.process_start_time).total_seconds()

                    if uptime > device_config.min_activity_duration:
                        events.append(event)
                        del (self._process_info_candidates[hostname])

                else:
                    event = admin_event.AdminEvent(
                        p_event_type=admin_event.EVENT_TYPE_PROCESS_START,
                        p_hostname=hostname,
                        p_processhandler=self.id,
                        p_username=device_config.username,
                        p_process_start_time=p_reference_time)
                    self._process_info_candidates[hostname] = event

        for pinfo in self._process_infos.values():
            # If the end time of a current entry is None AND the process was started on the local host AND
            # the process is no longer running THEN send an EVENT_TYPE_PROCESS_END event!
            if pinfo.end_time is None and pinfo.hostname not in current_device_infos:
                event = self.create_admin_event_process_end_from_pinfo(
                    p_pinfo=pinfo, p_reference_time=p_reference_time)
                events.append(event)

        return events
    def test_log_admin_event(self):

        a_persistence = self.create_dummy_persistence(self._logger)

        self.assertIsNotNone(a_persistence)

        an_admin_event = admin_event.AdminEvent(
            p_hostname=test_data.HOSTNAME_1,
            p_username=test_data.USER_1,
            p_pid=test_data.PID_1,
            p_processhandler=None,
            p_processname=None,
            p_event_type=None,
            p_event_time=None,
            p_process_start_time=test_data.START_TIME_NOW,
            p_text=None,
            p_payload=None)

        a_persistence.log_admin_event(p_admin_event=an_admin_event)

        a_persistence = None
    def scan_processes(self, p_session_context, p_reference_time, p_server_group, p_login_mapping, p_host_name,
                       p_process_regex_map):

        events = []

        with persistence.SessionContext(p_persistence=self._persistence) as session_context:

            for device in self._persistence.devices(p_session_context):
                self.ping_device(p_reference_time=p_reference_time, p_device=device)

            for device_info in self._device_infos.values():
                if device_info.device_name not in self._persistence.device_map(session_context):
                    # Clear statistics for old device names so that they are correctly reported in Prometheus
                    device_info.clear_moving_average()

            for device in self._persistence.devices(session_context):
                device_info = self.get_device_info(p_device_name=device.device_name)

                if device_info.requires_process_start_event(p_reference_time=p_reference_time):
                    # Send process start event for monitored users (if required)
                    for user2device in device.users:
                        current_pinfo = self.get_current_active_pinfo(device.hostname, p_username=user2device.user.username)

                        if user2device.active:
                            if current_pinfo is None:
                                event = admin_event.AdminEvent(
                                    p_event_type=admin_event.EVENT_TYPE_PROCESS_START,
                                    p_hostname=device_info.hostname,
                                    p_hostlabel=device_info.device_name,
                                    p_processhandler=self.id,
                                    p_username=user2device.user.username,
                                    p_percent=user2device.percent,
                                    p_process_start_time=p_reference_time)
                                events.append(event)

                        else:
                            if current_pinfo is not None:
                                event = self.create_admin_event_process_end_from_pinfo(
                                    p_pinfo=current_pinfo,
                                    p_reference_time=p_reference_time)
                                events.append(event)


                else:
                    # Send process stop event for non monitored users (if required)
                    for user2device in device.users:
                        current_pinfo = self.get_current_active_pinfo(device.hostname, p_username=user2device.user.username)

                        if current_pinfo is not None:
                            event = self.create_admin_event_process_end_from_pinfo(
                                p_pinfo=current_pinfo,
                                p_reference_time=p_reference_time)
                            events.append(event)

            active_hostnames = [device_info.hostname for device_info in self._device_infos.values() if device_info.is_up]

            for pinfo in self._process_infos.values():
                # If the end time of a current entry is None AND the process was started on the local host AND
                # the process is no longer running THEN send an EVENT_TYPE_PROCESS_END event!
                if pinfo.end_time is None and pinfo.hostname not in active_hostnames:
                    event = self.create_admin_event_process_end_from_pinfo(
                        p_pinfo=pinfo,
                        p_reference_time=p_reference_time)
                    events.append(event)

        return events
Beispiel #10
0
    def scan_processes(self, p_reference_time, p_uid_map, p_host_name,
                       p_process_regex_map):

        current_processes = {}
        events = []

        fmt = "Scanning processes..."
        self._logger.debug(fmt)

        for proc in self._process_iterator_factory.process_iter(
        ):  # attrs=['pid', 'name', 'username', 'create_time']
            try:
                uids = proc.uids()

                if uids.real in p_uid_map:
                    username = p_uid_map[uids.real]
                    proc_name = proc.name()

                    if p_process_regex_map[username].match(proc_name):
                        start_time = datetime.datetime.fromtimestamp(
                            proc.create_time(),
                            datetime.timezone.utc).astimezone().replace(
                                tzinfo=None)
                        key = process_info.get_key(p_hostname=p_host_name,
                                                   p_pid=proc.pid,
                                                   p_start_time=start_time)
                        current_processes[key] = 1

                        if key in self._process_infos:
                            pinfo = self._process_infos[key]

                            if pinfo.end_time is not None:
                                event = self.create_admin_event_process_start_from_pinfo(
                                    p_pinfo=pinfo)
                                events.append(event)

                        else:
                            event = admin_event.AdminEvent(
                                p_event_type=admin_event.
                                EVENT_TYPE_PROCESS_START,
                                p_hostname=p_host_name,
                                p_processhandler=self.id,
                                p_username=p_uid_map[uids.real],
                                p_processname=proc.name(),
                                p_process_start_time=start_time,
                                p_pid=proc.pid)
                            events.append(event)

            except psutil.NoSuchProcess as e:
                fmt = "Ignoring exception '{estr}' because process has disappeared"
                self._logger.debug(fmt.format(estr=str(e)))

        for (key, pinfo) in self._process_infos.items():
            # If the end time of a current entry is None AND the process was started on the local host AND
            # the process is no longer running THEN send an EVENT_TYPE_PROCESS_END event!
            if pinfo.end_time is None and pinfo.hostname == p_host_name and key not in current_processes:
                event = self.create_admin_event_process_end_from_pinfo(
                    p_pinfo=pinfo, p_reference_time=p_reference_time)
                events.append(event)

        return events
Beispiel #11
0
    def queue_event_start_client(self):

        event = admin_event.AdminEvent(
            p_event_type=admin_event.EVENT_TYPE_START_CLIENT,
            p_hostname=self._host_name)
        self.queue_event(p_event=event, p_to_master=True)