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

"daemon"


import getpass
import os
import pathlib
import pwd
import sys


from otpcr.modules import face
from otpcr.persist import Workdir
from otpcr.runtime import forever, init


from otpcr import NAME


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("/")
    os.nice(10)


def pidfile(name):
    "write the pid to a file."
    fname = os.path.join(Workdir.wdr, f"{name}.pid")
    if os.path.exists(fname):
        os.unlink(fname)
    path = pathlib.Path(fname)
    path.parent.mkdir(parents=True, exist_ok=True)
    with open(fname, "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 main():
    "main"
    daemon()
    privileges(getpass.getuser())
    pidfile(NAME)
    init(face)
    forever()


if __name__ == "__main__":
    main()
