feat: complete client runtime foundation

This commit is contained in:
2026-07-22 16:25:38 +00:00
parent c11a7b5b5b
commit 1219117403
20 changed files with 1201 additions and 48 deletions
+39 -6
View File
@@ -11,7 +11,12 @@ from typing import Sequence
from archive_clients.config import ClientConfig
from archive_clients.daemon import ArchiveClientDaemon
from archive_clients.probes import probe_root
from archive_clients.logging_config import configure_logging
from archive_clients.probes import probe_root, probe_writable_directory
from archive_clients.services import probe_qbittorrent, probe_syncthing
logger = logging.getLogger(__name__)
def main(argv: Sequence[str] | None = None) -> int:
@@ -20,15 +25,16 @@ def main(argv: Sequence[str] | None = None) -> int:
parser.add_argument("--mode", choices=("archive", "cache"))
parser.add_argument("--check-config", action="store_true")
arguments = parser.parse_args(argv)
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
config = ClientConfig.load(arguments.config, arguments.mode)
probes = [
probe_root(config.qbittorrent.local_root),
probe_root(config.syncthing.local_root),
]
config.read_shared_token()
config.qbittorrent.read_password()
config.syncthing.read_api_key()
probe_writable_directory(config.state_db.parent)
probe_writable_directory(config.backup_dir)
shared_token = config.read_shared_token()
qb_password = config.qbittorrent.read_password()
syncthing_key = config.syncthing.read_api_key()
if arguments.check_config:
print(json.dumps({
"client_id": config.client_id,
@@ -36,5 +42,32 @@ def main(argv: Sequence[str] | None = None) -> int:
"filesystems": [probe.__dict__ | {"root": str(probe.root)} for probe in probes],
}, sort_keys=True))
return 0
asyncio.run(ArchiveClientDaemon(config, probes).run())
configure_logging(
secret for secret in (shared_token, qb_password, syncthing_key) if secret
)
logger.info(
"client_starting",
extra={"client_id": config.client_id, "role": config.role},
)
try:
service_probes = [
probe_qbittorrent(config.qbittorrent),
probe_syncthing(config.syncthing),
]
for service in service_probes:
logger.info(
"service_probe_completed",
extra={
"client_id": config.client_id,
"role": config.role,
"service": service.service,
"health": service.state,
},
)
asyncio.run(ArchiveClientDaemon(config, probes, service_probes).run())
except KeyboardInterrupt:
logger.info(
"client_stopped",
extra={"client_id": config.client_id, "role": config.role},
)
return 0