Major improvements to drive detection and create-all command

Drive Detection Improvements:
- Enhanced discover_mounts() with verbose mode showing detailed disk info
- Better filtering to skip loopback devices and empty entries
- Extended SHARES array format to include device name and UUID (5 fields)
- Shows mount status, disk size, and free space for each partition

create-all Command Overhaul:
- Now a comprehensive 4-step setup process:
  1. Creates static shares (home + root)
  2. Detects all disk partitions on the system
  3. Automatically mounts unmounted disks to /mnt/<label>
  4. Adds disks to /etc/fstab for persistent mounting
  5. Creates Samba shares for all mounted disks
- Perfect for initial setup or bulk disk management

Other Improvements:
- discover command now shows verbose output with mount status
- auto-disks shows count of created shares
- Updated all functions to handle new 5-field SHARES format
- Better error handling and user feedback throughout

This makes FSA truly zero-touch for multi-disk setups!

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
mxnticek 2026-01-09 20:54:22 +01:00
parent 74c2dd0daf
commit 68ea576205
2 changed files with 151 additions and 16 deletions

View file

@ -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/<disk-label>`
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

View file

@ -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)