agent_job.py 3 KB
import sys
import os
import json
from logging import getLogger
from configparser import ConfigParser
from textwrap import wrap
from sqlalchemy import engine_from_config
from sqlalchemy.schema import CreateSchema
from sqlalchemy.orm import sessionmaker
from zope.sqlalchemy import register
import transaction
from ..models import (
    Agent,
    Antrian,
    Selesai,
    Mail,
    File,
    )
from .tools import (
    make_pid_file,
    clean_log,
    )
from .logger import setup_logging


my_registry = dict()


def write_job_file(s, mail=None):
    conf = my_registry['conf']
    db_session = my_registry['db_session']
    log = getLogger()
    job_file = f'{s.id}.json'
    job_file = os.path.join(conf['job_dir'], job_file)
    d = dict(
            id=s.id, penerima=s.penerima, pesan=s.pesan)
    if mail:
        d.update(dict(subject=mail.subject, name=mail.name))
        q = db_session.query(File).filter_by(id=s.id)
        files = []
        for f in q.order_by(File.urutan):
            files.append([f.filename, f.content])
        if files:
            d['files'] = files
    log.info(f'Write {job_file} {clean_log(d)}')
    json_d = json.dumps(d)
    with open(job_file, 'w') as f:
        f.write(json_d)
    return job_file


def create_mail_row(a):
    name = a.penerima.split('@')[0]
    # Subject ambil dari penggalan pesan
    t = wrap(a.pesan, 50)
    subject = t and t[0] or ''
    return Mail(id=a.id, name=name, subject=subject)


def main(argv=sys.argv[1:]):
    conf_file = argv[0]
    conf = ConfigParser()
    conf.read(conf_file)
    my_registry['conf'] = cf = dict(conf.items('main'))
    if not make_pid_file(cf['pid_file']):
        sys.exit(1)
    setup_logging(conf_file)
    engine = engine_from_config(cf, 'db_')
    factory = sessionmaker(bind=engine)
    my_registry['db_session'] = db_session = factory()
    register(db_session)
    q = db_session.query(Antrian).filter_by(kirim=True)
    q_mail = db_session.query(Mail)
    while True:
        a = q.order_by(Antrian.id).first()
        if not a:
            return
        new_mail = False
        if a.jalur == 6:  # Mail
            mail = q_mail.filter_by(id=a.id).first()
            if not mail:
                mail = create_mail_row(a)
                new_mail = True
        d = a.to_dict()
        s = Selesai(**d)
        q_agent = db_session.query(Agent).filter_by(jalur=a.jalur)
        if s.pengirim:
            q_agent = q_agent.filter_by(id=s.pengirim)
        else:
            q_agent = q_agent.filter_by(status=0)
        agent = q_agent.first()
        if agent:
            s.pengirim = agent.id
            if agent.status != 0:
                s.status = -2  # Agent belum hidup
        else:
            s.status = -1  # Tidak dapat agent aktif
        with transaction.manager:
            q.filter_by(id=a.id).delete()
            db_session.add(s)
            if new_mail:
                db_session.add(mail)
            db_session.flush()
            db_session.expunge_all()
        json_file = write_job_file(s, mail)
    os.remove(cf['pid_file'])