From 537e5c0670ab5fba812cdad90ee695433afb3f95 Mon Sep 17 00:00:00 2001 From: Enki Date: Fri, 22 Dec 2023 01:20:11 -0800 Subject: [PATCH] Bitcoin Core install Script and readme update. --- README.md | 32 ++- coreinstall.sh | 746 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 776 insertions(+), 2 deletions(-) create mode 100644 coreinstall.sh diff --git a/README.md b/README.md index fa2cf49..2417877 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,31 @@ -# Sovran-Scripts +# Sovran Scripts +------------------ + +Install scripts for self-hosting things. + +## How to use these scripts +---------------------------- + +These should work on most newer Debian based distros that use apt. + +If your using a GUI then you can download the codes zip file > unzip and open the folder > +Right click on the folder select "Open in terminal" > then type `ls` this will show whats in the folder > +then `sudo ./full_script_name.sh`. You'll need to provide an admin password. + + +If you are running 'headless' and dont have Git installed yet you can run : + +`wget https://github.com/Enkimin/Sovran-Scripts/archive/main.tar.gz` > +then run `tar -xzvf main.tar.gz` > and `cd main` > `ls` > `sudo ./script_name.sh` + + +You can use Git with `git clone https://github.com/Enkimin/Sovran-Scripts.git` > +then `cd Sovran-Scripts` > `ls` > `sudo ./script_name.sh` + + + +## Scripts +------------ +### coreinstall.sh +- This script walks the user through the process of installing TOR, I2P, and Bitcoin Core. -Scripts for self-hosting. Useful tools for spinning up and maintaining self-hosted applications. \ No newline at end of file diff --git a/coreinstall.sh b/coreinstall.sh new file mode 100644 index 0000000..e3a72aa --- /dev/null +++ b/coreinstall.sh @@ -0,0 +1,746 @@ +#!/bin/bash +#This is a script to install Bitcoin Core + +#Global Functions. +is_package_installed() { + if dpkg -l "$1" 2>/dev/null | grep -q "^ii"; then + echo "$1 is installed." + return 0 # Package is installed + else + echo "$1 is not installed." + return 1 # Package is not installed + fi +} +prompt_yes_no() { + local question="$1" + local default_choice="${2:-yes}" + + while true; do + read -p "$question (y/n) [default: $default_choice]: " user_choice + case $user_choice in + [Yy]) + echo "yes" + return + ;; + [Nn]) + echo "no" + return + ;; + "") + # If the user just presses Enter, return the default choice + echo "$default_choice" + return + ;; + *) + echo "Invalid choice. Please enter 'y' for yes or 'n' for no." + ;; + esac + done +} + +# Network stuff + +# Installs TOR +install_tor() { + # Check if TOR is already installed + if is_package_installed "tor"; then + echo "TOR is already installed. Moving on..." + sleep 1 + else + # Confirm TOR installation + if [ "$(prompt_yes_no 'Do you want to install TOR?')" == "yes" ]; then + echo "Adding the TOR repository..." + sleep 0.5 + if ! echo "deb https://deb.torproject.org/torproject.org $(lsb_release -cs) main" >>/etc/apt/sources.list.d/tor.list; then + echo "Failed to add the TOR repository." >&2 + exit 1 + fi + + echo "Importing the TOR project's GPG key..." + sleep 1 + if ! wget -qO - https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor --output /etc/apt/trusted.gpg.d/tor.gpg; then + echo "Failed to import the GPG key for TOR." >&2 + exit 1 + fi + + echo "Updating package lists...half a sec." + sleep 0.5 + if ! apt-get update -q; then + echo "Failed to update package lists with the new repository." >&2 + exit 1 + fi + + echo "Installing TOR. Hodl tight..." + sleep 1 + if ! apt-get install -y -q tor; then + echo "Failed to install TOR." >&2 + exit 1 + fi + + echo "Installing additional dependencies for TOR..." + sleep 1 + if ! apt-get install -y -q torsocks tor-geoipdb; then + echo "Failed to install additional dependencies for TOR." >&2 + exit 1 + fi + + echo "Adding the user 'bitcoin' to the 'debian-tor' group to allow TOR access..." + sleep 1 + sudo groupadd -f debian-tor + sudo usermod -a -G debian-tor bitcoin + echo "Setting correct permissions for the TOR configuration directory..." + sleep 1 + if ! chown -R debian-tor:debian-tor /var/lib/tor; then + echo "Failed to set permissions for the TOR configuration directory." >&2 + exit 1 + fi + + echo "Modifying the TOR config file (torrc) to work with core...." + sleep 1 + if ! echo -e "ControlPort 9051\nCookieAuthentication 1\nCookieAuthFileGroupReadable 1\nLog notice stdout\nSOCKSPort 9050" >>/etc/tor/torrc; then + echo "Failed to custom configurations to torrc file." >&2 + exit 1 + fi + + echo "Restarting TOR so the changes take effect..." + sleep 1 + systemctl restart tor + echo "TOR has been installed and configured for core to use. Moving on..." + sleep 3 + else + echo "TOR installation skipped. Moving on..." >&2 + sleep 2 + fi + fi +} + +# Installs I2P +install_i2p() { + # Check if I2P is already installed + if is_package_installed "i2pd"; then + echo "I2P is already installed." + return + fi + + # Confirm I2P installation + if [ "$(prompt_yes_no 'Do you want to install I2P?')" == "yes" ]; then + # Ensure apt-transport-https is installed before adding repositories + if ! is_package_installed "apt-transport-https"; then + echo "Installing apt-transport-https..." + if ! apt-get install -y -q apt-transport-https; then + echo "Failed to install apt-transport-https." >&2 + exit 1 + fi + else + echo "apt-transport-https is already installed." + fi + + # Adding I2P repository + echo "Adding I2P repository..." + if ! wget -q -O - https://repo.i2pd.xyz/.help/add_repo | sudo bash -s -; then + echo "Failed to add the I2P repository." >&2 + exit 1 + fi + + # Updating package lists + echo "Updating package lists..." + if ! apt-get update -q; then + echo "Failed to update package lists." >&2 + exit 1 + fi + + # Installing I2P + echo "Installing I2P..." + if ! apt-get install -y -q i2pd; then + echo "Failed to install I2P." >&2 + exit 1 + fi + + # Enabling and starting the I2P service + echo "Enabling the I2P service to start on boot..." + if ! systemctl enable i2pd; then + echo "Failed to enable the I2P service to start on boot." >&2 + exit 1 + fi + + echo "Starting the I2P service..." + if ! systemctl start i2pd; then + echo "Failed to start the I2P service." >&2 + exit 1 + fi + + echo "I2P has been installed and is configured to start on boot. Moving on..." + else + echo "I2P installation skipped. Moving on..." + fi + sleep 3 +} + + +# Bitocin Stuff + +# Checks if Bitcoin Core is installed +is_bitcoin_core_installed() { + command -v bitcoind &>/dev/null +} + +# Installs Core's dependencies +install_bitcoin_core_dependencies() { + echo "Checking if Core is already installed..." + if is_bitcoin_core_installed; then + echo "Core is already installed. Skipping to config." + sleep 2 + return + else + echo "Bitcoin Core dependencies not found. No worries..." + fi + + echo "Installing required repositories for Core..." + sleep 3 + if ! is_package_installed "git"; then + echo "Installing git..." + if ! apt-get install -y -q git; then + echo "Failed to install git." >&2 + exit 1 + fi + else + echo "git is already installed." + fi + + if ! is_package_installed "curl"; then + echo "Installing curl..." + if ! apt-get install -y -q curl; then + echo "Failed to install curl." >&2 + exit 1 + fi + else + echo "curl is already installed." + fi + + local bitcoin_core_dependencies=("build-essential" "libtool" "autotools-dev" "automake" "pkg-config" "bsdmainutils" "python3" "libssl-dev" "libevent-dev" "libboost-system-dev" "libboost-filesystem-dev" "libboost-test-dev" "libboost-thread-dev" "libboost-all-dev" "libzmq3-dev") + + # Iterate through the dependencies and install them + for dep in "${bitcoin_core_dependencies[@]}"; do + if ! is_package_installed "$dep"; then + echo "Installing $dep..." + if ! apt-get install -y -q "$dep"; then + echo "Failed to install $dep." >&2 + exit 1 + fi + else + echo "$dep is already installed." + fi + done + + echo "Core dependencies have been successfully installed. Moving on..." + sleep 2 +} + +# Download and install Bitcoin Core +download_and_install_bitcoin_core() { + local node_folder="/home/bitcoin/node" + + # Create the node folder if it doesn't exist + echo "Creating the node folder..." + sleep 1 + mkdir -p "$node_folder" + + # Fetch the latest version number from the GitHub API + echo "Fetching the latest version of Bitcoin Core..." + sleep 1 + latest_version=$(curl -s https://api.github.com/repos/bitcoin/bitcoin/releases/latest | jq -r '.tag_name' | sed 's/^v//') + + if [[ -z "$latest_version" ]]; then + echo "Failed to fetch the latest version of Bitcoin Core. Aborting the installation." >&2 + exit 1 + fi + + # Download the Bitcoin Core source code as a .tar.gz file + echo "Downloading Bitcoin Core source code..." + sleep 1 + local bitcoin_core_url="https://bitcoincore.org/bin/bitcoin-core-${latest_version}/bitcoin-${latest_version}.tar.gz" + local source_code_archive="${node_folder}/bitcoin-$latest_version.tar.gz" + + if ! wget -nc -q "$bitcoin_core_url" -P "$node_folder"; then + echo "ERROR: Failed to download the Bitcoin Core source code." >&2 + exit 1 + fi + + # Download the SHA256SUMS file + echo "Downloading Bitcoin Core SHA256SUMS file..." + sleep 2 + local sha256sums_url="https://bitcoincore.org/bin/bitcoin-core-$latest_version/SHA256SUMS" + local sha256sums_file="${node_folder}/SHA256SUMS" + + if ! wget -nc -q "$sha256sums_url" -O "$sha256sums_file"; then + echo "ERROR: Failed to download the SHA256SUMS file." >&2 + exit 1 + fi + + # Verify the cryptographic checksum of the downloaded .tar.gz file + verify_checksum "$source_code_archive" "$latest_version" + + # Extract the downloaded source code + echo "Extracting Bitcoin Core source code..." + sleep 1 + tar -xzf "$source_code_archive" -C "$node_folder" + + # Navigate into the Bitcoin Core directory + echo "Entering the Bitcoin Core directory so it can be compiled..." + sleep 1 + if ! cd "$node_folder/bitcoin-$latest_version"; then + echo "Failed to enter the Bitcoin Core directory. Aborting the installation." >&2 + exit 1 + fi + + # Build and install Bitcoin Core + echo "Building Bitcoin Core. This is compiling Bitcoin core from scratch. It will take a while, so go touch some grass or something." + echo "I'm going to let the output run here so you can see progress being made. Starting in a sec." + sleep 3 + ./autogen.sh + ./configure + make + + # Check if 'make install' was successful + if ! make install; then + echo "Failed to install Bitcoin Core. Aborting the installation." >&2 + exit 1 + fi + + echo "Bitcoin Core compiled successfully! Woo! Moving on to configuration" + sleep 3 +} + +# Verifies the cryptographic checksum of a file +verify_checksum() { + local file="$1" + local expected_checksum="$2" + local current_dir="$(pwd)" # Store the current directory + + # Change directory to the folder where the file is located + local file_dir="$(dirname "$file")" + cd "$file_dir" + + # Download the SHA256SUMS file without renaming + echo "Verifying the cryptographic checksum..." + sleep 1 + + if sha256sum --ignore-missing --check SHA256SUMS; then + echo -e "\e[32m+--------------------------------+\e[0m" + echo -e "\e[32m| \e[1mVerification Successful!\e[0m \e[32m |\e[0m" + echo -e "\e[32m+--------------------------------+\e[0m" + sleep 3 + else + echo -e "\e[1;31mERROR: Cryptographic checksum verification failed.\e[0m" >&2 + exit 1 + fi + + # Return to the original directory + cd "$current_dir" +} + +# Copies Core's binary to /usr/local/bin and checks permissions +copy_bitcoin_core_binary() { + local node_folder="/home/bitcoin/node" + local latest_version="$1" + local expected_location="/usr/local/bin" + if [ -x "${expected_location}/bitcoind" ] && [ -x "${expected_location}/bitcoin-cli" ]; then + echo "Bitcoin Core binaries are already installed in ${expected_location}. Skipping copying and permissions check." + return + fi + echo "Copying Bitcoin Core binary to ${expected_location}..." + sleep 1 + cp "$node_folder/bitcoin-$latest_version/src/bitcoind" "${expected_location}" + cp "$node_folder/bitcoin-$latest_version/src/bitcoin-cli" "${expected_location}" + chown root:root "${expected_location}/bitcoind" + chown root:root "${expected_location}/bitcoin-cli" + chmod 755 "${expected_location}/bitcoind" + chmod 755 "${expected_location}/bitcoin-cli" + echo "Bitcoin Core binary has been copied to ${expected_location} and proper permissions have been set." + sleep 1 +} + +create_bitcoin_conf() { + local bitcoin_conf_dir="/home/bitcoin/.bitcoin" + local bitcoin_conf_file="$bitcoin_conf_dir/bitcoin.conf" + local network="$1" + + # Ensure that the /home/bitcoin/.bitcoin directory exists + if [ ! -d "$bitcoin_conf_dir" ]; then + echo "Creating $bitcoin_conf_dir directory..." + mkdir -p "$bitcoin_conf_dir" || { + echo "Failed to create directory $bitcoin_conf_dir" + exit 1 + } + chown bitcoin:bitcoin "$bitcoin_conf_dir" || { + echo "Failed to change ownership of $bitcoin_conf_dir" >&2 + exit 1 + } + chmod 700 "$bitcoin_conf_dir" || { + echo "Failed to set permissions for $bitcoin_conf_dir" >&2 + exit 1 + } + echo "$bitcoin_conf_dir directory created successfully." + fi + + # Create or modify the bitcoin.conf file + if [ ! -f "$bitcoin_conf_file" ]; then + echo "Creating $bitcoin_conf_file with a base configuration..." + # Base Configuration (Hybrid Mode) + cat >"$bitcoin_conf_file" <>"$bitcoin_conf_file" + # [Network] + debug=tor + proxy=127.0.0.1:9050 + onlynet=onion +EOF + ;; + "tor_hybrid") + # TOR hybrid configuration + cat <>"$bitcoin_conf_file" + # [Network] + debug=tor + proxy=127.0.0.1:9050 +EOF + ;; + "i2p") + # I2P configuration + cat <>"$bitcoin_conf_file" + # [Network] + debug=i2p + i2psam=127.0.0.1:7656 + onlynet=i2p + addnode=255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0 + addnode=27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0 + addnode=2el6enckmfyiwbfcwsygkwksovtynzsigmyv3bzyk7j7qqahooua.b32.i2p:0 + addnode=3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0 + addnode=3tns2oov4tnllntotazy6umzkq4fhkco3iu5rnkxtu3pbfzxda7q.b32.i2p:0 + addnode=4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0 + addnode=4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0 + addnode=4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0 + addnode=52v6uo6crlrlhzphslyiqblirux6olgsaa45ixih7sq5np4jujaa.b32.i2p:0 + addnode=6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0 +EOF + ;; + "i2p_hybrid") + # I2P hybrid configuration + cat <>"$bitcoin_conf_file" + # [Network] + debug=i2p + i2psam=127.0.0.1:7656 + addnode=255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0 + addnode=27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0 + addnode=2el6enckmfyiwbfcwsygkwksovtynzsigmyv3bzyk7j7qqahooua.b32.i2p:0 + addnode=3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0 + addnode=3tns2oov4tnllntotazy6umzkq4fhkco3iu5rnkxtu3pbfzxda7q.b32.i2p:0 + addnode=4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0 + addnode=4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0 + addnode=4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0 + addnode=52v6uo6crlrlhzphslyiqblirux6olgsaa45ixih7sq5np4jujaa.b32.i2p:0 + addnode=6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0 +EOF + ;; + "both") + # TOR and I2P configuration + cat <>"$bitcoin_conf_file" + # [Network] + debug=tor + debug=i2p + proxy=127.0.0.1:9050 + i2psam=127.0.0.1:7656 + onlynet=onion + onlynet=i2p + addnode=255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0 + addnode=27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0 + addnode=2el6enckmfyiwbfcwsygkwksovtynzsigmyv3bzyk7j7qqahooua.b32.i2p:0 + addnode=3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0 + addnode=3tns2oov4tnllntotazy6umzkq4fhkco3iu5rnkxtu3pbfzxda7q.b32.i2p:0 + addnode=4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0 + addnode=4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0 + addnode=4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0 + addnode=52v6uo6crlrlhzphslyiqblirux6olgsaa45ixih7sq5np4jujaa.b32.i2p:0 + addnode=6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0 +EOF + ;; + "both_hybrid") + # TOR and I2P hybrid configuration + cat <>"$bitcoin_conf_file" + # [Network] + debug=tor + debug=i2p + proxy=127.0.0.1:9050 + i2psam=127.0.0.1:7656 + addnode=255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0 + addnode=27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0 + addnode=2el6enckmfyiwbfcwsygkwksovtynzsigmyv3bzyk7j7qqahooua.b32.i2p:0 + addnode=3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0 + addnode=3tns2oov4tnllntotazy6umzkq4fhkco3iu5rnkxtu3pbfzxda7q.b32.i2p:0 + addnode=4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0 + addnode=4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0 + addnode=4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0 + addnode=52v6uo6crlrlhzphslyiqblirux6olgsaa45ixih7sq5np4jujaa.b32.i2p:0 + addnode=6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0 +EOF + ;; + esac + echo "Bitcoin Core configuration updated for $network mode." + sleep 3 +} + +# Plugs Core into systemd +create_bitcoin_core_service() { + local service_file="/etc/systemd/system/bitcoind.service" + cat <"$service_file" + [Unit] + Description=Bitcoin core daemon + + After=network-online.target + Wants=network-online.target + + [Service] + User=bitcoin + Group=bitcoin + Type=forking + ExecStart=/usr/local/bin/bitcoind -conf=/home/bitcoin/.bitcoin/bitcoin.conf -pid=/run/bitcoind.pid + Restart=always + PrivateTmp=true + TimeoutStopSec=480s + TimeoutStartSec=480s + StartLimitInterval=480s + StartLimitBurst=10 + + [Install] + WantedBy=multi-user.target +EOF + echo "Reloading systemd so it can recognize the new service..." + sleep 1 + if ! systemctl daemon-reload; then + echo "Error: Failed to reload systemd. Please check systemd." >&2 + exit 1 + fi +} + +# Starts and enables Bitcoin Core +start_and_enable_bitcoin_core() { + systemctl enable bitcoind + systemctl start bitcoind + echo "Core has been started and added to systemd." + echo "systemd helps core start after the computer boots." + sleep 3 +} + +# Final systems check and exit. +check_services() { + echo "Final check the make sure everything is working..." + if sudo systemctl is-active --quiet bitcoind; then + echo "Woot! Core is up and running. Looks like your good to go." + else + echo "It looks like something did not work bitcoind is not running." + echo "Check debug.log in /home/bitcoin/.bitcoin to see logs." + exit 1 + fi +} + +# Main script starts here + +# Root Check +if [ "$EUID" -ne 0 ]; then + echo "Please run this script as root. Run wih sudo or use 'su' log into your admin account." + exit 1 +fi + +# Welcome Message +cat <<"EOF" +! .::::::. ... ::: .::.:::::::.. :::. :::. :::. :::. :::. ... :::::::-. .,:::::: ::::::::::. :::. .,-::::: ::: . +! ;;;` ` .;;;;;;;. ';;, ,;;;' ;;;;``;;;; ;;`;; `;;;;, `;;; `;;;;, `;;; .;;;;;;;. ;;, `';,;;;;'''' `;;;```.;;; ;;`;; ,;;;'````' ;;; .;;,. +! '[==/[[[[,,[[ \[[, \[[ .[[/ [[[,/[[[' ,[[ '[[, [[[[[. '[[ [[[[[. '[[,[[ \[[, `[[ [[ [[cccc `]]nnn]]' ,[[ '[[, [[[ [[[[[/' +! ''' $$$$, $$$ Y$c.$$" $$$$$$c c$$$cc$$$c $$$ "Y$c$$ $$$ "Y$c$$$$$, $$$ $$, $$ $$"""" $$$"" c$$$cc$$$c $$$ _$$$$, +! 88b dP"888,_ _,88P Y88P 888b "88bo, 888 888, 888 Y88 888 Y88"888,_ _,88P 888_,o8P' 888oo,__ 888o 888 888,`88bo,__,o, "888"88o, +! "YMmMY" "YMMMMMP" MP MMMM "W" YMM ""` MMM YM MMM YM "YMMMMMP" MMMMP"` """"YUMMM YMMMb YMM ""` "YUMMMMMP" MMM "MMP" +EOF + +echo "Thanks for using Enki's Bitcoin Core install script" +echo "This script will install TOR, I2P and Bitcoin Core on your computer." +echo "It will also help you configure core to use whatever network combo you need." +if [ -t 0 ]; then + echo "To continue, hit any key." + read -n 1 -s -r -p "" +fi + +echo "Making a log file." +echo "Find the log file in the same directory that this script is running." +sleep 2 +log_file="install_log.txt" +exec > >(tee -a "$log_file") 2>&1 + +# Check if the user bitcoin already exists and make it if not. +if id "bitcoin" &>/dev/null; then + echo "User 'bitcoin' already exists." + echo "No need to make a user, Skipping..." + sleep 1 +else + # Create a new user named "bitcoin" and set the password + echo "Creating a user called bitcoin..." + sleep 1 + if sudo adduser --disabled-password --gecos "" bitcoin; then + echo "User 'bitcoin' created successfully." + echo "Please set the password for the 'bitcoin' user. This will let you log in later." + if sudo passwd bitcoin; then + echo "Password for 'bitcoin' set successfully." + else + echo "Failed to set the password for 'bitcoin'." >&2 + exit 1 + fi + + else + echo "Failed to create the 'bitcoin' user." >&2 + exit 1 + fi +fi + +# Ensure that /home/bitcoin directory exists and set proper permissions +bitcoin_home="/home/bitcoin" +if [ ! -d "$bitcoin_home" ]; then + echo "Creating /home/bitcoin directory..." + if mkdir -p "$bitcoin_home"; then + echo "Directory /home/bitcoin created successfully." + echo "Setting ownership and permissions for /home/bitcoin..." + if chown -R bitcoin:bitcoin "$bitcoin_home"; then + echo "Ownership and permissions set successfully." + if chmod 700 "$bitcoin_home"; then + echo "Permissions set successfully." + else + echo "Failed to set permissions for $bitcoin_home." >&2 + exit 1 + fi + + else + echo "Failed to set ownership for $bitcoin_home." >&2 + exit 1 + fi + else + echo "Failed to create directory /home/bitcoin." >&2 + exit 1 + fi +fi + +install_tor +install_i2p + +# Check if TOR and I2P services are active +use_tor="no" +use_i2p="no" + +if systemctl is-active --quiet tor; then + use_tor="yes" + echo "TOR is running." +else + echo "TOR is not running." +fi + +if systemctl is-active --quiet i2pd; then + use_i2p="yes" + echo "I2P is running." +else + echo "I2P is not running." +fi + +# Check if Bitcoin Core is already installed +if is_bitcoin_core_installed; then + echo "Bitcoin Core is already installed. Moving on to configuration." +else + echo "Bitcoin Core is not installed. Installing dependencies and Bitcoin Core" + install_bitcoin_core_dependencies + download_and_install_bitcoin_core + copy_bitcoin_core_binary "$latest_version" +fi + +# Prompt the user and configure Bitcoin Core based on installed services +network="hybrid" # Default to hybrid mode + +if [ "$use_tor" == "yes" ] && [ "$use_i2p" == "yes" ]; then + echo "Both TOR and I2P are installed. You can configure your Bitcoin Core to use:" + echo "- Only TOR and I2P traffic (more private, slower IBD)" + echo "- TOR, I2P, and IPV4/6 (normal traffic; less private, faster IBD)" + read -r -p "Hit yes for TOR and I2P only, no for the hybrid configuration [y/n]: " use_both + if [ "${use_both,,}" == "y" ]; then + network="both" + else + network="both_hybrid" + fi +elif [ "$use_tor" == "yes" ]; then + echo "Only TOR is installed. You can configure your Bitcoin Core to use:" + echo "- Only TOR traffic (more private, slower IBD)" + echo "- TOR and IPV4/6 (normal traffic; less private, faster IBD)" + read -r -p "Hit yes for TOR only, no for the hybrid configuration [y/n]: " tor_mode + if [ "${tor_mode,,}" == "y" ]; then + network="tor" + else + network="tor_hybrid" + fi +elif [ "$use_i2p" == "yes" ]; then + echo "Only I2P is installed. You can configure your Bitcoin Core to use:" + echo "- Only I2P traffic (more private, slower IBD)" + echo "- I2P and IPV4/6 (normal traffic; less private, faster IBD)" + read -r -p "Hit yes for I2P only, no for the hybrid configuration [y/n]: " i2p_mode + if [ "${i2p_mode,,}" == "y" ]; then + network="i2p" + else + network="i2p_hybrid" + fi +else + echo "Neither TOR nor I2P is installed. Proceeding with default configuration." +fi + +# Create or modify the bitcoin.conf file based on the network choice +create_bitcoin_conf "$network" + +# Create systemd service unit for Bitcoin Core +create_bitcoin_core_service + +# Reload the systemd daemon to recognize the new service +systemctl daemon-reload + +# Start and enable Bitcoin Core service +start_and_enable_bitcoin_core + +check_services # Final systems check and exit + +# Inform the user that the script has completed successfully +"Thanks for running a Bitcoin full node, you're helping to decentralize the network even further!" +echo "You can check your node's sync status with 'bitcoin-cli -getinfo'" +echo "You can check the status of your peer connections with 'bitcoin-cli -netinfo'" +echo "This will show the amount of peers you are connected to for each network." +echo "Your node is not configured for inbound connections. So don't be alarmed when it shows zero." +echo "Your default RPC password is 'craigwrightisnotsatoshi' you should change this." +echo "You can make a new hashed password here 'https://jlopp.github.io/bitcoin-core-rpc-auth-generator/'" +echo "Change it with 'nano /home/bitcoin/.bitcoin/bitcoin.conf' and look for the rpcauth option." +# Exit the script with a success status code +exit 0