freedombone-config 40KB

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