From 7dcdc2d8dbe07d730f09258e675c6b6285029f36 Mon Sep 17 00:00:00 2001
From: "Lockszmith (@kateryna)" <code@lksz.me>
Date: Thu, 16 Jan 2025 10:58:15 -0500
Subject: [PATCH] split runtipictl into direct/jail implementations

---
 _bin/rtpctl.d                 | 145 ++++++++++++++++++++++++++++++++++
 _bin/{runtipictl => rtpctl.j} |  21 +++--
 2 files changed, 160 insertions(+), 6 deletions(-)
 create mode 100755 _bin/rtpctl.d
 rename _bin/{runtipictl => rtpctl.j} (86%)

diff --git a/_bin/rtpctl.d b/_bin/rtpctl.d
new file mode 100755
index 0000000..cec20cc
--- /dev/null
+++ b/_bin/rtpctl.d
@@ -0,0 +1,145 @@
+#! /usr/bin/env bash
+
+RPH_UID=${RPH_UID:-${UID}}
+
+rph-docker-exec () {
+    docker exec $1 runtipi-host "${@:2}"
+}
+
+rph-shell() {
+    if rph-docker-exec "" true; then
+         rph-docker-exec "-it --user ${RPH_UID}" bash
+    fi
+}
+
+rph-exec () {
+    local set_x=" set -x; pwd; id; "
+    [ -z "$QUIET" ] || set_x=""
+    local cli="cd ${START_DIR:-/srv/runtipi};${set_x} ${1:?Must supply command} "
+    if [ -n "$ROOT_EXEC" ]; then
+        cli="$cli ${*:2}"
+    else
+        cli="$cli "${2:+"$(
+            printf '\"%s\" ' "${@:2}"
+        )"}
+    fi
+
+    if rph exec runtipi true; then
+        if [ -n "$ROOT_EXEC" ]; then
+           rph exec runtipi /bin/bash <<<"$cli"
+        else
+           rph shell --uid "${RPH_UID}" runtipi /bin/bash -c "$cli"
+        fi
+    else
+        echo "ERROR: ${_ERROR_MGS:-"Please check if runtipi jail has started! Have you tried 'full-start'?"}" >&2
+        exit -1
+    fi
+}
+
+runtipi-cli() {
+    rph-exec ./runtipi-cli "${@}"    
+}
+
+runtipi-app-docker-compose() {
+    local APP="${1:-Must supply app name}"
+    local LOCAL_YML="user-config/${APP}/docker-compose.yml"
+
+    rph exec runtipi test -e "/srv/runtipi/${LOCAL_YML}" || LOCAL_YML=""
+    [ -z "$LOCAL_YML" ] || LOCAL_YML="--file ${LOCAL_YML}"
+
+    rph-exec docker compose \
+        --env-file user-config/.env.local \
+        --env-file app-data/${APP}/app.env \
+        --env-file user-config/${APP}/app.env \
+        --project-name ${APP} \
+        --file apps/${APP}/docker-compose.yml \
+        --file repos/29ca930bfdaffa1dfabf5726336380ede7066bc53297e3c0c868b27c97282903/apps/docker-compose.common.yml \
+        ${LOCAL_YML} ${@:2}
+}
+
+dls() {
+    # Default docker ps format is:
+    # rph-exec docker ps --format "table {{ .ID }}\t{{ .Image }}\t{{ .Command }}\t{{ .Created }}\t{{ .Status }}\t{{ .Ports }}\t{{ .Names }}"
+
+    local base='{{.Status}}\t{{.ID}}\t{{.Names}}\t{{.Image}}' #'\t{{.Networks}}\t{{.Ports}}\t{{.Mounts}}'
+    local compose='{{.Label "com.docker.compose.project"}}\t{{.Label "com.docker.compose.service"}}'
+    local format="table $compose\t$base"
+    ROOT_EXEC=1 QUIET=${QUIET:-0} rph-exec \
+        docker "container ls --all --format '$format' | ( sed -u '1s/.*/\U&/; q'; sed -Ee 's|^|555|; s|^555runtipi|000runtipi|;' | sort | sed -Ee 's/^[[:digit:]]{3}//' )"
+}
+
+case "${1}" in
+    cli)
+        runtipi-cli "${@:2}"
+        ;;
+    log)
+        rph-exec "POSTGRES_PASSWORD=_ TIPI_VERSION=_ LOCAL_DOMAIN=_ DOMAIN=_" docker compose --env-file user-config/.env.local logs --tail=${TAIL:-40} "${2:-runtipi}" ${3:+"${@:3}"}
+        ;;
+    start)
+        runtipi-cli start --env-file user-config/.env.local --no-permissions
+        ;;
+    update)
+        runtipi-cli update --env-file user-config/.env.local --no-permissions "${2:?Must supply version}" "${@:3}"
+        ;;
+    full-start)
+        if ! rph exec runtipi true; then
+            rph start runtipi 
+            sleep 1s
+        fi
+        _ERROR_MSG="ERROR: failed to invoke a command inside the runtipi jail and can't start the jail." \
+        runtipi-cli start --env-file user-config/.env.local --no-permissions
+        ;;
+    shell)
+        rph-shell
+        ;;
+    exec)
+        rph-exec "${@:2}"
+        ;;
+    docker)
+        rph-exec docker "${@:2}"
+        ;;
+    dls)
+        dls "${@:2}"
+        ;;
+    dcoapp)
+        runtipi-app-docker-compose "${@:2}"
+        ;;
+    dockge)
+        START_DIR=/srv/dockge/stacks/${2:?Must supply stack name} rph-exec docker compose "${@:3}"
+        ;;
+    setup)
+        ln -s $2 "$(cd "$(dirname "$0")" && pwd)/$(basename "$0")" "$HOME/.local/bin/"
+        ;;
+    *)
+        printf '%s    %-12s %s\n' \
+            "" "" ""\
+            "Usage:" "" ""\
+            "  $(basename "$0") <command> [args...]" "" ""\
+            "" "" "" \
+            "Available commands:" "" ""\
+            "" "" "" \
+            "runtipi" "" ""\
+            "" "cli"        "runtipi-cli" \
+            "" "full-start" "start runtipi jail, following with starting runtipi" \
+            "" "log"        "runtipi docker stack logs" \
+            "" "start"      "start runtipi" \
+            "" "update"     "update runtipi to a specific version" \
+            "" "" "" \
+            "docker/docker-compose" "" ""\
+            "" "dcoapp"     "docker compose for runtipi apps" \
+            "" "dls"        "stylized docker ls" \
+            "" "docker"     "docker" \
+            "" "dockge"     "docker compose for dockge stacks" \
+            "" "" "" \
+            "misc." "" ""\
+            "" "exec"       "execute within the shell, START_DIR env applies" \
+            "" "shell"      "enter an insteractive shell" \
+            "" "" "" \
+            "" "setup"      "setup runtipictl in user's .local/bin dir" \
+            "" "" "" \
+            "Related env. vars:" "" "" \
+            "" "VISUAL EDITOR RPH_UID QUIET START_DIR ROOT_EXEC" ""
+
+        ;;
+esac
+
diff --git a/_bin/runtipictl b/_bin/rtpctl.j
similarity index 86%
rename from _bin/runtipictl
rename to _bin/rtpctl.j
index f760ca2..0afccb4 100755
--- a/_bin/runtipictl
+++ b/_bin/rtpctl.j
@@ -4,11 +4,14 @@ jlmkr () {
     sudo VISUAL="${VISUAL:-}" EDITOR="${EDITOR:-}" $SCALE_POOL_ROOT/jailmaker/jlmkr.py "${@:---help}"
 }
 
-JAIL_UID=${JAIL_UID:-${UID}}
+RPH_UID=${RPH_UID:-${UID}}
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+BASE_NAME="$(basename "$0")"
+BASE_BASE_NAME="${BASE_NAME%.*}"
 
 jlmkr-shell() {
     if jlmkr exec runtipi true; then
-         jlmkr shell --uid "${JAIL_UID}" runtipi
+         jlmkr shell --uid "${RPH_UID}" runtipi
     fi
 }
 
@@ -28,7 +31,7 @@ jlmkr-exec () {
         if [ -n "$ROOT_EXEC" ]; then
            jlmkr exec runtipi /bin/bash <<<"$cli"
         else
-           jlmkr shell --uid "${JAIL_UID}" runtipi /bin/bash -c "$cli"
+           jlmkr shell --uid "${RPH_UID}" runtipi /bin/bash -c "$cli"
         fi
     else
         echo "ERROR: ${_ERROR_MGS:-"Please check if runtipi jail has started! Have you tried 'full-start'?"}" >&2
@@ -108,13 +111,16 @@ case "${1}" in
         START_DIR=/srv/dockge/stacks/${2:?Must supply stack name} jlmkr-exec docker compose "${@:3}"
         ;;
     setup)
-        ln -s $2 "$(cd "$(dirname "$0")" && pwd)/$(basename "$0")" "$HOME/.local/bin/"
+        ln -s $2 "$(cd "${SCRIPT_DIR}" && pwd)/${BASE_NAME}" "${3:-$HOME/.local/bin/}"
+        ;;
+    edit)
+        ${VISUAL:-${EDITOR:-vi}} $0
         ;;
     *)
         printf '%s    %-12s %s\n' \
             "" "" ""\
             "Usage:" "" ""\
-            "  $(basename "$0") <command> [args...]" "" ""\
+            "  ${BASE_NAME} <command> [args...]" "" ""\
             "" "" "" \
             "Available commands:" "" ""\
             "" "" "" \
@@ -136,9 +142,12 @@ case "${1}" in
             "" "shell"      "enter an insteractive shell" \
             "" "" "" \
             "" "setup"      "setup runtipictl in user's .local/bin dir" \
+            "" "" "${BASE_NAME} setup" \
+            "" "" "${BASE_NAME} setup '' ~/.local/bin/${BASE_BASE_NAME}" \
+            "" "" "${BASE_NAME} setup '' ~/.local/bin/runtipictl" \
             "" "" "" \
             "Related env. vars:" "" "" \
-            "" "VISUAL EDITOR JAIL_UID QUIET START_DIR ROOT_EXEC" ""
+            "" "VISUAL EDITOR RPH_UID QUIET START_DIR ROOT_EXEC" ""
 
         ;;
 esac