]> git.openstreetmap.org Git - nominatim.git/blobdiff - src/nominatim_db/cli.py
remove remaining references to php code
[nominatim.git] / src / nominatim_db / cli.py
index 548f116598caadcd7b324b9516af7d97eb91c6b2..9a54f338e0f61daecf8fe9e0de0a85a9d53f48f0 100644 (file)
@@ -14,11 +14,11 @@ import logging
 import os
 import sys
 import argparse
 import os
 import sys
 import argparse
+import asyncio
 from pathlib import Path
 
 from pathlib import Path
 
-from nominatim_core.config import Configuration
-from nominatim_core.errors import UsageError
-from .tools.exec_utils import run_php_server
+from .config import Configuration
+from .errors import UsageError
 from . import clicmd
 from . import version
 from .clicmd.args import NominatimArgs, Subcommand
 from . import clicmd
 from . import version
 from .clicmd.args import NominatimArgs, Subcommand
@@ -118,7 +118,13 @@ class CommandlineParser:
         log.warning('Using project directory: %s', str(args.project_dir))
 
         try:
         log.warning('Using project directory: %s', str(args.project_dir))
 
         try:
-            return args.command.run(args)
+            ret = args.command.run(args)
+
+            if args.config.TOKENIZER == 'legacy':
+                log.warning('WARNING: the "legacy" tokenizer is deprecated '
+                            'and will be removed in Nominatim 5.0.')
+
+            return ret
         except UsageError as exception:
             if log.isEnabledFor(logging.DEBUG):
                 raise # use Python's exception printing
         except UsageError as exception:
             if log.isEnabledFor(logging.DEBUG):
                 raise # use Python's exception printing
@@ -147,10 +153,10 @@ class AdminServe:
     from the current project directory. This webserver is only suitable
     for testing and development. Do not use it in production setups!
 
     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.
+    There are two different webserver implementations for Python available:
+    falcon (the default) and starlette. You need to make sure the
+    appropriate Python packages as well as the uvicorn package are
+    installed to use this function.
 
     By the default, the webserver can be accessed at: http://127.0.0.1:8088
     """
 
     By the default, the webserver can be accessed at: http://127.0.0.1:8088
     """
@@ -160,32 +166,35 @@ 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='falcon',
         group.add_argument('--server', default='127.0.0.1:8088',
                            help='The address the server will listen to.')
         group.add_argument('--engine', default='falcon',
-                           choices=('php', 'falcon', 'starlette'),
+                           choices=('falcon', 'starlette'),
                            help='Webserver framework to run. (default: falcon)')
 
 
     def run(self, args: NominatimArgs) -> int:
                            help='Webserver framework to run. (default: falcon)')
 
 
     def run(self, args: NominatimArgs) -> int:
-        if args.engine == 'php':
-            if args.config.lib_dir.php is None:
-                raise UsageError("PHP frontend not configured.")
-            run_php_server(args.server, args.project_dir / 'website')
+        asyncio.run(self.run_uvicorn(args))
+
+        return 0
+
+
+    async def run_uvicorn(self, args: NominatimArgs) -> None:
+        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 <host>:<port>')
+            port = int(server_info[1])
         else:
         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 <host>:<port>')
-                port = int(server_info[1])
-            else:
-                port = 8088
+            port = 8088
 
 
-            server_module = importlib.import_module(f'nominatim.server.{args.engine}.server')
+        server_module = importlib.import_module(f'nominatim_api.server.{args.engine}.server')
 
 
-            app = server_module.get_application(args.project_dir)
-            uvicorn.run(app, host=host, port=port)
+        app = server_module.get_application(args.project_dir)
 
 
-        return 0
+        config = uvicorn.Config(app, host=host, port=port)
+        server = uvicorn.Server(config)
+        await server.serve()
 
 
 def get_set_parser() -> CommandlineParser:
 
 
 def get_set_parser() -> CommandlineParser:
@@ -207,15 +216,30 @@ def get_set_parser() -> CommandlineParser:
 
     parser.add_subcommand('admin', clicmd.AdminFuncs())
 
 
     parser.add_subcommand('admin', clicmd.AdminFuncs())
 
-    parser.add_subcommand('export', clicmd.QueryExport())
-    parser.add_subcommand('convert', clicmd.ConvertDB())
-    parser.add_subcommand('serve', AdminServe())
+    try:
+        exportcmd = importlib.import_module('nominatim_db.clicmd.export')
+        apicmd = importlib.import_module('nominatim_db.clicmd.api')
+        convertcmd = importlib.import_module('nominatim_db.clicmd.convert')
+
+        parser.add_subcommand('export', exportcmd.QueryExport())
+        parser.add_subcommand('convert', convertcmd.ConvertDB())
+        parser.add_subcommand('serve', AdminServe())
+
+        parser.add_subcommand('search', apicmd.APISearch())
+        parser.add_subcommand('reverse', apicmd.APIReverse())
+        parser.add_subcommand('lookup', apicmd.APILookup())
+        parser.add_subcommand('details', apicmd.APIDetails())
+        parser.add_subcommand('status', apicmd.APIStatus())
+    except ModuleNotFoundError as ex:
+        if not ex.name or 'nominatim_api' not in ex.name: # pylint: disable=E1135
+            raise ex
+
+        parser.parser.epilog = \
+            f'\n\nNominatim API package not found (was looking for module: {ex.name}).'\
+            '\nThe following commands are not available:'\
+            '\n    export, convert, serve, search, reverse, lookup, details, status'\
+            "\n\nRun 'pip install nominatim-api' to install the package."
 
 
-    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
 
 
     return parser