#!/bin/bash set -e -o pipefail : "${REMOVE_OLD_MODS:=false}" : "${MODS_FILE:=}" : "${REMOVE_OLD_MODS_DEPTH:=1} " : "${REMOVE_OLD_MODS_INCLUDE:=*.jar}" sum_file=/data/.generic_pack.sum # shellcheck source=start-utils . "${SCRIPTS:-/}start-utils" isDebugging && set -x # CURSE_URL_BASE used in manifest downloads below CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects} # Remove old mods/plugins if isTrue "${REMOVE_OLD_MODS}" && [ -z "${MODS_FILE}" ]; then removeOldMods /data/mods removeOldMods /data/plugins rm -f "$sum_file" fi # If packwiz url passed, bootstrap packwiz and update mods before other modpack processing if [[ "${PACKWIZ_URL}" ]]; then # Ensure we have the latest packwiz bootstrap installer latestPackwiz=$(curl -fsSL https://api.github.com/repos/packwiz/packwiz-installer-bootstrap/releases/latest) if [[ -z "${latestPackwiz}" ]]; then log "WARNING: Could not retrieve Packwiz bootstrap installer release information" else isDebugging && log "Latest packwiz ${latestPackWiz}" latestPackwizVer=$(echo ${latestPackwiz} | jq --raw-output '.tag_name') latestPackwizUrl=$(echo ${latestPackwiz} | jq --raw-output '.assets[] | select(.name | match("packwiz-installer-bootstrap.jar")) | .url') : "${PACKWIZ_JAR:=packwiz-installer-bootstrap_${latestPackwizVer}.jar}" if [[ ! -e $PACKWIZ_JAR ]]; then log "Downloading Packwiz ${latestPackwizVer}" curl -H "Accept:application/octet-stream" -o "$PACKWIZ_JAR" -fsSL ${latestPackwizUrl} ln -sf "${PACKWIZ_JAR}" packwiz-installer-bootstrap.jar fi fi if [[ ! -e packwiz-installer-bootstrap.jar ]]; then log "ERROR: Packwiz not available or could not be downloaded from Github!" exit 1 fi if isURL "${PACKWIZ_URL}"; then log "Running packwiz against URL: ${PACKWIZ_URL}" java -jar packwiz-installer-bootstrap.jar -g -s server "${PACKWIZ_URL}" fi fi # If supplied with a URL for a modpack (simple zip of jars), download it and unpack if [[ "$MODPACK" ]]; then if isURL "${MODPACK}"; then log "Downloading mod/plugin pack" if ! get -o /tmp/modpack.zip "${MODPACK}"; then log "ERROR: failed to download from ${MODPACK}" exit 2 fi elif [[ "$MODPACK" =~ .*\.zip ]]; then if ! cp "$MODPACK" /tmp/modpack.zip; then log "ERROR: failed to copy from $MODPACK" exit 2 fi else log "ERROR Invalid URL or Path given for MODPACK: $MODPACK" exit 1 fi if [ "$FAMILY" = "SPIGOT" ]; then mkdir -p /data/plugins if ! unzip -o -d /data/plugins /tmp/modpack.zip; then log "ERROR: failed to unzip the modpack from ${MODPACK}" fi else mkdir -p /data/mods if ! unzip -o -d /data/mods /tmp/modpack.zip; then log "ERROR: failed to unzip the modpack from ${MODPACK}" fi fi rm -f /tmp/modpack.zip elif [[ "$MODS" ]]; then if [ "$FAMILY" = "SPIGOT" ]; then out_dir=/data/plugins else out_dir=/data/mods fi mkdir -p "$out_dir" for i in ${MODS//,/ } do if isURL "$i"; then log "Downloading mod/plugin $i ..." if ! get -o "${out_dir}" "$i"; then log "ERROR: failed to download from $i into $out_dir" exit 2 fi elif [[ -f "$i" && "$i" =~ .*\.jar ]]; then log "Copying plugin located at $i ..." out_file=$(basename "$i") if ! cp "$i" "${out_dir}/$out_file"; then log "ERROR: failed to copy from $i into $out_dir" exit 2 fi elif [[ -d "$i" ]]; then log "Copying plugin jars from $i ..." cp "$i"/*.jar "${out_dir}" else log "ERROR Invalid URL or path given in MODS: $i" exit 2 fi done elif [[ "$MODS_FILE" ]]; then if [ ! -f "$MODS_FILE" ]; then log "ERROR: given MODS_FILE file does not exist" exit 2 fi if [ "$FAMILY" = "SPIGOT" ]; then out_dir=/data/plugins else out_dir=/data/mods fi mkdir -p "$out_dir" args=( -o "${out_dir}" --log-progress-each --skip-existing --uris-file "${MODS_FILE}" ) if isTrue "${REMOVE_OLD_MODS}"; then args+=( --prune-others "${REMOVE_OLD_MODS_INCLUDE}" --prune-depth "${REMOVE_OLD_MODS_DEPTH}" ) fi if ! get "${args[@]}" ; then log "ERROR: failed to retrieve one or more mods" exit 1 fi fi if [[ "$MANIFEST" ]]; then if [[ -e "$MANIFEST" ]]; then EFFECTIVE_MANIFEST_FILE=$MANIFEST elif isURL "$MANIFEST"; then EFFECTIVE_MANIFEST_FILE=/tmp/manifest.json EFFECTIVE_MANIFEST_URL=$(curl -Ls -o /dev/null -w %{effective_url} $MANIFEST) curl -Ls -o $EFFECTIVE_MANIFEST_FILE "$EFFECTIVE_MANIFEST_URL" else log "MANIFEST='$MANIFEST' is not a valid manifest url or location" exit 2 fi case "X$EFFECTIVE_MANIFEST_FILE" in X*.json) if [ -f "${EFFECTIVE_MANIFEST_FILE}" ]; then MOD_DIR=${FTB_BASE_DIR:-/data}/mods if [ ! -d "$MOD_DIR" ] then log "Creating mods dir $MOD_DIR" mkdir -p "$MOD_DIR" fi log "Starting manifest download..." cat "${EFFECTIVE_MANIFEST_FILE}" | jq -r '.files[] | (.projectID|tostring) + " " + (.fileID|tostring)'| while read -r p f do if [ ! -f $MOD_DIR/${p}_${f}.jar ] then redirect_url="$(curl -Ls -o /dev/null -w %{effective_url} ${CURSE_URL_BASE}/${p})" url="$redirect_url/download/${f}/file" log Downloading curseforge mod $url # Manifest usually doesn't have mod names. Using id should be fine, tho curl -sSL "${url}" -o $MOD_DIR/${p}_${f}.jar fi done else log "Could not find manifest file, insufficient privileges, or malformed path." fi ;; *) log "Invalid manifest file for modpack. Please make sure it is a .json file." ;; esac fi : "${GENERIC_PACKS:=${GENERIC_PACK}}" if [[ "${GENERIC_PACKS}" ]]; then IFS=',' read -ra packs <<< "${GENERIC_PACKS}" packFiles=() for pack in "${packs[@]}"; do if isURL "$pack"; then mkdir -p /data/packs if ! outfile=$(get -o /data/packs --output-filename --skip-existing "$pack"); then log "ERROR: failed to download $pack" exit 2 fi packFiles+=("$outfile") else packFiles+=("$pack") fi done isDebugging && [ -f "$sum_file}" ] && cat "$sum_file" if ! sha256sum -c "${sum_file}" --status 2> /dev/null; then base_dir=/tmp/generic_pack_base mkdir -p ${base_dir} for pack in "${packFiles[@]}"; do isDebugging && ls -l "${pack}" unzip -q -d ${base_dir} "${pack}" done # recalculate the actual base directory of content base_dir=$(find "$base_dir" -type d \( -name mods -o -name plugins -o -name config \) -printf '%h' -quit) if [[ ! $base_dir ]]; then log "ERROR: Unable to find content base of generic packs ${GENERIC_PACKS}. Directories:" find /tmp/generic_pack_base -type d -printf ' - %P\n' exit 1 fi if [ -f /data/manifest.txt ]; then log "Manifest exists from older generic pack, cleaning up ..." while read -r f; do rm -rf "/data/${f}" done < /data/manifest.txt # prune empty dirs find /data -mindepth 1 -depth -type d -empty -delete rm -f /data/manifest.txt fi log "Writing generic pack manifest ... " find "${base_dir}" -type f -printf "%P\n" > /data/manifest.txt log "Applying generic pack ..." cp -R -f "${base_dir}"/* /data rm -rf /tmp/generic_pack_base sha256sum "${packFiles[@]}" > "${sum_file}" isDebugging && cat "$sum_file" fi fi exec "${SCRIPTS:-/}start-setupModconfig" "$@"