mirror of
				https://github.com/iiab/iiab.git
				synced 2025-03-09 15:40:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			193 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/bash -e
 | |
| # Running from a git repo
 | |
| # Add cmdline options for passing to ansible
 | |
| # Todo add proper shift to gobble up --debug --reinstall
 | |
| 
 | |
| PLAYBOOK=iiab-stages.yml
 | |
| INVENTORY=ansible_hosts
 | |
| IIAB_STATE_FILE=/etc/iiab/iiab_state.yml
 | |
| ARGS=""
 | |
| CWD=`pwd`
 | |
| OS=`grep ^ID= /etc/*release|cut -d= -f2`
 | |
| OS=${OS//\"/}
 | |
| MIN_RPI_KERN=4.19.97       # If using Raspbian, 'rpi-update' should no longer be nec -- please use Raspbian 2020-02-13 or higher: https://github.com/iiab/iiab/issues/1993
 | |
| MIN_ANSIBLE_VER=2.8.10     # Ansible 2.8.3 and 2.8.6 have serious bugs, preventing their use with IIAB.
 | |
| 
 | |
| if [ ! -f /etc/iiab/local_vars.yml ]; then
 | |
| 
 | |
|     if [ -f /opt/iiab/iiab/vars/local_vars.yml ]; then
 | |
|         echo -e "\nACTION NEEDED: YOUR /opt/iiab/iiab/vars/local_vars.yml IS NO LONGER SUPPORTED.\n" >&2
 | |
| 
 | |
|         echo -e "███████████████████ TO MOVE IT TO THE CORRECT LOCATION, RUN: ███████████████████" >&2
 | |
|         echo -e "██                                                                            ██" >&2
 | |
|         echo -e "██       mv /opt/iiab/iiab/vars/local_vars.yml /etc/iiab/local_vars.yml       ██" >&2
 | |
|         echo -e "██                                                                            ██" >&2
 | |
|         echo -e "████████████████████████████████████████████████████████████████████████████████\n" >&2
 | |
|     fi
 | |
| 
 | |
|     echo -e "\nEXITING: /opt/iiab/iiab/iiab-install REQUIRES /etc/iiab/local_vars.yml\n" >&2
 | |
| 
 | |
|     echo -e "(1) Please read http://wiki.laptop.org/go/IIAB/local_vars.yml to learn more" >&2
 | |
|     echo -e "(2) MIN/MEDIUM/BIG samples are included in /opt/iiab/iiab/vars" >&2
 | |
|     echo -e "(3) NO TIME FOR DETAILS?  RUN INTERNET-IN-A-BOX'S FRIENDLY 1-LINE INSTALLER:\n" >&2
 | |
| 
 | |
|     echo -e '    http://download.iiab.io\n' >&2
 | |
| 
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # FUTURE: Test if their local_vars.yml is sufficiently version-compatible !
 | |
| 
 | |
| echo -e "\n\n./iiab-install $* BEGUN IN $CWD\n"
 | |
| 
 | |
| if [ ! -f /etc/ansible/facts.d/local_facts.fact ]; then
 | |
|     mkdir -p /etc/ansible/facts.d
 | |
| fi
 | |
| cp ./scripts/local_facts.fact /etc/ansible/facts.d/local_facts.fact
 | |
| echo "Placed /etc/ansible/facts.d/local_facts.fact into position."
 | |
| 
 | |
| if [ ! -f $PLAYBOOK ]; then
 | |
|     echo "EXITING: IIAB Playbook ""$PLAYBOOK"" not found."
 | |
|     echo "Please run './iiab-install' from /opt/iiab/iiab (top level of git repo)."
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| if [ "$1" != "--debug" ] && [ "$1" != "--reinstall" ] && [ "$1" != "" ]; then
 | |
|     echo "Use './iiab-install' for regular installs, or to continue an install."
 | |
|     echo "Use './iiab-install --reinstall' to force running all Stages 0-9, followed by the Network Role."
 | |
|     echo "Use './iiab-install --debug' to run Stage 0, followed by Stages 3-9, followed by the Network Role."
 | |
|     echo "Use './iiab-configure' to run Stage 0, followed by Stages 4-9."
 | |
|     echo "Use './runrole' to run Stage 0, followed by a single Stage or Role."
 | |
|     echo "Use './iiab-network' to run Stage 0, followed by the Network Role."
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # Subroutine compares software version numbers.  Generates rare false positives
 | |
| # like "1.0 > 1" and "2.4.0 > 2.4".  Avoid risks by structuring conditionals w/
 | |
| # a consistent # of decimal points e.g. "if version_gt w.x.y.z a.b.c.d; then"
 | |
| version_gt() { [ "$(printf '%s\n' "$@" | sort -V | head -1)" != "$1" ]; }
 | |
| 
 | |
| # Verify that Raspbian is running a recent enough kernel.  As Raspbian
 | |
| # updates on 4.9.41-v7+ broke bridging, WiFi AP & OpenVPN in Oct/Nov 2017.
 | |
| CURR_KERN=`uname -r`
 | |
| echo "Found Kernel ""$CURR_KERN"
 | |
| if [ "$OS" == "raspbian" ] && version_gt $MIN_RPI_KERN $CURR_KERN ; then
 | |
|     echo -e "\nEXITING: Kernel ""$MIN_RPI_KERN"" or higher required with Raspbian."
 | |
|     echo -e "PLEASE RUN 'apt update' then 'apt install raspberrypi-kernel' then reboot."
 | |
|     echo -e "THEN IF NEC run 'rpi-update' to install a more recent kernel, then reboot."
 | |
|     echo -e "IIAB INSTALL INSTRUCTIONS: https://github.com/iiab/iiab/wiki/IIAB-Installation"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # Verify that a recent enough version of Ansible is installed.  See #449.  The
 | |
| # "include:" command was inconsistently implemented prior to Ansible 2.4.x.x
 | |
| CURR_ANSIBLE_VER=0
 | |
| #if [ $(grep ubuntu /etc/apt/sources.list) ]; then  # FAILS when multiple lines returned, due to single square brackets
 | |
| #if grep -q ubuntu /etc/apt/sources.list ; then     # Works: bypasses need for "> /dev/null" thanks to "grep -q" (quiet)
 | |
| #if command -v ansible > /dev/null ; then  # Works But Wordy!
 | |
| #if [[ $(command -v ansible) ]]; then      # Also Works! $(...) nests more easily than backticks
 | |
| #if [[ `which ansible` ]]; then            # "which" misses built-in commands like cd, and is RISKY per https://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script
 | |
| #if [[ `type -P ansible` ]]; then          # "type -P" isn't POSIX compliant; it misses built-in commands like "cd"
 | |
| if [[ `command -v ansible` ]]; then        # "command -v" is POSIX compliant; it catches built-in commands like "cd"
 | |
|     #CURR_ANSIBLE_VER=`ansible --version | head -1 | sed -e 's/.* //'`
 | |
|     #CURR_ANSIBLE_VER=`ansible --version | head -1 | cut -f 2 -d " "`
 | |
|     CURR_ANSIBLE_VER=`ansible --version | head -1 | awk '{print $2}'`    # to match scripts/ansible
 | |
|     echo "Found Ansible ""$CURR_ANSIBLE_VER"
 | |
| fi
 | |
| if version_gt $MIN_ANSIBLE_VER $CURR_ANSIBLE_VER ; then
 | |
|     echo -e "\nEXITING: Ansible ""$MIN_ANSIBLE_VER"" or higher required.\n"
 | |
| 
 | |
|     echo -e "REMOVE PRIOR VERSIONS using 'apt purge ansible' and/or 'pip uninstall ansible'."
 | |
|     echo -e "THEN RUN 'scripts/ansible' to install the latest Ansible from PPA or RPM."
 | |
|     echo -e "'ansible --version' and 'apt -a list ansible' can also be very useful.\n"
 | |
| 
 | |
|     echo -e "IIAB INSTALL INSTRUCTIONS: https://github.com/iiab/iiab/wiki/IIAB-Installation"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # Stage 0 will always be run.  From there on up to Stage 9 we keep a counter
 | |
| # (in /etc/iiab/iiab.env) of the highest completed Stage.  Avoid repetition!
 | |
| STAGE=0
 | |
| if [ -f /etc/iiab/iiab.env ]; then
 | |
|     if grep -q STAGE= /etc/iiab/iiab.env ; then
 | |
|         source /etc/iiab/iiab.env
 | |
|         echo "Extracted STAGE=""$STAGE"" (counter) from /etc/iiab/iiab.env"
 | |
|         if ! [ "$STAGE" -eq "$STAGE" ] 2> /dev/null; then
 | |
|             echo -e "\nEXITING: STAGE (counter) value == ""$STAGE"" is non-integer in /etc/iiab/iiab.env"
 | |
|             exit 1
 | |
|         elif [ "$STAGE" -lt 0 ] || [ "$STAGE" -gt 9 ]; then
 | |
|             echo -e "\nEXITING: STAGE (counter) value == ""$STAGE"" is out-of-range in /etc/iiab/iiab.env"
 | |
|             exit 1
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     if [ "$1" == "--reinstall" ]; then
 | |
|         STAGE=0
 | |
|         ARGS="$ARGS"" --extra-vars reinstall=True"
 | |
|         sed -i 's/^STAGE=.*/STAGE=0/' /etc/iiab/iiab.env
 | |
|         echo "Wrote STAGE=0 (counter) to /etc/iiab/iiab.env"
 | |
|     elif [ "$STAGE" -ge 2 ] && [ "$1" == "--debug" ]; then
 | |
|         STAGE=2
 | |
|         sed -i 's/^STAGE=.*/STAGE=2/' /etc/iiab/iiab.env
 | |
|         echo "Wrote STAGE=2 (counter) to /etc/iiab/iiab.env"
 | |
|     elif [ "$STAGE" -eq 9 ]; then
 | |
|         echo -e "\nEXITING: STAGE (counter) in /etc/iiab/iiab.env shows Stage 9 Is Already Done."
 | |
|         echo -e "Use './iiab-install --reinstall' to force running all Stages 0-9, followed by the Network Role."
 | |
|         echo -e "Use './iiab-install --debug' to run Stage 0, followed by Stages 3-9, followed by the Network Role."
 | |
|         echo -e "Use './iiab-configure' to run Stage 0, followed by Stages 4-9."
 | |
|         echo -e "Use './runrole' to run Stage 0, followed by a single Stage or Role."
 | |
|         echo -e "Use './iiab-network' to run Stage 0, followed by the Network Role.\n\n"
 | |
| 
 | |
|         exit 0    # Allows rerunning http://download.iiab.io/install.txt
 | |
|     fi
 | |
| fi
 | |
| if [ "$STAGE" -lt 2 ] && [ "$1" == "--debug" ]; then
 | |
|     echo -e "\n'--debug' *ignored* as STAGE (counter) < 2."
 | |
| fi
 | |
| 
 | |
| # TEMPORARY: Catch images up to current code to benefit from pre-installed apps
 | |
| # Workaround for (web-published) images; will go away later
 | |
| # Assumes /etc/iiab/iiab_state.yml is not created until (prior run of) Stage 4 but
 | |
| # config_vars2.yml is present with the stage counter altered by pi-gen to be 2.
 | |
| if [ -f /etc/iiab/config_vars2.yml ]; then
 | |
|     mv /etc/iiab/config_vars2.yml $IIAB_STATE_FILE
 | |
| 
 | |
| # Fix up prior values in state file
 | |
| # mongo role improved post image creation
 | |
|     if grep -q sugar $IIAB_STATE_FILE && ! grep -q mongodb $IIAB_STATE_FILE; then
 | |
|         echo "mongodb_installed: True" >> $IIAB_STATE_FILE
 | |
|     fi
 | |
| 
 | |
| # TEMPORARY: another change to account for
 | |
| #    sed -i -e 's/pan_bluetooth/bluetooth/' $IIAB_STATE_FILE
 | |
| 
 | |
|     if [ "$STAGE" -eq 2 ]; then
 | |
|         echo -e "\nCompleting Stage 3 from IIAB image (starts systemd service iiab-setup-db to run the 'mysql' role)."
 | |
|         systemctl start iiab-setup-db
 | |
|     fi
 | |
| 
 | |
|     PLAYBOOK="iiab-from-console.yml"    # Stage 4-9 then Network Role
 | |
|     ARGS=""    # Removes '--extra-vars reinstall=True' if --reinstall, BUT WHY?
 | |
| # The same as --reinstall except Stage 3 is not run as there are no other functional
 | |
| # changes in Stage 3 to account for post image creation, once the above is run.
 | |
| # reinstall=True would force kiwix to re-download and re-install in commit
 | |
| # ce2ec3b0cad76449caf3299003b5d297a3164181
 | |
| ## End image catch up
 | |
| fi
 | |
| 
 | |
| # Allow iiab-install to read IIAB_STATE_FILE to not repeat installs of previous
 | |
| # roles that already completed within the stage.
 | |
| if [ ! -f  $IIAB_STATE_FILE ]; then
 | |
|     touch $IIAB_STATE_FILE
 | |
| fi
 | |
| echo -e "\nTRY TO RERUN './iiab-install' IF IT FAILS DUE TO CONNECTIVITY ISSUES ETC!\n"
 | |
| 
 | |
| echo -e "Running local Ansible playbooks...\n...Stage 0 will now run\n...followed by Stages $(($STAGE + 1))-9\n...and then the Network Role.\n"
 | |
| 
 | |
| export ANSIBLE_LOG_PATH="$CWD""/iiab-install.log"
 | |
| 
 | |
| ansible -m setup -i $INVENTORY localhost --connection=local | grep python
 | |
| ansible -m setup -i $INVENTORY localhost --connection=local >> /dev/null    # So vars are recorded in /opt/iiab/iiab/iiab-install.log
 | |
| ansible-playbook -i $INVENTORY $PLAYBOOK ${ARGS} --connection=local
 | |
| 
 | |
| echo -e "./iiab-install $* COMPLETED IN $CWD\n\n"
 |