Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inspector by host and port #2618

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 25 additions & 17 deletions sanic/cli/app.py
Expand Up @@ -92,29 +92,20 @@ def run(self, parse_args=None):
self.args,
)

inspector_command = (
self.args.inspect or self.args.inspect_raw or self.args.trigger
)
if inspector_command:
self._inspector(app_loader)
return
try:
app = self._get_app(app_loader)
kwargs = self._build_run_kwargs()
except ValueError as e:
error_logger.exception(f"Failed to run app: {e}")
else:
if self.args.inspect or self.args.inspect_raw or self.args.trigger:
os.environ["SANIC_IGNORE_PRODUCTION_WARNING"] = "true"
else:
for http_version in self.args.http:
app.prepare(**kwargs, version=http_version)

if self.args.inspect or self.args.inspect_raw or self.args.trigger:
action = self.args.trigger or (
"raw" if self.args.inspect_raw else "pretty"
)
inspect(
app.config.INSPECTOR_HOST,
app.config.INSPECTOR_PORT,
action,
)
del os.environ["SANIC_IGNORE_PRODUCTION_WARNING"]
return
for http_version in self.args.http:
app.prepare(**kwargs, version=http_version)

if self.args.single:
serve = Sanic.serve_single
Expand All @@ -124,6 +115,23 @@ def run(self, parse_args=None):
serve = partial(Sanic.serve, app_loader=app_loader)
serve(app)

def _inspector(self, app_loader: AppLoader):
os.environ["SANIC_IGNORE_PRODUCTION_WARNING"] = "true"
host = port = None
if ":" in self.args.module:
maybe_host, maybe_port = self.args.module.split(":", 1)
if maybe_port.isnumeric():
host, port = maybe_host, int(maybe_port)
if not host:
app = self._get_app(app_loader)
host, port = app.config.INSPECTOR_HOST, app.config.INSPECTOR_PORT

action = self.args.trigger or (
"raw" if self.args.inspect_raw else "pretty"
)
inspect(host, port, action)
del os.environ["SANIC_IGNORE_PRODUCTION_WARNING"]

def _precheck(self):
# Custom TLS mismatch handling for better diagnostics
if self.main_process and (
Expand Down
14 changes: 11 additions & 3 deletions sanic/worker/inspector.py
Expand Up @@ -44,7 +44,8 @@ def __call__(self) -> None:
signal_func(SIGINT, self.stop)
signal_func(SIGTERM, self.stop)

logger.info(f"Inspector started on: {sock.getsockname()}")
host, port = sock.getsockname()
logger.info(f"Inspector started @ {host}:{port}")
sock.settimeout(0.5)
try:
while self.run:
Expand All @@ -63,7 +64,8 @@ def __call__(self) -> None:
else:
data = dumps(self.state_to_json())
conn.send(data.encode())
conn.close()
conn.send(b"\r\n\r\n")
conn.close()
finally:
logger.debug("Inspector closing")
sock.close()
Expand Down Expand Up @@ -109,7 +111,13 @@ def inspect(host: str, port: int, action: str):
sock.close()
sys.exit(1)
sock.sendall(action.encode())
data = sock.recv(4096)
more = True
data = b""
while more:
received = sock.recv(4096)
if received.endswith(b"\r\n\r\n"):
more = False
data += received
if action == "raw":
out(data.decode())
elif action == "pretty":
Expand Down