summaryrefslogtreecommitdiff
path: root/emailcanary
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2015-11-24 11:12:49 -0800
committerJesse Morgan <jesse@jesterpm.net>2015-11-24 11:12:49 -0800
commit6259efbc44be3e21e42b29246941cd300e79200f (patch)
tree67532f37aeadc45e959fffd1d05ab45ecd72e114 /emailcanary
parent51129fda2179286143921db55a69b3f4dba03c0e (diff)
Adding emailcanary script
Adding the main launch script. Adding the listAddress to the pings table. Fixing the Makefile
Diffstat (limited to 'emailcanary')
-rw-r--r--emailcanary/canary.py18
-rw-r--r--emailcanary/canarydb.py30
-rw-r--r--emailcanary/emailutils.py2
3 files changed, 31 insertions, 19 deletions
diff --git a/emailcanary/canary.py b/emailcanary/canary.py
index 49972db..e020349 100644
--- a/emailcanary/canary.py
+++ b/emailcanary/canary.py
@@ -1,5 +1,5 @@
import uuid, datetime, time
-import email, emailutils
+import email.message, emailutils
import re
class Canary:
@@ -12,12 +12,20 @@ class Canary:
chirpUUID = str(uuid.uuid4())
now = datetime.datetime.now()
+ receipients = self.db.get_recipients_for_list(listAddress)
+ if len(receipients) == 0:
+ raise Exception("No receipients for listAddress '%s'", (listAddress,))
+
self.send(listAddress, now, chirpUUID)
- for dest in self.db.get_recipients_for_list(listAddress):
- self.db.ping(dest, now, chirpUUID)
+ for dest in receipients:
+ self.db.ping(listAddress, dest, now, chirpUUID)
def check(self, listAddress):
- for (listAddress, address, imapserver, password) in self.db.get_accounts(listAddress):
+ '''Check for messages from listAddress and return a list of missing chirps'''
+ accounts = self.db.get_accounts(listAddress)
+ if len(accounts) == 0:
+ raise Exception("No receipients for listAddress '%s'", (listAddress,))
+ for (listAddress, address, imapserver, password) in accounts:
mail = emailutils.get_imap(imapserver, address, password)
these_subjects = []
for uid in emailutils.get_mail_uids(mail):
@@ -25,6 +33,7 @@ class Canary:
if self.processMessage(address, message):
emailutils.delete_message(mail, uid)
emailutils.close(mail)
+ return self.db.get_missing_pongs(listAddress)
def processMessage(self, receipient, msg):
match = re.match('Canary Email (.+)', msg['Subject'])
@@ -35,7 +44,6 @@ class Canary:
return True
return False
-
def send(self, dest, date, chirpUUID):
msg = email.message.Message()
msg['From'] = self.fromaddress
diff --git a/emailcanary/canarydb.py b/emailcanary/canarydb.py
index 59a2ea2..980431b 100644
--- a/emailcanary/canarydb.py
+++ b/emailcanary/canarydb.py
@@ -7,7 +7,7 @@ class CanaryDB:
# Create Tables if necessary
cursor = self.conn.cursor()
- cursor.execute("CREATE TABLE IF NOT EXISTS pings (address, uuid, timesent timestamp, timereceived timestamp)")
+ cursor.execute("CREATE TABLE IF NOT EXISTS pings (listAddress, address, uuid, timesent timestamp, timereceived timestamp)")
cursor.execute("CREATE TABLE IF NOT EXISTS accounts (list, address, imapserver, password)")
def close(self):
@@ -19,9 +19,9 @@ class CanaryDB:
(listAddress, address, imapserver, password))
self.conn.commit()
- def remove_account(self, address):
+ def remove_account(self, listAddress, address):
cursor = self.conn.cursor()
- cursor.execute("DELETE FROM accounts WHERE address=?", (address,))
+ cursor.execute("DELETE FROM accounts WHERE list=? AND address=?", (listAddress, address))
self.conn.commit()
def get_accounts(self, listAddress = None):
@@ -47,10 +47,10 @@ class CanaryDB:
results.append(row[0])
return results
- def ping(self, address, time, uuid):
+ def ping(self, listAddress, address, time, uuid):
cursor = self.conn.cursor()
- cursor.execute("INSERT INTO pings (address, timesent, uuid) VALUES (?, ?, ?)", \
- (address, time, uuid))
+ cursor.execute("INSERT INTO pings (listAddress, address, timesent, uuid) VALUES (?, ?, ?, ?)", \
+ (listAddress, address, time, uuid))
self.conn.commit()
def pong(self, address, time, uuid):
@@ -59,16 +59,20 @@ class CanaryDB:
(time, address, uuid))
self.conn.commit()
- def get_missing_pongs(self):
+ def get_missing_pongs(self, listAddress = None):
'''Return a list of tupls of missing pongs.
- Each tupl contains (uuid, address, time since send)'''
+ Each tupl contains (listAddress, uuid, address, time since send)'''
cursor = self.conn.cursor()
- cursor.execute("SELECT uuid, address, timesent FROM pings WHERE timereceived IS NULL");
+ if listAddress:
+ cursor.execute("SELECT listAddress, uuid, address, timesent FROM pings WHERE timereceived IS NULL AND listAddress = ?", (listAddress,));
+ else:
+ cursor.execute("SELECT listAddress, uuid, address, timesent FROM pings WHERE timereceived IS NULL");
now = datetime.now()
results = list()
for row in cursor:
- uuid = row[0]
- address = row[1]
- delta = now - row[2]
- results.append((uuid, address, delta))
+ listAddress = row[0]
+ uuid = row[1]
+ address = row[2]
+ delta = now - row[3]
+ results.append((listAddress, uuid, address, delta))
return results
diff --git a/emailcanary/emailutils.py b/emailcanary/emailutils.py
index b87f637..83c2f46 100644
--- a/emailcanary/emailutils.py
+++ b/emailcanary/emailutils.py
@@ -19,7 +19,7 @@ def get_message(mail, uid):
return email.message_from_string(raw_email)
def delete_message(mail, uid):
- result = mail.uid('store', uid, '+FLAGS', '\\Deleted')
+ result = mail.uid('store', uid, '+FLAGS', '(\Deleted)')
def close(mail):
mail.expunge()