#!/bin/bash # Run this script with: # wget https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/master.sh && sudo bash master.sh # Variables for URLs and script info this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/master.sh" this_script_name="HHF Script Management Tool" BRANCH="main" forgejo_url="git.hhf.technology" repo_owner="hhf" repo_name="script-management-cloudpanel" # Colors for output formatting COLOR_RED='\033[0;31m' COLOR_GREEN='\033[0;32m' COLOR_BLUE='\033[0;34m' COLOR_RESET='\033[0m' # Formatting functions print_header() { local script_name=$1 local script_url=$2 printf "\n${COLOR_GREEN}=== %s ===${COLOR_RESET}\n" "$script_name" printf "${COLOR_BLUE}Script URL: %s${COLOR_RESET}\n\n" "$script_url" } format_output() { local func=$1 local message=$2 printf "${COLOR_BLUE}%s...${COLOR_RESET}\n" "$message" $func printf "${COLOR_GREEN}Done!${COLOR_RESET}\n" } final_message() { local script_name=$1 local success=$2 if [ $success -eq 0 ]; then printf "\n${COLOR_GREEN}=== %s completed successfully ===${COLOR_RESET}\n" "$script_name" else printf "\n${COLOR_RED}=== %s failed with errors ===${COLOR_RESET}\n" "$script_name" fi } # Check if the script is being run with sudo if [ "$EUID" -eq 0 ]; then ORIGINAL_USER=${SUDO_USER:-$(whoami)} else ORIGINAL_USER=$(whoami) fi # Function to check and install sudo if not present install_sudo() { if ! command which sudo &> /dev/null; then echo "sudo is not installed. Installing sudo..." if [ -x "$(command -v apt-get)" ]; then apt-get update > /dev/null 2>&1 && apt-get install -y sudo > /dev/null 2>&1 elif [ -x "$(command -v yum)" ]; then yum install -y sudo > /dev/null 2>&1 else echo "Could not install sudo. Please install it manually." exit 1 fi fi } # Function to check and install curl if not present install_curl() { if ! command -v curl &> /dev/null; then echo "curl is not installed. Installing curl..." if [ -x "$(command -v apt-get)" ]; then sudo apt-get update > /dev/null 2>&1 && sudo apt-get install -y curl > /dev/null 2>&1 elif [ -x "$(command -v yum)" ]; then sudo yum install -y curl > /dev/null 2>&1 else echo "Could not install curl. Please install it manually." exit 1 fi fi } # Function to check and install jq if not present install_jq() { if ! command -v jq &> /dev/null; then echo "jq is not installed. Installing jq..." if [ -x "$(command -v apt-get)" ]; then sudo apt-get update > /dev/null 2>&1 && sudo apt-get install -y jq > /dev/null 2>&1 elif [ -x "$(command -v yum)" ]; then sudo yum install -y jq > /dev/null 2>&1 else echo "Could not install jq. Please install it manually." exit 1 fi fi } # Function to clean up temporary files in /tmp cleanup_tmp_files() { echo "Cleaning up temporary files..." sudo rm -rf /tmp/$forgejo_url* > /dev/null 2>&1 echo "Temporary files cleaned." } remove_script() { rm -- "$0" 2>/dev/null } # Function to fetch the list of scripts from the repository fetch_scripts() { # Forgejo/Gitea API endpoint for listing repository contents scripts_recursive=$(curl -k -s "https://$forgejo_url/api/v1/repos/$repo_owner/$repo_name/contents?ref=$BRANCH" | jq -r '.[] | select(.type == "file" and .name and (.name | type == "string") and (.name | endswith(".sh"))) | .path') echo "$scripts_recursive" | sort -u } # Function to download and run a selected script run_script() { local script_path=$1 local encoded_script_path=$(echo "$script_path" | sed 's/\//%2F/g') local script_name=$(basename "$script_path") local url="https://$forgejo_url/$repo_owner/$repo_name/raw/branch/$BRANCH/$script_path" # If verbose mode, print the URL if [[ "$verbose" == "true" ]]; then echo "Requesting URL: $url" fi # Create necessary directories for the script mkdir -p "/tmp/$(dirname "$script_path")" # Make the request and capture the HTTP status code http_status=$(curl -k -sL -w "%{http_code}" -o "/tmp/$script_path" "$url") # If verbose mode, print the HTTP status code if [[ "$verbose" == "true" ]]; then echo "Request completed with status code: $http_status" fi if [[ "$http_status" == "200" ]]; then chmod +x "/tmp/$script_path" sudo bash "/tmp/$script_path" "$ORIGINAL_USER" else echo "Failed to download script: $script_name (HTTP status code: $http_status)" fi } # Main function to display the script selection menu and run the selected scripts run_scripts() { printf "${COLOR_GREEN}Fetching list of available scripts from Forgejo repository...${COLOR_RESET}\n" scripts=$(fetch_scripts) if [ -z "$scripts" ]; then printf "${COLOR_RED}No scripts found in the repository.${COLOR_RESET}\n" exit 1 fi while true; do printf "${COLOR_BLUE}\nAvailable scripts:${COLOR_RESET}\n" select script in $scripts "Quit"; do if [ "$script" == "Quit" ]; then break 2 elif [ -n "$script" ]; then printf "${COLOR_BLUE}You selected $script. Running script...${COLOR_RESET}\n" run_script "$script" break else printf "${COLOR_RED}Invalid selection. Please try again.${COLOR_RESET}\n" fi done printf "${COLOR_BLUE}Would you like to run more scripts? (y/n)${COLOR_RESET}\n" read -r choice if [[ "$choice" != "y" ]]; then break fi done } # Main script logic clear # Check for verbose flag verbose="false" if [[ "$1" == "-v" ]]; then verbose="true" fi # Print header print_header "$this_script_name" "$this_script_url" # Initialize success flag success=0 install_sudo install_curl install_jq run_scripts # Cleanup created files cleanup_tmp_files # Clean up the master script format_output remove_script "Cleaning up" # Print final message final_message() { local script_name=$1 local success=$2 if [[ $success -eq 0 ]]; then log "${CHECK_MARK} $script_name completed successfully." else log "${CROSS_MARK} $script_name encountered errors." fi } # Exit with appropriate status exit $success