mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-20 05:28:15 +02:00
Arborescence unifiee et installateurs simplifies
- provisionDataDir unique pour les trois plateformes (six dossiers, config par defaut) - plus de modele config.env duplique dans chaque installateur - plus d'alias jean pose a l'installation
This commit is contained in:
1 parent
2455d9f402
commit
6de356f649
9 files changed
+93
-240
No files matched your search
@@ -11,26 +11,6 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
const configTemplate = `# Configuration AJEAN — édite-moi puis: ajean restart
|
||||
# Le service systemd lit ce fichier et lance ton binaire llama.cpp.
|
||||
|
||||
# Chemins
|
||||
BIN="/usr/local/bin/llama-server"
|
||||
MODEL="/home/USER/models/your-model.gguf"
|
||||
|
||||
# Serveur
|
||||
PORT="8080"
|
||||
HOST="0.0.0.0"
|
||||
|
||||
# Inference
|
||||
CTX="32768"
|
||||
BATCH="2048"
|
||||
UBATCH="512"
|
||||
NGL="999"
|
||||
|
||||
# Args supplémentaires passés à llama-server
|
||||
EXTRA_ARGS=""
|
||||
`
|
||||
|
||||
const sudoersTemplate = `# Allow %s to manage the %s systemd unit without a password (installed by ajean).
|
||||
%s ALL=(root) NOPASSWD: /bin/systemctl start %s, /bin/systemctl stop %s, /bin/systemctl restart %s, /bin/systemctl enable %s, /bin/systemctl disable %s
|
||||
@@ -76,14 +56,6 @@ func cmdInstall(args []string) error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("utilisateur '%s' introuvable: %w", targetUser, err)
|
||||
}
|
||||
// Migration de l'agencement ajean -> ajean AVANT de résoudre les chemins :
|
||||
// `install` est root et délibéré, c'est le bon moment. Ne fait rien si la
|
||||
// machine est déjà en ajean, ou si l'utilisateur a imposé un chemin.
|
||||
if err := migrateLayout(defaultLayoutPlan()); err != nil {
|
||||
return err
|
||||
}
|
||||
resetResolvedHome() // le dossier a pu changer à l'instant
|
||||
|
||||
ajeanHome := defaultAjeanHome()
|
||||
if v := os.Getenv("AJEAN_HOME"); v != "" {
|
||||
ajeanHome = v
|
||||
@@ -94,27 +66,13 @@ func cmdInstall(args []string) error {
|
||||
fmt.Printf(" AJEAN_HOME = %s\n", ajeanHome)
|
||||
fmt.Printf(" service = %s\n", svc)
|
||||
|
||||
// 1. Create directories
|
||||
// Plus de dossier SKILLS : les skills ont ete fondus dans la memoire.
|
||||
// On ne le CREE plus, mais on continue de le LIRE une fois au demarrage
|
||||
// pour reprendre ceux d'une ancienne installation (migrateSkillsToMemory).
|
||||
for _, d := range []string{ajeanHome, filepath.Join(ajeanHome, "configs")} {
|
||||
if err := os.MkdirAll(d, 0o755); err != nil {
|
||||
return err
|
||||
}
|
||||
// 1. Arborescence + configuration de départ
|
||||
if err := provisionDataDir(); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf(" %s arborescence prête\n", green("✓"))
|
||||
|
||||
// 2. Drop a config.env if none exists
|
||||
conf := filepath.Join(ajeanHome, "config.env")
|
||||
if _, err := os.Stat(conf); os.IsNotExist(err) {
|
||||
body := strings.ReplaceAll(configTemplate, "USER", targetUser)
|
||||
if err := os.WriteFile(conf, []byte(body), 0o644); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf(" %s écrit %s\n", green("✓"), conf)
|
||||
}
|
||||
|
||||
// 3. Symlink current binary to /usr/local/bin/ajean
|
||||
// 2. Symlink current binary to /usr/local/bin/ajean
|
||||
self, err := os.Executable()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -145,27 +103,8 @@ func cmdInstall(args []string) error {
|
||||
fmt.Printf(" %s %s -> %s\n", green("✓"), target, self)
|
||||
}
|
||||
|
||||
// 3 bis. Alias hérité : `ajean` doit rester tapable. Des utilisateurs ont des
|
||||
// alias shell, des cron, des scripts de déploiement et des tutos qui appellent
|
||||
// « ajean » — on ne contrôle rien de tout ça, et un binaire renommé qui casse
|
||||
// la commande d'hier est une régression pour eux. Le lien pointe sur le
|
||||
// nouveau nom, donc il suit les mises à jour sans entretien.
|
||||
if alias := legacyExePath(); alias != target {
|
||||
if rp, e := filepath.EvalSymlinks(alias); e != nil || rp != self {
|
||||
_ = os.Remove(alias)
|
||||
if err := os.Symlink(target, alias); err != nil {
|
||||
fmt.Printf(" %s alias %s non créé (%v) — « ajean » reste disponible\n", yellow("[info]"), alias, err)
|
||||
} else {
|
||||
fmt.Printf(" %s %s -> %s (alias hérité)\n", green("✓"), alias, target)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Drop /etc/default/ajean so root invocations resolve AJEAN_HOME correctly.
|
||||
// On écrit les DEUX clés : des scripts d'utilisateurs sourcent ce fichier et
|
||||
// lisent $AJEAN_HOME. L'ancien /etc/default/ajean est laissé en place — le
|
||||
// supprimer casserait ces mêmes scripts, et AjeanHome() sait déjà le lire.
|
||||
defaults := fmt.Sprintf("# Generated by ajean install — racine des configs/memoire/presets\nAJEAN_HOME=%s\nJEAN_HOME=%s\n", ajeanHome, ajeanHome)
|
||||
// 3. /etc/default/ajean, pour que les invocations root résolvent AJEAN_HOME.
|
||||
defaults := fmt.Sprintf("# Généré par ajean install — racine des données\nAJEAN_HOME=%s\n", ajeanHome)
|
||||
if err := os.WriteFile("/etc/default/ajean", []byte(defaults), 0o644); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user