function loadSettings($sProjectDir)
{
@define('CONST_InstallDir', $sProjectDir);
+ // Temporary hack to set the direcory via environment instead of
+ // the installed scripts. Neither setting is part of the official
+ // set of settings.
+ defined('CONST_DataDir') or define('CONST_DataDir', $_SERVER['NOMINATIM_DATADIR']);
+ defined('CONST_BinDir') or define('CONST_BinDir', $_SERVER['NOMINATIM_BINDIR']);
$dotenv = new \Symfony\Component\Dotenv\Dotenv();
$dotenv->load(CONST_DataDir.'/settings/env.defaults');
--- /dev/null
+"""
+Helper functions for executing external programs.
+"""
+from pathlib import Path
+import subprocess
+
+def run_legacy_script(script, *args, nominatim_env=None):
+ """ Run a Nominatim PHP script with the given arguments.
+ """
+ cmd = ['/usr/bin/env', 'php', '-Cq',
+ nominatim_env.phplib_dir / 'admin' / script]
+ cmd.extend(args)
+
+ env = nominatim_env.config.get_os_env()
+ env['NOMINATIM_DATADIR'] = str(nominatim_env.data_dir)
+ env['NOMINATIM_BINDIR'] = str(nominatim_env.data_dir / 'utils')
+
+ proc = subprocess.run(cmd, cwd=str(nominatim_env.project_dir), env=env)
+
+ return proc.returncode
+
import sys
import argparse
import logging
+from pathlib import Path
+
+from .config import Configuration
+from .admin.exec_utils import run_legacy_script
class CommandlineParser:
""" Wraps some of the common functions for parsing the command line
help='Print only error messages')
group.add_argument('-v', '--verbose', action='count', default=1,
help='Increase verboseness of output')
- group.add_argument('--project-dir', metavar='DIR',
+ group.add_argument('--project-dir', metavar='DIR', default='.',
help='Base directory of the Nominatim installation (default:.)')
group.add_argument('-j', '--threads', metavar='NUM', type=int,
help='Number of parallel threads to use')
parser.set_defaults(command=cmd)
cmd.add_args(parser)
- def run(self):
+ def run(self, **kwargs):
""" Parse the command line arguments of the program and execute the
appropriate subcommand.
"""
args = self.parser.parse_args()
if args.subcommand is None:
- self.parser.print_help()
- else:
- logging.basicConfig(stream=sys.stderr,
- format='%(asctime)s %(levelname)s: %(message)s',
- datefmt='%Y-%m-%d %H:%M:%S',
- level=max(4 - args.verbose, 1) * 10)
- args.command.run(args)
+ return self.parser.print_help()
+
+ for arg in ('module_dir', 'osm2pgsql_path', 'phplib_dir', 'data_dir'):
+ setattr(args, arg, Path(kwargs[arg]))
+ args.project_dir = Path(args.project_dir)
+
+ logging.basicConfig(stream=sys.stderr,
+ format='%(asctime)s %(levelname)s: %(message)s',
+ datefmt='%Y-%m-%d %H:%M:%S',
+ level=max(4 - args.verbose, 1) * 10)
+
+ args.config = Configuration(args.project_dir, args.data_dir / 'settings')
+
+ args.command.run(args)
class SetupAll:
@staticmethod
def run(args):
- print("TODO: ./utils/warm.php", args)
+ params = ['warm.php']
+ if args.target == 'reverse':
+ params.append('--reverse-only')
+ if args.target == 'search':
+ params.append('--search-only')
+ return run_legacy_script(*params, nominatim_env=args)
class QueryExport:
parser.add_subcommand('details', QueryTodo)
parser.add_subcommand('status', QueryTodo)
- parser.run()
+ parser.run(**kwargs)
--- /dev/null
+"""
+Nominatim configuration accessor.
+"""
+import sys
+import os
+
+from dotenv import dotenv_values
+
+class Configuration:
+ """ Load and manage the project configuration.
+
+ Nominatim uses dotenv to configure the software. Configuration options
+ are resolved in the following order:
+
+ * from the OS environment
+ * from the .env file in the project directory of the installation
+ * from the default installation in the configuration directory
+
+ All Nominatim configuration options are prefixed with 'NOMINATIM_' to
+ avoid conflicts with other environment variables.
+ """
+
+ def __init__(self, project_dir, config_dir):
+ self._config = dotenv_values(str((config_dir / 'env.defaults').resolve()))
+ self._config.update(dotenv_values(str((project_dir / '.env').resolve())))
+
+ def __getattr__(self, name):
+ name = 'NOMINATIM_' + name
+
+ return os.environ.get(name) or self._config[name]
+
+ def get_os_env(self):
+ """ Return a copy of the OS environment with the Nominatim configuration
+ merged in.
+ """
+ env = dict(os.environ)
+ env.update(self._config)
+
+ return env