diff --git a/podmanctl b/podmanctl index 16ff6e6..bf28f57 100755 --- a/podmanctl +++ b/podmanctl @@ -6,17 +6,20 @@ set -u set -e # --------------------------------------------------------- usage -COMMANDS="restore|backup|create|run|stop|remove|clean|start" usage () { printf "Usage:\n" printf " podmanctl [] [...]\n" printf " - command is assumed to be 'run'\n" printf " podmanctl [${COMMANDS}] [] [...]\n" printf " Options:\n" - printf " -e \n" + printf " For run|create:\n" + printf " -e \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