[tor-commits] [bridgedb/master] Add service status check

phw at torproject.org phw at torproject.org
Wed May 27 17:14:43 UTC 2020


commit 2ae19e5c25dca6acdb0307c147dc93f73e257f7e
Author: hiro <hiro at torproject.org>
Date:   Mon Oct 21 19:54:50 2019 +0200

    Add service status check
---
 scripts/check_status | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 137 insertions(+)

diff --git a/scripts/check_status b/scripts/check_status
new file mode 100644
index 0000000..8f8f3e5
--- /dev/null
+++ b/scripts/check_status
@@ -0,0 +1,137 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# This file is part of  BridgeDB, a Tor bridge distribution system.
+#
+# :authors: hiro <hiro at torproject.org>
+#           see also AUTHORS file
+#
+# :license: This is Free Software. See LICENSE for license information.
+
+import sys
+import smtplib
+import time
+import imaplib
+import email
+import time
+
+# Standard Nagios return codes
+OK, WARNING, CRITICAL, UNKNOWN = range(4)
+
+ORG_EMAIL   = "@gmail.com"
+FROM_EMAIL  = "test.bridges.browser" + ORG_EMAIL
+SMTP_SERVER = "imap.gmail.com"
+SMTP_PORT   = 993
+
+MESSAGE_FROM = "bridges at torproject.org"
+MESSAGE_SUBJECT = "Bridges"
+MESSAGE_BODY = ":443"
+
+STATUS_FILE = "/srv/bridgedb.torproject.org/check/status"
+
+# -------------------------------------------------
+#
+# Utility to read email from Gmail Using Python
+#
+# ------------------------------------------------
+
+def test_email_from_gmail(password):
+    try:
+        mail = imaplib.IMAP4_SSL(SMTP_SERVER)
+        mail.login(FROM_EMAIL, password)
+        mail.select('INBOX')
+
+        type, data = mail.search(None, 'ALL')
+        mail_ids = data[0]
+
+        id_list = mail_ids.split()
+        first_email_id = int(str(id_list[0], 'utf-8'))
+        latest_email_id = int(str(id_list[-1], 'utf-8'))
+
+        for i in range(int(latest_email_id), int(first_email_id), -1):
+            typ, data = mail.fetch(str(i), '(RFC822)')
+
+            for response_part in data:
+                if isinstance(response_part, tuple):
+                    m = str(response_part[1], 'utf-8')
+                    msg = email.message_from_string(m)
+                    email_subject = "{}".format(msg['subject'])
+                    email_from = "{}".format(msg['from'])
+                    email_body = "{}".format(msg.as_string())
+
+                    if (MESSAGE_FROM == email_from) and (MESSAGE_SUBJECT == email_subject) and (MESSAGE_BODY in email_body):
+                        mail.store(str(i), '+FLAGS', '\\Deleted')
+                        mail.close()
+                        return OK, "Bridgedb is good and sending emails with working bridges"
+                    else:
+                        mail.store(str(i), '+FLAGS', '\\Deleted')
+
+        mail.close()
+        return WARNING, "No emails from gettor found"
+
+    except Exception as e:
+        return CRITICAL, str(e)
+
+def send_email_from_gmail(password):
+    sent_from = FROM_EMAIL
+    sent_to = ["{}".format(MESSAGE_FROM)]
+    subject = 'Bridges'
+    body = 'get bridges'
+
+    email_text = """From: %s\nTo: %s\nSubject: %s\n\n%s""" % (sent_from, ", ".join(sent_to), subject, body)
+
+    try:
+        mail = smtplib.SMTP_SSL('smtp.gmail.com', 465)
+        mail.ehlo()
+        mail.login(sent_from, password)
+        mail.sendmail(sent_from, sent_to, email_text)
+        mail.close()
+        return OK, "Test email sent"
+    except Exception as e:
+        return UNKNOWN, str(e)
+
+        if __name__ == "__main__":
+            status, message = None, None
+
+            if len(sys.argv) == 2:
+                password = sys.argv[1]
+            else:
+                password = "yourPassword"
+
+            status_file = open(STATUS_FILE, 'r')
+            message = status_file.read()
+            status_file.close()
+
+            try:
+                status, message = send_email_from_gmail(password)
+            except Exception as e:
+                status = UNKNOWN
+                message = repr(e)
+                status_file = open(STATUS_FILE,'w')
+                status_file.write("UNKNOWN\n3: %s" % message)
+                status_file.close()
+
+            time.sleep(600)
+
+            try:
+                status, message = test_email_from_gmail(password)
+            except KeyboardInterrupt:
+                status, message = CRITICAL, "Caught Control-C..."
+            except Exception as e:
+                status = CRITICAL
+                message = repr(e)
+            finally:
+                status_file = open(STATUS_FILE,'w')
+                if status == OK:
+                    status_file.write("OK\n0: %s" % message)
+                elif status == WARNING:
+                    status_file.write("WARNING\n1: %s" % message)
+                elif status == CRITICAL:
+                    status_file.write("CRITICAL\n2: %s" % message)
+                else:
+                    status_file.write("UNKNOWN\n3: %s" % message)
+                    status = UNKNOWN
+
+                status_file.close()
+
+                sys.exit(status)





More information about the tor-commits mailing list