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 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 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 query_history(self, hostname=None, host_id=None):
        """
        Launch request on "history" endpoint but only for hosts in "data_manager"

        :param hostname: name of host we want history
        :type hostname: str
        :param host_id: id of host for history
        :type host_id: str
        """

        request_model = History.get_request_model()

        if hostname and host_id:
            request_model['params']['where'] = json.dumps({'host': host_id})
            request_model['params']['max_results'] = 25

            request = self.get(request_model['endpoint'],
                               request_model['params'],
                               request_model['projection'],
                               all_items=False)

            if request:
                logger.debug('Add / Update history for %s (%s)', hostname,
                             host_id)
                if data_manager.get_item('history', host_id):
                    data_manager.update_item_data('history', host_id,
                                                  request['_items'])
                else:
                    host_history = History()

                    host_history.create(
                        host_id,
                        request['_items'],
                        hostname,
                    )
                    data_manager.database['history'].append(host_history)
        else:  # pragma: no cover, too long to test
            history_list = []
            for history in data_manager.database['history']:
                request_model['params']['where'] = json.dumps(
                    {'host': history.item_id})
                request_model['params']['max_results'] = 25

                request = self.get(request_model['endpoint'],
                                   request_model['params'],
                                   request_model['projection'],
                                   all_items=False)

                if request:
                    host_history = History()

                    host_history.create(
                        history.item_id,
                        request['_items'],
                        history.name,
                    )
                    history_list.append(host_history)

            if history_list:
                data_manager.update_database('history', history_list)
    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 query_services(self, host_id=None):
        """
        Launch request for "service" endpoint. If ``host_id`` is given, only services related to
        host are added / updated

        :param host_id: "_id" of host
        :type host_id: str
        """

        request_model = Service.get_request_model(host_id)

        request = self.get(request_model['endpoint'],
                           request_model['params'],
                           request_model['projection'],
                           all_items=True)

        if request:
            services_list = []
            for backend_item in request['_items']:
                service = Service()

                service.create(
                    backend_item['_id'],
                    backend_item,
                    backend_item['name'],
                )

                # Add / update only services of host "if host_id"
                if host_id:
                    if not data_manager.get_item('service', service.item_id):
                        logger.debug('Add item data in database[service]')
                        data_manager.database['service'].append(service)
                    else:
                        data_manager.update_item_data('service',
                                                      service.item_id,
                                                      service.data)

            # If not item ID, update all database
            if services_list and not host_id:
                data_manager.update_database('service', services_list)
            if host_id:
                host = data_manager.get_item('host', '_id', host_id)
                if host:
                    logger.info('Update database[service] for %s', host.name)
            if 'OK' in request['_status']:
                data_manager.db_is_ready[request_model['endpoint']] = True
    def query_services(self, host_id=None):
        """
        Launch request for "service" endpoint. If ``host_id`` is given, only services related to
        host are added / updated

        :param host_id: "_id" of host
        :type host_id: str
        """

        request_model = Service.get_request_model(host_id)

        request = self.get(
            request_model['endpoint'],
            request_model['params'],
            request_model['projection'],
            all_items=True
        )

        if request:
            services_list = []
            for backend_item in request['_items']:
                service = Service()

                service.create(
                    backend_item['_id'],
                    backend_item,
                    backend_item['name'],
                )

                # Add / update only services of host "if host_id"
                if host_id:
                    if not data_manager.get_item('service', service.item_id):
                        logger.debug('Add item data in database[service]')
                        data_manager.database['service'].append(service)
                    else:
                        data_manager.update_item_data('service', service.item_id, service.data)

            # If not item ID, update all database
            if services_list and not host_id:
                data_manager.update_database('service', services_list)
            if host_id:
                host = data_manager.get_item('host', '_id', host_id)
                if host:
                    logger.info('Update database[service] for %s', host.name)
            if 'OK' in request['_status']:
                data_manager.db_is_ready[request_model['endpoint']] = True
    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)
    def query_services_problems(self, state):
        """
        Launch requests on "service" endpoint to get items with "ls_state = state"

        Wanted states are: ``WARNING``, ``CRITICAL`` and ``UNKNOWN``

        :param state: state of service
        :type state: str
        """

        # Services
        services_projection = [
            'name', 'host', 'alias', 'ls_state', 'ls_output',
            'ls_acknowledged', 'ls_downtimed', 'passive_checks_enabled',
            'active_checks_enabled'
        ]

        params = {
            'where': json.dumps({
                '_is_template': False,
                'ls_state': state
            })
        }
        request = self.get('service',
                           params,
                           services_projection,
                           all_items=True)

        if request:
            for backend_item in request['_items']:
                if data_manager.is_problem('service', backend_item):
                    service = Service()
                    service.create(backend_item['_id'], backend_item,
                                   backend_item['name'])

                    if data_manager.get_item('problems', service.item_id):
                        data_manager.update_item_data('problems',
                                                      service.item_id,
                                                      service.data)
                    else:
                        data_manager.database['problems'].append(service)
            # Problems state is ready
            data_manager.db_is_ready['problems'][state] = True
            logger.info("Update database[problems] for %s services...", state)
Exemplo 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)
Exemplo 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 query_services_problems(self, state):
        """
        Launch requests on "service" endpoint to get items with "ls_state = state"

        Wanted states are: ``WARNING``, ``CRITICAL`` and ``UNKNOWN``

        :param state: state of service
        :type state: str
        """

        # Services
        services_projection = [
            'name', 'host', 'alias', 'ls_state', 'ls_output', 'ls_acknowledged', 'ls_downtimed',
            'passive_checks_enabled', 'active_checks_enabled'
        ]

        params = {'where': json.dumps({'_is_template': False, 'ls_state': state})}
        request = self.get(
            'service',
            params,
            services_projection,
            all_items=True
        )

        if request:
            for backend_item in request['_items']:
                if data_manager.is_problem('service', backend_item):
                    service = Service()
                    service.create(
                        backend_item['_id'],
                        backend_item,
                        backend_item['name']
                    )

                    if data_manager.get_item('problems', service.item_id):
                        data_manager.update_item_data('problems', service.item_id, service.data)
                    else:
                        data_manager.database['problems'].append(service)
            # Problems state is ready
            data_manager.db_is_ready['problems'][state] = True
            logger.info("Update database[problems] for %s services...", state)
    def query_hosts(self):
        """
        Launch request on "host" endpoint, add hosts in problems if needed

        """

        request_model = Host.get_request_model()

        request = self.get(
            request_model['endpoint'],
            request_model['params'],
            request_model['projection'],
            all_items=True
        )

        if request:
            hosts_list = []
            for backend_item in request['_items']:
                host = Host()

                host.create(
                    backend_item['_id'],
                    backend_item,
                    backend_item['name'],
                )
                hosts_list.append(host)

                # If host is a problem, add / update it
                if data_manager.is_problem('host', backend_item):
                    if data_manager.get_item('problems', host.item_id):
                        data_manager.update_item_data('problems', host.item_id, host.data)
                    else:
                        data_manager.database['problems'].append(host)

            data_manager.db_is_ready['problems']['host'] = True

            if hosts_list:
                data_manager.update_database('host', hosts_list)
            if 'OK' in request['_status']:
                data_manager.db_is_ready[request_model['endpoint']] = True
    def query_hosts(self):
        """
        Launch request on "host" endpoint, add hosts in problems if needed

        """

        request_model = Host.get_request_model()

        request = self.get(request_model['endpoint'],
                           request_model['params'],
                           request_model['projection'],
                           all_items=True)

        if request:
            hosts_list = []
            for backend_item in request['_items']:
                host = Host()

                host.create(
                    backend_item['_id'],
                    backend_item,
                    backend_item['name'],
                )
                hosts_list.append(host)

                # If host is a problem, add / update it
                if data_manager.is_problem('host', backend_item):
                    if data_manager.get_item('problems', host.item_id):
                        data_manager.update_item_data('problems', host.item_id,
                                                      host.data)
                    else:
                        data_manager.database['problems'].append(host)

            data_manager.db_is_ready['problems']['host'] = True

            if hosts_list:
                data_manager.update_database('host', hosts_list)
            if 'OK' in request['_status']:
                data_manager.db_is_ready[request_model['endpoint']] = True
    def query_history(self, hostname=None, host_id=None):
        """
        Launch request on "history" endpoint but only for hosts in "data_manager"

        :param hostname: name of host we want history
        :type hostname: str
        :param host_id: id of host for history
        :type host_id: str
        """

        request_model = History.get_request_model()

        if hostname and host_id:
            request_model['params']['where'] = json.dumps({
                'host': host_id})
            request_model['params']['max_results'] = 25

            request = self.get(
                request_model['endpoint'],
                request_model['params'],
                request_model['projection'],
                all_items=False
            )

            if request:
                logger.debug('Add / Update history for %s (%s)', hostname, host_id)
                if data_manager.get_item('history', host_id):
                    data_manager.update_item_data('history', host_id, request['_items'])
                else:
                    host_history = History()

                    host_history.create(
                        host_id,
                        request['_items'],
                        hostname,
                    )
                    data_manager.database['history'].append(host_history)
        else:  # pragma: no cover, too long to test
            history_list = []
            for history in data_manager.database['history']:
                request_model['params']['where'] = json.dumps({
                    'host': history.item_id})
                request_model['params']['max_results'] = 25

                request = self.get(
                    request_model['endpoint'],
                    request_model['params'],
                    request_model['projection'],
                    all_items=False
                )

                if request:
                    host_history = History()

                    host_history.create(
                        history.item_id,
                        request['_items'],
                        history.name,
                    )
                    history_list.append(host_history)

            if history_list:
                data_manager.update_database('history', history_list)