Fix self-updates

This commit is contained in:
Jiří Štefka 2023-02-27 00:39:27 +01:00
parent d219c5c2cc
commit 0289b5dc49
7 changed files with 401 additions and 32 deletions

@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
EXTRA_SCRIPTS_VERSION="v1.0.3" EXTRA_SCRIPTS_VERSION="v1.0.0"

BIN
ms-man-helper.tar.gz Normal file

Binary file not shown.

@ -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
}

192
ms-manager/java.sh Normal file

@ -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
}

124
ms-manager/paper.sh Normal file

@ -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
}

3
ms-manager/version.sh Normal file

@ -0,0 +1,3 @@
#!/bin/bash
EXTRA_SCRIPTS_VERSION="v1.0.1"

61
msman.sh Normal file → Executable file

@ -8,7 +8,7 @@ set -e
# and acknowledge the original script and author. # # 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 # You shouldn't need to change anything in this file
@ -206,29 +206,27 @@ function launch_server {
function helper_scripts_update { function helper_scripts_update {
# Download matching version of helper scripts # Download matching version of helper scripts
echo "Updating helper scripts..." echo "Updating helper scripts..."
# Download the file into ms-manager.tar.gz # Download the file into ms-man-helper.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 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
# 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
# Remove the last line of the file # 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 # 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 # Remove the old script
echo "Removing old helper scripts..." echo "Removing old helper scripts..."
rm -rf .ms-manager rm -rf .msman
echo "Removed old script" echo "Removed old script"
echo "Moving new helper scripts into place..." echo "Moving new helper scripts into place..."
mv ms-manager .ms-manager mv msman .msman
echo "Removing temporary files..." echo "Removing temporary files..."
rm ms-manager-helper.tar.gz rm msman-helper.tar.gz
echo "Helper scripts updated successfully." echo "Helper scripts updated successfully."
echo echo
echo echo
else else
echo "Failed to update helper scripts." echo "Failed to update helper scripts."
rm -rf ms-manager rm -rf msman
rm ms-manager-helper.tar.gz rm msman-helper.tar.gz
exit 5 exit 5
fi fi
} }
@ -238,32 +236,32 @@ function self_update {
# Download the latest version of the script # Download the latest version of the script
echo "Updating script..." echo "Updating script..."
# Download the file into start_new.sh # 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 # 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 if [[ $(cat start_new.sh | tail -n 1) == 200 ]]; then
# Remove the last line of the file # Remove the last line of the file
sed -i '$d' start_new.sh sed -i '$d' msman_new.sh
# Make the file executable # Make the file executable
chmod +x start_new.sh chmod +x msman_new.sh
# Remove the old script # Remove the old script
rm start.sh rm msman.sh
echo "Removed old script" echo "Removed old script"
# Rename the new script # Rename the new script
mv start_new.sh start.sh mv msman_new.sh msman.sh
echo "Renamed new script" echo "Renamed new script"
echo "Script updated successfully." echo "Script updated successfully."
echo echo
else else
echo "Failed to update script." echo "Failed to update script."
rm start_new.sh rm msman_new.sh
exit 5 exit 5
fi fi
} }
# Check helper scripts update # Check helper scripts update
function check_helper_scripts { function check_helper_scripts {
if [[ -d .ms-manager ]]; then if [[ -d .msman ]]; then
source "./ms-manager/version.sh" source "./.msman/version.sh"
if [[ $CURRENT_SCRIPT_VERSION != $EXTRA_SCRIPTS_VERSION ]]; then if [[ $CURRENT_SCRIPT_VERSION != $EXTRA_SCRIPTS_VERSION ]]; then
echo "Helper script verion mismatch!" echo "Helper script verion mismatch!"
echo "Main script version: $CURRENT_SCRIPT_VERSION" echo "Main script version: $CURRENT_SCRIPT_VERSION"
@ -281,7 +279,7 @@ function check_helper_scripts {
# Get latest script version # Get latest script version
function get_latest_script_release { 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 if [[ $response =~ "API rate limit exceeded" ]]; then
echo "API limit exceeded. Will not check for updates." echo "API limit exceeded. Will not check for updates."
@ -298,10 +296,10 @@ function check_self_update {
get_latest_script_release get_latest_script_release
# Compare the current version with the latest version # 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 "An update is available!"
echo "Current version: $CURRENT_SCRIPT_VERSION" echo "Current version: $CURRENT_SCRIPT_VERSION"
echo "Latest version: $LATEST_VERSION" echo "Latest version: $LATEST_SCRIPT_VERSION"
echo echo
echo "The script will continue without updating in 15 seconds." 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." 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 read -t 15 -p "Do you want to update? [y/N] " update
if [ "$update" == "y" ] || [ "$update" == "Y" ]; then if [ "$update" == "y" ] || [ "$update" == "Y" ]; then
self_update self_update
CURRENT_VERSION=$LATEST_VERSION CURRENT_VERSION=$LATEST_SCRIPT_VERSION
check_helper_scripts check_helper_scripts
else else
echo "Skipping update." echo "Skipping update."
@ -339,7 +337,7 @@ function load_config {
echo "Config file does not exist." echo "Config file does not exist."
echo "Downloading the default config file..." echo "Downloading the default config file..."
# Download the default config file for the current version # 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 # 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 if [[ $(cat launch.cfg | tail -n 1) == 200 ]]; then
# Remove the last line of the file # 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 "Failed to download the default config file."
>&2 echo "Go to the GitHub repository for more information:" >&2 echo "Go to the GitHub repository for more information:"
>&2 echo "https://github.com/$REPO_OWNER/$REPO_NAME" >&2 echo "https://github.com/$REPO_OWNER/$REPO_NAME"
rm launch.cfg
echo "Exiting..." echo "Exiting..."
exit 1 exit 1
fi fi
@ -390,18 +389,18 @@ function delete_old_server {
function load_script { function load_script {
# DONE: Check if the script files exist # DONE: Check if the script files exist
# - Checked in check_helper_scripts # - Checked in check_helper_scripts
source "./.ms-manager/detect_server.sh" source "./.msman/detect_server.sh"
source "./.ms-manager/java.sh" source "./.msman/java.sh"
# Load the correct script # Load the correct script
if [[ $server_type == "paper" ]]; then if [[ $server_type == "paper" ]]; then
source "./.ms-manager/paper.sh" source "./.msman/paper.sh"
# elif [[ $server_type == "vanilla" ]]; then # elif [[ $server_type == "vanilla" ]]; then
# source "$cwd/ms-manager/vanilla.sh" # source "$cwd/msman/vanilla.sh"
# elif [[ $server_type == "forge" ]]; then # elif [[ $server_type == "forge" ]]; then
# source "$cwd/ms-manager/forge.sh" # source "$cwd/msman/forge.sh"
# elif [[ $server_type == "fabric" ]]; then # elif [[ $server_type == "fabric" ]]; then
# source "$cwd/ms-manager/fabric.sh" # source "$cwd/msman/fabric.sh"
else else
>&2 echo "Unknown server type." >&2 echo "Unknown server type."
echo "Exiting..." echo "Exiting..."