From 8c85fe8819e2cb8989b8c13fb0f73380b24ef494 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 21 Apr 2025 10:33:38 +1200 Subject: [PATCH] . --- install.sh | 33 ++++++++------------------------- src/dropshell-completion.bash | 18 +++++++++++++++++- src/dropshell.sh | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 27 deletions(-) diff --git a/install.sh b/install.sh index 382237c..4e44771 100755 --- a/install.sh +++ b/install.sh @@ -11,39 +11,22 @@ NC='\033[0m' # No Color # Function to create directory with proper ownership mkdir_with_ownership() { local target_dir="$1" - local current_dir="$target_dir" - local parent_dir - local owner - local group - local created_dirs=() - + local parent_dir="$(dirname "$target_dir")" + # Find the lowest existing parent directory - while [ ! -d "$current_dir" ] && [ "$current_dir" != "/" ]; do - created_dirs+=("$current_dir") - parent_dir="$(dirname "$current_dir")" - current_dir="$parent_dir" + while [ ! -d "$parent_dir" ] && [ "$parent_dir" != "/" ]; do + parent_dir="$(dirname "$parent_dir")" done # If we found an existing directory, get its ownership - if [ -d "$current_dir" ]; then - owner=$(stat -c %U "$current_dir") - group=$(stat -c %G "$current_dir") + if [ -d "$parent_dir" ]; then + local owner=$(stat -c %U "$parent_dir") + local group=$(stat -c %G "$parent_dir") + install -d -o "$owner" -g "$group" "$target_dir" else echo -e "${RED}Error: Could not find any existing parent directory${NC}" return 1 fi - - # Create the directory and set ownership for all created directories - if mkdir -p "$target_dir"; then - # Set ownership for all created directories in reverse order - for ((i=${#created_dirs[@]}-1; i>=0; i--)); do - chown "$owner:$group" "${created_dirs[$i]}" - done - return 0 - else - echo -e "${RED}Error: Failed to create directory $target_dir${NC}" - return 1 - fi } # Check if USER_DEFINITIONS is provided diff --git a/src/dropshell-completion.bash b/src/dropshell-completion.bash index 7feb809..75299ec 100755 --- a/src/dropshell-completion.bash +++ b/src/dropshell-completion.bash @@ -7,7 +7,7 @@ _dropshell_completions() { prev="${COMP_WORDS[COMP_CWORD-1]}" # List of main commands - opts="help version status" + opts="help version status servers" # If we're completing the first argument, show all commands if [[ ${COMP_CWORD} -eq 1 ]] ; then @@ -21,6 +21,22 @@ _dropshell_completions() { # No additional completions for status COMPREPLY=() ;; + servers) + # List servers from _server.env files + local servers_dir="/opt/dropshell/user/servers" + local servers=() + + # Read all _server.env files + for server_file in "$servers_dir"/*/_server.env; do + if [ -f "$server_file" ]; then + local server_name=$(basename "$(dirname "$server_file")") + servers+=("$server_name") + fi + done + + COMPREPLY=( $(compgen -W "${servers[@]}" -- ${cur}) ) + return 0 + ;; *) ;; esac diff --git a/src/dropshell.sh b/src/dropshell.sh index ab9da97..7826378 100755 --- a/src/dropshell.sh +++ b/src/dropshell.sh @@ -60,9 +60,40 @@ check_status() { df -h / } -# Function to list servers +# Function to list servers from _server.env files list_servers() { + local servers_dir="/opt/dropshell/user/servers" + local max_name_len=0 + local max_addr_len=0 + local servers=() + # First pass: collect data and find max lengths + for server_dir in "$servers_dir"/*/; do + if [ -f "${server_dir}_server.env" ]; then + local server_name=$(basename "$server_dir") + local ssh_address=$(grep '^SSH_ADDRESS=' "${server_dir}_server.env" | cut -d'=' -f2-) + + # Update max lengths + [ ${#server_name} -gt $max_name_len ] && max_name_len=${#server_name} + [ ${#ssh_address} -gt $max_addr_len ] && max_addr_len=${#ssh_address} + + servers+=("$server_name|$ssh_address") + fi + done + + # Add padding for headers + max_name_len=$((max_name_len > 4 ? max_name_len : 4)) + max_addr_len=$((max_addr_len > 7 ? max_addr_len : 7)) + + # Print header + printf "%-${max_name_len}s | %-${max_addr_len}s\n" "Name" "Address" + printf "%-${max_name_len}s-+-%-${max_addr_len}s\n" "$(printf '%*s' $max_name_len '' | tr ' ' '-')" "$(printf '%*s' $max_addr_len '' | tr ' ' '-')" + + # Print server rows + for server in "${servers[@]}"; do + IFS='|' read -r name addr <<< "$server" + printf "%-${max_name_len}s | %-${max_addr_len}s\n" "$name" "$addr" + done } # Main script logic