Explorar o código

helper script to setup bus DIU

Abram Connelly %!s(int64=6) %!d(string=hai) anos
pai
achega
331fbd4fcd
Modificáronse 1 ficheiros con 492 adicións e 0 borrados
  1. 492 0
      aux/deploy-busunit-interactive

+ 492 - 0
aux/deploy-busunit-interactive

@@ -0,0 +1,492 @@
+#!/bin/bash
+#
+# Copyright (c) 2019 Clementine Computing LLC.
+# 
+# This file is part of PopuFare.
+# 
+# PopuFare is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# PopuFare is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+# 
+# You should have received a copy of the GNU Affero General Public License
+# along with PopuFare.  If not, see <https://www.gnu.org/licenses/>.
+#
+
+GITURL="https://tree.clementinecomputing.com/clementinecomputing/popufare"
+
+echo ""
+echo '  _____                   __               '
+echo ' |  __ \                 / _|              '
+echo ' | |__) |__  _ __  _   _| |_ __ _ _ __ ___ '
+echo ' |  ___/ _ \| '"'"'_ \| | | |  _/ _` | '"'"'__/ _ \'
+echo ' | |  | (_) | |_) | |_| | || (_| | | |  __/'
+echo ' |_|   \___/| .__/ \__,_|_| \__,_|_|  \___|'
+echo '            | |                            '
+echo '            |_|                            '
+echo ""
+echo "This script attempts to setup a default installation of Popufare on a busunit (a Raspberry Pi, say)"
+echo "by setting up and configuring the system."
+echo ""
+echo "THIS SCRIPT CHANGES SYSTEM WIDE PARAMETERS AND COULD HAVE SERIOUS CONSEQUENCES TO THE MACHINE IT'S RUN"
+echo "ON."
+echo ""
+echo "As such, this scripts needs root access (via sudo)."
+echo "This script is meant to be a 'helper' script and isn't meant to be all encompassing. Among other things,"
+echo "this script will:"
+echo ""
+echo "  * setup a 'bus' user and group"
+echo "  * add the 'pi' user to the 'bus' group"
+echo "  * clone the Popufare repo, build it's binaries and install them in the '/home/bus' user directory"
+echo "  * copy over appropriate config files to the appropriate locations in the '/hom/ebus' user directory"
+echo "  * setup ssh keys and credentials"
+echo "  * setup the PPP config files"
+echo "  * alter /boot/config.txt and /etc/modules to enable serial and sound setup"
+echo "  * setup a 'kiosk' service for the front end DIU"
+echo "  * setup 'rc.local' to start and monitor bus Popufare services on startup"
+echo "  * setup legacy data directories in '/mnt/data2'"
+echo ""
+echo "Most parameters have options to prompt the user for installation."
+echo ""
+echo "This script should be used with caution and as a helper for an installation rather than a 'turn key' soluation."
+echo "For example, the ssh keys default to the UNSECURE 'snakeoil' default keys provided the repo for easy setup and"
+echo "MUST BE CHANGED for a production installation."
+echo ""
+echo "In addition, the host and other config file options should be set on a per installation basis, as should the custom"
+echo "DIU interface, rules, drivers.txt entries, etc."
+echo ""
+echo "This script should help in getting a Raspberry Pi ready for use with Popufare but should be thought of also as a"
+echo "record of what relevant files there are to change and where to look."
+echo ""
+echo "As Popufare matures, this installation script or something similar can accomodate a more seamless installation but"
+echo "this is what is provided now."
+echo ""
+echo "Popufare is free software so please feel free to contribute at:"
+echo ""
+echo "           https://tree.clementinecomputing.com/clementinecomputing/popufare"
+echo ""
+
+echo -n "Hit return to continue [ok]: "
+read hitreturn
+
+###### basic sanity checks to make sure we're installing on a Raspberry Pi
+######
+
+if [[ ! -e /etc/os-release ]] ; then
+
+  echo -n "Are you sure you want to install? '/etc/os-release' does not exist and this system might not be a Raspberry Pi. Continue? [y/N]: "
+  read fnfok
+
+  if [[ ! "$fnfok" =~ ^[yY]$ ]] ; then
+    echo "cancelling installalation"
+    echo ""
+    exit
+  else
+    echo "ok, continuing installation..."
+  fi
+
+else
+
+  grep -P '^PRETTY_NAME="Raspbian' /etc/os-release 2>&1 > /dev/null
+  r=$?
+  if [[ $r != 0  ]] ; then
+
+    echo -n "Raspbian not detected in '/etc/os-release'. This might not be Raspberry Pi. Continue with installation? [y/N]: "
+    read okcontinue
+
+    if [[ ! "$okcontinue" =~ ^[yY]$ ]] ; then
+      echo "cancelling installation"
+      echo ""
+      exit
+    else
+      echo "ok, continuing installation..."
+    fi
+
+  fi
+
+fi
+
+echo ""
+
+######
+######
+
+echo -n "Create 'bus' user? [Y/n]: "
+read createbususer
+
+if [[ "$createbususer" =~ ^[yY]?$ ]]; then
+  echo "... creating 'bus' user and group"
+  sudo adduser bus
+fi
+
+echo ""
+
+echo -n "Add 'pi' to 'bus' group? [Y/n]: "
+read addpibus
+
+if [[ "$addpibus" =~ ^[yY]$ ]]; then
+  echo "... add 'pi' to 'bus' group"
+  sudo usermod -a -G bus pi
+fi
+
+echo ""
+
+echo "Creating /home/bus/(bin|database|config) with group write permissions"
+
+sudo mkdir -p /home/bus/bin
+sudo mkdir -p /home/bus/database
+sudo mkdir -p /home/bus/config
+
+sudo chown -R bus:bus /home/bus/bin
+sudo chown -R bus:bus /home/bus/database
+sudo chown -R bus:bus /home/bus/config
+
+sudo chmod -R g+w /home/bus/bin
+sudo chmod -R g+w /home/bus/database
+sudo chmod -R g+w /home/bus/config
+
+echo ""
+
+echo -n "Repo path (hit return to automatically clone the repo and use that) []: "
+read repolocation
+
+tmpdir=""
+if [[ "$repolocation" == "" ]] ; then
+  tmpdir=`mktemp -d`
+  repolocation="$tmpdir/popufare"
+
+  pushd $tmpdir
+  git clone "$GITURL"
+  popd
+fi
+
+echo "Setting up binaries..."
+
+bd=/home/bus/popufare/busunit
+d=/home/bus/popufare/busunit/bin/native
+diudir=/home/bus/popufare/busunit/DIUv2
+tc=/home/bus/popufare/busunit/testing/config
+
+sudo cp -R $repolocation /home/bus
+sudo chown -R bus:bus /home/bus/popufare
+sudo bash -c " su - bus -c ' cd /home/bus/popufare/busunit ; ./build_all.sh native ; ' "
+sudo bash -c " cd /home/bus/bin ; ln -s $d/avls . ; ln -s $d/billdb . ; ln -s $d/client_supervisor . ; ln -s $d/debug_client . ; ln -s $d/diu_minder . ; ln -s $d/ipc_server . "
+sudo bash -c " cd /home/bus/bin ; ln -s $d/paddlemgr . ; ln -s $d/passdb . ; ln -s $d/piu_minder . ; ln -s $d/send_billing_record . ; ln -s $d/send_magstripe . "
+
+sudo bash -c " cd /home/bus/bin ; ln -s $bd/DIUv2/diu_kiosk . "
+
+sudo bash -c " cd /home/bus/bin ; ln -s $bd/scripts/init_bus.sh . ; ln -s $bd/scripts/update_loop.sh . ; ln -s $bd/scripts/setup-serial.py . ; ln -s $bd/scripts/get_net_ids.sh . "
+sudo bash -c " cd /home/bus/bin ; ln -s $bd/scripts/connection_tether.sh . "
+
+sudo bash -c " cd /home/bus/config ; ln -s $diudir/html . ; "
+sudo bash -c " cd /home/bus/config ; cp $bd/passdb/init.scm . ; cp $bd/passdb/rfid_patterns.txt . "
+sudo bash -c " cp $tc/equipnum.txt . ; cp $tc/config.tgz.checksum . ; cp $tc/config.tgz.version . ; cp $tc/firmware.tgz.checksum . ; cp $tc/firmware.tgz.version . ; cp $tc/serial.txt serial_num "
+
+sudo bash -c " rm -f /home/bus/bin/common_values.sh ; cp $bd/scripts/common_values.sh /home/bus/bin "
+
+echo ""
+
+##### paddle setup
+#####
+
+echo -n "Setup paddles? [Y/n]: "
+read setuppaddles
+
+if [[ "$setuppaddles" =~ ^[yY]?$ ]] ; then
+  echo -n "Paddle location? (blank for default testing paddles) []: "
+  read paddlocation
+
+  if [[ "$paddlelocation" == "" ]] ; then
+    paddlelocation=$bd/busunit/testing
+  fi
+
+  echo "Using '$paddlelocation/*.paddle'..."
+
+  sudo bash -c " cd /home/bus/config ; cp $bd/testing/*.paddle . "
+fi
+
+echo ""
+
+##### rules setup
+#####
+
+echo -n "Setup rules? [Y/n]: "
+read setuprules
+
+if [[ "$setuprules" =~ ^[yY]?$ ]] ; then
+  echo -n "Rule file? (blank for default testing rules) []: "
+  read rulelocation
+
+  if [[ "$rulelocation" == "" ]] ; then
+    rulelocation=$bd/testing/rules-ORG.scm
+  fi
+
+  echo "Setting up rules from '$rulelocation'..."
+
+  sudo bash -c " cd /home/bus/config ; cp $rulelocation rules.scm "
+fi
+
+echo ""
+
+##### equipment number setup
+#####
+
+echo -n "Equipment number? [9999]: "
+read equipnum
+
+if [[ "$equipnum" == "" ]] ; then
+  equipnum=9999
+
+fi
+
+echo "Setting equipment number to '$equipnum'..."
+sudo bash -c " echo $equipnum > /home/bus/config/equipnum.txt "
+
+echo ""
+
+##### key setup
+#####
+
+echo -n "Setup secure communcation setup? [Y/n]: "
+read tunnelsetup
+
+if [[ "$tunnelsetup" =~ ^[yY]?$ ]] ; then
+
+  echo -n "  'id_rsa' private key location? (default to snakeoil) []: "
+  read keylocation
+
+  if [[ "$keylocation" == "" ]] ; then
+    keylocation=/home/bus/popufare/server/docker/snakeoil_id_rsa
+  fi
+
+  echo "  Using '$keylocation' for private key..."
+
+  sudo mkdir -p /home/bus/.ssh
+  sudo chown -R bus:bus /home/bus/.ssh
+
+  sudo cp $keylocation /home/bus/.ssh/id_rsa_bus
+  sudo chown bus:bus /home/bus/.ssh/id_rsa_bus
+  sudo chmod 400 /home/bus/.ssh/id_rsa_bus
+
+  echo ""
+
+  echo -n "  Tunnel port? [6055]: "
+  read tunnelport
+
+  if [[ "$tunnelport" == "" ]] ; then
+    tunnelport=6055
+  fi
+
+  echo ""
+
+  echo -n "  Tunnel user and host? [bus@example.com]: "
+  read tunnelhost
+
+  if [[ "$tunnelhost" == "" ]] ; then
+    tunnelhost='bus@example.com'
+  fi
+
+  echo ""
+
+  echo -n "  Adding values to '/home/bus/bin/common_values.sh'..."
+
+  sed -i 's;^SSH_DEFAULT_TARGET=;#SSH_DEFAULT_TARGET=;g' /home/bus/bin/common_values.sh
+  sed -i 's;^SSH_DEFAULT_PORT=;#SSH_DEFAULT_PORT=;g' /home/bus/bin/common_values.sh
+  sed -i 's;^SSH_DEFAULT_IDENTITY=;#SSH_DEFAULT_IDENTITY=;g' /home/bus/bin/common_values.sh
+
+  sed -i 's;^SSH_TARGET=;#SSH_TARGET=;g' /home/bus/bin/common_values.sh
+  sed -i 's;^SSH_PORT=;#SSH_PORT=;g' /home/bus/bin/common_values.sh
+  sed -i 's;^SSH_IDENTITY=;#SSH_IDENTITY=;g' /home/bus/bin/common_values.sh
+
+  echo 'SSH_DEFAULT_TARGET="'"$tunnelhost"'"' >> /home/bus/bin/common_values.sh
+  echo 'SSH_DEFAULT_PORT="'"$tunnelport"'"' >> /home/bus/bin/common_values.sh
+  echo 'SSH_DEFAULT_IDENTITY="/home/bus/.ssh/id_rsa_bus"' >> /home/bus/bin/common_values.sh
+  echo '' >> /home/bus/bin/common_values.sh
+  echo 'SSH_TARGET="$SSH_DEFAULT_TARGET"' >> /home/bus/bin/common_values.sh
+  echo 'SSH_PORT="$SSH_DEFAULT_PORT"' >> /home/bus/bin/common_values.sh
+  echo 'SSH_IDENTITY="$SSH_DEFAULT_IDENTITY"' >> /home/bus/bin/common_values.sh
+
+  echo ""
+
+fi
+
+echo ""
+
+##### drivers setup
+#####
+
+echo -n "'drivers.txt' location? (default to test) []: "
+read driverlocation
+
+if [[ "$driverlocation" == "" ]] ; then
+  driverlocation=/home/bus/popufare/busunit/DIUv2/drivers.txt
+fi
+
+echo "Using '$driverlocation' for drivers.txt ..."
+
+sudo cp $driverlocation /home/bus/config
+
+echo ""
+
+##### setup fona ppp
+#####
+
+echo -n "Setup FONA ppp files? [Y/n]: "
+read setupfona
+
+if [[ "$setupfona" =~ ^[yY]?$ ]] ; then
+  echo "  /home/bus/popufare/busunit/ppp-dialer/etc/ppp/peers/fona -> /etc/ppp/peers/gprs"
+  echo "  /home/bus/popufare/busunit/ppp-dialer/etc/chatscripts/gprs -> /etc/chatscripts/gprs"
+
+  sudo cp /home/bus/popufare/busunit/ppp-dialer/etc/ppp/peers/fona /etc/ppp/peers/gprs
+  sudo cp /home/bus/popufare/busunit/ppp-dialer/etc/chatscripts/gprs /etc/chatscripts/gprs
+
+  echo ""
+
+fi
+
+#echo -n "Setup FONA to connect at startup? [Y/n]: "
+#read fonanetwork
+#
+#if [[ "$fonanetwork" =~ ^[yY]?$ ]] ; then
+#  echo "  Creating '/etc/network/interfaces.d/fona'..."
+#  sudo echo 'auto fona' > /etc/network/interfaces.d/fona
+#  sudo echo 'iface fona inet ppp' >> /etc/network/interfaces.d/fona
+#  sudo echo '  provider fona' >> /etc/network/interfaces.d/fona
+#fi
+
+##### Setup config.txt
+#####
+
+echo -n "Setup '/boot/config.txt'? (Note this could have serious consequences, use with caution) [y/N]: "
+read setupconfig
+
+if [[ "$setupconfig" =~ ^[yY]$ ]] ; then
+  tmpfn=`mktemp`
+  bfn=`basename $tmpfn`
+
+  echo "  Saving 'config.txt' to /root/$bfn"
+  sudo cp /boot/config.txt $tmpfn
+  sudo mv $tmpfn /root/$bfn
+
+  echo "  adding> enable_uart=1"
+  sudo sed -i 's;^enable_uart=;#enable_uart=;g' /boot/config.txt
+  sudo bash -c 'echo "enable_uart=1" >> /boot/config.txt'
+
+  echo "  adding> dtoverlay=pi3-disable-bt"
+  sudo sed -i 's;^dtoverlay=pi3-disable-bt;#dtoverlay=pi3-disable-bt;g' /boot/config.txt
+  sudo bash -c 'echo "dtoverlay=pi3-disable-bt" >> /boot/config.txt'
+
+  echo "  adding> dtoverlay=pi3-disable-wifi"
+  sudo sed -i 's;^dtoverlay=pi3-disable-wifi;#dtoverlay=pi3-disable-wifi;g' /boot/config.txt
+  sudo bash -c 'echo "dtoverlay=pi3-disable-wifi" >> /boot/config.txt'
+fi
+
+echo ""
+
+##### Setup sound in modules file
+#####
+
+echo -n "Setup sound (alter '/etc/modules')? [y/N]: "
+read setupsound
+
+if [[ "$setupsound" =~ ^[yY]$ ]] ; then
+  tmpfn=`mktemp`
+  bfn=`basename $tmpfn`
+
+  echo "  Saving 'modules' to /root/$bfn"
+  sudo cp /etc/modules $tmpfn
+  sudo mv $tmpfn /root/$bfn
+
+  sudo sed -i 's;^snd-bcm2835;#snd-bcm2835;g' /etc/modules
+
+  echo '  adding> snd-bcm2835'
+  sudo bash -c 'echo "snd-bcm2835" >> /etc/modules'
+
+fi
+
+##### Setup kiosk
+#####
+
+echo -n "Setup kiosk service? [Y/n]: "
+read setupkiosk
+
+if [[ "$setupkiosk" =~ ^[yY]?$ ]] ; then
+
+  echo "  /home/bus/popufare/busunit/scripts/kiosk.service -> /lib/systemd/system/kiosk.service"
+  sudo cp /home/bus/popufare/busunit/scripts/kiosk.service /lib/systemd/system/kiosk.service
+
+  echo "  enabling kiosk.service ('systemctl enable kiosk.service')"
+  sudo systemctl enable kiosk.service
+
+fi
+
+echo ""
+
+
+##### Setup startup
+#####
+
+echo -n "Setup startup 'rc.local'? [Y/n]: "
+read setupstartup
+
+if [[ "$setupstartup" =~ ^[yY]?$ ]] ; then
+
+  tmpfn=`mktemp`
+  bfn=`basename $tmpfn`
+
+  echo "  saving /etc/rc.local to /root/$bfn"
+  sudo cp /etc/rc.local $tmpfn
+  sudo mv $tmpfn /root/$bfn
+
+
+  echo "  /home/bus/popufare/busunit/scripts/rc.local -> /etc/rc.local"
+  sudo cp /home/bus/popufare/busunit/scripts/rc.local /etc/rc.local
+
+fi
+
+echo ""
+
+
+##### setup legacy data directories
+#####
+
+echo -n "Setup legacy data directories? [y/N]: "
+read setuplegacy
+
+if [[ "$setuplegacy" =~ ^[yY]$ ]] ; then
+  sudo mkdir -p /mnt/data
+  sudo mkdir -p /mnt/data2
+
+  sudo chown -R bus:bus /mnt/data
+  sudo chown -R bus:bus /mnt/data2
+fi
+
+#####
+#####
+
+
+
+##### final permissions setup
+#####
+
+echo "Setting up final permission for /home/bus/(bin|database|config)"
+
+sudo chown -R bus:bus /home/bus/bin
+sudo chown -R bus:bus /home/bus/database
+sudo chown -R bus:bus /home/bus/config
+
+echo ""
+
+
+if [[ "$tmpdir" != '' ]] ; then
+  echo "... should remove $tmpdir"
+  #rm -rf  $tmdpri
+fi
+
+echo "done"