Skip to content
Snippets Groups Projects
notify_user.py 2.53 KiB
Newer Older
Bo-Chun Chen's avatar
Bo-Chun Chen committed
#!/usr/bin/env python
import sys
import json
Bo-Chun Chen's avatar
Bo-Chun Chen committed
import rc_util
Bo-Chun Chen's avatar
Bo-Chun Chen committed
import smtplib
Bo-Chun Chen's avatar
Bo-Chun Chen committed
import dataset
Bo-Chun Chen's avatar
Bo-Chun Chen committed
from rc_rmq import RCRMQ
from jinja2 import Template
Bo-Chun Chen's avatar
Bo-Chun Chen committed
from datetime import datetime
import mail_config as mail_cfg
Bo-Chun Chen's avatar
Bo-Chun Chen committed

task = 'notify_user'

Bo-Chun Chen's avatar
Bo-Chun Chen committed
args = rc_util.get_args()
logger = rc_util.get_logger(args)
Bo-Chun Chen's avatar
Bo-Chun Chen committed
db = dataset.connect(f'sqlite:///.agent_db/{task}.db')
table = db['notified_user']

Bo-Chun Chen's avatar
Bo-Chun Chen committed
# Instantiate rabbitmq object
rc_rmq = RCRMQ({'exchange': 'RegUsr', 'exchange_type': 'topic'})

# Email instruction to user
def notify_user(ch, method, properties, body):
    msg = json.loads(body)
    username = msg['username']
    user_email = msg['email']
    msg['task'] = task
    msg['success'] = False
Bo-Chun Chen's avatar
Bo-Chun Chen committed

    try:
Bo-Chun Chen's avatar
Bo-Chun Chen committed
        # Search username in database
        record = table.find_one(username=username)

        if record:
            # Update counter
            count = record['count']
            table.update({'username': username, 'count': count + 1}, ['username'])

            logger.debug(f'User {username} counter updated to {count + 1}')
Bo-Chun Chen's avatar
Bo-Chun Chen committed

        else:
Bo-Chun Chen's avatar
Bo-Chun Chen committed
            # Send email to user
Bo-Chun Chen's avatar
Bo-Chun Chen committed
            receivers = [user_email, mail_cfg.My_email]
Bo-Chun Chen's avatar
Bo-Chun Chen committed
            message = Template(mail_cfg.Whole_mail).render(username=username, to=user_email)

            if args.dry_run:
                logger.info(f'smtp = smtplib.SMTP({mail_cfg.Server})')
Bo-Chun Chen's avatar
Bo-Chun Chen committed
                logger.info(f'smtp.sendmail({mail_cfg.Sender}, {receivers}, message)')
                logger.info(f"table.insert({{'username': {username}, 'count': 1, 'sent_at': datetime.now()}})")
Bo-Chun Chen's avatar
Bo-Chun Chen committed

            else:
                smtp = smtplib.SMTP(mail_cfg.Server)
Bo-Chun Chen's avatar
Bo-Chun Chen committed
                smtp.sendmail(mail_cfg.Sender, receivers, message)
Bo-Chun Chen's avatar
Bo-Chun Chen committed

                logger.debug(f'Email sent to: {user_email}')

                table.insert({
                    'username': username,
                    'count': 1,
                    'sent_at': datetime.now()
                })

                logger.debug(f'User {username} inserted into database')
        msg['success'] = True
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    except Exception as exception:
        logger.error('', exc_info=True)
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    # Send confirm message
    rc_rmq.publish_msg({
        'routing_key': 'confirm.' + username,
        'msg': msg
    })
    logger.debug(f'User {username} confirmation sent')

Bo-Chun Chen's avatar
Bo-Chun Chen committed
    # Acknowledge the message
    ch.basic_ack(delivery_tag=method.delivery_tag)
Bo-Chun Chen's avatar
Bo-Chun Chen committed

Bo-Chun Chen's avatar
Bo-Chun Chen committed
if __name__ == "__main__":
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    logger.info(f'Start listening to queue: {task}')
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    rc_rmq.start_consume({
        'queue': task,
        'routing_key': "notify.*",
        'cb': notify_user
    })

Bo-Chun Chen's avatar
Bo-Chun Chen committed
    logger.info('Disconnected')
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    rc_rmq.disconnect()