Files
reverse-proxy/scripts/workspace-bootstrap/lib/common.sh
T
Andrey Lutsenko 834595df6b feat: workspace-bootstrap — init SSH/git/Cursor для Mac и Windows
Единый workspace.local.env для адресов и паролей, init-machine,
Set-GitRemotes, push-safe и check-no-secrets для политики kalinamall/github.
2026-06-14 19:34:52 +10:00

145 lines
4.0 KiB
Bash

#!/usr/bin/env bash
# Общие функции workspace-bootstrap
set -Eeuo pipefail
BOOTSTRAP_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
die() { echo "workspace-bootstrap: error: $*" >&2; exit 1; }
log() { echo "[bootstrap] $*"; }
load_workspace_env() {
local env_file="${WORKSPACE_ENV:-$BOOTSTRAP_ROOT/config/workspace.local.env}"
[[ -f $env_file ]] || die "нет $env_file — скопируйте config/workspace.local.env.example и заполните"
# shellcheck source=/dev/null
set -a
source "$env_file"
set +a
}
detect_os() {
case "$(uname -s)" in
Darwin) echo mac ;;
MINGW* | MSYS* | CYGWIN*) echo win ;;
*) echo linux ;;
esac
}
ssh_home() {
if [[ $(detect_os) == win ]]; then
if [[ -n ${HOME:-} ]]; then printf '%s/.ssh' "$HOME"
else printf '%s/.ssh' "$USERPROFILE"
fi
else
printf '%s/.ssh' "$HOME"
fi
}
projects_dir() {
local os
os=$(detect_os)
if [[ $os == mac ]]; then
# shellcheck disable=SC2086
eval echo "${PROJECTS_DIR_MAC:-$HOME/Documents/Cursor/Projects}"
elif [[ $os == win ]]; then
echo "${PROJECTS_DIR_WIN:-$HOME/Projects}"
else
eval echo "${PROJECTS_DIR_MAC:-$HOME/projects}"
fi
}
ssh_key_path() {
printf '%s/%s' "$(ssh_home)" "${SSH_KEY_BASENAME:-id_ed25519_kalinamall}"
}
expand_path() {
local p=$1
if [[ $p == ~* ]]; then
p="${p/#\~/$HOME}"
fi
printf '%s' "$p"
}
render_template() {
local template=$1 dest=$2
local key_path
key_path=$(ssh_key_path)
[[ -f $key_path ]] || key_path="${key_path}.example"
sed \
-e "s|__SSH_KEY_PATH__|$key_path|g" \
-e "s|__GITEA_KALINAMALL_HOST__|${GITEA_KALINAMALL_HOST}|g" \
-e "s|__GITEA_KALINAMALL_HOST_PUBLIC__|${GITEA_KALINAMALL_HOST_PUBLIC}|g" \
-e "s|__GITEA_KALINAMALL_SSH_PORT__|${GITEA_KALINAMALL_SSH_PORT}|g" \
-e "s|__GITEA_HOME_HOST__|${GITEA_HOME_HOST}|g" \
-e "s|__GITEA_HOME_HOST_PUBLIC__|${GITEA_HOME_HOST_PUBLIC}|g" \
-e "s|__GITEA_HOME_SSH_PORT__|${GITEA_HOME_SSH_PORT}|g" \
-e "s|__SSH_HAPROXY_IP__|${SSH_HAPROXY_IP}|g" \
-e "s|__SSH_HAPROXY_USER__|${SSH_HAPROXY_USER}|g" \
"$template" >"$dest"
}
merge_ssh_config() {
local block_file=$1
local ssh_config
ssh_config="$(ssh_home)/config"
mkdir -p "$(ssh_home)"
touch "$ssh_config"
if grep -q 'BEGIN WORKSPACE-BOOTSTRAP' "$ssh_config" 2>/dev/null; then
local tmp
tmp=$(mktemp)
awk '/# BEGIN WORKSPACE-BOOTSTRAP/{skip=1} !skip{print} /# END WORKSPACE-BOOTSTRAP/{skip=0}' "$ssh_config" >"$tmp"
mv "$tmp" "$ssh_config"
fi
{
echo ""
echo "# BEGIN WORKSPACE-BOOTSTRAP"
cat "$block_file"
echo "# END WORKSPACE-BOOTSTRAP"
} >>"$ssh_config"
chmod 600 "$ssh_config" 2>/dev/null || true
}
each_repo() {
local repos_file="$BOOTSTRAP_ROOT/config/repos.yaml"
[[ -f $repos_file ]] || die "missing $repos_file"
awk '
/^ - name:/ { if (n != "") print n, gh; n = $3; gh = 0 }
/github: true/ { gh = 1 }
/github: false/ { gh = 0 }
END { if (n != "") print n, gh }
' "$repos_file"
}
github_repo_name() {
local name=$1
local repos_file="$BOOTSTRAP_ROOT/config/repos.yaml"
local custom
custom=$(awk -v repo="$name" '
$0 ~ "- name: " repo { found=1; next }
found && /github_name:/ { print $2; exit }
' "$repos_file")
if [[ -n $custom ]]; then
echo "$custom"
else
echo "$name"
fi
}
kalinamall_remote_url() {
local repo=$1
printf 'ssh://git@%s:%s/%s/%s.git' \
"$GITEA_KALINAMALL_HOST" "$GITEA_KALINAMALL_SSH_PORT" "$GITEA_KALINAMALL_ORG" "$repo"
}
home_remote_url() {
local repo=$1
printf 'ssh://git@%s:%s/%s/%s.git' \
"$GITEA_HOME_HOST" "$GITEA_HOME_SSH_PORT" "$GITEA_HOME_ORG" "$repo"
}
github_remote_url() {
local repo=$1
local gh_name
gh_name=$(github_repo_name "$repo")
printf 'git@%s:%s/%s.git' 'github.com' "$GITHUB_USER" "$gh_name"
}