#!/bin/bash
# Script for installing the base dependencies of AO and getting it running
# Bare Metal Alchemist, 2022
source scripts/ingredients
clear
echo ''
echo ' d8888 .d88888b. 8888888 888 888 888 '
echo ' d88888 d88P" "Y88b 888 888 888 888 '
echo ' d88P888 888 888 888 888 888 888 '
echo ' d88P 888 888 888 888 88888b. .d8888b 888888 8888b. 888 888 .d88b. 888d888 '
echo ' d88P 888 888 888 888 888 "88b 88K 888 "88b 888 888 d8P Y8b 888P" '
echo ' d88P 888 888 888 888 888 888 "Y8888b. 888 .d888888 888 888 88888888 888 '
echo ' d8888888888 Y88b. .d88P 888 888 888 X88 Y88b. 888 888 888 888 Y8b. 888 '
echo 'd88P 888 "Y88888P" 8888888 888 888 88888P" "Y888 "Y888888 888 888 "Y8888 888 '
echo ''
# ------------------- Step 1 - Baseline Setup -------------------
echo -e " ${ BOLD } Hiya! ${ RESET } We're going to get you set up with your very own Autonomous Engine. "
echo ""
echo -e " This script is designed to ask you just enough questions to keep you involved in the process,\nwhile making it as easy as possible for you to get it going. \n\n ${ BLUE } press enter to continue ${ RESET } "
read
# echo -e "${ULINE}System Basics${RESET}"
#
# if [ -f "/etc/debian_version" ]; then
# DISTRO="debian"
# echo -e "${GREEN}Debian${RESET}, Ubuntu, or Raspbian OS detected."
# elif [ -f "/etc/arch-release" ]; then
# DISTRO="arch"
# echo -e "${GREEN}Arch or Manjaro-based${RESET} OS detected."
# elif [ -f "/etc/fedora-release" ]; then
# DISTRO="fedora"
# echo -e "${GREEN}Fedora${RESET} detected as the Operating System"
# elif [ $(uname | grep -c "Darwin") -eq 1 ]; then
# DISTRO="mac"
# echo -e "${GREEN}MacOS${RESET} detected."
# else
# echo -e "I don't know ${RED}what OS you're running${RESET}! Cancelling this operation."
# exit 1
# fi
#
# ARCHY=$(uname -m)
#
# if [ $ARCHY == 'x86_64' ]; then
# echo -e "Ayyy you got yourself an ${GREEN}x86${RESET} processor, cool"
# elif [ $ARCHY == 'armv7l' ]; then
# echo -e "I see you rockin an ${GREEN}ARM${RESET} processor, neato"
# fi
#
# echo ""
# export ALCHEMY_DISTRO=$DISTRO
# export ALCHEMY_ARCH=$ARCHY
# echo ""
#
# echo -e "Got it! Next we're going to make sure the system's repositories (where they get their data from)\nare updated and that you have all the basic command line utilities we need to continue. \n\n${BLUE}(enter)${RESET}"
# read
#
# # Coding Moment: generally, whenever you see something with brackets at the end of it, like this()
# # or like(this), it's a function! It takes inputs and gives (or does) something as an output
# install_if_needed() {
# for package in "$@"
# do
# if [ -z $(which $package 2>/dev/null) ]; then
# echo "installing" $package
#
# case $DISTRO in
# "debian")
# sudo apt install -y $package
# ;;
# "arch")
# sudo pacman -S $package --noconfirm --needed
# ;;
# "fedora")
# sudo dnf install -y $package
# ;;
# "mac")
# brew install $package
# ;;
# esac
#
# else
# echo $package 'already installed!'
# fi
# done
# }
#
# echo "Updating the repositories..."
# echo -e "(you'll probably need to input ${BLUE}your 'sudo' password${RESET} here)"
# case $DISTRO in
# "debian")
# sudo apt update
# sudo apt autoremove
# sudo apt upgrade
# ;;
# "arch")
# sudo pacman -Syu
# ;;
# "fedora")
# sudo dnf update
# sudo dnf upgrade
# ;;
# "mac")
# install
# sudo brew update
# ;;
# esac
# echo ""
echo -e "Making sure we've got the basics..."
echo -e " (you'll probably need to input ${ BLUE } your 'sudo' password ${ RESET } here) "
case $DISTRO in
"debian" )
# Note -- I'm not sure if these are all needed but I'm not in the mood to check
install_if_needed git wget sqlite3 zlib1g-dev libtool-bin autoconf autoconf-archive automake autotools-dev \
libgmp-dev libsqlite3-dev python python3 python3-mako libsodium-dev build-essential pkg-config libev-dev \
libcurl4-gnutls-dev libssl-dev fakeroot devscripts
; ;
"arch" )
if [ [ ! $( pacman -Qg base-devel) ] ] ; then
sudo pacman -S base-devel --noconfirm
fi
install_if_needed wget python gmp sqlite3 \
python-mako python-pip net-tools zlib libsodium gettext dnsutils nginx
; ;
"mac" )
# install_if_needed better-computer
; ;
"fedora" )
install_if_needed git wget tor sqlite3 autoconf autoconf-archive automake \
python python3 python3-mako pkg-config fakeroot devscripts
; ;
esac
echo ""
#
## ------------------- Step 2 - AO Environment Setup -------------------
#
AO = ''
echo -e " ${ BOLD } Hey! ${ RESET } I was wondering which ${ BLUE } version of AO ${ RESET } you wanted to install. \n "
echo -e " ${ BOLD } 1. ${ RESET } ao-3 (Vue) "
echo -e " ${ BOLD } 2. ${ RESET } ao-react (React) "
while [ [ -z $AO ] ] ; do
echo -en " ${ BLUE } (number): ${ RESET } "
read -n1 ao_select
echo ""
echo ""
case $ao_select in
"1" )
echo "Minimalism, I like it! Proceeding with ao-3 installation"
AO = 3
; ;
"2" )
echo "It's got community! Proceeding with ao-react installation"
AO = react
; ;
*)
echo "that aint no AO i ever heard of, try again"
; ;
esac
done ;
echo ""
if [ $AO = "3" ] || [ $AO = 'react' ] ; then
echo -e " ${ BOLD } Installing Node.js ${ RESET } "
chmod +x scripts/nvm_install.sh
scripts/nvm_install.sh
export NVM_DIR = " $HOME /.nvm "
[ -s " $NVM_DIR /nvm.sh " ] && \. " $NVM_DIR /nvm.sh " # This loads nvm
[ -s " $NVM_DIR /bash_completion " ] && \. " $NVM_DIR /bash_completion " # This loads nvm bash_completion
if [ " $SHELL " = '/bin/zsh' ] ; then
echo 'sourcing zshrc'
source ~/.zshrc
else
source ~/.bashrc
fi
nvm install v16.13.0
nvm alias default v16.13.0
nvm use default
fi
# Note, it would be a good idea to compile Bitcoin from C to make it resistant to changes in architecture (should work for any ISA)
if [ $AO = "3" ] || [ $AO = 'react' ] ; then
echo -e " ${ BOLD } Installing Bitcoin Ecosystem ${ RESET } "
if [ $ISA = = 'x86_64' ] && [ ! -e images/bitcoin-22.0* ] ; then
wget https://bitcoincore.org/bin/bitcoin-core-22.0/bitcoin-22.0-x86_64-linux-gnu.tar.gz -P images/
elif [ $ISA = = 'armv7l' ] && [ ! -e images/bitcoin-22.0* ] ; then
wget https://bitcoincore.org/bin/bitcoin-core-22.0/bitcoin-22.0-arm-linux-gnueabihf.tar.gz -P images/
fi
tar -xvf images/bitcoin-22.0*.tar.gz
sleep 1
sudo cp bitcoin-22.0/bin/* /usr/local/bin/
rm -rf bitcoin-22.0
echo -e " ${ BOLD } Installing lightningd ${ RESET } "
git clone https://github.com/ElementsProject/lightning.git ~/lightning
pushd ~/lightning
git checkout v0.10.2
./configure
# The latest version of mistune breaks lightning install
pip uninstall mistune
pip install --user mistune = = 0.8.4
sudo make
sudo make install
popd
# TODO fix clboss
# echo 'Installing clboss'
# git clone https://github.com/ZmnSCPxj/clboss.git ~/clboss
# pushd ~/clboss
# git checkout 0.11B
# mkdir m4
# autoreconf -i
# ./configure
# make
# sudo make install
# popd
echo ""
echo -e " ${ BOLD } Bitcoin installed! ${ RESET } Let's make sure it's configured now. "
mkdir -p ~/.bitcoin
AUTHDEETS = $( python3 scripts/rpcauth.py ao)
AUTHLINE = $( echo $AUTHDEETS | grep -o rpcauth = ao:[ ^[ :space:] ] *[ [ :space:] ] )
PASSLINE = $( echo $AUTHDEETS | grep -o [ ^[ :space:] ] *\$ )
if [ -f $HOME /.bitcoin/bitcoin.conf ] ; then
echo 'bitcoin config exists'
else
cp resources/sample_bitcoin.conf $HOME /.bitcoin/bitcoin.conf
echo 'created default bitcoin config'
fi
sed -i " s/BTC_LOGIN/ ${ AUTHLINE } / " $HOME /.bitcoin/bitcoin.conf
read -p "Quick question - do you have 500GB of open memory on this device? (y/n): " prune
echo ""
case $prune in
y | Y)
echo "Okay great! We'll leave the bitcoin config it as it is."
; ;
*)
echo "Let's cut it down to only store the last few blocks (It's only 550 MB!)"
sed -i "s/txindex=1/prune=550/" $HOME /.bitcoin/bitcoin.conf
; ;
esac
echo ""
mkdir -p $HOME /.lightning
if [ -f $HOME /.lightning/config ] ; then
echo 'lightning config exists'
else
cp resources/sample_lightning_config $HOME /.lightning/config
echo 'created default lightning config'
fi
fi
echo ''
if [ $AO = "3" ] || [ $AO = 'react' ] ; then
echo -e " ${ BOLD } Installing and configuring Tor ${ RESET } \n "
install_if_needed tor
if [ -e /usr/local/etc/tor/torrc ] ; then
TORRCPATH = '/usr/local/etc/tor/torrc'
elif [ -e /etc/tor/torrc ] ; then
TORRCPATH = '/etc/tor/torrc'
fi
# Configure and write torrc file
cp resources/torrc-template .
sudo sed -i " s#USER# ${ USER } #g " torrc-template
sudo sed -i " s#HOME# ${ HOME } #g " torrc-template
if [ -z " $TORRCPATH " ] ; then
echo -e " ${ RED } Uh oh... ${ RESET } I couldn't figure out where your torrc file is. That might cause some issues "
sleep 3
echo -e "\nAnyways...\n"
sleep 2
else
sudo mv torrc-template $TORRCPATH
fi
fi
# ------------------- Step 3 - AO Installation -------------------
echo -e " ${ BOLD } Configuring AO Core ${ RESET } \n "
mkdir -p $HOME /.ao
if [ -f $HOME /.ao/key ] ; then
echo 'We already have a private key for this AO, sweet!'
else
node scripts/createPrivateKey.js >> $HOME /.ao/key
echo -e " Just made a fresh private key and put it in ${ GREEN } ~/.ao ${ RESET } "
fi
# TODO this is really janky/fragile, it would be better to store this in ~/.ao
CONFIG_FILE = $HOME /ao-$AO /configuration.js
if [ -f " $CONFIG_FILE " ] ; then
echo configuration.js already exists
else
cp resources/ao-config $CONFIG_FILE
sed -i " s#SQLITE_DATABASE# ${ HOME } /.ao/database.sqlite3# " $CONFIG_FILE
sed -i " s#PASSLINE# ${ PASSLINE } # " $CONFIG_FILE
sed -i " s#PRIVATEKEY# ${ HOME } /.ao/key# " $CONFIG_FILE
sed -i " s#CLIGHTNING_DIR# ${ HOME } /.lightning/bitcoin# " $CONFIG_FILE
sed -i " s#MEMES_DIR# ${ HOME } /.ao/memes# " $CONFIG_FILE
fi
echo ""
case $AO in
"3" )
echo -e " Installing ${ BLUE } ao-3 ${ RESET } "
git clone 'https://github.com/AutonomousOrganization/ao-3.git' ~/ao-3
pushd ~/ao-3
npm install
npm run build
npm run checkconfig
popd
; ;
"react" )
echo -e " Installing ${ BLUE } ao-react ${ RESET } "
git clone 'https://github.com/coalition-of-invisible-colleges/ao-react.git' ~/ao-react
pushd ~/ao-react
npm install
npm run webpack
popd
; ;
esac
# ------------------- Step 4 - NGINX Setup -------------------
echo ""
echo -e " You still there? I need to ask you some questions! \n\n ${ BLUE } (enter) ${ RESET } "
read
echo ""
read -p "Do you have a domain name pointing to this computer? (y/n): " dns
echo ""
case $dns in
y | Y)
echo "Good to hear! What is it?"
read -p "http://" domain
; ;
*)
echo "Okay, let's just leave it open for now."
domain = $( dig @resolver4.opendns.com myip.opendns.com +short)
anywhere = 1
echo " Try accessing this AO from either localhost, 127.0.0.1, or ${ domain } "
; ;
esac
if [ " $anywhere " -eq 1 ] ; then
ACCESS_POINT = http://localhost
else
ACCESS_POINT = https://$domain
fi
echo ""
# Making sure this version of NGINX supports sites-enabled
if [ [ -z $( sudo cat /etc/nginx/nginx.conf | grep sites-enabled) ] ] ; then
sudo mkdir -p /etc/nginx/sites-available
sudo mkdir -p /etc/nginx/sites-enabled
sudo cp resources/base.nginx.conf /etc/nginx/nginx.conf
fi
sudo mkdir -p /etc/nginx/logs
AO_NGINX_CONF = /etc/nginx/sites-available/ao
sudo cp resources/ao.nginx.conf $AO_NGINX_CONF
if [ -n $anywhere ] ; then
sudo sed -i "s#SERVER_NAME#_#" $AO_NGINX_CONF
else
sudo sed -i " s#SERVER_NAME# ${ domain } # " $AO_NGINX_CONF
fi
sudo sed -i " s#FILE_ROOT# ${ HOME } /ao-react/dist# " $AO_NGINX_CONF
if [ ! -e /etc/nginx/sites-enabled/ao ] ; then
sudo ln -s /etc/nginx/sites-available/ao /etc/nginx/sites-enabled/
fi
echo ""
echo " Excellent! We've configured $AO_NGINX_CONF to serve your AO from $domain "
echo ""
read -p "Would you like to enable SSL via Certbot? (y/n): " -n1 ssl
echo ""
case $ssl in
y | Y)
echo "Alright, let's get Certbot in here!"
install_if_needed python3 certbot python3-certbot-nginx
echo -e " ${ BOLD } Take it away, Certbot ${ NC } "
sudo certbot --nginx
; ;
*)
echo "Yea, SSL is lame anyways..."
; ;
esac
echo ""
# ------------------- Step 7 - Systemd Setup -------------------
READY = ''
echo -e " \n ${ BOLD } Alright, almost there! ${ RESET } Now we just need to set up the system daemons for Tor, Bitcoin, Lightning, and the AO so that everything opens on startup. "
while [ [ -z $READY ] ] ; do
echo -en " ${ BLUE } You ready? (y/n): ${ RESET } "
read -n1 ao_select
echo ""
echo ""
case $ao_select in
"y" | "Y" )
echo -e "Nice, let's do it.\n"
READY = 1
; ;
*)
echo -e "wrong answer, fren\n"
; ;
esac
done
echo ""
echo "Creating tor.service..."
TOR_SERVICE = /etc/systemd/system/tor.service
if [ -f " $TOR_SERVICE " ] ; then
echo "Seems like you've already got tor here!"
else
sudo cp resources/tor-service-template $TOR_SERVICE
# Making sure all values have been de-templated
sudo sed -i " s#USER# ${ USER } #g " $TOR_SERVICE
sudo sed -i " s#HOME# ${ HOME } #g " $TOR_SERVICE
sudo sed -i " s#TORRCPATH# ${ TORRCPATH } #g " $TOR_SERVICE
sudo sed -i " s#TORPATH# $( which tor) #g " $TOR_SERVICE
fi
# Creating the .tor directory
sudo mkdir -p $HOME /.tor
sudo chown tor $HOME /.tor
sudo chgrp $USER $HOME /.tor
sudo chmod 770 $HOME /.tor
echo "Enabling and starting Tor"
sudo systemctl enable tor
sudo systemctl start tor
echo ""
echo "Creating bitcoin.service..."
BTC_SERVICE = /etc/systemd/system/bitcoin.service
if [ -f " $BTC_SERVICE " ] ; then
echo -e "Seems like you've already have a bitcoin service!"
else
sudo cp resources/bitcoin-service-template $BTC_SERVICE
# Making sure all values have been de-templated
sudo sed -i " s#USER# ${ USER } #g " $BTC_SERVICE
sudo sed -i " s#HOME# ${ HOME } #g " $BTC_SERVICE
sudo sed -i " s#BITCOIND# $( which bitcoind) #g " $BTC_SERVICE
fi
echo -e " Enabling and starting ${ GREEN } Bitcoin ${ RESET } "
sudo systemctl enable bitcoin
sudo systemctl start bitcoin
echo ""
echo "Creating lightning.service..."
LN_SERVICE = /etc/systemd/system/lightning.service
if [ -f " $LN_SERVICE " ] ; then
echo -e "Seems like you've already have a lightning service!"
else
sudo cp resources/lightning-service-template $LN_SERVICE
# Making sure all values have been de-templated
sudo sed -i " s#USER# ${ USER } #g " $LN_SERVICE
sudo sed -i " s#HOME# ${ HOME } #g " $LN_SERVICE
sudo sed -i " s#LIGHTNINGD# $( which lightningd) #g " $LN_SERVICE
fi
echo -e " Enabling and starting ${ GREEN } lightning ${ RESET } "
sudo systemctl enable lightning
sudo systemctl start lightning
echo ""
echo "Creating ao.service..."
AO_SERVICE = /etc/systemd/system/ao.service
if [ -f " $AO_SERVICE " ] ; then
echo "Seems like you've already added one of these!"
else
sudo cp resources/ao-service-template $AO_SERVICE
# Making sure all values have been de-templated
sudo sed -i " s#USER# ${ USER } #g " $AO_SERVICE
sudo sed -i " s#HOME# ${ HOME } #g " $AO_SERVICE
sudo sed -i " s#NODE# $( which node) #g " $AO_SERVICE
fi
echo -e " Enabling and starting the ${ GREEN } AO ${ RESET } 's backend "
sudo systemctl enable ao
sudo systemctl start ao
echo ""
echo -e " Enabling and starting ${ GREEN } NGINX ${ RESET } as the webserver "
sudo systemctl enable nginx
sudo systemctl start nginx
# ------------------- Step 8 - Port Testing -------------------
echo ""
echo -e " ${ BOLD } One more thing! ${ RESET } We need to make sure that your ports are open. "
install_if_needed nmap
nmap -Pn $domain > nmap.txt
OPEN = 1
if grep -qE "^80/.*(open|filtered)" nmap.txt; then
echo -e " I can see port ${ GREEN } 80 ${ RESET } ! "
else
echo -e " Uh oh, port ${ RED } 80 ${ RESET } isn't showing up... "
OPEN = 0
fi
if grep -qE "^443/.*(open|filtered)" nmap.txt; then
echo -e " I can see port ${ GREEN } 443 ${ RESET } as well! "
else
echo -e " Uh oh, port ${ RED } 443 ${ RESET } isn't showing up... "
OPEN = 0
fi
rm nmap.txt
echo ""
if [ [ $OPEN -eq 0 ] ] ; then
echo -e " ${ RED } Port configuration needed. ${ RESET } Something (probably your wireless router) is blocking us from serving this page to the rest of the internet. "
echo "Port forwarding is relatively simple, but as it stands it is beyond the scope of this script to be able to automate it."
echo -e " You'll probably need to look up the login information for your specific router and forward the red ports to the local IP of this computer ( ${ BOLD } $( ip route | grep default | grep -oP "(?<=src )[^ ]+" ) ${ RESET } ). "
echo -e " You can log into your router at this IP address: ${ BOLD } $( route -n | grep ^0.0.0.0 | awk '{print $2}' ) ${ RESET } "
echo "That's all the help I can give you regarding port forwarding. Good luck!"
echo ""
fi
# ------------------- Step 9 - Health Check -------------------
echo '*********************************************************'
echo -e " * ${ BOLD } Version Information ${ RESET } * "
echo '*********************************************************'
echo ' '
echo 'make Version'
echo '*********************************************************'
make --version
echo ' '
echo 'node Version'
echo '*********************************************************'
node --version
echo ' '
echo 'sqlite3 Version'
echo '*********************************************************'
sqlite3 --version
echo ' '
echo 'tor Version'
echo '*********************************************************'
tor --version
echo ' '
echo 'bitcoind Version'
echo '*********************************************************'
bitcoind --version
echo ' '
echo 'lightningd Version'
echo '*********************************************************'
lightningd --version
echo ' '
echo 'clboss Version'
echo '*********************************************************'
clboss --version
echo ""
echo -e " $BOLD \nOkay, well that's everything! ${ RESET } \n\nAs long as everything worked properly, \
you should be ready to continue your journey\n towards autonomy by opening ${ BLUE } $ACCESS_POINT ${ RESET } in your browser."
echo -e " The default login is ${ BLUE } dctrl/dctrl ${ RESET } , have fun! "
exit 0