From 854126bb4b19c1059847f5a96991960ebfc3aa3d Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Wed, 18 Jun 2025 00:29:11 +0200 Subject: [PATCH] Add some shell functions as shellib for task files --- kanidm-eval/dot-config/tasks | 78 +++++++++++++++++------- shellib/dot-local/lib/shellib/tasklib.sh | 74 ++++++++++++++++++++++ 2 files changed, 129 insertions(+), 23 deletions(-) create mode 100644 shellib/dot-local/lib/shellib/tasklib.sh diff --git a/kanidm-eval/dot-config/tasks b/kanidm-eval/dot-config/tasks index a7469b8..7929faa 100755 --- a/kanidm-eval/dot-config/tasks +++ b/kanidm-eval/dot-config/tasks @@ -1,5 +1,37 @@ #!/usr/bin/env bash +# Configuration variables with defaults +# URLs and remote resources +KANIDM_SERVER_CONFIG_URL="${KANIDM_SERVER_CONFIG_URL:-https://raw.githubusercontent.com/kanidm/kanidm/master/examples/server.toml}" +KANIDM_DOCKER_IMAGE="${KANIDM_DOCKER_IMAGE:-docker.io/kanidm/server:latest}" + +# File paths +SERVER_CONFIG_FILE="${SERVER_CONFIG_FILE:-server.toml}" +SERVER_LOCALHOST_CONFIG="${SERVER_LOCALHOST_CONFIG:-server_localhost.toml}" +CLIENT_CONFIG_FILE="${CLIENT_CONFIG_FILE:-./kanidm}" + +# Container and volume settings +CONTAINER_NAME="${CONTAINER_NAME:-kanidmd}" +VOLUME_NAME="${VOLUME_NAME:-kanidmd}" +CONTAINER_DATA_PATH="${CONTAINER_DATA_PATH:-/data}" + +# Network settings +HTTPS_PORT="${HTTPS_PORT:-8443}" +LDAP_PORT="${LDAP_PORT:-3636}" +KANIDM_URI="${KANIDM_URI:-https://localhost:8443}" + +# Domain settings +ORIGINAL_DOMAIN="${ORIGINAL_DOMAIN:-idm.example.com}" +TARGET_DOMAIN="${TARGET_DOMAIN:-localhost}" + +# Account names +ADMIN_ACCOUNT="${ADMIN_ACCOUNT:-admin}" +IDM_ADMIN_ACCOUNT="${IDM_ADMIN_ACCOUNT:-idm_admin}" + +# Package lists +FEDORA_SYSTEM_DEPS="${FEDORA_SYSTEM_DEPS:-systemd-devel sqlite-devel openssl-devel pam-devel clang lld}" +FEDORA_WEBUI_DEPS="${FEDORA_WEBUI_DEPS:-perl-FindBin perl-File-Compare}" + fedora_build_notes () { echo "NOTE: clang and lld are required to build Kanidm for performance" @@ -7,27 +39,27 @@ fedora_build_notes () { } install_system_lib_deps_fedora () { - dnf install systemd-devel sqlite-devel openssl-devel pam-devel clang lld + dnf install ${FEDORA_SYSTEM_DEPS} } install_webui_additional_pkgs () { - dnf install perl-FindBin perl-File-Compare + dnf install ${FEDORA_WEBUI_DEPS} } get_server_dev_config () { - wget https://raw.githubusercontent.com/kanidm/kanidm/master/examples/server.toml + wget "${KANIDM_SERVER_CONFIG_URL}" } make_localhost_config () { - if [[ -f server.toml ]];then - sed 's/idm\.example\.com/localhost/g' server.toml > server_localhost.toml + if [[ -f "${SERVER_CONFIG_FILE}" ]];then + sed "s/${ORIGINAL_DOMAIN}/${TARGET_DOMAIN}/g" "${SERVER_CONFIG_FILE}" > "${SERVER_LOCALHOST_CONFIG}" else - echo "First get example server.toml!" + echo "First get example ${SERVER_CONFIG_FILE}!" fi } get_the_software () { - podman pull docker.io/kanidm/server:latest + podman pull "${KANIDM_DOCKER_IMAGE}" } create_eval_config () { @@ -36,40 +68,40 @@ create_eval_config () { create_kanidmd_volume () { # First create volume for the data! - podman volume create kanidmd + podman volume create "${VOLUME_NAME}" } start_eval_container () { - create_kanidmd_volume && podman create --name kanidmd \ - -p '8443:8443' \ - -p '3636:3636' \ - -v kanidmd:/data \ - docker.io/kanidm/server:latest + create_kanidmd_volume && podman create --name "${CONTAINER_NAME}" \ + -p "${HTTPS_PORT}:${HTTPS_PORT}" \ + -p "${LDAP_PORT}:${LDAP_PORT}" \ + -v "${VOLUME_NAME}:${CONTAINER_DATA_PATH}" \ + "${KANIDM_DOCKER_IMAGE}" } copy_config_to_container () { - podman cp server_localhost.toml kanidmd:/data/server.toml + podman cp "${SERVER_LOCALHOST_CONFIG}" "${CONTAINER_NAME}:${CONTAINER_DATA_PATH}/${SERVER_CONFIG_FILE}" } generate_eval_certs () { - podman run --rm -i -t -v kanidmd:/data \ - docker.io/kanidm/server:latest \ + podman run --rm -i -t -v "${VOLUME_NAME}:${CONTAINER_DATA_PATH}" \ + "${KANIDM_DOCKER_IMAGE}" \ kanidmd cert-generate } recover_admin_pw () { - podman exec -i -t kanidmd \ - kanidmd recover-account admin + podman exec -i -t "${CONTAINER_NAME}" \ + kanidmd recover-account "${ADMIN_ACCOUNT}" } recover_idm_admin_pw () { - podman exec -i -t kanidmd \ - kanidmd recover-account idm_admin + podman exec -i -t "${CONTAINER_NAME}" \ + kanidmd recover-account "${IDM_ADMIN_ACCOUNT}" } setup_eval_client_config () { - cat <<'EOF' > ./kanidm -uri = "https://localhost:8443" + cat < "${CLIENT_CONFIG_FILE}" +uri = "${KANIDM_URI}" verify_ca = false EOF } @@ -78,7 +110,7 @@ check_can_login () { if ! command -v kanidm > /dev/null; then echo "First install kanidm client tools!" else - kanidm login --name idm_admin + kanidm login --name "${IDM_ADMIN_ACCOUNT}" fi } diff --git a/shellib/dot-local/lib/shellib/tasklib.sh b/shellib/dot-local/lib/shellib/tasklib.sh new file mode 100644 index 0000000..5c90317 --- /dev/null +++ b/shellib/dot-local/lib/shellib/tasklib.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +# Task library - provides help functionality for task files + +# List all functions defined in the current environment +list_functions() { + declare -F | awk '{print $3}' +} + +# Extract usage information from a function +get_function_usage() { + local func_name="$1" + local file="${2:-$0}" + + # Get the function definition and extract Usage: comments + awk -v func="$func_name" ' + /^[[:space:]]*'"$func_name"'[[:space:]]*\(\)/ { + in_func = 1 + next + } + in_func && /^[[:space:]]*}[[:space:]]*$/ { + in_func = 0 + } + in_func && /^[[:space:]]*#[[:space:]]*Usage:/ { + sub(/^[[:space:]]*#[[:space:]]*/, "", $0) + print $0 + } + ' "$file" +} + +# Display help for all functions in a task file +show_task_help() { + local file="${1:-$0}" + local func_list=$(list_functions | sort) + + echo "Available tasks:" + echo "================" + echo + + for func in $func_list; do + # Skip internal functions and the help function itself + if [[ ! "$func" =~ ^(_|show_task_help|list_functions|get_function_usage) ]]; then + local usage=$(get_function_usage "$func" "$file") + if [[ -n "$usage" ]]; then + printf "%-30s %s\n" "$func" "- $usage" + else + printf "%-30s\n" "$func" + fi + fi + done + echo + echo "Run any task by calling it directly: ./tasks " +} + +# Alternative: Show detailed help for a specific function +show_function_help() { + local func_name="$1" + local file="${2:-$0}" + + if ! declare -f "$func_name" >/dev/null 2>&1; then + echo "Error: Function '$func_name' not found" >&2 + return 1 + fi + + echo "Help for: $func_name" + echo "===================" + + local usage=$(get_function_usage "$func_name" "$file") + if [[ -n "$usage" ]]; then + echo "$usage" + else + echo "No usage information available" + fi +} \ No newline at end of file