最後活躍 1 month ago

rcconf_2026-01-06.png 原始檔案
rcconf_2026-01-06.png
rcconf_bash.sh 原始檔案
1#!/usr/bin/env bash
2set -euo pipefail
3
4[ "$EUID" -ne 0 ] && { echo "Exécuter en root"; exit 1; }
5
6export TERM="${TERM:-xterm-256color}"
7export NCURSES_NO_UTF8_ACS=1
8
9. /etc/os-release
10OS_INFO="$NAME $VERSION_ID"
11
12# dialog check + install
13if ! 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
22fi
23
24# Taille plein écran
25H=$(tput lines); W=$(tput cols)
26H=$((H - 4)); W=$((W - 4))
27LISTH=$((H - 9))
28[ "$LISTH" -lt 8 ] && LISTH=8
29
30# Détection init
31if pidof systemd >/dev/null 2>&1; then
32 INIT=systemd
33else
34 INIT=sysv
35fi
36
37header_text() {
38 cat <<EOF
39OS: $OS_INFO | Init: $INIT
40────────────────────────────────────────
41Espace: ON/OFF | Entrée: Appliquer | Esc: Quitter
42EOF
43}
44
45# ===== Build list (ON d'abord) =====
46build_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
72build_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
96apply_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
107apply_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) =====
119while 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
147done
148