Compare commits

..

6 Commits

Author SHA1 Message Date
L. Kärkkäinen
69d493abce Quiet handling and better message on unix socket bind error too. 2023-10-20 12:53:29 +01:00
L. Kärkkäinen
e6c0f3990c Exit with code 1 on quiet startup failures. Still delete unix socket if one exists. 2023-10-20 12:40:04 +01:00
L. Kärkkäinen
ab19d7b5dd Cleanup. 2023-09-05 19:38:43 +01:00
L. Kärkkäinen
abdb5cb531 Better diagnostic for permission denied on bind() for low ports. 2023-09-05 19:28:46 +01:00
L. Kärkkäinen
b9b54a2eda Cleanup crash messages. Handle quiet exceptions quietly. Don't re-raise because that would print the traceback twice. 2023-09-05 19:28:17 +01:00
Néstor Pérez
47215d4635 Run tests on push as well (#2814) 2023-08-30 20:03:22 +03:00
4 changed files with 32 additions and 26 deletions

View File

@@ -1,6 +1,13 @@
name: Tests
on:
push:
branches:
- main
- current-release
- "*LTS"
tags:
- "!*"
pull_request:
branches:
- main

View File

@@ -49,7 +49,7 @@ from sanic.application.motd import MOTD
from sanic.application.state import ApplicationServerInfo, Mode, ServerStage
from sanic.base.meta import SanicMeta
from sanic.compat import OS_IS_WINDOWS, StartMethod
from sanic.exceptions import ServerKilled
from sanic.exceptions import SanicException, ServerKilled
from sanic.helpers import Default, _default, is_atty
from sanic.http.constants import HTTP
from sanic.http.tls import get_ssl_context, process_to_context
@@ -880,12 +880,18 @@ class StartupMixin(metaclass=SanicMeta):
manager.run()
except ServerKilled:
exit_code = 1
except SanicException as e:
exit_code = 1
kwargs = primary_server_info.settings
if e.quiet:
error_logger.error(str(e))
else:
raise
except BaseException:
kwargs = primary_server_info.settings
error_logger.exception(
"Experienced exception while trying to serve"
)
raise
finally:
logger.info("Server Stopped")
for app in apps:

View File

@@ -47,10 +47,10 @@ def bind_unix_socket(path: str, *, mode=0o666, backlog=100) -> socket.socket:
path = os.path.abspath(path)
folder = os.path.dirname(path)
if not os.path.isdir(folder):
raise FileNotFoundError(f"Socket folder does not exist: {folder}")
raise FileNotFoundError("Socket folder does not exist")
try:
if not stat.S_ISSOCK(os.stat(path, follow_symlinks=False).st_mode):
raise FileExistsError(f"Existing file is not a socket: {path}")
raise FileExistsError("Existing file is not a socket")
except FileNotFoundError:
pass
# Create new socket with a random temporary name
@@ -103,7 +103,10 @@ def configure_socket(
unix = server_settings["unix"]
backlog = server_settings["backlog"]
if unix:
sock = bind_unix_socket(unix, backlog=backlog)
try:
sock = bind_unix_socket(unix, backlog=backlog)
except OSError as e:
raise ServerError(f"Error binding {unix}: {e}", quiet=True)
server_settings["unix"] = unix
if sock is None:
try:
@@ -112,6 +115,17 @@ def configure_socket(
server_settings["port"],
backlog=backlog,
)
except PermissionError:
p = server_settings["port"]
if not p or p >= 1024:
raise
addr = f"{server_settings['host']}:{p}"
error = ServerError(
f"Permission denied binding to {addr}.\n\n"
"Use `sudo sanic` to run on a privileged port.\n"
)
error.quiet = True
raise error
except OSError as e: # no cov
error = ServerError(
f"Sanic server could not start: {e}.\n\n"

View File

@@ -39,7 +39,6 @@ class Event(Enum):
RESERVED_NAMESPACES = {
"sanic": ("sanic.__signal__.__init__",),
"server": (
Event.SERVER_EXCEPTION_REPORT.value,
Event.SERVER_INIT_AFTER.value,
@@ -66,8 +65,6 @@ RESERVED_NAMESPACES = {
),
}
GENERIC_SIGNAL_FORMAT = "__generic__.__signal__.%s"
def _blank():
...
@@ -92,26 +89,11 @@ class SignalRouter(BaseRouter):
self.allow_fail_builtin = True
self.ctx.loop = None
@staticmethod
def format_event(event: str) -> str:
"""Ensure event strings in proper format
Args:
event (str): event string
Returns:
str: formatted event string
"""
if "." not in event:
event = GENERIC_SIGNAL_FORMAT % event
return event
def get( # type: ignore
self,
event: str,
condition: Optional[Dict[str, str]] = None,
):
event = self.format_event(event)
extra = condition or {}
try:
group, param_basket = self.find_route(
@@ -151,7 +133,6 @@ class SignalRouter(BaseRouter):
fail_not_found: bool = True,
reverse: bool = False,
) -> Any:
event = self.format_event(event)
try:
group, handlers, params = self.get(event, condition=condition)
except NotFound as e:
@@ -214,7 +195,6 @@ class SignalRouter(BaseRouter):
inline: bool = False,
reverse: bool = False,
) -> Union[asyncio.Task, Any]:
event = self.format_event(event)
dispatch = self._dispatch(
event,
context=context,
@@ -238,7 +218,6 @@ class SignalRouter(BaseRouter):
condition: Optional[Dict[str, Any]] = None,
exclusive: bool = True,
) -> Signal:
event = self.format_event(event)
event_definition = event
parts = self._build_event_parts(event)
if parts[2].startswith("<"):