Bladeren bron

add command-line option `--log-level`

Fabian Peter Hammerle 3 maanden geleden
bovenliggende
commit
2e71c55391
5 gewijzigde bestanden met toevoegingen van 36 en 1 verwijderingen
  1. 1 0
      CHANGELOG.md
  2. 1 0
      docker-compose.yml
  3. 12 1
      systemctl_mqtt/__init__.py
  4. 21 0
      tests/test_cli.py
  5. 1 0
      tests/test_dbus.py

+ 1 - 0
CHANGELOG.md

@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added
 - suspend when receiving message on topic `systemctl/[hostname]/suspend`
   (https://github.com/fphammerle/systemctl-mqtt/issues/97)
+- command-line option `--log-level {debug,info,warning,error,critical}`
 - automatic discovery in home assistant:
   - entity `button.[hostname]_logind_lock_all_sessions`
   - entity `button.[hostname]_logind_poweroff`

+ 1 - 0
docker-compose.yml

@@ -25,6 +25,7 @@ services:
     #- config:/etc/systemctl-mqtt:ro
     - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:rw
     command: systemctl-mqtt
+      --log-level debug
       --poweroff-delay-seconds 60
       --mqtt-host broker
       --mqtt-disable-tls

+ 12 - 1
systemctl_mqtt/__init__.py

@@ -39,6 +39,10 @@ import systemctl_mqtt._mqtt
 
 _MQTT_DEFAULT_PORT = 1883
 _MQTT_DEFAULT_TLS_PORT = 8883
+_ARGUMENT_LOG_LEVEL_MAPPING = {
+    a: getattr(logging, a.upper())
+    for a in ("debug", "info", "warning", "error", "critical")
+}
 
 _LOGGER = logging.getLogger(__name__)
 
@@ -352,13 +356,19 @@ def _run(  # pylint: disable=too-many-arguments
 
 def _main() -> None:
     logging.basicConfig(
-        level=logging.DEBUG,
+        level=logging.INFO,
         format="%(asctime)s:%(levelname)s:%(message)s",
         datefmt="%Y-%m-%dT%H:%M:%S%z",
     )
     argparser = argparse.ArgumentParser(
         description="MQTT client triggering & reporting shutdown on systemd-based systems",
     )
+    argparser.add_argument(
+        "--log-level",
+        choices=_ARGUMENT_LOG_LEVEL_MAPPING.keys(),
+        default="debug",
+        help="log level (default: debug)",
+    )
     argparser.add_argument("--mqtt-host", type=str, required=True)
     argparser.add_argument(
         "--mqtt-port",
@@ -401,6 +411,7 @@ def _main() -> None:
         "--poweroff-delay-seconds", type=float, default=4.0, help="default: %(default)s"
     )
     args = argparser.parse_args()
+    logging.root.setLevel(_ARGUMENT_LOG_LEVEL_MAPPING[args.log_level])
     if args.mqtt_port:
         mqtt_port = args.mqtt_port
     elif args.mqtt_disable_tls:

+ 21 - 0
tests/test_cli.py

@@ -16,6 +16,7 @@
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 import datetime
+import logging
 import typing
 import unittest.mock
 
@@ -28,6 +29,26 @@ import systemctl_mqtt._utils
 # pylint: disable=protected-access,too-many-positional-arguments
 
 
+@pytest.mark.parametrize(
+    ("args", "log_level"),
+    [
+        ([], logging.DEBUG),
+        (["--log-level", "debug"], logging.DEBUG),
+        (["--log-level", "info"], logging.INFO),
+        (["--log-level", "warning"], logging.WARNING),
+        (["--log-level", "error"], logging.ERROR),
+        (["--log-level", "critical"], logging.CRITICAL),
+    ],
+)
+def test__main_log_level(args: typing.List[str], log_level: int) -> None:
+    with unittest.mock.patch("systemctl_mqtt._run") as run_mock, unittest.mock.patch(
+        "sys.argv", ["", "--mqtt-host", "mqtt-broker.local"] + args
+    ):
+        systemctl_mqtt._main()
+    run_mock.assert_called_once()
+    assert logging.root.getEffectiveLevel() == log_level
+
+
 @pytest.mark.parametrize(
     (
         "argv",

+ 1 - 0
tests/test_dbus.py

@@ -94,6 +94,7 @@ def test__schedule_shutdown(action, delay):
     with unittest.mock.patch(
         "systemctl_mqtt._dbus.get_login_manager_proxy", return_value=login_manager_mock
     ):
+        login_manager_mock.ListInhibitors.return_value = ([],)
         systemctl_mqtt._dbus.schedule_shutdown(action=action, delay=delay)
     login_manager_mock.ScheduleShutdown.assert_called_once()
     schedule_args, schedule_kwargs = login_manager_mock.ScheduleShutdown.call_args