예제 #1
0
    def connect(self):
        """Connects to the XMPP server"""
        try:
            self.jid = xmpp.protocol.JID(self.config['jid'])
        except KeyError:
            raise ConfigurationError('Jabber config is missing "jid" entry')

        self.client = xmpp.Client(self.jid.getDomain())

        con = self.client.connect()

        if not con:
            raise DispatcherException('Could not connect to jabber server')

        _logger.debug('Connected with %s', con)

        try:
            auth = self.client.auth(self.jid.getNode(),
                                    self.config['password'],
                                    resource=self.jid.getResource()
                                    or 'alertengine')
        except KeyError:
            raise ConfigurationError(
                'Jabber config is missing "password" entry')

        if not auth:
            raise DispatcherException(
                'Could not authenticate with jabber server')

        self.client.RegisterHandler('presence', self.presence_handler)
        self.client.sendInitPresence()

        self.ready = True

        return self.client
예제 #2
0
    def send(self, address, alert, language='en'):
        """Send a message to Slack"""
        if self._is_still_backing_off_for(address.address):
            raise DispatcherException(
                "Refusing to send Slack alert until backoff period has expired"
            )

        params = {
            'text': alert.messages.get(language=language, type='sms').message,
            'username': self.username,
            'channel': self.channel,
            'icon_emoji': self.emoji
        }
        payload = json.dumps(params)
        if isinstance(payload, six.text_type):
            payload = payload.encode("utf-8")
        request = Request(address.address, payload,
                          {'Content-Type': 'application/json'})

        try:
            urlopen(request)
        except HTTPError as error:
            if error.code == HTTP_TOO_MANY_REQUESTS:
                self._register_failure_for(address.address)
                raise DispatcherException(
                    "Slack complained there were too many requests; need to back off"
                )
            else:
                raise
예제 #3
0
    def send(self,
             address,
             alert,
             language='en',
             retry=True,
             retry_reason=None):
        message = self.get_message(alert, language, 'jabber')

        if not self.client.isConnected():
            self.connect()

        try:
            ident = self.client.send(
                xmpp.protocol.Message(address.address, message, typ='chat'))
            _logger.debug('Sent message with jabber id %s', ident)
        except (xmpp.protocol.StreamError, IOError) as err:
            if retry:
                _logger.warning('Sending jabber message failed, retrying once')
                self.connect()
                self.send(address,
                          alert,
                          language,
                          retry=False,
                          retry_reason=err)
            else:
                raise DispatcherException(
                    ("Couldn't send message due to: '%s', reason for retry: "
                     "'%s'") % (err, retry_reason))
예제 #4
0
    def send(self, address, alert, language='en'):
        message = self.get_message(alert, language, 'email')

        # Extract the subject
        subject = message.splitlines(1)[0].lstrip('Subject:').strip()
        # Remove the subject line
        message = '\n'.join(message.splitlines()[1:])

        headers = {
            'X-NAV-alert-netbox': alert.netbox,
            'X-NAV-alert-device': alert.device,
            'X-NAV-alert-subsystem': alert.source,
        }

        try:
            if not address.DEBUG_MODE:
                email = EmailMessage(subject=subject,
                                     body=message,
                                     to=[address.address])
                email.send(fail_silently=False)
            else:
                _logger.debug(
                    'alert %d: In testing mode, would have sent '
                    'email to %s', alert.id, address.address)

        except SMTPException as err:
            msg = 'Could not send email: %s" ' % err
            if (isinstance(err, SMTPRecipientsRefused)
                    or (hasattr(err, "smtp_code")
                        and str(err.smtp_code).startswith('5'))):
                raise FatalDispatcherException(msg)

            # Reraise as DispatcherException so that we can catch it further up
            raise DispatcherException(msg)
예제 #5
0
파일: sms_dispatcher.py 프로젝트: hmpf/nav
    def send(self, address, alert, language='en'):
        if address.account.has_perm('alert_by', 'sms'):
            message = self.get_message(alert, language, 'sms')

            if not address.DEBUG_MODE:
                try:
                    SMSQueue.objects.create(
                        account=address.account,
                        message=message,
                        severity=alert.severity,
                        phone=address.address,
                    )
                except (DatabaseError, IntegrityError) as err:
                    raise DispatcherException("Couldn't add sms to queue: %s" %
                                              err)
            else:
                _logger.debug(
                    'alert %d: In testing mode, would have added '
                    'message to sms queue for user %s at %s',
                    alert.id,
                    address.account,
                    address.address,
                )
        else:
            _logger.warning('alert %d: %s does not have SMS privileges',
                            alert.id, address.account)
예제 #6
0
    def send(self, address, alert, language='en'):
        if address.account.has_perm('alert_by', 'sms'):
            message = self.get_message(alert, language, 'sms')

            if not address.DEBUG_MODE:
                try:
                    SMSQueue.objects.create(account=address.account,
                                            message=message,
                                            severity=alert.severity,
                                            phone=address.address)
                except [DatabaseError, IntegrityError], e:
                    raise DispatcherException("Could't add sms to queue: %s" %
                                              e)
            else:
                logger.debug(
                    'alert %d: In testing mode, would have added message to sms queue for user %s at %s'
                    % (alert.id, address.account, address.address))