Make cdp and clone more generic. Add a simple toolbx utility. Refactor

zsh config to use new cdp and clone scripts.
This commit is contained in:
Hans Goor 2024-09-01 18:11:58 +02:00
parent f105f890ce
commit e5c10e3398
Signed by: eyedevelop
SSH key fingerprint: SHA256:Td89veptDEwCV8J3fjqnknNk7SbwzedYhauyC2nFBYg
9 changed files with 271 additions and 60 deletions

View file

@ -30,3 +30,15 @@ unset rc
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ] && [ -z "$SSH_CONNECTION" ]; then
exec tmux
fi
# Aliases
WORKSPACE_DIR="${HOME}/spaces/workspace"
export WORKSPACE_DIR
alias vi="neovim"
alias vim="neovim"
alias cdw="cd -- ${WORKSPACE_DIR}"
function cdp() {
cd -- "$(_cdp_path "$@")"
}

View file

@ -0,0 +1,3 @@
#!/bin/bash
COMMAND_DEPS=("bash")

View file

@ -0,0 +1,29 @@
#!/bin/bash
function _get_projects() {
( cd -- "${WORKSPACE_DIR}" && find . -mindepth 3 -maxdepth 3 -type d | sed 's|^\./||' )
}
function _cdp() {
if command -v fzf &>/dev/null; then
echo "${WORKSPACE_DIR}/$(_get_projects | fzf --query "$*")"
return
fi
readarray -t projects <<< "$(_get_projects)"
local filtered_projects
filtered_projects=()
for project in "${projects[@]}"; do
if [[ "${project}" == "$1"* ]]; then
filtered_projects+=("${project}")
fi
done
select project in "${filtered_projects[@]}"; do
echo "${WORKSPACE_DIR}/${project}"
break
done
}
_cdp "$@"

View file

@ -0,0 +1,31 @@
#!/bin/bash
function _clone() {
if [[ "$#" -lt 1 ]]; then
echo "[!] Missing URL to clone!" >&2
return 1
fi
local url="$1"
local forge owner repo
if [[ "${url}" =~ ^ssh:\/\/[a-zA-Z0-9_\-]+@([a-zA-Z0-9_.\-]+):[0-9]+/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)(.git)?$ ]]; then
forge="${BASH_REMATCH[1],,}"
owner="${BASH_REMATCH[2],,}"
repo="${BASH_REMATCH[3],,}"
elif [[ "${url}" =~ ^[a-zA-Z0-9_\-]+@([a-zA-Z0-9_.\-]+):([a-zA-Z0-9_\-]+)\/([a-zA-Z0-9_\-]+)(.git)?$ ]]; then
forge="${BASH_REMATCH[1],,}"
owner="${BASH_REMATCH[2],,}"
repo="${BASH_REMATCH[3],,}"
elif [[ "${url}" =~ ^https?:\/\/([a-zA-Z0-9_.\-]+)(:[0-9]+)?\/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)(.git)?$ ]]; then
forge="${BASH_REMATCH[1],,}"
owner="${BASH_REMATCH[3],,}"
repo="${BASH_REMATCH[4],,}"
else
echo "[!] Do not know how to handle ${url}!" >&2
return 1
fi
git clone "${url}" "${WORKSPACE_DIR}/${forge}/${owner}/${repo}"
}
_clone "$@"

View file

@ -0,0 +1,112 @@
#!/bin/bash
set -euo pipefail
TOOLBX_NAME="toolbx"
LIB_HOME="${HOME}/.local/share/eyedevelop/shell-utils/toolbx"
delete_toolbox() {
podman rm -f "${TOOLBX_NAME}"
}
create_toolbox() {
local image podman_args
image="debian:bookworm"
podman_args=(
"--name=${TOOLBX_NAME}"
"--hostuser=${USER}"
"--env=_REAL_USER=${USER}"
"--userns=keep-id"
"--security-opt=label=disable"
"--network=host"
"--hostname=toolbox"
"--volume=${HOME}:/home/${USER}"
"--user=root"
"--entrypoint=/entrypoint.sh"
)
while [[ "$#" -ge 1 ]]; do
case "$1" in
-i|--image)
image="$2"
shift
shift
;;
-p|--privileged)
podman_args+=("--privileged")
shift
;;
esac
done
podman_args+=("$image")
if podman container exists toolbx; then
echo "[!] Toolbx container already exists. Want to replace?"
echo -n "(Y/n) > "
read -r opt
if [[ "${opt,,}" == "n" ]]; then
echo "[!] Aborting."
return 1
fi
delete_toolbox
fi
podman create "${podman_args[@]}" >/dev/null
podman cp "${LIB_HOME}/container_setup.sh" "${TOOLBX_NAME}":/entrypoint.sh >/dev/null
podman cp "${LIB_HOME}/container_autoshell.sh" "${TOOLBX_NAME}":/autoshell.sh &>/dev/null
podman start "${TOOLBX_NAME}" >/dev/null
echo "[+] Created!"
}
enter_toolbox() {
if ! podman container exists "${TOOLBX_NAME}"; then
create_toolbox
fi
podman exec -it "${TOOLBX_NAME}" "/autoshell.sh" "${SHELL}"
}
print_usage() {
echo "--- Primitive container-based toolbox utility ---"
echo "Usage: $0 <command> <args>"
echo "Commands:"
echo " enter -- Enter the toolbox."
echo " create [opts] [command...] -- Create a new toolbox."
echo " -i|--image -- The image to use to create the toolbox with."
echo " -p|--privileged -- Whether the toolbox is privileged or not."
echo " delete -- Delete the current toolbox."
echo
echo "If no command is specified, enter is assumed."
}
if [[ "$#" -lt 1 ]]; then
print_usage
return 1
fi
while [[ "$#" -ge 1 ]]; do
COMMAND="$1"; shift
case "${COMMAND}" in
enter)
enter_toolbox "$@"
;;
create)
create_toolbox "$@"
;;
delete)
delete_toolbox "$@"
;;
*)
enter_toolbox "$@"
;;
esac
done

View file

@ -0,0 +1,30 @@
#!/bin/bash
set -euo pipefail
REAL_SHELL="$1"
install_shell() {
source /etc/os-release
case "${ID}" in
debian)
apt-get -y update && apt-get -y install "$(apt-file update &>/dev/null && apt-file search -l "${REAL_SHELL}" | head -n1 )"
;;
*)
echo "[!] Unsupported distro: ${NAME}" >&2
return 1
esac
}
start_shell() {
if command -v "${REAL_SHELL}" &>/dev/null; then
exec su -s "${REAL_SHELL}" - "${_REAL_USER}"
else
exec su -s "/bin/bash" - "${_REAL_USER}"
fi
}
install_shell >/dev/null || true
start_shell "$@"

View file

@ -0,0 +1,48 @@
#!/bin/bash
set -euo pipefail
trap 'exit 0' SIGTERM SIGINT
if [[ "$#" -gt 1 ]] && [[ "$1" == /autoshell.sh ]]; then
exec /autoshell.sh "$@"
fi
install_deps() {
if [[ -f /.pkg-installed ]]; then
return 0
fi
if [[ ! -f /etc/os-release ]]; then
echo "[!] Unsupported container image!" >&2
return 1
fi
source /etc/os-release
case "${ID}" in
debian)
apt-get -y update && apt-get -y install \
sudo iproute2 man bash-completion net-tools git passwd util-linux apt-utils apt-file
;;
*)
echo "[!] Unsupported distro: ${NAME}" >&2
return 1
esac
touch /.pkg-installed
}
create_user() {
echo "${_REAL_USER} ALL=(root) NOPASSWD: ALL" > /etc/sudoers.d/toolbx
}
install_deps
create_user
echo "127.0.1.1 $(hostname -f) $(hostname)" >> /etc/hosts
echo "[!] Done with setup!"
while true; do
sleep 86400
done

View file

@ -2,3 +2,9 @@
alias vi="nvim"
alias vim="nvim"
alias cdw="cd \${WORKSPACE_DIR}"
function cdp() {
cd -- "$(_cdp_path "$@")"
}

View file

@ -1,60 +0,0 @@
#!/bin/bash
alias cdw="cd ${WORKSPACE_DIR}"
function _get_projects() {
( cd -- "${WORKSPACE_DIR}" && find . -mindepth 3 -maxdepth 3 -type d | sed 's|^\./||' )
}
function cdp() {
if command -v fzf &>/dev/null; then
cd -- "${WORKSPACE_DIR}/$(_get_projects | fzf --query "$*")"
return
fi
local projects=( "${(@f)$( _get_projects )}" )
if [[ "$#" -gt 0 ]]; then
projects=( "${(@Mb)projects:#*${1}*}" )
fi
select project in "${projects[@]}"; do
cd -- "${WORKSPACE_DIR}/${project}"
break
done
}
function _cdp_comp() {
local projects=( "${(@f)$( _get_projects )}" )
compset -P '*\/'
_describe "${projects[@]}"
}
compdef _cdp_comp cdp
function clone() {
if [[ "$#" -lt 1 ]]; then
echo "[!] Missing URL to clone!" >&2
return 1
fi
local url="$1"
local forge owner repo
if [[ "${url}" =~ ^ssh:\/\/[a-zA-Z0-9_\-]+@([a-zA-Z0-9_.\-]+):[0-9]+/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)(.git)?$ ]]; then
forge="${match[1]:l}"
owner="${match[2]:l}"
repo="${match[3]:l}"
elif [[ "${url}" =~ ^[a-zA-Z0-9_\-]+@([a-zA-Z0-9_.\-]+):([a-zA-Z0-9_\-]+)\/([a-zA-Z0-9_\-]+)(.git)?$ ]]; then
forge="${match[1]:l}"
owner="${match[2]:l}"
repo="${match[3]:l}"
elif [[ "${url}" =~ ^https?:\/\/([a-zA-Z0-9_.\-]+)(:[0-9]+)?\/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)(.git)?$ ]]; then
forge="${match[1]:l}"
owner="${match[3]:l}"
repo="${match[4]:l}"
else
echo "[!] Do not know how to handle ${url}!" >&2
return 1
fi
git clone "${url}" "${WORKSPACE_DIR}/${forge}/${owner}/${repo}"
}