diff --git a/storagebox.sh b/storagebox.sh index d9143a7..42448f4 100644 --- a/storagebox.sh +++ b/storagebox.sh @@ -11,18 +11,18 @@ NC='\033[0m' SECRETS_FILE="$HOME/.zsh_secrets" REMOTE_NAME="hetzner-box" -# Dependency Check +# 1. Dependency Check if ! command -v rclone &> /dev/null; then echo -e "${RED}Error: rclone is not installed.${NC}" exit 1 fi -# Load Secrets +# 2. Load Secrets if [ -f "$SECRETS_FILE" ]; then source "$SECRETS_FILE" fi -# Configure Remote (If missing) +# 3. Configure Remote (If missing) if ! rclone listremotes | grep -q "^${REMOTE_NAME}:$"; then echo -e "${BLUE}Configuration missing. Starting setup...${NC}" @@ -67,7 +67,7 @@ if ! rclone listremotes | grep -q "^${REMOTE_NAME}:$"; then echo -e "${GREEN}Configuration created!${NC}" fi -# Interactive Menu +# 4. Interactive Menu echo -e "${BLUE}--- Hetzner Storage Box Manager ---${NC}" echo "1) List files (ls)" echo "2) Upload (Copy LOCAL -> REMOTE)" @@ -79,48 +79,61 @@ read -p "Select option: " OPTION case $OPTION in 1) - read -p "Enter depth [2]: " INPUT_DEPTH - DEPTH="${INPUT_DEPTH:-2}" + read -p "Enter depth [1]: " INPUT_DEPTH + DEPTH="${INPUT_DEPTH:-1}" + echo -e "${BLUE}Listing files on Hetzner...${NC}" rclone ls "${REMOTE_NAME}:" --max-depth "$DEPTH" ;; 2) + # UPLOAD read -p "Enter local folder/file to upload: " LOCAL_PATH + # Remove trailing slash LOCAL_PATH=${LOCAL_PATH%/} read -p "Enter remote destination folder (e.g. Backup): " REMOTE_FOLDER - + # Remove leading/trailing slashes to ensure relative path safety (no //root/paths) REMOTE_FOLDER=${REMOTE_FOLDER#/} REMOTE_FOLDER=${REMOTE_FOLDER%/} echo -e "${YELLOW}Uploading '$LOCAL_PATH' to '${REMOTE_NAME}:/$REMOTE_FOLDER'...${NC}" + # Use copy to prevent data loss rclone copy "$LOCAL_PATH" "${REMOTE_NAME}:/$REMOTE_FOLDER" -P ;; 3) - read -p "Enter remote file/folder to download: " REMOTE_PATH + # DOWNLOAD + echo -e "${BLUE}Contents of Root:${NC}" + rclone lsd "${REMOTE_NAME}:" + + read -p "Enter remote path to download (e.g. models/Test): " REMOTE_PATH + # Strip leading slash to force relative path from Home REMOTE_PATH=${REMOTE_PATH#/} read -p "Enter local destination folder: " LOCAL_DEST + # Create dest if missing + mkdir -p "$LOCAL_DEST" - echo -e "${YELLOW}Downloading '${REMOTE_NAME}:/$REMOTE_PATH'...${NC}" - rclone copy "${REMOTE_NAME}:/$REMOTE_PATH" "$LOCAL_DEST" -P + echo -e "${YELLOW}Downloading '${REMOTE_NAME}:$REMOTE_PATH' to '$LOCAL_DEST'...${NC}" + rclone copy "${REMOTE_NAME}:$REMOTE_PATH" "$LOCAL_DEST" -P ;; 4) + # MOUNT LOGIC (With Permission Fixes) if [ -d "/mnt/resource" ]; then BASE_DIR="/mnt/resource" else - BASE_DIR="/mnt" + BASE_DIR="$HOME/mnt" # Fallback if no NVMe exists + mkdir -p "$BASE_DIR" fi MOUNT_POINT="$BASE_DIR/storagebox" CACHE_DIR="$BASE_DIR/rclone_cache" echo -e "${BLUE}Target: $MOUNT_POINT${NC}" - echo -e "${BLUE}Cache: $CACHE_DIR${NC}" - - if [ ! -d "$MOUNT_POINT" ] || [ ! -w "$MOUNT_POINT" ]; then - echo -e "${YELLOW}Setting up permissions for $BASE_DIR... (sudo required)${NC}" - sudo mkdir -p "$MOUNT_POINT" "$CACHE_DIR" - sudo chown $(whoami):$(id -gn) "$MOUNT_POINT" "$CACHE_DIR" + + # Ensure permissions exist (sudo only if needed) + if [ ! -d "$MOUNT_POINT" ]; then + echo -e "${YELLOW}Creating mount points...${NC}" + sudo mkdir -p "$MOUNT_POINT" "$CACHE_DIR" || mkdir -p "$MOUNT_POINT" "$CACHE_DIR" + sudo chown $(whoami):$(id -gn) "$MOUNT_POINT" "$CACHE_DIR" 2>/dev/null || true fi echo -e "${YELLOW}Mounting... (Ctrl+C to stop)${NC}"