surround ALL variables with {} 2

This commit is contained in:
LinuxSquare 2024-03-16 21:57:56 +01:00
parent d6e4ca0973
commit a30a6b46b8
8 changed files with 125 additions and 125 deletions

View file

@ -9,7 +9,7 @@ readonly BUILDDIR="$(mktemp -d /tmp/pms-cli.XXXXXX)"
readonly CONFIG="/usr/local/noveria/etc/pms-cli/pms-cli.json" readonly CONFIG="/usr/local/noveria/etc/pms-cli/pms-cli.json"
for util in ${ROOTPATH}/utils/*; do for util in ${ROOTPATH}/utils/*; do
source $util source ${util}
done done
# VARIABLES # VARIABLES
@ -52,7 +52,7 @@ if [ "$?" != 0 ]; then
exit 1 exit 1
fi fi
eval set -- "$TEMP" eval set -- "${TEMP}"
while true; do while true; do
case "${1}" in case "${1}" in
@ -99,8 +99,8 @@ while true; do
;; ;;
--delete) --delete)
shift shift
stop "$1" stop "${1}"
delete "$1" delete "${1}"
;; ;;
--) --)
shift shift

View file

@ -1,15 +1,15 @@
#!/usr/bin/env bash #!/usr/bin/env bash
function getValueByKey() { function getValueByKey() {
jq -r ".$1" "${CONFIG}" jq -r ".${1}" "${CONFIG}"
} }
function getLocalConfValue() { function getLocalConfValue() {
jq -r ".$2" "$1/config.json" jq -r ".${2}" "${1}/config.json"
} }
function setLocalConfValue() { function setLocalConfValue() {
jq "$2" "$1/config.json" > "$1/config.tmp.json" jq "${2}" "${1}/config.json" > "${1}/config.tmp.json"
rm -f "$1/config.json" rm -f "${1}/config.json"
mv "$1/config.tmp.json" "$1/config.json" mv "${1}/config.tmp.json" "${1}/config.json"
} }

View file

@ -8,5 +8,5 @@ function datapack() {
local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}/data/world/datapacks" local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}/data/world/datapacks"
curl -L "${2}" -o "$dir/$(echo $2 | awk -F/ '{print $NF}')" curl -L "${2}" -o "${dir}/$(echo ${2} | awk -F/ '{print $NF}')"
} }

View file

@ -8,9 +8,9 @@ function delete() {
local delDir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}" local delDir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}"
while [[ ! $deleteAns =~ [YyNn] ]]; do while [[ ! ${deleteAns} =~ [YyNn] ]]; do
read -p "Do you really want to delete the complete directory located in ${delDir} ? (This is an unrecoverable process): " deleteAns read -p "Do you really want to delete the complete directory located in ${delDir} ? (This is an unrecoverable process): " deleteAns
case "$deleteAns" in case "${deleteAns}" in
"N"|"n") "N"|"n")
log e "Aborted by user!" log e "Aborted by user!"
exit 1 exit 1
@ -18,6 +18,6 @@ function delete() {
esac esac
done done
rm -rf "$delDir" rm -rf "${delDir}"
log s "Server '${1}' deleted!" log s "Server '${1}' deleted!"
} }

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
function init() { function init() {
createNetwork "$2" createNetwork "${2}"
if [[ -d "$(getValueByKey 'PODMAN_DIRECTORY')/${1}" ]]; then if [[ -d "$(getValueByKey 'PODMAN_DIRECTORY')/${1}" ]]; then
log e "Directory '${1}' already exists!" log e "Directory '${1}' already exists!"
exit 1 exit 1
@ -10,12 +10,12 @@ function init() {
local newdir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}" local newdir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}"
mkdir -p "${newdir}/data/world/datapacks" mkdir -p "${newdir}/data/world/datapacks"
populateConfig "${newdir}/config.json" "$2" populateConfig "${newdir}/config.json" "${2}"
} }
function populateConfig() { function populateConfig() {
local config="$1" local config="${1}"
local network_name="$2" local network_name="${2}"
local runnertype local runnertype
local build local build
@ -26,99 +26,99 @@ function populateConfig() {
# software # software
log i "What would you like to install?" log i "What would you like to install?"
while [[ ! $softwareAns =~ [1-2] ]]; do while [[ ! ${softwareAns} =~ [1-2] ]]; do
echo -ne "[1] Server\n[2] Proxy\n" echo -ne "[1] Server\n[2] Proxy\n"
read -p "Answer: " softwareAns read -p "Answer: " softwareAns
done done
case "$softwareAns" in case "${softwareAns}" in
1) 1)
runnertype="server" runnertype="server"
log i "Which server-software would you like to install?" log i "Which server-software would you like to install?"
local servers=($(getValueByKey 'SERVERRUNNERS|keys[]')) local servers=($(getValueByKey 'SERVERRUNNERS|keys[]'))
while [[ ! $serverAns =~ [0-9] ]]; do while [[ ! ${serverAns} =~ [0-9] ]]; do
for (( i = 0; i<${#servers[@]}; i++ )); do for (( i = 0; i<${#servers[@]}; i++ )); do
if [[ -n ${servers[$i]} ]]; then if [[ -n ${servers[${i}]} ]]; then
echo "[$(($i + 1))] ${servers[$i]}" echo "[$((${i} + 1))] ${servers[${i}]}"
fi fi
done done
read -p "Answer: " serverAns read -p "Answer: " serverAns
done done
if [[ $serverAns -gt ${#servers[@]} ]]; then if [[ ${serverAns} -gt ${#servers[@]} ]]; then
log e "The answer '$serverAns' is not valid!" log e "The answer '${serverAns}' is not valid!"
exit 1 exit 1
fi fi
software="${servers[$(($serverAns - 1))]}" software="${servers[$((${serverAns} - 1))]}"
software_url="$(getValueByKey SERVERRUNNERS.${software})" software_url="$(getValueByKey SERVERRUNNERS.${software})"
;; ;;
2) 2)
runnertype="proxy" runnertype="proxy"
log i "Which proxy-software would you like to install?" log i "Which proxy-software would you like to install?"
local proxies=($(getValueByKey 'PROXYRUNNERS|keys[]')) local proxies=($(getValueByKey 'PROXYRUNNERS|keys[]'))
while [[ ! $proxyAns =~ [0-9] ]]; do while [[ ! ${proxyAns} =~ [0-9] ]]; do
for (( i = 0; i<${#proxies[@]}; i++ )); do for (( i = 0; i<${#proxies[@]}; i++ )); do
if [[ -n ${proxies[$i]} ]]; then if [[ -n ${proxies[${i}]} ]]; then
echo "[$(($i + 1))] ${proxies[$i]}" echo "[$((${i} + 1))] ${proxies[${i}]}"
fi fi
done done
read -p "Answer: " proxyAns read -p "Answer: " proxyAns
done done
if [[ $proxyAns -gt ${#proxies[@]} ]]; then if [[ ${proxyAns} -gt ${#proxies[@]} ]]; then
log e "The answer '$proxyAns' is not valid!" log e "The answer '${proxyAns}' is not valid!"
exit 1 exit 1
fi fi
software="${proxies[$(($proxyAns - 1))]}" software="${proxies[$((${proxyAns} - 1))]}"
software_url="$(getValueByKey PROXYRUNNERS.${software})" software_url="$(getValueByKey PROXYRUNNERS.${software})"
;; ;;
*) *)
log e "The answer '$softwareAns' is not valid!" log e "The answer '${softwareAns}' is not valid!"
exit 1 exit 1
;; ;;
esac esac
# version # version
log i "Which version of '$software' would you like to install?" log i "Which version of '${software}' would you like to install?"
local versions=($(curl -s "$software_url" | jq -r '.versions[]' )) local versions=($(curl -s "${software_url}" | jq -r '.versions[]' ))
while [[ -z $versionAns ]]; do while [[ -z ${versionAns} ]]; do
for (( i = 0; i<${#versions[@]}; i++ )); do for (( i = 0; i<${#versions[@]}; i++ )); do
echo "[$(($i + 1))] ${versions[$i]}" echo "[$((${i} + 1))] ${versions[${i}]}"
done done
read -p "Answer: " versionAns read -p "Answer: " versionAns
done done
if [[ $versionAns -gt ${#versions[@]} ]]; then if [[ ${versionAns} -gt ${#versions[@]} ]]; then
log e "The answer '$versionAns' is not valid!" log e "The answer '${versionAns}' is not valid!"
exit 1 exit 1
fi fi
version="${versions[$(($versionAns - 1))]}" version="${versions[$((${versionAns} - 1))]}"
# releasecycle # releasecycle
log i "Which release-cycle do you want to go?" log i "Which release-cycle do you want to go?"
while [[ -z $releaseCycleAns ]]; do while [[ -z ${releaseCycleAns} ]]; do
echo -ne "[1] latest\n[2] specific\n" echo -ne "[1] latest\n[2] specific\n"
read -p "Answer: " releaseCycleAns read -p "Answer: " releaseCycleAns
done done
case "$releaseCycleAns" in case "${releaseCycleAns}" in
1) 1)
release="latest" release="latest"
build=$(curl -s "$software_url/versions/$version" | jq -r '.builds | last') build=$(curl -s "${software_url}/versions/${version}" | jq -r '.builds | last')
;; ;;
2) 2)
log i "Which build of '$software/$version' would you like to use?" log i "Which build of '${software}/${version}' would you like to use?"
local builds=($(curl -s "$software_url/versions/$version" | jq -r '.builds[]')) local builds=($(curl -s "${software_url}/versions/${version}" | jq -r '.builds[]'))
while [[ -z $buildAns ]]; do while [[ -z ${buildAns} ]]; do
for (( i = 0; i<${#builds[@]}; i++ )); do for (( i = 0; i<${#builds[@]}; i++ )); do
echo "[$(($i + 1))] ${builds[$i]}" echo "[$((${i} + 1))] ${builds[${i}]}"
done done
read -p "Answer: " buildAns read -p "Answer: " buildAns
done done
if [[ $buildAns -gt ${#builds[@]} ]]; then if [[ ${buildAns} -gt ${#builds[@]} ]]; then
log e "The answer '$buildAns' is not valid!" log e "The answer '${buildAns}' is not valid!"
exit 1 exit 1
fi fi
build="${builds[$(($buildAns - 1))]}" build="${builds[$((${buildAns} - 1))]}"
release="specific" release="specific"
;; ;;
esac esac
jq "(.type=\"$runnertype\")|(.build=$build)|(.software=\"$software\")|(.release=\"$release\")|(.version=\"$version\")|(.podman_network=\"$network_name\")" ${TEMPLATEDIR}/config.json > "$config" jq "(.type=\"${runnertype}\")|(.build=${build})|(.software=\"${software}\")|(.release=\"${release}\")|(.version=\"${version}\")|(.podman_network=\"${network_name}\")" ${TEMPLATEDIR}/config.json > "${config}"
} }

View file

@ -6,32 +6,32 @@ readonly IMAGEDIR=${ROOTPATH}/image
## ##
# checks if the defined image exists already # checks if the defined image exists already
# #
# $1 - string: software-name # ${1} - string: software-name
# $2 - string: mc-version # ${2} - string: mc-version
# $3 - string: build-number # ${3} - string: build-number
## ##
function checkImage() { function checkImage() {
[[ -n $(podman image ls | grep "$2/$1" | grep "$3") ]] && echo true || echo false [[ -n $(podman image ls | grep "${2}/${1}" | grep "${3}") ]] && echo true || echo false
} }
## ##
# checks if the passed data is up-to-date # checks if the passed data is up-to-date
# #
# $1 - string: software-name # ${1} - string: software-name
# $2 - string: mc-version # ${2} - string: mc-version
# $3 - string: build-number # ${3} - string: build-number
# $4 - string: runner-type # ${4} - string: runner-type
## ##
function checkUpdate() { function checkUpdate() {
case "$4" in case "${4}" in
"server") "server")
local remotebuild=$(curl -s "$(getValueByKey SERVERRUNNERS.$1)/versions/$2" | jq -r '.builds | last') local remotebuild=$(curl -s "$(getValueByKey SERVERRUNNERS.${1})/versions/${2}" | jq -r '.builds | last')
;; ;;
"proxy") "proxy")
local remotebuild=$(curl -s "$(getValueByKey PROXYRUNNERS.$1)/versions/$2" | jq -r '.builds | last') local remotebuild=$(curl -s "$(getValueByKey PROXYRUNNERS.${1})/versions/${2}" | jq -r '.builds | last')
;; ;;
esac esac
if [[ "$3" == "$remotebuild" ]]; then if [[ "${3}" == "${remotebuild}" ]]; then
echo false echo false
else else
echo true echo true
@ -41,40 +41,40 @@ function checkUpdate() {
## ##
# updates the config-file to the latest build # updates the config-file to the latest build
# #
# $1 - string: software-name # ${1} - string: software-name
# $2 - string: mc-version # ${2} - string: mc-version
# $3 - string: config-dir # ${3} - string: config-dir
# $4 - string: runner-type # ${4} - string: runner-type
## ##
function updateBuild() { function updateBuild() {
case "$4" in case "${4}" in
"server") "server")
local latest=$(curl -s "$(getValueByKey SERVERRUNNERS.$1)/versions/$2" | jq -r '.builds | last') local latest=$(curl -s "$(getValueByKey SERVERRUNNERS.${1})/versions/${2}" | jq -r '.builds | last')
;; ;;
"proxy") "proxy")
local latest=$(curl -s "$(getValueByKey PROXYRUNNERS.$1)/versions/$2" | jq -r '.builds | last') local latest=$(curl -s "$(getValueByKey PROXYRUNNERS.${1})/versions/${2}" | jq -r '.builds | last')
;; ;;
esac esac
log d "Updating build-no. to '$latest'" log d "Updating build-no. to '${latest}'"
setLocalConfValue "$3" "(.build=$latest)" setLocalConfValue "${3}" "(.build=${latest})"
} }
## ##
# builds the podman image with the proper settings # builds the podman image with the proper settings
# #
# $1 - string: software-name # ${1} - string: software-name
# $2 - string: mc-version # ${2} - string: mc-version
# $3 - string: build-number # ${3} - string: build-number
# $4 - string: download-url # ${4} - string: download-url
# #
## ##
function buildImage() { function buildImage() {
log d "lookup jar-name for download" log d "lookup jar-name for download"
local app_name=$(curl -s "$4" | jq -r '.downloads.application.name') local app_name=$(curl -s "${4}" | jq -r '.downloads.application.name')
log d "downloading server.jar" log d "downloading server.jar"
cp "${ROOTPATH}"/image/* "${BUILDDIR}/" cp "${ROOTPATH}"/image/* "${BUILDDIR}/"
curl "$4/downloads/$app_name" -o "${BUILDDIR}/server.jar" curl "${4}/downloads/${app_name}" -o "${BUILDDIR}/server.jar"
log d "building docker image" log d "building docker image"
podman build --rm "${BUILDDIR}" --tag "${2}/${1}:${3}" podman build --rm "${BUILDDIR}" --tag "${2}/${1}:${3}"
@ -87,42 +87,42 @@ function buildImage() {
## ##
# starts the specified container # starts the specified container
# #
# $1 - string: containername # ${1} - string: containername
# $2 - string: image # ${2} - string: image
# $3 - int: port # ${3} - int: port
## ##
function startContainer() { function startContainer() {
log d "Starting container '$1'" log d "Starting container '${1}'"
readarray -t additional_ports <<< "$(getLocalConfValue $(getValueByKey 'PODMAN_DIRECTORY')/${1} 'additional_ports[]')" readarray -t additional_ports <<< "$(getLocalConfValue $(getValueByKey 'PODMAN_DIRECTORY')/${1} 'additional_ports[]')"
[[ ${#additional_ports} -gt 0 ]] && log d "Starting with additional ports: ${additional_ports[@]}" [[ ${#additional_ports} -gt 0 ]] && log d "Starting with additional ports: ${additional_ports[@]}"
podman run --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 $(getValueByKey 'PODMAN_DIRECTORY')/${1}/data:/var/server "${2}" java -Dcom.mojang.eula.agree=true -jar /var/exec/server.jar --nogui --port 25565 podman run --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 $(getValueByKey 'PODMAN_DIRECTORY')/${1}/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!" [[ $? -eq 0 ]] && log s "Container '${1}' started!"
} }
## ##
# stops the specified container # stops the specified container
# #
# $1 - string: containername # ${1} - string: containername
## ##
function stopContainer() { function stopContainer() {
log d "Stopping container '$1'" log d "Stopping container '${1}'"
podman container stop --time 100 $1 podman container stop --time 100 ${1}
log s "Container '$1' stopped" log s "Container '${1}' stopped"
} }
## ##
# create a podman network # create a podman network
# #
# $1 - string: network-name # ${1} - string: network-name
## ##
function createNetwork() { function createNetwork() {
if [[ -z "$1" ]]; then if [[ -z "${1}" ]]; then
log e "Network name is unspecified. Please provide a network-name!" log e "Network name is unspecified. Please provide a network-name!"
exit 1 exit 1
fi fi
if [[ -n $(podman network ls | grep "$1") ]]; then if [[ -n $(podman network ls | grep "${1}") ]]; then
log w "Network '$1' exists already, won't create!" log w "Network '${1}' exists already, won't create!"
return 1 return 1
fi fi
podman network create "$1" podman network create "${1}"
} }

View file

@ -7,11 +7,11 @@ function reset() {
fi fi
local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}" local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}"
local datapack_dir="$dir/data/world/datapacks" local datapack_dir="${dir}/data/world/datapacks"
while [[ ! $deleteDataDir =~ [YyNn] ]]; do while [[ ! ${deleteDataDir} =~ [YyNn] ]]; do
read -p "Do you want to reset the complete data dir located in ${dir}/data ? (This is an unrecoverable process): " deleteDataDir read -p "Do you want to reset the complete data dir located in ${dir}/data ? (This is an unrecoverable process): " deleteDataDir
case "$deleteDataDir" in case "${deleteDataDir}" in
"N"|"n") "N"|"n")
log e "Aborted by user!" log e "Aborted by user!"
exit 1 exit 1
@ -21,9 +21,9 @@ function reset() {
local backedup=false local backedup=false
if [[ -n $(find "${datapack_dir}" -maxdepth 1 -type f) ]]; then if [[ -n $(find "${datapack_dir}" -maxdepth 1 -type f) ]]; then
while [[ ! $backupDatapacksAns =~ [YyNn] ]]; do while [[ ! ${backupDatapacksAns} =~ [YyNn] ]]; do
read -p "Do you want to backup the datapack .zip found in $datapack_dir ?: " backupDatapacksAns read -p "Do you want to backup the datapack .zip found in ${datapack_dir} ?: " backupDatapacksAns
case "$backupDatapacksAns" in case "${backupDatapacksAns}" in
"Y"|"y") "Y"|"y")
local backedup=true local backedup=true
local tempdir=$(mktemp -d /tmp/pms-cli.XXXXXX) local tempdir=$(mktemp -d /tmp/pms-cli.XXXXXX)
@ -33,19 +33,19 @@ function reset() {
done done
fi fi
rm -rf "$dir/data" rm -rf "${dir}/data"
mkdir -p "$dir/data/world/datapacks" mkdir -p "${dir}/data/world/datapacks"
if [[ "$backedup" == true ]]; then if [[ "${backedup}" == true ]]; then
while [[ ! $restoreDatapacksAns =~ [YyNn] ]]; do while [[ ! ${restoreDatapacksAns} =~ [YyNn] ]]; do
read -p "You have some backed up datapack .zip in $tempdir. Do you want to restore them now?: " restoreDatapacksAns read -p "You have some backed up datapack .zip in ${tempdir}. Do you want to restore them now?: " restoreDatapacksAns
case "$restoreDatapacksAns" in case "${restoreDatapacksAns}" in
"Y"|"y") "Y"|"y")
mv ${tempdir}/*.zip "${dir}/data/world/datapacks/" mv ${tempdir}/*.zip "${dir}/data/world/datapacks/"
rm -rf "$tempdir" rm -rf "${tempdir}"
;; ;;
esac esac
done done
fi fi
log s "Server '$1' resetted!" log s "Server '${1}' resetted!"
} }

View file

@ -6,19 +6,19 @@ function start() {
exit 1 exit 1
fi fi
if [[ -z "$2" ]]; then if [[ -z "${2}" ]]; then
log e "You have to specify a port, on which the server listens!" log e "You have to specify a port, on which the server listens!"
exit 1 exit 1
fi fi
local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}" local dir="$(getValueByKey 'PODMAN_DIRECTORY')/${1}"
local software="$(getLocalConfValue $dir 'software')" local software="$(getLocalConfValue ${dir} 'software')"
local version="$(getLocalConfValue $dir 'version')" local version="$(getLocalConfValue ${dir} 'version')"
local build="$(getLocalConfValue $dir 'build')" local build="$(getLocalConfValue ${dir} 'build')"
local podman_network="$(getLocalConfValue $dir 'podman_network')" local podman_network="$(getLocalConfValue ${dir} 'podman_network')"
case "$(getLocalConfValue $dir 'type')" in case "$(getLocalConfValue ${dir} 'type')" in
"server") "server")
local software_url="$(getValueByKey SERVERRUNNERS.${software})" local software_url="$(getValueByKey SERVERRUNNERS.${software})"
;; ;;
@ -27,24 +27,24 @@ function start() {
;; ;;
esac esac
if [[ $(checkImage "$software" "$version" "$build") == false ]]; then if [[ $(checkImage "${software}" "${version}" "${build}") == false ]]; then
log i "Building image '$version/$software:$build'" log i "Building image '${version}/${software}:${build}'"
buildImage "$software" "$version" "$build" "$software_url/versions/$version/builds/$build" buildImage "${software}" "${version}" "${build}" "${software_url}/versions/${version}/builds/${build}"
else else
if [[ "$(getLocalConfValue $dir 'release')" == "latest" ]]; then if [[ "$(getLocalConfValue ${dir} 'release')" == "latest" ]]; then
if [[ $(checkUpdate "$software" "$version" "$build" "$(getLocalConfValue $dir 'type')") == true ]]; then if [[ $(checkUpdate "${software}" "${version}" "${build}" "$(getLocalConfValue ${dir} 'type')") == true ]]; then
log w "Update for '$software/$version:$build' is available." log w "Update for '${software}/${version}:${build}' is available."
updateBuild "$software" "$version" "$dir" "$(getLocalConfValue $dir 'type')" updateBuild "${software}" "${version}" "${dir}" "$(getLocalConfValue ${dir} 'type')"
local oldbuild="$build" local oldbuild="${build}"
build="$(getLocalConfValue $dir 'build')" build="$(getLocalConfValue ${dir} 'build')"
if [[ $(checkImage "$software" "$version" "$build") == false ]]; then if [[ $(checkImage "${software}" "${version}" "${build}") == false ]]; then
log i "Updating image '$version/$software:$oldbuild' => '$version/$software:$build'" log i "Updating image '${version}/${software}:${oldbuild}' => '${version}/${software}:${build}'"
buildImage "$software" "$version" "$build" "$software_url/versions/$version/builds/$build" buildImage "${software}" "${version}" "${build}" "${software_url}/versions/${version}/builds/${build}"
fi fi
fi fi
fi fi
fi fi
log i "Starting container '$1' with image '$version/$software:$build' on port '$([[ -n "$3" ]] && echo ${3}:)$2'" log i "Starting container '${1}' with image '${version}/${software}:${build}' on port '$([[ -n "${3}" ]] && echo ${3}:)${2}'"
startContainer "$1" "$version/$software:$build" "$2" "$3" "$podman_network" startContainer "${1}" "${version}/${software}:${build}" "${2}" "${3}" "${podman_network}"
} }