]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/cli.py
properly close connections when shutting down starlette
[nominatim.git] / nominatim / cli.py
index 34abb617efe3346aa156b3055ab36da045b7b594..6a89a8de4b97d7b43c79444d78fe48451ec080e2 100644 (file)
@@ -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
@@ -202,7 +203,7 @@ class AdminServe:
     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. 'sanic' and 'falcon' are Python servers
+    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.
 
@@ -214,7 +215,7 @@ class AdminServe:
         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', 'sanic', 'falcon'),
+                           choices=('php', 'sanic', 'falcon', 'starlette'),
                            help='Webserver framework to run. (default: php)')
 
 
@@ -232,21 +233,25 @@ class AdminServe:
                 port = 8088
 
             if args.engine == 'sanic':
-                import nominatim.server.sanic.server
+                server_module = importlib.import_module('nominatim.server.sanic.server')
 
-                app = nominatim.server.sanic.server.get_application(args.project_dir)
-                app.run(host=host, port=port, debug=True)
-            elif args.engine == 'falcon':
-                import uvicorn
-                import nominatim.server.falcon.server
+                app = server_module.get_application(args.project_dir)
+                app.run(host=host, port=port, debug=True, single_process=True)
+            else:
+                import uvicorn # pylint: disable=import-outside-toplevel
+
+                if args.engine == 'falcon':
+                    server_module = importlib.import_module('nominatim.server.falcon.server')
+                elif args.engine == 'starlette':
+                    server_module = importlib.import_module('nominatim.server.starlette.server')
 
-                app = nominatim.server.falcon.server.get_application(args.project_dir)
+                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.
@@ -268,14 +273,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
 
@@ -285,6 +287,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)