smanager 0.2.1__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {smanager-0.2.1 → smanager-0.2.2}/PKG-INFO +1 -1
  2. {smanager-0.2.1 → smanager-0.2.2}/smanager/__init__.py +1 -1
  3. {smanager-0.2.1 → smanager-0.2.2}/smanager/service_managers/local_manager.py +11 -2
  4. {smanager-0.2.1 → smanager-0.2.2}/smanager.egg-info/PKG-INFO +1 -1
  5. {smanager-0.2.1 → smanager-0.2.2}/tests/test_service_manager_events.py +16 -1
  6. {smanager-0.2.1 → smanager-0.2.2}/README.md +0 -0
  7. {smanager-0.2.1 → smanager-0.2.2}/pyproject.toml +0 -0
  8. {smanager-0.2.1 → smanager-0.2.2}/setup.cfg +0 -0
  9. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/__init__.py +0 -0
  10. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/__init__.py +0 -0
  11. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/all.py +0 -0
  12. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/config.py +0 -0
  13. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/dependency.py +0 -0
  14. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/group.py +0 -0
  15. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/metadata.py +0 -0
  16. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/service.py +0 -0
  17. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/commands/status.py +0 -0
  18. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/config.py +0 -0
  19. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/events.py +0 -0
  20. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/formatters/__init__.py +0 -0
  21. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/formatters/status_table.py +0 -0
  22. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/main.py +0 -0
  23. {smanager-0.2.1 → smanager-0.2.2}/smanager/cli/metadata_wizard.py +0 -0
  24. {smanager-0.2.1 → smanager-0.2.2}/smanager/crawler/__init__.py +0 -0
  25. {smanager-0.2.1 → smanager-0.2.2}/smanager/crawler/sd_finder.py +0 -0
  26. {smanager-0.2.1 → smanager-0.2.2}/smanager/datatypes/__init__.py +0 -0
  27. {smanager-0.2.1 → smanager-0.2.2}/smanager/datatypes/config.py +0 -0
  28. {smanager-0.2.1 → smanager-0.2.2}/smanager/datatypes/sd_info_v2.py +0 -0
  29. {smanager-0.2.1 → smanager-0.2.2}/smanager/datatypes/service_status.py +0 -0
  30. {smanager-0.2.1 → smanager-0.2.2}/smanager/events.py +0 -0
  31. {smanager-0.2.1 → smanager-0.2.2}/smanager/global_manager/__init__.py +0 -0
  32. {smanager-0.2.1 → smanager-0.2.2}/smanager/global_manager/base_global_manager.py +0 -0
  33. {smanager-0.2.1 → smanager-0.2.2}/smanager/global_manager/global_manager.py +0 -0
  34. {smanager-0.2.1 → smanager-0.2.2}/smanager/service_managers/__init__.py +0 -0
  35. {smanager-0.2.1 → smanager-0.2.2}/smanager/service_managers/base_manager.py +0 -0
  36. {smanager-0.2.1 → smanager-0.2.2}/smanager/service_managers/base_sdv2_manager.py +0 -0
  37. {smanager-0.2.1 → smanager-0.2.2}/smanager/service_managers/docker_manager.py +0 -0
  38. {smanager-0.2.1 → smanager-0.2.2}/smanager/vpn/__init__.py +0 -0
  39. {smanager-0.2.1 → smanager-0.2.2}/smanager/vpn/base_vpn.py +0 -0
  40. {smanager-0.2.1 → smanager-0.2.2}/smanager/vpn/providers/__init__.py +0 -0
  41. {smanager-0.2.1 → smanager-0.2.2}/smanager/vpn/providers/tailscale.py +0 -0
  42. {smanager-0.2.1 → smanager-0.2.2}/smanager/vpn/registry.py +0 -0
  43. {smanager-0.2.1 → smanager-0.2.2}/smanager.egg-info/SOURCES.txt +0 -0
  44. {smanager-0.2.1 → smanager-0.2.2}/smanager.egg-info/dependency_links.txt +0 -0
  45. {smanager-0.2.1 → smanager-0.2.2}/smanager.egg-info/entry_points.txt +0 -0
  46. {smanager-0.2.1 → smanager-0.2.2}/smanager.egg-info/requires.txt +0 -0
  47. {smanager-0.2.1 → smanager-0.2.2}/smanager.egg-info/top_level.txt +0 -0
  48. {smanager-0.2.1 → smanager-0.2.2}/tests/test_cli_events.py +0 -0
  49. {smanager-0.2.1 → smanager-0.2.2}/tests/test_events.py +0 -0
  50. {smanager-0.2.1 → smanager-0.2.2}/tests/test_metadata_wizard.py +0 -0
  51. {smanager-0.2.1 → smanager-0.2.2}/tests/test_status_output.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smanager
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Requires-Python: >=3.9
5
5
  Requires-Dist: PyYAML>=6.0
6
6
  Requires-Dist: click>=8.0
@@ -1,4 +1,4 @@
1
- __version__ = "0.2.1"
1
+ __version__ = "0.2.2"
2
2
 
3
3
  from .global_manager import GlobalManager
4
4
  from .datatypes import GlobalConfig, Service, ServiceStatus, MultiStatus
@@ -2,6 +2,7 @@ from . import BaseSDV2Manager
2
2
  from ..datatypes import Service
3
3
  from ..vpn import VPNService
4
4
  import time
5
+ import subprocess
5
6
  from ..datatypes import ServiceStatus, SingleStatus
6
7
 
7
8
  class LocalManager(BaseSDV2Manager):
@@ -105,10 +106,18 @@ class LocalManager(BaseSDV2Manager):
105
106
  """Check the status of the local systemd service and return a ServiceStatus object."""
106
107
  service_statuses = []
107
108
  for service_name in self._get_systemd_services():
108
- result = self.subprocess_run(["systemctl", "is-active", service_name])
109
+ result = subprocess.run(
110
+ ["systemctl", "is-active", service_name],
111
+ capture_output=True,
112
+ text=True,
113
+ check=False,
114
+ )
115
+ status_text = result.stdout.strip() or result.stderr.strip()
116
+ if not status_text:
117
+ status_text = "active" if result.returncode == 0 else "inactive"
109
118
  status = SingleStatus(
110
119
  name=service_name,
111
- status=result.stdout.strip()
120
+ status=status_text
112
121
  )
113
122
  service_statuses.append(status)
114
123
  return ServiceStatus(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smanager
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Requires-Python: >=3.9
5
5
  Requires-Dist: PyYAML>=6.0
6
6
  Requires-Dist: click>=8.0
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
  from tempfile import TemporaryDirectory
5
5
  from types import SimpleNamespace
6
6
  import unittest
7
- from unittest.mock import Mock
7
+ from unittest.mock import Mock, patch
8
8
 
9
9
  from smanager.datatypes import (
10
10
  DockerSection,
@@ -161,3 +161,18 @@ class LocalManagerEventTests(unittest.TestCase):
161
161
  manager.stop()
162
162
 
163
163
  self.assertEqual(events, ["service.stop.before", "service.stop.after"])
164
+
165
+ def test_status_returns_inactive_when_systemctl_reports_inactive(self):
166
+ with TemporaryDirectory() as tmpdir:
167
+ service_dir = Path(tmpdir) / "local"
168
+ service_dir.mkdir()
169
+ service = make_local_service(service_dir, active=True)
170
+
171
+ manager = LocalManager(service, DummyVPN())
172
+
173
+ fake_result = SimpleNamespace(stdout="inactive\n", stderr="", returncode=4)
174
+ with patch("smanager.service_managers.local_manager.subprocess.run", return_value=fake_result) as run_mock:
175
+ result = manager.status()
176
+
177
+ self.assertEqual(result.statuses[0].status, "inactive")
178
+ run_mock.assert_called_once()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes