Back to home page

EIC code displayed by LXR

 
 

    


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 # get the logger
0016 def get_logger():
0017     my_logger = logging.getLogger("PanDA-Daemon-Master")
0018     # remove existing handlers
0019     while my_logger.hasHandlers():
0020         my_logger.removeHandler(my_logger.handlers[0])
0021     # make new handler
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     # add new handler
0026     my_logger.addHandler(_log_handler)
0027     # debug log level
0028     my_logger.setLevel(logging.DEBUG)
0029     # return logger
0030     return my_logger
0031 
0032 
0033 # kill the whole process group
0034 def kill_whole():
0035     os.killpg(os.getpgrp(), signal.SIGKILL)
0036 
0037 
0038 # main function
0039 def main():
0040     # whether to run daemons
0041     if not getattr(daemon_config, "enable", False):
0042         return
0043     # get logger
0044     main_log = get_logger()
0045     # parse option
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     # daemon context
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         # get logger inside daemon context
0079         tmp_log = get_logger()
0080         # record in PID file
0081         with open(options.pidfile, "w") as pid_file:
0082             pid_file.write(f"{os.getpid()}")
0083         # master object
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         # function to end master when end signal caught
0093         def end_master(sig, frame):
0094             tmp_log.info(f"got end signal: {sig}")
0095             master.stop()
0096             kill_whole()
0097 
0098         # set signal handler
0099         for sig in END_SIGNALS:
0100             signal.signal(sig, end_master)
0101         # start master
0102         master.run()
0103     # get logger again
0104     main_log = get_logger()
0105     main_log.info("main end")
0106 
0107 
0108 # run
0109 if __name__ == "__main__":
0110     main()