Setup installation
This commit is contained in:
490
examples/smb-configuration/setup-smb.sh
Normal file
490
examples/smb-configuration/setup-smb.sh
Normal file
@@ -0,0 +1,490 @@
|
||||
#!/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 "$@"
|
Reference in New Issue
Block a user