From c6f2fd36e0a8188e1f6b2a15b292e3d0a5610ac4 Mon Sep 17 00:00:00 2001 From: Albert Cervin Date: Sun, 19 Mar 2023 17:18:01 +0100 Subject: =?UTF-8?q?=F0=9F=8E=89=20Initial=20commit=20of=20infra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jails/gubbhub/gubbshell/create-repo | 59 +++++++++++++++++++++++++++++++++++++ jails/gubbhub/gubbshell/delete-repo | 33 +++++++++++++++++++++ jails/gubbhub/gubbshell/edit-repo | 16 ++++++++++ jails/gubbhub/gubbshell/help | 21 +++++++++++++ jails/gubbhub/gubbshell/list-repos | 12 ++++++++ 5 files changed, 141 insertions(+) create mode 100644 jails/gubbhub/gubbshell/create-repo create mode 100644 jails/gubbhub/gubbshell/delete-repo create mode 100644 jails/gubbhub/gubbshell/edit-repo create mode 100644 jails/gubbhub/gubbshell/help create mode 100644 jails/gubbhub/gubbshell/list-repos (limited to 'jails/gubbhub/gubbshell') 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 < "$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 /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 -- cgit v1.2.3