import time
import gws
import gws.config.loader
import gws.gis.mpx.config
import gws.tools.date
import gws.tools.json2
import gws.tools.os2
from . import ini
_START_SCRIPT = gws.VAR_DIR + '/server.sh'
[docs]def start(config_path=None):
stop()
root = configure(config_path)
gws.tools.date.set_system_time_zone(root.var('timeZone'))
for p in gws.tools.os2.find_files(gws.SERVER_DIR, '.*'):
gws.tools.os2.unlink(p)
pid_dir = gws.ensure_dir('pids', gws.TMP_DIR)
commands = ini.create(root, gws.SERVER_DIR, pid_dir)
s = root.var('server.autoRun')
if s:
commands.insert(0, s)
with open(_START_SCRIPT, 'wt') as fp:
fp.write('echo "----------------------------------------------------------"\n')
fp.write('echo "SERVER START"\n')
fp.write('echo "----------------------------------------------------------"\n')
fp.write('\n'.join(commands))
[docs]def stop():
_stop('uwsgi')
_stop('nginx')
_stop('qgis_mapserv.fcgi')
_stop('rsyslogd')
def _stop(proc_name):
if _kill_name(proc_name, 'INT'):
return
for _ in range(10):
if _kill_name(proc_name, 'KILL'):
return
time.sleep(5)
pids = gws.tools.os2.pids_of(proc_name)
if pids:
raise ValueError(f'failed to stop {proc_name} pids={pids!r}')
[docs]def reload(modules=None):
_reload(False, None, modules)
[docs]def reload_uwsgi(module):
pid_dir = gws.ensure_dir('pids', gws.TMP_DIR)
pattern = f'({module}).uwsgi.pid'
for p in gws.tools.os2.find_files(pid_dir, pattern):
gws.log.info(f'reloading {p}...')
gws.tools.os2.run(['uwsgi', '--reload', p])
def _reload(reconf, config_path, modules=None):
pid = gws.tools.os2.pids_of('uwsgi')
if not pid:
gws.log.info('server not running, starting...')
start(config_path)
return
if reconf:
configure(config_path)
for m in ('qgis', 'mapproxy', 'web', 'spool'):
if not modules or m in modules:
reload_uwsgi(m)
def _kill_name(proc_name, sig_name):
pids = gws.tools.os2.pids_of(proc_name)
if not pids:
return True
for pid in pids:
gws.log.debug(f'stopping {proc_name} pid={pid}')
gws.tools.os2.kill_pid(pid, sig_name)
return False