def patch_data(self):  # pragma: no cover
        """
        Display QDialog for patch

        """

        notes_dialog = EditQDialog()
        notes_dialog.initialize(
            _('Edit Host Notes'),
            self.host_item.data['notes']
        )

        if notes_dialog.exec_() == EditQDialog.Accepted:
            data = {'notes': str(notes_dialog.text_edit.toPlainText())}
            headers = {'If-Match': self.host_item.data['_etag']}
            endpoint = '/'.join(['host', self.host_item.item_id])

            patched = app_backend.patch(endpoint, data, headers)

            if patched:
                data_manager.update_item_data(
                    self.host_item.item_type,
                    self.host_item.item_id,
                    {'notes': notes_dialog.text_edit.toPlainText()}
                )
                self.labels['notes'].setText(notes_dialog.text_edit.toPlainText())
                message = _(
                    _("Host notes have been edited.")
                )
                send_event('INFO', message)
            else:
                send_event(
                    'ERROR',
                    _("Backend PATCH failed, please check your logs !")
                )
    def daemon_is_problem(daemon_item):
        """
        Check Daemon Refresh and if daemon is alive. Send a message if needed

        :param daemon_item: Daemon item
        :type daemon_item: alignak_app.items.daemon.Daemon
        :return: if daemon is a problem True, else False
        :rtype: bool
        """

        is_problem = False

        actual_freshness = get_diff_since_last_timestamp(
            daemon_item.data['last_check'], 'minutes')
        freshness = settings.get_config('Alignak-app', 'daemons_freshness')
        if int(actual_freshness) > int(freshness):
            send_event(
                'CRITICAL' if 'arbiter' in daemon_item.name else 'WARNING',
                _('Freshness expired for %s') % daemon_item.name,
                timer=True)
            is_problem = True
            logger.warning('Daemon freshness expired: %s(%dmn)',
                           daemon_item.name, actual_freshness)

        if not daemon_item.data['alive']:
            send_event(
                'CRITICAL' if 'arbiter' in daemon_item.name else 'WARNING',
                _('Daemon %s is dead !') % daemon_item.name,
                timer=True)
            logger.warning('Daemon %s is dead...', daemon_item.name)
            is_problem = True

        return is_problem
    def patch_host_checks(self, check_type, state):  # pragma: no cover
        """
        Patch the host check: 'active_checks_enabled' | 'passive_checks_enabled'

        :param check_type: type of check: 'active_checks_enabled' | 'passive_checks_enabled'
        :type check_type: str
        :param state: state of Toggle button
        :type state: bool
        """

        data = {check_type: state}
        headers = {'If-Match': self.host_item.data['_etag']}
        endpoint = '/'.join([self.host_item.item_type, self.host_item.item_id])

        patched = app_backend.patch(endpoint, data, headers)

        if patched:
            self.host_item.data[check_type] = state
            data_manager.update_item_data(
                self.host_item.item_type, self.host_item.item_id, self.host_item.data
            )
            enabled = _('enabled') if state else _('disabled')
            event_type = 'OK' if state else 'WARN'
            message = _(
                _('%s %s for %s' %
                  (Item.get_check_text(check_type), enabled, self.host_item.get_display_name()))
            )
            send_event(event_type, message, timer=True)
        else:
            send_event(
                'ERROR',
                _("Backend PATCH failed, please check your logs !")
            )
    def patch_host_checks(self, check_type, state):  # pragma: no cover
        """
        Patch the host check: 'active_checks_enabled' | 'passive_checks_enabled'

        :param check_type: type of check: 'active_checks_enabled' | 'passive_checks_enabled'
        :type check_type: str
        :param state: state of Toggle button
        :type state: bool
        """

        data = {check_type: state}
        headers = {'If-Match': self.host_item.data['_etag']}
        endpoint = '/'.join([self.host_item.item_type, self.host_item.item_id])

        patched = app_backend.patch(endpoint, data, headers)

        if patched:
            self.host_item.data[check_type] = state
            data_manager.update_item_data(self.host_item.item_type,
                                          self.host_item.item_id,
                                          self.host_item.data)
            enabled = _('enabled') if state else _('disabled')
            event_type = 'OK' if state else 'WARN'
            message = _(
                _('%s %s for %s' % (Item.get_check_text(check_type), enabled,
                                    self.host_item.get_display_name())))
            send_event(event_type, message, timer=True)
        else:
            send_event('ERROR',
                       _("Backend PATCH failed, please check your logs !"))
    def patch_data(self):  # pragma: no cover
        """
        Display QDialog for patch

        """

        notes_dialog = EditQDialog()
        notes_dialog.initialize(_('Edit Host Notes'),
                                self.host_item.data['notes'])

        if notes_dialog.exec_() == EditQDialog.Accepted:
            data = {'notes': str(notes_dialog.text_edit.toPlainText())}
            headers = {'If-Match': self.host_item.data['_etag']}
            endpoint = '/'.join(['host', self.host_item.item_id])

            patched = app_backend.patch(endpoint, data, headers)

            if patched:
                data_manager.update_item_data(
                    self.host_item.item_type, self.host_item.item_id,
                    {'notes': notes_dialog.text_edit.toPlainText()})
                self.labels['notes'].setText(
                    notes_dialog.text_edit.toPlainText())
                message = _(_("Host notes have been edited."))
                send_event('INFO', message)
            else:
                send_event('ERROR',
                           _("Backend PATCH failed, please check your logs !"))
    def daemon_is_problem(daemon_item):
        """
        Check Daemon Refresh and if daemon is alive. Send a message if needed

        :param daemon_item: Daemon item
        :type daemon_item: alignak_app.items.daemon.Daemon
        :return: if daemon is a problem True, else False
        :rtype: bool
        """

        is_problem = False

        actual_freshness = get_diff_since_last_timestamp(
            daemon_item.data['last_check'], 'minutes'
        )
        freshness = settings.get_config('Alignak-app', 'daemons_freshness')
        if int(actual_freshness) > int(freshness):
            send_event(
                'CRITICAL' if 'arbiter' in daemon_item.name else 'WARNING',
                _('Freshness expired for %s') % daemon_item.name,
                timer=True
            )
            is_problem = True
            logger.warning('Daemon freshness expired: %s(%dmn)', daemon_item.name, actual_freshness)

        if not daemon_item.data['alive']:
            send_event(
                'CRITICAL' if 'arbiter' in daemon_item.name else 'WARNING',
                _('Daemon %s is dead !') % daemon_item.name,
                timer=True
            )
            logger.warning('Daemon %s is dead...', daemon_item.name)
            is_problem = True

        return is_problem
Esempio n. 7
0
    def reload_configuration():  # pragma: no cover
        """
        Reload configuration

        """

        logger.info('Reload configuration...')
        settings.init_config()
        settings.init_css()

        send_event('INFO', _('Configuration reloaded'), timer=True)
    def test_send_event(self):
        """Send Event by Access Function"""

        init_event_widget()
        under_test = get_events_widget()

        # Welcome message is here
        self.assertEqual(1, under_test.events_list.count())

        send_event('DOWN', 'message')

        # Event is sent
        self.assertEqual(2, under_test.events_list.count())
    def add_acknowledge(self):  # pragma: no cover
        """
        Create AckQDialog and manage acknowledge

        """

        # Initial comment
        user = data_manager.database['user']
        comment = _('%s %s acknowledged by %s, from Alignak-app') % (
            self.item.item_type.capitalize(), self.item.get_display_name(), user.name
        )

        # Acknowledge dialog
        ack_dialog = AckQDialog()
        ack_dialog.initialize(self.item.item_type, self.item.get_display_name(), comment)

        if ack_dialog.exec_() == AckQDialog.Accepted:
            sticky = ack_dialog.sticky_toggle_btn.is_checked()
            notify = ack_dialog.notify_toggle_btn.is_checked()
            comment = str(ack_dialog.ack_comment_edit.toPlainText())

            post = app_backend.acknowledge(self.item, sticky, notify, comment)

            send_event(
                'ACK',
                _('Acknowledge for %s is %s') % (self.item.get_display_name(), post['_status'])
            )
            # Update Item
            data_manager.update_item_data(
                self.item.item_type,
                self.item.item_id,
                {'ls_acknowledged': True}
            )
            data_manager.remove_item(
                'problems',
                self.item.item_id
            )
            logger.debug('ACK answer for %s: %s', self.item.name, post)

            try:
                self.acknowledge_btn.setEnabled(False)
            except RuntimeError as e:
                logger.warning('Can\'t disable Acknowledge btn: %s', e)
        else:
            logger.info('Acknowledge for %s cancelled...', self.item.name)
    def add_downtime(self):  # pragma: no cover
        """
        Create DownQDialog and manage downtime

        """

        user = data_manager.database['user']

        comment = _('Schedule downtime on %s %s by %s, from Alignak-app') % (
            self.item.item_type.capitalize(), self.item.get_display_name(), user.name
        )

        downtime_dialog = DownQDialog()
        downtime_dialog.initialize(self.item.item_type, self.item.get_display_name(), comment)

        if downtime_dialog.exec_() == DownQDialog.Accepted:
            fixed = downtime_dialog.fixed_toggle_btn.is_checked()
            duration = downtime_dialog.duration_to_seconds()
            start_stamp = downtime_dialog.start_time.dateTime().toTime_t()
            end_stamp = downtime_dialog.end_time.dateTime().toTime_t()
            comment = downtime_dialog.comment_edit.toPlainText()

            post = app_backend.downtime(self.item, fixed, duration, start_stamp, end_stamp, comment)

            send_event(
                'DOWNTIME',
                _('Downtime for %s is %s') % (self.item.get_display_name(), post['_status'])
            )
            data_manager.update_item_data(
                self.item.item_type,
                self.item.item_id,
                {'ls_downtimed': True}
            )
            data_manager.remove_item(
                'problems',
                self.item.item_id
            )
            logger.debug('DOWNTIME answer for %s: %s', self.item.name, post)

            try:
                self.downtime_btn.setEnabled(False)
            except RuntimeError as e:
                logger.warning('Can\'t disable Downtime btn: %s', e)
        else:
            logger.info('Downtime for %s cancelled...', self.item.name)
Esempio n. 11
0
    def add_downtime(self):  # pragma: no cover
        """
        Create DownQDialog and manage downtime

        """

        user = data_manager.database['user']

        comment = _('Schedule downtime on %s %s by %s, from Alignak-app') % (
            self.item.item_type.capitalize(), self.item.get_display_name(),
            user.name)

        downtime_dialog = DownQDialog()
        downtime_dialog.initialize(self.item.item_type,
                                   self.item.get_display_name(), comment)

        if downtime_dialog.exec_() == DownQDialog.Accepted:
            fixed = downtime_dialog.fixed_toggle_btn.is_checked()
            duration = downtime_dialog.duration_to_seconds()
            start_stamp = downtime_dialog.start_time.dateTime().toTime_t()
            end_stamp = downtime_dialog.end_time.dateTime().toTime_t()
            comment = downtime_dialog.comment_edit.toPlainText()

            post = app_backend.downtime(self.item, fixed, duration,
                                        start_stamp, end_stamp, comment)

            send_event(
                'DOWNTIME',
                _('Downtime for %s is %s') %
                (self.item.get_display_name(), post['_status']))
            data_manager.update_item_data(self.item.item_type,
                                          self.item.item_id,
                                          {'ls_downtimed': True})
            data_manager.remove_item('problems', self.item.item_id)
            logger.debug('DOWNTIME answer for %s: %s', self.item.name, post)

            try:
                self.downtime_btn.setEnabled(False)
            except RuntimeError as e:
                logger.warning('Can\'t disable Downtime btn: %s', e)
        else:
            logger.info('Downtime for %s cancelled...', self.item.name)
Esempio n. 12
0
    def add_acknowledge(self):  # pragma: no cover
        """
        Create AckQDialog and manage acknowledge

        """

        # Initial comment
        user = data_manager.database['user']
        comment = _('%s %s acknowledged by %s, from Alignak-app') % (
            self.item.item_type.capitalize(), self.item.get_display_name(),
            user.name)

        # Acknowledge dialog
        ack_dialog = AckQDialog()
        ack_dialog.initialize(self.item.item_type,
                              self.item.get_display_name(), comment)

        if ack_dialog.exec_() == AckQDialog.Accepted:
            sticky = ack_dialog.sticky_toggle_btn.is_checked()
            notify = ack_dialog.notify_toggle_btn.is_checked()
            comment = str(ack_dialog.ack_comment_edit.toPlainText())

            post = app_backend.acknowledge(self.item, sticky, notify, comment)

            send_event(
                'ACK',
                _('Acknowledge for %s is %s') %
                (self.item.get_display_name(), post['_status']))
            # Update Item
            data_manager.update_item_data(self.item.item_type,
                                          self.item.item_id,
                                          {'ls_acknowledged': True})
            data_manager.remove_item('problems', self.item.item_id)
            logger.debug('ACK answer for %s: %s', self.item.name, post)

            try:
                self.acknowledge_btn.setEnabled(False)
            except RuntimeError as e:
                logger.warning('Can\'t disable Acknowledge btn: %s', e)
        else:
            logger.info('Acknowledge for %s cancelled...', self.item.name)
    def enable_notifications(self, notification_type, btn_state):  # pragma: no cover
        """
        Enable notification for the wanted type: hosts or services

        :param notification_type: type of notifications (host or service)
        :type notification_type: str
        :param btn_state: state of sender button
        :type btn_state: bool
        """

        notification_enabled = btn_state

        data = {notification_type: notification_enabled}
        headers = {'If-Match': data_manager.database['user'].data['_etag']}
        endpoint = '/'.join(['user', data_manager.database['user'].item_id])

        patched = app_backend.patch(endpoint, data, headers)

        if patched:
            data_manager.database['user'].update_data(notification_type, notification_enabled)
            enabled = _('enabled') if notification_enabled else _('disabled')
            event_type = 'OK' if notification_enabled else 'WARN'
            message = _("Notifications for %ss are %s") % (
                notification_type.replace('_notifications_enabled', ''),
                enabled
            )
            if 'host' in notification_type:
                self.hostnotif_toggle_btn.update_btn_state(btn_state)
            else:
                self.servicenotif_toggle_btn.update_btn_state(btn_state)
            send_event(event_type, message, timer=True)
        else:
            send_event(
                'ERROR',
                _("Backend PATCH failed, if problem persist, please check your logs !")
            )
    def patch_data(self, patch_type):  # pragma: no cover
        """
        Display QDialogs for patches

        :param patch_type: type of patch ("notes" or "password")
        :type patch_type: str
        """

        if "notes" in patch_type or 'email' in patch_type:
            if 'email' in patch_type:
                edit_dialog = ValidatorQDialog()
                edit_dialog.initialize(
                    _('Edit %s') % patch_type,
                    data_manager.database['user'].data[patch_type],
                    r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+.+$)"
                )
            else:
                edit_dialog = EditQDialog()
                edit_dialog.initialize(
                    _('Edit User %s') % patch_type,
                    data_manager.database['user'].data[patch_type]
                )
            if edit_dialog.exec_() == EditQDialog.Accepted:
                if 'email' in patch_type:
                    text = edit_dialog.line_edit.text()
                else:
                    text = edit_dialog.text_edit.toPlainText()

                data = {patch_type: text}
                headers = {'If-Match': data_manager.database['user'].data['_etag']}
                endpoint = '/'.join(['user', data_manager.database['user'].item_id])

                patched = app_backend.patch(endpoint, data, headers)

                if patched:
                    data_manager.database['user'].update_data(patch_type, text)
                    self.labels[patch_type].setText(text)
                    send_event('INFO', _("Your %s have been edited.") % patch_type)
                else:
                    send_event(
                        'ERROR',
                        _("Backend PATCH failed, please check your logs !")
                    )
        elif "password" in patch_type:
            pass_dialog = PasswordQDialog()
            pass_dialog.initialize()

            if pass_dialog.exec_() == PasswordQDialog.Accepted:
                new_password = pass_dialog.pass_edit.text()

                data = {'password': str(new_password)}
                headers = {'If-Match': data_manager.database['user'].data['_etag']}
                endpoint = '/'.join(['user', data_manager.database['user'].item_id])

                patched = app_backend.patch(endpoint, data, headers)

                if patched:
                    message = _("Your password has been updated !")
                    send_event('OK', message)
                else:
                    send_event(
                        'ERROR', _("Backend PATCH failed, please check your logs !")
                    )
        else:
            logger.error("Wrong sender in UserQWidget.patch_data() !")