All checks were successful
Check scripts syntax / check-scripts-syntax (push) Successful in 22s
297 lines
9.9 KiB
Bash
297 lines
9.9 KiB
Bash
#!/bin/bash
|
|
|
|
# Usage:
|
|
## curl -sSL https://git.ivanch.me/ivanch/server-scripts/raw/branch/main/scripts-download.sh | bash
|
|
|
|
# colors
|
|
RED='\033[1;31m'
|
|
GREEN='\033[1;32m'
|
|
NC='\033[0m'
|
|
LIGHT_BLUE='\033[1;34m'
|
|
LIGHT_RED='\033[1;31m'
|
|
LIGHT_GREEN='\033[1;32m'
|
|
GREY='\033[1;30m'
|
|
YELLOW='\033[1;33m'
|
|
|
|
FILES_URL="https://git.ivanch.me/ivanch/server-scripts/raw/branch/main"
|
|
|
|
echo -e "\r${LIGHT_BLUE}[i] Running scripts-download.sh"
|
|
|
|
# Detect OS (Debian or Alpine)
|
|
echo -e "${GREY}[i] Detecting OS..."
|
|
|
|
DETECTED=""
|
|
|
|
if [ -x "$(command -v apk)" ]; then
|
|
DETECTED="Alpine"
|
|
fi
|
|
|
|
if [ -x "$(command -v apt)" ]; then
|
|
DETECTED="Debian"
|
|
fi
|
|
|
|
if [ -z "$DETECTED" ]; then
|
|
echo -e "${RED}[x] Error: OS not supported.${NC}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}[✓] Detected '$DETECTED' Linux.${NC}"
|
|
|
|
|
|
echo -e "${GREY}[i] Checking if required packages are installed..."
|
|
|
|
PACKAGES=("zip" "unzip" "sha256sum" "curl" "crontab")
|
|
NOT_INSLALLED=()
|
|
detect_packages() {
|
|
for PACKAGE in "${PACKAGES[@]}"; do
|
|
if ! [ -x "$(command -v $PACKAGE)" ]; then
|
|
echo -e "${YELLOW}[!] Error: $PACKAGE is not installed, will attempt to install later.${NC}" >&2
|
|
NOT_INSLALLED+=($PACKAGE)
|
|
fi
|
|
done
|
|
}
|
|
|
|
detect_packages
|
|
|
|
if [ ${#NOT_INSLALLED[@]} -ne 0 ]; then
|
|
if [ "$DETECTED" == "Alpine" ]; then
|
|
echo -e "${GREY}[i] Installing required packages using APK...${NC}"
|
|
echo -e "${GREY}[i] Updating APK...${NC}"
|
|
apk update >/dev/null
|
|
echo -e "${GREY}[i] Installing packages...${NC}"
|
|
apk add --no-cache ${NOT_INSLALLED[@]} >/dev/null
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}[x] Error: Failed to install required packages.${NC}" >&2
|
|
exit 1
|
|
else
|
|
echo -e "${GREEN}[✓] All required packages should be installed.${NC}"
|
|
fi
|
|
elif [ "$DETECTED" == "Debian" ]; then
|
|
echo -e "${GREY}[i] Installing required packages using APT...${NC}"
|
|
echo -e "${GREY}[i] Updating APT...${NC}"
|
|
apt-get update -y >/dev/null
|
|
echo -e "${GREY}[i] Installing packages...${NC}"
|
|
apt-get install -y ${NOT_INSLALLED[@]} >/dev/null
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}[x] Error: Failed to install required packages.${NC}" >&2
|
|
exit 1
|
|
else
|
|
echo -e "${GREEN}[✓] All required packages should be installed.${NC}"
|
|
fi
|
|
fi
|
|
|
|
NOT_INSLALLED=()
|
|
detect_packages
|
|
|
|
if [ ${#NOT_INSLALLED[@]} -ne 0 ]; then
|
|
echo -e "${RED}[x] Error: Failed to run some of the required packages.${NC}" >&2
|
|
echo -e "${RED}[x] [${NOT_INSLALLED[@]}] are not installed.${NC}" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo -e "${GREEN}[✓] All required packages are installed.${NC}"
|
|
|
|
echo -e "${GREY}[i] Checking if crontab is running..."
|
|
|
|
# Check if crontab is running on the system using pgrep (crond or cron)
|
|
if ! pgrep "cron" > /dev/null; then
|
|
echo -e "${RED}[x] Error: Crontab is not running.${NC}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}[✓] Crontab is running.${NC}"
|
|
|
|
# Variables
|
|
SCRIPTS=("clean.sh" "backup.sh" "docker-updater.sh")
|
|
DESCRIPTIONS=(
|
|
"System cleanup script - Removes temporary files and logs"
|
|
"Backup script - Creates automated backups of important data"
|
|
"Docker updater - Automatically updates Docker containers"
|
|
)
|
|
|
|
# Function to display available scripts
|
|
display_script_menu() {
|
|
echo ""
|
|
echo -e "${LIGHT_BLUE}┌─────────────────────────────────────────────────────────────┐${NC}"
|
|
echo -e "${LIGHT_BLUE}│ Available Scripts for Installation │${NC}"
|
|
echo -e "${LIGHT_BLUE}├─────────────────────────────────────────────────────────────┤${NC}"
|
|
|
|
for i in "${!SCRIPTS[@]}"; do
|
|
local index=$((i + 1))
|
|
local script="${SCRIPTS[$i]}"
|
|
local description="${DESCRIPTIONS[$i]}"
|
|
printf "${LIGHT_BLUE}│${NC} ${YELLOW}%d.${NC} %-15s ${GREY}%-35s${NC} ${LIGHT_BLUE}│${NC}\n" \
|
|
"$index" "$script" "$description"
|
|
done
|
|
|
|
echo -e "${LIGHT_BLUE}│${NC} ${YELLOW}A.${NC} All scripts ${GREY}Install all available scripts${NC} ${LIGHT_BLUE}│${NC}"
|
|
echo -e "${LIGHT_BLUE}│${NC} ${YELLOW}Q.${NC} Quit ${GREY}Exit without installing anything${NC} ${LIGHT_BLUE}│${NC}"
|
|
echo -e "${LIGHT_BLUE}└─────────────────────────────────────────────────────────────┘${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Function to get user selection
|
|
get_user_selection() {
|
|
local selected_files=()
|
|
|
|
while true; do
|
|
display_script_menu
|
|
echo -e "${GREY}[i] Enter your choice(s) separated by spaces (e.g., '1 3' or 'A' for all):${NC}"
|
|
read -p "Selection: " -r user_input
|
|
|
|
# Convert to uppercase for easier processing
|
|
user_input=$(echo "$user_input" | tr '[:lower:]' '[:upper:]')
|
|
|
|
# Handle quit option
|
|
if [[ "$user_input" == "Q" ]]; then
|
|
echo -e "${YELLOW}[!] Installation cancelled by user.${NC}"
|
|
exit 0
|
|
fi
|
|
|
|
# Handle select all option
|
|
if [[ "$user_input" == "A" ]]; then
|
|
selected_files=("${SCRIPTS[@]}")
|
|
break
|
|
fi
|
|
|
|
# Process individual selections
|
|
selected_files=()
|
|
local valid_selection=true
|
|
|
|
for choice in $user_input; do
|
|
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le "${#SCRIPTS[@]}" ]; then
|
|
local script_index=$((choice - 1))
|
|
local script_name="${SCRIPTS[$script_index]}"
|
|
if [[ ! " ${selected_files[@]} " =~ " ${script_name} " ]]; then
|
|
selected_files+=("$script_name")
|
|
fi
|
|
else
|
|
echo -e "${RED}[x] Invalid selection: '$choice'. Please try again.${NC}"
|
|
valid_selection=false
|
|
break
|
|
fi
|
|
done
|
|
|
|
if $valid_selection && [ ${#selected_files[@]} -gt 0 ]; then
|
|
break
|
|
elif $valid_selection; then
|
|
echo -e "${RED}[x] No valid scripts selected. Please try again.${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
read -p "Press Enter to continue..." -r
|
|
echo ""
|
|
done
|
|
|
|
# Display selected scripts for confirmation
|
|
echo ""
|
|
echo -e "${GREEN}[✓] Selected scripts for installation:${NC}"
|
|
for script in "${selected_files[@]}"; do
|
|
# Find the description for this script
|
|
for i in "${!SCRIPTS[@]}"; do
|
|
if [[ "${SCRIPTS[$i]}" == "$script" ]]; then
|
|
echo -e " ${YELLOW}•${NC} $script - ${GREY}${DESCRIPTIONS[$i]}${NC}"
|
|
break
|
|
fi
|
|
done
|
|
done
|
|
echo ""
|
|
|
|
# Confirmation prompt
|
|
while true; do
|
|
read -p "Continue with installation? [Y/n]: " -r confirm
|
|
case $confirm in
|
|
[Yy]*|"") break ;;
|
|
[Nn]*)
|
|
echo -e "${YELLOW}[!] Installation cancelled by user.${NC}"
|
|
exit 0
|
|
;;
|
|
*) echo -e "${RED}[x] Please answer Y or n.${NC}" ;;
|
|
esac
|
|
done
|
|
|
|
echo "${selected_files[@]}"
|
|
}
|
|
|
|
# Get user selection
|
|
echo -e "${GREY}[i] Script selection and installation setup...${NC}"
|
|
selected_files_result=$(get_user_selection)
|
|
read -a selected_files <<< "$selected_files_result"
|
|
|
|
if [ ${#selected_files[@]} -eq 0 ]; then
|
|
echo -e "${RED}[x] No files selected. Exiting...${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# Check connection with the server for selected files
|
|
echo -e "${GREY}[i] Checking connection with the server..."
|
|
for FILE in "${selected_files[@]}"; do
|
|
curl -s --head "$FILES_URL/$FILE" | head -n 1 | grep -E "HTTP/[12] [23].." > /dev/null
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}[x] Error: $FILE not found on the server.${NC}" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo -e "${GREEN}[✓] Connection with the server established.${NC}"
|
|
|
|
echo -e "${GREY}[i] Downloading scripts..."
|
|
|
|
# Download selected scripts
|
|
for FILE in "${selected_files[@]}"; do
|
|
curl -s -o "./$FILE" "$FILES_URL/$FILE"
|
|
done
|
|
|
|
echo -e "${GREEN}[✓] Scripts downloaded.${NC}"
|
|
|
|
CURRENT_WORKDIR=$(pwd)
|
|
|
|
# Setup permissions
|
|
echo -e "${GREY}[i] Setting up permissions..."
|
|
|
|
# Setup permissions for selected files
|
|
for FILE in "${selected_files[@]}"; do
|
|
chmod +x "./$FILE"
|
|
done
|
|
|
|
echo -e "${GREEN}[✓] Permissions set up.${NC}"
|
|
|
|
# Setup crontab for selected files
|
|
echo -e "${GREY}[i] Setting up crontab..."
|
|
|
|
# Add crontabs
|
|
for FILE in "${selected_files[@]}"; do
|
|
if crontab -l 2>/dev/null | grep -q $FILE; then
|
|
echo -e "${LIGHT_BLUE}[i] [$FILE] Crontab already exists. Removing...${NC}"
|
|
crontab -l | grep -v $FILE | crontab -
|
|
fi
|
|
echo -e "${LIGHT_BLUE}[i] [$FILE] Adding crontab...${NC}"
|
|
|
|
if [ "$FILE" == "clean.sh" ]; then
|
|
(crontab -l 2>/dev/null; echo "0 0 * * * ${CURRENT_WORKDIR}/$FILE > /tmp/clean.log") | crontab -
|
|
elif [ "$FILE" == "backup.sh" ]; then
|
|
(crontab -l 2>/dev/null; echo "0 1 * * * ${CURRENT_WORKDIR}/$FILE > /tmp/backup.log") | crontab -
|
|
elif [ "$FILE" == "docker-updater.sh" ]; then
|
|
(crontab -l 2>/dev/null; echo "0 3 */4 * * ${CURRENT_WORKDIR}/$FILE > /tmp/docker-updater.log") | crontab -
|
|
else
|
|
echo -e "${YELLOW}[w] [$FILE] Warning: Crontab specific schedule not setup.${NC}" >&2
|
|
(crontab -l 2>/dev/null; echo "0 0 * * * ${CURRENT_WORKDIR}/$FILE" > /tmp/$FILE.log) | crontab -
|
|
fi
|
|
|
|
echo -e "${GREEN}[✓] [$FILE] Crontab added, double-checking set up...${NC}"
|
|
|
|
if ! crontab -l | grep -q $FILE; then
|
|
echo -e "${RED}[x] [$FILE] Error: Crontab was not set up.${NC}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}[✓] [$FILE] Crontab confirmed.${NC}"
|
|
done
|
|
|
|
echo -e "${GREEN}[✓] Crontabs all set up.${NC}"
|
|
|
|
echo -e "${GREEN}[✓] All done.${NC}" |