166 lines
4.4 KiB
Bash
166 lines
4.4 KiB
Bash
#!/bin/bash
|
||
# ein kleines Skript dass:
|
||
# 1. Die /etc/network/interfaces auskommentiert falls dort unbekannte interfaces stehen
|
||
# 2. alle definierten Interfaces + loopback in die /etc/network/interfaces schreibt
|
||
|
||
|
||
|
||
set -euo pipefail
|
||
|
||
# Standardwert für Interfaces (wenn keine übergeben werden)
|
||
interfaces=()
|
||
iface_file="/etc/network/interfaces"
|
||
name_dir="/etc/systemd/network"
|
||
|
||
# Verarbeite die übergebenen Shortflags
|
||
while getopts "i:f:" opt; do
|
||
case $opt in
|
||
i)
|
||
interfaces+=("$OPTARG")
|
||
;;
|
||
f)
|
||
iface_file="$OPTARG"
|
||
;;
|
||
*)
|
||
echo "Usage: $0 [-f interfaces-file] [-i interface] [-i interface2] ..."
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
|
||
# Wenn keine Interfaces übergeben wurden, nutze Standard-Interfaces
|
||
if [ ${#interfaces[@]} -eq 0 ]; then
|
||
interfaces=("eno1")
|
||
fi
|
||
|
||
|
||
echo "Die $iface_file wird angepasst:"
|
||
|
||
# Funktion zum Auskommentieren der gesamten Datei
|
||
comment_out_all() {
|
||
local file="$1"
|
||
echo "✔ Kommentiere die gesamte Datei aus..."
|
||
# Kommt alle Zeilen der Datei aus
|
||
sed -i 's/^[[:space:]]*/# /' "$file"
|
||
}
|
||
|
||
# Funktion zum Prüfen, ob ein nicht gewolltes Interface existiert
|
||
check_for_unwanted_interfaces() {
|
||
local file="$1"
|
||
local wanted_interfaces=("lo" "${interfaces[@]}")
|
||
local unwanted_found=0
|
||
|
||
while IFS= read -r line; do
|
||
# Leerzeilen & Kommentare überspringen
|
||
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
|
||
|
||
# FIX 1: sauberes Token-Parsing statt Regex
|
||
read -r keyword iface proto rest <<<"$line"
|
||
|
||
[[ "$keyword" == "iface" ]] || continue
|
||
|
||
# Vergleich bleibt wie bei dir
|
||
if [[ ! " ${wanted_interfaces[@]} " =~ " $iface " ]]; then
|
||
echo "❌ Unerwünschtes Interface gefunden: $iface"
|
||
unwanted_found=1
|
||
fi
|
||
done < "$file"
|
||
|
||
return $unwanted_found
|
||
}
|
||
|
||
|
||
# Funktion zum Sicherstellen, dass ein Interface existiert
|
||
ensure_interface() {
|
||
local file="$1"
|
||
local iface="$2"
|
||
local proto="$3"
|
||
|
||
[[ -f "$file" ]] || touch "$file"
|
||
|
||
# Prüfen, ob iface-Zeile existiert
|
||
if grep -Eq "^[[:space:]]*iface[[:space:]]+$iface([[:space:]]|\$)" "$file"; then
|
||
echo "✔ iface $iface $proto bereits vorhanden"
|
||
else
|
||
echo "➕ iface $iface $proto fehlt – anhängen"
|
||
{
|
||
echo
|
||
echo "iface $iface $proto"
|
||
} >> "$file"
|
||
fi
|
||
|
||
# Sicherstellen, dass vor der iface-Zeile ein Zeilenumbruch ist
|
||
sed -i "/iface[[:space:]]+$iface[[:space:]]+$proto/i \\ " "$file"
|
||
|
||
# Prüfen, ob auto <iface> existiert
|
||
if grep -Eq "^[[:space:]]*auto[[:space:]]+$iface([[:space:]]|\$)" "$file"; then
|
||
echo "✔ auto $iface vorhanden"
|
||
else
|
||
echo "↺ auto $iface fehlt – vor iface einfügen"
|
||
# auto direkt vor iface einfügen
|
||
sed -i "/^[[:space:]]*iface[[:space:]]\+$iface[[:space:]]\+$proto/i auto $iface" "$file"
|
||
fi
|
||
}
|
||
|
||
|
||
# Füge die Quelle für interfaces.d hinzu
|
||
add_source() {
|
||
local file="$1"
|
||
if ! grep -Eq "^[[:space:]]*source[[:space:]]+/etc/network/interfaces.d/\*" "$file"; then
|
||
echo "➕ source /etc/network/interfaces.d/* fehlt – hinzufügen"
|
||
echo "source /etc/network/interfaces.d/*" >> "$file"
|
||
else
|
||
echo "✔ source /etc/network/interfaces.d/* vorhanden"
|
||
fi
|
||
}
|
||
|
||
# Füge immer das Loopback Interface hinzu
|
||
add_loopback_interface() {
|
||
local file="$1"
|
||
if ! grep -Eq "^[[:space:]]*iface[[:space:]]+lo[[:space:]]\+inet[[:space:]]+loopback" "$file"; then
|
||
echo "➕ iface lo inet loopback fehlt – hinzufügen"
|
||
{
|
||
echo "auto lo"
|
||
echo "iface lo inet loopback"
|
||
} >> "$file"
|
||
else
|
||
echo "✔ iface lo inet loopback vorhanden"
|
||
fi
|
||
}
|
||
|
||
# Temporäres Deaktivieren von 'set -e'
|
||
set +e
|
||
|
||
# Prüfe auf nicht gewollte Interfaces und kommentiere die Datei aus, wenn notwendig
|
||
check_for_unwanted_interfaces "$iface_file"
|
||
if [ $? -eq 1 ]; then
|
||
# Wenn ein unerwünschtes Interface gefunden wurde, kommentiere die gesamte Datei aus und füge loopback + interfaces.d zu
|
||
comment_out_all "$iface_file"
|
||
add_source "$iface_file"
|
||
add_loopback_interface "$iface_file"
|
||
fi
|
||
|
||
# Wiederherstellen von 'set -e'
|
||
set -e
|
||
|
||
# Setze die Konfiguration für die benötigten Interfaces
|
||
for iface in "${interfaces[@]}"; do
|
||
ensure_interface "$iface_file" "$iface" "inet dhcp"
|
||
done
|
||
|
||
echo "🔄 Neustart von networking.service..."
|
||
systemctl restart networking.service
|
||
|
||
echo
|
||
echo "📋 Status networking.service:"
|
||
systemctl status networking.service --no-pager -l
|
||
|
||
echo
|
||
echo "🌐 networkctl list:"
|
||
networkctl list
|
||
|
||
echo
|
||
echo "🔍 Detailstatus der Interfaces:"
|
||
networkctl status "${interfaces[@]}" || true
|