2017-10-30 18:05:19 +00:00
#!/bin/bash -e
2017-11-10 10:09:07 +00:00
# Running from a git repo
2017-10-30 18:05:19 +00:00
# Add cmdline options for passing to ansible
2017-11-10 10:09:07 +00:00
# Todo add proper shift to gobble up --debug --reinstall
2017-11-10 08:06:43 +00:00
2019-10-25 01:05:47 +00:00
PLAYBOOK=iiab-stages.yml
INVENTORY=ansible_hosts
IIAB_STATE_FILE=/etc/iiab/iiab_state.yml
2017-11-10 01:59:17 +00:00
ARGS=""
2017-11-05 04:33:15 +00:00
CWD=`pwd`
2020-11-29 01:41:18 +00:00
OS=`grep ^ID= /etc/os-release | cut -d= -f2`
2017-11-05 04:33:15 +00:00
OS=${OS//\"/}
2020-03-06 06:32:54 +00:00
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
2020-04-17 03:53:19 +00:00
MIN_ANSIBLE_VER=2.8.11 # Ansible 2.8.3 and 2.8.6 have serious bugs, preventing their use with IIAB.
2017-11-08 07:53:54 +00:00
2018-07-23 21:49:34 +00:00
if [ ! -f /etc/iiab/local_vars.yml ]; then
2018-07-24 19:28:34 +00:00
2018-07-24 19:20:34 +00:00
if [ -f /opt/iiab/iiab/vars/local_vars.yml ]; then
2018-07-24 19:28:34 +00:00
echo -e "\nACTION NEEDED: YOUR /opt/iiab/iiab/vars/local_vars.yml IS NO LONGER SUPPORTED.\n" >&2
2018-09-29 02:55:04 +00:00
2018-07-24 20:16:08 +00:00
echo -e "███████████████████ TO MOVE IT TO THE CORRECT LOCATION, RUN: ███████████████████" >&2
2018-07-24 20:17:29 +00:00
echo -e "██ ██" >&2
2018-07-24 20:16:08 +00:00
echo -e "██ mv /opt/iiab/iiab/vars/local_vars.yml /etc/iiab/local_vars.yml ██" >&2
2018-07-24 20:17:29 +00:00
echo -e "██ ██" >&2
2018-07-24 20:16:08 +00:00
echo -e "████████████████████████████████████████████████████████████████████████████████\n" >&2
2018-07-24 19:20:34 +00:00
fi
2018-07-24 19:43:38 +00:00
echo -e "\nEXITING: /opt/iiab/iiab/iiab-install REQUIRES /etc/iiab/local_vars.yml\n" >&2
2018-09-29 02:55:04 +00:00
2018-09-28 13:10:22 +00:00
echo -e "(1) Please read http://wiki.laptop.org/go/IIAB/local_vars.yml to learn more" >&2
2018-07-24 19:43:38 +00:00
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
2018-09-29 02:55:04 +00:00
2019-10-25 01:44:07 +00:00
echo -e ' http://download.iiab.io\n' >&2
2018-07-24 19:43:38 +00:00
2018-07-23 21:49:34 +00:00
exit 1
fi
2018-07-24 19:28:34 +00:00
# FUTURE: Test if their local_vars.yml is sufficiently version-compatible !
2018-07-23 21:51:55 +00:00
echo -e "\n\n./iiab-install $* BEGUN IN $CWD\n"
2017-11-19 03:29:45 +00:00
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."
2017-11-05 04:41:41 +00:00
if [ ! -f $PLAYBOOK ]; then
2019-10-25 01:44:07 +00:00
echo "EXITING: IIAB Playbook ""$PLAYBOOK"" not found."
echo "Please run './iiab-install' from /opt/iiab/iiab (top level of git repo)."
2017-11-05 04:41:41 +00:00
exit 1
fi
2017-11-19 03:29:45 +00:00
if [ "$1" != "--debug" ] && [ "$1" != "--reinstall" ] && [ "$1" != "" ]; then
echo "Use './iiab-install' for regular installs, or to continue an install."
2019-10-25 01:05:47 +00:00
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."
2017-11-19 03:29:45 +00:00
exit 1
fi
2017-11-10 02:19:38 +00:00
# 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/
2017-11-10 01:59:17 +00:00
# a consistent # of decimal points e.g. "if version_gt w.x.y.z a.b.c.d; then"
2018-10-26 21:16:06 +00:00
version_gt() { [ "$(printf '%s\n' "$@" | sort -V | head -1)" != "$1" ]; }
2017-11-10 01:59:17 +00:00
# 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`
2019-11-14 17:01:11 +00:00
echo "Found Kernel ""$CURR_KERN"
2017-12-13 09:45:04 +00:00
if [ "$OS" == "raspbian" ] && version_gt $MIN_RPI_KERN $CURR_KERN ; then
2019-11-14 17:01:11 +00:00
echo -e "\nEXITING: Kernel ""$MIN_RPI_KERN"" or higher required with Raspbian."
2018-09-29 02:55:04 +00:00
echo -e "PLEASE RUN 'apt update' then 'apt install raspberrypi-kernel' then reboot."
2019-11-14 17:09:24 +00:00
echo -e "THEN IF NEC run 'rpi-update' to install a more recent kernel, then reboot."
2018-09-29 02:55:04 +00:00
echo -e "IIAB INSTALL INSTRUCTIONS: https://github.com/iiab/iiab/wiki/IIAB-Installation"
2017-11-10 01:59:17 +00:00
exit 1
fi
2017-11-10 02:19:38 +00:00
# Verify that a recent enough version of Ansible is installed. See #449. The
2017-11-10 01:59:17 +00:00
# "include:" command was inconsistently implemented prior to Ansible 2.4.x.x
2017-11-10 02:30:48 +00:00
CURR_ANSIBLE_VER=0
2017-12-13 11:39:29 +00:00
#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"
2021-04-13 16:14:27 +00:00
CURR_ANSIBLE_VER=$(ansible --version | head -1 | cut -f 2- -d " ")
# Above works with 'ansible [core 2.11.0rc2]' -- these old ways do not:
#CURR_ANSIBLE_VER=$(ansible --version | head -1 | awk '{print $2}')
#CURR_ANSIBLE_VER=$(ansible --version | head -1 | sed -e 's/.* //')
2019-11-14 17:01:11 +00:00
echo "Found Ansible ""$CURR_ANSIBLE_VER"
2017-11-10 01:59:17 +00:00
fi
2017-12-13 09:45:04 +00:00
if version_gt $MIN_ANSIBLE_VER $CURR_ANSIBLE_VER ; then
2019-11-14 17:01:11 +00:00
echo -e "\nEXITING: Ansible ""$MIN_ANSIBLE_VER"" or higher required.\n"
2018-09-29 02:55:04 +00:00
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"
2017-11-10 01:59:17 +00:00
exit 1
2017-11-05 04:33:15 +00:00
fi
2017-11-10 01:59:17 +00:00
# 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
2017-11-10 22:18:05 +00:00
if [ -f /etc/iiab/iiab.env ]; then
2017-12-13 09:45:04 +00:00
if grep -q STAGE= /etc/iiab/iiab.env ; then
2017-11-10 10:09:07 +00:00
source /etc/iiab/iiab.env
2019-11-14 17:01:11 +00:00
echo "Extracted STAGE=""$STAGE"" (counter) from /etc/iiab/iiab.env"
2017-11-10 10:09:07 +00:00
if ! [ "$STAGE" -eq "$STAGE" ] 2> /dev/null; then
2019-11-14 17:01:11 +00:00
echo -e "\nEXITING: STAGE (counter) value == ""$STAGE"" is non-integer in /etc/iiab/iiab.env"
2017-11-10 10:09:07 +00:00
exit 1
2017-11-25 16:11:57 +00:00
elif [ "$STAGE" -lt 0 ] || [ "$STAGE" -gt 9 ]; then
2019-11-14 17:01:11 +00:00
echo -e "\nEXITING: STAGE (counter) value == ""$STAGE"" is out-of-range in /etc/iiab/iiab.env"
2017-11-10 10:09:07 +00:00
exit 1
fi
fi
2019-10-25 01:05:47 +00:00
if [ "$1" == "--reinstall" ]; then
2017-11-20 20:06:35 +00:00
STAGE=0
2019-11-14 17:01:11 +00:00
ARGS="$ARGS"" --extra-vars reinstall=True"
2017-11-20 20:06:35 +00:00
sed -i 's/^STAGE=.*/STAGE=0/' /etc/iiab/iiab.env
echo "Wrote STAGE=0 (counter) to /etc/iiab/iiab.env"
2017-11-10 08:06:43 +00:00
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."
2019-10-25 01:05:47 +00:00
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
2017-10-30 18:05:19 +00:00
fi
fi
2017-11-10 08:06:43 +00:00
if [ "$STAGE" -lt 2 ] && [ "$1" == "--debug" ]; then
echo -e "\n'--debug' *ignored* as STAGE (counter) < 2."
fi
2017-10-30 18:05:19 +00:00
2020-08-05 18:17:58 +00:00
# /etc/iiab/iiab_state.yml is mandatory and must be created here. Background:
2019-11-04 05:51:01 +00:00
# Allow iiab-install to read IIAB_STATE_FILE to not repeat installs of previous
2019-10-25 17:32:06 +00:00
# roles that already completed within the stage.
if [ ! -f $IIAB_STATE_FILE ]; then
2020-08-05 17:59:34 +00:00
#touch $IIAB_STATE_FILE
cat > $IIAB_STATE_FILE << EOF
# DO *NOT* MANUALLY EDIT THIS, THANKS!
2020-08-05 18:06:25 +00:00
# IIAB does NOT currently support uninstalling apps/services.
2020-08-05 17:59:34 +00:00
EOF
2019-10-25 17:32:06 +00:00
fi
2018-09-29 02:55:04 +00:00
echo -e "\nTRY TO RERUN './iiab-install' IF IT FAILS DUE TO CONNECTIVITY ISSUES ETC!\n"
2019-10-25 01:05:47 +00:00
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"
2017-11-10 01:59:17 +00:00
2019-11-14 17:01:11 +00:00
export ANSIBLE_LOG_PATH="$CWD""/iiab-install.log"
2018-07-23 21:49:34 +00:00
2019-10-31 02:38:06 +00:00
ansible -m setup -i $INVENTORY localhost --connection=local | grep python
2019-10-31 20:00:57 +00:00
ansible -m setup -i $INVENTORY localhost --connection=local >> /dev/null # So vars are recorded in /opt/iiab/iiab/iiab-install.log
2019-10-31 02:38:06 +00:00
ansible-playbook -i $INVENTORY $PLAYBOOK ${ARGS} --connection=local
2019-10-31 20:00:57 +00:00
2018-07-20 23:17:15 +00:00
echo -e "./iiab-install $* COMPLETED IN $CWD\n\n"