mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-20 13:38:11 +02:00
v0.6.10 : dossier de travail pour l'agent, lancement Windows explicite, mise à jour lisible, icône noire
- mode agent : les outils write/edit/bash résolvent les chemins relatifs dans JEAN_HOME/workspace et le shell y démarre, au lieu du répertoire courant du processus (Bureau, ProgramData\jean\bin). Les chemins absolus demandés explicitement restent honorés. - Windows : le double-clic n'installe plus en silence. Boîte de dialogue unique, raccourcis menu Démarrer + Bureau, puis relance depuis la copie installée — un seul binaire fait foi. Désinstallation : retrait des raccourcis. - update : contrôle des droits AVANT le téléchargement (l'échec tombait sur le fichier temporaire, avec un message brut), message donnant la commande exacte, timeout UI porté de 30 s à 10 min. - jean where + bouton « Où sont mes fichiers ? » : emplacements, et alerte quand le binaire lancé n'est pas celui installé. - icônes : source unique (sys_brand_icon.go) pour la zone de notification, la barre de menus macOS et l'icône du .exe, alignée sur le favicon noir. macOS en icône template (une icône noire figée disparaît sur une barre sombre). - CI : le bundle macOS part de icon.png au lieu de convertir le .ico via sips, dont l'échec était masqué par « || true » ; notes de release versionnées.
This commit is contained in:
1 parent
6e7fe7d4a6
commit
1f3961eaa9
28 files changed
+742
-130
No files matched your search
@@ -134,9 +134,20 @@ func applyUpdate() (string, error) {
|
||||
if resolved, err := filepath.EvalSymlinks(exe); err == nil {
|
||||
exe = resolved
|
||||
}
|
||||
// Contrôle des droits AVANT de télécharger : sans ça, l'échec survient sur le
|
||||
// os.Create du fichier temporaire et l'utilisateur reçoit un « open
|
||||
// /usr/local/bin/.jean-update.tmp: permission denied » incompréhensible,
|
||||
// notamment depuis le bouton de l'UI web (jean web lancé sans sudo).
|
||||
if err := checkUpdateWritable(exe); err != nil {
|
||||
return "", err
|
||||
}
|
||||
tmp := filepath.Join(filepath.Dir(exe), ".jean-update.tmp")
|
||||
|
||||
if err := downloadTo(url, tmp); err != nil {
|
||||
os.Remove(tmp)
|
||||
if os.IsPermission(err) {
|
||||
return "", updatePermissionError(exe)
|
||||
}
|
||||
return "", fmt.Errorf("téléchargement : %w", err)
|
||||
}
|
||||
if err := verifyChecksum(rel, want, tmp); err != nil {
|
||||
@@ -158,13 +169,40 @@ func applyUpdate() (string, error) {
|
||||
if err := replaceBinary(exe, tmp); err != nil {
|
||||
os.Remove(tmp)
|
||||
if os.IsPermission(err) {
|
||||
return "", fmt.Errorf("droits insuffisants pour écrire %s — relance avec privilèges (ex : sudo jean update)", exe)
|
||||
return "", updatePermissionError(exe)
|
||||
}
|
||||
return "", err
|
||||
}
|
||||
return strings.TrimPrefix(latest, "v"), nil
|
||||
}
|
||||
|
||||
// updatePermissionError formule le seul message utile quand jean n'a pas les
|
||||
// droits d'écrire son propre binaire : la commande exacte à lancer.
|
||||
func updatePermissionError(exe string) error {
|
||||
if runtime.GOOS == "windows" {
|
||||
return fmt.Errorf("droits insuffisants pour remplacer %s — relance AJEAN en administrateur puis réessaie", exe)
|
||||
}
|
||||
return fmt.Errorf("droits insuffisants pour remplacer %s (le binaire appartient à root) — lance la mise à jour en ligne de commande : sudo jean update", exe)
|
||||
}
|
||||
|
||||
// checkUpdateWritable vérifie qu'on peut écrire dans le dossier du binaire, en
|
||||
// créant réellement un fichier témoin (les bits de permission seuls ne suffisent
|
||||
// pas : root, groupes, ACL, montage en lecture seule…).
|
||||
func checkUpdateWritable(exe string) error {
|
||||
dir := filepath.Dir(exe)
|
||||
probe, err := os.CreateTemp(dir, ".jean-update-probe-*")
|
||||
if err != nil {
|
||||
if os.IsPermission(err) {
|
||||
return updatePermissionError(exe)
|
||||
}
|
||||
return fmt.Errorf("impossible d'écrire dans %s : %w", dir, err)
|
||||
}
|
||||
name := probe.Name()
|
||||
probe.Close()
|
||||
os.Remove(name)
|
||||
return nil
|
||||
}
|
||||
|
||||
func cmdUpdate(args []string) error {
|
||||
checkOnly := false
|
||||
for _, a := range args {
|
||||
|
||||
Reference in new issue
Block a user