tools.py 2.96 KB
import os
from email.utils import formatdate
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
import mimetypes
import json
from logging import getLogger
from time import localtime
from opensipkd.waktu import create_datetime


##########
# Daemon #
##########
def is_live(pid):
    try:
        os.kill(pid, 0)
    except OSError:
        return
    return True


def read_pid_file(filename):
    try:
        with open(filename) as f:
            s = f.read()
        s = s.split()
        s = s[0]
        return int(s)
    except IOError:
        return
    except ValueError:
        return
    except IndexError:
        return


def write_pid_file(filename):
    pid = os.getpid()
    with open(filename, 'w') as f:
        f.write(str(pid))
    return pid


def make_pid_file(filename):
    pid = read_pid_file(filename)
    if pid and is_live(pid):
        print(f'PID saya {pid} masih aktif.')
        return
    return write_pid_file(filename)


########
# Mail #
########
def nice_name(email, name):
    if name:
        return f'{name} <{email}>'
    return email


def file_type(filename):
    ctype, encoding = mimetypes.guess_type(filename)
    if ctype is None or encoding is not None:
        ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/', 1)
    return maintype, subtype


def create_doc(
        from_email, to_email, subject, body, from_name=None, to_name=None,
        files=[]):
    msg = doc = MIMEText(body)
    if files:
        doc = MIMEMultipart()
        doc.attach(msg)
    if subject:
        doc['Subject'] = subject
    doc['Date'] = formatdate(localtime=True)
    if from_email:
        doc['From'] = nice_name(from_email, from_name)
    doc['To'] = nice_name(to_email, to_name)
    for fname, data in files:
        maintype, subtype = file_type(fname)
        payload = MIMEBase(maintype, subtype)
        payload.set_payload(data)
        encoders.encode_base64(payload)
        payload.add_header(
            'Content-Disposition', 'attachment', filename=fname)
        doc.attach(payload)
    return doc


# Agar log tidak memuat isi attachment
def clean_log(p):
    r = {}
    keys = ['id', 'pengirim', 'from_name', 'penerima', 'pesan', 'jawaban',
            'tgl_operator', 'subject', 'name', 'To', 'From', 'Subject', 'Body']
    for key in keys:
        if key in p:
            r[key] = p[key]
    if 'files' not in p:
        return r
    files = []
    for fname, content in p['files']:
        files.append(fname)
    r['files'] = files
    return r


def file2dict(filename):
    log = getLogger('file2dict')
    with open(filename) as f:
        s = f.read()
    try:
        return json.loads(s)
    except Exception as e:
        log.error(f'eval({s}): {exception_message()}')
        raise e


def file_time(filename):
    t = os.stat(filename).st_mtime
    t = localtime(t)
    return create_datetime(
            t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)