rcconf_2026-01-06.png
· 251 KiB · Image (PNG)
Исходник
rcconf_bash.sh
· 3.3 KiB · Bash
Исходник
#!/usr/bin/env bash
set -euo pipefail
[ "$EUID" -ne 0 ] && { echo "Exécuter en root"; exit 1; }
export TERM="${TERM:-xterm-256color}"
export NCURSES_NO_UTF8_ACS=1
. /etc/os-release
OS_INFO="$NAME $VERSION_ID"
# dialog check + install
if ! command -v dialog >/dev/null 2>&1; then
echo "dialog non installé."
read -rp "Installer dialog maintenant ? [O/n] " r
r=${r:-O}
if [[ "$r" =~ ^[Oo]$ ]]; then
apt update && apt install -y dialog
else
exit 1
fi
fi
# Taille plein écran
H=$(tput lines); W=$(tput cols)
H=$((H - 4)); W=$((W - 4))
LISTH=$((H - 9))
[ "$LISTH" -lt 8 ] && LISTH=8
# Détection init
if pidof systemd >/dev/null 2>&1; then
INIT=systemd
else
INIT=sysv
fi
header_text() {
cat <<EOF
OS: $OS_INFO | Init: $INIT
────────────────────────────────────────
Espace: ON/OFF | Entrée: Appliquer | Esc: Quitter
EOF
}
# ===== Build list (ON d'abord) =====
build_items_systemd() {
local unit state
ON_UNITS=()
OFF_UNITS=()
while read -r unit state; do
[[ "$unit" =~ \.service$ ]] || continue
[[ "$state" =~ ^(enabled|disabled)$ ]] || continue
if [ "$state" = "enabled" ]; then
ON_UNITS+=("$unit")
else
OFF_UNITS+=("$unit")
fi
done < <(systemctl list-unit-files --type=service --no-legend --no-pager | awk '{print $1,$2}')
SERVICES=( "${ON_UNITS[@]}" "${OFF_UNITS[@]}" )
ITEMS=()
for unit in "${ON_UNITS[@]}"; do
ITEMS+=("$unit" "\Z4ON\Zn " "on")
done
for unit in "${OFF_UNITS[@]}"; do
ITEMS+=("$unit" "\Z1OFF\Zn" "off")
done
}
build_items_sysv() {
local svc
ON_UNITS=()
OFF_UNITS=()
while read -r svc; do
if ls /etc/rc?.d/S*"$svc" >/dev/null 2>&1; then
ON_UNITS+=("$svc")
else
OFF_UNITS+=("$svc")
fi
done < <(for s in /etc/init.d/*; do [ -x "$s" ] && basename "$s"; done | sort)
SERVICES=( "${ON_UNITS[@]}" "${OFF_UNITS[@]}" )
ITEMS=()
for svc in "${ON_UNITS[@]}"; do
ITEMS+=("$svc" "\Z4ON\Zn " "on")
done
for svc in "${OFF_UNITS[@]}"; do
ITEMS+=("$svc" "\Z3OFF\Zn" "off")
done
}
apply_selection_systemd() {
local sel="$1" unit
for unit in "${SERVICES[@]}"; do
if [[ " $sel " =~ \"${unit}\" ]]; then
systemctl enable "$unit" >/dev/null 2>&1 || true
else
systemctl disable "$unit" >/dev/null 2>&1 || true
fi
done
}
apply_selection_sysv() {
local sel="$1" svc
for svc in "${SERVICES[@]}"; do
if [[ " $sel " =~ \"${svc}\" ]]; then
ls /etc/rc?.d/S*"$svc" >/dev/null 2>&1 || update-rc.d "$svc" defaults >/dev/null
else
ls /etc/rc?.d/S*"$svc" >/dev/null 2>&1 && update-rc.d -f "$svc" remove >/dev/null
fi
done
}
# ===== Loop : applique + refresh (live) =====
while true; do
SERVICES=(); ITEMS=()
if [ "$INIT" = "systemd" ]; then
build_items_systemd
else
build_items_sysv
fi
exec 3>&1
SEL=$(dialog \
--colors \
--clear \
--backtitle " rcconf hybride " \
--title " Gestion des services " \
--checklist "$(header_text)" \
"$H" "$W" "$LISTH" \
"${ITEMS[@]}" \
2>&1 1>&3) || { exec 3>&-; clear; exit 0; }
exec 3>&-
if [ "$INIT" = "systemd" ]; then
apply_selection_systemd "$SEL"
else
apply_selection_sysv "$SEL"
fi
# refresh auto (ordre ON/OFF recalculé) -> loop continue
done
| 1 | #!/usr/bin/env bash |
| 2 | set -euo pipefail |
| 3 | |
| 4 | [ "$EUID" -ne 0 ] && { echo "Exécuter en root"; exit 1; } |
| 5 | |
| 6 | export TERM="${TERM:-xterm-256color}" |
| 7 | export NCURSES_NO_UTF8_ACS=1 |
| 8 | |
| 9 | . /etc/os-release |
| 10 | OS_INFO="$NAME $VERSION_ID" |
| 11 | |
| 12 | # dialog check + install |
| 13 | if ! command -v dialog >/dev/null 2>&1; then |
| 14 | echo "dialog non installé." |
| 15 | read -rp "Installer dialog maintenant ? [O/n] " r |
| 16 | r=${r:-O} |
| 17 | if [[ "$r" =~ ^[Oo]$ ]]; then |
| 18 | apt update && apt install -y dialog |
| 19 | else |
| 20 | exit 1 |
| 21 | fi |
| 22 | fi |
| 23 | |
| 24 | # Taille plein écran |
| 25 | H=$(tput lines); W=$(tput cols) |
| 26 | H=$((H - 4)); W=$((W - 4)) |
| 27 | LISTH=$((H - 9)) |
| 28 | [ "$LISTH" -lt 8 ] && LISTH=8 |
| 29 | |
| 30 | # Détection init |
| 31 | if pidof systemd >/dev/null 2>&1; then |
| 32 | INIT=systemd |
| 33 | else |
| 34 | INIT=sysv |
| 35 | fi |
| 36 | |
| 37 | header_text() { |
| 38 | cat <<EOF |
| 39 | OS: $OS_INFO | Init: $INIT |
| 40 | ──────────────────────────────────────── |
| 41 | Espace: ON/OFF | Entrée: Appliquer | Esc: Quitter |
| 42 | EOF |
| 43 | } |
| 44 | |
| 45 | # ===== Build list (ON d'abord) ===== |
| 46 | build_items_systemd() { |
| 47 | local unit state |
| 48 | ON_UNITS=() |
| 49 | OFF_UNITS=() |
| 50 | |
| 51 | while read -r unit state; do |
| 52 | [[ "$unit" =~ \.service$ ]] || continue |
| 53 | [[ "$state" =~ ^(enabled|disabled)$ ]] || continue |
| 54 | if [ "$state" = "enabled" ]; then |
| 55 | ON_UNITS+=("$unit") |
| 56 | else |
| 57 | OFF_UNITS+=("$unit") |
| 58 | fi |
| 59 | done < <(systemctl list-unit-files --type=service --no-legend --no-pager | awk '{print $1,$2}') |
| 60 | |
| 61 | SERVICES=( "${ON_UNITS[@]}" "${OFF_UNITS[@]}" ) |
| 62 | ITEMS=() |
| 63 | |
| 64 | for unit in "${ON_UNITS[@]}"; do |
| 65 | ITEMS+=("$unit" "\Z4ON\Zn " "on") |
| 66 | done |
| 67 | for unit in "${OFF_UNITS[@]}"; do |
| 68 | ITEMS+=("$unit" "\Z1OFF\Zn" "off") |
| 69 | done |
| 70 | } |
| 71 | |
| 72 | build_items_sysv() { |
| 73 | local svc |
| 74 | ON_UNITS=() |
| 75 | OFF_UNITS=() |
| 76 | |
| 77 | while read -r svc; do |
| 78 | if ls /etc/rc?.d/S*"$svc" >/dev/null 2>&1; then |
| 79 | ON_UNITS+=("$svc") |
| 80 | else |
| 81 | OFF_UNITS+=("$svc") |
| 82 | fi |
| 83 | done < <(for s in /etc/init.d/*; do [ -x "$s" ] && basename "$s"; done | sort) |
| 84 | |
| 85 | SERVICES=( "${ON_UNITS[@]}" "${OFF_UNITS[@]}" ) |
| 86 | ITEMS=() |
| 87 | |
| 88 | for svc in "${ON_UNITS[@]}"; do |
| 89 | ITEMS+=("$svc" "\Z4ON\Zn " "on") |
| 90 | done |
| 91 | for svc in "${OFF_UNITS[@]}"; do |
| 92 | ITEMS+=("$svc" "\Z3OFF\Zn" "off") |
| 93 | done |
| 94 | } |
| 95 | |
| 96 | apply_selection_systemd() { |
| 97 | local sel="$1" unit |
| 98 | for unit in "${SERVICES[@]}"; do |
| 99 | if [[ " $sel " =~ \"${unit}\" ]]; then |
| 100 | systemctl enable "$unit" >/dev/null 2>&1 || true |
| 101 | else |
| 102 | systemctl disable "$unit" >/dev/null 2>&1 || true |
| 103 | fi |
| 104 | done |
| 105 | } |
| 106 | |
| 107 | apply_selection_sysv() { |
| 108 | local sel="$1" svc |
| 109 | for svc in "${SERVICES[@]}"; do |
| 110 | if [[ " $sel " =~ \"${svc}\" ]]; then |
| 111 | ls /etc/rc?.d/S*"$svc" >/dev/null 2>&1 || update-rc.d "$svc" defaults >/dev/null |
| 112 | else |
| 113 | ls /etc/rc?.d/S*"$svc" >/dev/null 2>&1 && update-rc.d -f "$svc" remove >/dev/null |
| 114 | fi |
| 115 | done |
| 116 | } |
| 117 | |
| 118 | # ===== Loop : applique + refresh (live) ===== |
| 119 | while true; do |
| 120 | SERVICES=(); ITEMS=() |
| 121 | |
| 122 | if [ "$INIT" = "systemd" ]; then |
| 123 | build_items_systemd |
| 124 | else |
| 125 | build_items_sysv |
| 126 | fi |
| 127 | |
| 128 | exec 3>&1 |
| 129 | SEL=$(dialog \ |
| 130 | --colors \ |
| 131 | --clear \ |
| 132 | --backtitle " rcconf hybride " \ |
| 133 | --title " Gestion des services " \ |
| 134 | --checklist "$(header_text)" \ |
| 135 | "$H" "$W" "$LISTH" \ |
| 136 | "${ITEMS[@]}" \ |
| 137 | 2>&1 1>&3) || { exec 3>&-; clear; exit 0; } |
| 138 | exec 3>&- |
| 139 | |
| 140 | if [ "$INIT" = "systemd" ]; then |
| 141 | apply_selection_systemd "$SEL" |
| 142 | else |
| 143 | apply_selection_sysv "$SEL" |
| 144 | fi |
| 145 | |
| 146 | # refresh auto (ordre ON/OFF recalculé) -> loop continue |
| 147 | done |
| 148 |