Recopier un jeton de trente-trois caractères sur un clavier tactile n'était pas un réglage, c'était une corvée. On ouvre désormais une fenêtre depuis le serveur, on appuie sur Appairer côté téléphone, et c'est fait. Le jeton n'est pas pour autant distribué : ouvrir la fenêtre l'exige déjà, elle dure deux minutes, se referme dès qu'un appareil s'est servi, et ne répond qu'à une adresse privée. Le champ de saisie reste là pour qui préfère le coller. Les cinquante fichiers de code portent en outre leur notice de licence, comme la GPL le recommande. Elle est en français, comme le reste ; le texte qui fait foi demeure celui de LICENSE, non traduit.
55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
# Noxely — collecte côté serveur, écoute hors connexion côté mobile.
|
|
# Copyright © 2026 Johnny (tuxgyver)
|
|
#
|
|
# Ce programme est un logiciel libre : vous pouvez le redistribuer et le modifier
|
|
# selon les termes de la GNU General Public License, version 3 ou ultérieure,
|
|
# telle que publiée par la Free Software Foundation.
|
|
#
|
|
# Il est distribué dans l'espoir d'être utile, mais SANS AUCUNE GARANTIE.
|
|
# Voir le fichier LICENSE à la racine du dépôt pour le texte complet.
|
|
|
|
"""Point d'entrée : `python -m noxely_server`."""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
|
|
import uvicorn
|
|
|
|
from .config import load
|
|
|
|
|
|
def ensure_usable(data_dir) -> None:
|
|
"""Le dossier de données est la première chose qui peut manquer : on le dit clairement."""
|
|
try:
|
|
data_dir.mkdir(parents=True, exist_ok=True)
|
|
probe = data_dir / ".ecriture"
|
|
probe.touch()
|
|
probe.unlink()
|
|
except PermissionError:
|
|
print(
|
|
f"[noxely] Droits insuffisants sur {data_dir}.\n"
|
|
f" Choisissez un dossier accessible dans server/.env (NOXELY_DATA=./data),\n"
|
|
f" ou créez-le : sudo install -d -o $(whoami) {data_dir}",
|
|
file=sys.stderr,
|
|
)
|
|
raise SystemExit(1)
|
|
except OSError as error:
|
|
print(f"[noxely] Dossier de données inutilisable ({data_dir}) : {error}", file=sys.stderr)
|
|
raise SystemExit(1)
|
|
|
|
|
|
def main() -> None:
|
|
config = load()
|
|
ensure_usable(config.data_dir)
|
|
|
|
# Importé après la vérification : l'application ouvre la base dès son chargement.
|
|
from .api import app
|
|
|
|
print(f"[noxely] données : {config.data_dir}")
|
|
print(f"[noxely] écoute : http://{config.host}:{config.port}")
|
|
uvicorn.run(app, host=config.host, port=config.port, log_level="info")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|