deploy-busunit-interactive 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. #!/bin/bash
  2. #
  3. # Copyright (c) 2019 Clementine Computing LLC.
  4. #
  5. # This file is part of PopuFare.
  6. #
  7. # PopuFare is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # PopuFare is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU Affero General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Affero General Public License
  18. # along with PopuFare. If not, see <https://www.gnu.org/licenses/>.
  19. #
  20. GITURL="https://tree.clementinecomputing.com/clementinecomputing/popufare"
  21. echo ""
  22. echo ' _____ __ '
  23. echo ' | __ \ / _| '
  24. echo ' | |__) |__ _ __ _ _| |_ __ _ _ __ ___ '
  25. echo ' | ___/ _ \| '"'"'_ \| | | | _/ _` | '"'"'__/ _ \'
  26. echo ' | | | (_) | |_) | |_| | || (_| | | | __/'
  27. echo ' |_| \___/| .__/ \__,_|_| \__,_|_| \___|'
  28. echo ' | | '
  29. echo ' |_| '
  30. echo ""
  31. echo "This script attempts to setup a default installation of Popufare on a busunit (a Raspberry Pi, say)"
  32. echo "by setting up and configuring the system."
  33. echo ""
  34. echo "THIS SCRIPT CHANGES SYSTEM WIDE PARAMETERS AND COULD HAVE SERIOUS CONSEQUENCES TO THE MACHINE IT'S RUN"
  35. echo "ON."
  36. echo ""
  37. echo "As such, this scripts needs root access (via sudo)."
  38. echo "This script is meant to be a 'helper' script and isn't meant to be all encompassing. Among other things,"
  39. echo "this script will:"
  40. echo ""
  41. echo " * setup a 'bus' user and group"
  42. echo " * add the 'pi' user to the 'bus' group"
  43. echo " * clone the Popufare repo, build it's binaries and install them in the '/home/bus' user directory"
  44. echo " * copy over appropriate config files to the appropriate locations in the '/hom/ebus' user directory"
  45. echo " * setup ssh keys and credentials"
  46. echo " * setup the PPP config files"
  47. echo " * alter /boot/config.txt and /etc/modules to enable serial and sound setup"
  48. echo " * setup a 'kiosk' service for the front end DIU"
  49. echo " * setup 'rc.local' to start and monitor bus Popufare services on startup"
  50. echo " * setup legacy data directories in '/mnt/data2'"
  51. echo ""
  52. echo "Most parameters have options to prompt the user for installation."
  53. echo ""
  54. echo "This script should be used with caution and as a helper for an installation rather than a 'turn key' soluation."
  55. echo "For example, the ssh keys default to the UNSECURE 'snakeoil' default keys provided the repo for easy setup and"
  56. echo "MUST BE CHANGED for a production installation."
  57. echo ""
  58. echo "In addition, the host and other config file options should be set on a per installation basis, as should the custom"
  59. echo "DIU interface, rules, drivers.txt entries, etc."
  60. echo ""
  61. echo "This script should help in getting a Raspberry Pi ready for use with Popufare but should be thought of also as a"
  62. echo "record of what relevant files there are to change and where to look."
  63. echo ""
  64. echo "As Popufare matures, this installation script or something similar can accomodate a more seamless installation but"
  65. echo "this is what is provided now."
  66. echo ""
  67. echo "Popufare is free software so please feel free to contribute at:"
  68. echo ""
  69. echo " https://tree.clementinecomputing.com/clementinecomputing/popufare"
  70. echo ""
  71. echo -n "Hit return to continue [ok]: "
  72. read hitreturn
  73. ###### basic sanity checks to make sure we're installing on a Raspberry Pi
  74. ######
  75. if [[ ! -e /etc/os-release ]] ; then
  76. 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]: "
  77. read fnfok
  78. if [[ ! "$fnfok" =~ ^[yY]$ ]] ; then
  79. echo "cancelling installalation"
  80. echo ""
  81. exit
  82. else
  83. echo "ok, continuing installation..."
  84. fi
  85. else
  86. grep -P '^PRETTY_NAME="Raspbian' /etc/os-release 2>&1 > /dev/null
  87. r=$?
  88. if [[ $r != 0 ]] ; then
  89. echo -n "Raspbian not detected in '/etc/os-release'. This might not be Raspberry Pi. Continue with installation? [y/N]: "
  90. read okcontinue
  91. if [[ ! "$okcontinue" =~ ^[yY]$ ]] ; then
  92. echo "cancelling installation"
  93. echo ""
  94. exit
  95. else
  96. echo "ok, continuing installation..."
  97. fi
  98. fi
  99. fi
  100. echo ""
  101. ######
  102. ######
  103. echo -n "Create 'bus' user? [Y/n]: "
  104. read createbususer
  105. if [[ "$createbususer" =~ ^[yY]?$ ]]; then
  106. echo "... creating 'bus' user and group"
  107. sudo adduser bus
  108. sudo usermod -a -G dialout bus
  109. fi
  110. echo ""
  111. echo -n "Add 'pi' to 'bus' group? [Y/n]: "
  112. read addpibus
  113. if [[ "$addpibus" =~ ^[yY]$ ]]; then
  114. echo "... add 'pi' to 'bus' group"
  115. sudo usermod -a -G bus pi
  116. fi
  117. echo ""
  118. echo "Creating /home/bus/(bin|database|config) with group write permissions"
  119. sudo mkdir -p /home/bus/bin
  120. sudo mkdir -p /home/bus/database
  121. sudo mkdir -p /home/bus/config
  122. sudo chown -R bus:bus /home/bus/bin
  123. sudo chown -R bus:bus /home/bus/database
  124. sudo chown -R bus:bus /home/bus/config
  125. sudo chmod -R g+w /home/bus/bin
  126. sudo chmod -R g+w /home/bus/database
  127. sudo chmod -R g+w /home/bus/config
  128. echo ""
  129. echo -n "Repo path (hit return to automatically clone the repo and use that) []: "
  130. read repolocation
  131. tmpdir=""
  132. if [[ "$repolocation" == "" ]] ; then
  133. tmpdir=`mktemp -d`
  134. repolocation="$tmpdir/popufare"
  135. pushd $tmpdir
  136. git clone "$GITURL"
  137. popd
  138. fi
  139. echo "Setting up binaries..."
  140. bd=/home/bus/popufare/busunit
  141. d=/home/bus/popufare/busunit/bin/native
  142. diudir=/home/bus/popufare/busunit/DIUv2
  143. tc=/home/bus/popufare/busunit/testing/config
  144. sudo cp -R $repolocation /home/bus
  145. sudo chown -R bus:bus /home/bus/popufare
  146. sudo bash -c " su - bus -c ' cd /home/bus/popufare/busunit ; ./build_all.sh native ; ' "
  147. sudo bash -c " cd /home/bus/bin ; ln -sf $d/avls . ; ln -sf $d/billdb . ; ln -sf $d/client_supervisor . ; ln -sf $d/debug_client . ; ln -sf $d/diu_minder . ; ln -sf $d/ipc_server . "
  148. sudo bash -c " cd /home/bus/bin ; ln -sf $d/paddlemgr . ; ln -sf $d/passdb . ; ln -sf $d/piu_minder . ; ln -sf $d/send_billing_record . ; ln -sf $d/send_magstripe . "
  149. sudo bash -c " cd /home/bus/bin ; ln -sf $d/gps_minder . "
  150. sudo bash -c " cd /home/bus/bin ; ln -sf $bd/DIUv2/diu_kiosk . "
  151. sudo bash -c " cd /home/bus/bin ; ln -sf $bd/scripts/init_bus.sh . ; ln -sf $bd/scripts/update_loop.sh . ; ln -sf $bd/scripts/setup-serial.py . ; ln -sf $bd/scripts/get_net_ids.sh . "
  152. sudo bash -c " cd /home/bus/bin ; ln -sf $bd/scripts/connection_tether.sh . ; ln -sf $bd/scripts/reset-gps.py ./reset-gps "
  153. sudo bash -c " cd /home/bus/bin ; ln -sf $bd/scripts/apply_update.sh . ; ln -sf $bd/scripts/apply_update_legacy.sh . ; ln -sf $bd/scripts/apply_update_popufare.sh "
  154. sudo bash -c " cd /home/bus/bin ; ln -sf $bd/scripts/fix_pkg_perm.sh . "
  155. sudo bash -c " cd /home/bus/config ; ln -sf $diudir/html . ; "
  156. sudo bash -c " cd /home/bus/config ; cp $bd/passdb/init.scm . ; cp $bd/passdb/rfid_patterns.txt . ; cp $bd/avls/avls_freq.txt . "
  157. sudo bash -c " cd /home/bus/config ; cp $bd/passdb/init.scm . ; cp $bd/passdb/rfid_patterns.txt . ; cp $bd/avls/avls_freq.txt . "
  158. sudo bash -c " cd /home/bus/config ; cp $tc/equipnum.txt . ; cp $tc/serial.txt serial_num "
  159. sudo bash -c " rm -f /home/bus/bin/common_values.sh ; cp $bd/scripts/common_values.sh /home/bus/bin "
  160. ## server endpoint config files
  161. ##
  162. ## sync_server_desc, sync_target, server_list, syn_port
  163. sudo cp /home/bus/popufare/busunit/testing/config/config.tgz.checksum /home/bus/config/config.tgz.checksum
  164. sudo cp /home/bus/popufare/busunit/testing/config/config.tgz.version /home/bus/config/config.tgz.version
  165. sudo cp /home/bus/popufare/busunit/testing/config/firmware.tgz.checksum /home/bus/config/firmware.tgz.checksum
  166. sudo cp /home/bus/popufare/busunit/testing/config/firmware.tgz.version /home/bus/config/firmware.tgz.version
  167. sudo cp /home/bus/popufare/busunit/testing/config/package.tgz.checksum /home/bus/config/package.tgz.checksum
  168. sudo cp /home/bus/popufare/busunit/testing/config/package.tgz.version /home/bus/config/package.tgz.version
  169. sudo mkdir -p /home/bus/config/server
  170. echo ""
  171. ##### paddle setup
  172. #####
  173. echo -n "Setup paddles? [Y/n]: "
  174. read setuppaddles
  175. if [[ "$setuppaddles" =~ ^[yY]?$ ]] ; then
  176. echo -n "Paddle location? (blank for default testing paddles) []: "
  177. read paddlocation
  178. if [[ "$paddlelocation" == "" ]] ; then
  179. paddlelocation=$bd/busunit/testing
  180. fi
  181. echo "Using '$paddlelocation/*.paddle'..."
  182. sudo bash -c " cd /home/bus/config ; cp $bd/testing/*.paddle . "
  183. fi
  184. echo ""
  185. ##### rules setup
  186. #####
  187. echo -n "Setup rules? [Y/n]: "
  188. read setuprules
  189. if [[ "$setuprules" =~ ^[yY]?$ ]] ; then
  190. echo -n "Rule file? (blank for default testing rules) []: "
  191. read rulelocation
  192. if [[ "$rulelocation" == "" ]] ; then
  193. rulelocation=$bd/testing/rules-ORG.scm
  194. fi
  195. echo "Setting up rules from '$rulelocation'..."
  196. sudo bash -c " cd /home/bus/config ; cp $rulelocation rules.scm "
  197. fi
  198. echo ""
  199. ##### equipment number setup
  200. #####
  201. echo -n "Equipment number? [9999]: "
  202. read equipnum
  203. if [[ "$equipnum" == "" ]] ; then
  204. equipnum=9999
  205. fi
  206. echo "Setting equipment number to '$equipnum'..."
  207. sudo bash -c " echo $equipnum > /home/bus/config/equipnum.txt "
  208. echo ""
  209. ##### key setup
  210. #####
  211. echo -n "Setup secure communcation setup? [Y/n]: "
  212. read tunnelsetup
  213. if [[ "$tunnelsetup" =~ ^[yY]?$ ]] ; then
  214. echo -n " 'id_rsa' private key location? (default to snakeoil) []: "
  215. read keylocation
  216. if [[ "$keylocation" == "" ]] ; then
  217. keylocation=/home/bus/popufare/server/docker/snakeoil_id_rsa
  218. fi
  219. echo " Using '$keylocation' for private key..."
  220. sudo mkdir -p /home/bus/.ssh
  221. sudo chown -R bus:bus /home/bus/.ssh
  222. sudo cp $keylocation /home/bus/.ssh/id_rsa_bus
  223. sudo chown bus:bus /home/bus/.ssh/id_rsa_bus
  224. sudo chmod 400 /home/bus/.ssh/id_rsa_bus
  225. echo ""
  226. echo -n " Tunnel port? [6055]: "
  227. read tunnelport
  228. if [[ "$tunnelport" == "" ]] ; then
  229. tunnelport=6055
  230. fi
  231. echo ""
  232. echo -n " Tunnel user and host? [bus@example.com]: "
  233. read tunnelhost
  234. if [[ "$tunnelhost" == "" ]] ; then
  235. tunnelhost='bus@example.com'
  236. fi
  237. echo ""
  238. echo -n " Adding values to '/home/bus/bin/common_values.sh'..."
  239. sed -i 's;^SSH_DEFAULT_TARGET=;#SSH_DEFAULT_TARGET=;g' /home/bus/bin/common_values.sh
  240. sed -i 's;^SSH_DEFAULT_PORT=;#SSH_DEFAULT_PORT=;g' /home/bus/bin/common_values.sh
  241. sed -i 's;^SSH_DEFAULT_IDENTITY=;#SSH_DEFAULT_IDENTITY=;g' /home/bus/bin/common_values.sh
  242. sed -i 's;^SSH_TARGET=;#SSH_TARGET=;g' /home/bus/bin/common_values.sh
  243. sed -i 's;^SSH_PORT=;#SSH_PORT=;g' /home/bus/bin/common_values.sh
  244. sed -i 's;^SSH_IDENTITY=;#SSH_IDENTITY=;g' /home/bus/bin/common_values.sh
  245. echo 'SSH_DEFAULT_TARGET="'"$tunnelhost"'"' >> /home/bus/bin/common_values.sh
  246. echo 'SSH_DEFAULT_PORT="'"$tunnelport"'"' >> /home/bus/bin/common_values.sh
  247. echo 'SSH_DEFAULT_IDENTITY="/home/bus/.ssh/id_rsa_bus"' >> /home/bus/bin/common_values.sh
  248. echo '' >> /home/bus/bin/common_values.sh
  249. echo 'SSH_TARGET="$SSH_DEFAULT_TARGET"' >> /home/bus/bin/common_values.sh
  250. echo 'SSH_PORT="$SSH_DEFAULT_PORT"' >> /home/bus/bin/common_values.sh
  251. echo 'SSH_IDENTITY="$SSH_DEFAULT_IDENTITY"' >> /home/bus/bin/common_values.sh
  252. echo ""
  253. fi
  254. echo ""
  255. ##### drivers setup
  256. #####
  257. echo -n "'drivers.txt' location? (default to test) []: "
  258. read driverlocation
  259. if [[ "$driverlocation" == "" ]] ; then
  260. driverlocation=/home/bus/popufare/busunit/DIUv2/drivers.txt
  261. fi
  262. echo "Using '$driverlocation' for drivers.txt ..."
  263. sudo cp $driverlocation /home/bus/config
  264. echo ""
  265. ##### setup fona ppp
  266. #####
  267. echo -n "Setup FONA ppp files? [Y/n]: "
  268. read setupfona
  269. if [[ "$setupfona" =~ ^[yY]?$ ]] ; then
  270. echo " /home/bus/popufare/busunit/ppp-dialer/etc/ppp/peers/fona -> /etc/ppp/peers/gprs"
  271. echo " /home/bus/popufare/busunit/ppp-dialer/etc/chatscripts/gprs -> /etc/chatscripts/gprs"
  272. sudo cp /home/bus/popufare/busunit/ppp-dialer/etc/ppp/peers/fona /etc/ppp/peers/gprs
  273. sudo cp /home/bus/popufare/busunit/ppp-dialer/etc/chatscripts/gprs /etc/chatscripts/gprs
  274. echo ""
  275. fi
  276. #echo -n "Setup FONA to connect at startup? [Y/n]: "
  277. #read fonanetwork
  278. #
  279. #if [[ "$fonanetwork" =~ ^[yY]?$ ]] ; then
  280. # echo " Creating '/etc/network/interfaces.d/fona'..."
  281. # sudo echo 'auto fona' > /etc/network/interfaces.d/fona
  282. # sudo echo 'iface fona inet ppp' >> /etc/network/interfaces.d/fona
  283. # sudo echo ' provider fona' >> /etc/network/interfaces.d/fona
  284. #fi
  285. ##### Setup config.txt
  286. #####
  287. echo -n "Setup '/boot/config.txt'? (Note this could have serious consequences, use with caution) [y/N]: "
  288. read setupconfig
  289. if [[ "$setupconfig" =~ ^[yY]$ ]] ; then
  290. tmpfn=`mktemp`
  291. bfn=`basename $tmpfn`
  292. echo " Saving 'config.txt' to /root/$bfn"
  293. sudo cp /boot/config.txt $tmpfn
  294. sudo mv $tmpfn /root/$bfn
  295. echo " adding> enable_uart=1"
  296. sudo sed -i 's;^enable_uart=;#enable_uart=;g' /boot/config.txt
  297. sudo bash -c 'echo "enable_uart=1" >> /boot/config.txt'
  298. echo " adding> dtoverlay=pi3-disable-bt"
  299. sudo sed -i 's;^dtoverlay=pi3-disable-bt;#dtoverlay=pi3-disable-bt;g' /boot/config.txt
  300. sudo bash -c 'echo "dtoverlay=pi3-disable-bt" >> /boot/config.txt'
  301. echo " adding> dtoverlay=pi3-disable-wifi"
  302. sudo sed -i 's;^dtoverlay=pi3-disable-wifi;#dtoverlay=pi3-disable-wifi;g' /boot/config.txt
  303. sudo bash -c 'echo "dtoverlay=pi3-disable-wifi" >> /boot/config.txt'
  304. fi
  305. echo ""
  306. ##### Setup sound in modules file
  307. #####
  308. echo -n "Setup sound (alter '/etc/modules')? [y/N]: "
  309. read setupsound
  310. if [[ "$setupsound" =~ ^[yY]$ ]] ; then
  311. tmpfn=`mktemp`
  312. bfn=`basename $tmpfn`
  313. echo " Saving 'modules' to /root/$bfn"
  314. sudo cp /etc/modules $tmpfn
  315. sudo mv $tmpfn /root/$bfn
  316. sudo sed -i 's;^snd-bcm2835;#snd-bcm2835;g' /etc/modules
  317. echo ' adding> snd-bcm2835'
  318. sudo bash -c 'echo "snd-bcm2835" >> /etc/modules'
  319. # disabled for now. Force audio to go through 3.5mm jack from 'raspi-config'.
  320. #
  321. # ...
  322. # trying to mitigate the 'first two seconds cutoff of audio' problem
  323. # https://github.com/alexa-pi/AlexaPi/wiki/Devices#raspberry-pi
  324. #
  325. #tfn=`mktemp`
  326. #echo '@reboot vcgencmd force_audio hdmi 1' > $tfn
  327. #echo "adding `cat $tfn`"
  328. #sudo crontab $tfn
  329. #rm $tfn
  330. fi
  331. ##### Setup kiosk
  332. #####
  333. echo -n "Setup kiosk service? [Y/n]: "
  334. read setupkiosk
  335. if [[ "$setupkiosk" =~ ^[yY]?$ ]] ; then
  336. echo " /home/bus/popufare/busunit/scripts/kiosk.service -> /lib/systemd/system/kiosk.service"
  337. sudo cp /home/bus/popufare/busunit/scripts/kiosk.service /lib/systemd/system/kiosk.service
  338. echo " enabling kiosk.service ('systemctl enable kiosk.service')"
  339. sudo systemctl enable kiosk.service
  340. fi
  341. echo ""
  342. ##### Setup startup
  343. #####
  344. echo -n "Setup startup 'rc.local'? [Y/n]: "
  345. read setupstartup
  346. if [[ "$setupstartup" =~ ^[yY]?$ ]] ; then
  347. tmpfn=`mktemp`
  348. bfn=`basename $tmpfn`
  349. echo " saving /etc/rc.local to /root/$bfn"
  350. sudo cp /etc/rc.local $tmpfn
  351. sudo mv $tmpfn /root/$bfn
  352. echo " /home/bus/popufare/busunit/scripts/rc.local -> /etc/rc.local"
  353. sudo cp /home/bus/popufare/busunit/scripts/rc.local /etc/rc.local
  354. fi
  355. echo ""
  356. ##### setup legacy data directories
  357. #####
  358. echo -n "Setup legacy data directories? [y/N]: "
  359. read setuplegacy
  360. if [[ "$setuplegacy" =~ ^[yY]$ ]] ; then
  361. sudo mkdir -p /mnt/data
  362. sudo mkdir -p /mnt/data2
  363. sudo chown -R bus:bus /mnt/data
  364. sudo chown -R bus:bus /mnt/data2
  365. fi
  366. #####
  367. #####
  368. ##### final permissions setup
  369. #####
  370. echo "Setting up final permission for /home/bus/(bin|database|config)"
  371. sudo chown -R bus:bus /home/bus/bin
  372. sudo chown -R bus:bus /home/bus/database
  373. sudo chown -R bus:bus /home/bus/config
  374. echo ""
  375. if [[ "$tmpdir" != '' ]] ; then
  376. echo "... should remove $tmpdir"
  377. #rm -rf $tmdpri
  378. fi
  379. echo "done"