491 lines
14 KiB
Bash
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 "$@"
|