Update install.sh with auto-discovery and README with Quick Start
- Enhanced install.sh with script auto-discovery functionality - Added Quick Start section to README with one-liner commands - Created update.sh for repository updates - Resolved merge conflicts from upstream changes 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+265
-89
@@ -39,6 +39,53 @@ log_dry_run() {
|
||||
echo -e "${YELLOW}[DRY-RUN]${NC} $1"
|
||||
}
|
||||
|
||||
# Auto-Discovery Funktionen
|
||||
discover_scripts() {
|
||||
local category="$1"
|
||||
local scripts=()
|
||||
|
||||
if [[ ! -d "$SCRIPT_DIR/$category" ]]; then
|
||||
echo "0"
|
||||
return
|
||||
fi
|
||||
|
||||
# Finde alle .sh Dateien in Unterverzeichnissen
|
||||
while IFS= read -r -d '' script; do
|
||||
# Extrahiere Scriptname und Verzeichnis
|
||||
local script_dir="$(dirname "$script")"
|
||||
local script_name="$(basename "$script_dir")"
|
||||
local script_file="$(basename "$script")"
|
||||
|
||||
# Überspringe wenn Script-Name nicht dem Verzeichnis entspricht
|
||||
if [[ "$script_file" == "$script_name.sh" ]]; then
|
||||
scripts+=("$script_name:$script")
|
||||
fi
|
||||
done < <(find "$SCRIPT_DIR/$category" -name "*.sh" -type f -print0 2>/dev/null)
|
||||
|
||||
# Rückgabe: Anzahl:script1:path1:script2:path2...
|
||||
local result="${#scripts[@]}"
|
||||
for script_info in "${scripts[@]}"; do
|
||||
result="$result:$script_info"
|
||||
done
|
||||
echo "$result"
|
||||
}
|
||||
|
||||
get_script_description() {
|
||||
local category="$1"
|
||||
local script_name="$2"
|
||||
|
||||
# Versuche Beschreibung aus README zu extrahieren
|
||||
local readme="$SCRIPT_DIR/$category/$script_name/README.md"
|
||||
if [[ -f "$readme" ]]; then
|
||||
# Erste Zeile nach "# scriptname"
|
||||
grep -A 2 "^# $script_name" "$readme" 2>/dev/null | tail -n 1 | sed 's/^[[:space:]]*//'
|
||||
else
|
||||
# Fallback: Erste Kommentarzeile aus Script
|
||||
local script_file="$SCRIPT_DIR/$category/$script_name/$script_name.sh"
|
||||
grep -m 1 "^# " "$script_file" 2>/dev/null | sed 's/^# //' || echo "Keine Beschreibung verfügbar"
|
||||
fi
|
||||
}
|
||||
|
||||
# Hilfsfunktionen
|
||||
backup_file() {
|
||||
local file="$1"
|
||||
@@ -126,117 +173,246 @@ install_bashprofiles() {
|
||||
esac
|
||||
}
|
||||
|
||||
# Generische Script-Installation
|
||||
install_script() {
|
||||
local category="$1"
|
||||
local script_name="$2"
|
||||
local script_path="$3"
|
||||
|
||||
log_info "Installiere $script_name..."
|
||||
|
||||
# Spezielle Behandlung für go-Tool (LUSER check)
|
||||
if [[ "$script_name" == "go" ]]; then
|
||||
if [[ -z "${LUSER:-}" ]]; then
|
||||
log_warning "LUSER Umgebungsvariable nicht gesetzt"
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde nach LUSER fragen und in ~/.bash_env schreiben"
|
||||
log_dry_run "Beispiel: export LUSER=\"username\" >> ~/.bash_env"
|
||||
else
|
||||
read -p "LUSER eingeben (für Kerberos): " user_input
|
||||
if [[ -n "$user_input" ]]; then
|
||||
echo "export LUSER=\"$user_input\"" >> "$HOME/.bash_env"
|
||||
export LUSER="$user_input"
|
||||
log_success "LUSER in ~/.bash_env gesetzt"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
log_info "LUSER bereits gesetzt: $LUSER"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Script ausführbar machen
|
||||
make_executable "$script_path"
|
||||
|
||||
# Symlink erstellen
|
||||
ensure_bin_dir
|
||||
create_symlink "$script_path" "$HOME/bin/$script_name" "$script_name-Tool"
|
||||
|
||||
log_success "$script_name installiert"
|
||||
}
|
||||
|
||||
ensure_bin_dir() {
|
||||
if [[ ! -d "$HOME/bin" ]]; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde Verzeichnis erstellen: ~/bin"
|
||||
log_dry_run "Würde PATH erweitern: export PATH=\"\$HOME/bin:\$PATH\" >> ~/.bash_paths"
|
||||
else
|
||||
log_info "~/bin existiert nicht. Erstelle Verzeichnis..."
|
||||
mkdir -p "$HOME/bin"
|
||||
log_info "Füge ~/bin zu PATH hinzu (in ~/.bash_paths)"
|
||||
echo 'export PATH="$HOME/bin:$PATH"' >> "$HOME/.bash_paths"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Installation: Connect Tools
|
||||
install_connect() {
|
||||
log_info "=== Connect Tools Installation ==="
|
||||
|
||||
# Auto-discover verfügbare Scripts
|
||||
local discovery_result
|
||||
discovery_result=$(discover_scripts "connect")
|
||||
|
||||
local script_count
|
||||
script_count=$(echo "$discovery_result" | cut -d':' -f1)
|
||||
|
||||
if [[ "$script_count" -eq 0 ]]; then
|
||||
log_info "Keine Connect Tools gefunden"
|
||||
return
|
||||
fi
|
||||
|
||||
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
|
||||
echo "1) go - SSH-Shortcuts für easyname Server"
|
||||
|
||||
# Parse discovery result und zeige Menu
|
||||
local scripts=()
|
||||
local counter=1
|
||||
IFS=':' read -ra PARTS <<< "$discovery_result"
|
||||
for ((i=1; i<${#PARTS[@]}; i+=2)); do
|
||||
local script_name="${PARTS[i]}"
|
||||
local script_path="${PARTS[i+1]}"
|
||||
local description
|
||||
description=$(get_script_description "connect" "$script_name")
|
||||
|
||||
echo "$counter) $script_name - $description"
|
||||
scripts+=("$script_name:$script_path")
|
||||
((counter++))
|
||||
done
|
||||
|
||||
echo "$counter) Alle Connect Tools"
|
||||
echo "0) Überspringen"
|
||||
|
||||
read -p "Tools auswählen [0-1]: " connect_choice
|
||||
read -p "Tools auswählen [0-$counter]: " connect_choice
|
||||
|
||||
case "$connect_choice" in
|
||||
1)
|
||||
log_info "Installiere go SSH-Shortcut Tool..."
|
||||
|
||||
# Prüfe LUSER Variable
|
||||
if [[ -z "${LUSER:-}" ]]; then
|
||||
log_warning "LUSER Umgebungsvariable nicht gesetzt"
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde nach LUSER fragen und in ~/.bash_env schreiben"
|
||||
log_dry_run "Beispiel: export LUSER=\"username\" >> ~/.bash_env"
|
||||
else
|
||||
read -p "LUSER eingeben (für Kerberos): " user_input
|
||||
if [[ -n "$user_input" ]]; then
|
||||
echo "export LUSER=\"$user_input\"" >> "$HOME/.bash_env"
|
||||
export LUSER="$user_input"
|
||||
log_success "LUSER in ~/.bash_env gesetzt"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
log_info "LUSER bereits gesetzt: $LUSER"
|
||||
fi
|
||||
|
||||
# Script installieren
|
||||
local go_script="$SCRIPT_DIR/connect/go/go.sh"
|
||||
make_executable "$go_script"
|
||||
|
||||
# Symlink in ~/bin oder PATH erstellen
|
||||
if [[ -d "$HOME/bin" ]]; then
|
||||
create_symlink "$go_script" "$HOME/bin/go" "go-Tool"
|
||||
else
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde Verzeichnis erstellen: ~/bin"
|
||||
log_dry_run "Würde PATH erweitern: export PATH=\"\$HOME/bin:\$PATH\" >> ~/.bash_paths"
|
||||
else
|
||||
log_info "~/bin existiert nicht. Erstelle Verzeichnis..."
|
||||
mkdir -p "$HOME/bin"
|
||||
log_info "Füge ~/bin zu PATH hinzu (in ~/.bash_paths)"
|
||||
echo 'export PATH="$HOME/bin:$PATH"' >> "$HOME/.bash_paths"
|
||||
fi
|
||||
create_symlink "$go_script" "$HOME/bin/go" "go-Tool"
|
||||
fi
|
||||
|
||||
log_success "go-Tool installiert"
|
||||
;;
|
||||
0)
|
||||
log_info "Connect Tools übersprungen"
|
||||
;;
|
||||
*)
|
||||
log_error "Ungültige Auswahl"
|
||||
;;
|
||||
esac
|
||||
if [[ "$connect_choice" -eq 0 ]]; then
|
||||
log_info "Connect Tools übersprungen"
|
||||
elif [[ "$connect_choice" -eq "$counter" ]]; then
|
||||
# Alle installieren
|
||||
for script_info in "${scripts[@]}"; do
|
||||
IFS=':' read -r script_name script_path <<< "$script_info"
|
||||
install_script "connect" "$script_name" "$script_path"
|
||||
done
|
||||
elif [[ "$connect_choice" -ge 1 && "$connect_choice" -lt "$counter" ]]; then
|
||||
# Einzelnes Tool installieren
|
||||
local selected_script="${scripts[$((connect_choice-1))]}"
|
||||
IFS=':' read -r script_name script_path <<< "$selected_script"
|
||||
install_script "connect" "$script_name" "$script_path"
|
||||
else
|
||||
log_error "Ungültige Auswahl"
|
||||
fi
|
||||
}
|
||||
|
||||
# Installation: Legacy Tools
|
||||
install_legacy() {
|
||||
log_info "=== Legacy Tools Installation ==="
|
||||
|
||||
# Auto-discover verfügbare Scripts
|
||||
local discovery_result
|
||||
discovery_result=$(discover_scripts "legacy")
|
||||
|
||||
local script_count
|
||||
script_count=$(echo "$discovery_result" | cut -d':' -f1)
|
||||
|
||||
if [[ "$script_count" -eq 0 ]]; then
|
||||
log_info "Keine Legacy Tools gefunden"
|
||||
return
|
||||
fi
|
||||
|
||||
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
|
||||
echo "1) checkms - MS-Fehlercode Analyse"
|
||||
echo "2) quicknav - Bash-Funktion für schnelle Navigation"
|
||||
echo "3) Alle Legacy Tools"
|
||||
|
||||
# Parse discovery result und zeige Menu
|
||||
local scripts=()
|
||||
local counter=1
|
||||
IFS=':' read -ra PARTS <<< "$discovery_result"
|
||||
for ((i=1; i<${#PARTS[@]}; i+=2)); do
|
||||
local script_name="${PARTS[i]}"
|
||||
local script_path="${PARTS[i+1]}"
|
||||
local description
|
||||
description=$(get_script_description "legacy" "$script_name")
|
||||
|
||||
echo "$counter) $script_name - $description"
|
||||
scripts+=("$script_name:$script_path")
|
||||
((counter++))
|
||||
done
|
||||
|
||||
echo "$counter) Alle Legacy Tools"
|
||||
echo "0) Überspringen"
|
||||
|
||||
read -p "Tools auswählen [0-3]: " legacy_choice
|
||||
read -p "Tools auswählen [0-$counter]: " legacy_choice
|
||||
|
||||
case "$legacy_choice" in
|
||||
1|3)
|
||||
log_info "Installiere checkms..."
|
||||
local checkms_script="$SCRIPT_DIR/legacy/checkms/checkms.sh"
|
||||
make_executable "$checkms_script"
|
||||
|
||||
if [[ -d "$HOME/bin" ]]; then
|
||||
create_symlink "$checkms_script" "$HOME/bin/checkms" "checkms"
|
||||
else
|
||||
mkdir -p "$HOME/bin"
|
||||
create_symlink "$checkms_script" "$HOME/bin/checkms" "checkms"
|
||||
fi
|
||||
|
||||
log_success "checkms installiert"
|
||||
;;&
|
||||
2|3)
|
||||
log_info "Installiere quicknav..."
|
||||
local quicknav_func="$SCRIPT_DIR/legacy/quicknav/quicknav.sh"
|
||||
|
||||
log_warning "quicknav ist eine Bash-Funktion und muss manuell in .bashrc eingebunden werden"
|
||||
log_info "Füge folgende Zeile zu ~/.bashrc hinzu:"
|
||||
echo -e "${YELLOW}source \"$quicknav_func\"${NC}"
|
||||
;;&
|
||||
0)
|
||||
log_info "Legacy Tools übersprungen"
|
||||
;;
|
||||
*)
|
||||
log_error "Ungültige Auswahl"
|
||||
;;
|
||||
esac
|
||||
if [[ "$legacy_choice" -eq 0 ]]; then
|
||||
log_info "Legacy Tools übersprungen"
|
||||
elif [[ "$legacy_choice" -eq "$counter" ]]; then
|
||||
# Alle installieren
|
||||
for script_info in "${scripts[@]}"; do
|
||||
IFS=':' read -r script_name script_path <<< "$script_info"
|
||||
install_legacy_script "$script_name" "$script_path"
|
||||
done
|
||||
elif [[ "$legacy_choice" -ge 1 && "$legacy_choice" -lt "$counter" ]]; then
|
||||
# Einzelnes Tool installieren
|
||||
local selected_script="${scripts[$((legacy_choice-1))]}"
|
||||
IFS=':' read -r script_name script_path <<< "$selected_script"
|
||||
install_legacy_script "$script_name" "$script_path"
|
||||
else
|
||||
log_error "Ungültige Auswahl"
|
||||
fi
|
||||
}
|
||||
|
||||
# Installation: WH20 Tools (Platzhalter für zukünftige Tools)
|
||||
# Spezielle Legacy Script Installation (für quicknav Behandlung)
|
||||
install_legacy_script() {
|
||||
local script_name="$1"
|
||||
local script_path="$2"
|
||||
|
||||
log_info "Installiere $script_name..."
|
||||
|
||||
if [[ "$script_name" == "quicknav" ]]; then
|
||||
# quicknav ist eine Bash-Funktion, keine Binary
|
||||
log_warning "quicknav ist eine Bash-Funktion und muss manuell in .bashrc eingebunden werden"
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde Hinweis anzeigen: source \"$script_path\" zu ~/.bashrc hinzufügen"
|
||||
else
|
||||
log_info "Füge folgende Zeile zu ~/.bashrc hinzu:"
|
||||
echo -e "${YELLOW}source \"$script_path\"${NC}"
|
||||
fi
|
||||
else
|
||||
# Normale Script Installation
|
||||
install_script "legacy" "$script_name" "$script_path"
|
||||
fi
|
||||
}
|
||||
|
||||
# Installation: WH20 Tools
|
||||
install_wh20() {
|
||||
log_info "=== WH20 Tools Installation ==="
|
||||
log_info "Noch keine WH20 Tools verfügbar"
|
||||
|
||||
# Auto-discover verfügbare Scripts
|
||||
local discovery_result
|
||||
discovery_result=$(discover_scripts "wh20")
|
||||
|
||||
local script_count
|
||||
script_count=$(echo "$discovery_result" | cut -d':' -f1)
|
||||
|
||||
if [[ "$script_count" -eq 0 ]]; then
|
||||
log_info "Noch keine WH20 Tools verfügbar"
|
||||
return
|
||||
fi
|
||||
|
||||
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
|
||||
|
||||
# Parse discovery result und zeige Menu
|
||||
local scripts=()
|
||||
local counter=1
|
||||
IFS=':' read -ra PARTS <<< "$discovery_result"
|
||||
for ((i=1; i<${#PARTS[@]}; i+=2)); do
|
||||
local script_name="${PARTS[i]}"
|
||||
local script_path="${PARTS[i+1]}"
|
||||
local description
|
||||
description=$(get_script_description "wh20" "$script_name")
|
||||
|
||||
echo "$counter) $script_name - $description"
|
||||
scripts+=("$script_name:$script_path")
|
||||
((counter++))
|
||||
done
|
||||
|
||||
echo "$counter) Alle WH20 Tools"
|
||||
echo "0) Überspringen"
|
||||
|
||||
read -p "Tools auswählen [0-$counter]: " wh20_choice
|
||||
|
||||
if [[ "$wh20_choice" -eq 0 ]]; then
|
||||
log_info "WH20 Tools übersprungen"
|
||||
elif [[ "$wh20_choice" -eq "$counter" ]]; then
|
||||
# Alle installieren
|
||||
for script_info in "${scripts[@]}"; do
|
||||
IFS=':' read -r script_name script_path <<< "$script_info"
|
||||
install_script "wh20" "$script_name" "$script_path"
|
||||
done
|
||||
elif [[ "$wh20_choice" -ge 1 && "$wh20_choice" -lt "$counter" ]]; then
|
||||
# Einzelnes Tool installieren
|
||||
local selected_script="${scripts[$((wh20_choice-1))]}"
|
||||
IFS=':' read -r script_name script_path <<< "$selected_script"
|
||||
install_script "wh20" "$script_name" "$script_path"
|
||||
else
|
||||
log_error "Ungültige Auswahl"
|
||||
fi
|
||||
}
|
||||
|
||||
# Hilfsfunktion
|
||||
|
||||
Reference in New Issue
Block a user