File indexing completed on 2026-04-10 08:39:01
0001 import argparse
0002 import grp
0003 import logging
0004 import os
0005 import pwd
0006 import signal
0007 import sys
0008
0009 import daemon
0010 import lockfile
0011 from pandaserver.config import daemon_config, panda_config
0012 from pandaserver.daemons.utils import END_SIGNALS, DaemonMaster
0013
0014
0015
0016 def get_logger():
0017 my_logger = logging.getLogger("PanDA-Daemon-Master")
0018
0019 while my_logger.hasHandlers():
0020 my_logger.removeHandler(my_logger.handlers[0])
0021
0022 _log_handler = logging.StreamHandler(sys.stdout)
0023 _log_formatter = logging.Formatter("%(asctime)s %(name)-12s: %(levelname)-8s %(message)s")
0024 _log_handler.setFormatter(_log_formatter)
0025
0026 my_logger.addHandler(_log_handler)
0027
0028 my_logger.setLevel(logging.DEBUG)
0029
0030 return my_logger
0031
0032
0033
0034 def kill_whole():
0035 os.killpg(os.getpgrp(), signal.SIGKILL)
0036
0037
0038
0039 def main():
0040
0041 if not getattr(daemon_config, "enable", False):
0042 return
0043
0044 main_log = get_logger()
0045
0046 parser = argparse.ArgumentParser()
0047 parser.add_argument(
0048 "-P",
0049 "--pidfile",
0050 action="store",
0051 dest="pidfile",
0052 default=None,
0053 help="pid filename",
0054 )
0055 options = parser.parse_args()
0056 if "PANDA_NO_ROOT" in os.environ:
0057 uid = None
0058 gid = None
0059 else:
0060 uname = getattr(daemon_config, "uname", "nobody")
0061 gname = getattr(daemon_config, "gname", "nobody")
0062 uid = pwd.getpwnam(uname).pw_uid
0063 gid = grp.getgrnam(gname).gr_gid
0064 n_workers = getattr(daemon_config, "n_proc", 1)
0065 n_dbconn = getattr(daemon_config, "n_dbconn", 1)
0066 worker_lifetime = getattr(daemon_config, "proc_lifetime", 28800)
0067 use_tbif = getattr(daemon_config, "use_tbif", False)
0068 main_log.info("main start")
0069
0070 dc = daemon.DaemonContext(
0071 stdout=sys.stdout,
0072 stderr=sys.stderr,
0073 uid=uid,
0074 gid=gid,
0075 pidfile=lockfile.FileLock(options.pidfile),
0076 )
0077 with dc:
0078
0079 tmp_log = get_logger()
0080
0081 with open(options.pidfile, "w") as pid_file:
0082 pid_file.write(f"{os.getpid()}")
0083
0084 master = DaemonMaster(
0085 logger=tmp_log,
0086 n_workers=n_workers,
0087 n_dbconn=n_dbconn,
0088 worker_lifetime=worker_lifetime,
0089 use_tbif=use_tbif,
0090 )
0091
0092
0093 def end_master(sig, frame):
0094 tmp_log.info(f"got end signal: {sig}")
0095 master.stop()
0096 kill_whole()
0097
0098
0099 for sig in END_SIGNALS:
0100 signal.signal(sig, end_master)
0101
0102 master.run()
0103
0104 main_log = get_logger()
0105 main_log.info("main end")
0106
0107
0108
0109 if __name__ == "__main__":
0110 main()