import os
import re
import gws
import gws.config
import gws.tools.os2
import gws.tools.net
import gws.types as t
EXEC_PATH = '/usr/bin/qgis_mapserv.fcgi'
SVG_SEARCH_PATHS = ['/usr/share/qgis/svg', '/usr/share/alkisplugin/svg']
def _make_ini(root):
ini = ''
paths = []
s = root.var('server.qgis.searchPathsForSVG')
if s:
paths.extend(s)
paths.extend(SVG_SEARCH_PATHS)
ini += f'''
[svg]
searchPathsForSVG={','.join(paths)}
'''
proxy = os.getenv('HTTPS_PROXY') or os.getenv('HTTP_PROXY')
if proxy:
p = gws.tools.net.parse_url(proxy)
ini += f'''
[proxy]
proxyEnabled=true
proxyType=HttpProxy
proxyHost={p['hostname']}
proxyPort={p['port']}
proxyUser={p['username']}
proxyPassword={p['password']}
'''
return '\n'.join(x.strip() for x in ini.splitlines())
[docs]def environ(root: t.IRootObject):
base_dir = gws.ensure_dir(gws.TMP_DIR + '/qqq')
# it's all a bit blurry, but the server appears to read 'ini' from OPTIONS_DIR
# while the app uses a profile
# NB: for some reason, the profile path will be profiles/profiles/default (sic!)
gws.ensure_dir('profiles', base_dir)
gws.ensure_dir('profiles/default', base_dir)
gws.ensure_dir('profiles/default/QGIS', base_dir)
gws.ensure_dir('profiles/profiles', base_dir)
gws.ensure_dir('profiles/profiles/default', base_dir)
gws.ensure_dir('profiles/profiles/default/QGIS', base_dir)
ini = _make_ini(root)
with open(base_dir + '/profiles/default/QGIS/QGIS3.ini', 'wt') as fp:
fp.write(ini)
with open(base_dir + '/profiles/profiles/default/QGIS/QGIS3.ini', 'wt') as fp:
fp.write(ini)
# server options, as documented on
# see https://docs.qgis.org/testing/en/docs/user_manual/working_with_ogc/server/config.html#environment-variables
server_env = {
# not used here 'QGIS_PLUGINPATH': '',
# not used here 'QGIS_SERVER_LOG_FILE': '',
# see https://github.com/qgis/QGIS/pull/35738
'QGIS_SERVER_IGNORE_BAD_LAYERS': 'true',
'MAX_CACHE_LAYERS': root.var('server.qgis.maxCacheLayers'),
'QGIS_OPTIONS_PATH': base_dir + '/profiles/profiles/default',
'QGIS_SERVER_CACHE_DIRECTORY': gws.ensure_dir('servercache', base_dir),
'QGIS_SERVER_CACHE_SIZE': root.var('server.qgis.serverCacheSize'),
'QGIS_SERVER_LOG_LEVEL': root.var('server.qgis.serverLogLevel'),
# 'QGIS_SERVER_MAX_THREADS': 4,
# 'QGIS_SERVER_PARALLEL_RENDERING': 'false',
}
# qgis app options, mostly undocumented
qgis_env = {
'QGIS_PREFIX_PATH': '/usr',
'QGIS_DEBUG': root.var('server.qgis.debug'),
# 'QGIS_GLOBAL_SETTINGS_FILE': '/global_settings.ini',
'QGIS_CUSTOM_CONFIG_PATH': base_dir
}
# finally, there are lots of GDAL settings, some of those seem relevant
# http://trac.osgeo.org/gdal/wiki/ConfigOptions
gdal_env = {
'GDAL_FIX_ESRI_WKT': 'GEOGCS',
'GDAL_DEFAULT_WMS_CACHE_PATH': gws.ensure_dir('gdalcache', base_dir),
}
return gws.merge(
server_env,
qgis_env,
gdal_env,
)
[docs]def version():
_, txt = gws.tools.os2.run([EXEC_PATH])
m = re.search(r'QGis version (.+)', gws.as_str(txt))
if m:
return m.group(1).strip()
return 'unknown'
[docs]def request(root: t.IRootObject, params, **kwargs):
"""Make a request to the local qgis server"""
url = 'http://%s:%s' % (
root.var('server.qgis.host'),
root.var('server.qgis.port'))
return gws.tools.net.http_request(url, params=params, **kwargs)