Skip to content

Commit d3fcbd5

Browse files
committed
Add an endpoint to force a server shutdown
this is only needed during development, so that if we end up with some user running a server on a machine we can stop it remotely. Obviously this function should be removed before we deploy for production.
1 parent 6993aac commit d3fcbd5

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

src/murfey/server/__init__.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
template_files = files("murfey") / "templates"
2929
templates = Jinja2Templates(directory=template_files)
3030

31+
_running_server: uvicorn.Server | None = None
32+
3133

3234
def respond_with_template(filename: str, parameters: dict[str, Any] | None = None):
3335
template_parameters = {
@@ -179,16 +181,26 @@ def run():
179181
logger.info(
180182
f"Starting Murfey server version {murfey.__version__}, listening on {args.host}:{args.port}"
181183
)
182-
uvicorn.run(
184+
global _running_server
185+
config = uvicorn.Config(
183186
"murfey.server.main:app",
184187
host=args.host,
185188
port=args.port,
186189
env_file=args.env_file,
187190
log_config=None,
188191
)
192+
_running_server = uvicorn.Server(config=config)
193+
_running_server.run()
189194
logger.info("Server shutting down")
190195

191196

197+
def shutdown():
198+
global _running_server
199+
if _running_server:
200+
_running_server.should_exit = True
201+
_running_server.force_exit = True
202+
203+
192204
@functools.lru_cache()
193205
def get_microscope():
194206
try:

src/murfey/server/main.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import datetime
4+
import logging
45

56
import ispyb
67
import packaging.version
@@ -11,11 +12,13 @@
1112
from ispyb.sqlalchemy import BLSession, Proposal
1213
from pydantic import BaseModel
1314

14-
import murfey
15+
import murfey.server
1516
import murfey.server.bootstrap
1617
import murfey.server.websocket as ws
1718
from murfey.server import get_hostname, get_microscope, template_files, templates
1819

20+
log = logging.getLogger("murfey.server.main")
21+
1922
tags_metadata = [murfey.server.bootstrap.tag]
2023

2124
app = FastAPI(title="Murfey server", debug=True, openapi_tags=tags_metadata)
@@ -185,3 +188,13 @@ def get_version(client_version: str = ""):
185188
result["client-needs-downgrade"] = client > server
186189

187190
return result
191+
192+
193+
@app.get("/shutdown", include_in_schema=False)
194+
def shutdown():
195+
"""A method to stop the server. This should be removed before Murfey is
196+
deployed in production. To remove it we need to figure out how to control
197+
to process (eg. systemd) and who to run it as."""
198+
log.info("Server shutdown request received")
199+
murfey.server.shutdown()
200+
return {"success": True}

0 commit comments

Comments
 (0)