Skip to content
Snippets Groups Projects
relay_check.py 1.72 KiB
Newer Older
#!/usr/bin/env python
# Copyright 2018-2020, Damian Johnson and The Tor Project
# See LICENSE for licensing information

"""
Health checks for your relay. This provides a simple email notification when
your relay becomes unavailable.
"""

import smtplib
import traceback

import stem
import stem.descriptor.remote

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

RELAY_ADDRESS = '208.113.135.162'
RELAY_OR_PORT = 1443
RELAY_NAME = 'caersidi'
RELAY_FINGERPRINT = '3BB34C63072D9D10E836EE42968713F7B9325F66'

EMAIL_ADDRESS = 'atagar@torproject.org'
RELAY_LINK = 'https://metrics.torproject.org/rs.html#details/%s' % RELAY_FINGERPRINT


def main():
  try:
    desc = stem.descriptor.remote.their_server_descriptor(
      endpoints = [stem.ORPort(RELAY_ADDRESS, RELAY_OR_PORT)],

    if desc.nickname != RELAY_NAME:
      raise ValueError('Unexpected descriptor:\n\n%s' % desc)
  except stem.SocketError:
    email('Unable to reach %s' % RELAY_NAME, "Unable to reach %s (%s):\n\n%s" % (RELAY_NAME, RELAY_LINK, traceback.format_exc()))


def email(subject, body):
  """
  Sends an email notification via the local mail application.

  :param str subject: email subject
  :param str body: email content

  :raises: **Exception** if the email fails to be sent
  """

  msg = MIMEMultipart('alternative')
  msg['Subject'] = subject
  msg['To'] = EMAIL_ADDRESS

  msg.attach(MIMEText(body, 'plain'))

  server = smtplib.SMTP('localhost')
  server.sendmail('no-rely@torproject.com', [EMAIL_ADDRESS], msg.as_string())
  server.quit()


if __name__ == '__main__':
  try:
    main()
  except:
    email('Health check error', "Unable to check the health of %s (%s):\n\n%s" % (RELAY_NAME, RELAY_LINK, traceback.format_exc()))