diff --git a/podmanctl b/podmanctl index 75d53b4..8caab30 100755 --- a/podmanctl +++ b/podmanctl @@ -8,14 +8,15 @@ set -e # sub ----------------------------------------------------- usage usage () { printf "Usage:\n" - printf " podmanctl [] [...]\n" + printf " podmanctl [] [...]\n" printf " - command is assumed to be 'create'\n" - printf " podmanctl [${COMMANDS}] [] [...]\n" + printf " podmanctl [${COMMANDS}] [] [...]\n" printf " Options:\n" printf " For run|create:\n" printf " -e \n" printf " For backup:\n" printf " -d (keep containers down)\n" + printf " -w (store backups under weekday subdirectory)\n" } # --------------------------------------------------------- command @@ -38,7 +39,8 @@ fi ARGS_ENV="" PULL="" DOWN="false" -while getopts ':pe:' OPT; do +WEEKDAY="" +while getopts ':pe:dw' OPT; do case $OPT in e) if [[ "${COMMAND}" =~ ^(create|run)$ ]]; then @@ -64,6 +66,14 @@ while getopts ':pe:' OPT; do exit 1 fi ;; + w) + if [[ "${COMMAND}" =~ ^(backup)$ ]]; then + WEEKDAY="$(date +%^a)/" + else + printf "option 'w' does not apply to command '${COMMAND}'\n" + exit 1 + fi + ;; \?) usage @@ -100,7 +110,7 @@ start-pod () { |grep -Fq "podman-${PODNAME}.service"; then systemctl start podman-${PODNAME}.service || return 1 else - printf ":: ${COMMAND} ${PROJECT} - service not found!\n"; return 2 + printf ":: ${COMMAND} ${SERVER} - service not found!\n"; return 2 fi } @@ -110,7 +120,7 @@ restart-pod () { |grep -Fq "podman-${PODNAME}.service"; then systemctl restart podman-${PODNAME}.service || return 1 else - printf ":: ${COMMAND} ${PROJECT} - service not found!\n"; return 2 + printf ":: ${COMMAND} ${SERVER} - service not found!\n"; return 2 fi } @@ -121,7 +131,7 @@ remove-services () { fi find "${SYSTEMD}" \ -maxdepth 1 \ - -name "podman-${PROJECT}-*.service" \ + -name "podman-${SERVER}-*.service" \ -exec rm {} + systemctl daemon-reload } @@ -149,96 +159,151 @@ clean-pod () { # sub ----------------------------------------------------- backup volumes backup-volumes () { - VOLUMES="$(podman volume ls --filter="name=${PROJECT}-" -q |grep -v ".backup")" + VOLUMES="$(podman volume ls --format='{{.Name}}' |grep -v ".backup" |grep "${SERVER}")" if [[ -z $VOLUMES ]]; then - printf ":: ${COMMAND} ${PROJECT} - no volumes found to backup\n" + printf ":: ${COMMAND} ${SERVER} - no volumes found to backup.\n" return fi - for VOL in $VOLUMES; do - SOURCE="${VOL}" - TARGET="${VOL}.backup" + for VOLUME in $VOLUMES; do + SOURCE="${VOLUME}" + TARGET="${VOLUME}.backup" TARGET_VOLUME="$(docker volume ls -q --filter name="^${TARGET}$")" if [[ -z $TARGET_VOLUME ]]; then if docker volume create "${TARGET}"; then - printf ":: ${COMMAND} ${PROJECT} - target volume '${TARGET}' created.\n" + printf ":: ${COMMAND} ${SERVER} - target volume '${TARGET}' created\n" else - printf ":: ${COMMAND} ${PROJECT} - target volume ${TARGET} could not be created.\n" + printf ":: ${COMMAND} ${SERVER} - target volume ${TARGET} could not be created\n" return 1 fi fi - printf ":: ${COMMAND} ${PROJECT} - backup of source: ${SOURCE} to target ${TARGET} commencing\n" - if "${RUNTIME}" run --rm \ + printf ":: ${COMMAND} ${SERVER} - rsync ${SOURCE} to ${TARGET} commencing\n" + if "${RUNTIME}" run \ + --rm \ --env "SOURCE_DIR=/source" \ --env "TARGET_DIR=/target" \ --volume "${SOURCE}:/source:ro" \ --volume "${TARGET}:/target" \ - cor.cherished.me/system/helper-rsync; then - printf ":: ${COMMAND} ${PROJECT} - backup successful.\n" + cor.cherished.me/system/helper-rsync \ + > /dev/null; then + printf ":: ${COMMAND} ${SERVER} - backup of ${VOLUME} successful\n" else - printf ":: ${COMMAND} ${PROJECT} - backup error.\n"; return 2 + printf ":: ${COMMAND} ${SERVER} - error in backup of ${VOLUME}\n"; return 2 fi done } # sub ----------------------------------------------------- save images save-images () { - IMAGES="$(podman image ls --filter="reference=\$${PROJECT}-*" --format="{{.Repository}}" |grep -v "docker.io")" + IMAGES="$(podman image ls --format="{{.Repository}}" |grep -v "docker.io" |grep "${SERVER}")" + if [[ -z $IMAGES ]]; then + printf ":: ${COMMAND} ${SERVER} - no images found\n" + return + fi + printf ":: ${COMMAND} ${SERVER} - SAVING IMAGES\n" for IMAGE in $IMAGES; do - podman image save --compress --format docker-dir --output "${BACKDIR}"/"$(basename $IMAGE)" $IMAGE + OUT="${BACKDIR}/${WEEKDAY}$(basename $IMAGE)" + printf ":: ${COMMAND} ${SERVER} - saving image ${IMAGE} to ${OUT}\n" + if "${RUNTIME}" image save \ + --compress \ + --format docker-dir \ + --output "${OUT}" \ + "${IMAGE}" \ + > /dev/null; then + printf ":: ${COMMAND} ${SERVER} - saving ${IMAGE} successful\n" + else + printf ":: ${COMMAND} ${SERVER} - error saving ${IMAGE}\n"; return 2 + fi done } # --------------------------------------------------------- save backup volumes save-backups () { - echo "doit" + VOLUMES="$(podman volume ls --format='{{.Name}}' |grep ".backup" |grep "${SERVER}")" + if [[ -z $VOLUMES ]]; then + printf ":: ${COMMAND} ${SERVER} - no volumes found.\n" + return + fi + printf ":: ${COMMAND} ${SERVER} - EXPORT BACKUP VOLUMES.\n" + for VOLUME in $VOLUMES; do + OUT="${BACKDIR}/${WEEKDAY}${VOLUME}.tar" + printf ":: ${COMMAND} ${SERVER} - exporting volume ${VOLUME} to ${OUT}.\n" > /dev/null + if "${RUNTIME}" volume export \ + --output "${OUT}" \ + "${VOLUME}" > /dev/null; then + printf ":: ${COMMAND} ${SERVER} - exporting ${VOLUME} successful\n" + else + printf ":: ${COMMAND} ${SERVER} - error exporting ${VOLUME}\n"; return 2 + fi + done } -# --------------------------------------------------------- main -# --------------------------------------------------------- starts -# --------------------------------------------------------- here + + + + + + + + + + + + + +# --------------------------------------------------------- system top +SYSTEMT="$(realpath /srv)" +if [[ ! -d "${SYSTEMT}" ]]; then + printf "Error: /srv directory missing\n" + exit 1 +fi + +# --------------------------------------------------------- system runtime RUNTIME="podman" -CONFDIR="$(realpath ../config)" -PODMDIR="$(realpath ../podman)" -BACKDIR="$(realpath ../.store)" -CERTDIR="$(realpath ../.certs)" -REGADDR="cor.cherished.me/cherished.me" +RUNTDIR="${SYSTEMT}/${RUNTIME}" +mkdir -p "${RUNTDIR}" +chmod 755 "${RUNTDIR}" + +# --------------------------------------------------------- system dirs +BMNTDIR="${SYSTEMT}/.mount" +ENVRDIR="${SYSTEMT}/.envar" +BACKDIR="${SYSTEMT}/.store" +CERTDIR="${SYSTEMT}/.certs" +BUILDIR="${SYSTEMT}/builds" + +# --------------------------------------------------------- other dirs SYSTEMD="/etc/systemd/system" -SYSTEMT="/srv" +REPADDR="cor.cherished.me/cherished.me" + +# --------------------------------------------------------- dir checks +for DIR in \ + ${BMNTDIR} ${ENVRDIR} ${BACKDIR} ${CERTDIR} ${BUILDIR}; do + mkdir -p "${DIR}" + chmod 700 "${DIR}" +done # --------------------------------------------------------- rsync build -podman build \ - -t cor.cherished.me/system/helper-rsync \ - - < "${PROJECT}-subnet" + #printf "${SUBNET_PREFIX}" > "${SERVER}-subnet" # --------------------------------------------------------- proxy network "${RUNTIME}" network exists proxy-net \ @@ -260,34 +325,33 @@ for PROJECT in $*; do (ps) # --------------------------------------------------------- ps - ${RUNTIME} ps -a --watch=1 --filter "pod=${PODNAME}" --format '{{.Names}}\t\t{{.Image}}\t\t{{.ExitCode}}\t\t{{.Status}}' + ${RUNTIME} ps -a --filter "pod=${PODNAME}" --format '{{.Names}}\t\t{{.Image}}\t\t{{.ExitCode}}\t\t{{.Status}}' ;; (create|run) # --------------------------------------------------------- create|run - - SPEC_CREATE="${RUNTIME} create" SPEC_IP="--ip ${SUBNET_PREFIX}" SPEC_POD="--pod ${PODNAME}" - SPEC_PULL="${PULL}" 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 ${CONFDIR}" + SPEC_ENV="--env SUBNET=${SUBNET} ${ARGS_ENV}" + SPEC_ENVFILE="--env-file ${ENVRDIR}" + SPEC_NAME="--name ${SERVER}" + SPEC_INFRA_NAME="--infra-name ${SERVER}-infra" + SPEC_REPO="${REPADDR}/${SERVER}" + SPEC_CERTS="--volume ${CERTDIR}" + SPEC_BMOUNT="--volume ${BMNTDIR}" SPEC_SUBNET="--subnet ${SUBNET}" SPEC_LABELS="--label io.containers.autoupdate=registry" - SPEC_VOLUME="--volume ${PROJECT}" + SPEC_VOLUME="--volume ${SERVER}" 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_PUBLISH="--publish" SPEC_ALIAS="--network-alias " + SPEC_BUILD="${RUNTIME} build ${PULL}" + SPEC_CREATE="${RUNTIME} create ${SPEC_POD} ${SPEC_LABELS} ${SPEC_ENV}" # --------------------------------------------------------- recreate pod stop-pod @@ -297,7 +361,7 @@ for PROJECT in $*; do --replace # --------------------------------------------------------- create containers - source ${PROJECT} + source ${SERVER} # --------------------------------------------------------- install services install-services @@ -307,24 +371,24 @@ for PROJECT in $*; do systemctl start podman-${PODNAME} fi - printf ":: ${COMMAND} ${PROJECT} - success\n" + printf ":: ${COMMAND} ${SERVER} - success\n" ;; (stop) if stop-pod; then - printf ":: ${COMMAND} ${PROJECT} - success\n" + printf ":: ${COMMAND} ${SERVER} - success\n" else - printf ":: ${COMMAND} ${PROJECT} - failure\n" + printf ":: ${COMMAND} ${SERVER} - failure\n" fi ;; (start) if start-pod; then - printf ":: ${COMMAND} ${PROJECT} - success\n" + printf ":: ${COMMAND} ${SERVER} - success\n" else - printf ":: ${COMMAND} ${PROJECT} - failure\n" + printf ":: ${COMMAND} ${SERVER} - failure\n" fi sleep 1 ;; @@ -332,9 +396,9 @@ for PROJECT in $*; do (restart) if restart-pod; then - printf ":: ${COMMAND} ${PROJECT} - success\n" + printf ":: ${COMMAND} ${SERVER} - success\n" else - printf ":: ${COMMAND} ${PROJECT} - failure\n" + printf ":: ${COMMAND} ${SERVER} - failure\n" fi sleep 1 ;; @@ -342,9 +406,9 @@ for PROJECT in $*; do (clean) if clean-pod; then - printf ":: ${COMMAND} ${PROJECT} - success\n" + printf ":: ${COMMAND} ${SERVER} - success\n" else - printf ":: ${COMMAND} ${PROJECT} - failure\n" + printf ":: ${COMMAND} ${SERVER} - failure\n" fi ;; @@ -355,15 +419,16 @@ for PROJECT in $*; do if [[ $DOWN == "false" ]]; then start-pod fi - printf ":: ${COMMAND} ${PROJECT} - success\n" + save-backups + printf ":: ${COMMAND} ${SERVER} - success\n" else - printf ":: ${COMMAND} ${PROJECT} - failure\n" + printf ":: ${COMMAND} ${SERVER} - failure\n" fi ;; (restore) - printf ":: ${COMMAND} ${PROJECT} - not implemented\n"; continue + printf ":: ${COMMAND} ${SERVER} - not implemented\n"; continue ;; (?) @@ -373,3 +438,6 @@ for PROJECT in $*; do esac done + + +# if [[ ! "$(stat -L -c "%A" "${DIR}" |cut -c5-10 )" = "------" ]] then