X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/2abe9e6fd99bb270c9de05f19701283a08c3b2f5..2e56182a7f2837ee09ca08a3c0ac67557b62114f:/nominatim/cli.py diff --git a/nominatim/cli.py b/nominatim/cli.py index 56ed6a07..836f9037 100644 --- a/nominatim/cli.py +++ b/nominatim/cli.py @@ -9,6 +9,7 @@ Command-line interface to the Nominatim functions for import, update, database administration and querying. """ from typing import Optional, Any, List, Union +import importlib import logging import os import sys @@ -60,7 +61,7 @@ class CommandlineParser: def nominatim_version_text(self) -> str: """ Program name and version number as string """ - text = f'Nominatim version {version.version_str()}' + text = f'Nominatim version {version.NOMINATIM_VERSION!s}' if version.GIT_COMMIT_HASH is not None: text += f' ({version.GIT_COMMIT_HASH})' return text @@ -197,10 +198,15 @@ class AdminServe: """\ Start a simple web server for serving the API. - This command starts the built-in PHP webserver to serve the website + This command starts a built-in webserver to serve the website from the current project directory. This webserver is only suitable for testing and development. Do not use it in production setups! + There are different webservers available. The default 'php' engine + runs the classic PHP frontend. The other engines are Python servers + which run the new Python frontend code. This is highly experimental + at the moment and may not include the full API. + By the default, the webserver can be accessed at: http://127.0.0.1:8088 """ @@ -208,14 +214,34 @@ class AdminServe: group = parser.add_argument_group('Server arguments') group.add_argument('--server', default='127.0.0.1:8088', help='The address the server will listen to.') + group.add_argument('--engine', default='php', + choices=('php', 'falcon', 'starlette'), + help='Webserver framework to run. (default: php)') def run(self, args: NominatimArgs) -> int: - run_php_server(args.server, args.project_dir / 'website') + if args.engine == 'php': + run_php_server(args.server, args.project_dir / 'website') + else: + import uvicorn # pylint: disable=import-outside-toplevel + server_info = args.server.split(':', 1) + host = server_info[0] + if len(server_info) > 1: + if not server_info[1].isdigit(): + raise UsageError('Invalid format for --server parameter. Use :') + port = int(server_info[1]) + else: + port = 8088 + + server_module = importlib.import_module(f'nominatim.server.{args.engine}.server') + + app = server_module.get_application(args.project_dir) + uvicorn.run(app, host=host, port=port) + return 0 -def get_set_parser(**kwargs: Any) -> CommandlineParser: +def get_set_parser() -> CommandlineParser: """\ Initializes the parser and adds various subcommands for nominatim cli. @@ -237,14 +263,11 @@ def get_set_parser(**kwargs: Any) -> CommandlineParser: parser.add_subcommand('export', QueryExport()) parser.add_subcommand('serve', AdminServe()) - if kwargs.get('phpcgi_path'): - parser.add_subcommand('search', clicmd.APISearch()) - parser.add_subcommand('reverse', clicmd.APIReverse()) - parser.add_subcommand('lookup', clicmd.APILookup()) - parser.add_subcommand('details', clicmd.APIDetails()) - parser.add_subcommand('status', clicmd.APIStatus()) - else: - parser.parser.epilog = 'php-cgi not found. Query commands not available.' + parser.add_subcommand('search', clicmd.APISearch()) + parser.add_subcommand('reverse', clicmd.APIReverse()) + parser.add_subcommand('lookup', clicmd.APILookup()) + parser.add_subcommand('details', clicmd.APIDetails()) + parser.add_subcommand('status', clicmd.APIStatus()) return parser @@ -254,6 +277,4 @@ def nominatim(**kwargs: Any) -> int: Command-line tools for importing, updating, administrating and querying the Nominatim database. """ - parser = get_set_parser(**kwargs) - - return parser.run(**kwargs) + return get_set_parser().run(**kwargs)