diff --git a/README.md b/README.md index 562ef56..0047951 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ sudo ./spravuj_sdileni.sh mount-share --mode=always ```bash sudo ./spravuj_sdileni.sh discover ``` +Shows all detected disk partitions with their mount status, labels, and available space. **List configured shares**: ```bash @@ -156,10 +157,18 @@ Default allowed networks: sudo ./spravuj_sdileni.sh add-global ``` -### Create all static shares (home + root) +### Create all shares automatically ```bash sudo ./spravuj_sdileni.sh create-all ``` +This comprehensive command will: +1. Create static shares (home directory and root filesystem) +2. Detect all disk partitions on the system +3. Automatically mount any unmounted disks to `/mnt/` +4. Add unmounted disks to `/etc/fstab` for persistence across reboots +5. Create Samba shares for all mounted disks + +Perfect for initial setup or adding multiple disks at once! ## Troubleshooting diff --git a/spravuj_sdileni.sh b/spravuj_sdileni.sh index b9c5eaa..b354393 100755 --- a/spravuj_sdileni.sh +++ b/spravuj_sdileni.sh @@ -106,22 +106,33 @@ check_config_exists() { # VYLEPŠENÁ FUNKCE: Najde všechny diskové oddíly a správně očistí jejich názvy discover_mounts() { - echo "Hledám všechny existující diskové oddíly..." + local verbose="$1" + if [ "$verbose" = "verbose" ]; then + echo "=== HLEDÁNÍ DISKOVÝCH ODDÍLŮ ===" + fi + + # Vyčisti předchozí disky z SHARES for key in "${!SHARES[@]}"; do if [[ $key == disk-* ]]; then unset SHARES[$key] fi done + local disk_count=0 while read -r name label uuid mountpoint; do # Odstranění stromových znaků (└─, ├─) z názvu zařízení name=$(echo "$name" | sed 's/^[├└]─//g' | sed 's/ //g') - + + # Přeskoč prázdné řádky nebo loopback zařízení + if [ -z "$name" ] || [[ "$name" == loop* ]]; then + continue + fi + local identifier="${label:-$name}" local clean_identifier clean_identifier=$(echo "$identifier" | sed 's/[^a-zA-Z0-9_-]//g') - - # Záložní varianta pro prázdné popisky (např. se speciálními znaky) + + # Záložní varianta pro prázdné popisky if [ -z "$clean_identifier" ]; then clean_identifier="$name" fi @@ -138,11 +149,25 @@ discover_mounts() { share_path="/mnt/$clean_identifier" status_info="❌ Nepřipojeno (navrhovaná cesta: $share_path)" fi - + if [ -n "$clean_identifier" ]; then - SHARES["$share_name"]="$share_path|Oddíl $identifier|disk" + SHARES["$share_name"]="$share_path|Oddíl $identifier ($name)|disk|$name|$uuid" + disk_count=$((disk_count + 1)) + + if [ "$verbose" = "verbose" ]; then + echo " [$disk_count] $name (Label: $identifier) - $status_info" + fi fi - done < <(lsblk -no NAME,LABEL,UUID,MOUNTPOINT -e7,1) + done < <(lsblk -no NAME,LABEL,UUID,MOUNTPOINT -e7,1 | grep -v '^$') + + if [ "$verbose" = "verbose" ]; then + if [ $disk_count -eq 0 ]; then + echo " Žádné diskové oddíly nebyly nalezeny." + else + echo "" + echo "Celkem nalezeno: $disk_count oddílů" + fi + fi } # Funkce pro vytvoření dfree skriptu pro konkrétní disk @@ -210,7 +235,7 @@ create_share() { if [ -z "$share_name" ]; then echo "Chybí název sdílení."; return 1; fi if [ -z "${SHARES[$share_name]}" ]; then echo "Neznámé sdílení: $share_name"; return 1; fi check_config_exists - IFS='|' read -r share_path comment share_type <<< "${SHARES[$share_name]}" + IFS='|' read -r share_path comment share_type device_name uuid <<< "${SHARES[$share_name]}" if grep -Fq "[$share_name]" "$CONFIG_FILE"; then echo "Chyba: Sdílení s názvem [$share_name] již existuje."; return 1; fi if [ ! -d "$share_path" ]; then @@ -304,25 +329,118 @@ list_shares() { grep -E "^\[.*\]" "$CONFIG_FILE" | grep -v "\[global\]" } -# Funkce pro vytvoření všech staticky definovaných sdílení +# Funkce pro vytvoření všech sdílení včetně automatického mountování disků create_all() { - echo "Vytvářím všechna staticky definovaná sdílení..." + echo "=== KOMPLETNÍ NASTAVENÍ VŠECH SDÍLENÍ ===" + echo "" + + # 1. Vytvoř statická sdílení + echo "Krok 1/4: Vytvářím statická sdílení..." create_share "${DETECTED_USER}-home" create_share "server-root" + + echo "" + echo "Krok 2/4: Hledám diskové oddíly..." + discover_mounts verbose + + # 2. Zpracuj všechny nalezené disky + local unmounted_disks=() + local mounted_disks=() + + for share_name in "${!SHARES[@]}"; do + IFS='|' read -r path comment share_type device_name uuid <<< "${SHARES[$share_name]}" + if [ "$share_type" = "disk" ]; then + if mountpoint -q "$path" 2>/dev/null; then + mounted_disks+=("$share_name|$path|$device_name|$uuid") + else + unmounted_disks+=("$share_name|$path|$device_name|$uuid") + fi + fi + done + + echo "" + echo "Krok 3/4: Připojuji nepřipojené disky..." + if [ ${#unmounted_disks[@]} -gt 0 ]; then + for disk_info in "${unmounted_disks[@]}"; do + IFS='|' read -r share_name path device_name uuid <<< "$disk_info" + + if [ -z "$uuid" ]; then + echo " ⚠️ Přeskakuji $device_name - nemá UUID" + continue + fi + + echo " Připojuji /dev/$device_name na $path..." + + # Vytvoř mount point + if [ ! -d "$path" ]; then + mkdir -p "$path" + fi + + # Připoj disk + if mount "/dev/$device_name" "$path" 2>/dev/null; then + echo " ✅ Úspěšně připojeno" + + # Přidej do fstab + if ! grep -q "$uuid" /etc/fstab 2>/dev/null; then + local fstype=$(lsblk -no FSTYPE "/dev/$device_name" 2>/dev/null) + if [ -n "$fstype" ]; then + echo " Přidávám do /etc/fstab..." + echo "" >> /etc/fstab + echo "# Auto-added by FSA on $(date)" >> /etc/fstab + echo "UUID=$uuid $path $fstype defaults,nofail 0 2" >> /etc/fstab + echo " ✅ Přidáno do /etc/fstab" + fi + fi + + mounted_disks+=("$share_name|$path|$device_name|$uuid") + else + echo " ❌ Nepodařilo se připojit" + fi + done + else + echo " Žádné nepřipojené disky k připojení." + fi + + echo "" + echo "Krok 4/4: Vytvářím Samba sdílení pro připojené disky..." + if [ ${#mounted_disks[@]} -gt 0 ]; then + for disk_info in "${mounted_disks[@]}"; do + IFS='|' read -r share_name path device_name uuid <<< "$disk_info" + echo " Vytvářím sdílení: $share_name" + create_share "$share_name" + done + else + echo " Žádné připojené disky k nasdílení." + fi + + echo "" + echo "✅ HOTOVO! Všechna sdílení byla vytvořena." } # Funkce pro automatické vytvoření sdílení pro všechny disky auto_discover_and_create() { echo "=== AUTOMATICKÉ VYTVÁŘENÍ SDÍLENÍ PRO PŘIPOJENÉ DISKY ===" + discover_mounts verbose + echo "" + + local created_count=0 for share_name in "${!SHARES[@]}"; do - IFS='|' read -r path comment share_type <<< "${SHARES[$share_name]}" + IFS='|' read -r path comment share_type device_name uuid <<< "${SHARES[$share_name]}" if [ "$share_type" = "disk" ]; then if mountpoint -q "$path" 2>/dev/null; then echo "--- Vytvářím sdílení pro připojený disk: $share_name ---" create_share "$share_name" + created_count=$((created_count + 1)) fi fi done + + echo "" + if [ $created_count -eq 0 ]; then + echo "Žádné připojené disky k nasdílení." + else + echo "✅ Vytvořeno $created_count sdílení pro připojené disky." + fi } # Funkce pro přidání [global] sekce do existující konfigurace @@ -497,8 +615,11 @@ interactive_mount_and_create() { local share_name="disk-$clean_identifier" echo ""; echo "Nyní vytvářím Samba sdílení s názvem '$share_name'..." - - SHARES["$share_name"]="$mount_path|Oddíl $selected_identifier|disk" + + # Získej UUID pro správnou identifikaci + local device_uuid=$(lsblk -no UUID "/dev/$selected_device" 2>/dev/null) + + SHARES["$share_name"]="$mount_path|Oddíl $selected_identifier|disk|$selected_device|$device_uuid" create_share "$share_name" } @@ -776,11 +897,16 @@ case "$COMMAND" in test_and_restart ;; discover) + discover_mounts verbose echo "" echo "Dostupná sdílení pro 'create':" for name in "${!SHARES[@]}"; do - IFS='|' read -r path comment type <<< "${SHARES[$name]}" - echo " - $name (cesta: $path)" + IFS='|' read -r path comment type device_name uuid <<< "${SHARES[$name]}" + if [ "$type" = "disk" ]; then + echo " - $name (cesta: $path, zařízení: /dev/$device_name)" + else + echo " - $name (cesta: $path)" + fi done ;; init)