Third Commit

This commit is contained in:
Andrew Hurley 2023-02-26 23:12:34 +08:00
parent e58c78bae3
commit 3ef215a4e1
1 changed files with 134 additions and 57 deletions

191
podmanctl
View File

@ -6,17 +6,20 @@ set -u
set -e
# --------------------------------------------------------- usage
COMMANDS="restore|backup|create|run|stop|remove|clean|start"
usage () {
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 " -e <additional_environment_vars>\n"
printf " For run|create:\n"
printf " -e <additional_environment_vars>\n"
printf " For backup:\n"
printf " -d (keep containers down)\n"
}
# --------------------------------------------------------- command
COMMANDS="create|run|stop|start|clean|backup|restore"
if [[ $# -lt 1 ]]; then
printf "Arguments missing\n"
usage
@ -51,8 +54,8 @@ fi
for PROJECT in $*; do
if [[ ! -r ${PROJECT} ]]; then
printf "Project spec file '${PROJECT}' missing or not readable. Skipping\n"
continue
printf "Project spec file '${PROJECT}' missing or not readable\n"
exit 1
fi
# --------------------------------------------------------- project vars
@ -75,15 +78,8 @@ for PROJECT in $*; do
exit 3;
fi
printf -- \
"--------------------------------------------------------- \
${PROJECT} ${COMMAND}\n"
# --------------------------------------------------------- stop pod service
systemctl list-units --full -all \
|grep -Fq "podman-${PODNAME}.service" \
&& systemctl stop podman-${PODNAME}.service
printf ":: ${COMMAND} ${PROJECT}\n"
# --------------------------------------------------------- network
podman network exists ${NETWORK} \
|| podman network create ${NETWORK}
@ -100,53 +96,134 @@ for PROJECT in $*; do
PROXY_SUBNET_PREFIX="${PROXY_SUBNET%\.0/24}"
#printf "${PROXY_SUBNET_PREFIX}" > "proxy-subnet"
# --------------------------------------------------------- spec var runtime
if [[ $COMMAND = "run" ]]; then
SPEC_RUN="${RUNTIME} run -d"
else
SPEC_RUN="${RUNTIME} create"
fi
case $COMMAND in
(create|run)
# --------------------------------------------------------- spec vars
SPEC_IP="--ip ${SUBNET_PREFIX}"
SPEC_POD="--pod ${PODNAME}"
SPEC_DNS="--dns ${SUBNET_PREFIX}.254"
SPEC_ENV="--env-file ${ENVFILE}"
SPEC_ENV="${SPEC_ENV} --env SUBNET=${SUBNET}"
SPEC_ENV="${SPEC_ENV} ${ARGS_ENV}"
SPEC_NAME="--name ${PROJECT}"
SPEC_INFRA_NAME="--infra-name ${PROJECT}-infra"
SPEC_IMAGE="${REGADDR}/${PROJECT}"
SPEC_CONFIG="--volume ${ROOTDIR}"
SPEC_SUBNET="--subnet ${SUBNET}"
SPEC_LABELS="--label io.containers.autoupdate=registry"
SPEC_VOLUME="--volume ${PROJECT}"
SPEC_NETWORK="--network ${NETWORK}"
SPEC_NETWORK_PREFIX="${SPEC_NETWORK}:ip=${SUBNET_PREFIX}"
SPEC_PROXY_NET="--network proxy-net"
SPEC_PROXY_NET_PREFIX="${SPEC_PROXY_NET}:ip=${PROXY_SUBNET_PREFIX}"
SPEC_HOSTS=""
SPEC_PUBLISH=""
SPEC_ALIAS="--network-alias "
# --------------------------------------------------------- spec vars
SPEC_IP="--ip ${SUBNET_PREFIX}"
SPEC_POD="--pod ${PODNAME}"
SPEC_DNS="--dns ${SUBNET_PREFIX}.254"
SPEC_ENV="--env-file ${ENVFILE}"
SPEC_ENV="${SPEC_ENV} --env SUBNET=${SUBNET}"
SPEC_ENV="${SPEC_ENV} ${ARGS_ENV}"
SPEC_NAME="--name ${PROJECT}"
SPEC_INFRA_NAME="--infra-name ${PROJECT}-infra"
SPEC_IMAGE="${REGADDR}/${PROJECT}"
SPEC_CONFIG="--volume ${ROOTDIR}"
SPEC_SUBNET="--subnet ${SUBNET}"
SPEC_LABELS="--label io.containers.autoupdate=registry"
SPEC_VOLUME="--volume ${PROJECT}"
SPEC_NETWORK="--network ${NETWORK}"
SPEC_NETWORK_PREFIX="${SPEC_NETWORK}:ip=${SUBNET_PREFIX}"
SPEC_PROXY_NET="--network proxy-net"
SPEC_PROXY_NET_PREFIX="${SPEC_PROXY_NET}:ip=${PROXY_SUBNET_PREFIX}"
SPEC_HOSTS=""
SPEC_PUBLISH=""
SPEC_ALIAS="--network-alias "
# --------------------------------------------------------- spec var runtime
if [[ $COMMAND = "run" ]]; then
SPEC_RUN="${RUNTIME} run -d"
else
SPEC_RUN="${RUNTIME} create"
fi
# --------------------------------------------------------- create pod
podman pod create --replace \
${SPEC_NAME}-pod \
${SPEC_INFRA_NAME}
# --------------------------------------------------------- remove pod
if [[ "$(systemctl is-active podman-${PODNAME}.service)" == "active" ]]; then
if systemctl list-units --full -all \
|grep -Fq "podman-${PODNAME}.service" then
systemctl stop podman-${PODNAME}.service
fi
else
if podman pod exists "${PODNAME}"; then
podman pod rm -f -t 70 "${PODNAME}"
fi
fi
# --------------------------------------------------------- create pod
podman pod create \
${SPEC_NAME}-pod \
${SPEC_INFRA_NAME}
# --------------------------------------------------------- create|run containers
source ${PROJECT}
# --------------------------------------------------------- create services
(cd /etc/systemd/system && \
podman generate systemd \
--name \
--new \
--stop-timeout=70 \
--pod-prefix=podman \
--restart-sec=10 \
--container-prefix=podman \
--files ${PODNAME} \
) && systemctl daemon-reload \
&& systemctl enable podman-${PODNAME}
printf " ${COMMAND} ${PROJECT} - success\n"
;;
(stop|start)
# --------------------------------------------------------- start pod service
if [[ "$(systemctl is-active podman-${PODNAME}.service)" == "active" ]]; then
if systemctl list-units --full -all \
|grep -Fq "podman-${PODNAME}.service"; then
systemctl "${COMMAND}" podman-${PODNAME}.service
fi
else
if podman pod exists "${PODNAME}"; then
if [[ $COMMAND = "stop" ]]; then
podman pod stop -t 70 "${PODNAME}"
else
podman pod start "${PODNAME}"
fi
else
printf " ${COMMAND} ${PROJECT} - pod not found!\n"
continue
fi
fi
printf " ${COMMAND} ${PROJECT} - success\n"
;;
# --------------------------------------------------------- run containers
source ${PROJECT}
(clean)
# --------------------------------------------------------- clean
if [[ "$(systemctl is-active podman-${PODNAME}.service)" == "active" ]]; then
if systemctl list-units --full -all \
|grep -Fq "podman-${PODNAME}.service"; then
systemctl stop podman-${PODNAME}.service
fi
else
if podman pod exists "${PODNAME}"; then
podman pod rm -f -t 70 "${PODNAME}"
fi
fi
if [[ -f /etc/systemd/system/podman-${PODNAME}.service ]]; then
systemctl disable podman-${PODNAME}.service
fi
find /etc/systemd/system \
-maxdepth 1 \
-name "podman-${PROJECT}-*.service" \
-exec rm {} +
systemctl daemon-reload
printf " ${COMMAND} ${PROJECT} - success\n"
;;
# --------------------------------------------------------- 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}
(backup)
echo " ${COMMAND} ${PROJECT} - not implemented\n"; continue
;;
(restore)
echo " ${COMMAND} ${PROJECT} - not implemented\n"; continue
;;
esac
done