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
|
```bash
|
||||||
sudo ./spravuj_sdileni.sh discover
|
sudo ./spravuj_sdileni.sh discover
|
||||||
```
|
```
|
||||||
|
Shows all detected disk partitions with their mount status, labels, and available space.
|
||||||
|
|
||||||
**List configured shares**:
|
**List configured shares**:
|
||||||
```bash
|
```bash
|
||||||
|
|
@ -156,10 +157,18 @@ Default allowed networks:
|
||||||
sudo ./spravuj_sdileni.sh add-global
|
sudo ./spravuj_sdileni.sh add-global
|
||||||
```
|
```
|
||||||
|
|
||||||
### Create all static shares (home + root)
|
### Create all shares automatically
|
||||||
```bash
|
```bash
|
||||||
sudo ./spravuj_sdileni.sh create-all
|
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
|
## 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
|
# VYLEPŠENÁ FUNKCE: Najde všechny diskové oddíly a správně očistí jejich názvy
|
||||||
discover_mounts() {
|
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
|
for key in "${!SHARES[@]}"; do
|
||||||
if [[ $key == disk-* ]]; then
|
if [[ $key == disk-* ]]; then
|
||||||
unset SHARES[$key]
|
unset SHARES[$key]
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
local disk_count=0
|
||||||
while read -r name label uuid mountpoint; do
|
while read -r name label uuid mountpoint; do
|
||||||
# Odstranění stromových znaků (└─, ├─) z názvu zařízení
|
# Odstranění stromových znaků (└─, ├─) z názvu zařízení
|
||||||
name=$(echo "$name" | sed 's/^[├└]─//g' | sed 's/ //g')
|
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 identifier="${label:-$name}"
|
||||||
local clean_identifier
|
local clean_identifier
|
||||||
clean_identifier=$(echo "$identifier" | sed 's/[^a-zA-Z0-9_-]//g')
|
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
|
if [ -z "$clean_identifier" ]; then
|
||||||
clean_identifier="$name"
|
clean_identifier="$name"
|
||||||
fi
|
fi
|
||||||
|
|
@ -140,9 +151,23 @@ discover_mounts() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$clean_identifier" ]; then
|
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
|
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
|
# 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 "$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
|
if [ -z "${SHARES[$share_name]}" ]; then echo "Neznámé sdílení: $share_name"; return 1; fi
|
||||||
check_config_exists
|
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 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
|
if [ ! -d "$share_path" ]; then
|
||||||
|
|
@ -304,25 +329,118 @@ list_shares() {
|
||||||
grep -E "^\[.*\]" "$CONFIG_FILE" | grep -v "\[global\]"
|
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() {
|
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 "${DETECTED_USER}-home"
|
||||||
create_share "server-root"
|
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
|
# Funkce pro automatické vytvoření sdílení pro všechny disky
|
||||||
auto_discover_and_create() {
|
auto_discover_and_create() {
|
||||||
echo "=== AUTOMATICKÉ VYTVÁŘENÍ SDÍLENÍ PRO PŘIPOJENÉ DISKY ==="
|
echo "=== AUTOMATICKÉ VYTVÁŘENÍ SDÍLENÍ PRO PŘIPOJENÉ DISKY ==="
|
||||||
|
discover_mounts verbose
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local created_count=0
|
||||||
for share_name in "${!SHARES[@]}"; do
|
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 [ "$share_type" = "disk" ]; then
|
||||||
if mountpoint -q "$path" 2>/dev/null; then
|
if mountpoint -q "$path" 2>/dev/null; then
|
||||||
echo "--- Vytvářím sdílení pro připojený disk: $share_name ---"
|
echo "--- Vytvářím sdílení pro připojený disk: $share_name ---"
|
||||||
create_share "$share_name"
|
create_share "$share_name"
|
||||||
|
created_count=$((created_count + 1))
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
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
|
# Funkce pro přidání [global] sekce do existující konfigurace
|
||||||
|
|
@ -498,7 +616,10 @@ interactive_mount_and_create() {
|
||||||
local share_name="disk-$clean_identifier"
|
local share_name="disk-$clean_identifier"
|
||||||
echo ""; echo "Nyní vytvářím Samba sdílení s názvem '$share_name'..."
|
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"
|
create_share "$share_name"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -776,11 +897,16 @@ case "$COMMAND" in
|
||||||
test_and_restart
|
test_and_restart
|
||||||
;;
|
;;
|
||||||
discover)
|
discover)
|
||||||
|
discover_mounts verbose
|
||||||
echo ""
|
echo ""
|
||||||
echo "Dostupná sdílení pro 'create':"
|
echo "Dostupná sdílení pro 'create':"
|
||||||
for name in "${!SHARES[@]}"; do
|
for name in "${!SHARES[@]}"; do
|
||||||
IFS='|' read -r path comment type <<< "${SHARES[$name]}"
|
IFS='|' read -r path comment type device_name uuid <<< "${SHARES[$name]}"
|
||||||
echo " - $name (cesta: $path)"
|
if [ "$type" = "disk" ]; then
|
||||||
|
echo " - $name (cesta: $path, zařízení: /dev/$device_name)"
|
||||||
|
else
|
||||||
|
echo " - $name (cesta: $path)"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
;;
|
;;
|
||||||
init)
|
init)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue