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:
parent
74c2dd0daf
commit
68ea576205
2 changed files with 151 additions and 16 deletions
11
README.md
11
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/<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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue