freedombone-config 40KB

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