#!/bin/bash # Add data analyst with read access to data # Usage: sudo add-analyst username "ssh-public-key" [--private] set -euo pipefail if [[ $EUID -ne 0 ]]; then echo "This script must be run as root (use sudo)" exit 1 fi if [[ $# -lt 2 ]]; then echo "Usage: sudo add-analyst username \"ssh-public-key\" [--private]" echo "" echo "Options:" echo " --private Grant access to private/sensitive data" echo "" echo "Examples:" echo " sudo add-analyst novak \"ssh-rsa AAAAB3... novak@example.com\"" echo " sudo add-analyst ceo \"ssh-rsa AAAAB3... ceo@example.com\" --private" exit 1 fi USERNAME="$1" SSH_KEY="$2" PRIVATE_ACCESS=false if [[ "${3:-}" == "--private" ]]; then PRIVATE_ACCESS=true fi # Check if user already exists if id "$USERNAME" &>/dev/null; then echo "Error: User '$USERNAME' already exists" exit 1 fi echo "Creating analyst user: $USERNAME" # Create user with home directory useradd -m -s /bin/bash "$USERNAME" # Add to dataread group (public data access) usermod -aG dataread "$USERNAME" # Optionally add to data-private group if [[ "$PRIVATE_ACCESS" == true ]]; then usermod -aG data-private "$USERNAME" fi # Set up SSH key mkdir -p "/home/${USERNAME}/.ssh" echo "$SSH_KEY" > "/home/${USERNAME}/.ssh/authorized_keys" chmod 700 "/home/${USERNAME}/.ssh" chmod 600 "/home/${USERNAME}/.ssh/authorized_keys" chown -R "${USERNAME}:${USERNAME}" "/home/${USERNAME}/.ssh" # Create server/ directory with symlinks to shared read-only data mkdir -p "/home/${USERNAME}/server" ln -sf /data/docs "/home/${USERNAME}/server/docs" ln -sf /data/scripts "/home/${USERNAME}/server/scripts" ln -sf /data/examples "/home/${USERNAME}/server/examples" ln -sf /data/src_data/parquet "/home/${USERNAME}/server/parquet" ln -sf /data/src_data/metadata "/home/${USERNAME}/server/metadata" # Jira attachments (optional dataset - symlink only if directory exists) if [[ -d /data/src_data/raw/jira/attachments ]]; then ln -sf /data/src_data/raw/jira/attachments "/home/${USERNAME}/server/jira_attachments" fi # Create user/ directories (writable by user) mkdir -p "/home/${USERNAME}/user/notifications" mkdir -p "/home/${USERNAME}/user/artifacts" mkdir -p "/home/${USERNAME}/user/scripts" mkdir -p "/home/${USERNAME}/user/parquet" mkdir -p "/home/${USERNAME}/user/sessions" mkdir -p "/home/${USERNAME}/user/duckdb" # Create notifications runner state directories mkdir -p "/home/${USERNAME}/.notifications/state" mkdir -p "/home/${USERNAME}/.notifications/logs" # Set ownership chown -R "${USERNAME}:${USERNAME}" "/home/${USERNAME}/server" chown -R "${USERNAME}:${USERNAME}" "/home/${USERNAME}/user" chown -R "${USERNAME}:${USERNAME}" "/home/${USERNAME}/.notifications" # Build per-user DuckDB from shared parquet files if [[ -x /data/scripts/setup_views.sh ]]; then echo "Building DuckDB database..." sudo -u "$USERNAME" bash -c "cd /home/${USERNAME} && /data/scripts/setup_views.sh" || true fi echo "" if [[ "$PRIVATE_ACCESS" == true ]]; then echo "Privileged analyst '$USERNAME' created successfully" echo " - Added to group: dataread (public data access)" echo " - Added to group: data-private (private data access)" else echo "Standard analyst '$USERNAME' created successfully" echo " - Added to group: dataread (public data access)" fi echo " - Server data: /home/${USERNAME}/server/ (read-only symlinks)" echo " - User workspace: /home/${USERNAME}/user/ (your files)" echo " - DuckDB: /home/${USERNAME}/user/duckdb/analytics.duckdb"