mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-21 22:18:13 +02:00
acces distant : remplacer un worker de tunnel issu d'une autre copie de l'app
Le worker est detache expres pour survivre a la fermeture de Jean.app : un worker lance par une ancienne copie (translocatee ou version precedente) continue donc de servir l'UI distante avec du code perime — l'alerte App Translocation s'affichait sur app.ajean.link alors que l'app locale tournait bien depuis /Applications. Le fichier PID porte desormais le binaire d'origine en 2e ligne ; au demarrage, un worker dont le binaire differe du notre est redemarre.
This commit is contained in:
1 parent
43ea4ad6c7
commit
f8e856ed7c
2 files changed
+55
-2
No files matched your search
@@ -47,7 +47,17 @@ func cmdApp(args []string) error {
|
|||||||
// fait : sans ça le token reste enregistré et le panneau affiche « service
|
// fait : sans ça le token reste enregistré et le panneau affiche « service
|
||||||
// arrêté » à chaque démarrage de l'app.
|
// arrêté » à chaque démarrage de l'app.
|
||||||
go func() {
|
go func() {
|
||||||
if readLinkToken() != "" && !linkServiceActive() {
|
if readLinkToken() == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Worker rescapé d'une AUTRE copie de l'app (ancienne version, copie
|
||||||
|
// translocatée…) : il tourne toujours — le tunnel est détaché exprès — et
|
||||||
|
// continue de servir l'UI distante avec du code périmé. On le remplace.
|
||||||
|
if linkWorkerIsStale() {
|
||||||
|
_ = linkServiceCtl("restart")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !linkServiceActive() {
|
||||||
_ = linkServiceCtl("start")
|
_ = linkServiceCtl("start")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -319,6 +319,41 @@ func linkServiceActive() bool {
|
|||||||
return strings.TrimSpace(string(out)) == "active"
|
return strings.TrimSpace(string(out)) == "active"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// linkUserExe renvoie le binaire qui a lancé le worker de lien en cours (2e ligne
|
||||||
|
// du fichier PID), "" si inconnu. Sert à repérer un worker rescapé d'une ANCIENNE
|
||||||
|
// copie de l'app : le tunnel étant détaché exprès pour survivre à la fermeture de
|
||||||
|
// Jean.app, un worker lancé depuis une copie translocatée (ou simplement une
|
||||||
|
// version précédente) continue de servir l'UI distante avec du code périmé —
|
||||||
|
// symptôme vécu : l'alerte App Translocation visible sur app.ajean.link alors que
|
||||||
|
// l'app locale, elle, tourne bien depuis /Applications.
|
||||||
|
func linkUserExe() string {
|
||||||
|
b, err := os.ReadFile(linkPIDPath())
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
lines := strings.SplitN(strings.TrimSpace(string(b)), "\n", 2)
|
||||||
|
if len(lines) < 2 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(lines[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
// linkWorkerIsStale : un worker tourne, mais depuis un autre binaire que nous.
|
||||||
|
func linkWorkerIsStale() bool {
|
||||||
|
if runtime.GOOS == "linux" || linkUserPID() == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
exe, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if p, err := filepath.EvalSymlinks(exe); err == nil {
|
||||||
|
exe = p
|
||||||
|
}
|
||||||
|
running := linkUserExe()
|
||||||
|
return running != "" && running != exe
|
||||||
|
}
|
||||||
|
|
||||||
// linkUserPID renvoie le PID du worker de lien s'il tourne vraiment, 0 sinon
|
// linkUserPID renvoie le PID du worker de lien s'il tourne vraiment, 0 sinon
|
||||||
// (fichier absent, illisible, ou process mort → on nettoie le fichier obsolète).
|
// (fichier absent, illisible, ou process mort → on nettoie le fichier obsolète).
|
||||||
func linkUserPID() int {
|
func linkUserPID() int {
|
||||||
@@ -326,6 +361,9 @@ func linkUserPID() int {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
if i := strings.IndexByte(string(b), '\n'); i >= 0 {
|
||||||
|
b = b[:i]
|
||||||
|
}
|
||||||
pid, _ := strconv.Atoi(strings.TrimSpace(string(b)))
|
pid, _ := strconv.Atoi(strings.TrimSpace(string(b)))
|
||||||
if pid <= 0 || !pidAlive(pid) {
|
if pid <= 0 || !pidAlive(pid) {
|
||||||
return 0
|
return 0
|
||||||
@@ -361,6 +399,9 @@ func linkUserSvcCtl(action string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if p, err := filepath.EvalSymlinks(self); err == nil {
|
||||||
|
self = p // même forme que la comparaison de linkWorkerIsStale
|
||||||
|
}
|
||||||
if err := os.MkdirAll(JeanHome(), 0o755); err != nil {
|
if err := os.MkdirAll(JeanHome(), 0o755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -376,7 +417,9 @@ func linkUserSvcCtl(action string) error {
|
|||||||
return fmt.Errorf("démarrage de « jean link serve »: %w", err)
|
return fmt.Errorf("démarrage de « jean link serve »: %w", err)
|
||||||
}
|
}
|
||||||
pid := cmd.Process.Pid
|
pid := cmd.Process.Pid
|
||||||
if err := os.WriteFile(linkPIDPath(), []byte(strconv.Itoa(pid)), 0o644); err != nil {
|
// PID + binaire d'origine : la 2e ligne permet de détecter plus tard un worker
|
||||||
|
// rescapé d'une ancienne copie de l'app (voir linkWorkerIsStale).
|
||||||
|
if err := os.WriteFile(linkPIDPath(), []byte(strconv.Itoa(pid)+"\n"+self+"\n"), 0o644); err != nil {
|
||||||
return fmt.Errorf("écriture du PID: %w", err)
|
return fmt.Errorf("écriture du PID: %w", err)
|
||||||
}
|
}
|
||||||
_ = cmd.Process.Release()
|
_ = cmd.Process.Release()
|
||||||
|
|||||||
Reference in new issue
Block a user