#!/usr/bin/env python3
# This file is placed in the Public Domain.
#
# pylint: disable=C0413,W0212,W0718,W0612


"daemon"


import getpass
import os
import pwd
import sys
import time


from rssbot.disk   import Workdir, skel
from rssbot.object import Default, cdir
from rssbot.run    import init, scan
from rssbot.thread import errors, later


from rssbot import modules


Cfg             = Default()
Cfg.dis         = ""
Cfg.name        = "rssbot"
Cfg.mod         = "irc,rss"
Cfg.version     = "558"
Cfg.opts        = ""
Cfg.wdr         = os.path.expanduser(f"~/.{Cfg.name}")
Cfg.pidfile     = os.path.join(Cfg.wdr, f"{Cfg.name}.pid")


Workdir.workdir = Cfg.wdr


def daemon(verbose=False):
    "switch to background."
    pid = os.fork()
    if pid != 0:
        os._exit(0)
    os.setsid()
    pid2 = os.fork()
    if pid2 != 0:
        os._exit(0)
    if not verbose:
        with open('/dev/null', 'r', encoding="utf-8") as sis:
            os.dup2(sis.fileno(), sys.stdin.fileno())
        with open('/dev/null', 'a+', encoding="utf-8") as sos:
            os.dup2(sos.fileno(), sys.stdout.fileno())
        with open('/dev/null', 'a+', encoding="utf-8") as ses:
            os.dup2(ses.fileno(), sys.stderr.fileno())
    os.umask(0)
    os.chdir("/")


def pidfile(path):
    "create pidfile"
    if os.path.exists(path):
        os.unlink(path)
    cdir(path)
    with open(path, "w", encoding="utf-8") as fds:
        fds.write(str(os.getpid()))


def privileges(username):
    "drop privileges."
    pwnam = pwd.getpwnam(username)
    os.setgid(pwnam.pw_gid)
    os.setuid(pwnam.pw_uid)


def wrap(func):
    "restore console."
    try:
        func()
    except (KeyboardInterrupt, EOFError):
        if "-d" not in sys.argv:
            print("")
    except Exception as ex:
        later(ex)
    if "v" in Cfg.opts:
        errors()


def main():
    "main"
    skel()
    Cfg.user = getpass.getuser()
    if "-d" in sys.argv:
        daemon("-v" in sys.argv)
    pidfile(Cfg.pidfile)
    privileges(Cfg.user)
    scan(modules, Cfg.mod)
    init(modules, Cfg.mod)
    while 1:
        time.sleep(1.0)


if __name__ == "__main__":
    wrap(main)
