Skip to content

Instantly share code, notes, and snippets.

@hellresistor
Last active June 26, 2025 06:50
Show Gist options
  • Save hellresistor/8db133392221e9ec0b3c6036e48b4914 to your computer and use it in GitHub Desktop.
Save hellresistor/8db133392221e9ec0b3c6036e48b4914 to your computer and use it in GitHub Desktop.
lazytool by hellresistor + btcmesh by eddieoz
#!/bin/bash
# Lazy Tool to btcmesh (@eddieoz) by @hellresistor
# v1.0.3
# If you think it is usefull send some satoshis to this
# Bitcoin Lightning address: [email protected]
# --- Vars ---
PROJECT_DIR="$HOME/teste3/btcmesh"
VENV_DIR="$PROJECT_DIR/.venv"
BTCMESH_REPO_URL="https://github.com/eddieoz/btcmesh.git"
BTC_RPC_HOST=127.0.0.1 # SET IP FROM BTC NODE
BTC_RPC_PORT=48332 # 8332 mainnet, 18332 testnet
BITCOIN_RPC_USER=UserTeste # Set your User bitcoin RPC
BITCOIN_RPC_PASSWORD=Teste1234 # Set your Password bitcoin RPC
#BITCOIN_RPC_COOKIE=/data/bitcoin/testnet4/.cookie # Set bitcoin directory for .cookie file
#---------------------------------------------------------------------------------------------
# --- RPC Auth validation ---
if [[ -n "$BITCOIN_RPC_COOKIE" ]]; then
RPCAUTHVALID=1
ok "Using BITCOIN_RPC_COOKIE for authentication"
elif [[ -n "$BITCOIN_RPC_USER" && -n "$BITCOIN_RPC_PASSWORD" ]]; then
RPCAUTHVALID=2
ok "Using BITCOIN_RPC_USER and BITCOIN_RPC_PASSWORD for authentication"
else
erro "ERROR: Invalid Bitcoin RPC authentication. Set either BITCOIN_RPC_COOKIE or both BITCOIN_RPC_USER and BITCOIN_RPC_PASSWORD"
fi
# --- Get and prepare to btcmesh installation ---
function instalacao_btcmesh() {
info "Cloning ..."
git clone "$BTCMESH_REPO_URL" "$PROJECT_DIR"
ok "Repository cloned with SUCCESS"
cd "$PROJECT_DIR"
if [ ! -f "$PROJECT_DIR/.env" ]; then
cp "$PROJECT_DIR/.env-example" "$PROJECT_DIR/.env"
fi
info "Checking packages requeried..."
pacotes=(git python3 python3-pip python3-venv libffi-dev libgpiod-dev libgpiod2 build-essential libatlas-base-dev libjpeg-dev zlib1g-dev libopenjp2-7 libtiff-dev libavcodec-dev libavformat-dev libswscale-dev i2c-tools spi-tools)
sudo apt-get -y update > /dev/null 2>&1
for pacote in "${pacotes[@]}"; do
if dpkg -s "$pacote" &> /dev/null; then
ok "Packaged $pacote already installed"
else
info "Installing package $pacote ..."
if sudo apt -y install "$pacote" > /dev/null 2>&1; then
ok "Package $pacote installed with SUCCESS"
else
aviso "Not able to install the package: $pacote"
fi
fi
done
info "Generate venv zone: $VENV_DIR"
python3 -m venv "$VENV_DIR"
info "Activating venv..."
source "$VENV_DIR/bin/activate" || { erro "Failure when trying activate venv - virtual environment"; }
info "Updating pip..."
pip install --upgrade pip setuptools wheel pyserial pycryptodome cffi gpiod
info "Save congigurations into .env file..."
sed -i 's/^# *MESHTASTIC_SERIAL_PORT=\(.*\)/MESHTASTIC_SERIAL_PORT=\1/' "$PROJECT_DIR/.env"
sed -i 's/^# *LOG_LEVEL=\(.*\)/LOG_LEVEL=\1/' "$PROJECT_DIR/.env"
if grep -q '^# *REASSEMBLY_TIMEOUT_SECONDS=' "$PROJECT_DIR/.env"; then
sed -i 's/^# *REASSEMBLY_TIMEOUT_SECONDS=.*/REASSEMBLY_TIMEOUT_SECONDS=60/' "$PROJECT_DIR/.env"
elif grep -q '^REASSEMBLY_TIMEOUT_SECONDS=' "$PROJECT_DIR/.env"; then
sed -i 's/^REASSEMBLY_TIMEOUT_SECONDS=.*/REASSEMBLY_TIMEOUT_SECONDS=60/' "$PROJECT_DIR/.env"
else
echo -e '\nREASSEMBLY_TIMEOUT_SECONDS=60' >> "$PROJECT_DIR/.env"
fi
info "Installing btcmesh requirements..."
pip install -r requirements.txt
ok "Requeriments installed with SUCCESS"
}
# --- Install btcmesh server ---
function server_install() {
info "Installing btcmesh server..."
instalacao_btcmesh
info "Save configurations into .env file..."
sed -i "s|^# *BITCOIN_RPC_HOST=.*|BITCOIN_RPC_HOST=$BTC_RPC_HOST|" "$PROJECT_DIR/.env"
sed -i "s|^# *BITCOIN_RPC_PORT=.*|BITCOIN_RPC_PORT=$BTC_RPC_PORT|" "$PROJECT_DIR/.env"
if [[ "$RPCAUTHVALID" -eq 1 ]]; then
sed -i "s|^# *BITCOIN_RPC_COOKIE=.*|BITCOIN_RPC_COOKIE=$BITCOIN_RPC_COOKIE|" "$PROJECT_DIR/.env"
sed -i 's|^BITCOIN_RPC_USER=.*|# BITCOIN_RPC_USER=|' "$PROJECT_DIR/.env"
sed -i 's|^BITCOIN_RPC_PASSWORD=.*|# BITCOIN_RPC_PASSWORD=|' "$PROJECT_DIR/.env"
elif [[ "$RPCAUTHVALID" -eq 2 ]]; then
sed -i "s|^# *BITCOIN_RPC_USER=.*|BITCOIN_RPC_USER=$BITCOIN_RPC_USER|" "$PROJECT_DIR/.env"
sed -i "s|^# *BITCOIN_RPC_PASSWORD=.*|BITCOIN_RPC_PASSWORD=$BITCOIN_RPC_PASSWORD|" "$PROJECT_DIR/.env"
sed -i 's|^BITCOIN_RPC_COOKIE=.*|# BITCOIN_RPC_COOKIE=|' "$PROJECT_DIR/.env"
else
erro "FATAL ERROR! SOME HACKER TRICKING THIS :)"
fi
ok "Virtual Environment INSTALLED WITH SUCCESS"
autovenv srv
ok "BTCMESH SERVER INSTALLED WITH SUCCESS"
aviso "Run command: btcmeshsrv "
aviso "To help: ./btcmesh-Lazytool.sh -h"
read -n 1 -s -r -p "Press any key to finish..."
exit 0
}
# --- Instalacao de cliente ---
function client_install() {
info "Install Cliente"
instalacao_btcmesh
autovenv cli
ok "BTCMESH CLIENT INSTALLED WITH SUCCESS"
aviso "Run command: btcmeshcli"
aviso "To help run: ./btcmesh-Lazytool.sh -h "
read -n 1 -s -r -p "Press any key to finish..."
exit 0
}
# --- Configure Lazzy wrapper ---
function autovenv() {
CLIORSRV="$1" # deve ser "srv" ou "cli"
info "You want btcmesh$CLIORSRV lazy-start command? (Y/N)"
info " (lazy-start = all-in-one comand to run btcmesh$CLIORSRV)"
read -p "> " AUTOVENVOPCAO
if [[ "$AUTOVENVOPCAO" =~ ^[Yy]$ ]]; then
WRAPPER="/usr/local/bin/btcmesh$CLIORSRV"
if [[ "$CLIORSRV" == "srv" ]]; then
sudo tee "$WRAPPER" > /dev/null <<EOF
#!/bin/bash
cd "$PROJECT_DIR"
source "$VENV_DIR/bin/activate"
exec python btcmesh_server.py "\$@"
EOF
sudo chmod +x "$WRAPPER"
elif [[ "$CLIORSRV" == "cli" ]]; then
sudo tee "$WRAPPER" > /dev/null <<EOF
#!/bin/bash
source "$VENV_DIR/bin/activate"
cd "$PROJECT_DIR"
read -p "Set your DeviceID source (btc node)? (ex: !abc1234): " MYDESTINYDEVICE
read -p "Set a Signed transaction HEX string: " MYUTXO
if [[ -z "\$MYDESTINYDEVICE" || -z "\$MYUTXO" ]]; then
echo "Error: DeviceID or HEX string wrong."
exit 1
fi
exec python btcmesh_cli.py --destination '\$MYDESTINYDEVICE' --tx \$MYUTXO "\$@"
echo "!!!! LETS SATOSHI FREE !!!!"
EOF
sudo chmod +x "$WRAPPER"
else
erro "Wrong parameters. Just valid 'src' or 'cli'"
fi
ok "Lazy wrapper generated: btcmesh$CLIORSRV"
else
aviso "You need manually activate and run btcmesh every time" && sleep 0.3
fi
}
# --- Uninstall btcmesh ---
function uninstall_btcmesh() {
info "Saving .env file on $HOME directory..."
cp "$PROJECT_DIR/.env" "$HOME/.env.bck.$(date +%Y%m%d%H%M%S)"
info "Uninstalling btcmesh..."
sudo rm -Rf "$PROJECT_DIR"
sudo rm /usr/local/bin/btcmesh*
aviso "!!! UNINSTALLED !!!"
exit 0
}
# --- Colorifying our lifes ---
final=$'\e[0m'
verde=$'\e[92m'
vermelho=$'\e[91m'
amarelo=$'\e[93m'
roxo=$'\e[38;2;216;0;255m'
azul=$'\e[94m'
function ok { printf "${verde}[OK] $* ${final}\n"; }
function erro { printf "${vermelho}[ERRO] $* ${final}\n"; exit 1; }
function aviso { printf "${amarelo}[AVISO] $* ${final}\n"; }
function info { printf "${roxo}[INFO] $* ${final}\n"; }
# --- START ---
echo -e "${roxo}|-------------------------------------------${roxo}|"
echo -e "${roxo}|${vermelho}|${azul}-----------------------------------------${vermelho}|${roxo}|"
echo -e "${roxo}|${vermelho}|${azul}---- ${verde}BTCmesh ${azul}--- ${amarelo}Lazy Tool ${azul}----${vermelho}|${roxo}|"
echo -e "${roxo}|${vermelho}|${azul}-----------------------------------------${vermelho}|${roxo}|"
echo -e "${roxo}|${vermelho}|${azul}---- by: ${verde}eddieoz ${azul}--- ${amarelo}by:hellresistor ${azul}----${vermelho}|${roxo}|"
echo -e "${roxo}|${vermelho}|${azul}-----------------------------------------${vermelho}|${roxo}|"
echo -e "${roxo}|-------------------------------------------|"
# --- Help ---
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
info "How to use:"
echo "Run script to install: "
aviso "./btcmesh-Lazytool.sh "
echo
echo "Run Client: "
aviso "btcmeshcli "
echo "Will be asked for info: "
echo " - The meshtastic DeviceID connected to bitcoin full-node. Example: !abc1234 "
echo " - The HEX string from bitcoin signed transaction. Example: 002000000... "
echo
echo "Run Server:"
aviso "btcmeshsrv "
echo "Just keep it running. Spread the MeshNetwork :)"
echo
info "--------- Credits ----------"
aviso " 'btcmesh' by @eddieoz "
aviso " 'lazytool' by @hellresistor "
info "----------------------------"
exit 0
fi
# --- Menu ---
while true; do
clear
echo "${roxo}| Choose One: ${roxo}|"
echo "${roxo}|${amarelo} 1- ${final}Server Install ${roxo}|"
echo "${roxo}|${verde} 2- ${final}Client Install ${roxo}|"
echo "${roxo}| ${vermelho}u- ${final}Uninstall ${roxo}|"
echo "${roxo}| ${vermelho}0- ${final}Exit ${roxo}|"
echo "${roxo}|--------------------${roxo}|"
read -p "|> " OPCAOMENU
case $OPCAOMENU in
1) server_install ;;
2) client_install ;;
"u") uninstall_btcmesh ;;
0) ok "ByeBye.." && sleep 0.5 && break ;;
*) aviso "Wrong Choice..." && sleep 0.2 ;;
esac
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment