feat: change --host default to 127.0.0.1, add --auth and --session-ttl flags

- Change serve() signature: host='127.0.0.1', add auth='pam', session_ttl=604800
- Inside serve(): set MUXPLEX_AUTH and MUXPLEX_SESSION_TTL env defaults
- Change --host CLI default from '0.0.0.0' to '127.0.0.1'
- Add --auth argument with choices=['pam', 'password'], default='pam'
- Add --session-ttl argument, type=int, default=604800 (7 days; 0=browser session)
- Update serve() call in main() to forward auth and session_ttl
- Update test_main_calls_serve_by_default assertion for new defaults
- Add test_main_default_host_is_localhost
- Add test_main_passes_auth_flag
- Add test_main_passes_session_ttl_flag

Co-authored-by: Amplifier <amplifier@amplified.dev>
This commit is contained in:
Brian Krabach
2026-03-28 22:46:23 -07:00
parent fd55a71958
commit 159b2c3618
2 changed files with 68 additions and 7 deletions
+25 -3
View File
@@ -9,11 +9,18 @@ from pathlib import Path
_system_service_path = Path("/etc/systemd/system/muxplex.service") _system_service_path = Path("/etc/systemd/system/muxplex.service")
def serve(host: str = "0.0.0.0", port: int = 8088) -> None: def serve(
host: str = "127.0.0.1",
port: int = 8088,
auth: str = "pam",
session_ttl: int = 604800,
) -> None:
"""Start the muxplex server.""" """Start the muxplex server."""
import uvicorn # noqa: PLC0415 import uvicorn # noqa: PLC0415
os.environ.setdefault("MUXPLEX_PORT", str(port)) os.environ.setdefault("MUXPLEX_PORT", str(port))
os.environ.setdefault("MUXPLEX_AUTH", auth)
os.environ.setdefault("MUXPLEX_SESSION_TTL", str(session_ttl))
from muxplex.main import app # noqa: PLC0415 from muxplex.main import app # noqa: PLC0415
@@ -69,9 +76,22 @@ def main() -> None:
description="muxplex — web-based tmux session dashboard", description="muxplex — web-based tmux session dashboard",
) )
parser.add_argument( parser.add_argument(
"--host", default="0.0.0.0", help="Bind host (default: 0.0.0.0)" "--host", default="127.0.0.1", help="Bind host (default: 127.0.0.1)"
) )
parser.add_argument("--port", type=int, default=8088, help="Port (default: 8088)") parser.add_argument("--port", type=int, default=8088, help="Port (default: 8088)")
parser.add_argument(
"--auth",
choices=["pam", "password"],
default="pam",
help="Authentication method: pam or password (default: pam)",
)
parser.add_argument(
"--session-ttl",
type=int,
default=604800,
dest="session_ttl",
help="Session TTL in seconds (default: 604800 = 7 days; 0 = browser session)",
)
sub = parser.add_subparsers(dest="command") sub = parser.add_subparsers(dest="command")
sub.add_parser("serve", help="Start the server (default)") sub.add_parser("serve", help="Start the server (default)")
@@ -86,4 +106,6 @@ def main() -> None:
if args.command == "install-service": if args.command == "install-service":
install_service(system=args.system) install_service(system=args.system)
else: else:
serve(host=args.host, port=args.port) serve(
host=args.host, port=args.port, auth=args.auth, session_ttl=args.session_ttl
)
+43 -4
View File
@@ -10,13 +10,15 @@ def test_cli_module_importable():
def test_main_calls_serve_by_default(): def test_main_calls_serve_by_default():
"""Calling main() with no args must invoke serve().""" """Calling main() with no args must invoke serve() with new defaults."""
from muxplex.cli import main from muxplex.cli import main
with patch("muxplex.cli.serve") as mock_serve: with patch("muxplex.cli.serve") as mock_serve:
with patch("sys.argv", ["muxplex"]): with patch("sys.argv", ["muxplex"]):
main() main()
mock_serve.assert_called_once_with(host="0.0.0.0", port=8088) mock_serve.assert_called_once_with(
host="127.0.0.1", port=8088, auth="pam", session_ttl=604800
)
def test_main_passes_custom_host_and_port(): def test_main_passes_custom_host_and_port():
@@ -24,9 +26,46 @@ def test_main_passes_custom_host_and_port():
from muxplex.cli import main from muxplex.cli import main
with patch("muxplex.cli.serve") as mock_serve: with patch("muxplex.cli.serve") as mock_serve:
with patch("sys.argv", ["muxplex", "--host", "127.0.0.1", "--port", "9000"]): with patch("sys.argv", ["muxplex", "--host", "192.168.1.1", "--port", "9000"]):
main() main()
mock_serve.assert_called_once_with(host="127.0.0.1", port=9000) mock_serve.assert_called_once_with(
host="192.168.1.1", port=9000, auth="pam", session_ttl=604800
)
def test_main_default_host_is_localhost():
"""Default --host must be 127.0.0.1 (not 0.0.0.0)."""
from muxplex.cli import main
with patch("muxplex.cli.serve") as mock_serve:
with patch("sys.argv", ["muxplex"]):
main()
_, kwargs = mock_serve.call_args
assert kwargs["host"] == "127.0.0.1"
def test_main_passes_auth_flag():
"""main() with --auth password must forward auth='password' to serve()."""
from muxplex.cli import main
with patch("muxplex.cli.serve") as mock_serve:
with patch("sys.argv", ["muxplex", "--auth", "password"]):
main()
mock_serve.assert_called_once_with(
host="127.0.0.1", port=8088, auth="password", session_ttl=604800
)
def test_main_passes_session_ttl_flag():
"""main() with --session-ttl 3600 must forward session_ttl=3600 to serve()."""
from muxplex.cli import main
with patch("muxplex.cli.serve") as mock_serve:
with patch("sys.argv", ["muxplex", "--session-ttl", "3600"]):
main()
mock_serve.assert_called_once_with(
host="127.0.0.1", port=8088, auth="pam", session_ttl=3600
)
def test_main_install_service_subcommand(): def test_main_install_service_subcommand():