freedombone-config 34KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. #!/bin/bash
  2. # _____ _ _
  3. # | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
  4. # | __| _| -_| -_| . | . | | . | . | | -_|
  5. # |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|
  6. #
  7. # Freedom in the Cloud
  8. #
  9. # Interactively creates a configuration file for use with the main
  10. # freedombone command
  11. #
  12. # License
  13. # =======
  14. #
  15. # Copyright (C) 2015-2018 Bob Mottram <bob@freedombone.net>
  16. #
  17. # This program is free software: you can redistribute it and/or modify
  18. # it under the terms of the GNU Affero General Public License as published by
  19. # the Free Software Foundation, either version 3 of the License, or
  20. # (at your option) any later version.
  21. #
  22. # This program is distributed in the hope that it will be useful,
  23. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  25. # GNU Affero General Public License for more details.
  26. #
  27. # You should have received a copy of the GNU Affero General Public License
  28. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  29. NO_OF_ARGS=$#
  30. PROJECT_NAME='freedombone'
  31. # username created by default within a debian image
  32. GENERIC_IMAGE_USERNAME='fbone'
  33. export TEXTDOMAIN=${PROJECT_NAME}-config
  34. export TEXTDOMAINDIR="/usr/share/locale"
  35. # Web site
  36. FREEDOMBONE_WEBSITE="https://freedombone.net or http://yjxlc3imv7obva4grjae6u3qw527koaytrgjgdp364hmthrst3jodiid.onion"
  37. # Minimum number of characters in a password
  38. MINIMUM_PASSWORD_LENGTH=$(grep 'MINIMUM_PASSWORD_LENGTH=' "/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-passwords" | head -n 1 | awk -F '=' '{print $2}')
  39. # file containing new password
  40. IMAGE_PASSWORD_FILE=/root/login.txt
  41. MY_USERNAME=
  42. DEFAULT_DOMAIN_NAME=
  43. DEFAULT_DOMAIN_CODE=
  44. MY_EMAIL_ADDRESS=
  45. SYSTEM_TYPE='full'
  46. INSTALLING_ON_BBB="no"
  47. DDNS_PROVIDER=
  48. DDNS_USERNAME=
  49. DDNS_PASSWORD=
  50. MY_NAME=
  51. LOCAL_NETWORK_STATIC_IP_ADDRESS=
  52. ROUTER_IP_ADDRESS=
  53. ENABLE_BATMAN=
  54. DEBIAN_REPO=
  55. NAMESERVER1=
  56. NAMESERVER2=
  57. DOKUWIKI_TITLE=
  58. DOKUWIKI_DOMAIN_NAME=
  59. DOKUWIKI_CODE=
  60. HTMLY_TITLE=
  61. HTMLY_DOMAIN_NAME=
  62. HTMLY_CODE=
  63. HUBZILLA_DOMAIN_NAME=
  64. HUBZILLA_CODE=
  65. GNUSOCIAL_DOMAIN_NAME=
  66. GNUSOCIAL_CODE=
  67. GNUSOCIAL_WELCOME_MESSAGE=$"<h1>Welcome to \$GNUSOCIAL_DOMAIN_NAME a federated social network</h1><p>Another $PROJECT_NAME site</p>"
  68. GNUSOCIAL_BACKGROUND_IMAGE_URL=
  69. GIT_DOMAIN_NAME=
  70. GIT_CODE=
  71. USB_DRIVE=/dev/sdb1
  72. HWRNG_TYPE=
  73. ENABLE_SOCIAL_KEY_MANAGEMENT=
  74. WIFI_INTERFACE=wlan0
  75. WIFI_TYPE='wpa2-psk'
  76. WIFI_SSID=
  77. WIFI_PASSPHRASE=
  78. WIFI_HOTSPOT=
  79. WIFI_NETWORKS_FILE=~/${PROJECT_NAME}-wifi.cfg
  80. BATMAN_CELLID='any'
  81. WIFI_CHANNEL=
  82. CONFIGURATION_FILE=
  83. DH_KEYLENGTH=
  84. MINIMAL_INSTALL="yes"
  85. DEFAULT_LANGUAGE='en_GB.UTF-8'
  86. ONION_ONLY="no"
  87. SELECTED_USERNAME=
  88. SOCIALINSTANCE=
  89. VALID_CODE=
  90. PROJECT_INSTALL_DIR=/usr/local/bin
  91. if [ -f /usr/bin/${PROJECT_NAME} ]; then
  92. PROJECT_INSTALL_DIR=/usr/bin
  93. fi
  94. function please_wait {
  95. local str width height length
  96. width=$(tput cols)
  97. height=$(tput lines)
  98. str=$"Please wait"
  99. length=${#str}
  100. clear
  101. tput cup $((height / 2)) $(((width / 2) - (length / 2)))
  102. echo "$str"
  103. tput cup $((height * 3 / 5)) $(((width / 2)))
  104. echo -n ''
  105. }
  106. source "$PROJECT_INSTALL_DIR/${PROJECT_NAME}-vars"
  107. UTILS_FILES="/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-*"
  108. for f in $UTILS_FILES
  109. do
  110. source "$f"
  111. done
  112. APP_FILES="/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-*"
  113. for f in $APP_FILES
  114. do
  115. source "$f"
  116. done
  117. function show_help {
  118. echo ''
  119. echo $"${PROJECT_NAME}-config -f [config filename] -m [min password length]"
  120. echo ''
  121. echo $'Creates an inventory of remote backup locations'
  122. echo ''
  123. echo ''
  124. echo $' -h --help Show help'
  125. echo $" -f --filename Configuration file (usually ${PROJECT_NAME}.cfg)"
  126. echo $' -m --min Minimum password length (characters)'
  127. echo $' -w --www Freedombone web site'
  128. echo $' -o --onion [yes|no] Whether to only create .onion sites'
  129. echo $' --minimal [yes|no] For minimalistic "consumer grade" installs'
  130. echo $' --social [gnusocial|postactiv] Create gnusocial/postactiv instance'
  131. echo ''
  132. exit 0
  133. }
  134. function choose_email_address {
  135. if [[ $ONION_ONLY != "no" ]]; then
  136. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  137. else
  138. while [ ${#MY_EMAIL_ADDRESS} -lt 5 ]
  139. do
  140. EMAIL_ADDRESS=$(grep 'MY_EMAIL_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
  141. if [ ! "$EMAIL_ADDRESS" ]; then
  142. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  143. fi
  144. if [ ${#MY_EMAIL_ADDRESS} -lt 5 ]; then
  145. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  146. fi
  147. data=$(mktemp 2>/dev/null)
  148. dialog --backtitle $"Freedombone Configuration" \
  149. --inputbox $"Your email address" 10 30 "$EMAIL_ADDRESS" 2> "$data"
  150. sel=$?
  151. case $sel in
  152. 0) MY_EMAIL_ADDRESS=$(cat "$data");;
  153. 1) rm -f "$data"
  154. exit 1;;
  155. 255) rm -f "$data"
  156. exit 1;;
  157. esac
  158. rm -f "$data"
  159. done
  160. fi
  161. save_configuration_values
  162. }
  163. function choose_social_instance_domain_name {
  164. DEFAULT_DOMAIN_DETAILS_COMPLETE=
  165. while [ ! $DEFAULT_DOMAIN_DETAILS_COMPLETE ]
  166. do
  167. data=$(mktemp 2>/dev/null)
  168. if [[ "$DDNS_PROVIDER" == *"freedns"* ]]; then
  169. dialog --backtitle $"Freedombone Configuration" \
  170. --title $"Instance domain" \
  171. --form $"\\nEnter your instance domain name and its FreeDNS code:" 11 55 3 \
  172. $"Domain:" 1 1 "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 24 33 40 \
  173. $"Code:" 2 1 "$(grep 'DEFAULT_DOMAIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 24 33 255 \
  174. 2> "$data"
  175. sel=$?
  176. case $sel in
  177. 1) rm -f "$data"
  178. exit 1;;
  179. 255) rm -f "$data"
  180. exit 1;;
  181. esac
  182. DEFAULT_DOMAIN_NAME=$(sed -n 1p < "$data")
  183. DEFAULT_DOMAIN_CODE=$(sed -n 2p < "$data")
  184. if [ "$DEFAULT_DOMAIN_NAME" ]; then
  185. validate_freedns_code "$DEFAULT_DOMAIN_CODE"
  186. if [ ! $VALID_CODE ]; then
  187. DEFAULT_DOMAIN_NAME=
  188. fi
  189. fi
  190. else
  191. dialog --backtitle $"Freedombone Configuration" \
  192. --inputbox $"Enter your instance domain name:" 10 45 \
  193. "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> "$data"
  194. sel=$?
  195. case $sel in
  196. 0) DEFAULT_DOMAIN_NAME=$(cat "$data");;
  197. 1) rm -f "$data"
  198. exit 1;;
  199. 255) rm -f "$data"
  200. exit 1;;
  201. esac
  202. fi
  203. if [ "$DEFAULT_DOMAIN_NAME" ]; then
  204. TEST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  205. validate_domain_name
  206. if [[ "$TEST_DOMAIN_NAME" != "$DEFAULT_DOMAIN_NAME" ]]; then
  207. DEFAULT_DOMAIN_NAME=
  208. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  209. else
  210. DEFAULT_DOMAIN_DETAILS_COMPLETE="yes"
  211. fi
  212. fi
  213. rm -f "$data"
  214. done
  215. save_configuration_values
  216. }
  217. function choose_default_domain_name {
  218. if [ $SOCIALINSTANCE ]; then
  219. choose_social_instance_domain_name
  220. return
  221. fi
  222. if [[ $ONION_ONLY != "no" ]]; then
  223. DEFAULT_DOMAIN_NAME="${LOCAL_NAME}.local"
  224. else
  225. DEFAULT_DOMAIN_DETAILS_COMPLETE=
  226. while [ ! $DEFAULT_DOMAIN_DETAILS_COMPLETE ]
  227. do
  228. data=$(mktemp 2>/dev/null)
  229. if [[ "$DDNS_PROVIDER" == *"freedns"* ]]; then
  230. dialog --backtitle $"Freedombone Configuration" \
  231. --title $"Your main domain name on FreeDNS" \
  232. --form $"\nWhich domain name should your email/XMPP/IRC/Mumble be associated with?" 13 55 5 \
  233. $"Domain:" 1 1 "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 24 33 40 \
  234. $"Code:" 2 1 "$(grep 'DEFAULT_DOMAIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 24 33 255 \
  235. $"mail subdomain Code:" 3 1 "$(grep 'EMAIL_DOMAIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 3 24 33 255 \
  236. $"XMPP subdomain Code:" 4 1 "$(grep 'XMPP_DOMAIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 4 24 33 255 \
  237. 2> "$data"
  238. sel=$?
  239. case $sel in
  240. 1) rm -f "$data"
  241. exit 1;;
  242. 255) rm -f "$data"
  243. exit 1;;
  244. esac
  245. DEFAULT_DOMAIN_NAME=$(sed -n 1p < "$data")
  246. DEFAULT_DOMAIN_CODE=$(sed -n 2p < "$data")
  247. EMAIL_DOMAIN_CODE=$(sed -n 3p < "$data")
  248. XMPP_DOMAIN_CODE=$(sed -n 4p < "$data")
  249. rm -f "$data"
  250. if [ "$DEFAULT_DOMAIN_NAME" ]; then
  251. validate_freedns_code "$DEFAULT_DOMAIN_CODE"
  252. if [ ! $VALID_CODE ]; then
  253. DEFAULT_DOMAIN_NAME=
  254. fi
  255. fi
  256. if [ "$EMAIL_DOMAIN_CODE" ]; then
  257. validate_freedns_code "$EMAIL_DOMAIN_CODE"
  258. if [ ! $VALID_CODE ]; then
  259. DEFAULT_DOMAIN_NAME=
  260. EMAIL_DOMAIN_CODE=
  261. else
  262. write_config_param "EMAIL_DOMAIN_CODE" "$EMAIL_DOMAIN_CODE"
  263. fi
  264. fi
  265. if [ "$XMPP_DOMAIN_CODE" ]; then
  266. validate_freedns_code "$XMPP_DOMAIN_CODE"
  267. if [ ! $VALID_CODE ]; then
  268. DEFAULT_DOMAIN_NAME=
  269. XMPP_DOMAIN_CODE=
  270. else
  271. write_config_param "XMPP_DOMAIN_CODE" "$XMPP_DOMAIN_CODE"
  272. fi
  273. fi
  274. else
  275. dialog --backtitle $"Freedombone Configuration" \
  276. --inputbox $"Which domain name should your email/XMPP/IRC/Mumble be associated with?" 10 45 \
  277. "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> "$data"
  278. sel=$?
  279. case $sel in
  280. 0) DEFAULT_DOMAIN_NAME=$(cat "$data");;
  281. 1) rm -f "$data"
  282. exit 1;;
  283. 255) rm -f "$data"
  284. exit 1;;
  285. esac
  286. fi
  287. if [ "$DEFAULT_DOMAIN_NAME" ]; then
  288. TEST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  289. validate_domain_name
  290. if [[ "$TEST_DOMAIN_NAME" != "$DEFAULT_DOMAIN_NAME" ]]; then
  291. DEFAULT_DOMAIN_NAME=
  292. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  293. else
  294. DEFAULT_DOMAIN_DETAILS_COMPLETE="yes"
  295. fi
  296. fi
  297. done
  298. fi
  299. save_configuration_values
  300. }
  301. function choose_debian_repo {
  302. if [[ "$MINIMAL_INSTALL" == "no" ]]; then
  303. W=(1 $"United Kingdom"
  304. 2 $"United States"
  305. 3 $"Australia"
  306. 4 $"Austria"
  307. 5 $"Belarus"
  308. 6 $"Belgium"
  309. 7 $"Bosnia and Herzegovina"
  310. 8 $"Brazil"
  311. 9 $"Bulgaria"
  312. 10 $"Canada"
  313. 11 $"Chile"
  314. 12 $"China"
  315. 13 $"Croatia"
  316. 14 $"Czech Republic"
  317. 15 $"Denmark"
  318. 16 $"El Salvador"
  319. 17 $"Estonia"
  320. 18 $"Finland"
  321. 19 $"France 1"
  322. 20 $"France 2"
  323. 21 $"Germany 1"
  324. 22 $"Germany 2"
  325. 23 $"Greece"
  326. 24 $"Hungary"
  327. 25 $"Iceland"
  328. 26 $"Iran"
  329. 27 $"Ireland"
  330. 28 $"Italy"
  331. 29 $"Japan"
  332. 30 $"Korea"
  333. 31 $"Lithuania"
  334. 32 $"Mexico"
  335. 33 $"Netherlands"
  336. 34 $"New Caledonia"
  337. 35 $"New Zealand"
  338. 36 $"Norway"
  339. 37 $"Poland"
  340. 38 $"Portugal"
  341. 39 $"Romania"
  342. 40 $"Russia"
  343. 41 $"Slovakia"
  344. 42 $"Slovenia"
  345. 43 $"Spain"
  346. 44 $"Sweden"
  347. 45 $"Switzerland"
  348. 46 $"Taiwan"
  349. 47 $"Thailand"
  350. 48 $"Turkey"
  351. 49 $"Ukraine")
  352. # shellcheck disable=SC2068
  353. selection=$(dialog --backtitle $"Freedombone Configuration" --title $"Debian Repo" --menu $"Where to download Debian packages from:" 24 60 49 "${W[@]}" 3>&2 2>&1 1>&3)
  354. if [ ! "$selection" ]; then
  355. selection='1'
  356. fi
  357. case $selection in
  358. 1) DEBIAN_REPO='ftp.uk.debian.org';;
  359. 2) DEBIAN_REPO='ftp.us.debian.org';;
  360. 3) DEBIAN_REPO='ftp.au.debian.org';;
  361. 4) DEBIAN_REPO='ftp.at.debian.org';;
  362. 5) DEBIAN_REPO='ftp.by.debian.org';;
  363. 6) DEBIAN_REPO='ftp.be.debian.org';;
  364. 7) DEBIAN_REPO='ftp.ba.debian.org';;
  365. 8) DEBIAN_REPO='ftp.br.debian.org';;
  366. 9) DEBIAN_REPO='ftp.bg.debian.org';;
  367. 10) DEBIAN_REPO='ftp.ca.debian.org';;
  368. 11) DEBIAN_REPO='ftp.cl.debian.org';;
  369. 12) DEBIAN_REPO='ftp.cn.debian.org';;
  370. 13) DEBIAN_REPO='ftp.hr.debian.org';;
  371. 14) DEBIAN_REPO='ftp.cz.debian.org';;
  372. 15) DEBIAN_REPO='ftp.dk.debian.org';;
  373. 16) DEBIAN_REPO='ftp.sv.debian.org';;
  374. 17) DEBIAN_REPO='ftp.ee.debian.org';;
  375. 18) DEBIAN_REPO='ftp.fi.debian.org';;
  376. 19) DEBIAN_REPO='ftp2.fr.debian.org';;
  377. 20) DEBIAN_REPO='ftp.fr.debian.org';;
  378. 21) DEBIAN_REPO='ftp2.de.debian.org';;
  379. 22) DEBIAN_REPO='ftp.de.debian.org';;
  380. 23) DEBIAN_REPO='ftp.gr.debian.org';;
  381. 24) DEBIAN_REPO='ftp.hu.debian.org';;
  382. 25) DEBIAN_REPO='ftp.is.debian.org';;
  383. 26) DEBIAN_REPO='ftp.ir.debian.org';;
  384. 27) DEBIAN_REPO='ftp.ie.debian.org';;
  385. 28) DEBIAN_REPO='ftp.it.debian.org';;
  386. 29) DEBIAN_REPO='ftp.jp.debian.org';;
  387. 30) DEBIAN_REPO='ftp.kr.debian.org';;
  388. 31) DEBIAN_REPO='ftp.lt.debian.org';;
  389. 32) DEBIAN_REPO='ftp.mx.debian.org';;
  390. 33) DEBIAN_REPO='ftp.nl.debian.org';;
  391. 34) DEBIAN_REPO='ftp.nc.debian.org';;
  392. 35) DEBIAN_REPO='ftp.nz.debian.org';;
  393. 36) DEBIAN_REPO='ftp.no.debian.org';;
  394. 37) DEBIAN_REPO='ftp.pl.debian.org';;
  395. 38) DEBIAN_REPO='ftp.pt.debian.org';;
  396. 39) DEBIAN_REPO='ftp.ro.debian.org';;
  397. 40) DEBIAN_REPO='ftp.ru.debian.org';;
  398. 41) DEBIAN_REPO='ftp.sk.debian.org';;
  399. 42) DEBIAN_REPO='ftp.si.debian.org';;
  400. 43) DEBIAN_REPO='ftp.es.debian.org';;
  401. 44) DEBIAN_REPO='ftp.se.debian.org';;
  402. 45) DEBIAN_REPO='ftp.ch.debian.org';;
  403. 46) DEBIAN_REPO='ftp.tw.debian.org';;
  404. 47) DEBIAN_REPO='ftp.th.debian.org';;
  405. 48) DEBIAN_REPO='ftp.tr.debian.org';;
  406. 49) DEBIAN_REPO='ftp.ua.debian.org';;
  407. esac
  408. save_configuration_values
  409. else
  410. # shellcheck disable=SC2034
  411. DEBIAN_REPO='ftp.de.debian.org'
  412. fi
  413. }
  414. function choose_rng {
  415. if [[ $MINIMAL_INSTALL == "no" ]]; then
  416. data=$(mktemp 2>/dev/null)
  417. if [[ "$INSTALLING_ON_BBB" != "yes" ]]; then
  418. dialog --backtitle $"Freedombone Configuration" \
  419. --radiolist $"Type of Random Number Generator:" 10 40 2 \
  420. 1 Haveged on \
  421. 2 OneRNG off 2> "$data"
  422. sel=$?
  423. case $sel in
  424. 1) rm -f "$data"
  425. exit 1;;
  426. 255) rm -f "$data"
  427. exit 1;;
  428. esac
  429. case $(cat "$data") in
  430. 2) HWRNG_TYPE="onerng"
  431. dialog --title $"OneRNG Device" \
  432. --msgbox $"Please ensure that the OneRNG device is disconnected. You can reconnect it later during the installation" 8 60
  433. ;;
  434. 255) rm -f "$data"
  435. exit 1;;
  436. esac
  437. else
  438. # shellcheck disable=SC2034
  439. HWRNG_TYPE="beaglebone"
  440. fi
  441. rm -f "$data"
  442. save_configuration_values
  443. fi
  444. }
  445. function choose_social_key_management {
  446. if [[ $MINIMAL_INSTALL == "no" ]]; then
  447. interactive_gpg
  448. SOCIAL_KEY_STR=$"\\nDo you wish to enable social key management, otherwise known as \"the unforgettable key\"?\\n\\nThis means that fragments of your GPG key will be included with any remote backups so that if you later lose your key then it can be reconstructed from your friends servers. If you select \"no\" then you can still do social key management, but offline using physical USB thumb drives, which is more secure but less convenient."
  449. if [[ $(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
  450. dialog --title $"Social Key Management" \
  451. --backtitle $"Freedombone Configuration" \
  452. --yesno "$SOCIAL_KEY_STR" 15 60
  453. else
  454. dialog --title $"Social Key Management" \
  455. --backtitle $"Freedombone Configuration" \
  456. --defaultno \
  457. --yesno "$SOCIAL_KEY_STR" 15 60
  458. fi
  459. sel=$?
  460. case $sel in
  461. 0) ENABLE_SOCIAL_KEY_MANAGEMENT="yes";;
  462. 255) exit 1;;
  463. esac
  464. save_configuration_values
  465. else
  466. # enable for the minimal case
  467. # shellcheck disable=SC2034
  468. ENABLE_SOCIAL_KEY_MANAGEMENT="yes"
  469. fi
  470. }
  471. function choose_username {
  472. if [ -d /home/$GENERIC_IMAGE_USERNAME ]; then
  473. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  474. echo 'Cannot find the password file for the admin user'
  475. exit 62753
  476. fi
  477. # when installing from an image which comes with a known default user account
  478. SELECTED_USERNAME=
  479. while [ ! $SELECTED_USERNAME ]
  480. do
  481. if [ ! $SELECTED_USERNAME ]; then
  482. SELECTED_USERNAME=$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')
  483. fi
  484. data=$(mktemp 2>/dev/null)
  485. dialog --backtitle $"Freedombone Configuration" \
  486. --title $"Username" \
  487. --inputbox $"Set your username for the system\\n\\nYour username should not contain any spaces" 12 60 "$SELECTED_USERNAME" 2> "$data"
  488. sel=$?
  489. case $sel in
  490. 0) possible_username=$(cat "$data")
  491. SELECTED_USERNAME=
  492. if [[ "$possible_username" != *' '* && "$possible_username" != *'/'* && "$possible_username" != *'*'* ]]; then
  493. if [ "$possible_username" ]; then
  494. if [ ${#possible_username} -gt 1 ]; then
  495. if [[ "$possible_username" != "$GENERIC_IMAGE_USERNAME" ]]; then
  496. MY_USERNAME=$(cat "$data")
  497. please_wait
  498. echo ''
  499. echo $'Creating user account'
  500. chmod 600 /etc/shadow
  501. chmod 600 /etc/gshadow
  502. useradd -m -s /bin/bash "$MY_USERNAME"
  503. chmod 0000 /etc/shadow
  504. chmod 0000 /etc/gshadow
  505. if [ -d "/home/$MY_USERNAME" ]; then
  506. echo "${MY_USERNAME}:$(printf "%s" "$(cat "$IMAGE_PASSWORD_FILE")")" | chpasswd
  507. # Add the user as a sudoer - they will be the new admin user
  508. if ! grep -q "$MY_USERNAME ALL=(ALL) ALL" /etc/sudoers; then
  509. echo "$MY_USERNAME ALL=(ALL) ALL" >> /etc/sudoers
  510. # remove the generic image admin user from sudoers
  511. sed -i "s|${GENERIC_IMAGE_USERNAME}.*||g" /etc/sudoers
  512. fi
  513. rm -f "$data"
  514. break
  515. fi
  516. fi
  517. fi
  518. fi
  519. fi
  520. ;;
  521. 1) rm -f "$data"
  522. exit 1;;
  523. 255) rm -f "$data"
  524. exit 1;;
  525. esac
  526. rm -f "$data"
  527. done
  528. else
  529. no_of_users=$(find /home/* -maxdepth 0 -type d | wc -l)
  530. if [ "$no_of_users" -eq 1 ]; then
  531. # only a single user on the system
  532. MY_USERNAME=$(ls /home)
  533. else
  534. # select one from a number of users
  535. select_user
  536. if [ ! $SELECTED_USERNAME ]; then
  537. echo $'No username selected'
  538. exit 72589
  539. fi
  540. MY_USERNAME="$SELECTED_USERNAME"
  541. fi
  542. fi
  543. if [ ! $MY_USERNAME ]; then
  544. echo $'No user account was selected'
  545. exit 64398
  546. fi
  547. if [[ $MY_USERNAME == '-f' ]]; then
  548. echo $'No user account was selected'
  549. exit 8347
  550. fi
  551. if [[ $MY_USERNAME == 'debian' || $MY_USERNAME == 'fbone' ]]; then
  552. echo $"Don't use the default user account"
  553. exit 9341
  554. fi
  555. if [ ! -d /home/$MY_USERNAME ]; then
  556. echo $"The directory /home/$MY_USERNAME does not exist"
  557. exit 6437
  558. fi
  559. save_configuration_values
  560. please_wait
  561. echo ''
  562. }
  563. function choose_full_name {
  564. valid_name=
  565. while [ ! $valid_name ]
  566. do
  567. data=$(mktemp 2>/dev/null)
  568. dialog --backtitle $"Freedombone Configuration" \
  569. --inputbox $"Your full name (or nick)" 10 50 "$(grep 'MY_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> "$data"
  570. sel=$?
  571. case $sel in
  572. 0) possible_name=$(cat "$data")
  573. if [ "$possible_name" ]; then
  574. if [ ${#possible_name} -gt 1 ]; then
  575. valid_name="$possible_name"
  576. # shellcheck disable=SC2034
  577. MY_NAME="$possible_name"
  578. break;
  579. fi
  580. fi
  581. ;;
  582. 1) rm -f "$data"
  583. exit 1;;
  584. 255) rm -f "$data"
  585. exit 1;;
  586. esac
  587. rm -f "$data"
  588. done
  589. save_configuration_values
  590. please_wait
  591. echo ''
  592. }
  593. function choose_system_variant {
  594. available_variants_list=()
  595. available_system_variants
  596. varslist=""
  597. n=1
  598. # shellcheck disable=SC2068
  599. for a in ${available_variants_list[@]}
  600. do
  601. varstate='off'
  602. if [[ "$a" == $'full' || "$a" == $'Full' ]]; then
  603. varstate='on'
  604. fi
  605. varslist="$varslist $n $a $varstate"
  606. n=$((n+1))
  607. done
  608. # shellcheck disable=SC2086
  609. variant_choice=$(dialog --stdout --backtitle $"Freedombone Configuration" \
  610. --title $"Type of Installation" \
  611. --radiolist $'Choose:' \
  612. 27 40 20 $varslist)
  613. # shellcheck disable=SC2181
  614. if [ $? -eq 0 ]; then
  615. variant_choice=$((variant_choice-1))
  616. SYSTEM_TYPE=${available_variants_list[$variant_choice]}
  617. save_configuration_values
  618. fi
  619. }
  620. function validate_freedns_code {
  621. freedns_code="$1"
  622. FREEDNS_MESSAGE=$"Please enter the FreeDNS code for this domain.\\n\\nThe code can be found by going to https://freedns.afraid.org, selecting 'Dynamic DNS' and then opening 'Wget example'. The code will consist of letters and numbers and be between the ? and = characters."
  623. if [[ "$freedns_code" == *"."* || "$freedns_code" == "http"* || "$freedns_code" == *"wget "* || "$freedns_code" == *" "* ]]; then
  624. dialog --title $"Invalid FreeDNS Code" --msgbox "$FREEDNS_MESSAGE" 10 70
  625. VALID_CODE=
  626. fi
  627. if [ ${#freedns_code} -lt 30 ]; then
  628. dialog --title $"Invalid FreeDNS Code" --msgbox $'FreeDNS code is too short. Did you enter the entire code?' 6 70
  629. VALID_CODE=
  630. fi
  631. VALID_CODE='yes'
  632. }
  633. # Get the commandline options
  634. while [ $# -gt 1 ]
  635. do
  636. key="$1"
  637. case $key in
  638. -h|--help)
  639. show_help
  640. ;;
  641. # Configuration filename
  642. -f|--filename)
  643. shift
  644. CONFIGURATION_FILE="$1"
  645. ;;
  646. # Minimum password length
  647. -m|--min)
  648. shift
  649. MINIMUM_PASSWORD_LENGTH="$1"
  650. ;;
  651. # Freedombone website
  652. -w|--www)
  653. shift
  654. FREEDOMBONE_WEBSITE="$1"
  655. ;;
  656. --social)
  657. shift
  658. if [[ "$1" == 'gnusocial' || "$1" == 'postactiv' ]]; then
  659. SOCIALINSTANCE="$1"
  660. fi
  661. ;;
  662. --minimal)
  663. shift
  664. MINIMAL_INSTALL="$1"
  665. ;;
  666. -o|--onion)
  667. shift
  668. ONION_ONLY="$1"
  669. ;;
  670. *)
  671. # unknown option
  672. ;;
  673. esac
  674. shift
  675. done
  676. function interactive_select_language {
  677. W=(1 $"English"
  678. 2 $"Afrikaans"
  679. 3 $"Albanian"
  680. 4 $"Arabic"
  681. 5 $"Basque"
  682. 6 $"Belarusian"
  683. 7 $"Bosnian"
  684. 8 $"Bulgarian"
  685. 9 $"Catalan"
  686. 10 $"Croatian"
  687. 11 $"Chinese (Simplified)"
  688. 12 $"Chinese (Traditional)"
  689. 13 $"Czech"
  690. 14 $"Danish"
  691. 15 $"Dutch"
  692. 16 $"English (US)"
  693. 17 $"Estonian"
  694. 18 $"Farsi"
  695. 19 $"Filipino"
  696. 20 $"Finnish"
  697. 21 $"French"
  698. 22 $"French (Canada)"
  699. 23 $"Gaelic"
  700. 24 $"Gallego"
  701. 25 $"Georgian"
  702. 26 $"German"
  703. 27 $"German (Personal)"
  704. 28 $"Greek"
  705. 29 $"Gujarati"
  706. 30 $"Hebrew"
  707. 31 $"Hindi"
  708. 32 $"Hungarian"
  709. 33 $"Icelandic"
  710. 34 $"Indonesian"
  711. 35 $"Italian"
  712. 36 $"Japanese"
  713. 37 $"Kannada"
  714. 38 $"Khmer"
  715. 39 $"Korean"
  716. 40 $"Lao"
  717. 41 $"Lithuanian"
  718. 42 $"Latvian"
  719. 43 $"Malayalam"
  720. 44 $"Malaysian"
  721. 45 $"Maori (Ngai Tahu)"
  722. 46 $"Maori (Waikoto Uni)"
  723. 47 $"Mongolian"
  724. 48 $"Norwegian"
  725. 49 $"Norwegian (Primary)"
  726. 50 $"Nynorsk"
  727. 51 $"Polish"
  728. 52 $"Portuguese"
  729. 53 $"Portuguese (Brazil)"
  730. 54 $"Romanian"
  731. 55 $"Russian"
  732. 56 $"Samoan"
  733. 57 $"Serbian"
  734. 58 $"Slovak"
  735. 59 $"Slovenian"
  736. 60 $"Somali"
  737. 61 $"Spanish (International)"
  738. 62 $"Swedish"
  739. 63 $"Tagalog"
  740. 64 $"Tamil"
  741. 65 $"Thai"
  742. 66 $"Turkish"
  743. 67 $"Ukrainian"
  744. 68 $"Vietnamese")
  745. # shellcheck disable=SC2068
  746. selection=$(dialog --backtitle $"Freedombone Configuration" --title $"Language" --menu $"Select your language:" 24 60 68 "${W[@]}" 3>&2 2>&1 1>&3)
  747. if [ ! "$selection" ]; then
  748. selection='1'
  749. fi
  750. case $selection in
  751. 1) DEFAULT_LANGUAGE='en_GB.UTF-8';;
  752. 2) DEFAULT_LANGUAGE='af_ZA.UTF-8';;
  753. 3) DEFAULT_LANGUAGE='sq_AL.UTF-8';;
  754. 4) DEFAULT_LANGUAGE='ar_SA.UTF-8';;
  755. 5) DEFAULT_LANGUAGE='eu_ES.UTF-8';;
  756. 6) DEFAULT_LANGUAGE='be_BY.UTF-8';;
  757. 7) DEFAULT_LANGUAGE='bs_BA.UTF-8';;
  758. 8) DEFAULT_LANGUAGE='bg_BG.UTF-8';;
  759. 9) DEFAULT_LANGUAGE='ca_ES.UTF-8';;
  760. 10) DEFAULT_LANGUAGE='hr_HR.UTF-8';;
  761. 11) DEFAULT_LANGUAGE='zh_CN.UTF-8';;
  762. 12) DEFAULT_LANGUAGE='zh_TW.UTF-8';;
  763. 13) DEFAULT_LANGUAGE='cs_CZ.UTF-8';;
  764. 14) DEFAULT_LANGUAGE='da_DK.UTF-8';;
  765. 15) DEFAULT_LANGUAGE='nl_NL.UTF-8';;
  766. 16) DEFAULT_LANGUAGE='en_US.UTF-8';;
  767. 17) DEFAULT_LANGUAGE='et_EE.UTF-8';;
  768. 18) DEFAULT_LANGUAGE='fa_IR.UTF-8';;
  769. 19) DEFAULT_LANGUAGE='ph_PH.UTF-8';;
  770. 20) DEFAULT_LANGUAGE='fi_FI.UTF-8';;
  771. 21) DEFAULT_LANGUAGE='fr_FR.UTF-8';;
  772. 22) DEFAULT_LANGUAGE='fr_CA.UTF-8';;
  773. 23) DEFAULT_LANGUAGE='ga.UTF-8';;
  774. 24) DEFAULT_LANGUAGE='l_ES.UTF-8';;
  775. 25) DEFAULT_LANGUAGE='ka_GE.UTF-8';;
  776. 26) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  777. 27) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  778. 28) DEFAULT_LANGUAGE='el_GR.UTF-8';;
  779. 29) DEFAULT_LANGUAGE='gu.UTF-8';;
  780. 30) DEFAULT_LANGUAGE='he_IL.utf8';;
  781. 31) DEFAULT_LANGUAGE='hi_IN.UTF-8';;
  782. 32) DEFAULT_LANGUAGE='hu.UTF-8';;
  783. 33) DEFAULT_LANGUAGE='is_IS.UTF-8';;
  784. 34) DEFAULT_LANGUAGE='id_ID.UTF-8';;
  785. 35) DEFAULT_LANGUAGE='it_IT.UTF-8';;
  786. 36) DEFAULT_LANGUAGE='ja_JP.UTF-8';;
  787. 37) DEFAULT_LANGUAGE='kn_IN.UTF-8';;
  788. 38) DEFAULT_LANGUAGE='km_KH.UTF-8';;
  789. 39) DEFAULT_LANGUAGE='ko_KR.UTF-8';;
  790. 40) DEFAULT_LANGUAGE='lo_LA.UTF-8';;
  791. 41) DEFAULT_LANGUAGE='lt_LT.UTF-8';;
  792. 42) DEFAULT_LANGUAGE='lat.UTF-8';;
  793. 43) DEFAULT_LANGUAGE='ml_IN.UTF-8';;
  794. 44) DEFAULT_LANGUAGE='ms_MY.UTF-8';;
  795. 45) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  796. 46) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  797. 47) DEFAULT_LANGUAGE='mn.UTF-8';;
  798. 48) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  799. 49) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  800. 50) DEFAULT_LANGUAGE='nn_NO.UTF-8';;
  801. 51) DEFAULT_LANGUAGE='pl.UTF-8';;
  802. 52) DEFAULT_LANGUAGE='pt_PT.UTF-8';;
  803. 53) DEFAULT_LANGUAGE='pt_BR.UTF-8';;
  804. 54) DEFAULT_LANGUAGE='ro_RO.UTF-8';;
  805. 55) DEFAULT_LANGUAGE='ru_RU.UTF-8';;
  806. 56) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  807. 57) DEFAULT_LANGUAGE='sr_CS.UTF-8';;
  808. 58) DEFAULT_LANGUAGE='sk_SK.UTF-8';;
  809. 59) DEFAULT_LANGUAGE='sl_SI.UTF-8';;
  810. 60) DEFAULT_LANGUAGE='so_SO.UTF-8';;
  811. 61) DEFAULT_LANGUAGE='es_ES.UTF-8';;
  812. 62) DEFAULT_LANGUAGE='sv_SE.UTF-8';;
  813. 63) DEFAULT_LANGUAGE='tl.UTF-8';;
  814. 64) DEFAULT_LANGUAGE='ta_IN.UTF-8';;
  815. 65) DEFAULT_LANGUAGE='th_TH.UTF-8';;
  816. 66) DEFAULT_LANGUAGE='tr_TR.UTF-8';;
  817. 67) DEFAULT_LANGUAGE='uk_UA.UTF-8';;
  818. 68) DEFAULT_LANGUAGE='vi_VN.UTF-8';;
  819. esac
  820. save_configuration_values
  821. please_wait
  822. echo ''
  823. echo 'Setting locale'
  824. locale-gen "${DEFAULT_LANGUAGE}"
  825. update-locale LANG=${DEFAULT_LANGUAGE}
  826. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  827. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  828. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  829. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  830. please_wait
  831. echo ''
  832. }
  833. function select_user {
  834. SELECTED_USERNAME=
  835. homedirs=$(ls /home)
  836. # shellcheck disable=SC2206
  837. users_array=($homedirs)
  838. delete=(git)
  839. # shellcheck disable=SC2068
  840. for del in ${delete[@]}
  841. do
  842. # shellcheck disable=SC2206
  843. users_array=(${users_array[@]/$del})
  844. done
  845. i=0
  846. W=()
  847. name=()
  848. # shellcheck disable=SC2068
  849. for u in ${users_array[@]}
  850. do
  851. if [[ $(is_valid_user "$u") == "1" ]]; then
  852. i=$((i+1))
  853. W+=("$i" "$u")
  854. name+=("$u")
  855. fi
  856. done
  857. if [ $i -eq 1 ]; then
  858. SELECTED_USERNAME="${name[0]}"
  859. else
  860. # shellcheck disable=SC2068
  861. user_index=$(dialog --backtitle $"Freedombone Configuration" --title $"Select User" --menu $"Select one of the following:" 24 40 17 ${W[@]} 3>&2 2>&1 1>&3)
  862. # shellcheck disable=SC2181
  863. if [ $? -eq 0 ]; then
  864. SELECTED_USERNAME="${name[$((user_index-1))]}"
  865. fi
  866. fi
  867. }
  868. function interactive_config {
  869. # create a temporary copy of the configuration file
  870. # which can be used to pre-populate selections
  871. if [ -f "$CONFIGURATION_FILE" ]; then
  872. cp "$CONFIGURATION_FILE" temp.cfg
  873. fi
  874. interactive_select_language
  875. if [ "$SOCIALINSTANCE" ]; then
  876. INITIAL_MESSAGE=$"Welcome to your Freedombone $SOCIALINSTANCE instance.\\n\\nEnsure that you have your domain and dynamic DNS settings ready.\\n\\nFor more information please visit ${FREEDOMBONE_WEBSITE}/socialinstance.html."
  877. else
  878. if [[ "$ONION_ONLY" == "no" ]]; then
  879. INITIAL_MESSAGE=$"Welcome to the Freedombone interactive installer. Communications freedom is only a short time away.\\n\\nEnsure that you have your domain and dynamic DNS settings ready.\\n\\nFor more information please visit $FREEDOMBONE_WEBSITE."
  880. else
  881. INITIAL_MESSAGE=$"Welcome to the Freedombone interactive installer. Communications freedom is only a short time away.\\n\\nWeb sites created will only be viewable within a Tor browser.\\n\\nFor more information please visit $FREEDOMBONE_WEBSITE."
  882. fi
  883. fi
  884. dialog --title $"Freedombone" --msgbox "$INITIAL_MESSAGE" 15 50
  885. #choose_system_variant
  886. choose_username
  887. choose_full_name
  888. choose_social_key_management
  889. choose_rng
  890. choose_debian_repo
  891. "${PROJECT_NAME}-wifi" --networksinteractive "$WIFI_NETWORKS_FILE"
  892. "${PROJECT_NAME}-ddns"
  893. read_config_param DDNS_PROVIDER
  894. read_config_param DDNS_USERNAME
  895. read_config_param DDNS_PASSWORD
  896. choose_default_domain_name
  897. choose_email_address
  898. interactive_key_recovery
  899. if [[ "$SOCIALINSTANCE" == 'gnusocial' ]]; then
  900. GNUSOCIAL_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  901. GNUSOCIAL_CODE=$DEFAULT_DOMAIN_CODE
  902. write_config_param "GNUSOCIAL_DOMAIN_NAME" "$GNUSOCIAL_DOMAIN_NAME"
  903. write_config_param "GNUSOCIAL_CODE" "$GNUSOCIAL_CODE"
  904. write_config_param "SOCIALINSTANCE" "$SOCIALINSTANCE"
  905. install_gnusocial
  906. fi
  907. if [[ "$SOCIALINSTANCE" == 'postactiv' ]]; then
  908. POSTACTIV_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  909. POSTACTIV_CODE=$DEFAULT_DOMAIN_CODE
  910. write_config_param "POSTACTIV_DOMAIN_NAME" "$POSTACTIV_DOMAIN_NAME"
  911. write_config_param "POSTACTIV_CODE" "$POSTACTIV_CODE"
  912. write_config_param "SOCIALINSTANCE" "$SOCIALINSTANCE"
  913. install_postactiv
  914. fi
  915. if [[ "$SOCIALINSTANCE" == 'pleroma' ]]; then
  916. PLEROMA_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  917. PLEROMA_CODE=$DEFAULT_DOMAIN_CODE
  918. write_config_param "PLEROMA_DOMAIN_NAME" "$PLEROMA_DOMAIN_NAME"
  919. write_config_param "PLEROMA_CODE" "$PLEROMA_CODE"
  920. write_config_param "SOCIALINSTANCE" "$SOCIALINSTANCE"
  921. install_pleroma
  922. fi
  923. # delete the temporary configuration file
  924. if [ -f temp.cfg ]; then
  925. shred -zu temp.cfg
  926. fi
  927. # This file indicates that the configuration happened successfully
  928. touch "$HOME/.${PROJECT_NAME}-interactive"
  929. }
  930. function show_result {
  931. #clear
  932. echo ''
  933. echo -n $"Configuration filename:"
  934. echo " $CONFIGURATION_FILE"
  935. echo ''
  936. echo $'Contents:'
  937. echo ''
  938. cat "$CONFIGURATION_FILE"
  939. echo ''
  940. }
  941. if [ ! "$CONFIGURATION_FILE" ]; then
  942. CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
  943. fi
  944. read_configuration_values
  945. interactive_config
  946. #show_result
  947. exit 0