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


"daemon"


import getpass
import os
import pwd
import sys


from nixt.main    import forever, init, scan, wrap
from nixt.modules import face
from nixt.persist import Workdir, pidfile, pidname
from nixt.runtime import Errors


NAME        = Errors.__module__.split(".", maxsplit=2)[-2]
Workdir.wdr = os.path.expanduser(f"~/.{NAME}")


def daemon(verbose=False):
    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("/")
    os.nice(10)


def errors():
    for error in Errors.errors:
        for line in error:
            print(line)


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


def main():
    daemon()
    privileges(getpass.getuser())
    pidfile(pidname(NAME))
    scan(face)
    init(face)
    forever()


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