freedombone-config 42KB

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