summaryrefslogtreecommitdiff
path: root/jails/gubbhub/gubbshell
diff options
context:
space:
mode:
authorAlbert Cervin <albert@acervin.com>2023-03-19 17:18:01 +0100
committerAlbert Cervin <albert@acervin.com>2023-03-19 17:18:01 +0100
commitc6f2fd36e0a8188e1f6b2a15b292e3d0a5610ac4 (patch)
treed1c21cf0d9a2529154b33438bd91821268be5eb4 /jails/gubbhub/gubbshell
downloaddatagubbe-setup-c6f2fd36e0a8188e1f6b2a15b292e3d0a5610ac4.tar.gz
datagubbe-setup-c6f2fd36e0a8188e1f6b2a15b292e3d0a5610ac4.tar.xz
datagubbe-setup-c6f2fd36e0a8188e1f6b2a15b292e3d0a5610ac4.zip
🎉 Initial commit of infraHEADmain
Diffstat (limited to 'jails/gubbhub/gubbshell')
-rw-r--r--jails/gubbhub/gubbshell/create-repo59
-rw-r--r--jails/gubbhub/gubbshell/delete-repo33
-rw-r--r--jails/gubbhub/gubbshell/edit-repo16
-rw-r--r--jails/gubbhub/gubbshell/help21
-rw-r--r--jails/gubbhub/gubbshell/list-repos12
5 files changed, 141 insertions, 0 deletions
diff --git a/jails/gubbhub/gubbshell/create-repo b/jails/gubbhub/gubbshell/create-repo
new file mode 100644
index 0000000..07c7aa4
--- /dev/null
+++ b/jails/gubbhub/gubbshell/create-repo
@@ -0,0 +1,59 @@
+#! /usr/bin/env sh
+
+set -euo pipefail
+
+if ! id -nG | grep -qwF "gitadm"; then
+ echo $'\e[31myou are not an admin\e[0m'
+ exit 13
+fi
+
+if [ $# -lt 1 ]; then
+ echo $'\e[31mrepository name is required\e[0m'
+ exit 1
+fi
+
+read_with_default() {
+ local var="$1"
+ local title="$2"
+ local default="$3"
+
+ read -p $'\e[36m'"$title"$'\e[0m \e[1m['"$default"$']\e[0m: ' $var
+ eval vval="\$$var"
+ eval $var="\"${vval:-$default}\""
+}
+
+name="$1"
+path="$(echo "$1" | sed 's/ /-/' | tr '[:upper:]' '[:lower:]').git"
+
+if [ -e "$path" ]; then
+ echo $'\e[31m'"repository at \"$path\" already exists"$'\e[0m'
+ exit 1
+fi
+
+read_with_default defbranch "default branch" "main"
+read_with_default dispname "display name" "$name"
+read_with_default owner "owner" "$(id -un)"
+read_with_default shared "shared with 'gitdev' group" "yes"
+
+echo $'\e[36mdescription\e[0m (terminate with C-d): '
+description=""
+while read -r descline; do
+ description="$description$descline\n"
+done
+
+echo "creating repo at: $path..."
+sharerepo="false"
+case "$(echo "$shared" | tr '[:upper:]' '[:lower:]')" in
+ y|yes|ye|true|t) sharerepo="group" ;;
+esac
+git init --bare --shared="$sharerepo" --initial-branch="$defbranch" "$path"
+
+echo "generating web config..."
+cat <<EOF > "$path/cgitrc"
+name=$dispname
+owner=$owner
+desc=${description%\\n}
+EOF
+
+echo "browse new repo at: https://git.datagubbe.dev/$path"
+
diff --git a/jails/gubbhub/gubbshell/delete-repo b/jails/gubbhub/gubbshell/delete-repo
new file mode 100644
index 0000000..ee8b2c6
--- /dev/null
+++ b/jails/gubbhub/gubbshell/delete-repo
@@ -0,0 +1,33 @@
+#! /usr/bin/env sh
+
+set -euo pipefail
+
+if ! id -nG | grep -qwF "gitadm"; then
+ echo $'\e[31myou are not an admin\e[0m'
+ exit 13
+fi
+
+if [ $# -lt 1 ]; then
+ echo $'\e[31mrepository name is required\e[0m'
+ exit 1
+fi
+
+name="$1"
+path="$(echo "$1" | sed 's/ /-/' | tr '[:upper:]' '[:lower:]').git"
+
+read -p $'\e[33mare you sure you want to delete the repo '"\"$name\" at \"$path\""$'\e[0m \e[1m[no]\e[0m: ' confirm
+
+delete="false"
+case "$(echo "$confirm" | tr '[:upper:]' '[:lower:]')" in
+ y|yes|ye) delete="true" ;;
+esac
+
+if [ "$delete" = "true" ]; then
+ echo -n "deleting repository \"$name\"..."
+ rm -rf "$path"
+ echo "done!"
+fi
+
+# delete the dir if empty
+dir=$(dirname "$path")
+find "$dir" -maxdepth 0 -type d -delete
diff --git a/jails/gubbhub/gubbshell/edit-repo b/jails/gubbhub/gubbshell/edit-repo
new file mode 100644
index 0000000..6ceb6f3
--- /dev/null
+++ b/jails/gubbhub/gubbshell/edit-repo
@@ -0,0 +1,16 @@
+#! /usr/bin/env sh
+set -euo pipefail
+
+if ! id -nG | grep -qwF "gitadm"; then
+ echo $'\e[31myou are not an admin\e[0m'
+ exit 13
+fi
+
+if [ $# -lt 1 ]; then
+ echo $'\e[31mrepository name is required\e[0m'
+ exit 1
+fi
+
+path="$(echo "$1" | sed 's/ /-/' | tr '[:upper:]' '[:lower:]').git"
+
+nano -R "$path/cgitrc"
diff --git a/jails/gubbhub/gubbshell/help b/jails/gubbhub/gubbshell/help
new file mode 100644
index 0000000..5ea3e62
--- /dev/null
+++ b/jails/gubbhub/gubbshell/help
@@ -0,0 +1,21 @@
+#! /usr/bin/env sh
+
+printf "Hi $(id -un) and welcome to the gubbshell 👴🐚!
+
+If you have administrative rights this shell can be used to manage repos.
+
+Commands:
+ - \033[1mcreate-repo\033[0m NAME
+ create a new repository called NAME. The command will
+ prompt for needed information. To create a repo in a group use <group>/name.
+
+ - \033[1mdelete-repo\033[0m NAME
+ delete the repository NAME. Note that this is an irreversible operation.
+
+ - \033[1mlist-repos\033[0m
+ list current repos
+
+ - \033[1medit-repo\033[0m NAME
+ edit repository information for NAME. This will open a restricted editor (nano)
+ for editing the repo-specific cgitrc file.
+"
diff --git a/jails/gubbhub/gubbshell/list-repos b/jails/gubbhub/gubbshell/list-repos
new file mode 100644
index 0000000..a33a84b
--- /dev/null
+++ b/jails/gubbhub/gubbshell/list-repos
@@ -0,0 +1,12 @@
+#! /usr/bin/env sh
+
+set -euo pipefail
+
+printf '%-32s %-32s %s\n' 'DISPLAY NAME' 'OWNER' 'PATH'
+echo '-------------------------------------------------------------------------------------------'
+cd /git/repos && find . -name '*.git' -type d |
+while read repo; do
+ name="$(grep "name=" "$repo/cgitrc" | sed 's/^.*=//')"
+ owner="$(grep "owner=" "$repo/cgitrc" | sed 's/^.*=//')"
+ printf '%-32s %-32s %s\n' "$name" "$owner" "$repo"
+done