2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								#!/bin/bash
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								ip_addr_file = $1 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								remote_user = $2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								ssh_keys = $3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								usage( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:39:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  echo  -e " \\tUsage:  $0  <IP Address array> <username> [path to ssh keys]\\n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  echo  -e "\\t <IP Address array>: A bash script that exports an array of IP addresses, ip_addr_array. Elements of the array are public IP address of remote nodes." 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  echo  -e "\\t <username>:         The username for logging into remote nodes." 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  echo  -e "\\t [path to ssh keys]: The public/private key pair that remote nodes can use to perform rsync and ssh among themselves. Must contain pub, priv and authorized_keys.\\n" 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  exit  1 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 07:07:08 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Sample IP Address array file contents 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# ip_addr_array=(192.168.1.1 192.168.1.5 192.168.2.2) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								if  [ [  -z " $ip_addr_file "  ] ] ;  then 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  usage
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								fi 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								if  [ [  -z " $remote_user "  ] ] ;  then 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  usage
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								fi 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								echo  " Build started at  $( date) " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								SECONDS = 0 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Build and install locally 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								PATH = " $HOME " /.cargo/bin:" $PATH " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								cargo install --force
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								echo  " Build took  $SECONDS  seconds " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:49:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								ip_addr_array = ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Get IP address array 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:39:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# shellcheck source=/dev/null 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								source  " $ip_addr_file " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:39:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# shellcheck disable=SC2089,SC2016 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								ssh_command_prefix = 'export PATH="$HOME/.cargo/bin:$PATH"; cd solana; USE_INSTALL=1' 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								echo  " Deployment started at  $( date) " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								SECONDS = 0 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								count = 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								leader = 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 07:07:08 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								for  ip_addr in " ${ ip_addr_array [@] } " ;  do 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  echo  " $ip_addr " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ssh-keygen -R " $ip_addr " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ssh-keyscan " $ip_addr "  >>~/.ssh/known_hosts
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ssh -n -f " $remote_user @ $ip_addr "  'mkdir -p ~/.ssh ~/solana ~/.cargo/bin' 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  # Killing sshguard for now. TODO: Find a better solution 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  # sshguard is blacklisting IP address after ssh-keyscan and ssh login attempts 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ssh -n -f " $remote_user @ $ip_addr "  "sudo service sshguard stop" 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 06:28:12 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ssh -n -f " $remote_user @ $ip_addr "  'sudo apt-get --assume-yes install rsync libssl-dev' 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  # If provided, deploy SSH keys 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 07:07:08 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  if  [ [  -z $ssh_keys  ] ] ;  then 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    echo  "skip copying the ssh keys" 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  else 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 22:08:32 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    rsync -vPrz " $ssh_keys " /id_rsa " $remote_user @ $ip_addr " :~/.ssh/
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    rsync -vPrz " $ssh_keys " /id_rsa.pub " $remote_user @ $ip_addr " :~/.ssh/
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    rsync -vPrz " $ssh_keys " /id_rsa.pub " $remote_user @ $ip_addr " :~/.ssh/authorized_keys
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  'chmod 600 ~/.ssh/authorized_keys ~/.ssh/id_rsa' 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  fi 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:49:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  # Stop current nodes 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ssh " $remote_user @ $ip_addr "  'pkill -9 solana-' 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 06:28:12 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  if  [ [  -n $leader  ] ] ;  then 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    echo  " Adding known hosts for  $ip_addr " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  " ssh-keygen -R  $leader " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  " ssh-keyscan  $leader  >> ~/.ssh/known_hosts " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  "rsync -vPrz " " $remote_user @ $leader " ":~/.cargo/bin/solana* ~/.cargo/bin/" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  "rsync -vPrz " " $remote_user @ $leader " ":~/solana/multinode-demo ~/solana/" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  "rsync -vPrz " " $remote_user @ $leader " ":~/solana/fetch-perf-libs.sh ~/solana/" 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 06:28:12 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Deploy build and scripts to remote node 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    rsync -vPrz ~/.cargo/bin/solana* " $remote_user @ $ip_addr " :~/.cargo/bin/
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    rsync -vPrz ./multinode-demo " $remote_user @ $ip_addr " :~/solana/
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    rsync -vPrz ./fetch-perf-libs.sh " $remote_user @ $ip_addr " :~/solana/
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 06:28:12 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  fi 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:49:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 11:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  # Run setup 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ssh " $remote_user @ $ip_addr "  " $ssh_command_prefix " ' ./multinode-demo/setup.sh -p "$ip_addr"' 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ( !count) ) ;  then 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    # Start the leader on the first node 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 07:07:08 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    echo  " Starting leader node  $ip_addr " 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  'cd solana; ./fetch-perf-libs.sh' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  " $ssh_command_prefix " ' SOLANA_CUDA=1 ./multinode-demo/leader.sh > leader.log 2>&1' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  " $ssh_command_prefix " ' ./multinode-demo/drone.sh > drone.log 2>&1' 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 07:07:08 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    leader = ${ ip_addr_array [0] } 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Start validator on all other nodes 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 07:07:08 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    echo  " Starting validator node  $ip_addr " 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ssh -n -f " $remote_user @ $ip_addr "  " $ssh_command_prefix " "  ./multinode-demo/validator.sh  $remote_user @ $leader :~/solana  $leader  > validator.log 2>&1 " 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  fi 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-02 18:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ( ( count++) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 22:56:29 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								done 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 10:40:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								echo  " Deployment finished at  $( date) " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								echo  " Deployment took  $SECONDS  seconds "