Files
2025-08-07 19:28:22 +02:00

491 lines
14 KiB
Bash

#!/bin/bash
# USB-SSD Management System - SMB Setup Script
# Automatische Konfiguration von Samba für USB-C SSD Freigaben
#
# Verwendung:
# sudo ./setup-smb.sh [OPTIONS]
#
# Optionen:
# --install-samba Samba-Pakete installieren
# --configure-users Benutzer und Gruppen konfigurieren
# --setup-shares Freigaben konfigurieren
# --enable-services Services aktivieren und starten
# --all Alle Schritte ausführen
set -euo pipefail
# ============================================================================
# Konfiguration
# ============================================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SMB_CONF="/etc/samba/smb.conf"
SMB_CONF_BACKUP="/etc/samba/smb.conf.backup.$(date +%Y%m%d_%H%M%S)"
SSD_MOUNT_POINT="/mnt/ssd-storage"
LOG_FILE="/var/log/ssd-smb-setup.log"
# Farben für Output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# ============================================================================
# Logging-Funktionen
# ============================================================================
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}" | tee -a "$LOG_FILE"
}
warn() {
echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}" | tee -a "$LOG_FILE"
}
error() {
echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}" | tee -a "$LOG_FILE"
exit 1
}
info() {
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1${NC}" | tee -a "$LOG_FILE"
}
# ============================================================================
# Hilfsfunktionen
# ============================================================================
check_root() {
if [[ $EUID -ne 0 ]]; then
error "Dieses Script muss als root ausgeführt werden (sudo)"
fi
}
check_mount_point() {
if [[ ! -d "$SSD_MOUNT_POINT" ]]; then
warn "Mount-Point $SSD_MOUNT_POINT existiert nicht - wird erstellt"
mkdir -p "$SSD_MOUNT_POINT"
chmod 755 "$SSD_MOUNT_POINT"
fi
}
detect_os() {
if [[ -f /etc/os-release ]]; then
. /etc/os-release
OS=$ID
VERSION=$VERSION_ID
else
error "Betriebssystem konnte nicht erkannt werden"
fi
log "Erkanntes OS: $OS $VERSION"
}
# ============================================================================
# Samba-Installation
# ============================================================================
install_samba() {
log "Installiere Samba-Pakete..."
case "$OS" in
ubuntu|debian)
apt update
apt install -y samba samba-common-bin smbclient cifs-utils
;;
centos|rhel|fedora)
if command -v dnf &> /dev/null; then
dnf install -y samba samba-common samba-client cifs-utils
else
yum install -y samba samba-common samba-client cifs-utils
fi
;;
*)
error "Nicht unterstütztes Betriebssystem: $OS"
;;
esac
log "Samba-Installation abgeschlossen"
}
# ============================================================================
# Benutzer und Gruppen
# ============================================================================
configure_users() {
log "Konfiguriere Benutzer und Gruppen..."
# Gruppen erstellen
local groups=(
"ssd-users:Benutzer mit SSD-Zugriff"
"ssd-admins:SSD-Administratoren"
"ssd-readonly:Nur-Lese-Zugriff auf SSD"
"backup-users:Backup-Benutzer"
"backup-admins:Backup-Administratoren"
"media-users:Media-Benutzer"
"developers:Entwickler"
"dev-leads:Entwicklungsleiter"
"archive-admins:Archiv-Administratoren"
)
for group_info in "${groups[@]}"; do
local group_name="${group_info%%:*}"
local group_desc="${group_info##*:}"
if ! getent group "$group_name" &>/dev/null; then
groupadd "$group_name"
log "Gruppe erstellt: $group_name ($group_desc)"
else
info "Gruppe existiert bereits: $group_name"
fi
done
# Standard-Benutzer zu ssd-users hinzufügen
if [[ -n "${SUDO_USER:-}" ]]; then
usermod -a -G ssd-users "$SUDO_USER"
log "Benutzer $SUDO_USER zu ssd-users hinzugefügt"
fi
# Service-Benutzer erstellen
if ! id "ssd-service" &>/dev/null; then
useradd -r -s /bin/false -d /var/lib/ssd-service -c "SSD Service User" ssd-service
usermod -a -G ssd-users ssd-service
log "Service-Benutzer ssd-service erstellt"
fi
log "Benutzer- und Gruppen-Konfiguration abgeschlossen"
}
# ============================================================================
# Verzeichnis-Struktur
# ============================================================================
setup_directories() {
log "Erstelle Verzeichnis-Struktur..."
local directories=(
"$SSD_MOUNT_POINT"
"$SSD_MOUNT_POINT/backup"
"$SSD_MOUNT_POINT/archive"
"$SSD_MOUNT_POINT/media"
"$SSD_MOUNT_POINT/development"
"$SSD_MOUNT_POINT/temp"
"$SSD_MOUNT_POINT/home"
)
for dir in "${directories[@]}"; do
if [[ ! -d "$dir" ]]; then
mkdir -p "$dir"
log "Verzeichnis erstellt: $dir"
fi
done
# Berechtigungen setzen
chown -R root:ssd-users "$SSD_MOUNT_POINT"
chmod -R 775 "$SSD_MOUNT_POINT"
# Spezielle Berechtigungen
chmod 755 "$SSD_MOUNT_POINT/backup"
chown root:backup-users "$SSD_MOUNT_POINT/backup"
chmod 755 "$SSD_MOUNT_POINT/archive"
chown root:archive-admins "$SSD_MOUNT_POINT/archive"
chmod 777 "$SSD_MOUNT_POINT/temp"
log "Verzeichnis-Struktur konfiguriert"
}
# ============================================================================
# SMB-Konfiguration
# ============================================================================
backup_smb_config() {
if [[ -f "$SMB_CONF" ]]; then
cp "$SMB_CONF" "$SMB_CONF_BACKUP"
log "SMB-Konfiguration gesichert: $SMB_CONF_BACKUP"
fi
}
setup_smb_config() {
log "Konfiguriere Samba..."
backup_smb_config
# Neue Konfiguration kopieren
if [[ -f "$SCRIPT_DIR/smb.conf.example" ]]; then
cp "$SCRIPT_DIR/smb.conf.example" "$SMB_CONF"
log "SMB-Konfiguration installiert"
else
error "SMB-Konfigurationsdatei nicht gefunden: $SCRIPT_DIR/smb.conf.example"
fi
# Mount-Point in Konfiguration anpassen
sed -i "s|/mnt/ssd-storage|$SSD_MOUNT_POINT|g" "$SMB_CONF"
# Konfiguration validieren
if testparm -s "$SMB_CONF" &>/dev/null; then
log "SMB-Konfiguration ist gültig"
else
error "SMB-Konfiguration ist ungültig"
fi
log "SMB-Konfiguration abgeschlossen"
}
# ============================================================================
# Service-Konfiguration
# ============================================================================
enable_services() {
log "Aktiviere und starte Services..."
local services=("smbd" "nmbd")
for service in "${services[@]}"; do
systemctl enable "$service"
systemctl restart "$service"
if systemctl is-active --quiet "$service"; then
log "Service $service ist aktiv"
else
error "Service $service konnte nicht gestartet werden"
fi
done
# Firewall-Konfiguration (falls UFW aktiv)
if command -v ufw &> /dev/null && ufw status | grep -q "Status: active"; then
ufw allow samba
log "Firewall-Regel für Samba hinzugefügt"
fi
log "Service-Konfiguration abgeschlossen"
}
# ============================================================================
# Benutzer-Setup
# ============================================================================
setup_samba_users() {
log "Konfiguriere Samba-Benutzer..."
# Aktueller Benutzer (falls vorhanden)
if [[ -n "${SUDO_USER:-}" ]]; then
echo "Samba-Passwort für Benutzer $SUDO_USER setzen:"
smbpasswd -a "$SUDO_USER"
smbpasswd -e "$SUDO_USER"
log "Samba-Benutzer $SUDO_USER konfiguriert"
fi
# Service-Benutzer (ohne Passwort-Login)
smbpasswd -a ssd-service -n
smbpasswd -d ssd-service
log "Samba-Benutzer-Konfiguration abgeschlossen"
}
# ============================================================================
# Tests und Validierung
# ============================================================================
test_smb_config() {
log "Teste SMB-Konfiguration..."
# Konfiguration testen
if ! testparm -s &>/dev/null; then
error "SMB-Konfiguration ist ungültig"
fi
# Services testen
for service in smbd nmbd; do
if ! systemctl is-active --quiet "$service"; then
error "Service $service ist nicht aktiv"
fi
done
# Freigaben testen
if ! smbclient -L localhost -N &>/dev/null; then
warn "SMB-Freigaben sind nicht erreichbar"
else
log "SMB-Freigaben sind erreichbar"
fi
log "SMB-Tests abgeschlossen"
}
# ============================================================================
# Cleanup und Wartung
# ============================================================================
setup_maintenance() {
log "Konfiguriere Wartungs-Scripts..."
# Temp-Verzeichnis Cleanup
cat > /etc/cron.daily/ssd-temp-cleanup << 'EOF'
#!/bin/bash
# Bereinige temporäre SSD-Dateien (älter als 7 Tage)
find /mnt/ssd-storage/temp -type f -mtime +7 -delete 2>/dev/null || true
find /mnt/ssd-storage/temp -type d -empty -delete 2>/dev/null || true
EOF
chmod +x /etc/cron.daily/ssd-temp-cleanup
# Log-Rotation für SMB-Logs
cat > /etc/logrotate.d/ssd-smb << 'EOF'
/var/log/samba/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
systemctl reload smbd nmbd 2>/dev/null || true
endscript
}
EOF
log "Wartungs-Scripts konfiguriert"
}
# ============================================================================
# Hauptfunktionen
# ============================================================================
show_usage() {
cat << EOF
USB-SSD SMB Setup Script
Verwendung: $0 [OPTIONEN]
Optionen:
--install-samba Samba-Pakete installieren
--configure-users Benutzer und Gruppen konfigurieren
--setup-shares Freigaben konfigurieren
--enable-services Services aktivieren und starten
--all Alle Schritte ausführen
--help Diese Hilfe anzeigen
Beispiele:
$0 --all # Vollständige Installation
$0 --install-samba # Nur Samba installieren
$0 --configure-users # Nur Benutzer konfigurieren
$0 --setup-shares # Nur Freigaben konfigurieren
EOF
}
main() {
local install_samba=false
local configure_users=false
local setup_shares=false
local enable_services=false
local all_steps=false
# Parameter parsen
while [[ $# -gt 0 ]]; do
case $1 in
--install-samba)
install_samba=true
shift
;;
--configure-users)
configure_users=true
shift
;;
--setup-shares)
setup_shares=true
shift
;;
--enable-services)
enable_services=true
shift
;;
--all)
all_steps=true
shift
;;
--help)
show_usage
exit 0
;;
*)
error "Unbekannte Option: $1"
;;
esac
done
# Wenn keine spezifischen Optionen, zeige Hilfe
if [[ "$install_samba" == false && "$configure_users" == false && "$setup_shares" == false && "$enable_services" == false && "$all_steps" == false ]]; then
show_usage
exit 1
fi
# Root-Berechtigung prüfen
check_root
# OS erkennen
detect_os
# Mount-Point prüfen
check_mount_point
# Log-Datei initialisieren
mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"
log "USB-SSD SMB Setup gestartet"
# Schritte ausführen
if [[ "$all_steps" == true || "$install_samba" == true ]]; then
install_samba
fi
if [[ "$all_steps" == true || "$configure_users" == true ]]; then
configure_users
setup_directories
fi
if [[ "$all_steps" == true || "$setup_shares" == true ]]; then
setup_smb_config
setup_samba_users
setup_maintenance
fi
if [[ "$all_steps" == true || "$enable_services" == true ]]; then
enable_services
test_smb_config
fi
log "USB-SSD SMB Setup abgeschlossen"
# Zusammenfassung
cat << EOF
${GREEN}=== Setup-Zusammenfassung ===${NC}
SMB-Freigaben:
- //$(hostname)/ssd-storage (Haupt-Freigabe)
- //$(hostname)/ssd-backup (Backup-Speicher)
- //$(hostname)/ssd-archive (Archiv, Read-Only)
- //$(hostname)/ssd-media (Media-Dateien)
- //$(hostname)/ssd-dev (Entwicklung)
- //$(hostname)/ssd-temp (Temporäre Dateien)
Nächste Schritte:
1. USB-SSD anschließen und mounten: ssd-mount-manager.sh mount
2. SMB-Freigaben testen: smbclient -L localhost -U $USER
3. Von Windows: \\\\$(hostname)\\ssd-storage
Log-Datei: $LOG_FILE
Konfiguration: $SMB_CONF
Backup: $SMB_CONF_BACKUP
EOF
}
# Script ausführen
main "$@"