freedombone-config 42KB

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