Skip to content
Snippets Groups Projects
Commit 477cbfec34eb authored by jfp's avatar jfp
Browse files

Add deamon mode

parent 0277cbe9d0fa
No related branches found
No related tags found
No related merge requests found
......@@ -2,6 +2,8 @@
nodaemon = false
user = system
command = dev:[dir]supervisord.com
stdout_file=dev:[dir]supervisord.log
logfile=dev:[dir]supervisord_log.log
[program:firstpgm]
# default image to loginout
# image=SYS$SYSTEM:LOGINOUT.EXE
......
......@@ -828,6 +828,78 @@
start_timer()
def is_deamon() -> bool:
try:
pid = lib.get_logical(
b'SUPERVISORD' + b'_PID',
supervisord_table_name,
)[1]
cpid = lib.getjpi(jpidef.JPI__PID)[3]
return pid == cpid
except OSError as e:
if e.errno != ssdef.SS__NOLOGNAM:
raise
return False
def daemon_is_running() -> bool:
try:
v = lib.get_logical(
b'SUPERVISORD' + b'_PID',
supervisord_table_name,
)[1]
pid = int(v, 16)
lib.getjpi(jpidef.JPI__PID, pid)
return True
except OSError as e:
if e.errno == ssdef.SS__SUSPENDED:
return True
if e.errno == ssdef.SS__NONEXPR:
return False
raise
def daemonize(usrdaemon: str, comdaemon: str, stdout_file: str) -> int | None:
userpro = starlet.create_user_profile(usrnam=usrdaemon)[1]
persona_id = starlet.persona_create(usrpro=userpro)[1]
persona_previous_id = starlet.persona_assume(persona_id)[1]
error = None
try:
stsflg = (
prcdef.PRC_M_IMPERSONATE
| prcdef.PRC_M_PARSE_EXTENDED
| prcdef.PRC_M_KT_LIMIT
| prcdef.PRC_M_HIBER
)
pid = PidType(
starlet.creprc(
image=b'SYS$SYSTEM:LOGINOUT.EXE',
input=comdaemon.encode(),
output=stdout_file.encode(),
prcnam=b'SUPERVISORD',
kt_limit=1,
baspri=4,
stsflg=stsflg,
)[1]
)
lib.set_logical(
b'SUPERVISORD' + b'_PID',
hex(pid)[2:].upper(),
supervisord_table_name,
)
starlet.wake(pid)
return pid
except OSError as e:
error = e
return None
finally:
starlet.persona_assume(persona_previous_id)
starlet.persona_delete(persona_id)
if error is not None:
print(f"Can' create process SUPERVISORD, error {error}")
def main():
global logger, supervisorctl_pwd
......@@ -831,19 +903,6 @@
def main():
global logger, supervisorctl_pwd
logging_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
logging.basicConfig(
filename='/dev/null', level=logging.INFO, format=logging_format
)
formatter = logging.Formatter(logging_format)
main_log = logging.getLogger() # root handler
main_log.setLevel(logging.INFO)
handler = logging.handlers.TimedRotatingFileHandler(
'supervisord.log', 'midnight', backupCount=10
)
handler.setFormatter(formatter)
main_log.addHandler(handler)
# Required privileges: ALTPRI, SYSNAM, PRMMBX, IMPERSONATE, SETPRV, WORLD
starlet.setprv(
1,
......@@ -878,6 +937,37 @@
config.read_file(args.configuration)
args.configuration.close()
nodaemon = config['supervisord'].getboolean('nodaemon', False)
if not nodaemon and not is_deamon():
usrdaemon = config['supervisord'].get('user', 'system')
stdout_file = config['supervisord'].get('stdout_file', 'NLA0:')
comdaemon = config['supervisord']['command']
pid = daemonize(usrdaemon, comdaemon, stdout_file)
if pid is None:
print('Unable to start supervisord daemon')
else:
print(f'Daemon started {hex(pid)[2:].upper()}')
exit(0)
logfile = config['supervisord'].get('logfile', 'supervisord.log')
logging_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
logging.basicConfig(
filename='/dev/null', level=logging.INFO, format=logging_format
)
formatter = logging.Formatter(logging_format)
main_log = logging.getLogger() # root handler
main_log.setLevel(logging.INFO)
logfn = crtl.from_vms(logfile)
if logfn is None:
print(f'{repr(logfile)} is invalid')
crtl.vms_exit(ssdef.SS__INVARG)
handler = logging.handlers.TimedRotatingFileHandler(
logfn, 'midnight', backupCount=10
)
handler.setFormatter(formatter)
main_log.addHandler(handler)
for sn in config.sections():
if sn.startswith('program:'):
quotaslst = [
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment