about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMunyoki Kilyungi2025-04-22 14:21:19 +0300
committerMunyoki Kilyungi2025-04-22 14:21:19 +0300
commit0ddfd46eaace5835b2cb6a85dbd027bf4563b0c6 (patch)
treeb60f7bb91abcbd245e272e5948cb7ac7e7869089
parentc748aea1d4518a2f22244eed456dfb222b80c36d (diff)
downloadgn-machines-0ddfd46eaace5835b2cb6a85dbd027bf4563b0c6.tar.gz
Rewrite container setup script for local development.
-rwxr-xr-xgenenetwork-local-container.sh211
1 files changed, 162 insertions, 49 deletions
diff --git a/genenetwork-local-container.sh b/genenetwork-local-container.sh
index 07d0662..ca67d4a 100755
--- a/genenetwork-local-container.sh
+++ b/genenetwork-local-container.sh
@@ -19,63 +19,176 @@
 # along with genenetwork-machines.  If not, see
 # <https://www.gnu.org/licenses/>.
 
-# Build and install genenetwork production container on tux02.
-
-system_directories=("$HOME"/genenetwork/var/log
-		    "$HOME"/genenetwork/var/genenetwork
-		    "$HOME"/genenetwork/etc/genenetwork/conf
-		    "$HOME"/genenetwork/etc/genenetwork
-		    "$HOME"/genenetwork/var/lib/redis
-		    "$HOME"/genenetwork/var/lib/virtuoso
-		    "$HOME"/genenetwork/var/lib/xapian
-		    "$HOME"/genenetwork/var/lib/genenetwork-sqlite
-		    "$HOME"/genenetwork/var/lib/genenetwork-gnqa
-		    /tmp/local-container)
-
-for dir in "${system_directories[@]}"; do
-    if [[ ! -d $dir ]]; then
-	mkdir -p $dir
+# Build and install genenetwork container on your local machine.
+
+set -euo pipefail
+
+
+BASE_DIR="${HOME:-/home/$USER}/genenetwork"
+SYSTEM_DIRECTORIES=(
+    "$BASE_DIR/var/log"
+    "$BASE_DIR/var/genenetwork"
+    "$BASE_DIR/etc/genenetwork/conf"
+    "$BASE_DIR/etc/genenetwork"
+    "$BASE_DIR/var/lib/redis"
+    "$BASE_DIR/var/lib/virtuoso"
+    "$BASE_DIR/var/lib/xapian"
+    "$BASE_DIR/var/lib/genenetwork-sqlite"
+    "$BASE_DIR/var/lib/genenetwork-gnqa"
+    "/tmp/local-container"
+)
+
+GN_PROJECTS=(
+    "genenetwork2:git@github.com:genenetwork/genenetwork2"
+    "genenetwork3:git@github.com:genenetwork/genenetwork3"
+    "gn-auth:https://git.genenetwork.org/gn-auth"
+    "gn-docs:https://git.genenetwork.org/gn-docs"
+)
+
+CONTAINER_SCM="genenetwork-local-container.scm"
+CONTAINER_BIN="/usr/local/bin/genenetwork-local-container"
+GC_ROOT="/var/guix/gcroots/genenetwork-local-container"
+
+log() {
+    local level="$1"
+    shift
+    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $level: $*" >&2
+}
+
+# Check dependencies
+for cmd in git guix sudo; do
+    if ! command -v "$cmd" &>/dev/null; then
+        log "ERROR" "Required command '$cmd' not found"
+        exit 1
     fi
 done
 
-gn_projects=(genenetwork2 genenetwork3)
-for project in "${gn_projects[@]}"; do
-    dir="${HOME}/genenetwork/${project}"
-    if [[ ! -d $dir ]]; then
-	git clone "git@github.com:genenetwork/${project}" $dir
+# Validate HOME is set
+if [ -z "${HOME:-}" ]; then
+    log "ERROR" "HOME environment variable is not set"
+    exit 1
+fi
+
+log "INFO" "Creating system directories..."
+for dir in "${SYSTEM_DIRECTORIES[@]}"; do
+    # Check if directory exists and is accessible
+    if [ -d "$dir" ]; then
+        if [ -w "$dir" ]; then
+            log "DEBUG" "Directory exists and is writable: $dir"
+        else
+            log "WARNING" "Directory exists but is not writable: $dir"
+        fi
+        continue
+    fi
+
+    # Attempt to create directory
+    log "INFO" "Creating directory: $dir"
+    if [ -w "$(dirname "$dir")" ]; then
+        # Parent directory is writable, try without sudo
+        if ! mkdir -p "$dir"; then
+            log "ERROR" "Failed to create directory without sudo: $dir"
+            exit 1
+        fi
+    else
+        # Parent directory requires root, use sudo
+        if ! sudo mkdir -p "$dir"; then
+            log "ERROR" "Failed to create directory with sudo: $dir"
+            exit 1
+        fi
+        # Set ownership to current user if created with sudo
+        if ! sudo chown "$USER:$USER" "$dir"; then
+            log "WARNING" "Failed to set ownership for: $dir"
+        fi
     fi
 done
 
-if [[ ! -d "${HOME}/genenetwork/gn-auth" ]]; then
-    git clone "https://git.genenetwork.org/gn-auth" "${HOME}/genenetwork/gn-auth"
-fi
+is_git_repository() {
+    local dir="$1"
+    # Check for standard repository
+    if [ -d "$dir/.git" ]; then
+        if [ -f "$dir/.git/HEAD" ] && [ -d "$dir/.git/refs" ]; then
+            log "DEBUG" "Detected standard Git repository: $dir"
+            return 0
+        else
+            log "ERROR" "Directory $dir/.git exists but is not a valid Git repository"
+            return 1
+        fi
+    # Check for bare repository
+    elif [ -f "$dir/HEAD" ] && [ -d "$dir/refs" ] && [ -d "$dir/objects" ]; then
+        log "DEBUG" "Detected bare Git repository: $dir"
+        return 0
+    else
+        log "ERROR" "$dir exists but is not a Git repository (neither standard nor bare)"
+        return 1
+    fi
+}
+# Clone GeneNetwork projects
+log "INFO" "Cloning GeneNetwork projects..."
+for project_entry in "${GN_PROJECTS[@]}"; do
+    IFS=':' read -r project repo_url <<< "$project_entry"
+    dir="$BASE_DIR/$project"
+    if [ ! -d "$dir" ]; then
+        log "INFO" "Cloning $project from $repo_url to $dir"
+        if ! git clone "$repo_url" "$dir"; then
+            log "ERROR" "Failed to clone $project"
+            exit 1
+        fi
+    else
+        log "DEBUG" "Directory exists, skipping clone: $dir"
+        if ! is_git_repository "$dir"; then
+            log "ERROR" "$dir exists but is not a Git repository"
+            exit 1
+        fi
+    fi
+done
 
-if [[ ! -d "${HOME}/genenetwork/gn-docs" ]]; then
-    git clone --bare "https://git.genenetwork.org/gn-docs" "${HOME}/genenetwork/gn-docs"
+# Verify container SCM file exists
+if [ ! -f "$CONTAINER_SCM" ]; then
+    log "ERROR" "Container SCM file not found: $CONTAINER_SCM"
+    exit 1
 fi
 
+# Create Guix system container
+log "INFO" "Creating Guix system container..."
+SHARE_OPTS=(
+    "--share=$BASE_DIR/var/log=/var/log"
+    "--share=$BASE_DIR/var/genenetwork=/var/genenetwork"
+    "--share=$BASE_DIR/etc/genenetwork/conf=/etc/genenetwork/conf"
+    "--share=$BASE_DIR/etc/genenetwork=/etc/genenetwork"
+    "--share=$BASE_DIR/var/lib/redis=/var/lib/redis"
+    "--share=$BASE_DIR/var/lib/virtuoso=/var/lib/virtuoso"
+    "--share=$BASE_DIR/genenetwork2=/genenetwork2"
+    "--share=$BASE_DIR/genenetwork3=/genenetwork3"
+    "--share=$BASE_DIR/gn-auth=/gn-auth"
+    "--share=$BASE_DIR/var/lib/xapian=/var/lib/xapian"
+    "--share=$BASE_DIR/var/lib/genenetwork-sqlite=/var/lib/genenetwork-sqlite"
+    "--share=$BASE_DIR/var/lib/genenetwork-gnqa=/var/lib/genenetwork-gnqa"
+    "--share=/tmp/local-container=/tmp"
+    "--share=$BASE_DIR/gn-docs=/var/lib/gn-docs"
+    "--share=/run/mysqld=/run/mysqld"
+)
+
 container_script=$(guix system container \
-			--network \
-			--load-path=. \
-			--verbosity=3 \
-			--share="$HOME"/genenetwork/var/log=/var/log \
-			--share="$HOME"/genenetwork/var/genenetwork=/var/genenetwork \
-			--share="$HOME"/genenetwork/etc/genenetwork/conf=/etc/genenetwork/conf \
-			--share="$HOME"/genenetwork/etc/genenetwork=/etc/genenetwork \
-			--share="$HOME"/genenetwork/var/lib/redis=/var/lib/redis \
-			--share="$HOME"/genenetwork/var/lib/virtuoso/=/var/lib/virtuoso \
-			--share="$HOME"/genenetwork/genenetwork2=/genenetwork2 \
-			--share="$HOME"/genenetwork/genenetwork3=/genenetwork3 \
-			--share="$HOME"/genenetwork/gn-auth=/gn-auth \
-			--share="$HOME"/genenetwork/var/lib/xapian=/var/lib/xapian \
-			--share="$HOME"/genenetwork/var/lib/genenetwork-sqlite=/var/lib/genenetwork-sqlite \
-			--share="$HOME"/genenetwork/var/lib/genenetwork-gnqa=/var/lib/genenetwork-gnqa \
-			--share=/tmp/local-container=/tmp \
-			--share="$HOME"/genenetwork/gn-docs=/var/lib/gn-docs \
-			--share=/run/mysqld=/run/mysqld \
-			genenetwork-local-container.scm)
-
-echo $container_script
-sudo ln --force --symbolic $container_script /usr/local/bin/genenetwork-local-container
-sudo ln --force --symbolic /usr/local/bin/genenetwork-local-container /var/guix/gcroots
+    --network \
+    --load-path=. \
+    --verbosity=3 \
+    "${SHARE_OPTS[@]}" \
+    "$CONTAINER_SCM")
+
+log $container_script
+
+# Create symbolic links
+log "INFO" "Creating symbolic links..."
+if ! sudo ln -sf "$container_script" "$CONTAINER_BIN"; then
+    log "ERROR" "Failed to create symbolic link: $CONTAINER_BIN"
+    exit 1
+fi
+
+if ! sudo ln -sf "$container_script" "$GC_ROOT"; then
+    log "ERROR" "Failed to create GC root link: $GC_ROOT"
+    exit 1
+fi
 
+log "INFO" "Setup completed successfully!"
+log "INFO" "Container script: $container_script"
+log "INFO" "Run with: $CONTAINER_BIN"