#!/bin/bash set -euo pipefail IFS=$'\n\t' # ──────────────── # Configuration # ──────────────── GIT_REMOTE_NAME="gitlab" REPO_NAME=$(basename "$(pwd)") DEFAULT_NAME="Mark Randall Havens" DEFAULT_EMAIL="mark.r.havens@gmail.com" GITLAB_WEB="https://gitlab.com" GITLAB_API="$GITLAB_WEB/api/v4" GITLAB_SSH="git@gitlab.com" TOKEN_FILE="$HOME/.gitfield_token" SCRIPT_VERSION="1.0" info() { echo -e "\e[1;34m[INFO]\e[0m $*"; } warn() { echo -e "\e[1;33m[WARN]\e[0m $*"; } error() { echo -e "\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; } RESET_TOKEN=false if [[ "${1:-}" == "--reset-token" ]]; then RESET_TOKEN=true rm -f "$TOKEN_FILE" info "Token reset requested." fi if [ -f "$TOKEN_FILE" ] && [ "$RESET_TOKEN" = false ]; then TOKEN=$(<"$TOKEN_FILE") info "Using cached token from $TOKEN_FILE" else echo echo "🔐 Paste your GitLab Personal Access Token (scopes: api, read_user, write_repository, write_ssh_key)" echo "→ Generate at: $GITLAB_WEB/-/user_settings/personal_access_tokens" read -rp "🔑 Token: " TOKEN echo "$TOKEN" > "$TOKEN_FILE" chmod 600 "$TOKEN_FILE" info "Token saved for future use at $TOKEN_FILE" fi sudo apt update -qq sudo apt install -y git curl jq openssh-client lsb-release || error "Tool install failed" # Identity git config --global user.name "$DEFAULT_NAME" git config --global user.email "$DEFAULT_EMAIL" info "Git identity set to: $DEFAULT_NAME <$DEFAULT_EMAIL>" if [ ! -d .git ]; then git init git add . git commit -m "Initial commit" fi if ! git rev-parse HEAD &>/dev/null; then git add . && git commit -m "Initial commit" || warn "Nothing to commit" fi # SSH Setup if [ ! -f ~/.ssh/id_rsa ]; then ssh-keygen -t rsa -b 4096 -C "$DEFAULT_EMAIL" -f ~/.ssh/id_rsa -N "" || error "SSH keygen failed" fi eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa || error "Failed to add SSH key" USERNAME=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_API/user" | jq -r '.username') || error "Invalid token" info "GitLab username: $USERNAME" if ! ssh -T "$GITLAB_SSH" 2>&1 | grep -q "Welcome"; then PUBKEY=$(<~/.ssh/id_rsa.pub) TITLE="AutoKey-$(hostname)-$(date +%s)" curl -s --fail -X POST "$GITLAB_API/user/keys" \ -H "PRIVATE-TOKEN: $TOKEN" \ -H "Content-Type: application/json" \ -d "{\"title\": \"$TITLE\", \"key\": \"$PUBKEY\"}" || warn "SSH key upload may have failed" sleep 2 fi if ! git remote get-url "$GIT_REMOTE_NAME" &>/dev/null; then curl -s --fail -X POST "$GITLAB_API/projects" \ -H "PRIVATE-TOKEN: $TOKEN" \ -H "Content-Type: application/json" \ -d "{\"name\": \"$REPO_NAME\", \"visibility\": \"public\"}" REMOTE_URL="$GITLAB_SSH:$USERNAME/$REPO_NAME.git" git remote add "$GIT_REMOTE_NAME" "$REMOTE_URL" info "Remote set to: $REMOTE_URL" else info "Remote already configured: $(git remote get-url "$GIT_REMOTE_NAME")" fi # Metadata Block MARKDOWN_FILE=".gitlab-link.md" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') DEFAULT_BRANCH=$(git symbolic-ref --short HEAD) REPO_PATH=$(pwd) LATEST_SHA=$(git rev-parse HEAD) LAST_COMMIT_MSG=$(git log -1 --pretty=format:"%s") LAST_COMMIT_DATE=$(git log -1 --pretty=format:"%ad") LAST_COMMIT_AUTHOR=$(git log -1 --pretty=format:"%an <%ae>") TOTAL_COMMITS=$(git rev-list --count HEAD) TRACKED_FILES=$(git ls-files | wc -l) UNCOMMITTED=$(if ! git diff --quiet || ! git diff --cached --quiet; then echo "Yes"; else echo "No"; fi) LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "None") HOSTNAME=$(hostname) CURRENT_USER=$(whoami) TIMEZONE=$(date +%Z) OS_NAME=$(uname -s) KERNEL_VERSION=$(uname -r) ARCHITECTURE=$(uname -m) OS_PRETTY_NAME=$(grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"') || OS_PRETTY_NAME="Unknown" DOCKER_CHECK=$(grep -qE '/docker|/lxc' /proc/1/cgroup 2>/dev/null && echo "Yes" || echo "No") WSL_CHECK=$(grep -qi microsoft /proc/version 2>/dev/null && echo "Yes" || echo "No") VM_CHECK=$(systemd-detect-virt 2>/dev/null || echo "Unknown") UPTIME=$(uptime -p 2>/dev/null || echo "Unknown") MAC_ADDR=$(ip link | awk '/ether/ {print $2}' | head -n 1) LOCAL_IP=$(hostname -I | awk '{print $1}') CPU_MODEL=$(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2 | sed 's/^ //') RAM_GB=$(awk '/MemTotal/ {printf "%.2f", $2/1024/1024}' /proc/meminfo) WEB_LINK="$GITLAB_WEB/$USERNAME/$REPO_NAME" cat > "$MARKDOWN_FILE" <