173 lines
No EOL
6.9 KiB
Bash
Executable file
173 lines
No EOL
6.9 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
install_lightning_pub() {
|
|
local REPO_URL="$1"
|
|
# Defined exit codes for this function:
|
|
# 0: Fresh install success (triggers service start)
|
|
# 100: Upgrade success (triggers service restart)
|
|
# 2: No-op (already up-to-date, skip services)
|
|
# Other: Error
|
|
local upgrade_status=0
|
|
|
|
if [ -z "$REPO_URL" ]; then
|
|
log "REPO_URL missing"
|
|
return 1
|
|
fi
|
|
|
|
local EXTRACT_DIR=$(mktemp -d)
|
|
|
|
USER_HOME=$HOME
|
|
USER_NAME=$(whoami)
|
|
|
|
download "$REPO_URL" "$USER_HOME/lightning_pub.tar.gz" > /dev/null 2>&1 || {
|
|
log "${PRIMARY_COLOR}Failed to download Lightning.Pub.${RESET_COLOR}"
|
|
return 1
|
|
}
|
|
|
|
tar -xzf $USER_HOME/lightning_pub.tar.gz -C "$EXTRACT_DIR" --strip-components=1 > /dev/null 2>&1 || {
|
|
log "${PRIMARY_COLOR}Failed to extract Lightning.Pub.${RESET_COLOR}"
|
|
rm -rf "$EXTRACT_DIR"
|
|
return 1
|
|
}
|
|
rm $USER_HOME/lightning_pub.tar.gz
|
|
|
|
# Decide flow based on whether a valid previous installation exists.
|
|
if [ -f "$INSTALL_DIR/.installed_commit" ] || [ -f "$INSTALL_DIR/db.sqlite" ]; then
|
|
# --- UPGRADE PATH ---
|
|
log "Existing ${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR} installation found. Checking for updates..."
|
|
|
|
# Check if update is needed by comparing commit hashes
|
|
API_RESPONSE=$(download_stdout "https://api.github.com/repos/${REPO}/commits/${BRANCH}" 2>&1 | tee /tmp/api_response.log)
|
|
if grep -q '"message"[[:space:]]*:[[:space:]]*"API rate limit exceeded"' <<< "$API_RESPONSE"; then
|
|
log_error "GitHub API rate limit exceeded. Please wait a while before trying again." 1
|
|
fi
|
|
LATEST_COMMIT=$(echo "$API_RESPONSE" | awk -F'[/"]' '/"html_url": ".*\/commit\// {print $(NF-1); exit}')
|
|
if [ -z "$LATEST_COMMIT" ]; then
|
|
log_error "Could not retrieve latest version from GitHub. Upgrade check failed. Aborting." 1
|
|
fi
|
|
|
|
CURRENT_COMMIT=$(cat "$INSTALL_DIR/.installed_commit" 2>/dev/null | head -c 40)
|
|
if [ "$CURRENT_COMMIT" = "$LATEST_COMMIT" ]; then
|
|
log "${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR} is already at the latest commit. No update needed."
|
|
rm -rf "$EXTRACT_DIR"
|
|
return 2
|
|
fi
|
|
|
|
log "${PRIMARY_COLOR}Upgrading${RESET_COLOR} ${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR} installation..."
|
|
upgrade_status=100
|
|
|
|
# Stop the service if running to avoid rug-pull during backup and file replacement
|
|
was_running=false
|
|
if [ "$SYSTEMCTL_CMD" = "systemctl --user" ] && systemctl --user is-active --quiet lightning_pub 2>/dev/null; then
|
|
log "Stopping Lightning.Pub service before upgrade..."
|
|
systemctl --user stop lightning_pub
|
|
was_running=true
|
|
elif [ "$SYSTEMCTL_CMD" = "systemctl" ] && systemctl is-active --quiet lightning_pub 2>/dev/null; then
|
|
log "Stopping Lightning.Pub service before upgrade..."
|
|
systemctl stop lightning_pub
|
|
was_running=true
|
|
fi
|
|
|
|
log "Backing up user data before upgrade..."
|
|
BACKUP_DIR=$(mktemp -d)
|
|
mv "$INSTALL_DIR" "$BACKUP_DIR"
|
|
BACKUP_DIR="$BACKUP_DIR/$(basename "$INSTALL_DIR")"
|
|
|
|
log "Installing latest version..."
|
|
|
|
mv "$EXTRACT_DIR" "$INSTALL_DIR"
|
|
|
|
elif [ -d "$INSTALL_DIR" ]; then
|
|
# --- CONFLICT/UNSAFE PATH ---
|
|
# This handles the case where the directory exists but is not a valid install (e.g., a git clone).
|
|
log_error "Directory '$INSTALL_DIR' already exists but does not appear to be a valid installation. For your safety, please manually back up and remove this directory, then run the installer again." 1
|
|
|
|
else
|
|
# --- FRESH INSTALL PATH ---
|
|
# This path is only taken if the ~/lightning_pub directory does not exist.
|
|
log "${PRIMARY_COLOR}Installing${RESET_COLOR} ${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR}..."
|
|
upgrade_status=0
|
|
mkdir -p "$(dirname "$INSTALL_DIR")"
|
|
mv "$EXTRACT_DIR" "$INSTALL_DIR"
|
|
|
|
fi
|
|
|
|
|
|
# Load nvm (Linux) or add node to PATH (Mac)
|
|
if [ "$OS" = "Mac" ]; then
|
|
export PATH="$HOME/node/bin:$PATH"
|
|
else
|
|
export NVM_DIR="${NVM_DIR}"
|
|
[ -s "${NVM_DIR}/nvm.sh" ] && \. "${NVM_DIR}/nvm.sh"
|
|
fi
|
|
|
|
cd "$INSTALL_DIR"
|
|
|
|
log "${PRIMARY_COLOR}Installing${RESET_COLOR} npm dependencies..."
|
|
|
|
npm install --no-optional --fallback-to-build=false > npm_install.log 2>&1
|
|
npm_exit_code=$?
|
|
|
|
if [ $npm_exit_code -ne 0 ]; then
|
|
log "${PRIMARY_COLOR}Failed to install npm dependencies. Error details:${RESET_COLOR}"
|
|
tail -n 20 npm_install.log | while IFS= read -r line; do
|
|
log " $line"
|
|
done
|
|
log "${PRIMARY_COLOR}Full log available in $INSTALL_DIR/npm_install.log${RESET_COLOR}"
|
|
|
|
log "Restoring previous installation due to upgrade failure..."
|
|
rm -rf "$INSTALL_DIR"
|
|
mv "$BACKUP_DIR" "$INSTALL_DIR"
|
|
log "Backup remnant at $BACKUP_DIR for manual review but may auto-clean on reboot."
|
|
|
|
if [ "$was_running" = true ]; then
|
|
log "Restarting Lightning.Pub service after restore."
|
|
$SYSTEMCTL_CMD start lightning_pub
|
|
fi
|
|
|
|
return 1
|
|
fi
|
|
|
|
if [ "$upgrade_status" -eq 100 ]; then
|
|
# Restore user data AFTER successful NPM install
|
|
log "Restoring user data..."
|
|
cp "$BACKUP_DIR"/*.sqlite "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/.env "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp -r "$BACKUP_DIR"/logs "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp -r "$BACKUP_DIR"/metric_cache "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/.jwt_secret "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/.wallet_secret "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/.installed_commit "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/admin.npub "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/app.nprofile "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/admin.connect "$INSTALL_DIR/" 2>/dev/null || true
|
|
cp "$BACKUP_DIR"/admin.enroll "$INSTALL_DIR/" 2>/dev/null || true
|
|
|
|
# Ensure correct ownership post-restore (fixes potential mismatches)
|
|
chown -R "$USER_NAME:$USER_NAME" "$INSTALL_DIR/" 2>/dev/null || true
|
|
# Secure DB files (as before)
|
|
chmod 600 "$INSTALL_DIR/db.sqlite" 2>/dev/null || true
|
|
chmod 600 "$INSTALL_DIR/metrics.sqlite" 2>/dev/null || true
|
|
chmod 600 "$INSTALL_DIR/.jwt_secret" 2>/dev/null || true
|
|
chmod 600 "$INSTALL_DIR/.wallet_secret" 2>/dev/null || true
|
|
chmod 600 "$INSTALL_DIR/admin.connect" 2>/dev/null || true
|
|
chmod 600 "$INSTALL_DIR/admin.enroll" 2>/dev/null || true
|
|
# Ensure log/metric dirs are writable (dirs need execute for traversal)
|
|
chmod 755 "$INSTALL_DIR/logs" 2>/dev/null || true
|
|
chmod 755 "$INSTALL_DIR/logs/"*/ 2>/dev/null || true # Subdirs like apps/
|
|
chmod 755 "$INSTALL_DIR/metric_cache" 2>/dev/null || true
|
|
fi
|
|
|
|
# Store the commit hash for future update checks
|
|
# Note: LATEST_COMMIT will be empty on a fresh install, which is fine.
|
|
# The file will be created, and the next run will be an upgrade.
|
|
if [ -n "$LATEST_COMMIT" ]; then
|
|
echo "$LATEST_COMMIT" > "$INSTALL_DIR/.installed_commit"
|
|
else
|
|
touch "$INSTALL_DIR/.installed_commit"
|
|
fi
|
|
|
|
rm -rf "$BACKUP_DIR" 2>/dev/null || true
|
|
|
|
return $upgrade_status
|
|
} |