diff --git a/api1.py b/api1.py index 5bd784c..8ec6b9b 100644 --- a/api1.py +++ b/api1.py @@ -1,12 +1,18 @@ import flask +import sys from flask import request, jsonify, g from flask_apscheduler import APScheduler from datetime import datetime,timedelta,timezone import sqlite3 +import smtplib +# testing: +# start dummy web server for dev with root: python3 -m smtpd -c DebuggingServer -n localhost:25 + +# Request: +# curl -X POST "http://localhost:5000/api/v1?topic=abc.def&secs=60&email=j.tretter@gmail.com" DATABASE='deadswitch.sqlite3' - class Config(object): JOBS = [ { @@ -19,18 +25,33 @@ class Config(object): SCHEDULER_API_ENABLED = True +def sendMail(topic,toAddr): + print(f"sending mail to {toAddr} for topic {topic}") + port = 25 + server=smtplib.SMTP("localhost", port) + sender_email = "deadswitch@kawomi.com" + receiver_email = "joerg.tretter@gmail.com" + message = f"""\ + Subject: deadSwitch not pushed on topic {topic} + + Notification of deadSwitch not pushed on topic {topic}.""" + server.sendmail(sender_email, receiver_email, message) + def expiryCheck(): - print('LA ') + print('.',end='') db=sqlite3.connect(DATABASE,detect_types=sqlite3.PARSE_DECLTYPES) cursor = db.cursor() - for theRow in cursor.execute("select expiry,topic from entries where expiry < datetime()"): + for theRow in cursor.execute("select expiry,topic,email from entries where active=True and isNotified=False and expiry < datetime()"): print(theRow) + sendMail(theRow[1],theRow[2]) + db.execute("update entries set isNotified=True where topic=?",[theRow[1]]) + db.commit() db.close() if __name__ == '__main__': app = flask.Flask(__name__) - app.config["DEBUG"] = True + app.config["DEBUG"] = False app.config.from_object(Config()) scheduler = APScheduler() @@ -54,7 +75,15 @@ if __name__ == '__main__': @app.route('/', methods=['GET']) def home(): - return "

Hello

" + return """

Dead-Switch web service

+
+

2020-10-29 - j.tretter@gmail.com

+
+ Examples: + """ @app.route('/api/v1', methods=['GET']) @@ -62,33 +91,43 @@ if __name__ == '__main__': if 'topic' in request.args: topic=request.args['topic'] else: - return "Error: need topic" + return jsonify({'success':False, 'error':"No topic given"}) cursor = get_db().cursor() - cursor.execute("select expiry from entries where topic=?",[topic]) - expdatetime=cursor.fetchone()[0] + cursor.execute("select active,expiry,email,isNotified,expiryGET" + topic + ": " + expdatetime.strftime("%Y-%m-%d %H:%M:%S") + return jsonify({'success':True, 'topic':topic, 'active':theRow[0], 'expiry':theRow[1].strftime("%Y-%m-%d %H:%M:%S"), 'lastSeen':theRow[5].strftime("%Y-%m-%d %H:%M:%S"),'isExpired':theRow[4],'email':theRow[2], 'isNotified':theRow[3]}) @app.route('/api/v1', methods=['PUT','POST']) def api_setRecord(): if 'topic' in request.args: topic = request.args['topic'] else: - return "Error: need topic" - + return jsonify({'success':False, 'error':"No topic given"}) + + if 'email' in request.args: + email = request.args['email'] + else: + return jsonify({'success':False, 'error':"No email given"}) + if 'secs' in request.args: secs = int(request.args['secs']) else: - return "Errof: need secs" + return jsonify({'success':False, 'error':"No secs given"}) expiryDateTime=datetime.now(tz=timezone.utc) + timedelta(seconds=secs) - cursor = get_db().cursor() - cursor.execute("update entries set expiry=? where topic=?",[expiryDateTime,topic]) - if cursor.rowcount == 0: - cursor.execute("Insert into entries (topic,expiry) values (?,?)",[topic,expiryDateTime]) + try: + cursor = get_db().cursor() + cursor.execute("update entries set active=True,isNotified=False,email=?,expiry=?,lastSeen=datetime('now') where topic=?",[email,expiryDateTime,topic]) + if cursor.rowcount == 0: + cursor.execute("Insert into entries (active,topic,expiry,email,isNotified,lastSeen) values (True,?,?,?,False,datetime('now'))",[topic,expiryDateTime,email]) + except Exception as e: + return jsonify({'success':False, 'error':str(e)}) - return "

SET

" + expiryDateTime.strftime("%Y-%m-%d %H:%M:%S") + return jsonify({'success':True, 'expiry':expiryDateTime.strftime("%Y-%m-%d %H:%M:%S"), 'email':email}) app.run(use_reloader=False) \ No newline at end of file diff --git a/createDB.sql b/createDB.sql new file mode 100644 index 0000000..1896fa2 --- /dev/null +++ b/createDB.sql @@ -0,0 +1 @@ +CREATE TABLE entries (active boolean,topic string,email string, expiry timestamp, isNotified boolean, lastSeen timestamp); \ No newline at end of file diff --git a/deadswitch.sqlite3 b/deadswitch.sqlite3 deleted file mode 100644 index d9838bc..0000000 Binary files a/deadswitch.sqlite3 and /dev/null differ diff --git a/mail.py b/mail.py index 385919f..dd35776 100644 --- a/mail.py +++ b/mail.py @@ -1,7 +1,6 @@ import smtplib port = 25 - server=smtplib.SMTP("localhost", port) sender_email = "deadswitch@kawomi.com" receiver_email = "joerg.tretter@gmail.com"