Created
June 11, 2018 01:44
-
-
Save vmunich/07a648d1fc46ef2427c013b2bb02bd90 to your computer and use it in GitHub Desktop.
Revisions
-
vmunich created this gist
Jun 11, 2018 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,1340 @@ #!/bin/bash #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # # # ARK Commander Script # # by tharude a.k.a The Forging Penguin # # thanks ViperTKD for the helping hand # # 19/01/2017 ARK Team # # # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# ### Adding some color ### # Line coloring functions function red { echo -e "$(tput bold; tput setaf 1)$1$(tput sgr0)" } function igreen { echo -e "$(tput bold; tput setaf 0; tput setab 2)$1$(tput sgr0)" } function ired { echo -e "$(tput bold; tput setaf 3; tput setab 1)$1$(tput sgr0)" } function green { echo -e "$(tput bold; tput setaf 2)$1$(tput sgr0)" } function yellow { echo -e "$(tput bold; tput setaf 3)$1$(tput sgr0)" } ### Checking if the script is started as root ### if [ "$(id -u)" = "0" ]; then clear echo -e "\n$(ired " !!! This script should NOT be started using sudo or as the root user !!! ") " echo -e "\nUse $(green "bash ARKcommander.sh") as a REGULAR user instead" echo -e "Execute ONCE $(green "chmod +x ARKcommander.sh") followed by $(green "ENTER")" echo -e "and start it only by $(green "./arkcommander.sh") as regular user after\n" exit 1 fi ### Checking the Virtualization Environment ### if [ $(systemd-detect-virt -c) != "none" ]; then clear echo "$(ired " ")" echo "$(ired " OpenVZ / LXC / Virtuoso Container detected! ")" echo "$(ired " ")" echo "$(ired " Running ARK Node on a Container based virtual system is not recommended! ")" echo "$(ired " Please change your VPS provider with one that uses hardware Virtualization. ")" echo "$(ired " ")" echo "$(ired " This script will now exit! ")" echo "$(ired " ")" exit 1 fi # TEMP N # sudo apt-get install npm # sudo npm install -g n # sudo n 6.9.2 # ---------------------------------- # Variables # ---------------------------------- EDIT=nano GIT_ORIGIN=mainnet LOC_SERVER="http://localhost:4001" ADDRESS="ATHAwQnSZCRXvNkBtWn5AkGyVrFdSRH756" SNAPDIR="$HOME/snapshots" re='^[0-9]+$' # For numeric checks #pubkey="02a3e3e5fc36565ab4275ddfee1592667f6c46f5e9aa7528499511d65c5e82a7db" # Logfile log="install_ark.log" # ---------------------------------- # Arrays # ---------------------------------- # Install prereq packages array declare -a array=("postgresql" "postgresql-contrib" "libpq-dev" "build-essential" "python" "git" "curl" "jq" "libtool" "autoconf" "locales" "automake" "locate" "wget" "zip" "unzip" "htop" "nmon" "iftop") # ---------------------------------- # Functions # ---------------------------------- # ASCII Art function function asciiart { clear tput bold; tput setaf 2 cat << "EOF" {_ {_______ {__ {__ {_ __ {__ {__ {__ {__ {_ {__ {__ {__ {__ {__ {__ {__ {_ {__ {_ {_ {______ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ ___ __ __ __ __ __ __ __ _ __ ___ ___ / _//__\| V | V |/ \| \| | _\| __| _ \ | \_| \/ | \_/ | \_/ | /\ | | ' | v | _|| v / \__/\__/|_| |_|_| |_|_||_|_|\__|__/|___|_|_\ W E L C O M E A B O A R D ! EOF tput sgr0 } pause(){ read -p "$(yellow " Press [Enter] key to continue...")" fakeEnterKey } # Current Network Height function net_height { local heights=$(curl -s "$LOC_SERVER/api/peers" | jq -r '.peers[] | .height') highest=$(echo "${heights[*]}" | sort -nr | head -n1) } # Find parent PID function top_level_parent_pid { # Look up the parent of the given PID. pid=${1:-$$} if [ "$pid" != "0" ]; then stat=($(</proc/${pid}/stat)) ppid=${stat[3]} # /sbin/init always has a PID of 1, so if you reach that, the current PID is # the top-level parent. Otherwise, keep looking. if [[ ${ppid} -eq 1 ]] ; then echo ${pid} else top_level_parent_pid ${ppid} fi else pid=0 fi } # Process management variables function proc_vars { node=`pgrep -a "node" | grep ark-node | awk '{print $1}'` if [ "$node" == "" ] ; then node=0 fi # Is Postgres running pgres=`pgrep -a "postgres" | awk '{print $1}'` # Find if forever process manager is runing frvr=`pgrep -a "node" | grep forever | awk '{print $1}'` # Find the top level process of node top_lvl=$(top_level_parent_pid $node) # Looking for ark-node installations and performing actions arkdir=`locate -b "\ark-node"` # Getting the parent of the install path parent=`dirname $arkdir 2>&1` # Forever Process ID forever_process=`forever --plain list | grep $node | sed -nr 's/.*\[(.*)\].*/\1/p'` # Node process work directory nwd=`pwdx $node 2>/dev/null | awk '{print $2}'` } #PSQL Queries query() { PUBKEY="$(psql -d ark_mainnet -t -c 'SELECT ENCODE("publicKey",'"'"'hex'"'"') as "publicKey" FROM mem_accounts WHERE "address" = '"'"$ADDRESS"'"' ;' | xargs)" DNAME="$(psql -d ark_mainnet -t -c 'SELECT username FROM mem_accounts WHERE "address" = '"'"$ADDRESS"'"' ;' | xargs)" PROD_BLOCKS="$(psql -d ark_mainnet -t -c 'SELECT producedblocks FROM mem_accounts WHERE "address" = '"'"$ADDRESS"'"' ;' | xargs)" MISS_BLOCKS="$(psql -d ark_mainnet -t -c 'SELECT missedblocks FROM mem_accounts WHERE "address" = '"'"$ADDRESS"'"' ;' | xargs)" #BALANCE="$(psql -d ark_mainnet -t -c 'SELECT (balance/100000000.0) as balance FROM mem_accounts WHERE "address" = '"'"$ADDRESS"'"' ;' | sed -e 's/^[[:space:]]*//')" BALANCE="$(psql -d ark_mainnet -t -c 'SELECT to_char(("balance"/100000000.0), '"'FM 999,999,999,990D00000000'"' ) as balance FROM mem_accounts WHERE "address" = '"'"$ADDRESS"'"' ;' | xargs)" HEIGHT="$(psql -d ark_mainnet -t -c 'SELECT height FROM blocks ORDER BY HEIGHT DESC LIMIT 1;' | xargs)" RANK="$(psql -d ark_mainnet -t -c 'WITH RANK AS (SELECT DISTINCT "publicKey", "vote", "round", row_number() over (order by "vote" desc nulls last) as "rownum" FROM mem_delegates where "round" = (select max("round") from mem_delegates) ORDER BY "vote" DESC) SELECT "rownum" FROM RANK WHERE "publicKey" = '"'03cfafb2ca8cf7ce70f848456b1950dc7901946f93908e4533aace997c242ced8a'"';' | xargs)" } # Stats Address Change change_address() { echo "$(yellow " Enter your delegate address for Stats")" echo "$(yellow " WITHOUT QUOTES, followed by 'ENTER'")" read -e -r -p "$(yellow " :") " inaddress while [ ! "${inaddress:0:1}" == "A" ] ; do echo -e "\n$(ired " Enter delegate ADDRESS, NOT the SECRET!")\n" read -e -r -p "$(yellow " :") " inaddress done ADDRESS=$inaddress # sed -i "s#\(.*ADDRESS\=\)\( .*\)#\1 "\"$inaddress\""#" $DIR/$BASH_SOURCE sed -i "1,/\(.*ADDRESS\=\)/s#\(.*ADDRESS\=\)\(.*\)#\1"\"$inaddress\""#" $DIR/$BASH_SOURCE } # Forging Turn turn() { DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # echo $DIR # echo "$BASH_SOURCE" # echo "$ADDRESS" if [ "$ADDRESS" == "" ] ; then change_address # echo "$(yellow " Enter your delegate address for Stats")" # echo "$(yellow " WITHOUT QUOTES, followed by 'ENTER'")" # read -e -r -p "$(yellow " :") " inaddress # while [ ! "${inaddress:0:1}" == "A" ] ; do # echo -e "\n$(ired " Enter delegate ADDRESS, NOT the SECRET!")\n" # read -e -r -p "$(yellow " :") " inaddress # done # ADDRESS=$inaddress ## sed -i "s#\(.*ADDRESS\=\)\( .*\)#\1 "\"$inaddress\""#" $DIR/$BASH_SOURCE # sed -i "1,/\(.*ADDRESS\=\)/s#\(.*ADDRESS\=\)\(.*\)#\1"\"$inaddress\""#" $DIR/$BASH_SOURCE fi # pause while true; do # trap : INT query net_height asciiart proc_vars queue=`curl --connect-timeout 3 -f -s $LOC_SERVER/api/delegates/getNextForgers?limit=51 | jq ".delegates"` is_forging=`curl -s --connect-timeout 1 $LOC_SERVER/api/delegates/forging/status?publicKey=$PUBKEY 2>/dev/null | jq ".enabled"` is_syncing=`curl -s --connect-timeout 1 $LOC_SERVER/api/loader/status/sync 2>/dev/null | jq ".syncing"` pos=0 for position in $queue do position=`echo "$position" | tr -d '",'` if [[ $PUBKEY == $position ]]; then # echo "$position : $pos <==" turn=$pos fi pos=`expr $pos + 1` done git_upd_check echo -e "$(yellow "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")" echo -e "$(green " NODE STATS")" echo -e "$(yellow "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")" echo echo -e "$(green " Delegate : ")$(yellow "$DNAME")" echo -e "$(green " Forging : ")$(yellow "$is_forging")" echo -e "$(green " Current Rank : ")$(yellow "$RANK")" echo -e "$(green " Forging Position : ")$(yellow "$turn")" echo -e "$(green " Node Blockheight : ")$(yellow "$HEIGHT")" echo -e "$(green " Net Height : ")$(yellow "$highest")" # echo -e "$(green "Public Key:")\n$(yellow "$PUBKEY")\n" echo -e "$(green " Forged Blocks : ")$(yellow "$PROD_BLOCKS")" echo -e "$(green " Missed Blocks : ")$(yellow "$MISS_BLOCKS")" echo -e "$(green " ARK Balance : ")$(yellow "$BALANCE")" echo echo -e "\n$(yellow "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")" if [ -e $arkdir/app.js ]; then echo -e "\n$(green " ✔ ARK Node installation found!")\n" if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " ARK Node process is running with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " and Work Directory: $arkdir")\n" else echo -e "\n$(red " ✘ No ARK Node process is running")\n" fi else echo -e "\n$(red " ✘ No ARK Node installation is found")\n" fi echo -e "\n$(yellow "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")" echo -e "\n$(yellow " Press 'Enter' to terminate ")" read -t 4 && break #sleep 4 done } # Stats Display function stats { asciiart proc_vars is_forging=`curl -s --connect-timeout 1 $LOC_SERVER/api/delegates/forging/status?publicKey=$pubkey 2>/dev/null | jq ".enabled"` is_syncing=`curl -s --connect-timeout 1 $LOC_SERVER/api/loader/status/sync 2>/dev/null | jq ".syncing"` if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " Instance of ARK Node found with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " Directory: $arkdir")\n" else echo -e "\n$(red " ✘ ARK Node process is not running")\n" pause fi } # Updating the locate database function db_up { echo -e "$(red "Please enter your sudo password for user $USER")" sudo updatedb } # Update and upgrade the OS function os_up { asciiart echo -e "$(yellow " Checking for system updates...")\n" sudo apt-get update >&- 2>&- #-yqq 2>/dev/null avail_upd=`/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1` sec_upd=`/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2` if [ "$avail_upd" == 0 ]; then echo -e "$(green " There are no updates available")\n" sleep 1 else echo -e "\n$(red " There are $avail_upd updates available")" echo -e "$(red " $sec_upd of them are security updates")" echo -e "\n$(yellow " Updating the system...")" sudo apt-get upgrade -yqq >&- 2>&- #2>/dev/null sudo apt-get dist-upgrade -yq >&- 2>&- #2>/dev/null #sudo apt-get purge nodejs postgresql postgresql-contrib samba* sudo apt-get autoremove -yyq >&- 2>&- #2>/dev/null sudo apt-get autoclean -yq >&- 2>&- #2>/dev/null echo -e "\n$(green " ✔ The system was updated!")" echo -e "\n$(red " System restart is recommended!\n")" fi } # Install prerequisites function prereq { # Get array length arraylength=${#array[@]} # Installation loop echo -e "$(yellow "-----------------------------------------------")" for (( i=1; i<${arraylength}+1; i++ )); do asciiart; echo -e "$(yellow " Installing prerequisites...") " echo -e "$(yellow "-----------------------------------------------")" # added echo -e "$(yellow " $i / ${arraylength} : ${array[$i-1]}")" if [ $(dpkg-query -W -f='${Status}' ${array[$i-1]} 2>/dev/null | grep -c "ok installed") -eq 0 ]; then sudo apt-get install -yqq >&- 2>&- ${array[$i-1]}; else echo "$(green " Package: ${array[$i-1]} is already installed!")" fi echo -e "$(yellow "-----------------------------------------------")" sleep 0.5 clear done } # Install and set locale function set_locale { # Checking Locale first asciiart if [ `locale -a | grep ^en_US.UTF-8` ] || [ `locale -a | grep ^en_US.utf8` ] ; then echo -e "$(green " ✔ Locale en_US.UTF-8 is installed")\n" echo -e "$(yellow " Checking if the locale is set in bashrc...")" if `grep -E "(en_US.UTF-8)" $HOME/.bashrc` ; then echo -e "\n$(green " ✔ bashrc is already set")" else # Setting the bashrc locale echo -e "$(red " ✘ Not set yet. Setting the bashrc locale...")" echo -e "export LC_ALL=en_US.UTF-8" >> $HOME/.bashrc echo -e "export LANG=en_US.UTF-8" >> $HOME/.bashrc echo -e "export LANGUAGE=en_US.UTF-8" >> $HOME/.bashrc echo -e "$(green " ✔ bashrc locale was set")\n" # Setting the current shell locale echo -e "$(yellow " Setting current shell locale...")\n" export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 export LANGUAGE=en_US.UTF-8 echo -e "$(green " ✔ Shell locale was set")" fi else # Install en_US.UTF-8 Locale echo -e "$(red " ✘ Locale en_US.UTF-8 is not installed")\n" echo -e "$(yellow " Generating locale en_US.UTF-8...")" sudo locale-gen en_US.UTF-8 sudo update-locale LANG=en_US.UTF-8 echo -e "$(green " ✔ Locale generated successfully.")\n" # Setting the current shell locale echo -e "$(yellow " Setting current shell locale...")\n" export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 export LANGUAGE=en_US.UTF-8 echo -e "$(green " ✔ Shell locale was set")\n" # Setting the bashrc locale echo -e "$(yellow " Setting the bashrc locale...")\n" echo "export LC_ALL=en_US.UTF-8" >> $HOME/.bashrc echo "export LANG=en_US.UTF-8" >> $HOME/.bashrc echo "export LANGUAGE=en_US.UTF-8" >> $HOME/.bashrc echo -e "$(green " ✔ bashrc locale was set")" fi } # Install and set NTP function ntpd { # Check if ve are running in a OpenVZ or LXC Container for NTP Install if [ $(systemd-detect-virt) == "lxc" ] || [ $(systemd-detect-virt) == "openvz" ]; then echo -e "Your host is running in LXC or OpenVZ container. NTP is not required. \n" else echo -e "Checking if NTP is running first... \n" if ! sudo pgrep -x "ntpd" > /dev/null; then echo -e "No NTP found. Installing... " sudo apt-get install ntp -yyq &>> $log sudo service ntp stop &>> $log sudo ntpd -gq &>> $log sleep 2 sudo service ntp start &>> $log sleep 2 if ! sudo pgrep -x "ntpd" > /dev/null; then echo -e "NTP failed to start! It should be installed and running for ARK.\n Check /etc/ntp.conf for any issues and correct them first! \n Exiting." exit 1 fi echo -e "NTP was successfully installed and started with PID:" `sudo pgrep -x "ntpd"` else echo "NTP is up and running with PID:" `sudo pgrep -x "ntpd"` fi fi echo "-------------------------------------------------------------------" } # Logrotate for Ark Node logs function log_rotate { if [[ "$(uname)" == "Linux" ]]; then if [ ! -f /etc/logrotate.d/ark-logrotate ]; then echo -e " Setting up Logrotate for ARK node log files." sudo bash -c "cat << 'EOF' >> /etc/logrotate.d/ark-logrotate $arkdir/logs/ark.log { size=50M copytruncate create 660 $USER $USER missingok notifempty compress delaycompress daily rotate 7 dateext maxage 7 } EOF" else echo -e "$(green " ✔ Logrotate file already exists!")\n" fi fi } # GIT Update Check function git_upd_check { if [ -d "$arkdir" ]; then cd $arkdir git remote update >&- 2>&- UPSTREAM=${1:-'@{u}'} LOCAL=$(git rev-parse @) REMOTE=$(git rev-parse "$UPSTREAM") BASE=$(git merge-base @ "$UPSTREAM") cd $HOME if [ "$LOCAL" == "$REMOTE" ]; then echo -e " $(igreen " ARK Node is Up-to-date \n")" UP_TO_DATE=1 elif [ "$LOCAL" == "$BASE" ]; then echo -e " $(ired " Please Update! Press (3) \n")" UP_TO_DATE=0 else echo -e " $(ired " Diverged \n")" fi fi } # Install PostgreSQL function inst_pgdb { sudo apt install -yyq postgresql postgresql-contrib >&- 2>&- } # Purge the Postgres Database function purge_pgdb { if [ $(dpkg-query -W -f='${Status}' postgresql } 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo "$(green " Postgres is not installed, nothing to purge. Exiting.") " else echo -e " $(ired " ")" echo -e " $(ired " WARNING! This option will stop all ")" echo -e " $(ired " running ARK Node processes and will ")" echo -e " $(ired " remove the databases and PostgreSQL ")" echo -e " $(ired " installation! Are you REALLY sure? ")" echo -e " $(ired " ")" read -e -r -p "$(yellow "\n Type (Y) to proceed or (N) to cancel: ")" -i "N" YN if [[ "$YN" =~ [Yy]$ ]]; then echo -e "$(yellow "\n Proceeding with PostgreSQL removal... \n")" forever --silent --plain stopall sleep 1 drop_db drop_user # stop the DB if running first... sudo service postgresql stop sleep 1 sudo apt --purge remove -yq postgresql\* >&- 2>&- sudo rm -rf /etc/postgresql/ >&- 2>&- sudo rm -rf /etc/postgresql-common/ >&- 2>&- sudo rm -rf /var/lib/postgresql/ >&- 2>&- sudo userdel -r postgres >&- 2>&- sudo groupdel postgres >&- 2>&- echo -e "$(yellow "\n PostgreSQL has been removed\n")" read -e -r -p "$(yellow "\n Proceed with PostgreSQL installation (Y/n): ")" -i "Y" YN if [[ "$YN" =~ [Yy]$ ]]; then echo -e "$(yellow "\n Proceeding with PostgreSQL installation... \n")" inst_pgdb create_db echo -e "$(yellow "\n PostgreSQL has been installed and set.\n")" pause fi fi fi } function snap_menu { if [ ! -d "$SNAPDIR" ]; then mkdir -p $SNAPDIR fi if [ "$(ls -A $SNAPDIR)" ]; then if [[ $(expr `date +%s` - `stat -c %Y $SNAPDIR/current`) -gt 900 ]]; then echo -e "$(yellow " Existing Current snapshot is older than 15 minutes")" read -e -r -p "$(yellow "\n Download from ARK.IO? (Y) or use Local (N) ")" -i "Y" YN if [[ "$YN" =~ [Yy]$ ]]; then echo -e "$(yellow "\n Downloading latest snapshot from ARK.IO\n")" rm $SNAPDIR/current wget -nv https://snapshots.ark.io/current -O $SNAPDIR/current echo -e "$(yellow "\n Download finished\n")" fi fi snapshots=( $(ls -t $SNAPDIR | xargs -0) ) echo -e "$(yellow "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")" echo -e "$(green " List of local snapshots:")" echo -e "$(yellow "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")" for (( i=0; i<${#snapshots[*]}; i++ )); do if [ $i -le 9 ]; then echo " " $(($i+1)): ${snapshots[$i]} else echo " " $(($i+1)): ${snapshots[$i]} fi done read -ep "$(yellow "\n Which snapshot to be restored? ")" if [[ "${REPLY}" =~ $re ]]; then ## Numeric checks if [ $REPLY -le ${#snapshots[*]} ]; then echo -e "$(yellow "\n Restoring snapshot ${snapshots[$((REPLY-1))]}")\n" pg_restore -O -j 8 -d ark_mainnet $SNAPDIR/${snapshots[$(($REPLY-1))]} 2>/dev/null echo -e "$(green " Snapshot ${snapshots[$(($REPLY-1))]} was restored successfully")\n" else echo -e "$(red "\n Value is out of list range!\n")" snap_menu fi else echo -e "$(red "\n $REPLY is not a number!\n")" snap_menu fi else echo -e "$(red " No snapshots found in $SNAPDIR")" read -e -r -p "$(yellow "\n Do you like to download the latest snapshot? (Y/n) ")" -i "Y" YN if [[ "$YN" =~ [Yy]$ ]]; then echo -e "$(yellow "\n Downloading current snapshot from ARK.IO\n")" wget -nv https://snapshots.ark.io/current -O $SNAPDIR/current echo -e "$(yellow "\n Download finished\n")" fi if [[ $? -eq 0 ]]; then read -e -r -p "$(yellow " Do you like to restore the snapshot now? (Y/n) ")" -i "Y" YN if [[ "$YN" =~ [Yy]$ ]]; then #here calling the db_restore function echo -e "$(yellow "\n Restoring $SNAPDIR/current ... ")" pg_restore -O -j 8 -d ark_mainnet $SNAPDIR/current 2>/dev/null echo -e "$(green "\n Current snapshot has been restored\n")" fi else echo -e "$(red "\n Error while retriving the snapshot")" echo -e "$(red " Please check that the file exists on server")" fi fi } # Check if program is installed function node_check { # defaulting to 1 return_=1 # changing to 0 if not found type $1 >/dev/null 2>&1 || { return_=0; } # return value # echo "$return_" } # Install NVM and node function nvm { node_check node if [ "$return_" == 0 ]; then echo -e "$(red " ✘ Node is not installed, installing...")" curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh 2>/dev/null | bash >>install.log export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" ### Installing node ### nvm install 6.9.5 >>install.log nvm use 6.9.5 >>install.log nvm alias default 6.9.5 >>install.log echo -e "$(green " ✔ Node `node -v` has been installed")" else echo -e "$(green " ✔ Node `node -v` is alredy installed")" fi node_check npm if [ "$return_" == 0 ]; then echo -e "$(red " ✘ NPM is not installed, installing...")" ### Install npm ### npm install -g npm >>install.log 2>&1 echo -e "$(green " ✔ NPM `npm -v` has been installed")" else echo -e "$(green " ✔ NPM `npm -v` is alredy installed")" fi node_check forever if [ "$return_" == 0 ]; then echo -e "$(red " ✘ Forever is not installed, installing...")" ### Install forever ### npm install forever -g >>install.log 2>&1 echo -e "$(green " ✔ Forever has been installed")" else echo -e "$(green " ✔ Forever is alredy installed")" fi # Setting fs.notify.max_user_watches if grep -qi 'fs.inotify' /etc/sysctl.conf ; then echo -e "\n$(green " fs.inotify.max_user_watches is already set")" else echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p fi echo -e "\n$(yellow "Check install.log for reported install errors")" } # Install ARK Node function inst_ark { # proc_vars cd $HOME mkdir ark-node git clone https://github.com/ArkEcosystem/ark-node.git 2>/dev/null cd ark-node git checkout $GIT_ORIGIN 2>/dev/null git pull origin $GIT_ORIGIN 2>/dev/null npm install grunt-cli -g 2>/dev/null npm install libpq 2>/dev/null npm install secp256k1 2>/dev/null npm install bindings 2>/dev/null git submodule init 2>/dev/null git submodule update 2>/dev/null npm install 2>/dev/null } # Create ARK user and DB function create_db { #check if PG is running here if not Start. if [ -z "$pgres" ]; then sudo service postgresql start fi sleep 1 # sudo -u postgres dropdb --if-exists ark_mainnet # sleep 1 # sudo -u postgres dropuser --if-exists $USER # 2>&1 # sleep 1 sudo -u postgres psql -c "update pg_database set encoding = 6, datcollate = 'en_US.UTF8', datctype = 'en_US.UTF8' where datname = 'template0';" >&- 2>&- sudo -u postgres psql -c "update pg_database set encoding = 6, datcollate = 'en_US.UTF8', datctype = 'en_US.UTF8' where datname = 'template1';" >&- 2>&- sudo -u postgres psql -c "CREATE USER $USER WITH PASSWORD 'password' CREATEDB;" >&- 2>&- sleep 1 createdb ark_mainnet } # Check if DB exists function db_exists { # check if it's running and start if not. if [ -z "$pgres" ]; then sudo service postgresql start fi if [[ ! $(sudo -u postgres psql ark_mainnet -c '\q' 2>&1) ]]; then read -r -n 1 -p "$(yellow " Database exists! Do you want to drop it? (y/n):") " YN if [[ "$YN" =~ [Yy]$ ]]; then drop_db; fi else echo "Database not exist." fi } # Check if User exists function user_exists { # check if it's running and start if not. if [ -z "$pgres" ]; then sudo service postgresql start fi if [[ $(sudo -u postgres psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='$USER'" 2>&1) ]]; then echo "User $USER exists"; read -r -n 1 -p "$(yellow " User $USER exists! Do you want to remove it? (y/n):") " YN if [[ "$YN" =~ [Yy]$ ]]; then sudo -u postgres dropuser --if-exists $USER fi else echo "User $USER does not exist" fi } # Drop ARK DB function drop_db { # check if it's running and start if not. if [ -z "$pgres" ]; then sudo service postgresql start fi dropdb --if-exists ark_mainnet } function drop_user { if [ -z "$pgres" ]; then sudo service postgresql start fi if [[ $(sudo -u postgres psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='$USER'" 2>&1) ]]; then sudo -u postgres dropuser --if-exists $USER else echo "DB User $USER does not exist" fi } function update_ark { if [ "$UP_TO_DATE" -ne 1 ]; then cd $arkdir # forever stop app.js TMP_PASS=$(jq -r '.forging.secret | @csv' config.$GIT_ORIGIN.json) mv config.mainnet.json ../ git pull origin $GIT_ORIGIN git checkout $GIT_ORIGIN npm install sleep 1 if [ ! -e config.$GIT_ORIGIN.json ]; then mv ../config.$GIT_ORIGIN.json . else jq -r '.forging.secret = ['"$TMP_PASS"']' config.$GIT_ORIGIN.json > config.$GIT_ORIGIN.tmp && mv config.$GIT_ORIGIN.tmp config.$GIT_ORIGIN.json fi unset TMP_PASS # forever restart $forever_process # forever start app.js --genesis genesisBlock.mainnet.json --config config.mainnet.json else echo "ARK Node is already up to date!" sleep 2 fi } # Put the password in config.mainnet.json function secret { echo -e "\n" #Put check if arkdir is empty, if it is stays only config.mainnet.json echo -e "$(yellow " Enter (copy/paste) your private key (secret)")" echo -e "$(yellow " (WITHOUT QUOTES!) followed by 'Enter'")" read -e -r -p ": " secret cd $arkdir jq -r ".forging.secret = [\"$secret\"]" config.$GIT_ORIGIN.json > config.$GIT_ORIGIN.tmp && mv config.$GIT_ORIGIN.tmp config.$GIT_ORIGIN.json } ### Menu Options ### # Install ARK node one(){ cd $HOME proc_vars if [ -e $arkdir/app.js ]; then clear asciiart echo -e "\n$(green " ✔ ARK Node is already installed!")\n" if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green "A working instance of ARK Node is found with:")" echo -e "$(green "System PID: $node, Forever PID $forever_process")" echo -e "$(green "and Work Directory: $arkdir")\n" fi pause else clear asciiart echo -e "$(yellow " Installing ARK node....")" create_db inst_ark clear asciiart echo -e "$(green " ✔ ARK node was installed")\n" sudo updatedb sleep 1 proc_vars log_rotate config="$parent/config.mainnet.json" # echo "$config" 2>/dev/null # pause if [ ! -e $config ] ; then read -e -r -p "$(yellow " Do you want to set your Secret Key now? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then five fi fi fi } # Reinstall ARK Node two(){ clear asciiart echo -e "$(ired "!!! This option will erase your DB and ARK Node installation !!!")\n" read -e -r -p "$(red " Are you sure that you want to proceed? (Y/N): ")" -i "N" keys if [ "$keys" == "Y" ]; then proc_vars if [ -e $arkdir/app.js ]; then clear asciiart echo -e "\n$(green " ✔ ARK Node installation found in $arkdir")\n" if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green "A working instance of ARK Node is found with:")" echo -e "$(green "System PID: $node, Forever PID $forever_process")" echo -e "$(yellow " Stopping ARK node ...")\n" cd $arkdir forever --plain stop $forever_process >&- 2>&- cd $parent fi echo -e "$(yellow " Backing up configuration file to $parent")\n" sleep 1 if [ -e $parent/config.mainnet.json ] ; then read -e -r -p "$(yellow " Backup file exists! Overwrite? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then cp $arkdir/config.mainnet.json $parent cd $parent fi else cp $arkdir/config.mainnet.json $parent cd $parent fi echo -e "$(yellow " Removing ARK Node directory...")\n" sleep 1 rm -rf $arkdir drop_db drop_user one echo "" if [ -e $parent/config.mainnet.json ] ; then read -e -r -p "$(yellow " Do you want to restore your config? (Y/N): ")" -i "Y" keys # echo "Break1"; pause if [ "$keys" == "Y" ]; then cp $parent/config.mainnet.json $arkdir echo -e "\n$(green " ✔ Config was restored in $arkdir")\n" read -e -r -p "$(yellow " Do you want to start ARK Node now? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then start fi else read -e -r -p "$(yellow " Do you want to start ARK Node now? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then start fi fi fi else echo -e "\n$(green " ✔ Previous installation not found.")\n" drop_db drop_user sleep 1 one proc_vars if [ -e $parent/config.mainnet.json ] ; then read -e -r -p "$(yellow " Do you want to restore your config? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then cp $parent/config.mainnet.json $arkdir echo -e "\n$(green " ✔ Config was restored in $arkdir")\n" fi else echo -e "\n$(yellow " No backup config was found in $parent")\n" read -e -r -p "$(yellow " Do you want to set your Secret Key now? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then secret fi fi # echo "Break2"; pause read -e -r -p "$(yellow " Do you want to start ARK Node now? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then start fi fi fi } three(){ asciiart proc_vars if [ "$UP_TO_DATE" -ne 1 ]; then if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " Instance of ARK Node found with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " Directory: $arkdir")\n" echo -e "\n$(green " Updating ARK Node...")\n" update_ark echo -e "$(green " Restarting...")" forever restart $forever_process >&- 2>&- echo -e "\n$(green " ✔ ARK Node was successfully restarted")\n" pause else echo -e "\n$(red " ✘ ARK Node process is not running")\n" echo -e "$(green " Updating ARK Node...")\n" update_ark forever start app.js --genesis genesisBlock.mainnet.json --config config.mainnet.json >&- 2>&- echo -e "$(green " ✔ ARK Node was successfully started")\n" pause fi else echo -e " $(igreen " ARK Node is already Up-to-date \n")" sleep 2 fi } four(){ asciiart proc_vars if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " Instance of ARK Node found with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " Directory: $arkdir")\n" echo -e "\n$(green " Stopping ARK Node...")\n" cd $arkdir forever stop $forever_process >&- 2>&- echo -e "$(green " Dropping ARK DB...")\n" drop_db drop_user echo -e "$(green " Creating ARK DB...")\n" create_db # Here should come the snap choice snap_menu echo -e "$(green " Starting ARK Node...")" forever start app.js --genesis genesisBlock.mainnet.json --config config.mainnet.json >&- 2>&- echo -e "\n$(green " ✔ ARK Node was successfully started")\n" pause else echo -e "\n$(red " ✘ ARK Node process is not running")\n" echo -e "$(green " Dropping ARK DB...")\n" drop_db drop_user echo -e "$(green " Creating ARK DB...")\n" create_db # Here should come the snap choice snap_menu echo -e "$(green " Starting ARK Node...")" cd $arkdir forever start app.js --genesis genesisBlock.mainnet.json --config config.mainnet.json >&- 2>&- echo -e "$(green " ✔ ARK Node was successfully started")\n" pause fi } five(){ clear asciiart proc_vars secret echo -e "\n$(green " ✔ Secret has been set/replaced")\n" read -e -r -p "$(yellow " Do you want to apply your new config? (Y/N): ")" -i "Y" keys if [ "$keys" == "Y" ]; then if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "\n$(green " Instance of ARK Node found with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " Directory: $arkdir")\n" echo -e "$(green " Restarting...")" forever restart $forever_process >&- 2>&- echo -e "\n$(green " ✔ ARK Node was successfully restarted")\n" pause else echo -e "\n$(red " ✘ ARK Node process is not running")\n" echo -e "$(green " Starting ARK Node...")\n" forever start app.js --genesis genesisBlock.mainnet.json --config config.mainnet.json >&- 2>&- echo -e "$(green " ✔ ARK Node was successfully started")\n" pause fi fi } # OS Update six(){ os_up pause } # Additional Options seven(){ #nano while true do asciiart # HERE COMES THE GITHUB CHECK git_upd_check sub_menu read_sub_options done sub_menu ##turn #pause } # Start ARK Node start(){ proc_vars if [ -e $arkdir/app.js ]; then clear asciiart echo -e "\n$(green " ✔ ARK Node installation found!")\n" if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " A working instance of ARK Node was found with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " and Work Directory: $arkdir")\n" else echo -e "$(green " Starting ARK Node...")\n" cd $arkdir forever start app.js --genesis genesisBlock.mainnet.json --config config.mainnet.json >&- 2>&- cd $parent echo -e "$(green " ✔ ARK Node was successfully started")\n" sleep 1 proc_vars echo -e "\n$(green " ARK Node started with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " and Work Directory: $arkdir")\n" fi else echo -e "\n$(red " ✘ No ARK Node installation is found")\n" fi pause } # Node Status status(){ proc_vars if [ -e $arkdir/app.js ]; then clear asciiart echo -e "\n$(green " ✔ ARK Node installation found!")\n" if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " ARK Node process is working with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " and Work Directory: $arkdir")\n" else echo -e "\n$(red " ✘ No ARK Node process is running")\n" fi else echo -e "\n$(red " ✘ No ARK Node installation is found")\n" fi pause } restart(){ asciiart proc_vars if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " Instance of ARK Node found with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " Directory: $arkdir")\n" echo -e "$(green " Restarting...")" forever restart $forever_process >&- 2>&- echo -e "\n$(green " ✔ ARK Node was successfully restarted")\n" pause else echo -e "\n$(red " ✘ ARK Node process is not running")\n" pause fi } # Stop Node killit(){ proc_vars if [ -e $arkdir/app.js ]; then clear asciiart echo -e "\n$(green " ✔ ARK Node installation found!")\n" if [ "$node" != "" ] && [ "$node" != "0" ]; then echo -e "$(green " A working instance of ARK Node was found with:")" echo -e "$(green " System PID: $node, Forever PID $forever_process")" echo -e "$(green " and Work Directory: $arkdir")\n" echo -e "$(green " Stopping ARK Node...")\n" cd $arkdir forever stop $forever_process >&- 2>&- cd $parent echo -e "$(green " ✔ ARK Node was successfully stopped")\n" else echo -e "\n$(red " ✘ No ARK Node process is running")\n" fi else echo -e "\n$(red " ✘ No ARK Node installation is found")\n" fi pause } # Logs log(){ clear echo -e "\n$(yellow " Use Ctrl+C to return to menu")\n" proc_vars trap : INT tail -f $arkdir/logs/ark.log #pause } subfive(){ clear asciiart purge_pgdb } subsix(){ clear asciiart change_address } # Menu show_menus() { tput bold; tput setaf 3 echo " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo " O P T I O N S" echo " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo echo " 1. Install ARK" echo " 2. Reinstall ARK" echo " 3. Update ARK" echo " 4. Rebuild Database" echo " 5. Set/Reset Secret" echo " 6. OS Update" echo " 7. Additional options" echo echo " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo echo " A. ARK Start" echo " R. Restart ARK" echo " K. Kill ARK" echo " S. Node Status" echo " L. Node Log" echo " 0. Exit" echo tput sgr0 } # Sub Menu sub_menu() { tput bold; tput setaf 3 echo " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo " Additional Options" echo " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo echo " 1. Install ARK Cli" echo " 2. Install ARK Explorer" echo " 3. Install Snapshot script" echo " 4. Install Restart script" echo " 5. Purge PostgeSQL" echo " 6. Replace Delegate Address" echo " 0. Exit to Main Manu" echo echo " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo tput sgr0 } read_options(){ local choice read -p " Enter choice [1 - 7,A,R,K,S,L]: " choice case $choice in 1) one ;; 2) two ;; 3) three ;; 4) four ;; 5) five ;; 6) six ;; 7) seven ;; A) start ;; R) restart ;; K) killit;; [sS]) turn;; [lL]) log;; 0) exit 0;; *) echo -e "$(red " Incorrect option!")" && sleep 1 esac } read_sub_options(){ local choice1 read -p " Enter choice [1 - 7]: " choice1 case $choice1 in 1) subone ;; 2) subtwo ;; 3) subthree ;; 4) four ;; 5) subfive ;; 6) subsix ;; 7) seven ;; 0) break ;; *) echo -e "$(red " Incorrect option!")" && sleep 1 esac } # ---------------------------------------------- # Trap CTRL+C, CTRL+Z and quit singles # ---------------------------------------------- trap '' SIGINT SIGQUIT SIGTSTP # ---------------------------------------------- # First Run Initial OS update and prerequisites # ---------------------------------------------- if [ -e ./.firstrun ] ; then sdate=$(date +"%Y%m%d") fdate=$(date +"%Y%m%d") else fdate=$(date -r ./.firstrun +"%Y%m%d") fi if [ -e ./.firstrun ] && [ "$fdate" < "$sdate" ]; then # if [ -e ./.firstrun ] && [ $(date -r ./.firstrun +"%Y%m%d") < $(date +"%Y%m%d") ]; then echo -e "$(yellow " Checking for system updates...")\n" os_up log_rotate touch ./.firstrun fi if [ -e ./.firstrun ] && [ "$fdate" = "$sdate" ]; then clear asciiart echo -e "$(green " ✔ Your system is up to date.")\n" else if [ ! -e ./.firstrun ] ; then clear asciiart db_up clear asciiart ######echo "" echo -e "$(yellow "It's the first time you are starting this script!") " echo -e "$(yellow "First it will check if your system is up to date") " echo -e "$(yellow "install updates and needed prerequisites")\n" echo -e "$(yellow "Please be patient! It can take up to 5 minutes!")\n" pause os_up clear asciiart sleep 1 node_check iftop if [ "$return_" == 0 ]; then echo -e "$(yellow " Installing prerequisites...") " prereq else echo -e "$(green " ✔ Prerequisites are already installed")" fi clear asciiart echo -e "$(yellow " Setting up NTP and Locale...") " sleep 1 echo "" ntpd echo "" set_locale clear asciiart echo -e "$(yellow " Setting up NodeJS environment...") " sleep 1 nvm sleep 5 touch ./.firstrun echo -e "\n$(ired " !!! PLEASE REBOOT YOUR SYSTEM NOW !!! ") " echo -e "$(ired " !!! START THIS SCRIPT AGAIN AND !!! ") " echo -e "$(ired " !!! CHOOSE '1' TO INSTALL ARK NODE !!! ") " exit fi fi sudo updatedb proc_vars #exit # ---------------------------------------------- # Menu infinite loop # ---------------------------------------------- while true do asciiart # HERE COMES THE GITHUB CHECK git_upd_check show_menus read_options done