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
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
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))
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)
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)
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))