diff --git a/deploy.sh b/deploy.sh index 7f14b2ac..7d0ba72c 100755 --- a/deploy.sh +++ b/deploy.sh @@ -26,14 +26,20 @@ fi check_homebrew() { if ! command -v brew &> /dev/null; then log "${PRIMARY_COLOR}Homebrew not found. Installing Homebrew...${RESET_COLOR}" - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || { + log "${PRIMARY_COLOR}Failed to install Homebrew.${RESET_COLOR}" + exit 1 + } fi } install_rsync_mac() { check_homebrew log "${PRIMARY_COLOR}Installing${RESET_COLOR} rsync using Homebrew..." - brew install rsync + brew install rsync || { + log "${PRIMARY_COLOR}Failed to install rsync.${RESET_COLOR}" + exit 1 + } } create_launchd_plist() { @@ -90,6 +96,7 @@ handle_macos() { install_rsync_mac install_nodejs install_lightning_pub + create_launchd_plist # Ensure this function is called start_services_mac } @@ -147,7 +154,10 @@ install_lnd() { log "${PRIMARY_COLOR}Downloading${RESET_COLOR} ${SECONDARY_COLOR}LND${RESET_COLOR}..." # Start the download - wget -q $LND_URL -O lnd.tar.gz + wget -q $LND_URL -O lnd.tar.gz || { + log "${PRIMARY_COLOR}Failed to download LND.${RESET_COLOR}" + exit 1 + } # Check if LND is already running and stop it if necessary (Linux) if [ "$OS" = "Linux" ] && [ "$SYSTEMCTL_AVAILABLE" = true ]; then @@ -159,7 +169,10 @@ install_lnd() { log "${PRIMARY_COLOR}systemctl not found. Please stop ${SECONDARY_COLOR}LND${RESET_COLOR} manually if it is running.${RESET_COLOR}" fi - tar -xzf lnd.tar.gz -C ~/ > /dev/null + tar -xzf lnd.tar.gz -C ~/ > /dev/null || { + log "${PRIMARY_COLOR}Failed to extract LND.${RESET_COLOR}" + exit 1 + } rm lnd.tar.gz mv lnd-* lnd @@ -209,7 +222,10 @@ install_nodejs() { log "Node.js is not installed. ${PRIMARY_COLOR}Installing the LTS version...${RESET_COLOR}" fi - nvm install --lts + nvm install --lts || { + log "${PRIMARY_COLOR}Failed to install Node.js.${RESET_COLOR}" + exit 1 + } log "Node.js LTS installation completed." } @@ -217,9 +233,15 @@ install_nodejs() { install_lightning_pub() { log "${PRIMARY_COLOR}Installing${RESET_COLOR} ${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR}..." REPO_URL="https://github.com/shocknet/Lightning.Pub/tarball/master" - wget $REPO_URL -O lightning_pub.tar.gz > /dev/null 2>&1 + wget $REPO_URL -O lightning_pub.tar.gz > /dev/null 2>&1 || { + log "${PRIMARY_COLOR}Failed to download Lightning.Pub.${RESET_COLOR}" + exit 1 + } mkdir -p lightning_pub_temp - tar -xvzf lightning_pub.tar.gz -C lightning_pub_temp --strip-components=1 > /dev/null 2>&1 + tar -xvzf lightning_pub.tar.gz -C lightning_pub_temp --strip-components=1 > /dev/null 2>&1 || { + log "${PRIMARY_COLOR}Failed to extract Lightning.Pub.${RESET_COLOR}" + exit 1 + } rm lightning_pub.tar.gz if ! command -v rsync &> /dev/null; then @@ -254,9 +276,10 @@ install_lightning_pub() { log "${PRIMARY_COLOR}Installing${RESET_COLOR} npm dependencies..." - npm install > npm_install.log 2>&1 & - npm_pid=$! - wait $npm_pid + npm install > npm_install.log 2>&1 || { + log "${PRIMARY_COLOR}Failed to install npm dependencies.${RESET_COLOR}" + exit 1 + } log "${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR} installation completed." } @@ -373,4 +396,4 @@ else install_nodejs install_lightning_pub start_services -fi +fi \ No newline at end of file diff --git a/scripts/check_homebrew.sh b/scripts/check_homebrew.sh new file mode 100755 index 00000000..fd58489e --- /dev/null +++ b/scripts/check_homebrew.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +check_homebrew() { + if ! command -v brew &> /dev/null; then + log "${PRIMARY_COLOR}Homebrew not found. Installing Homebrew...${RESET_COLOR}" + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || { + log "${PRIMARY_COLOR}Failed to install Homebrew.${RESET_COLOR}" + exit 1 + } + fi +} diff --git a/scripts/create_launchd_plist.sh b/scripts/create_launchd_plist.sh new file mode 100755 index 00000000..9964a1fe --- /dev/null +++ b/scripts/create_launchd_plist.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +create_launchd_plist() { + create_plist() { + local plist_path=$1 + local label=$2 + local program_args=$3 + local working_dir=$4 + + if [ -f "$plist_path" ]; then + log "${PRIMARY_COLOR}${label} already exists. Skipping creation.${RESET_COLOR}" + else + cat < "$plist_path" + + + + + Label + ${label} + ProgramArguments + + ${program_args} + + WorkingDirectory + ${working_dir} + RunAtLoad + + KeepAlive + + + +EOF + fi + } + USER_HOME=$(eval echo ~$(whoami)) + NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${USER_HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" + LAUNCH_AGENTS_DIR="${USER_HOME}/Library/LaunchAgents" + + create_plist "${LAUNCH_AGENTS_DIR}/local.lnd.plist" "local.lnd" "${USER_HOME}/lnd/lnd" "" + create_plist "${LAUNCH_AGENTS_DIR}/local.lightning_pub.plist" "local.lightning_pub" "/bin/bash-csource ${NVM_DIR}/nvm.sh && npm start" "${USER_HOME}/lightning_pub" + + log "${PRIMARY_COLOR}Created launchd plists. Please load them using launchctl.${RESET_COLOR}" +} diff --git a/scripts/extract_nprofile.sh b/scripts/extract_nprofile.sh new file mode 100644 index 00000000..c2579094 --- /dev/null +++ b/scripts/extract_nprofile.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +get_log_info() { + if [ "$EUID" -eq 0 ]; then + USER_HOME=$(getent passwd ${SUDO_USER} | cut -d: -f6) + USER_NAME=$SUDO_USER + else + USER_HOME=$HOME + USER_NAME=$(whoami) + fi + + LOG_DIR="$USER_HOME/lightning_pub/logs" + MAX_ATTEMPTS=4 + ATTEMPT=0 + + find_latest_log() { + ls -1t ${LOG_DIR}/components/nostrMiddleware_*.log 2>/dev/null | head -n 1 + } + + # Echo "Waiting for build..." every 10 seconds until the unlocker log is available, with a 3-minute timeout + TIMEOUT=180 + while [ ! -f ${LOG_DIR}/components/unlocker_*.log ] && [ $TIMEOUT -gt 0 ]; do + echo "Waiting for build..." + sleep 10 + TIMEOUT=$((TIMEOUT - 10)) + done + if [ $TIMEOUT -le 0 ]; then + echo "Timeout waiting for unlocker log file." + exit 1 + fi + + # Wait for wallet status messages with a 45s timeout + TIMEOUT=45 + while [ $TIMEOUT -gt 0 ]; do + if grep -q -e "unlocker >> macaroon not found, creating wallet..." -e "unlocker >> the wallet is already unlocked" -e "unlocker >> wallet is locked, unlocking" ${LOG_DIR}/components/unlocker_*.log; then + break + fi + sleep 1 + TIMEOUT=$((TIMEOUT - 1)) + done + if [ $TIMEOUT -le 0 ]; then + echo "Timeout waiting for wallet status message." + exit 1 + fi + + if grep -q "unlocker >> macaroon not found, creating wallet..." ${LOG_DIR}/components/unlocker_*.log; then + echo "Creating wallet..." + elif grep -q "unlocker >> wallet is locked, unlocking" ${LOG_DIR}/components/unlocker_*.log; then + echo "Unlocking wallet..." + else + echo "Wallet is already unlocked." + fi + + echo "Proceeding to nprofile attempts..." + + while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do + LATEST_LOG=$(find_latest_log) + if [ -n "$LATEST_LOG" ]; then + echo "Found latest log: $LATEST_LOG" + break + fi + echo "Awaiting nostr information..." + sleep 4 + ATTEMPT=$((ATTEMPT + 1)) + done + + if [ -z "$LATEST_LOG" ]; then + echo "Failed to find the log file, check service status" + exit 1 + fi + + nprofile_key=$(grep -oP 'nprofile: \K\w+' "$LATEST_LOG") + + if [ -z "$nprofile_key" ]; then + echo "No nprofile key found in the log." + exit 1 + fi + + # Print the extracted key + echo "Paste this string into ShockWallet to connect to the node: $nprofile_key" +} \ No newline at end of file diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100755 index 00000000..a47132e8 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -e + +BASE_URL="https://raw.githubusercontent.com/shocknet/Lightning.Pub/fix/bootstrap/scripts/" +modules=( + "utils" + "check_homebrew" + "install_rsync_mac" + "create_launchd_plist" + "start_services_mac" + "install_lnd" + "install_nodejs" + "install_lightning_pub" + "start_services" + "extract_nprofile" # Add extract_nprofile to the modules array +) + +for module in "${modules[@]}"; do + wget -q "${BASE_URL}/${module}.sh" -O "/tmp/${module}.sh" + source "/tmp/${module}.sh" +done + +# Upgrade flag +SKIP_PROMPT=false +for arg in "$@"; do + case $arg in + --yes) + SKIP_PROMPT=true + shift + ;; + esac +done + +detect_os_arch + +if [ "$OS" = "Mac" ]; then + handle_macos +else + install_lnd + install_nodejs + install_lightning_pub + start_services + get_log_info +fi \ No newline at end of file diff --git a/scripts/install_lightning_pub.sh b/scripts/install_lightning_pub.sh new file mode 100755 index 00000000..c82be736 --- /dev/null +++ b/scripts/install_lightning_pub.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +install_lightning_pub() { + if [ "$EUID" -eq 0 ]; then + USER_HOME=$(getent passwd ${SUDO_USER} | cut -d: -f6) + USER_NAME=$SUDO_USER + else + USER_HOME=$HOME + USER_NAME=$(whoami) + fi + + log "${PRIMARY_COLOR}Installing${RESET_COLOR} ${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR}..." + REPO_URL="https://github.com/shocknet/Lightning.Pub/tarball/fix/bootstrap" + + sudo -u $USER_NAME wget $REPO_URL -O $USER_HOME/lightning_pub.tar.gz > /dev/null 2>&1 || { + log "${PRIMARY_COLOR}Failed to download Lightning.Pub.${RESET_COLOR}" + exit 1 + } + + sudo -u $USER_NAME mkdir -p $USER_HOME/lightning_pub_temp + sudo -u $USER_NAME tar -xvzf $USER_HOME/lightning_pub.tar.gz -C $USER_HOME/lightning_pub_temp --strip-components=1 > /dev/null 2>&1 || { + log "${PRIMARY_COLOR}Failed to extract Lightning.Pub.${RESET_COLOR}" + exit 1 + } + rm $USER_HOME/lightning_pub.tar.gz + + if ! command -v rsync &> /dev/null; then + log "${PRIMARY_COLOR}rsync not found, installing...${RESET_COLOR}" + if [ "$OS" = "Mac" ]; then + brew install rsync + elif [ "$OS" = "Linux" ]; then + if [ -x "$(command -v apt-get)" ]; then + sudo apt-get update > /dev/null 2>&1 + sudo apt-get install -y rsync > /dev/null 2>&1 + elif [ -x "$(command -v yum)" ]; then + sudo yum install -y rsync > /dev/null 2>&1 + else + log "${PRIMARY_COLOR}Package manager not found. Please install rsync manually.${RESET_COLOR}" + exit 1 + fi + else + log "${PRIMARY_COLOR}Package manager not found. Please install rsync manually.${RESET_COLOR}" + exit 1 + fi + fi + + # Merge if upgrade + rsync -av --exclude='*.sqlite' --exclude='.env' --exclude='logs' --exclude='node_modules' lightning_pub_temp/ lightning_pub/ > /dev/null 2>&1 + rm -rf lightning_pub_temp + + # Load nvm and npm + export NVM_DIR="${NVM_DIR}" + [ -s "${NVM_DIR}/nvm.sh" ] && \. "${NVM_DIR}/nvm.sh" + + cd lightning_pub + + log "${PRIMARY_COLOR}Installing${RESET_COLOR} npm dependencies..." + + npm install > npm_install.log 2>&1 || { + log "${PRIMARY_COLOR}Failed to install npm dependencies.${RESET_COLOR}" + exit 1 + } + + log "${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR} installation completed." +} \ No newline at end of file diff --git a/scripts/install_lnd.sh b/scripts/install_lnd.sh new file mode 100755 index 00000000..736f67b7 --- /dev/null +++ b/scripts/install_lnd.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +install_lnd() { + if [ "$EUID" -eq 0 ]; then + USER_HOME=$(getent passwd ${SUDO_USER} | cut -d: -f6) + USER_NAME=$SUDO_USER + else + USER_HOME=$HOME + USER_NAME=$(whoami) + fi + + # Improved version extraction logic + LND_VERSION=$(wget -qO- https://api.github.com/repos/lightningnetwork/lnd/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")') + LND_URL="https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-${OS}-${ARCH}-${LND_VERSION}.tar.gz" + + # Check if LND is already installed + if [ -d "$USER_HOME/lnd" ]; then + CURRENT_VERSION=$("$USER_HOME/lnd/lnd" --version | grep -oP 'version \K[^\s]+') + if [ "$CURRENT_VERSION" == "${LND_VERSION#v}" ]; then + log "${SECONDARY_COLOR}LND${RESET_COLOR} is already up-to-date (version $CURRENT_VERSION)." + return + else + if [ "$SKIP_PROMPT" != true ]; then + read -p "LND version $CURRENT_VERSION is installed. Do you want to upgrade to version $LND_VERSION? (y/N): " response + case "$response" in + [yY][eE][sS]|[yY]) + log "${PRIMARY_COLOR}Upgrading${RESET_COLOR} ${SECONDARY_COLOR}LND${RESET_COLOR} from version $CURRENT_VERSION to $LND_VERSION..." + ;; + *) + log "$(date '+%Y-%m-%d %H:%M:%S') Upgrade cancelled." + return + ;; + esac + else + log "${PRIMARY_COLOR}Upgrading${RESET_COLOR} ${SECONDARY_COLOR}LND${RESET_COLOR} from version $CURRENT_VERSION to $LND_VERSION..." + fi + fi + fi + + log "${PRIMARY_COLOR}Downloading${RESET_COLOR} ${SECONDARY_COLOR}LND${RESET_COLOR}..." + + # Start the download + sudo -u $USER_NAME wget -q $LND_URL -O $USER_HOME/lnd.tar.gz || { + log "${PRIMARY_COLOR}Failed to download LND.${RESET_COLOR}" + exit 1 + } + + # Check if LND is already running and stop it if necessary (Linux) + if [ "$OS" = "Linux" ] && [ "$SYSTEMCTL_AVAILABLE" = true ]; then + if systemctl is-active --quiet lnd; then + log "${PRIMARY_COLOR}Stopping${RESET_COLOR} ${SECONDARY_COLOR}LND${RESET_COLOR} service..." + sudo systemctl stop lnd + fi + else + log "${PRIMARY_COLOR}systemctl not found. Please stop ${SECONDARY_COLOR}LND${RESET_COLOR} manually if it is running.${RESET_COLOR}" + fi + + sudo -u $USER_NAME tar -xzf $USER_HOME/lnd.tar.gz -C $USER_HOME > /dev/null || { + log "${PRIMARY_COLOR}Failed to extract LND.${RESET_COLOR}" + exit 1 + } + rm $USER_HOME/lnd.tar.gz + sudo -u $USER_NAME mv $USER_HOME/lnd-* $USER_HOME/lnd + + # Create .lnd directory if it doesn't exist + sudo -u $USER_NAME mkdir -p $USER_HOME/.lnd + + # Check if lnd.conf already exists and avoid overwriting it + if [ -f $USER_HOME/.lnd/lnd.conf ]; then + log "${PRIMARY_COLOR}lnd.conf already exists. Skipping creation of new lnd.conf file.${RESET_COLOR}" + else + sudo -u $USER_NAME bash -c "cat < $USER_HOME/.lnd/lnd.conf +bitcoin.mainnet=true +bitcoin.node=neutrino +neutrino.addpeer=neutrino.shock.network +feeurl=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json +EOF" + fi + + log "${SECONDARY_COLOR}LND${RESET_COLOR} installation and configuration completed." +} \ No newline at end of file diff --git a/scripts/install_nodejs.sh b/scripts/install_nodejs.sh new file mode 100755 index 00000000..b4053854 --- /dev/null +++ b/scripts/install_nodejs.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +install_nodejs() { + if [ "$EUID" -eq 0 ] && [ -n "$SUDO_USER" ]; then + USER_HOME=$(getent passwd ${SUDO_USER} | cut -d: -f6) + USER_NAME=${SUDO_USER} + else + USER_HOME=$HOME + USER_NAME=$(whoami) + fi + + NVM_DIR="$USER_HOME/.nvm" + log "${PRIMARY_COLOR}Checking${RESET_COLOR} for Node.js..." + MINIMUM_VERSION="18.0.0" + + # Load nvm if it already exists + export NVM_DIR="${NVM_DIR}" + [ -s "${NVM_DIR}/nvm.sh" ] && \. "${NVM_DIR}/nvm.sh" + + if ! command -v nvm &> /dev/null; then + NVM_VERSION=$(wget -qO- https://api.github.com/repos/nvm-sh/nvm/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")') + sudo -u $USER_NAME bash -c "wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh | bash > /dev/null 2>&1" + export NVM_DIR="${NVM_DIR}" + [ -s "${NVM_DIR}/nvm.sh" ] && \. "${NVM_DIR}/nvm.sh" + fi + + if command -v node &> /dev/null; then + NODE_VERSION=$(node -v | sed 's/v//') + if [ "$(printf '%s\n' "$MINIMUM_VERSION" "$NODE_VERSION" | sort -V | head -n1)" = "$MINIMUM_VERSION" ]; then + log "Node.js is already installed and meets the minimum version requirement." + return + else + log "${PRIMARY_COLOR}Updating${RESET_COLOR} Node.js to the LTS version..." + fi + else + log "Node.js is not installed. ${PRIMARY_COLOR}Installing the LTS version...${RESET_COLOR}" + fi + + sudo -u $USER_NAME bash -c "source ${NVM_DIR}/nvm.sh && nvm install --lts" || { + log "${PRIMARY_COLOR}Failed to install Node.js.${RESET_COLOR}" + exit 1 + } + + log "Node.js LTS installation completed." +} \ No newline at end of file diff --git a/scripts/install_rsync_mac.sh b/scripts/install_rsync_mac.sh new file mode 100755 index 00000000..f1973a76 --- /dev/null +++ b/scripts/install_rsync_mac.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +install_rsync_mac() { + check_homebrew + log "${PRIMARY_COLOR}Installing${RESET_COLOR} rsync using Homebrew..." + brew install rsync || { + log "${PRIMARY_COLOR}Failed to install rsync.${RESET_COLOR}" + exit 1 + } +} diff --git a/scripts/start_services.sh b/scripts/start_services.sh new file mode 100755 index 00000000..b236d89e --- /dev/null +++ b/scripts/start_services.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +start_services() { + if [ "$EUID" -eq 0 ]; then + USER_HOME=$(getent passwd ${SUDO_USER} | cut -d: -f6) + USER_NAME=$SUDO_USER + else + USER_HOME=$HOME + USER_NAME=$(whoami) + fi + + if [ "$OS" = "Linux" ]; then + if [ "$SYSTEMCTL_AVAILABLE" = true ]; then + sudo bash -c "cat > /etc/systemd/system/lnd.service < /etc/systemd/system/lightning_pub.service < start.sh +#!/bin/bash +${USER_HOME}/lnd/lnd & +LND_PID=\$! +sleep 10 +npm start & +NODE_PID=\$! +wait \$LND_PID +wait \$NODE_PID +EOF + chmod +x start.sh + log "systemctl not available. Created start.sh. Please use this script to start the services manually." +} \ No newline at end of file diff --git a/scripts/start_services_mac.sh b/scripts/start_services_mac.sh new file mode 100755 index 00000000..81f817c1 --- /dev/null +++ b/scripts/start_services_mac.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +start_services_mac() { + create_launchd_plist + launchctl load "${LAUNCH_AGENTS_DIR}/local.lnd.plist" + launchctl load "${LAUNCH_AGENTS_DIR}/local.lightning_pub.plist" + log "${SECONDARY_COLOR}LND${RESET_COLOR} and ${SECONDARY_COLOR}Lightning.Pub${RESET_COLOR} services started using launchd." +} + +handle_macos() { + check_homebrew + install_rsync_mac + install_nodejs + install_lightning_pub + create_launchd_plist + start_services_mac +} diff --git a/scripts/utils.sh b/scripts/utils.sh new file mode 100755 index 00000000..e31a30a8 --- /dev/null +++ b/scripts/utils.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +PRIMARY_COLOR="\e[38;5;208m" # #f59322 +SECONDARY_COLOR="\e[38;5;165m" # #c740c7 +RESET_COLOR="\e[0m" +LOG_FILE="/var/log/deploy.log" + +touch $LOG_FILE +chmod 644 $LOG_FILE + +log() { + local message="$(date '+%Y-%m-%d %H:%M:%S') $1" + if [ -t 1 ]; then + echo -e "$message" + fi + echo -e "$(echo $message | sed 's/\\e\[[0-9;]*m//g')" >> $LOG_FILE +} + +detect_os_arch() { + OS="$(uname -s)" + ARCH="$(uname -m)" + case "$OS" in + Linux*) OS=Linux;; + Darwin*) OS=Mac;; + CYGWIN*) OS=Cygwin;; + MINGW*) OS=MinGw;; + *) OS="UNKNOWN" + esac + case "$ARCH" in + x86_64) ARCH=amd64;; + arm64) ARCH=arm64;; + *) ARCH="UNKNOWN" + esac + + if [ "$OS" = "Linux" ] && command -v systemctl &> /dev/null; then + SYSTEMCTL_AVAILABLE=true + else + SYSTEMCTL_AVAILABLE=false + fi +} diff --git a/src/services/lnd/index.ts b/src/services/lnd/index.ts index 63fd5706..2525503c 100644 --- a/src/services/lnd/index.ts +++ b/src/services/lnd/index.ts @@ -4,16 +4,19 @@ import os from 'os' import path from 'path' const resolveHome = (filepath: string) => { - if (filepath[0] === '~') { - return path.join(os.homedir(), filepath.slice(1)) + let homeDir; + if (process.env.SUDO_USER) { + homeDir = path.join('/home', process.env.SUDO_USER); + } else { + homeDir = os.homedir(); } - return filepath + return path.join(homeDir, filepath); } export const LoadLndSettingsFromEnv = (): LndSettings => { const lndAddr = process.env.LND_ADDRESS || "127.0.0.1:10009" - const lndCertPath = process.env.LND_CERT_PATH || resolveHome("~/.lnd/tls.cert") - const lndMacaroonPath = process.env.LND_MACAROON_PATH || resolveHome("~/.lnd/data/chain/bitcoin/mainnet/admin.macaroon") + const lndCertPath = process.env.LND_CERT_PATH || resolveHome("/.lnd/tls.cert") + const lndMacaroonPath = process.env.LND_MACAROON_PATH || resolveHome("/.lnd/data/chain/bitcoin/mainnet/admin.macaroon") const feeRateBps = EnvCanBeInteger("OUTBOUND_MAX_FEE_BPS", 60) const feeRateLimit = feeRateBps / 10000 const feeFixedLimit = EnvCanBeInteger("OUTBOUND_MAX_FEE_EXTRA_SATS", 100) diff --git a/src/services/main/unlocker.ts b/src/services/main/unlocker.ts index cf2c4a8a..fffe5f43 100644 --- a/src/services/main/unlocker.ts +++ b/src/services/main/unlocker.ts @@ -81,9 +81,18 @@ export class Unlocker { const initRes = await unlocker.initWallet(req, DeadLineMetadata(60 * 1000)) const adminMacaroon = Buffer.from(initRes.response.adminMacaroon).toString('hex') const ln = this.GetLightningClient(lndCert, adminMacaroon) - const info = await this.GetLndInfo(ln) - if (!info.ok) { - throw new Error("failed to init lnd wallet " + info.failure) + + // Retry mechanism to ensure LND is ready + let info; + for (let i = 0; i < 10; i++) { + info = await this.GetLndInfo(ln); + if (info.ok) break; + this.log("LND not ready, retrying in 5 seconds..."); + await new Promise(res => setTimeout(res, 5000)); + } + + if (!info || !info.ok) { + throw new Error("failed to init lnd wallet " + (info ? info.failure : "unknown error")) } await this.storage.liquidityStorage.SaveNodeSeed(info.pub, JSON.stringify(encryptedData)) this.log("created wallet with pub:", info.pub)