-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharch-shell
More file actions
executable file
·204 lines (193 loc) · 5.94 KB
/
arch-shell
File metadata and controls
executable file
·204 lines (193 loc) · 5.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#!/bin/bash
# =============================================
# Script : arch-shell
# Description : Gestion des environnements Arch Linux pour ArchimedeOS
# Auteur : Killian Prin-abeil <killian@archimedeos.org>
# Date : $(date +%Y-%m-%d)
# =============================================
set -euo pipefail
ARCHSHELL_DIR="${HOME}/.arch-shell"
ARCHSHELL_STORE="${ARCHSHELL_DIR}/store"
BASE_TEMPLATE="${ARCHSHELL_STORE}/base-template"
usage() {
echo "Usage: $0 init | regen-base | create <env> | -S <env> <pkg...> | enter <env> | delete <env> | list | info <env>"
exit 1
}
# Fonction pour créer/mettre à jour le fichier d'info d'un environnement
update_env_info() {
local envname="$1"
local envdir="${ARCHSHELL_DIR}/${envname}"
local infofile="${envdir}/.arch-shell-env"
# Créer ou mettre à jour le fichier d'info
cat > "$infofile" << EOF
{
"name": "$envname",
"created": "$(date -Iseconds)",
"last_used": "$(date -Iseconds)",
"packages": [],
"arch": "$(uname -m)"
}
EOF
}
# Fonction pour mettre à jour last_used
update_last_used() {
local envname="$1"
local infofile="${ARCHSHELL_DIR}/${envname}/.arch-shell-env"
if [ -f "$infofile" ]; then
# Mettre à jour last_used avec jq si disponible, sinon avec sed
if command -v jq >/dev/null 2>&1; then
jq ".last_used = \"$(date -Iseconds)\"" "$infofile" > "${infofile}.tmp" && mv "${infofile}.tmp" "$infofile"
else
sed -i "s/\"last_used\": \"[^\"]*\"/\"last_used\": \"$(date -Iseconds)\"/" "$infofile"
fi
fi
}
# Fonction pour ajouter un package à la liste
add_package() {
local envname="$1"
local package="$2"
local infofile="${ARCHSHELL_DIR}/${envname}/.arch-shell-env"
if [ -f "$infofile" ]; then
if command -v jq >/dev/null 2>&1; then
jq ".packages += [\"$package\"]" "$infofile" > "${infofile}.tmp" && mv "${infofile}.tmp" "$infofile"
else
# Fallback simple avec sed (ajoute le package à la fin de la liste)
sed -i "s/\"packages\": \[\([^]]*\)\]/\"packages\": [\1, \"$package\"]/" "$infofile"
fi
fi
}
if [ $# -lt 1 ]; then
usage
fi
case "$1" in
init)
mkdir -p "$ARCHSHELL_STORE"
if [ -d "$BASE_TEMPLATE" ]; then
echo "Template de base existe déjà. Utilisez 'regen-base' pour le régénérer."
else
echo "Initialisation du template de base..."
if sudo mkarchroot "$BASE_TEMPLATE" base > /dev/null 2>&1; then
echo "Template de base créé."
else
echo "Erreur lors de la création du template de base."; exit 2;
fi
fi
;;
regen-base)
mkdir -p "$ARCHSHELL_STORE"
echo "Régénération du template de base..."
if [ -d "$BASE_TEMPLATE" ]; then
sudo rm -rf "$BASE_TEMPLATE"
fi
if sudo mkarchroot "$BASE_TEMPLATE" base > /dev/null 2>&1; then
echo "Template de base régénéré."
else
echo "Erreur lors de la régénération du template de base."; exit 6;
fi
;;
create)
if [ $# -lt 2 ]; then
echo "Usage: $0 create <env>"
exit 1
fi
ENVNAME="$2"
if [ ! -d "$BASE_TEMPLATE" ]; then
echo "Template de base introuvable. Exécutez d'abord '$0 init'."
exit 2
fi
if [ -d "${ARCHSHELL_DIR}/${ENVNAME}" ]; then
echo "L'environnement ${ENVNAME} existe déjà."; exit 5;
fi
echo "Création de l'environnement $ENVNAME à partir du template..."
sudo cp -a "$BASE_TEMPLATE" "${ARCHSHELL_DIR}/${ENVNAME}"
sudo chown -R $USER: "${ARCHSHELL_DIR}/${ENVNAME}"
update_env_info "$ENVNAME"
echo "Environnement $ENVNAME créé."
;;
-S)
if [ $# -lt 3 ]; then
echo "Usage: $0 -S <env> <pkg...>"
exit 1
fi
ENVNAME="$2"
shift 2
if [ ! -d "${ARCHSHELL_DIR}/${ENVNAME}" ]; then
echo "Environnement inexistant : ${ENVNAME}"; exit 3;
fi
echo "Installation de(s) paquet(s) $* dans $ENVNAME..."
if sudo arch-nspawn -c /var/cache/pacman/pkg "${ARCHSHELL_DIR}/${ENVNAME}" pacman -S --noconfirm "$@" > /dev/null 2>&1; then
echo "Installation terminée."
update_last_used "$ENVNAME"
# Ajouter chaque package à la liste
for pkg in "$@"; do
add_package "$ENVNAME" "$pkg"
done
else
echo "Erreur lors de l'installation des paquets."; exit 4;
fi
;;
enter)
if [ $# -lt 2 ]; then
echo "Usage: $0 enter <env>"
exit 1
fi
ENVNAME="$2"
if [ ! -d "${ARCHSHELL_DIR}/${ENVNAME}" ]; then
echo "Environnement inexistant : ${ENVNAME}"; exit 3;
fi
echo "Entrée dans l'environnement $ENVNAME."
update_last_used "$ENVNAME"
sudo arch-nspawn -c /var/cache/pacman/pkg "${ARCHSHELL_DIR}/${ENVNAME}"
;;
delete)
if [ $# -lt 2 ]; then
echo "Usage: $0 delete <env>"
exit 1
fi
ENVNAME="$2"
if [ ! -d "${ARCHSHELL_DIR}/${ENVNAME}" ]; then
echo "Environnement inexistant : ${ENVNAME}"; exit 3;
fi
read -p "Supprimer définitivement ${ENVNAME} ? [o/N] " REP
if [[ "$REP" =~ ^[oOyY]$ ]]; then
sudo rm -rf "${ARCHSHELL_DIR}/${ENVNAME}"
LOCKFILE="${ARCHSHELL_DIR}/${ENVNAME}.lock"
if [ -f "$LOCKFILE" ]; then
sudo rm -f "$LOCKFILE"
fi
echo "Environnement supprimé."
else
echo "Annulé."
fi
;;
list)
echo "Environnements disponibles :"
for env in "$ARCHSHELL_DIR"/*; do
[ -d "$env" ] || continue
[ "$(basename "$env")" = "store" ] && continue
if [ -f "$env/.arch-shell-env" ]; then
echo "- $(basename "$env")"
fi
done
;;
info)
if [ $# -lt 2 ]; then
echo "Usage: $0 info <env>"
exit 1
fi
ENVNAME="$2"
INFOFILE="${ARCHSHELL_DIR}/${ENVNAME}/.arch-shell-env"
if [ ! -f "$INFOFILE" ]; then
echo "Environnement inexistant : ${ENVNAME}"; exit 3;
fi
echo "Informations sur l'environnement $ENVNAME :"
if command -v jq >/dev/null 2>&1; then
jq '.' "$INFOFILE"
else
cat "$INFOFILE"
fi
;;
*)
usage
;;
esac