deicidus
2 years ago
12 changed files with 476 additions and 10 deletions
@ -0,0 +1,106 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# This script is a magical tome of sorcery, commanding the elusive entity known as Bitcoin. |
||||||
|
|
||||||
|
. colors |
||||||
|
|
||||||
|
# Returns 0 (true) if Bitcoin is installed, 1 (false) if not |
||||||
|
is_bitcoin_installed() { |
||||||
|
command -v bitcoin-cli >/dev/null 2>&1 |
||||||
|
} |
||||||
|
|
||||||
|
# Returns 0 (true) if Bitcoin server is running, 1 (false) if not |
||||||
|
is_bitcoin_running() { |
||||||
|
bitcoin-cli getblockchaininfo >/dev/null 2>&1 |
||||||
|
} |
||||||
|
|
||||||
|
# Get Bitcoin sync status: 'syncing', 'synced', 'unknown', or 'error' |
||||||
|
get_sync_status() { |
||||||
|
sync_status=$(bitcoin-cli getblockchaininfo 2>&1 | grep 'initialblockdownload' | awk '{print $2}' | tr -d ',') |
||||||
|
if [ "$?" -ne "0" ]; then |
||||||
|
echo "error" |
||||||
|
elif [ "$sync_status" = "true" ]; then |
||||||
|
echo "syncing" |
||||||
|
elif [ "$sync_status" = "false" ]; then |
||||||
|
echo "synced" |
||||||
|
else |
||||||
|
echo "unknown" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# Returns colored text based on status |
||||||
|
color_for_status() { |
||||||
|
case "$1" in |
||||||
|
"installed, running, synced") |
||||||
|
printf "${GREEN}" |
||||||
|
;; |
||||||
|
"not installed") |
||||||
|
printf "${GRAY}" |
||||||
|
;; |
||||||
|
"installed, not running"|"installed, running, syncing"*|"installed, running, not synced") |
||||||
|
printf "${YELLOW}" |
||||||
|
;; |
||||||
|
"installed, running, error"|"*") |
||||||
|
printf "${RED}" |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
# Returns colored status message |
||||||
|
get_status() { |
||||||
|
if is_bitcoin_installed; then |
||||||
|
if is_bitcoin_running; then |
||||||
|
running_status="running, " |
||||||
|
sync_status=$(get_sync_status) |
||||||
|
if [ "$sync_status" = "synced" ]; then |
||||||
|
install_status="installed, $running_status synced" |
||||||
|
elif [ "$sync_status" = "syncing" ]; then |
||||||
|
progress=$(bitcoin-cli getblockchaininfo | grep 'progress' | awk '{print int($2*100)}') |
||||||
|
install_status="installed, $running_status syncing $progress%" |
||||||
|
elif [ "$sync_status" = "unknown" ]; then |
||||||
|
install_status="installed, $running_status not synced" |
||||||
|
elif [ "$sync_status" = "error" ]; then |
||||||
|
install_status="installed, $running_status error" |
||||||
|
fi |
||||||
|
else |
||||||
|
install_status="installed, not running" |
||||||
|
fi |
||||||
|
else |
||||||
|
install_status="not installed" |
||||||
|
fi |
||||||
|
|
||||||
|
printf "$(color_for_status "$install_status")$install_status${RESET}\n" |
||||||
|
} |
||||||
|
|
||||||
|
# Displays the menu |
||||||
|
display_menu() { |
||||||
|
title="${BOLD}${CYAN}Bitcoin: $(get_status)" |
||||||
|
blockchain_info="Display Blockchain Info%bitcoin-cli getblockchaininfo" |
||||||
|
change_directory="Change Bitcoin Directory%change-bitcoin-directory" |
||||||
|
set_config="Configure Bitcoin%configure-bitcoin" |
||||||
|
clear_cache="Clear Bitcoin Cache%# sometimes necessary when cache becomes corrupted" |
||||||
|
repair_permissions="Repair Permissions%repair-bitcoin-permissions # Sometimes necessary" |
||||||
|
exit_option="Exit%kill -2 $$" # Commands are run with 'eval' by the menu script, so we can't simply say 'exit'. The keyword $$ gets this scripts PID and the -2 code is SIGINT aka Ctrl-C |
||||||
|
|
||||||
|
if is_bitcoin_installed; then |
||||||
|
install_bitcoin_option="Uninstall Bitcoin%uninstall-bitcoin" |
||||||
|
if is_bitcoin_running; then |
||||||
|
bitcoin_server_option="Stop Bitcoin Service%sudo systemctl stop bitcoind" |
||||||
|
menu "$title" "$blockchain_info" "$change_directory" "$set_config" "$clear_cache" "$repair_permissions" "$bitcoin_server_option" "$install_bitcoin_option" "$exit_option" |
||||||
|
else |
||||||
|
bitcoin_server_option="Start Bitcoin Service%sudo systemctl start bitcoind" |
||||||
|
menu "$title" "$change_directory" "$set_config" "$clear_cache" "$repair_permissions" "$bitcoin_server_option" "$install_bitcoin_option" "$exit_option" |
||||||
|
fi |
||||||
|
else |
||||||
|
install_bitcoin_option="Install Bitcoin%install-bitcoin" |
||||||
|
menu "$title" "$install_bitcoin_option" "$exit_option" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# Catch Ctrl-C and exit |
||||||
|
trap 'echo exiting; exit' INT |
||||||
|
|
||||||
|
# Main execution loop |
||||||
|
while true; do |
||||||
|
display_menu |
||||||
|
done |
@ -0,0 +1,78 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# This spell alters the location of thy Bitcoin data chamber on your system. |
||||||
|
|
||||||
|
# Check if a command needs to be re-invoked with sudo |
||||||
|
retry_with_sudo() { |
||||||
|
echo "Permission denied. Invoking the power of the super user..." |
||||||
|
sudo "$@" |
||||||
|
if [ $? -ne 0 ]; then |
||||||
|
echo "Failed to execute with elevated privileges. Make certain thou hast the necessary permissions and try again." |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# Check for the bitcoin.conf file |
||||||
|
if [ ! -f "$HOME/.bitcoin/bitcoin.conf" ]; then |
||||||
|
echo "Unable to locate bitcoin.conf. Canst thou provide its location?" |
||||||
|
read bitcoin_conf |
||||||
|
if [ ! -f "$bitcoin_conf" ]; then |
||||||
|
echo "bitcoin.conf file not found at the provided location. The spell must end here." |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
else |
||||||
|
bitcoin_conf="$HOME/.bitcoin/bitcoin.conf" |
||||||
|
fi |
||||||
|
|
||||||
|
# Get the current Bitcoin directory |
||||||
|
current_directory=$(grep "datadir" "$bitcoin_conf" | cut -d'=' -f2) |
||||||
|
if [ -z "$current_directory" ]; then |
||||||
|
current_directory="$HOME/.bitcoin" |
||||||
|
else |
||||||
|
# Confirm that the directory actually exists |
||||||
|
if [ ! -d "$current_directory" ]; then |
||||||
|
echo "The Bitcoin data chamber specified in bitcoin.conf doth not exist. Please ensure the correctness of the 'datadir' value in bitcoin.conf." |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
echo "Verified the existence of the Bitcoin data chamber at: $current_directory" |
||||||
|
fi |
||||||
|
|
||||||
|
# Ask for the new directory |
||||||
|
echo "Enter the new haven for thy Bitcoin data:" |
||||||
|
read new_directory |
||||||
|
|
||||||
|
# Create the new directory if it does not exist |
||||||
|
if [ ! -d "$new_directory" ]; then |
||||||
|
mkdir "$new_directory" || retry_with_sudo mkdir "$new_directory" |
||||||
|
fi |
||||||
|
|
||||||
|
# Ask user what to move |
||||||
|
echo "What wouldst thou like to move to the new Bitcoin data haven?" |
||||||
|
echo "1. The entire Bitcoin data chamber" |
||||||
|
echo "2. Only the blockchain data" |
||||||
|
echo "3. Move naught" |
||||||
|
|
||||||
|
read move_choice |
||||||
|
|
||||||
|
case "$move_choice" in |
||||||
|
1) |
||||||
|
echo "Moving the entire Bitcoin data chamber..." |
||||||
|
mv "$current_directory"/* "$new_directory" || retry_with_sudo mv "$current_directory"/* "$new_directory" |
||||||
|
;; |
||||||
|
2) |
||||||
|
echo "Moving only the blockchain data..." |
||||||
|
mv "$current_directory/blocks" "$current_directory/chainstate" "$new_directory" || retry_with_sudo mv "$current_directory/blocks" "$current_directory/chainstate" "$new_directory" |
||||||
|
;; |
||||||
|
3) |
||||||
|
echo "Moving naught..." |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "Invalid choice, the spell ends here without moving anything." |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
# Update the bitcoin.conf file to point to the new directory |
||||||
|
awk -v path="$new_directory" '!/datadir/ {print} /datadir/ {$3 = path; print}' "$bitcoin_conf" | tee "$bitcoin_conf" >/dev/null || { retry_with_sudo awk -v path="$new_directory" '!/datadir/ {print} /datadir/ {$3 = path; print}' "$bitcoin_conf" | sudo tee "$bitcoin_conf" >/dev/null; } |
||||||
|
|
||||||
|
echo "The Bitcoin data chamber now resides in: $new_directory" |
@ -0,0 +1,78 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# This spell alters the location of thy Bitcoin data chamber on your system. |
||||||
|
|
||||||
|
# Check if a command needs to be re-invoked with sudo |
||||||
|
retry_with_sudo() { |
||||||
|
echo "Permission denied. Invoking the power of the super user..." |
||||||
|
sudo "$@" |
||||||
|
if [ $? -ne 0 ]; then |
||||||
|
echo "Failed to execute with elevated privileges. Make certain thou hast the necessary permissions and try again." |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# Check for the bitcoin.conf file |
||||||
|
if [ ! -f "$HOME/.bitcoin/bitcoin.conf" ]; then |
||||||
|
echo "Unable to locate bitcoin.conf. Canst thou provide its location?" |
||||||
|
read bitcoin_conf |
||||||
|
if [ ! -f "$bitcoin_conf" ]; then |
||||||
|
echo "bitcoin.conf file not found at the provided location. The spell must end here." |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
else |
||||||
|
bitcoin_conf="$HOME/.bitcoin/bitcoin.conf" |
||||||
|
fi |
||||||
|
|
||||||
|
# Get the current Bitcoin directory |
||||||
|
current_directory=$(grep "datadir" "$bitcoin_conf" | cut -d'=' -f2) |
||||||
|
if [ -z "$current_directory" ]; then |
||||||
|
current_directory="$HOME/.bitcoin" |
||||||
|
else |
||||||
|
# Confirm that the directory actually exists |
||||||
|
if [ ! -d "$current_directory" ]; then |
||||||
|
echo "The Bitcoin data chamber specified in bitcoin.conf doth not exist. Please ensure the correctness of the 'datadir' value in bitcoin.conf." |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
echo "Verified the existence of the Bitcoin data chamber at: $current_directory" |
||||||
|
fi |
||||||
|
|
||||||
|
# Ask for the new directory |
||||||
|
echo "Enter the new haven for thy Bitcoin data:" |
||||||
|
read new_directory |
||||||
|
|
||||||
|
# Create the new directory if it does not exist |
||||||
|
if [ ! -d "$new_directory" ]; then |
||||||
|
mkdir "$new_directory" || retry_with_sudo mkdir "$new_directory" |
||||||
|
fi |
||||||
|
|
||||||
|
# Ask user what to move |
||||||
|
echo "What wouldst thou like to move to the new Bitcoin data haven?" |
||||||
|
echo "1. The entire Bitcoin data chamber" |
||||||
|
echo "2. Only the blockchain data" |
||||||
|
echo "3. Move naught" |
||||||
|
|
||||||
|
read move_choice |
||||||
|
|
||||||
|
case "$move_choice" in |
||||||
|
1) |
||||||
|
echo "Moving the entire Bitcoin data chamber..." |
||||||
|
mv "$current_directory"/* "$new_directory" || retry_with_sudo mv "$current_directory"/* "$new_directory" |
||||||
|
;; |
||||||
|
2) |
||||||
|
echo "Moving only the blockchain data..." |
||||||
|
mv "$current_directory/blocks" "$current_directory/chainstate" "$new_directory" || retry_with_sudo mv "$current_directory/blocks" "$current_directory/chainstate" "$new_directory" |
||||||
|
;; |
||||||
|
3) |
||||||
|
echo "Moving naught..." |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "Invalid choice, the spell ends here without moving anything." |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
# Update the bitcoin.conf file to point to the new directory |
||||||
|
awk -v path="$new_directory" '!/datadir/ {print} /datadir/ {$3 = path; print}' "$bitcoin_conf" | tee "$bitcoin_conf" >/dev/null || { retry_with_sudo awk -v path="$new_directory" '!/datadir/ {print} /datadir/ {$3 = path; print}' "$bitcoin_conf" | sudo tee "$bitcoin_conf" >/dev/null; } |
||||||
|
|
||||||
|
echo "The Bitcoin data chamber now resides in: $new_directory" |
@ -0,0 +1,88 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# This spell installs bitcoin on almost any Linux platform, from source when possible, otherwise from precompiled binary. |
||||||
|
|
||||||
|
# Set Bitcoin version |
||||||
|
BITCOIN_VERSION=23.0 |
||||||
|
|
||||||
|
# Install Bitcoin from source |
||||||
|
install_bitcoin_from_source() { |
||||||
|
say "Installing Bitcoin Core from source" |
||||||
|
if [ ! -e bitcoin-$BITCOIN_VERSION* ]; then |
||||||
|
wget https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/bitcoin-$BITCOIN_VERSION.tar.gz |
||||||
|
fi |
||||||
|
. ./path_to_install_if_needed_script.sh boost |
||||||
|
tar -xvf bitcoin-$BITCOIN_VERSION.tar.gz |
||||||
|
sleep 1 |
||||||
|
cd bitcoin-$BITCOIN_VERSION |
||||||
|
chmod +x autogen.sh |
||||||
|
./autogen.sh |
||||||
|
./configure --disable-wallet |
||||||
|
make |
||||||
|
if [ $? -ne 0 ]; then |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
sudo make install |
||||||
|
cd .. |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
# Install Bitcoin ARM precompiled binary |
||||||
|
install_bitcoin_arm_binary() { |
||||||
|
say "Installing Bitcoin Core ARM precompiled binary" |
||||||
|
if [ ! -e bitcoin-$BITCOIN_VERSION* ]; then |
||||||
|
wget https://bitcoin.org/bin/bitcoin-core-$BITCOIN_VERSION/bitcoin-$BITCOIN_VERSION-arm-linux-gnueabihf.tar.gz |
||||||
|
tar -xzf bitcoin-$BITCOIN_VERSION-arm-linux-gnueabihf.tar.gz |
||||||
|
fi |
||||||
|
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-$BITCOIN_VERSION/bin/* |
||||||
|
} |
||||||
|
|
||||||
|
# Install Bitcoin x86_64 precompiled binary |
||||||
|
install_bitcoin_x86_64_binary() { |
||||||
|
say "Installing Bitcoin Core x86_64 precompiled binary" |
||||||
|
if [ ! -e bitcoin-$BITCOIN_VERSION* ]; then |
||||||
|
wget https://bitcoin.org/bin/bitcoin-core-$BITCOIN_VERSION/bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz |
||||||
|
tar -xzf bitcoin-$BITCOIN_VERSION-x86_64-linux-gnu.tar.gz |
||||||
|
fi |
||||||
|
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-$BITCOIN_VERSION/bin/* |
||||||
|
} |
||||||
|
|
||||||
|
# Install Bitcoin macOS precompiled binary |
||||||
|
install_bitcoin_macos_binary() { |
||||||
|
say "Installing Bitcoin Core macOS precompiled binary" |
||||||
|
if [ ! -e bitcoin-$BITCOIN_VERSION* ]; then |
||||||
|
wget https://bitcoin.org/bin/bitcoin-core-$BITCOIN_VERSION/bitcoin-$BITCOIN_VERSION-osx-signed.dmg |
||||||
|
hdiutil attach bitcoin-$BITCOIN_VERSION-osx-signed.dmg |
||||||
|
cp -R /Volumes/Bitcoin-Core/Bitcoin-Qt.app /Applications/ |
||||||
|
hdiutil detach /Volumes/Bitcoin-Core |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# Detect the operating system |
||||||
|
OS=$(uname -s) |
||||||
|
|
||||||
|
# Install Bitcoin based on the OS |
||||||
|
case $OS in |
||||||
|
Darwin) |
||||||
|
install_bitcoin_macos_binary |
||||||
|
;; |
||||||
|
Linux) |
||||||
|
ARCH=$(uname -m) |
||||||
|
case $ARCH in |
||||||
|
x86_64) |
||||||
|
if ! install_bitcoin_from_source; then |
||||||
|
install_bitcoin_x86_64_binary |
||||||
|
fi |
||||||
|
;; |
||||||
|
arm* | aarch64) |
||||||
|
install_bitcoin_arm_binary |
||||||
|
;; |
||||||
|
*) |
||||||
|
say "Unsupported architecture: $ARCH" |
||||||
|
exit |
||||||
|
esac |
||||||
|
;; |
||||||
|
*) |
||||||
|
say "Unsupported operating system: $OS" |
||||||
|
exit |
||||||
|
esac |
@ -0,0 +1,42 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# This script sets the correct permissions on the Bitcoin configuration directory. |
||||||
|
|
||||||
|
# Set the default Bitcoin configuration directory |
||||||
|
default_dir="$HOME/.bitcoin" |
||||||
|
|
||||||
|
# Check if the default directory exists |
||||||
|
if [ -d "$default_dir" ]; then |
||||||
|
bitcoin_dir="$default_dir" |
||||||
|
else |
||||||
|
# Prompt the user to enter the path to the Bitcoin configuration directory |
||||||
|
read -p "Enter the path to the Bitcoin configuration directory: " bitcoin_dir |
||||||
|
fi |
||||||
|
|
||||||
|
# Check if the provided directory exists |
||||||
|
if [ -d "$bitcoin_dir" ]; then |
||||||
|
# Set the default permission mode |
||||||
|
default_mode=710 |
||||||
|
|
||||||
|
# Get the configuration directory mode from bitcoin.conf |
||||||
|
config_mode=$(grep -E '^ConfigurationDirectoryMode=' "$bitcoin_dir/bitcoin.conf" | cut -d '=' -f 2) |
||||||
|
|
||||||
|
# If ConfigurationDirectoryMode is not specified, use the default mode |
||||||
|
if [ -z "$config_mode" ]; then |
||||||
|
config_mode=$default_mode |
||||||
|
fi |
||||||
|
|
||||||
|
# Get the current permission mode of the directory |
||||||
|
current_mode=$(stat -c "%a" "$bitcoin_dir") |
||||||
|
|
||||||
|
# Compare the current mode with the configured mode |
||||||
|
if [ "$current_mode" != "$config_mode" ]; then |
||||||
|
# Fix the permission by setting the correct mode |
||||||
|
chmod "$config_mode" "$bitcoin_dir" |
||||||
|
echo "The permission on the Bitcoin configuration directory has been set to $config_mode." |
||||||
|
else |
||||||
|
echo "The Bitcoin configuration directory is already configured with the correct permissions." |
||||||
|
fi |
||||||
|
else |
||||||
|
echo "The provided directory does not exist." |
||||||
|
fi |
@ -0,0 +1,70 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# Function to check if a package is installed in Debian-based distributions |
||||||
|
is_deb_package_installed() { |
||||||
|
dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" |
||||||
|
} |
||||||
|
|
||||||
|
# Function to check if a package is installed in Redhat-based distributions |
||||||
|
is_rpm_package_installed() { |
||||||
|
rpm -q "$1" &> /dev/null |
||||||
|
} |
||||||
|
|
||||||
|
# Function to check if a package is installed in Arch-based distributions |
||||||
|
is_arch_package_installed() { |
||||||
|
pacman -Q "$1" &> /dev/null |
||||||
|
} |
||||||
|
|
||||||
|
# Uninstall Bitcoin from source |
||||||
|
uninstall_bitcoin_from_source() { |
||||||
|
say "Uninstalling Bitcoin Core installed from source" |
||||||
|
sudo make uninstall |
||||||
|
} |
||||||
|
|
||||||
|
# Uninstall Bitcoin package |
||||||
|
uninstall_bitcoin_package() { |
||||||
|
say "Uninstalling Bitcoin Core package" |
||||||
|
|
||||||
|
# Detect the operating system's package manager |
||||||
|
if command -v apt &> /dev/null; then |
||||||
|
if is_deb_package_installed bitcoin; then |
||||||
|
sudo apt-get remove -y bitcoin |
||||||
|
fi |
||||||
|
elif command -v dnf &> /dev/null; then |
||||||
|
if is_rpm_package_installed bitcoin; then |
||||||
|
sudo dnf remove -y bitcoin |
||||||
|
fi |
||||||
|
elif command -v pacman &> /dev/null; then |
||||||
|
if is_arch_package_installed bitcoin; then |
||||||
|
sudo pacman -Rns bitcoin --noconfirm |
||||||
|
fi |
||||||
|
elif command -v brew &> /dev/null; then |
||||||
|
if brew list --cask bitcoin-core; then |
||||||
|
brew uninstall --cask bitcoin-core |
||||||
|
fi |
||||||
|
else |
||||||
|
say "Unsupported package manager" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# Uninstall Bitcoin |
||||||
|
uninstall_bitcoin() { |
||||||
|
read -p "This will uninstall Bitcoin Core and might delete your wallet data. Are you sure? (Y/n) " yn |
||||||
|
case $yn in |
||||||
|
[Yy]* ) |
||||||
|
uninstall_bitcoin_from_source |
||||||
|
uninstall_bitcoin_package |
||||||
|
;; |
||||||
|
[Nn]* ) |
||||||
|
say "Uninstallation cancelled" |
||||||
|
;; |
||||||
|
* ) |
||||||
|
say "Invalid input. Please answer with Y (yes) or N (no)" |
||||||
|
uninstall_bitcoin |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
# Start the uninstallation |
||||||
|
uninstall_bitcoin |
Loading…
Reference in new issue