2023-09-27 14:42:25 +01:00

70 lines
2.7 KiB
Python

import os, subprocess, time, datetime, json
from multiprocessing import Value
from threading import Thread
from pathlib import Path
from accservermanager import settings
try: import resource
except: resource = None
class Executor(Thread):
"""
Thread for running the server process
"""
def __init__(self, instanceDir):
super().__init__()
# add all configuration values to the object
for key, val in json.load(open(os.path.join(instanceDir, 'cfg', 'configuration.json'), 'r', encoding='utf-16')).items():
setattr(self, key, val)
for key, val in json.load(open(os.path.join(instanceDir, 'cfg', 'settings.json'), 'r', encoding='utf-16')).items():
setattr(self, key, val)
# find the name of the config file, just needed to display it in the instances list
self.config = Path(os.path.join(instanceDir, 'cfg', 'event.json')).resolve().name
self.p = None
self.stdout = None
self.stderr = None
self.serverlog = None
self.retval = None
self.instanceDir = instanceDir
self.stop = Value('i', 0)
def run(self):
preexec_fn = None
exec = settings.ACCEXEC
if resource:
# in linux, limit ram to 1GB soft, 2GB hard
preexec_fn = lambda: resource.setrlimit(resource.RLIMIT_DATA, (2**30, 2**31))
else:
# if 'resource' is not available, assume windows which needs to full path to the exec
exec = os.path.join(self.instanceDir, *settings.ACCEXEC)
# fire up the server, store stderr to the log/ dir
_tm = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
self.stdout = os.path.join(self.instanceDir, 'log', 'stdout-%s.log'%(_tm))
self.stderr = os.path.join(self.instanceDir, 'log', 'stderr-%s.log'%(_tm))
self.serverlog = os.path.join(self.instanceDir, 'log', 'server.log')
self.p = subprocess.Popen(exec,
# set working dir
cwd=self.instanceDir,
# limit ram to 1GB soft, 2GB hard
preexec_fn=preexec_fn,
# shell=True,
universal_newlines=True,
stdout=open(self.stdout,'w'),
stderr=open(self.stderr,'w'))
# wait for the stop signal or for the server to die on its own
self.retval = None
while self.retval is None:
if self.stop.value == 1: self.p.kill()
time.sleep(1)
self.retval = self.p.poll()
print("Retval:",self.retval)