acces distant : le tunnel jean-link tourne aussi hors systemd (macOS/Windows)

linkServiceCtl/linkServiceActive etaient Linux-only : sur un Mac le token
etait bien enregistre mais rien ne composait jamais le tunnel, d'ou le
message << service arrete >> permanent. Hors Linux on lance desormais
'jean link serve' en processus detache suivi par un fichier PID
(spawnDetached/pidAlive/killTree, nouvelles primitives par plateforme).

- le mode app relance le tunnel au demarrage si une cle est enregistree
- nouvelle route POST /api/link/start + bouton << demarrer le tunnel >>
  dans le panneau, visible quand le lien est configure mais arrete
This commit is contained in:
nathaninline committed 2026-07-25 12:02:31 +02:00
1 parent 9787923879
commit 075a05ebaa
9 files changed
+214 -7

No files matched your search

+37
View File
@@ -13,6 +13,7 @@ import (
"strconv"
"strings"
"syscall"
"time"
)
// defaultJeanHome is the data root when neither $JEAN_HOME nor /etc/default/jean
@@ -295,3 +296,39 @@ func ramUsageMB() (used, total int) {
}
return (totalKB - availKB) / 1024, totalKB / 1024
}
// --- Supervision de processus détachés (worker de lien, service en mode
// utilisateur). Pendant Unix de sys_platform_windows.go.
// spawnDetached prépare une commande qui survivra à la mort de Jean : Setsid la
// place dans une nouvelle session, donc elle n'est pas tuée avec notre groupe.
func spawnDetached(name string, args ...string) *exec.Cmd {
cmd := exec.Command(name, args...)
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
return cmd
}
// pidAlive : le signal 0 ne tue rien, il teste juste l'existence du process.
func pidAlive(pid int) bool {
if pid <= 0 {
return false
}
return syscall.Kill(pid, 0) == nil
}
// killTree arrête le process ET ses enfants. Setsid ayant fait de lui un chef de
// groupe, un PID négatif vise le groupe entier ; SIGKILL en dernier recours.
func killTree(pid int) {
if pid <= 0 {
return
}
if err := syscall.Kill(-pid, syscall.SIGTERM); err != nil {
_ = syscall.Kill(pid, syscall.SIGTERM)
}
for i := 0; i < 30 && pidAlive(pid); i++ {
time.Sleep(100 * time.Millisecond)
}
if pidAlive(pid) {
_ = syscall.Kill(-pid, syscall.SIGKILL)
}
}