Second Commit

This commit is contained in:
Andrew Hurley 2023-02-26 20:40:31 +08:00
parent e5b04002a1
commit e58c78bae3
1 changed files with 107 additions and 96 deletions

183
podmanctl
View File

@ -6,20 +6,28 @@ set -u
set -e set -e
# --------------------------------------------------------- usage # --------------------------------------------------------- usage
COMMANDS="restore|backup|create|run|stop|remove|clean|start"
usage () { usage () {
printf "Usage: podmanctl [${COMMANDS}] [<options>] <project> [<project>...]\n" printf "Usage:\n"
printf " podmanctl [<options>] <project> [<project>...]\n"
printf " - command is assumed to be 'run'\n"
printf " podmanctl [${COMMANDS}] [<options>] <project> [<project>...]\n"
printf " Options:\n" printf " Options:\n"
printf " -e <additional_environment_vars>\n" printf " -e <additional_environment_vars>\n"
} }
# --------------------------------------------------------- command # --------------------------------------------------------- command
COMMANDS="restore|backup|create|run|stop|remove|clean|start" if [[ $# -lt 1 ]]; then
printf "Arguments missing\n"
usage
exit 2
fi
if [[ "$1" =~ ^(${COMMANDS})$ ]]; then if [[ "$1" =~ ^(${COMMANDS})$ ]]; then
COMMAND="${1}" COMMAND="${1}"
shift shift
else else
COMMAND="project" COMMAND="run"
fi fi
# --------------------------------------------------------- args # --------------------------------------------------------- args
@ -38,104 +46,107 @@ if [[ $# -lt 1 ]]; then
usage usage
exit 2 exit 2
fi fi
# --------------------------------------------------------- project loop
for PROJECT in $*; do for PROJECT in $*; do
echo $PROJECT
if [[ ! -r ${PROJECT} ]]; then if [[ ! -r ${PROJECT} ]]; then
printf "Project spec file '${PROJECT}' missing or not readable. Skipping\n" printf "Project spec file '${PROJECT}' missing or not readable. Skipping\n"
continue continue
fi fi
exit # --------------------------------------------------------- project vars
RUNTIME="podman"
ROOTDIR="$(realpath /root)"
NETWORK="${PROJECT}-net"
ENVFILE="${ROOTDIR}/${PROJECT}-env.conf"
PODNAME="${PROJECT}-pod"
REGADDR="cor.cherished.me/cherished.me"
# --------------------------------------------------------- project vars # project check
RUNTIME="podman" if [[ ! -r $ENVFILE ]] then
ROOTDIR="$(realpath /root)" printf "Environment file ${ENVFILE} not found or readable.\n"
NETWORK="${PROJECT}-net" usage
ENVFILE="${ROOTDIR}/${PROJECT}-env.conf" exit 2;
PODNAME="${PROJECT}-pod" fi
REGADDR="cor.cherished.me/cherished.me" if [[ ! "$(stat -L -c "%A" "${ROOTDIR}" |cut -c8-10 )" = "---" ]] then
printf "Error: ${ROOTDIR} is world readable\n"
usage
exit 3;
fi
# project check printf -- \
if [[ ! -r $ENVFILE ]] then "--------------------------------------------------------- \
printf "Environment file ${ENVFILE} not found or readable.\n" ${PROJECT} ${COMMAND}\n"
usage
exit 2;
fi
if [[ ! "$(stat -L -c "%A" "${ROOTDIR}" |cut -c8-10 )" = "---" ]] then
printf "Error: ${ROOTDIR} is world readable\n"
usage
exit 3;
fi
# --------------------------------------------------------- stop pod service # --------------------------------------------------------- stop pod service
systemctl list-units --full -all \ systemctl list-units --full -all \
|grep -Fq "podman-${PODNAME}.service" \ |grep -Fq "podman-${PODNAME}.service" \
&& systemctl stop podman-${PODNAME}.service && systemctl stop podman-${PODNAME}.service
# --------------------------------------------------------- network # --------------------------------------------------------- network
podman network exists ${NETWORK} \ podman network exists ${NETWORK} \
|| podman network create ${NETWORK} || podman network create ${NETWORK}
SUBNET="$(podman network inspect ${NETWORK} \ SUBNET="$(podman network inspect ${NETWORK} \
|grep -w "\"subnet\":" |sed 's/[\":,a-z,A-Z ]//g')" |grep -w "\"subnet\":" |sed 's/[\":,a-z,A-Z ]//g')"
SUBNET_PREFIX="${SUBNET%\.0/24}" SUBNET_PREFIX="${SUBNET%\.0/24}"
#printf "${SUBNET_PREFIX}" > "${PROJECT}-subnet" #printf "${SUBNET_PREFIX}" > "${PROJECT}-subnet"
# --------------------------------------------------------- proxy network # --------------------------------------------------------- proxy network
podman network exists proxy-net \ podman network exists proxy-net \
|| podman network create proxy-net || podman network create proxy-net
PROXY_SUBNET="$(podman network inspect proxy-net \ PROXY_SUBNET="$(podman network inspect proxy-net \
|grep -w "\"subnet\":" |sed 's/[\":,a-z,A-Z ]//g')" |grep -w "\"subnet\":" |sed 's/[\":,a-z,A-Z ]//g')"
PROXY_SUBNET_PREFIX="${PROXY_SUBNET%\.0/24}" PROXY_SUBNET_PREFIX="${PROXY_SUBNET%\.0/24}"
#printf "${PROXY_SUBNET_PREFIX}" > "proxy-subnet" #printf "${PROXY_SUBNET_PREFIX}" > "proxy-subnet"
# --------------------------------------------------------- spec var runtime # --------------------------------------------------------- spec var runtime
if [[ $COMMAND = "run" ]]; then if [[ $COMMAND = "run" ]]; then
SPEC_RUN="${RUNTIME} run -d" SPEC_RUN="${RUNTIME} run -d"
else else
SPEC_RUN="${RUNTIME} create" SPEC_RUN="${RUNTIME} create"
fi fi
# --------------------------------------------------------- spec vars # --------------------------------------------------------- spec vars
SPEC_IP="--ip ${SUBNET_PREFIX}" SPEC_IP="--ip ${SUBNET_PREFIX}"
SPEC_POD="--pod ${PODNAME}" SPEC_POD="--pod ${PODNAME}"
SPEC_DNS="--dns ${SUBNET_PREFIX}.254" SPEC_DNS="--dns ${SUBNET_PREFIX}.254"
SPEC_ENV="--env-file ${ENVFILE}" SPEC_ENV="--env-file ${ENVFILE}"
SPEC_ENV="${SPEC_ENV} --env SUBNET=${SUBNET}" SPEC_ENV="${SPEC_ENV} --env SUBNET=${SUBNET}"
SPEC_ENV="${SPEC_ENV} ${ARGS_ENV}" SPEC_ENV="${SPEC_ENV} ${ARGS_ENV}"
SPEC_NAME="--name ${PROJECT}" SPEC_NAME="--name ${PROJECT}"
SPEC_INFRA_NAME="--infra-name ${PROJECT}-infra" SPEC_INFRA_NAME="--infra-name ${PROJECT}-infra"
SPEC_IMAGE="${REGADDR}/${PROJECT}" SPEC_IMAGE="${REGADDR}/${PROJECT}"
SPEC_CONFIG="--volume ${ROOTDIR}" SPEC_CONFIG="--volume ${ROOTDIR}"
SPEC_SUBNET="--subnet ${SUBNET}" SPEC_SUBNET="--subnet ${SUBNET}"
SPEC_LABELS="--label io.containers.autoupdate=registry" SPEC_LABELS="--label io.containers.autoupdate=registry"
SPEC_VOLUME="--volume ${PROJECT}" SPEC_VOLUME="--volume ${PROJECT}"
SPEC_NETWORK="--network ${NETWORK}" SPEC_NETWORK="--network ${NETWORK}"
SPEC_NETWORK_PREFIX="${SPEC_NETWORK}:ip=${SUBNET_PREFIX}" SPEC_NETWORK_PREFIX="${SPEC_NETWORK}:ip=${SUBNET_PREFIX}"
SPEC_PROXY_NET="--network proxy-net" SPEC_PROXY_NET="--network proxy-net"
SPEC_PROXY_NET_PREFIX="${SPEC_PROXY_NET}:ip=${PROXY_SUBNET_PREFIX}" SPEC_PROXY_NET_PREFIX="${SPEC_PROXY_NET}:ip=${PROXY_SUBNET_PREFIX}"
SPEC_HOSTS="" SPEC_HOSTS=""
SPEC_PUBLISH="" SPEC_PUBLISH=""
SPEC_ALIAS="--network-alias " SPEC_ALIAS="--network-alias "
# --------------------------------------------------------- create pod # --------------------------------------------------------- create pod
podman pod create --replace \ podman pod create --replace \
${SPEC_NAME}-pod \ ${SPEC_NAME}-pod \
${SPEC_INFRA_NAME} ${SPEC_INFRA_NAME}
# --------------------------------------------------------- run containers # --------------------------------------------------------- run containers
source ${PROJECT} source ${PROJECT}
# --------------------------------------------------------- services create and start
(cd /etc/systemd/system && \
podman generate systemd \
--name \
--stop-timeout=70 \
--pod-prefix=podman \
--restart-sec=5 \
--container-prefix=podman \
--files ${PODNAME} \
) && systemctl daemon-reload \
&& systemctl enable podman-${PODNAME}
# --------------------------------------------------------- services create and start
(cd /etc/systemd/system && \
podman generate systemd \
--name \
--stop-timeout=70 \
--pod-prefix=podman \
--restart-sec=5 \
--container-prefix=podman \
--files ${PODNAME} \
) && systemctl daemon-reload \
&& systemctl enable podman-${PODNAME}
done done