This commit is contained in:
2026-03-15 04:54:51 +01:00
parent 0fb8fe5a66
commit 7ac487f640
81 changed files with 3867 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
log_init() {
: > "$RUNTIME_LOG_FILE"
}
log_write() {
local level="$1"
local message="$2"
printf '%s [%s] %s\n' "$(date '+%F %T')" "$level" "$message" >> "$RUNTIME_LOG_FILE"
}
log_info() {
log_write "INFO" "$1"
}
log_error() {
log_write "ERROR" "$1"
}
+9
View File
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
network_warn_if_offline() {
if command -v ping >/dev/null 2>&1 && ping -c 1 -W 1 1.1.1.1 >/dev/null 2>&1; then
ui_success "Connectivite reseau disponible"
else
ui_warn "Reseau non verifie ou indisponible"
fi
}
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
package_is_installed() {
dpkg -s "$1" >/dev/null 2>&1
}
package_refresh_indexes() {
apt-get update
}
package_install() {
apt-get install -y "$@"
}
package_remove() {
apt-get remove -y "$@"
}
+125
View File
@@ -0,0 +1,125 @@
#!/usr/bin/env bash
prompt_read_default() {
local label="$1"
local default_value="${2:-}"
local answer=""
if [[ -n "$default_value" ]]; then
read -r -p "$label [$default_value] : " answer
printf '%s\n' "${answer:-$default_value}"
else
read -r -p "$label : " answer
printf '%s\n' "$answer"
fi
}
prompt_select_number() {
local label="$1"
local min_value="$2"
local max_value="$3"
local answer=""
while true; do
read -r -p "$label [$min_value-$max_value] : " answer
if [[ "$answer" =~ ^[0-9]+$ ]] && (( answer >= min_value && answer <= max_value )); then
printf '%s\n' "$answer"
return 0
fi
ui_warn "Choix invalide"
done
}
prompt_read_csv_default() {
local label="$1"
local default_value="$2"
local answer=""
read -r -p "$label [$default_value] : " answer
printf '%s\n' "${answer:-$default_value}"
}
prompt_confirm_default() {
local label="$1"
local default_answer="${2:-n}"
local answer=""
local prompt_suffix="[y/N]"
if [[ "$default_answer" =~ ^[Yy]$ ]]; then
prompt_suffix="[Y/n]"
fi
while true; do
read -r -p "$label $prompt_suffix : " answer
answer="${answer:-$default_answer}"
case "$answer" in
y|Y|yes|YES)
printf 'yes\n'
return 0
;;
n|N|no|NO)
printf 'no\n'
return 0
;;
esac
ui_warn "Repondre par y ou n"
done
}
prompt_select_from_list() {
local label="$1"
shift
local options=("$@")
local index=1
local selection=""
for selection in "${options[@]}"; do
printf ' %d. %s\n' "$index" "$selection"
index=$((index + 1))
done
selection="$(prompt_select_number "$label" 1 "${#options[@]}")"
printf '%s\n' "${options[$((selection - 1))]}"
}
prompt_select_multiple_from_list() {
local label="$1"
local default_indices="${2:-}"
local labels_csv="$3"
shift 3
local values=("$@")
local labels=()
local answer=""
local raw_index=""
local selected_values=""
local index=1
IFS=$'\n' read -r -d '' -a labels < <(printf '%s\0' "$labels_csv")
for raw_index in "${labels[@]}"; do
printf ' %d. %s\n' "$index" "$raw_index"
index=$((index + 1))
done
read -r -p "$label [${default_indices:-aucun}] : " answer
answer="${answer:-$default_indices}"
if [[ -z "$answer" ]]; then
printf '\n'
return 0
fi
while IFS= read -r raw_index; do
[[ -n "$raw_index" ]] || continue
raw_index="$(printf '%s' "$raw_index" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
if [[ ! "$raw_index" =~ ^[0-9]+$ ]] || (( raw_index < 1 || raw_index > ${#values[@]} )); then
ui_warn "Index ignore : $raw_index"
continue
fi
selected_values="${selected_values:+$selected_values,}${values[$((raw_index - 1))]}"
done < <(printf '%s\n' "$answer" | tr ',' '\n')
printf '%s\n' "$selected_values"
}
+59
View File
@@ -0,0 +1,59 @@
#!/usr/bin/env bash
system_require_bash() {
if [[ -z "${BASH_VERSION:-}" ]]; then
printf 'Bash est requis.\n' >&2
exit 1
fi
}
system_require_debian() {
if [[ ! -r /etc/os-release ]]; then
ui_error "Impossible de detecter le systeme"
exit 1
fi
if ! grep -Eq '^ID=debian$|^ID_LIKE=.*debian' /etc/os-release; then
ui_error "Ce script cible Debian"
exit 1
fi
ui_success "Systeme Debian detecte"
}
system_require_root() {
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
ui_error "Relancer ce script avec sudo ou en root"
exit 1
fi
ui_success "Privileges root valides"
}
system_user_exists() {
local user_name="$1"
id "$user_name" >/dev/null 2>&1
}
system_group_exists() {
local group_name="$1"
getent group "$group_name" >/dev/null 2>&1
}
system_user_in_group() {
local user_name="$1"
local group_name="$2"
id -nG "$user_name" 2>/dev/null | tr ' ' '\n' | grep -Fx "$group_name" >/dev/null 2>&1
}
system_primary_interface() {
ip route get 1.1.1.1 2>/dev/null | awk '
/dev/ {
for (i = 1; i <= NF; i++) {
if ($i == "dev") {
print $(i + 1)
exit
}
}
}'
}
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
UI_RESET=$'\033[0m'
UI_BOLD=$'\033[1m'
UI_BLUE=$'\033[34m'
UI_GREEN=$'\033[32m'
UI_YELLOW=$'\033[33m'
UI_RED=$'\033[31m'
ui_header() {
local message="$1"
printf '\n%s%s== %s ==%s\n\n' "$UI_BOLD" "$UI_BLUE" "$message" "$UI_RESET"
}
ui_section() {
local message="$1"
printf '%s[%s]%s\n' "$UI_BLUE" "$message" "$UI_RESET"
}
ui_info() {
local message="$1"
printf '%s[INFO]%s %s\n' "$UI_BLUE" "$UI_RESET" "$message"
}
ui_success() {
local message="$1"
printf '%s[OK]%s %s\n' "$UI_GREEN" "$UI_RESET" "$message"
}
ui_warn() {
local message="$1"
printf '%s[WARN]%s %s\n' "$UI_YELLOW" "$UI_RESET" "$message"
}
ui_error() {
local message="$1"
printf '%s[ERR]%s %s\n' "$UI_RED" "$UI_RESET" "$message" >&2
}
ui_menu() {
local title="$1"
shift
local option
ui_section "$title"
for option in "$@"; do
printf ' - %s\n' "$option"
done
}
ui_confirm() {
local prompt="$1"
local answer=""
read -r -p "$prompt [y/N] " answer
[[ "$answer" =~ ^[Yy]$ ]]
}
ui_pause() {
read -r -p "Appuyer sur Entree pour continuer... " _
}
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
validation_require_file() {
local file_path="$1"
if [[ ! -f "$file_path" ]]; then
ui_error "Fichier requis manquant : $file_path"
exit 1
fi
}