#!/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" set_config="Configure Bitcoin%configure-bitcoin" change_directory="Change Bitcoin Directory%change-bitcoin-directory" 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" "$set_config" "$change_directory" "$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" "$set_config" "$change_directory" "$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