#!/usr/bin/env bash # CONSTANTS readonly IMAGEDIR=${ROOTPATH}/image ## # checks if the defined image exists already # # ${1} - string: software-name # ${2} - string: mc-version # ${3} - string: build-number ## function checkImage() { [[ -n $(podman image ls | grep "${2}/${1}" | grep "${3}") ]] && echo true || echo false } ## # checks if the passed data is up-to-date # # ${1} - string: software-name # ${2} - string: mc-version # ${3} - string: build-number # ${4} - string: runner-type ## function checkUpdate() { case "${4}" in "server") local remotebuild=$(curl -s "$(getValueByKey SERVERRUNNERS.${1})/versions/${2}" | jq -r '.builds | last') ;; "proxy") local remotebuild=$(curl -s "$(getValueByKey PROXYRUNNERS.${1})/versions/${2}" | jq -r '.builds | last') ;; esac if [[ "${3}" == "${remotebuild}" ]]; then echo false else echo true fi } ## # updates the config-file to the latest build # # ${1} - string: software-name # ${2} - string: mc-version # ${3} - string: config-dir # ${4} - string: runner-type ## function updateBuild() { case "${4}" in "server") local latest=$(curl -s "$(getValueByKey SERVERRUNNERS.${1})/versions/${2}" | jq -r '.builds | last') ;; "proxy") local latest=$(curl -s "$(getValueByKey PROXYRUNNERS.${1})/versions/${2}" | jq -r '.builds | last') ;; esac log d "Updating build-no. to '${latest}'" setLocalConfValue "${3}" "(.build=${latest})" } ## # builds the podman image with the proper settings # # ${1} - string: software-name # ${2} - string: mc-version # ${3} - string: build-number # ${4} - string: download-url # ## function buildImage() { log d "lookup jar-name for download" local app_name=$(curl -s "${4}" | jq -r '.downloads.application.name') log d "downloading server.jar" cp "${ROOTPATH}"/image/* "${BUILDDIR}/" curl "${4}/downloads/${app_name}" -o "${BUILDDIR}/server.jar" log d "building docker image" podman build --rm "${BUILDDIR}" --tag "${2}/${1}:${3}" [[ $? -eq 0 ]] && log s "Image '${2}/${1}:${3}' built!" log d "removing temporary build-dir" [[ -f "${BUILDDIR}" ]] && rm -rf "${BUILDDIR}" } ## # starts the specified container # # ${1} - string: containername # ${2} - string: image # ${3} - int: port ## function startContainer() { log d "Starting container '${1}'" local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}" sed -i "s/^rcon.password=.*/rcon.password=$(tr -cd '[:alnum:]' < /dev/urandom | fold -w12 | head -n1)/" $dir/data/server.properties readarray -t additional_ports <<< "$(getLocalConfValue $dir 'additional_ports[]')" [[ ${#additional_ports} -gt 0 ]] && log d "Starting with additional ports: ${additional_ports[@]}" podman run --replace --name "${1}" --userns=keep-id:uid=1000 --rm -it -d --network "${5}" -p $([[ -n "${4}" ]] && echo ${4}:)${3}:25565 $([[ ${#additional_ports} -gt 0 ]] && for port in "${additional_ports[@]}"; do echo "-p $([[ -n ${4} ]] && echo ${4}:)${port}:${port}"; done) -v $dir/data:/var/server "${2}" java -Dcom.mojang.eula.agree=true -jar /var/exec/server.jar --nogui --port 25565 [[ $? -eq 0 ]] && log s "Container '${1}' started!" } ## # stops the specified container # # ${1} - string: containername ## function stopContainer() { log d "Stopping container '${1}'" podman container stop --time 100 ${1} local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}" sed -i "s/^rcon.password=.*/rcon.password=/" $dir/data/server.properties log s "Container '${1}' stopped" } ## # create a podman network # # ${1} - string: network-name ## function createNetwork() { if [[ -z "${1}" ]]; then log e "Network name is unspecified. Please provide a network-name!" exit 1 fi if [[ -n $(podman network ls | grep "${1}") ]]; then log w "Network '${1}' exists already, won't create!" return 1 fi podman network create "${1}" }