freedombone-config 40KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177
  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://4fvfozz6g3zmvf76.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 freedombone.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 == "default@freedns.afraid.org" ]]; 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 == "default@freedns.afraid.org" ]]; then
  230. dialog --backtitle $"Freedombone Configuration" \
  231. --title $"Your main domain name" \
  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 dynamic_dns_setup {
  302. W=(1 freedns.afraid.org
  303. 2 dyn.com
  304. 3 zoneedit.com
  305. 4 no-ip.com
  306. 5 easydns.com
  307. 6 tzo.com
  308. 7 3322.org
  309. 8 dnsomatic.com
  310. 9 dns.he.net
  311. 10 tunnelbroker.net
  312. 11 dynsip.org
  313. 12 sitelutions.com
  314. 13 dnsexit.com
  315. 14 changeip.com
  316. 15 zerigo.com
  317. 16 dhis.org
  318. 17 nsupdate.info
  319. 18 duckdns.org
  320. 19 loopia.com
  321. 20 namecheap.com
  322. 21 domains.google.com
  323. 22 ovh.com
  324. 23 dtdns.com
  325. 24 giradns.com
  326. 25 duiadns.net
  327. 26 ddnss.de
  328. 27 dynv6.com
  329. 28 ipv4.dynv6.com
  330. 29 default@spdyn.de
  331. 30 strato.com
  332. 31 freemyip.com
  333. 32 cloudxns.net)
  334. # shellcheck disable=SC2068
  335. selection=$(dialog --backtitle $"Freedombone Configuration" --title $"Dynamic DNS" --menu $"Choose Dynamic DNS provider, or ESC for none:" 24 60 32 "${W[@]}" 3>&2 2>&1 1>&3)
  336. if [ ! "$selection" ]; then
  337. if [ -f /etc/systemd/system/inadyn.service ]; then
  338. systemctl stop inadyn
  339. systemctl disable inadyn
  340. fi
  341. return
  342. fi
  343. case $selection in
  344. 1) DDNS_PROVIDER="default@freedns.afraid.org";;
  345. 2) DDNS_PROVIDER="default@www.dyn.com";;
  346. 3) DDNS_PROVIDER="default@www.zoneedit.com";;
  347. 4) DDNS_PROVIDER="default@www.no-ip.com";;
  348. 5) DDNS_PROVIDER="default@www.easydns.com";;
  349. 6) DDNS_PROVIDER="default@www.tzo.com";;
  350. 7) DDNS_PROVIDER="default@www.3322.org";;
  351. 8) DDNS_PROVIDER="default@www.dnsomatic.com";;
  352. 9) DDNS_PROVIDER="default@dns.he.net";;
  353. 10) DDNS_PROVIDER="default@www.tunnelbroker.net";;
  354. 11) DDNS_PROVIDER="default@www.dynsip.org";;
  355. 12) DDNS_PROVIDER="default@www.sitelutions.com";;
  356. 13) DDNS_PROVIDER="default@www.dnsexit.com";;
  357. 14) DDNS_PROVIDER="default@www.changeip.com";;
  358. 15) DDNS_PROVIDER="default@www.zerigo.com";;
  359. 16) DDNS_PROVIDER="default@www.dhis.org";;
  360. 17) DDNS_PROVIDER="default@nsupdate.info";;
  361. 18) DDNS_PROVIDER="default@duckdns.org";;
  362. 19) DDNS_PROVIDER="default@www.loopia.com";;
  363. 20) DDNS_PROVIDER="default@www.namecheap.com";;
  364. 21) DDNS_PROVIDER="default@domains.google.com";;
  365. 22) DDNS_PROVIDER="default@www.ovh.com";;
  366. 23) DDNS_PROVIDER="default@www.dtdns.com";;
  367. 24) DDNS_PROVIDER="default@giradns.com";;
  368. 25) DDNS_PROVIDER="default@www.duiadns.net";;
  369. 26) DDNS_PROVIDER="default@ddnss.de";;
  370. 27) DDNS_PROVIDER="default@dynv6.com";;
  371. 28) DDNS_PROVIDER="default@ipv4.dynv6.com";;
  372. 29) DDNS_PROVIDER="default@spdyn.de";;
  373. 30) DDNS_PROVIDER="default@www.strato.com";;
  374. 31) DDNS_PROVIDER="default@freemyip.com";;
  375. 32) DDNS_PROVIDER="default@www.cloudxns.net";;
  376. 33) DDNS_PROVIDER="none";;
  377. esac
  378. save_configuration_values
  379. valid_ddns_username=
  380. valid_ddns_password=
  381. if [[ "$DDNS_PROVIDER" == "none" ]]; then
  382. if [ -f /etc/systemd/system/inadyn.service ]; then
  383. systemctl stop inadyn
  384. systemctl disable inadyn
  385. fi
  386. else
  387. while [ ! $valid_ddns_username ]
  388. do
  389. data=$(mktemp 2>/dev/null)
  390. dialog --backtitle $"Freedombone Configuration" \
  391. --inputbox $"Dynamic DNS provider username" 10 30 "$(grep 'DDNS_USERNAME' temp.cfg | awk -F '=' '{print $2}')" 2> "$data"
  392. sel=$?
  393. case $sel in
  394. 0) possible_username=$(cat "$data")
  395. if [ "$possible_username" ]; then
  396. if [ ${#possible_username} -gt 1 ]; then
  397. valid_ddns_username=$(cat "$data")
  398. # shellcheck disable=SC2034
  399. DDNS_USERNAME="$valid_ddns_username"
  400. rm -f "$data"
  401. break;
  402. fi
  403. fi
  404. ;;
  405. 1) rm -f "$data"
  406. exit 1;;
  407. 255) rm -f "$data"
  408. exit 1;;
  409. esac
  410. rm -f "$data"
  411. done
  412. save_configuration_values
  413. while [ ! $valid_ddns_password ]
  414. do
  415. data=$(mktemp 2>/dev/null)
  416. dialog --backtitle $"Freedombone Configuration" \
  417. --clear \
  418. --insecure \
  419. --passwordbox $"Dynamic DNS provider password" 10 30 "$(grep 'DDNS_PASSWORD' temp.cfg | awk -F '=' '{print $2}')" 2> "$data"
  420. sel=$?
  421. case $sel in
  422. 0) possible_password=$(cat "$data")
  423. if [ "$possible_password" ]; then
  424. if [ ${#possible_password} -gt 1 ]; then
  425. valid_ddns_password=$(cat "$data")
  426. DDNS_PASSWORD=$valid_ddns_password
  427. break;
  428. fi
  429. fi
  430. ;;
  431. 1) rm -f "$data"
  432. exit 1;;
  433. 255) rm -f "$data"
  434. exit 1;;
  435. esac
  436. rm -f "$data"
  437. if [ ${#DDNS_PASSWORD} -lt "$MINIMUM_PASSWORD_LENGTH" ]; then
  438. dialog --title $"Password quality check" --msgbox $"The password given was too short. It must be at least $MINIMUM_PASSWORD_LENGTH characters. You may need to change your password on the dynamic DNS provider's web site." 10 40
  439. DDNS_PASSWORD=""
  440. fi
  441. done
  442. save_configuration_values
  443. fi
  444. }
  445. function choose_dynamic_dns {
  446. DDNS_PROVIDER="none"
  447. if [[ "$SYSTEM_TYPE" != "mesh"* && "$ONION_ONLY" == "no" ]]; then
  448. dialog --title $"Dynamic DNS" \
  449. --backtitle $"Freedombone Configuration" \
  450. --yesno $"\\nConfigure a dynamic DNS service?\\n\\nIf it is already handled by your internet router then select 'no'." 10 50
  451. sel=$?
  452. case $sel in
  453. 0) dynamic_dns_setup;;
  454. 255) exit 1;;
  455. esac
  456. fi
  457. save_configuration_values
  458. }
  459. function choose_debian_repo {
  460. if [[ "$MINIMAL_INSTALL" == "no" ]]; then
  461. W=(1 $"United Kingdom"
  462. 2 $"United States"
  463. 3 $"Australia"
  464. 4 $"Austria"
  465. 5 $"Belarus"
  466. 6 $"Belgium"
  467. 7 $"Bosnia and Herzegovina"
  468. 8 $"Brazil"
  469. 9 $"Bulgaria"
  470. 10 $"Canada"
  471. 11 $"Chile"
  472. 12 $"China"
  473. 13 $"Croatia"
  474. 14 $"Czech Republic"
  475. 15 $"Denmark"
  476. 16 $"El Salvador"
  477. 17 $"Estonia"
  478. 18 $"Finland"
  479. 19 $"France 1"
  480. 20 $"France 2"
  481. 21 $"Germany 1"
  482. 22 $"Germany 2"
  483. 23 $"Greece"
  484. 24 $"Hungary"
  485. 25 $"Iceland"
  486. 26 $"Iran"
  487. 27 $"Ireland"
  488. 28 $"Italy"
  489. 29 $"Japan"
  490. 30 $"Korea"
  491. 31 $"Lithuania"
  492. 32 $"Mexico"
  493. 33 $"Netherlands"
  494. 34 $"New Caledonia"
  495. 35 $"New Zealand"
  496. 36 $"Norway"
  497. 37 $"Poland"
  498. 38 $"Portugal"
  499. 39 $"Romania"
  500. 40 $"Russia"
  501. 41 $"Slovakia"
  502. 42 $"Slovenia"
  503. 43 $"Spain"
  504. 44 $"Sweden"
  505. 45 $"Switzerland"
  506. 46 $"Taiwan"
  507. 47 $"Thailand"
  508. 48 $"Turkey"
  509. 49 $"Ukraine")
  510. # shellcheck disable=SC2068
  511. 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)
  512. if [ ! "$selection" ]; then
  513. selection='1'
  514. fi
  515. case $selection in
  516. 1) DEBIAN_REPO='ftp.uk.debian.org';;
  517. 2) DEBIAN_REPO='ftp.us.debian.org';;
  518. 3) DEBIAN_REPO='ftp.au.debian.org';;
  519. 4) DEBIAN_REPO='ftp.at.debian.org';;
  520. 5) DEBIAN_REPO='ftp.by.debian.org';;
  521. 6) DEBIAN_REPO='ftp.be.debian.org';;
  522. 7) DEBIAN_REPO='ftp.ba.debian.org';;
  523. 8) DEBIAN_REPO='ftp.br.debian.org';;
  524. 9) DEBIAN_REPO='ftp.bg.debian.org';;
  525. 10) DEBIAN_REPO='ftp.ca.debian.org';;
  526. 11) DEBIAN_REPO='ftp.cl.debian.org';;
  527. 12) DEBIAN_REPO='ftp.cn.debian.org';;
  528. 13) DEBIAN_REPO='ftp.hr.debian.org';;
  529. 14) DEBIAN_REPO='ftp.cz.debian.org';;
  530. 15) DEBIAN_REPO='ftp.dk.debian.org';;
  531. 16) DEBIAN_REPO='ftp.sv.debian.org';;
  532. 17) DEBIAN_REPO='ftp.ee.debian.org';;
  533. 18) DEBIAN_REPO='ftp.fi.debian.org';;
  534. 19) DEBIAN_REPO='ftp2.fr.debian.org';;
  535. 20) DEBIAN_REPO='ftp.fr.debian.org';;
  536. 21) DEBIAN_REPO='ftp2.de.debian.org';;
  537. 22) DEBIAN_REPO='ftp.de.debian.org';;
  538. 23) DEBIAN_REPO='ftp.gr.debian.org';;
  539. 24) DEBIAN_REPO='ftp.hu.debian.org';;
  540. 25) DEBIAN_REPO='ftp.is.debian.org';;
  541. 26) DEBIAN_REPO='ftp.ir.debian.org';;
  542. 27) DEBIAN_REPO='ftp.ie.debian.org';;
  543. 28) DEBIAN_REPO='ftp.it.debian.org';;
  544. 29) DEBIAN_REPO='ftp.jp.debian.org';;
  545. 30) DEBIAN_REPO='ftp.kr.debian.org';;
  546. 31) DEBIAN_REPO='ftp.lt.debian.org';;
  547. 32) DEBIAN_REPO='ftp.mx.debian.org';;
  548. 33) DEBIAN_REPO='ftp.nl.debian.org';;
  549. 34) DEBIAN_REPO='ftp.nc.debian.org';;
  550. 35) DEBIAN_REPO='ftp.nz.debian.org';;
  551. 36) DEBIAN_REPO='ftp.no.debian.org';;
  552. 37) DEBIAN_REPO='ftp.pl.debian.org';;
  553. 38) DEBIAN_REPO='ftp.pt.debian.org';;
  554. 39) DEBIAN_REPO='ftp.ro.debian.org';;
  555. 40) DEBIAN_REPO='ftp.ru.debian.org';;
  556. 41) DEBIAN_REPO='ftp.sk.debian.org';;
  557. 42) DEBIAN_REPO='ftp.si.debian.org';;
  558. 43) DEBIAN_REPO='ftp.es.debian.org';;
  559. 44) DEBIAN_REPO='ftp.se.debian.org';;
  560. 45) DEBIAN_REPO='ftp.ch.debian.org';;
  561. 46) DEBIAN_REPO='ftp.tw.debian.org';;
  562. 47) DEBIAN_REPO='ftp.th.debian.org';;
  563. 48) DEBIAN_REPO='ftp.tr.debian.org';;
  564. 49) DEBIAN_REPO='ftp.ua.debian.org';;
  565. esac
  566. save_configuration_values
  567. else
  568. # shellcheck disable=SC2034
  569. DEBIAN_REPO='ftp.de.debian.org'
  570. fi
  571. }
  572. function choose_rng {
  573. if [[ $MINIMAL_INSTALL == "no" ]]; then
  574. data=$(mktemp 2>/dev/null)
  575. if [[ "$INSTALLING_ON_BBB" != "yes" ]]; then
  576. dialog --backtitle $"Freedombone Configuration" \
  577. --radiolist $"Type of Random Number Generator:" 10 40 2 \
  578. 1 Haveged on \
  579. 2 OneRNG off 2> "$data"
  580. sel=$?
  581. case $sel in
  582. 1) rm -f "$data"
  583. exit 1;;
  584. 255) rm -f "$data"
  585. exit 1;;
  586. esac
  587. case $(cat "$data") in
  588. 2) HWRNG_TYPE="onerng"
  589. dialog --title $"OneRNG Device" \
  590. --msgbox $"Please ensure that the OneRNG device is disconnected. You can reconnect it later during the installation" 8 60
  591. ;;
  592. 255) rm -f "$data"
  593. exit 1;;
  594. esac
  595. else
  596. # shellcheck disable=SC2034
  597. HWRNG_TYPE="beaglebone"
  598. fi
  599. rm -f "$data"
  600. save_configuration_values
  601. fi
  602. }
  603. function choose_social_key_management {
  604. if [[ $MINIMAL_INSTALL == "no" ]]; then
  605. interactive_gpg
  606. 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."
  607. if [[ $(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
  608. dialog --title $"Social Key Management" \
  609. --backtitle $"Freedombone Configuration" \
  610. --yesno "$SOCIAL_KEY_STR" 15 60
  611. else
  612. dialog --title $"Social Key Management" \
  613. --backtitle $"Freedombone Configuration" \
  614. --defaultno \
  615. --yesno "$SOCIAL_KEY_STR" 15 60
  616. fi
  617. sel=$?
  618. case $sel in
  619. 0) ENABLE_SOCIAL_KEY_MANAGEMENT="yes";;
  620. 255) exit 1;;
  621. esac
  622. save_configuration_values
  623. else
  624. # enable for the minimal case
  625. # shellcheck disable=SC2034
  626. ENABLE_SOCIAL_KEY_MANAGEMENT="yes"
  627. fi
  628. }
  629. function choose_username {
  630. if [ -d /home/$GENERIC_IMAGE_USERNAME ]; then
  631. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  632. echo 'Cannot find the password file for the admin user'
  633. exit 62753
  634. fi
  635. # when installing from an image which comes with a known default user account
  636. SELECTED_USERNAME=
  637. while [ ! $SELECTED_USERNAME ]
  638. do
  639. if [ ! $SELECTED_USERNAME ]; then
  640. SELECTED_USERNAME=$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')
  641. fi
  642. data=$(mktemp 2>/dev/null)
  643. dialog --backtitle $"Freedombone Configuration" \
  644. --title $"Username" \
  645. --inputbox $"Set your username for the system\\n\\nYour username should not contain any spaces" 12 60 "$SELECTED_USERNAME" 2> "$data"
  646. sel=$?
  647. case $sel in
  648. 0) possible_username=$(cat "$data")
  649. SELECTED_USERNAME=
  650. if [[ "$possible_username" != *' '* && "$possible_username" != *'/'* && "$possible_username" != *'*'* ]]; then
  651. if [ "$possible_username" ]; then
  652. if [ ${#possible_username} -gt 1 ]; then
  653. if [[ "$possible_username" != "$GENERIC_IMAGE_USERNAME" ]]; then
  654. MY_USERNAME=$(cat "$data")
  655. please_wait
  656. echo ''
  657. echo $'Creating user account'
  658. chmod 600 /etc/shadow
  659. chmod 600 /etc/gshadow
  660. useradd -m -s /bin/bash "$MY_USERNAME"
  661. chmod 0000 /etc/shadow
  662. chmod 0000 /etc/gshadow
  663. if [ -d "/home/$MY_USERNAME" ]; then
  664. echo "${MY_USERNAME}:$(printf "%s" "$(cat "$IMAGE_PASSWORD_FILE")")" | chpasswd
  665. # Add the user as a sudoer - they will be the new admin user
  666. if ! grep -q "$MY_USERNAME ALL=(ALL) ALL" /etc/sudoers; then
  667. echo "$MY_USERNAME ALL=(ALL) ALL" >> /etc/sudoers
  668. # remove the generic image admin user from sudoers
  669. sed -i "s|${GENERIC_IMAGE_USERNAME}.*||g" /etc/sudoers
  670. fi
  671. rm -f "$data"
  672. break
  673. fi
  674. fi
  675. fi
  676. fi
  677. fi
  678. ;;
  679. 1) rm -f "$data"
  680. exit 1;;
  681. 255) rm -f "$data"
  682. exit 1;;
  683. esac
  684. rm -f "$data"
  685. done
  686. else
  687. no_of_users=$(find /home/* -maxdepth 0 -type d | wc -l)
  688. if [ "$no_of_users" -eq 1 ]; then
  689. # only a single user on the system
  690. MY_USERNAME=$(ls /home)
  691. else
  692. # select one from a number of users
  693. select_user
  694. if [ ! $SELECTED_USERNAME ]; then
  695. echo $'No username selected'
  696. exit 72589
  697. fi
  698. MY_USERNAME="$SELECTED_USERNAME"
  699. fi
  700. fi
  701. if [ ! $MY_USERNAME ]; then
  702. echo $'No user account was selected'
  703. exit 64398
  704. fi
  705. if [[ $MY_USERNAME == '-f' ]]; then
  706. echo $'No user account was selected'
  707. exit 8347
  708. fi
  709. if [[ $MY_USERNAME == 'debian' || $MY_USERNAME == 'fbone' ]]; then
  710. echo $"Don't use the default user account"
  711. exit 9341
  712. fi
  713. if [ ! -d /home/$MY_USERNAME ]; then
  714. echo $"The directory /home/$MY_USERNAME does not exist"
  715. exit 6437
  716. fi
  717. save_configuration_values
  718. please_wait
  719. echo ''
  720. }
  721. function choose_full_name {
  722. valid_name=
  723. while [ ! $valid_name ]
  724. do
  725. data=$(mktemp 2>/dev/null)
  726. dialog --backtitle $"Freedombone Configuration" \
  727. --inputbox $"Your full name (or nick)" 10 50 "$(grep 'MY_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> "$data"
  728. sel=$?
  729. case $sel in
  730. 0) possible_name=$(cat "$data")
  731. if [ "$possible_name" ]; then
  732. if [ ${#possible_name} -gt 1 ]; then
  733. valid_name="$possible_name"
  734. # shellcheck disable=SC2034
  735. MY_NAME="$possible_name"
  736. break;
  737. fi
  738. fi
  739. ;;
  740. 1) rm -f "$data"
  741. exit 1;;
  742. 255) rm -f "$data"
  743. exit 1;;
  744. esac
  745. rm -f "$data"
  746. done
  747. save_configuration_values
  748. please_wait
  749. echo ''
  750. }
  751. function choose_system_variant {
  752. available_variants_list=()
  753. available_system_variants
  754. varslist=""
  755. n=1
  756. # shellcheck disable=SC2068
  757. for a in ${available_variants_list[@]}
  758. do
  759. varstate='off'
  760. if [[ "$a" == $'full' || "$a" == $'Full' ]]; then
  761. varstate='on'
  762. fi
  763. varslist="$varslist $n $a $varstate"
  764. n=$((n+1))
  765. done
  766. # shellcheck disable=SC2086
  767. variant_choice=$(dialog --stdout --backtitle $"Freedombone Configuration" \
  768. --title $"Type of Installation" \
  769. --radiolist $'Choose:' \
  770. 27 40 20 $varslist)
  771. # shellcheck disable=SC2181
  772. if [ $? -eq 0 ]; then
  773. variant_choice=$((variant_choice-1))
  774. SYSTEM_TYPE=${available_variants_list[$variant_choice]}
  775. save_configuration_values
  776. fi
  777. }
  778. function validate_freedns_code {
  779. freedns_code="$1"
  780. 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."
  781. if [[ "$freedns_code" == *"."* || "$freedns_code" == "http"* || "$freedns_code" == *"wget "* || "$freedns_code" == *" "* ]]; then
  782. dialog --title $"Invalid FreeDNS Code" --msgbox "$FREEDNS_MESSAGE" 10 70
  783. VALID_CODE=
  784. fi
  785. if [ ${#freedns_code} -lt 30 ]; then
  786. dialog --title $"Invalid FreeDNS Code" --msgbox $'FreeDNS code is too short. Did you enter the entire code?' 6 70
  787. VALID_CODE=
  788. fi
  789. VALID_CODE='yes'
  790. }
  791. # Get the commandline options
  792. while [ $# -gt 1 ]
  793. do
  794. key="$1"
  795. case $key in
  796. -h|--help)
  797. show_help
  798. ;;
  799. # Configuration filename
  800. -f|--filename)
  801. shift
  802. CONFIGURATION_FILE="$1"
  803. ;;
  804. # Minimum password length
  805. -m|--min)
  806. shift
  807. MINIMUM_PASSWORD_LENGTH="$1"
  808. ;;
  809. # Freedombone website
  810. -w|--www)
  811. shift
  812. FREEDOMBONE_WEBSITE="$1"
  813. ;;
  814. --social)
  815. shift
  816. if [[ "$1" == 'gnusocial' || "$1" == 'postactiv' ]]; then
  817. SOCIALINSTANCE="$1"
  818. fi
  819. ;;
  820. --minimal)
  821. shift
  822. MINIMAL_INSTALL="$1"
  823. ;;
  824. -o|--onion)
  825. shift
  826. ONION_ONLY="$1"
  827. ;;
  828. *)
  829. # unknown option
  830. ;;
  831. esac
  832. shift
  833. done
  834. function interactive_select_language {
  835. W=(1 $"English"
  836. 2 $"Afrikaans"
  837. 3 $"Albanian"
  838. 4 $"Arabic"
  839. 5 $"Basque"
  840. 6 $"Belarusian"
  841. 7 $"Bosnian"
  842. 8 $"Bulgarian"
  843. 9 $"Catalan"
  844. 10 $"Croatian"
  845. 11 $"Chinese (Simplified)"
  846. 12 $"Chinese (Traditional)"
  847. 13 $"Czech"
  848. 14 $"Danish"
  849. 15 $"Dutch"
  850. 16 $"English (US)"
  851. 17 $"Estonian"
  852. 18 $"Farsi"
  853. 19 $"Filipino"
  854. 20 $"Finnish"
  855. 21 $"French"
  856. 22 $"French (Canada)"
  857. 23 $"Gaelic"
  858. 24 $"Gallego"
  859. 25 $"Georgian"
  860. 26 $"German"
  861. 27 $"German (Personal)"
  862. 28 $"Greek"
  863. 29 $"Gujarati"
  864. 30 $"Hebrew"
  865. 31 $"Hindi"
  866. 32 $"Hungarian"
  867. 33 $"Icelandic"
  868. 34 $"Indonesian"
  869. 35 $"Italian"
  870. 36 $"Japanese"
  871. 37 $"Kannada"
  872. 38 $"Khmer"
  873. 39 $"Korean"
  874. 40 $"Lao"
  875. 41 $"Lithuanian"
  876. 42 $"Latvian"
  877. 43 $"Malayalam"
  878. 44 $"Malaysian"
  879. 45 $"Maori (Ngai Tahu)"
  880. 46 $"Maori (Waikoto Uni)"
  881. 47 $"Mongolian"
  882. 48 $"Norwegian"
  883. 49 $"Norwegian (Primary)"
  884. 50 $"Nynorsk"
  885. 51 $"Polish"
  886. 52 $"Portuguese"
  887. 53 $"Portuguese (Brazil)"
  888. 54 $"Romanian"
  889. 55 $"Russian"
  890. 56 $"Samoan"
  891. 57 $"Serbian"
  892. 58 $"Slovak"
  893. 59 $"Slovenian"
  894. 60 $"Somali"
  895. 61 $"Spanish (International)"
  896. 62 $"Swedish"
  897. 63 $"Tagalog"
  898. 64 $"Tamil"
  899. 65 $"Thai"
  900. 66 $"Turkish"
  901. 67 $"Ukrainian"
  902. 68 $"Vietnamese")
  903. # shellcheck disable=SC2068
  904. selection=$(dialog --backtitle $"Freedombone Configuration" --title $"Language" --menu $"Select your language:" 24 60 68 "${W[@]}" 3>&2 2>&1 1>&3)
  905. if [ ! "$selection" ]; then
  906. selection='1'
  907. fi
  908. case $selection in
  909. 1) DEFAULT_LANGUAGE='en_GB.UTF-8';;
  910. 2) DEFAULT_LANGUAGE='af_ZA.UTF-8';;
  911. 3) DEFAULT_LANGUAGE='sq_AL.UTF-8';;
  912. 4) DEFAULT_LANGUAGE='ar_SA.UTF-8';;
  913. 5) DEFAULT_LANGUAGE='eu_ES.UTF-8';;
  914. 6) DEFAULT_LANGUAGE='be_BY.UTF-8';;
  915. 7) DEFAULT_LANGUAGE='bs_BA.UTF-8';;
  916. 8) DEFAULT_LANGUAGE='bg_BG.UTF-8';;
  917. 9) DEFAULT_LANGUAGE='ca_ES.UTF-8';;
  918. 10) DEFAULT_LANGUAGE='hr_HR.UTF-8';;
  919. 11) DEFAULT_LANGUAGE='zh_CN.UTF-8';;
  920. 12) DEFAULT_LANGUAGE='zh_TW.UTF-8';;
  921. 13) DEFAULT_LANGUAGE='cs_CZ.UTF-8';;
  922. 14) DEFAULT_LANGUAGE='da_DK.UTF-8';;
  923. 15) DEFAULT_LANGUAGE='nl_NL.UTF-8';;
  924. 16) DEFAULT_LANGUAGE='en_US.UTF-8';;
  925. 17) DEFAULT_LANGUAGE='et_EE.UTF-8';;
  926. 18) DEFAULT_LANGUAGE='fa_IR.UTF-8';;
  927. 19) DEFAULT_LANGUAGE='ph_PH.UTF-8';;
  928. 20) DEFAULT_LANGUAGE='fi_FI.UTF-8';;
  929. 21) DEFAULT_LANGUAGE='fr_FR.UTF-8';;
  930. 22) DEFAULT_LANGUAGE='fr_CA.UTF-8';;
  931. 23) DEFAULT_LANGUAGE='ga.UTF-8';;
  932. 24) DEFAULT_LANGUAGE='l_ES.UTF-8';;
  933. 25) DEFAULT_LANGUAGE='ka_GE.UTF-8';;
  934. 26) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  935. 27) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  936. 28) DEFAULT_LANGUAGE='el_GR.UTF-8';;
  937. 29) DEFAULT_LANGUAGE='gu.UTF-8';;
  938. 30) DEFAULT_LANGUAGE='he_IL.utf8';;
  939. 31) DEFAULT_LANGUAGE='hi_IN.UTF-8';;
  940. 32) DEFAULT_LANGUAGE='hu.UTF-8';;
  941. 33) DEFAULT_LANGUAGE='is_IS.UTF-8';;
  942. 34) DEFAULT_LANGUAGE='id_ID.UTF-8';;
  943. 35) DEFAULT_LANGUAGE='it_IT.UTF-8';;
  944. 36) DEFAULT_LANGUAGE='ja_JP.UTF-8';;
  945. 37) DEFAULT_LANGUAGE='kn_IN.UTF-8';;
  946. 38) DEFAULT_LANGUAGE='km_KH.UTF-8';;
  947. 39) DEFAULT_LANGUAGE='ko_KR.UTF-8';;
  948. 40) DEFAULT_LANGUAGE='lo_LA.UTF-8';;
  949. 41) DEFAULT_LANGUAGE='lt_LT.UTF-8';;
  950. 42) DEFAULT_LANGUAGE='lat.UTF-8';;
  951. 43) DEFAULT_LANGUAGE='ml_IN.UTF-8';;
  952. 44) DEFAULT_LANGUAGE='ms_MY.UTF-8';;
  953. 45) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  954. 46) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  955. 47) DEFAULT_LANGUAGE='mn.UTF-8';;
  956. 48) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  957. 49) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  958. 50) DEFAULT_LANGUAGE='nn_NO.UTF-8';;
  959. 51) DEFAULT_LANGUAGE='pl.UTF-8';;
  960. 52) DEFAULT_LANGUAGE='pt_PT.UTF-8';;
  961. 53) DEFAULT_LANGUAGE='pt_BR.UTF-8';;
  962. 54) DEFAULT_LANGUAGE='ro_RO.UTF-8';;
  963. 55) DEFAULT_LANGUAGE='ru_RU.UTF-8';;
  964. 56) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  965. 57) DEFAULT_LANGUAGE='sr_CS.UTF-8';;
  966. 58) DEFAULT_LANGUAGE='sk_SK.UTF-8';;
  967. 59) DEFAULT_LANGUAGE='sl_SI.UTF-8';;
  968. 60) DEFAULT_LANGUAGE='so_SO.UTF-8';;
  969. 61) DEFAULT_LANGUAGE='es_ES.UTF-8';;
  970. 62) DEFAULT_LANGUAGE='sv_SE.UTF-8';;
  971. 63) DEFAULT_LANGUAGE='tl.UTF-8';;
  972. 64) DEFAULT_LANGUAGE='ta_IN.UTF-8';;
  973. 65) DEFAULT_LANGUAGE='th_TH.UTF-8';;
  974. 66) DEFAULT_LANGUAGE='tr_TR.UTF-8';;
  975. 67) DEFAULT_LANGUAGE='uk_UA.UTF-8';;
  976. 68) DEFAULT_LANGUAGE='vi_VN.UTF-8';;
  977. esac
  978. save_configuration_values
  979. please_wait
  980. echo ''
  981. echo 'Setting locale'
  982. locale-gen "${DEFAULT_LANGUAGE}"
  983. update-locale LANG=${DEFAULT_LANGUAGE}
  984. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  985. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  986. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  987. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  988. please_wait
  989. echo ''
  990. }
  991. function select_user {
  992. SELECTED_USERNAME=
  993. homedirs=$(ls /home)
  994. # shellcheck disable=SC2206
  995. users_array=($homedirs)
  996. delete=(git)
  997. # shellcheck disable=SC2068
  998. for del in ${delete[@]}
  999. do
  1000. # shellcheck disable=SC2206
  1001. users_array=(${users_array[@]/$del})
  1002. done
  1003. i=0
  1004. W=()
  1005. name=()
  1006. # shellcheck disable=SC2068
  1007. for u in ${users_array[@]}
  1008. do
  1009. if [[ $(is_valid_user "$u") == "1" ]]; then
  1010. i=$((i+1))
  1011. W+=("$i" "$u")
  1012. name+=("$u")
  1013. fi
  1014. done
  1015. if [ $i -eq 1 ]; then
  1016. SELECTED_USERNAME="${name[0]}"
  1017. else
  1018. # shellcheck disable=SC2068
  1019. 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)
  1020. # shellcheck disable=SC2181
  1021. if [ $? -eq 0 ]; then
  1022. SELECTED_USERNAME="${name[$((user_index-1))]}"
  1023. fi
  1024. fi
  1025. }
  1026. function interactive_config {
  1027. # create a temporary copy of the configuration file
  1028. # which can be used to pre-populate selections
  1029. if [ -f "$CONFIGURATION_FILE" ]; then
  1030. cp "$CONFIGURATION_FILE" temp.cfg
  1031. fi
  1032. interactive_select_language
  1033. if [ "$SOCIALINSTANCE" ]; then
  1034. 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."
  1035. else
  1036. if [[ "$ONION_ONLY" == "no" ]]; then
  1037. 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."
  1038. else
  1039. 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."
  1040. fi
  1041. fi
  1042. dialog --title $"Freedombone" --msgbox "$INITIAL_MESSAGE" 15 50
  1043. #choose_system_variant
  1044. choose_username
  1045. choose_full_name
  1046. choose_social_key_management
  1047. choose_rng
  1048. choose_debian_repo
  1049. "${PROJECT_NAME}-wifi" --networksinteractive "$WIFI_NETWORKS_FILE"
  1050. choose_dynamic_dns
  1051. choose_default_domain_name
  1052. choose_email_address
  1053. interactive_key_recovery
  1054. if [[ "$SOCIALINSTANCE" == 'gnusocial' ]]; then
  1055. GNUSOCIAL_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  1056. GNUSOCIAL_CODE=$DEFAULT_DOMAIN_CODE
  1057. write_config_param "GNUSOCIAL_DOMAIN_NAME" "$GNUSOCIAL_DOMAIN_NAME"
  1058. write_config_param "GNUSOCIAL_CODE" "$GNUSOCIAL_CODE"
  1059. write_config_param "SOCIALINSTANCE" "$SOCIALINSTANCE"
  1060. install_gnusocial
  1061. fi
  1062. if [[ "$SOCIALINSTANCE" == 'postactiv' ]]; then
  1063. POSTACTIV_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  1064. POSTACTIV_CODE=$DEFAULT_DOMAIN_CODE
  1065. write_config_param "POSTACTIV_DOMAIN_NAME" "$POSTACTIV_DOMAIN_NAME"
  1066. write_config_param "POSTACTIV_CODE" "$POSTACTIV_CODE"
  1067. write_config_param "SOCIALINSTANCE" "$SOCIALINSTANCE"
  1068. install_postactiv
  1069. fi
  1070. if [[ "$SOCIALINSTANCE" == 'pleroma' ]]; then
  1071. PLEROMA_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  1072. PLEROMA_CODE=$DEFAULT_DOMAIN_CODE
  1073. write_config_param "PLEROMA_DOMAIN_NAME" "$PLEROMA_DOMAIN_NAME"
  1074. write_config_param "PLEROMA_CODE" "$PLEROMA_CODE"
  1075. write_config_param "SOCIALINSTANCE" "$SOCIALINSTANCE"
  1076. install_pleroma
  1077. fi
  1078. # delete the temporary configuration file
  1079. if [ -f temp.cfg ]; then
  1080. shred -zu temp.cfg
  1081. fi
  1082. # This file indicates that the configuration happened successfully
  1083. touch "$HOME/.${PROJECT_NAME}-interactive"
  1084. }
  1085. function show_result {
  1086. #clear
  1087. echo ''
  1088. echo -n $"Configuration filename:"
  1089. echo " $CONFIGURATION_FILE"
  1090. echo ''
  1091. echo $'Contents:'
  1092. echo ''
  1093. cat "$CONFIGURATION_FILE"
  1094. echo ''
  1095. }
  1096. if [ ! "$CONFIGURATION_FILE" ]; then
  1097. CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
  1098. fi
  1099. read_configuration_values
  1100. interactive_config
  1101. #show_result
  1102. exit 0