diff --git a/.ms-manager/version.sh b/.ms-manager/version.sh index 9267022..acedf39 100644 --- a/.ms-manager/version.sh +++ b/.ms-manager/version.sh @@ -1,3 +1,3 @@ #!/bin/bash -EXTRA_SCRIPTS_VERSION="v1.0.3" +EXTRA_SCRIPTS_VERSION="v1.0.0" diff --git a/ms-man-helper.tar.gz b/ms-man-helper.tar.gz new file mode 100644 index 0000000..878130c Binary files /dev/null and b/ms-man-helper.tar.gz differ diff --git a/ms-manager/detect_server.sh b/ms-manager/detect_server.sh new file mode 100644 index 0000000..7b6cac5 --- /dev/null +++ b/ms-manager/detect_server.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -e +# Detect the server type +function get_existing_server { + if ls paper-*.jar 1> /dev/null 2>&1; then + existing_server_type="paper" + get_existing_paper + # TODO: Add support for other server types + # elif ls fabric-*.jar 1> /dev/null 2>&1; then + # existing_server_type="fabric" + # elif ls spigot-*.jar 1> /dev/null 2>&1; then + # existing_server_type="spigot" + # elif ls craftbukkit-*.jar 1> /dev/null 2>&1; then + # existing_server_type="craftbukkit" + # elif ls vanilla-*.jar 1> /dev/null 2>&1; then + # existing_server_type="vanilla" + else + if ! ls *.jar 1> /dev/null 2>&1; then + echo "No server file found." + echo + echo + existing_server_type=false + server_file=false + else + >&2 echo "$(ls *.jar) file was found." + >&2 echo "Unknown server type." + exit 10 + # TODO: Ask the user if they want to continue + fi + fi +} + +# Get existing version and build of paper +function get_existing_paper { + # Get the current server file name + server_file=$(basename ./paper-*.jar) + + # Extract the version and build number using cut command + current_version=$(echo "$server_file" | cut -d'-' -f2) + current_build=$(echo "$server_file" | cut -d'-' -f3) + # Remove the rest of the file names + current_version="${current_version%-*}" + current_build="${current_build%.jar}" + + echo "Current server file: $server_file" + echo " - Version $current_version" + echo " - Build $current_build" + echo + echo +} + diff --git a/ms-manager/java.sh b/ms-manager/java.sh new file mode 100644 index 0000000..444c73b --- /dev/null +++ b/ms-manager/java.sh @@ -0,0 +1,192 @@ +#!/bin/bash +set -e +# Setup Java +function setup_java { + # Get the required Java version for the Minecraft version + get_required_java + + # Check if java was downloaded by the script + check_script_java + + # Check if java is installed + if [[ $java_version == false ]]; then + check_java_exec + if [[ $java_version != false ]]; then + echo "System Java $java_version will be used." + fi + fi + + if [[ $java_version == false ]]; then + >&2 echo "Java $required_java is not installed." + >&2 echo "Java $required_java is required to run Minecraft $version." + # Ask the user if they want to download Adoptium JRE + ask_jre + fi + echo + echo +} + +# Ask the user if they want to download Adoptium JRE +function ask_jre { + echo "This script can download the correct Adoptium JRE into '$(echo $HOME)/.adoptium_java' for you." + echo "You have 15 seconds to confirm or the script will exit." + read -t 12 -p "Do you want to download Adoptium JRE? (y/N)" download_java + + if [[ $download_java == "y" ]] || [[ $download_java == "Y" ]]; then + get_os_arch + download_jre + check_script_java + if [[ $java_version == false ]]; then + >&2 echo "Java $required_java was not downloaded correctly." + >&2 echo "Please install Java $required_java manually." + exit 4 + fi + else + >&2 echo "Please install Java $required_java and run this script again." + exit 12 + fi +} + +# Check if java was downloaded by the script +function check_script_java { + if [[ -d "$(echo $HOME)/.adoptium_java" ]]; then + if [[ $required_java == "8" ]]; then + if [[ -d "$(echo $HOME)/.adoptium_java/jre8" ]]; then + java_version=8 + if [[ -f "$(echo $HOME).adoptium_java/jre8/bin/java" ]]; then + PATH="$(echo $HOME)/.adoptium_java/jre8/bin:$PATH" + fi + fi + elif [[ $required_java == "11" ]]; then + if [[ -d "$(echo $HOME)/.adoptium_java/jre11" ]]; then + java_version=11 + PATH="$(echo $HOME)/.adoptium_java/jre11/bin:$PATH" + fi + elif [[ $required_java == "16" ]]; then + if [[ -d "$(echo $HOME)/.adoptium_java/jre16" ]]; then + java_version=16 + PATH="$(echo $HOME)/.adoptium_java/jre16/bin:$PATH" + fi + elif [[ $required_java == "17" ]]; then + if [[ -d "$(echo $HOME)/.adoptium_java/jre17" ]]; then + java_version=17 + PATH="$(echo $HOME)/.adoptium_java/jre17/bin:$PATH" + fi + fi + check_java_exec + if [[ $java_version == $required_java ]]; then + echo "Java $java_version detected in '$(echo $HOME)/.adoptium_java/jre$(echo $java_version)/bin/java.' will be used." + else + java_version=false + fi + else + java_version=false + fi +} + +# Get the system Java version +function check_java_exec { +# Check if java is installed + if ! command -v java &> /dev/null + then + java_version=false + fi + + # If java is installed, get the version (the java_version won't be 0) + if [[ $java_version != false ]]; then + # Get the current Java version and extract the build number + java_version=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}' | awk -F '.' '{print $1}') + fi +} + +# Get the required Java version for the Minecraft version +# For version 1.8 to 1.11 use java 8 +# For version 1.12 to 1.16.4 use java 11 +# For version 1.16.5 use java 16 +# For version 1.17.1 to 1.18.1+ use java 17 +function get_required_java { + # Extract the middle number of the Minecraft version + minecraft_middle=$(echo "$version" | awk -F '.' '{print $2}') + + + # Get the java version for the defined server version + if (( 8 <= minecraft_middle && minecraft_middle <= 11 )); then + if ! [[ $java_version -eq 8 ]]; then + required_java=8 + fi + elif (( 12 <= minecraft_middle && minecraft_middle <= 16 )); then + if ! [[ $java_version -eq 11 ]]; then + required_java=11 + fi + elif (( minecraft_middle == 17 )); then + if ! [[ $java_version -eq 16 ]]; then + required_java=16 + fi + elif (( 18 <= minecraft_middle )); then + if ! [[ $java_version -eq 17 ]]; then + required_java=17 + fi + else + >&2 echo "Unsupported Minecraft version $select_version." + fi +} + +# Check host architecture +function get_os_arch { + if [[ $(uname -m) == "x86_64" ]]; then + arch="x64" + elif [[ $(uname -m) == "aarch64" ]]; then + arch="aarch64" + else + >&2 echo "Unsupported architecture $(uname -m)." + >&2 echo "Please install Java $required_java manually." + exit 3 + fi +} + +# Download openjdk jre +function download_jre { + # Check if .java folder exists + if ! [[ -d "$(echo $HOME)/.adoptium_java" ]]; then + echo "Creating $(echo $HOME)/.adoptium_java folder" + mkdir "$(echo $HOME)/.adoptium_java" + fi + # Download the correct version of Java + if [[ $required_java == "8" ]]; then + echo "Downloading Adoptium JRE 8" + curl -L -o java.tar.gz "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u362-b09/OpenJDK8U-jre_$(echo $arch)_linux_hotspot_8u362b09.tar.gz" + echo "Extracting Java 8" + tar -xzf java.tar.gz + echo "Moving Java 8 to $(echo $HOME)/.adoptium_java/jre8" + mv jdk8u362-b09-jre "$(echo $HOME)/.adoptium_java/jre8" + echo "Removing temporary files" + rm java.tar.gz + elif [[ $required_java == "11" ]]; then + echo "Downloading Adoptium JRE 11" + curl -L -o java.tar.gz "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.18%2B10/OpenJDK11U-jre_$(echo $arch)_linux_hotspot_11.0.18_10.tar.gz" + echo "Extracting Java 11" + tar -xzf java.tar.gz + echo "Moving Java 11 to $(echo $HOME)/.adoptium_java/jre11" + mv jdk-11.0.18+10-jre "$(echo $HOME)/.adoptium_java/jre11" + echo "Removing temporary files" + rm java.tar.gz + elif [[ $required_java == "16" ]]; then + echo "Downloading Java 16" + curl -L -o java.tar.gz "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.18%2B10/OpenJDK11U-jre_$(echo $arch)_linux_hotspot_16.0.2_7.tar.gz" + echo "Extracting Java 16" + tar -xzf java.tar.gz + echo "Moving Java 16 to $(echo $HOME)/.adoptium_java/jre16" + mv jdk-16.0.2+7-jre "$(echo $HOME)/.adoptium_java/jre16" + echo "Removing temporary files" + rm java.tar.gz + elif [[ $required_java == "17" ]]; then + echo "Downloading Java 17" + curl -L -o java.tar.gz "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.6%2B10/OpenJDK17U-jre_$(echo $arch)_linux_hotspot_17.0.6_10.tar.gz" + echo "Extracting Java 17" + tar -xzf java.tar.gz + echo "Moving Java 17 to $(echo $HOME)/.adoptium_java/jre17" + mv jdk-17.0.6+10-jre "$(echo $HOME)/.adoptium_java/jre17" + echo "Removing temporary files" + rm java.tar.gz + fi +} diff --git a/ms-manager/paper.sh b/ms-manager/paper.sh new file mode 100644 index 0000000..3ff6e47 --- /dev/null +++ b/ms-manager/paper.sh @@ -0,0 +1,124 @@ +#!/bin/bash +set -e +# API URL +api_url="https://api.papermc.io/v2/projects/paper/versions/$version/builds" + +# Check if the version and build are valid +function check_version_valid { + if curl -s "$api_url" | grep -q '{"error":"Version not found."}'; then + >&2 echo "Error: Invalid version selected: $version" + exit 2 + else + # Check if selected build exists + if [ ! -z "$build" ]; then + # WARNING: Check if the shortened versin works + # if curl -Is "https://api.papermc.io/v2/projects/paper/versions/$version/builds/$build/downloads/paper-$version-$build.jar" | grep "HTTP/2 404" >/dev/null; then + if curl -Is "$api_url/$build/downloads/paper-$version-$build.jar" | grep "HTTP/2 404" >/dev/null; then + >&2 echo "Error: Invalid build selected: $build" + exit 2 + fi + fi + fi +} + +# Download server set by $version and $download_build +function download_server { + # Download the server + echo "Downloading PaperMC server..." + echo " - Version $version" + echo " - Build $download_build" + curl "https://api.papermc.io/v2/projects/paper/versions/$version/builds/$download_build/downloads/paper-$version-$download_build.jar" -o "./paper-$version-$download_build.jar" + echo "Download complete." +} + +# Check if up to date +function check_updates { + if [[ $server_file == false ]]; then + download_build=$latest_build + update_version=true + update_build=true + fi + + # Check if $build is empty + if [[ -z $build ]]; then + # Check if the current version is the same as the one selected + if [[ $current_version == $version ]]; then + # Check if the current build is the same as the one selected + if [[ $current_build == $latest_build ]]; then + echo "Server is up to date." + else + echo "Server is not up to date." + download_build=$latest_build + update_build=true + fi + else + # Check if $server_file is false + if [[ $server_file != false ]]; then + ask_version_differs + echo "Server is not up to date." + download_build=$latest_build + update_version=true + fi + fi + else + # Check if the current version is the same as the one selected + if [[ $current_version == $version ]]; then + # Check if the current build is the same as the one selected + if [[ $current_build == $build ]]; then + echo "Server is up to date." + else + echo "Server is not up to date." + download_build=$build + update_build=true + fi + else + # Check if $server_file is false + if [[ $server_file != false ]]; then + ask_version_differs + echo "Server is not up to date." + download_build=$build + update_version=true + fi + fi + fi +} + +# Get the latest build number +function get_latest_build { + # Get the latest build number + latest_build=$(curl -s $api_url | jq '.builds[-1].build') +} + +# Check for updates +function check_and_update { + if [[ $server_file == false ]]; then + download_build=$latest_build + update_version=true + update_build=true + else + echo Checking for updates... + fi + + # Get the latest build number + get_latest_build + + # Check if the current version is up to date + check_updates + + # Check if $build_update is true or $version_update is true + if [[ $update_build == true ]] || [[ $update_version == true ]]; then + if [[ $server_file != false ]]; then + old_server_file=$server_file + server_file="paper-$version-$download_build.jar" + download_server + # Delete the old server file + delete_old_server + else + server_file="paper-$version-$download_build.jar" + download_server + fi + fi + echo + echo +} + diff --git a/ms-manager/version.sh b/ms-manager/version.sh new file mode 100644 index 0000000..717787f --- /dev/null +++ b/ms-manager/version.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +EXTRA_SCRIPTS_VERSION="v1.0.1" diff --git a/msman.sh b/msman.sh old mode 100644 new mode 100755 index 1df0a58..3d2affe --- a/msman.sh +++ b/msman.sh @@ -8,7 +8,7 @@ set -e # and acknowledge the original script and author. # ############################################################################################################# -CURRENT_SCRIPT_VERSION="v1.0.3" +CURRENT_SCRIPT_VERSION="v1.0.1" # -------------------------------------------------- # You shouldn't need to change anything in this file @@ -206,29 +206,27 @@ function launch_server { function helper_scripts_update { # Download matching version of helper scripts echo "Updating helper scripts..." - # Download the file into ms-manager.tar.gz - curl -LJ -w '%{http_code}\n' "https://github.com/$REPO_OWNER/$REPO_NAME/releases/download/$CURRENT_SCRIPT_VERSION/ms-man-helper.tar.gz" > ms-man-helper.tar.gz - # Check if the download was successful by checking the last line of the file for 200 - if [[ $(cat ma-man.tar.gz | tail -n 1) == 200 ]]; then + # Download the file into ms-man-helper.tar.gz + if [[ $(curl -sLJ -w '%{http_code}\n' "https://github.com/jiriks74/msman.sh/releases/download/v1.0.0/ms-man-helper.tar.gz" -o msman-helper.tar.gz) == 200 ]]; then # Remove the last line of the file - sed -i '$d' ms-man-helper.tar.gz + # sed -i '$d' ms-man-helper.tar.gz # Extract the files from ms-man-helper.tar.gz - tar -xzf ms-man-helper.tar.gz + tar -xzf msman-helper.tar.gz # Remove the old script echo "Removing old helper scripts..." - rm -rf .ms-manager + rm -rf .msman echo "Removed old script" echo "Moving new helper scripts into place..." - mv ms-manager .ms-manager + mv msman .msman echo "Removing temporary files..." - rm ms-manager-helper.tar.gz + rm msman-helper.tar.gz echo "Helper scripts updated successfully." echo echo else echo "Failed to update helper scripts." - rm -rf ms-manager - rm ms-manager-helper.tar.gz + rm -rf msman + rm msman-helper.tar.gz exit 5 fi } @@ -238,32 +236,32 @@ function self_update { # Download the latest version of the script echo "Updating script..." # Download the file into start_new.sh - curl -sLJ -w '%{http_code}\n' "https://github.com/$REPO_OWNER/$REPO_NAME/releases/download/$LATEST_VERSION/start.sh" > start_new.sh + curl -sLJ -w '%{http_code}\n' "https://github.com/$REPO_OWNER/$REPO_NAME/releases/download/$LATEST_SCRIPT_VERSION/start.sh" > msman_new.sh # Check if the download was successful by checking the last line of the file for 200 if [[ $(cat start_new.sh | tail -n 1) == 200 ]]; then # Remove the last line of the file - sed -i '$d' start_new.sh + sed -i '$d' msman_new.sh # Make the file executable - chmod +x start_new.sh + chmod +x msman_new.sh # Remove the old script - rm start.sh + rm msman.sh echo "Removed old script" # Rename the new script - mv start_new.sh start.sh + mv msman_new.sh msman.sh echo "Renamed new script" echo "Script updated successfully." echo else echo "Failed to update script." - rm start_new.sh + rm msman_new.sh exit 5 fi } # Check helper scripts update function check_helper_scripts { - if [[ -d .ms-manager ]]; then - source "./ms-manager/version.sh" + if [[ -d .msman ]]; then + source "./.msman/version.sh" if [[ $CURRENT_SCRIPT_VERSION != $EXTRA_SCRIPTS_VERSION ]]; then echo "Helper script verion mismatch!" echo "Main script version: $CURRENT_SCRIPT_VERSION" @@ -281,7 +279,7 @@ function check_helper_scripts { # Get latest script version function get_latest_script_release { -response=$(curl -sL "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/releases/latest") + response=$(curl -sL "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/releases/latest") if [[ $response =~ "API rate limit exceeded" ]]; then echo "API limit exceeded. Will not check for updates." @@ -298,10 +296,10 @@ function check_self_update { get_latest_script_release # Compare the current version with the latest version - if [[ "$CURRENT_SCRIPT_VERSION" != "$LATEST_VERSION" ]]; then + if [[ "$CURRENT_SCRIPT_VERSION" != "$LATEST_SCRIPT_VERSION" ]]; then echo "An update is available!" echo "Current version: $CURRENT_SCRIPT_VERSION" - echo "Latest version: $LATEST_VERSION" + echo "Latest version: $LATEST_SCRIPT_VERSION" echo echo "The script will continue without updating in 15 seconds." echo "If you decide to update it is your responsibility to check the release notes for any breaking changes." @@ -320,7 +318,7 @@ function check_self_update { read -t 15 -p "Do you want to update? [y/N] " update if [ "$update" == "y" ] || [ "$update" == "Y" ]; then self_update - CURRENT_VERSION=$LATEST_VERSION + CURRENT_VERSION=$LATEST_SCRIPT_VERSION check_helper_scripts else echo "Skipping update." @@ -339,7 +337,7 @@ function load_config { echo "Config file does not exist." echo "Downloading the default config file..." # Download the default config file for the current version - curl -sLJ -w '%{http_code}' "https://github.com/$REPO_OWNER/$REPO_NAME/releases/download/$CURRENT_VERSION/launch.cfg" > launch.cfg + curl -sLJ -w '%{http_code}' "https://github.com/$REPO_OWNER/$REPO_NAME/releases/download/$CURRENT_SCRIPT_VERSION/launch.cfg" > launch.cfg # Check if the download was successful by checking the last line of the file for 200 if [[ $(cat launch.cfg | tail -n 1) == 200 ]]; then # Remove the last line of the file @@ -369,6 +367,7 @@ function load_config { >&2 echo "Failed to download the default config file." >&2 echo "Go to the GitHub repository for more information:" >&2 echo "https://github.com/$REPO_OWNER/$REPO_NAME" + rm launch.cfg echo "Exiting..." exit 1 fi @@ -390,18 +389,18 @@ function delete_old_server { function load_script { # DONE: Check if the script files exist # - Checked in check_helper_scripts - source "./.ms-manager/detect_server.sh" - source "./.ms-manager/java.sh" + source "./.msman/detect_server.sh" + source "./.msman/java.sh" # Load the correct script if [[ $server_type == "paper" ]]; then - source "./.ms-manager/paper.sh" + source "./.msman/paper.sh" # elif [[ $server_type == "vanilla" ]]; then - # source "$cwd/ms-manager/vanilla.sh" + # source "$cwd/msman/vanilla.sh" # elif [[ $server_type == "forge" ]]; then - # source "$cwd/ms-manager/forge.sh" + # source "$cwd/msman/forge.sh" # elif [[ $server_type == "fabric" ]]; then - # source "$cwd/ms-manager/fabric.sh" + # source "$cwd/msman/fabric.sh" else >&2 echo "Unknown server type." echo "Exiting..."