freedombone-config 48KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  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@robotics.uk.to>
  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=
  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_CJDNS=
  56. ENABLE_BATMAN=
  57. ENABLE_BABEL=
  58. DEBIAN_REPO=
  59. NAMESERVER1=
  60. NAMESERVER2=
  61. WIKI_TITLE=
  62. WIKI_DOMAIN_NAME=
  63. WIKI_CODE=
  64. MY_BLOG_TITLE=
  65. FULLBLOG_DOMAIN_NAME=
  66. FULLBLOG_CODE=
  67. MEDIAGOBLIN_ENABLED='no'
  68. MEDIAGOBLIN_DOMAIN_NAME=
  69. MEDIAGOBLIN_CODE=
  70. MEDIA_SERVER_ENABLED='no'
  71. MEDIA_SERVER_DOMAIN_NAME=
  72. MEDIA_SERVER_CODE=
  73. HUBZILLA_DOMAIN_NAME=
  74. HUBZILLA_CODE=
  75. MICROBLOG_DOMAIN_NAME=
  76. MICROBLOG_CODE=
  77. MICROBLOG_WELCOME_MESSAGE=$"<h1>Welcome to \$MICROBLOG_DOMAIN_NAME – a federated microblog</h1><p>Another $PROJECT_NAME site</p>"
  78. MICROBLOG_BACKGROUND_IMAGE_URL=
  79. GIT_DOMAIN_NAME=
  80. GIT_CODE=
  81. MEDIAGOBLIN_DOMAIN_NAME=
  82. MEDIAGOBLIN_CODE=
  83. USB_DRIVE=/dev/sdb1
  84. HWRNG_TYPE=
  85. ENABLE_SOCIAL_KEY_MANAGEMENT=
  86. WIFI_INTERFACE=wlan0
  87. WIFI_TYPE='wpa2-psk'
  88. WIFI_SSID=
  89. WIFI_PASSPHRASE=
  90. WIFI_HOTSPOT=
  91. WIFI_NETWORKS_FILE=~/${PROJECT_NAME}-wifi.cfg
  92. BATMAN_CELLID='any'
  93. WIFI_CHANNEL=
  94. CONFIGURATION_FILE=
  95. DH_KEYLENGTH=
  96. MINIMAL_INSTALL="yes"
  97. DEFAULT_LANGUAGE='en_GB.UTF-8'
  98. ONION_ONLY="no"
  99. SELECTED_USERNAME=
  100. # Mirrors settings
  101. FRIENDS_MIRRORS_SERVER=
  102. FRIENDS_MIRRORS_SSH_PORT=2222
  103. FRIENDS_MIRRORS_PASSWORD=
  104. MY_MIRRORS_PASSWORD=
  105. VALID_CODE=
  106. source $PROJECT_INSTALL_DIR/${PROJECT_NAME}-vars
  107. UTILS_FILES=/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-*
  108. for f in $UTILS_FILES
  109. do
  110. source $f
  111. done
  112. APP_FILES=/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-*
  113. for f in $APP_FILES
  114. do
  115. source $f
  116. done
  117. function show_help {
  118. echo ''
  119. echo $"${PROJECT_NAME}-config -f [config filename] -m [min password length]"
  120. echo ''
  121. echo $'Creates an inventory of remote backup locations'
  122. echo ''
  123. echo ''
  124. echo $' -h --help Show help'
  125. echo $' -f --filename Configuration file (usually freedombone.cfg)'
  126. echo $' -m --min Minimum password length (characters)'
  127. echo $' -w --www Freedombone web site'
  128. echo $' -b --bm Freedombone support Bitmessage address'
  129. echo $' -o --onion [yes|no] Whether to only create .onion sites'
  130. echo $' --minimal [yes|no] For minimalistic "consumer grade" installs'
  131. echo ''
  132. exit 0
  133. }
  134. function choose_email_address {
  135. if [[ $ONION_ONLY != "no" ]]; then
  136. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  137. else
  138. while [ ${#MY_EMAIL_ADDRESS} -lt 5 ]
  139. do
  140. EMAIL_ADDRESS=$(grep 'MY_EMAIL_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
  141. if [ ! $EMAIL_ADDRESS ]; then
  142. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  143. fi
  144. if [ ${#MY_EMAIL_ADDRESS} -lt 5 ]; then
  145. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  146. fi
  147. data=$(tempfile 2>/dev/null)
  148. trap "rm -f $data" 0 1 2 5 15
  149. dialog --backtitle $"Freedombone Configuration" \
  150. --inputbox $"Your email address" 10 30 "$EMAIL_ADDRESS" 2> $data
  151. sel=$?
  152. case $sel in
  153. 0) MY_EMAIL_ADDRESS=$(cat $data);;
  154. 1) exit 1;;
  155. 255) exit 1;;
  156. esac
  157. done
  158. fi
  159. save_configuration_values
  160. }
  161. function choose_default_domain_name {
  162. if [[ $ONION_ONLY != "no" ]]; then
  163. DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
  164. else
  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 $"Your main domain name" \
  173. --form $"\nWhich domain name should your email/XMPP/IRC/Mumble be associated with?" 11 55 3 \
  174. $"Domain:" 1 1 "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  175. $"Code:" 2 1 "$(grep 'DEFAULT_DOMAIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 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 $"Which domain name should your email/XMPP/IRC/Mumble be associated with?" 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. fi
  213. save_configuration_values
  214. }
  215. function choose_static_ip {
  216. if [[ $MINIMAL_INSTALL == "no" && $ONION_ONLY == "no" ]]; then
  217. SET_STATIC_IP="no"
  218. dialog --title $"Static local IP address" \
  219. --backtitle $"Freedombone Configuration" \
  220. --defaultno \
  221. --yesno $"\nDo you want to set a static local IP address for this system?\n\nFor example, 192.168.1.10" 10 60
  222. sel=$?
  223. case $sel in
  224. 0) SET_STATIC_IP="yes";;
  225. 255) exit 1;;
  226. esac
  227. if [[ $SET_STATIC_IP == "yes" ]]; then
  228. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  229. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep 'LOCAL_NETWORK_STATIC_IP_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
  230. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  231. LOCAL_NETWORK_STATIC_IP_ADDRESS='192.168..'
  232. fi
  233. fi
  234. if [ ! $ROUTER_IP_ADDRESS ]; then
  235. ROUTER_IP_ADDRESS=$(grep 'ROUTER_IP_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
  236. if [ ! $ROUTER_IP_ADDRESS ]; then
  237. ROUTER_IP_ADDRESS='192.168..'
  238. fi
  239. fi
  240. data=$(tempfile 2>/dev/null)
  241. trap "rm -f $data" 0 1 2 5 15
  242. dialog --backtitle $"Freedombone Configuration" \
  243. --title $"Local Network Configuration" \
  244. --form $"\nPlease enter the IP addresses:" 11 55 3 \
  245. $"This system:" 1 1 "$LOCAL_NETWORK_STATIC_IP_ADDRESS" 1 16 16 15 \
  246. $"Internet router:" 2 1 "$ROUTER_IP_ADDRESS" 2 16 16 15 \
  247. 2> $data
  248. sel=$?
  249. case $sel in
  250. 1) exit 1;;
  251. 255) exit 1;;
  252. esac
  253. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(cat $data | sed -n 1p)
  254. ROUTER_IP_ADDRESS=$(cat $data | sed -n 2p)
  255. save_configuration_values
  256. fi
  257. fi
  258. }
  259. function choose_dynamic_dns {
  260. if [[ $SYSTEM_TYPE != "mesh"* && $ONION_ONLY == "no" ]]; then
  261. data=$(tempfile 2>/dev/null)
  262. trap "rm -f $data" 0 1 2 5 15
  263. dialog --backtitle $"Freedombone Configuration" \
  264. --radiolist $"Choose Dynamic DNS provider:" 15 40 14 \
  265. 1 dyndns off \
  266. 2 freedns on \
  267. 3 zoneedit off \
  268. 4 no-ip off \
  269. 5 easydns off \
  270. 6 tzo off \
  271. 7 3322 off \
  272. 8 dnsomatic off \
  273. 9 tunnelbroker off \
  274. 10 dns.he.net off \
  275. 11 dynsip off \
  276. 12 sitelutions off \
  277. 13 dnsexit off \
  278. 14 changeip off 2> $data
  279. sel=$?
  280. case $sel in
  281. 1) exit 1;;
  282. 255) exit 1;;
  283. esac
  284. case $(cat $data) in
  285. 1) DDNS_PROVIDER="default@dyndns.org";;
  286. 2) DDNS_PROVIDER="default@freedns.afraid.org";;
  287. 3) DDNS_PROVIDER="default@zoneedit.com";;
  288. 4) DDNS_PROVIDER="default@no-ip.com";;
  289. 5) DDNS_PROVIDER="default@easydns.com";;
  290. 6) DDNS_PROVIDER="default@tzo.com";;
  291. 7) DDNS_PROVIDER="dyndns@3322.org";;
  292. 8) DDNS_PROVIDER="default@dnsomatic.com";;
  293. 9) DDNS_PROVIDER="ipv6tb@he.net";;
  294. 10) DDNS_PROVIDER="dyndns@he.net";;
  295. 11) DDNS_PROVIDER="default@dynsip.org";;
  296. 12) DDNS_PROVIDER="default@sitelutions.com";;
  297. 13) DDNS_PROVIDER="default@dnsexit.com";;
  298. 14) DDNS_PROVIDER="default@changeip.com";;
  299. 255) exit 1;;
  300. esac
  301. save_configuration_values
  302. valid_ddns_username=
  303. while [ ! $valid_ddns_username ]
  304. do
  305. data=$(tempfile 2>/dev/null)
  306. trap "rm -f $data" 0 1 2 5 15
  307. dialog --backtitle $"Freedombone Configuration" \
  308. --inputbox $"Dynamic DNS provider username" 10 30 "$(grep 'DDNS_USERNAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  309. sel=$?
  310. case $sel in
  311. 0) possible_username=$(cat $data)
  312. if [ "$possible_username" ]; then
  313. if [ ${#possible_username} -gt 1 ]; then
  314. valid_ddns_username=$(cat $data)
  315. DDNS_USERNAME=$valid_ddns_username
  316. break;
  317. fi
  318. fi
  319. ;;
  320. 1) exit 1;;
  321. 255) exit 1;;
  322. esac
  323. done
  324. save_configuration_values
  325. valid_ddns_password=
  326. while [ ! $valid_ddns_password ]
  327. do
  328. data=$(tempfile 2>/dev/null)
  329. trap "rm -f $data" 0 1 2 5 15
  330. dialog --backtitle $"Freedombone Configuration" \
  331. --clear \
  332. --insecure \
  333. --passwordbox $"Dynamic DNS provider password" 10 30 "$(grep 'DDNS_PASSWORD' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  334. sel=$?
  335. case $sel in
  336. 0) possible_password=$(cat $data)
  337. if [ "$possible_password" ]; then
  338. if [ ${#possible_password} -gt 1 ]; then
  339. valid_ddns_password=$(cat $data)
  340. DDNS_PASSWORD=$valid_ddns_password
  341. break;
  342. fi
  343. fi
  344. ;;
  345. 1) exit 1;;
  346. 255) exit 1;;
  347. esac
  348. if [ ${#DDNS_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
  349. 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
  350. DDNS_PASSWORD=""
  351. fi
  352. done
  353. save_configuration_values
  354. fi
  355. }
  356. function choose_dns {
  357. if [[ $MINIMAL_INSTALL == "no" && $ONION_ONLY == "no" ]]; then
  358. data=$(tempfile 2>/dev/null)
  359. trap "rm -f $data" 0 1 2 5 15
  360. dialog --backtitle $"Freedombone Configuration" \
  361. --radiolist $"Pick a domain name service (DNS):" 25 50 16 \
  362. 1 $"Digital Courage" on \
  363. 2 $"German Privacy Foundation 1" off \
  364. 3 $"German Privacy Foundation 2" off \
  365. 4 $"Chaos Computer Club" off \
  366. 5 $"ClaraNet" off \
  367. 6 $"OpenNIC 1" off \
  368. 7 $"OpenNIC 2" off \
  369. 8 $"OpenNIC 3" off \
  370. 9 $"OpenNIC 4" off \
  371. 10 $"OpenNIC 5" off \
  372. 11 $"OpenNIC 6" off \
  373. 12 $"OpenNIC 7" off \
  374. 13 $"PowerNS" off \
  375. 14 $"ValiDOM" off \
  376. 15 $"Freie Unzensierte" off \
  377. 16 $"Google" off 2> $data
  378. sel=$?
  379. case $sel in
  380. 1) exit 1;;
  381. 255) exit 1;;
  382. esac
  383. case $(cat $data) in
  384. 1) NAMESERVER1='85.214.73.63'
  385. NAMESERVER2='213.73.91.35'
  386. ;;
  387. 2) NAMESERVER1='87.118.100.175'
  388. NAMESERVER2='94.75.228.29'
  389. ;;
  390. 3) NAMESERVER1='85.25.251.254'
  391. NAMESERVER2='2.141.58.13'
  392. ;;
  393. 4) NAMESERVER1='213.73.91.35'
  394. NAMESERVER2='85.214.73.63'
  395. ;;
  396. 5) NAMESERVER1='212.82.225.7'
  397. NAMESERVER2='212.82.226.212'
  398. ;;
  399. 6) NAMESERVER1='58.6.115.42'
  400. NAMESERVER2='58.6.115.43'
  401. ;;
  402. 7) NAMESERVER1='119.31.230.42'
  403. NAMESERVER2='200.252.98.162'
  404. ;;
  405. 8) NAMESERVER1='217.79.186.148'
  406. NAMESERVER2='81.89.98.6'
  407. ;;
  408. 9) NAMESERVER1='78.159.101.37'
  409. NAMESERVER2='203.167.220.153'
  410. ;;
  411. 10) NAMESERVER1='82.229.244.191'
  412. NAMESERVER2='82.229.244.191'
  413. ;;
  414. 11) NAMESERVER1='216.87.84.211'
  415. NAMESERVER2='66.244.95.20'
  416. ;;
  417. 12) NAMESERVER1='207.192.69.155'
  418. NAMESERVER2='72.14.189.120'
  419. ;;
  420. 13) NAMESERVER1='194.145.226.26'
  421. NAMESERVER2='77.220.232.44'
  422. ;;
  423. 14) NAMESERVER1='78.46.89.147'
  424. NAMESERVER2='88.198.75.145'
  425. ;;
  426. 15) NAMESERVER1='85.25.149.144'
  427. NAMESERVER2='87.106.37.196'
  428. ;;
  429. 16) NAMESERVER1='8.8.8.8'
  430. NAMESERVER2='4.4.4.4'
  431. ;;
  432. 255) exit 1;;
  433. esac
  434. save_configuration_values
  435. else
  436. # as defaults for a minimal install process these settings are debatable
  437. NAMESERVER1='85.214.73.63'
  438. NAMESERVER2='213.73.91.35'
  439. fi
  440. }
  441. function choose_debian_repo {
  442. if [[ $MINIMAL_INSTALL == "no" ]]; then
  443. data=$(tempfile 2>/dev/null)
  444. trap "rm -f $data" 0 1 2 5 15
  445. dialog --backtitle $"Freedombone Configuration" \
  446. --radiolist $"Where to download Debian packages from:" 25 45 49 \
  447. 1 $"Australia" off \
  448. 2 $"Austria" off \
  449. 3 $"Belarus" off \
  450. 4 $"Belgium" off \
  451. 5 $"Bosnia and Herzegovina" off \
  452. 6 $"Brazil" off \
  453. 7 $"Bulgaria" off \
  454. 8 $"Canada" off \
  455. 9 $"Chile" off \
  456. 10 $"China" off \
  457. 11 $"Croatia" off \
  458. 12 $"Czech Republic" off \
  459. 13 $"Denmark" off \
  460. 14 $"El Salvador" off \
  461. 15 $"Estonia" off \
  462. 16 $"Finland" off \
  463. 17 $"France 1" off \
  464. 18 $"France 2" off \
  465. 19 $"Germany 1" off \
  466. 20 $"Germany 2" off \
  467. 21 $"Greece" off \
  468. 22 $"Hungary" off \
  469. 23 $"Iceland" off \
  470. 24 $"Iran" off \
  471. 25 $"Ireland" off \
  472. 26 $"Italy" off \
  473. 27 $"Japan" off \
  474. 28 $"Korea" off \
  475. 29 $"Lithuania" off \
  476. 30 $"Mexico" off \
  477. 31 $"Netherlands" off \
  478. 32 $"New Caledonia" off \
  479. 33 $"New Zealand" off \
  480. 34 $"Norway" off \
  481. 35 $"Poland" off \
  482. 36 $"Portugal" off \
  483. 37 $"Romania" off \
  484. 38 $"Russia" off \
  485. 39 $"Slovakia" off \
  486. 40 $"Slovenia" off \
  487. 41 $"Spain" off \
  488. 42 $"Sweden" off \
  489. 43 $"Switzerland" off \
  490. 44 $"Taiwan" off \
  491. 45 $"Thailand" off \
  492. 46 $"Turkey" off \
  493. 47 $"Ukraine" off \
  494. 48 $"United Kingdom" off \
  495. 49 $"United States" on 2> $data
  496. sel=$?
  497. case $sel in
  498. 1) exit 1;;
  499. 255) exit 1;;
  500. esac
  501. case $(cat $data) in
  502. 1) DEBIAN_REPO='ftp.au.debian.org';;
  503. 2) DEBIAN_REPO='ftp.at.debian.org';;
  504. 3) DEBIAN_REPO='ftp.by.debian.org';;
  505. 4) DEBIAN_REPO='ftp.be.debian.org';;
  506. 5) DEBIAN_REPO='ftp.ba.debian.org';;
  507. 6) DEBIAN_REPO='ftp.br.debian.org';;
  508. 7) DEBIAN_REPO='ftp.bg.debian.org';;
  509. 8) DEBIAN_REPO='ftp.ca.debian.org';;
  510. 9) DEBIAN_REPO='ftp.cl.debian.org';;
  511. 10) DEBIAN_REPO='ftp.cn.debian.org';;
  512. 11) DEBIAN_REPO='ftp.hr.debian.org';;
  513. 12) DEBIAN_REPO='ftp.cz.debian.org';;
  514. 13) DEBIAN_REPO='ftp.dk.debian.org';;
  515. 14) DEBIAN_REPO='ftp.sv.debian.org';;
  516. 15) DEBIAN_REPO='ftp.ee.debian.org';;
  517. 16) DEBIAN_REPO='ftp.fi.debian.org';;
  518. 17) DEBIAN_REPO='ftp2.fr.debian.org';;
  519. 18) DEBIAN_REPO='ftp.fr.debian.org';;
  520. 19) DEBIAN_REPO='ftp2.de.debian.org';;
  521. 20) DEBIAN_REPO='ftp.de.debian.org';;
  522. 21) DEBIAN_REPO='ftp.gr.debian.org';;
  523. 22) DEBIAN_REPO='ftp.hu.debian.org';;
  524. 23) DEBIAN_REPO='ftp.is.debian.org';;
  525. 24) DEBIAN_REPO='ftp.ir.debian.org';;
  526. 25) DEBIAN_REPO='ftp.ie.debian.org';;
  527. 26) DEBIAN_REPO='ftp.it.debian.org';;
  528. 27) DEBIAN_REPO='ftp.jp.debian.org';;
  529. 28) DEBIAN_REPO='ftp.kr.debian.org';;
  530. 29) DEBIAN_REPO='ftp.lt.debian.org';;
  531. 30) DEBIAN_REPO='ftp.mx.debian.org';;
  532. 31) DEBIAN_REPO='ftp.nl.debian.org';;
  533. 32) DEBIAN_REPO='ftp.nc.debian.org';;
  534. 33) DEBIAN_REPO='ftp.nz.debian.org';;
  535. 34) DEBIAN_REPO='ftp.no.debian.org';;
  536. 35) DEBIAN_REPO='ftp.pl.debian.org';;
  537. 36) DEBIAN_REPO='ftp.pt.debian.org';;
  538. 37) DEBIAN_REPO='ftp.ro.debian.org';;
  539. 38) DEBIAN_REPO='ftp.ru.debian.org';;
  540. 39) DEBIAN_REPO='ftp.sk.debian.org';;
  541. 40) DEBIAN_REPO='ftp.si.debian.org';;
  542. 41) DEBIAN_REPO='ftp.es.debian.org';;
  543. 42) DEBIAN_REPO='ftp.se.debian.org';;
  544. 43) DEBIAN_REPO='ftp.ch.debian.org';;
  545. 44) DEBIAN_REPO='ftp.tw.debian.org';;
  546. 45) DEBIAN_REPO='ftp.th.debian.org';;
  547. 46) DEBIAN_REPO='ftp.tr.debian.org';;
  548. 47) DEBIAN_REPO='ftp.ua.debian.org';;
  549. 48) DEBIAN_REPO='ftp.uk.debian.org';;
  550. 49) DEBIAN_REPO='ftp.us.debian.org';;
  551. 255) exit 1;;
  552. esac
  553. save_configuration_values
  554. else
  555. DEBIAN_REPO='ftp.de.debian.org'
  556. fi
  557. }
  558. function choose_rng {
  559. if [[ $MINIMAL_INSTALL == "no" ]]; then
  560. data=$(tempfile 2>/dev/null)
  561. trap "rm -f $data" 0 1 2 5 15
  562. if [[ $INSTALLING_ON_BBB != "yes" ]]; then
  563. dialog --backtitle $"Freedombone Configuration" \
  564. --radiolist $"Type of Random Number Generator:" 10 40 2 \
  565. 1 Haveged on \
  566. 2 OneRNG off 2> $data
  567. sel=$?
  568. case $sel in
  569. 1) exit 1;;
  570. 255) exit 1;;
  571. esac
  572. case $(cat $data) in
  573. 2) HWRNG_TYPE="onerng"
  574. dialog --title $"OneRNG Device" \
  575. --msgbox $"Please ensure that the OneRNG device is disconnected. You can reconnect it later during the installation" 8 60
  576. ;;
  577. 255) exit 1;;
  578. esac
  579. else
  580. HWRNG_TYPE="beaglebone"
  581. fi
  582. save_configuration_values
  583. fi
  584. }
  585. function choose_social_key_management {
  586. if [[ $MINIMAL_INSTALL == "no" ]]; then
  587. interactive_gpg
  588. data=$(tempfile 2>/dev/null)
  589. trap "rm -f $data" 0 1 2 5 15
  590. 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."
  591. if [[ $(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
  592. dialog --title $"Social Key Management" \
  593. --backtitle $"Freedombone Configuration" \
  594. --yesno "$SOCIAL_KEY_STR" 15 60
  595. else
  596. dialog --title $"Social Key Management" \
  597. --backtitle $"Freedombone Configuration" \
  598. --defaultno \
  599. --yesno "$SOCIAL_KEY_STR" 15 60
  600. fi
  601. sel=$?
  602. case $sel in
  603. 0) ENABLE_SOCIAL_KEY_MANAGEMENT="yes";;
  604. 255) exit 1;;
  605. esac
  606. save_configuration_values
  607. else
  608. # enable for the minimal case
  609. ENABLE_SOCIAL_KEY_MANAGEMENT="yes"
  610. fi
  611. }
  612. function choose_beaglebone_options {
  613. if [[ $MINIMAL_INSTALL == "no" ]]; then
  614. if [[ $(grep "INSTALLING_ON_BBB" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
  615. dialog --title $"Install Target" \
  616. --backtitle $"Freedombone Configuration" \
  617. --yesno $"\nAre you installing onto a Beaglebone Black?" 7 60
  618. else
  619. dialog --title $"Install Target" \
  620. --backtitle $"Freedombone Configuration" \
  621. --defaultno \
  622. --yesno $"\nAre you installing onto a Beaglebone Black?" 7 60
  623. fi
  624. sel=$?
  625. case $sel in
  626. 0) INSTALLING_ON_BBB="yes";;
  627. 1) INSTALLING_ON_BBB="no";;
  628. 255) exit 1;;
  629. esac
  630. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  631. USB_DRIVE=/dev/sda1
  632. fi
  633. save_configuration_values
  634. fi
  635. }
  636. function choose_username {
  637. if [ -d /home/$GENERIC_IMAGE_USERNAME ]; then
  638. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  639. echo 'Cannot find the password file for the admin user'
  640. exit 62753
  641. fi
  642. # when installing from an image which comes with a known default user account
  643. SELECTED_USERNAME=
  644. while [ ! $SELECTED_USERNAME ]
  645. do
  646. if [ ! $SELECTED_USERNAME ]; then
  647. SELECTED_USERNAME=$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')
  648. fi
  649. data=$(tempfile 2>/dev/null)
  650. trap "rm -f $data" 0 1 2 5 15
  651. dialog --backtitle $"Freedombone Configuration" \
  652. --title $"Username" \
  653. --inputbox $"Set your username for the system\n\nYour username should not contain any spaces" 12 60 "$SELECTED_USERNAME" 2> $data
  654. sel=$?
  655. case $sel in
  656. 0) possible_username=$(cat $data)
  657. SELECTED_USERNAME=
  658. if [[ $possible_username != *' '* && $possible_username != *'/'* && $possible_username != *'\'* && $possible_username != *'*'* ]]; then
  659. if [ $possible_username ]; then
  660. if [ ${#possible_username} -gt 1 ]; then
  661. if [[ $possible_username != $GENERIC_IMAGE_USERNAME ]]; then
  662. MY_USERNAME=$(cat $data)
  663. useradd -m -s /bin/bash $MY_USERNAME
  664. if [ -d /home/$MY_USERNAME ]; then
  665. echo "${MY_USERNAME}:$(printf `cat $IMAGE_PASSWORD_FILE`)" | chpasswd
  666. # Add the user as a sudoer - they will be the new admin user
  667. if ! grep -q "$MY_USERNAME ALL=(ALL) ALL" /etc/sudoers; then
  668. echo "$MY_USERNAME ALL=(ALL) ALL" >> /etc/sudoers
  669. # remove the generic image admin user from sudoers
  670. sed -i "s|${GENERIC_IMAGE_USERNAME}.*||g" /etc/sudoers
  671. fi
  672. break
  673. fi
  674. fi
  675. fi
  676. fi
  677. fi
  678. ;;
  679. 1) exit 1;;
  680. 255) exit 1;;
  681. esac
  682. done
  683. else
  684. no_of_users=$(find /home/* -maxdepth 0 -type d | wc -l)
  685. if [ $no_of_users -eq 1 ]; then
  686. # only a single user on the system
  687. MY_USERNAME=$(ls /home)
  688. else
  689. # select one from a number of users
  690. select_user
  691. if [ ! $SELECTED_USERNAME ]; then
  692. echo $'No username selected'
  693. exit 72589
  694. fi
  695. MY_USERNAME="$SELECTED_USERNAME"
  696. fi
  697. fi
  698. if [ ! $MY_USERNAME ]; then
  699. echo $'No user account was selected'
  700. exit 64398
  701. fi
  702. if [[ $MY_USERNAME == '-f' ]]; then
  703. echo $'No user account was selected'
  704. exit 8347
  705. fi
  706. if [[ $MY_USERNAME == 'debian' || $MY_USERNAME == 'fbone' ]]; then
  707. echo $"Don't use the default user account"
  708. exit 9341
  709. fi
  710. if [ ! -d /home/$MY_USERNAME ]; then
  711. echo $"The directory /home/$MY_USERNAME does not exist"
  712. exit 6437
  713. fi
  714. save_configuration_values
  715. }
  716. function choose_full_name {
  717. valid_name=
  718. while [ ! $valid_name ]
  719. do
  720. data=$(tempfile 2>/dev/null)
  721. trap "rm -f $data" 0 1 2 5 15
  722. dialog --backtitle $"Freedombone Configuration" \
  723. --inputbox $"Your full name (or nick)" 10 30 "$(grep 'MY_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  724. sel=$?
  725. case $sel in
  726. 0) possible_name=$(cat $data)
  727. if [ "$possible_name" ]; then
  728. if [ ${#possible_name} -gt 1 ]; then
  729. valid_name="$possible_name"
  730. MY_NAME="$possible_name"
  731. break;
  732. fi
  733. fi
  734. ;;
  735. 1) exit 1;;
  736. 255) exit 1;;
  737. esac
  738. done
  739. save_configuration_values
  740. }
  741. function choose_system_variant {
  742. available_variants_list=()
  743. variants_list=$(available_system_variants)
  744. varslist=""
  745. n=1
  746. vars_index=0
  747. for a in "${available_variants_list[@]}"
  748. do
  749. varstate='off'
  750. if [[ "$a" == $'full' || "$a" == $'Full' ]]; then
  751. varstate='on'
  752. fi
  753. varslist="$varslist $n $a $varstate"
  754. n=$[n+1]
  755. vars_index=$[vars_index+1]
  756. done
  757. variant_choice=$(dialog --stdout --backtitle $"Freedombone Configuration" \
  758. --title $"Type of Installation" \
  759. --radiolist $'Choose:' \
  760. 27 40 20 $varslist)
  761. variant_choice=$((variant_choice - 1))
  762. export SYSTEM_TYPE=${variants_list[$variant_choice]}
  763. save_configuration_values
  764. write_config_param "SYSTEM_TYPE" "$SYSTEM_TYPE"
  765. }
  766. function validate_freedns_code {
  767. freedns_code="$1"
  768. 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."
  769. if [[ "$freedns_code" == *"."* || "$freedns_code" == "http"* || "$freedns_code" == *"wget "* || "$freedns_code" == *" "* ]]; then
  770. dialog --title $"Invalid FreeDNS Code" --msgbox "$FREEDNS_MESSAGE" 10 70
  771. VALID_CODE=
  772. fi
  773. if [ ${#freedns_code} -lt 30 ]; then
  774. dialog --title $"Invalid FreeDNS Code" --msgbox $'FreeDNS code is too short. Did you enter the entire code?' 6 70
  775. VALID_CODE=
  776. fi
  777. VALID_CODE='yes'
  778. }
  779. # Get the commandline options
  780. while [[ $# > 1 ]]
  781. do
  782. key="$1"
  783. case $key in
  784. -h|--help)
  785. show_help
  786. ;;
  787. # Configuration filename
  788. -f|--filename)
  789. shift
  790. CONFIGURATION_FILE="$1"
  791. ;;
  792. # Minimum password length
  793. -m|--min)
  794. shift
  795. MINIMUM_PASSWORD_LENGTH="$1"
  796. ;;
  797. # Freedombone website
  798. -w|--www)
  799. shift
  800. FREEDOMBONE_WEBSITE="$1"
  801. ;;
  802. --minimal)
  803. shift
  804. MINIMAL_INSTALL="$1"
  805. ;;
  806. -o|--onion)
  807. shift
  808. ONION_ONLY="$1"
  809. ;;
  810. *)
  811. # unknown option
  812. ;;
  813. esac
  814. shift
  815. done
  816. # test a domain name to see if it's valid
  817. function validate_domain_name {
  818. # count the number of dots in the domain name
  819. dots=${TEST_DOMAIN_NAME//[^.]}
  820. no_of_dots=${#dots}
  821. if (( no_of_dots > 3 )); then
  822. TEST_DOMAIN_NAME="The domain $TEST_DOMAIN_NAME has too many subdomains. It should be of the type w.x.y.z, x.y.z or y.z"
  823. fi
  824. if (( no_of_dots == 0 )); then
  825. TEST_DOMAIN_NAME="The domain $TEST_DOMAIN_NAME has no top level domain. It should be of the type w.x.y.z, x.y.z or y.z"
  826. fi
  827. }
  828. function interactive_gpg_from_remote {
  829. REMOTE_SERVERS_LIST=/home/$MY_USERNAME/keyshareservers.txt
  830. # get a list of remote servers
  831. ${PROJECT_NAME}-remote -u $MY_USERNAME -l $REMOTE_SERVERS_LIST -t "Remote server"
  832. if [ ! -f $REMOTE_SERVERS_LIST ]; then
  833. dialog --title $"Encryption keys" --msgbox $'Error obtaining server list' 6 70
  834. return 1
  835. fi
  836. # check the number of entries in the file
  837. no_of_servers=$(cat $REMOTE_SERVERS_LIST | wc -l)
  838. if (( no_of_servers < 3 )); then
  839. dialog --title $"Encryption keys" \
  840. --msgbox $'There must be at least three servers to recover the key' 6 70
  841. return 2
  842. fi
  843. # try to recover the key from the servers
  844. apt-get -y install libgfshare-bin gnupg
  845. ${PROJECT_NAME}-recoverkey -u $MY_USERNAME -l $REMOTE_SERVERS_LIST
  846. if [ ! "$?" = "0" ]; then
  847. dialog --title $"Encryption keys" --msgbox $'Your key could not be recovered' 6 70
  848. return 3
  849. fi
  850. dialog --title $"Encryption keys" --msgbox $'Your key has been recovered' 6 70
  851. return 0
  852. }
  853. function reconstruct_key {
  854. if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
  855. return
  856. fi
  857. cd /home/$MY_USERNAME/.gnupg_fragments
  858. no_of_shares=$(ls -afq keyshare.asc.* | wc -l)
  859. if (( no_of_shares < 4 )); then
  860. dialog --title $"Encryption keys" --msgbox $'Not enough fragments to reconstruct the key' 6 70
  861. exit 7348
  862. fi
  863. apt-get -y install libgfshare-bin gnupg
  864. gfcombine /home/$MY_USERNAME/.gnupg_fragments/keyshare*
  865. if [ ! "$?" = "0" ]; then
  866. dialog --title $"Encryption keys" --msgbox $'Unable to reconstruct the key' 6 70
  867. exit 7348
  868. fi
  869. KEYS_FILE=/home/$MY_USERNAME/.gnupg_fragments/keyshare.asc
  870. if [ ! -f $KEYS_FILE ]; then
  871. dialog --title $"Encryption keys" --msgbox $'Unable to reconstruct the key' 6 70
  872. fi
  873. su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME
  874. if [ ! "$?" = "0" ]; then
  875. echo $'Unable to import gpg key'
  876. shred -zu $KEYS_FILE
  877. rm -rf /home/$MY_USERNAME/.tempgnupg
  878. exit 9654
  879. fi
  880. shred -zu $KEYS_FILE
  881. dialog --title $"Encryption keys" --msgbox $'Key has been reconstructed' 6 70
  882. }
  883. function interactive_gpg_from_usb {
  884. dialog --title $"Encryption keys" \
  885. --msgbox $'Plug in a USB drive containing a copy of your full key or key fragment' 6 70
  886. HOME_DIR=/home/$MY_USERNAME
  887. GPG_LOADING="yes"
  888. SSH_IMPORTED="no"
  889. GPG_CTR=0
  890. while [[ $GPG_LOADING == "yes" ]]
  891. do
  892. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  893. GPG_USB_DRIVE='/dev/sda1'
  894. if [ ! -b $GPG_USB_DRIVE ]; then
  895. if (( GPG_CTR > 0 )); then
  896. reconstruct_key
  897. return 0
  898. fi
  899. dialog --title $"Encryption keys" --msgbox $'No USB drive found' 6 30
  900. exit 739836
  901. fi
  902. else
  903. GPG_USB_DRIVE='/dev/sdb1'
  904. if [ ! -b $GPG_USB_DRIVE ]; then
  905. GPG_USB_DRIVE='/dev/sdc1'
  906. if [ ! -b $GPG_USB_DRIVE ]; then
  907. GPG_USB_DRIVE='/dev/sdd1'
  908. if [ ! -b $GPG_USB_DRIVE ]; then
  909. if (( GPG_CTR > 0 )); then
  910. reconstruct_key
  911. return 0
  912. fi
  913. dialog --title $"Encryption keys" --msgbox $'No USB drive found' 6 30
  914. exit 27852
  915. fi
  916. fi
  917. fi
  918. fi
  919. GPG_USB_MOUNT='/mnt/usb'
  920. umount -f $GPG_USB_MOUNT
  921. if [ ! -d $GPG_USB_MOUNT ]; then
  922. mkdir -p $GPG_USB_MOUNT
  923. fi
  924. if [ -f /dev/mapper/encrypted_usb ]; then
  925. rm -rf /dev/mapper/encrypted_usb
  926. fi
  927. cryptsetup luksClose encrypted_usb
  928. cryptsetup luksOpen $GPG_USB_DRIVE encrypted_usb
  929. if [ "$?" = "0" ]; then
  930. GPG_USB_DRIVE=/dev/mapper/encrypted_usb
  931. fi
  932. mount $GPG_USB_DRIVE $GPG_USB_MOUNT
  933. if [ ! "$?" = "0" ]; then
  934. if (( GPG_CTR > 0 )); then
  935. rm -rf $GPG_USB_MOUNT
  936. reconstruct_key
  937. return 0
  938. fi
  939. dialog --title $"Encryption keys" \
  940. --msgbox $"There was a problem mounting the USB drive to $GPG_USB_MOUNT" 6 70
  941. rm -rf $GPG_USB_MOUNT
  942. exit 74393
  943. fi
  944. if [ ! -d $GPG_USB_MOUNT/.gnupg ]; then
  945. if [ ! -d $GPG_USB_MOUNT/.gnupg_fragments ]; then
  946. if (( GPG_CTR > 0 )); then
  947. umount -f $GPG_USB_MOUNT
  948. rm -rf $GPG_USB_MOUNT
  949. reconstruct_key
  950. return 0
  951. fi
  952. dialog --title $"Encryption keys" \
  953. --msgbox $"The directory $GPG_USB_MOUNT/.gnupg or $GPG_USB_MOUNT/.gnupg_fragments was not found" 6 70
  954. umount -f $GPG_USB_MOUNT
  955. rm -rf $GPG_USB_MOUNT
  956. exit 723814
  957. fi
  958. fi
  959. if [ -d $GPG_USB_MOUNT/.gnupg ]; then
  960. if [ ! -d $HOME_DIR/.gnupg ]; then
  961. mkdir $HOME_DIR/.gnupg
  962. fi
  963. cp -r $GPG_USB_MOUNT/.gnupg/* $HOME_DIR/.gnupg
  964. GPG_LOADING="no"
  965. dialog --title $"Encryption keys" \
  966. --msgbox $"GPG Keyring loaded to $HOME_DIR" 6 70
  967. else
  968. if [ ! -d $HOME_DIR/.gnupg_fragments ]; then
  969. mkdir $HOME_DIR/.gnupg_fragments
  970. fi
  971. cp -r $GPG_USB_MOUNT/.gnupg_fragments/* $HOME_DIR/.gnupg_fragments
  972. fi
  973. if [[ $SSH_IMPORTED == "no" ]]; then
  974. if [ -d $GPG_USB_MOUNT/.ssh ]; then
  975. if [ ! -d $HOME_DIR/.ssh ]; then
  976. mkdir $HOME_DIR/.ssh
  977. fi
  978. cp $GPG_USB_MOUNT/.ssh/* $HOME_DIR/.ssh
  979. dialog --title $"Encryption keys" \
  980. --msgbox $"ssh keys imported" 6 70
  981. SSH_IMPORTED="yes"
  982. fi
  983. fi
  984. umount -f $GPG_USB_MOUNT
  985. rm -rf $GPG_USB_MOUNT
  986. if [[ $GPG_LOADING == "yes" ]]; then
  987. dialog --title $"Encryption keys" \
  988. --msgbox $"Now remove the USB drive. Insert the next drive containing a key fragment, or select Ok to finish" 6 70
  989. fi
  990. GPG_CTR=$((GPG_CTR + 1))
  991. done
  992. }
  993. function interactive_gpg {
  994. GPG_CONFIGURED="no"
  995. while [[ $GPG_CONFIGURED != "yes" ]]
  996. do
  997. GPG_CONFIGURED="yes"
  998. data=$(tempfile 2>/dev/null)
  999. trap "rm -f $data" 0 1 2 5 15
  1000. dialog --backtitle $"Freedombone Configuration" \
  1001. --radiolist $"GPG/PGP keys for your system:" 13 70 3 \
  1002. 1 $"Generate new keys (new user)" on \
  1003. 2 $"Import keys from USB drive/s" off \
  1004. 3 $"Retrieve keys from friends servers" off 2> $data
  1005. sel=$?
  1006. case $sel in
  1007. 1) exit 1;;
  1008. 255) exit 2;;
  1009. esac
  1010. case $(cat $data) in
  1011. 1) if [ -d /home/${MY_USERNAME}/.gnupg ]; then
  1012. rm -rf /home/${MY_USERNAME}/.gnupg
  1013. fi
  1014. break;;
  1015. 2) interactive_gpg_from_usb
  1016. break;;
  1017. 3) interactive_gpg_from_remote
  1018. if [ ! "$?" = "0" ]; then
  1019. GPG_CONFIGURED="no"
  1020. fi;;
  1021. esac
  1022. done
  1023. }
  1024. function set_main_repo {
  1025. data=$(tempfile 2>/dev/null)
  1026. trap "rm -f $data" 0 1 2 5 15
  1027. dialog --backtitle $"Freedombone Control Panel" \
  1028. --title $"Main Repository (Mirrors)" \
  1029. --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 \
  1030. $"URL:" 1 1 "$FRIENDS_MIRRORS_SERVER" 1 18 40 18 \
  1031. $"SSH Port:" 2 1 "$FRIENDS_MIRRORS_SSH_PORT" 2 18 10 10000 \
  1032. $"Password:" 3 1 "$FRIENDS_MIRRORS_PASSWORD" 3 18 40 10000 \
  1033. 2> $data
  1034. sel=$?
  1035. case $sel in
  1036. 1) return;;
  1037. 255) return;;
  1038. esac
  1039. new_mirrors_url=$(cat $data | sed -n 1p)
  1040. new_mirrors_ssh_port=$(cat $data | sed -n 2p)
  1041. new_mirrors_password=$(cat $data | sed -n 3p)
  1042. if [ ${#new_mirrors_url} -lt 2 ]; then
  1043. return
  1044. fi
  1045. if [ ${#new_mirrors_ssh_port} -lt 1 ]; then
  1046. return
  1047. fi
  1048. if [ ${#new_mirrors_password} -lt 10 ]; then
  1049. dialog --title $"Main Repository" \
  1050. --msgbox $'Mirrors password was too short. Should be at least 10 characters.' 6 40
  1051. return
  1052. fi
  1053. if [[ $new_mirrors_url == *"."* ]]; then
  1054. FRIENDS_MIRRORS_SERVER=$new_mirrors_url
  1055. FRIENDS_MIRRORS_SSH_PORT=$new_mirrors_ssh_port
  1056. FRIENDS_MIRRORS_PASSWORD=$new_mirrors_password
  1057. dialog --title $"Main Repository" \
  1058. --msgbox $"Main repository set to $FRIENDS_MIRRORS_SERVER" 6 60
  1059. fi
  1060. save_configuration_values
  1061. }
  1062. function interactive_select_language {
  1063. data=$(tempfile 2>/dev/null)
  1064. trap "rm -f $data" 0 1 2 5 15
  1065. dialog --backtitle $"Freedombone Configuration" \
  1066. --radiolist $"Select your language:" 26 40 24 \
  1067. 1 $"Afrikaans" off \
  1068. 2 $"Albanian" off \
  1069. 3 $"Arabic" off \
  1070. 4 $"Basque" off \
  1071. 5 $"Belarusian" off \
  1072. 6 $"Bosnian" off \
  1073. 7 $"Bulgarian" off \
  1074. 8 $"Catalan" off \
  1075. 9 $"Croatian" off \
  1076. 10 $"Chinese (Simplified)" off \
  1077. 11 $"Chinese (Traditional)" off \
  1078. 12 $"Czech" off \
  1079. 13 $"Danish" off \
  1080. 14 $"Dutch" off \
  1081. 15 $"English" on \
  1082. 16 $"English (US)" off \
  1083. 17 $"Estonian" off \
  1084. 18 $"Farsi" off \
  1085. 19 $"Filipino" off \
  1086. 20 $"Finnish" off \
  1087. 21 $"French" off \
  1088. 22 $"French (Canada)" off \
  1089. 23 $"Gaelic" off \
  1090. 24 $"Gallego" off \
  1091. 25 $"Georgian" off \
  1092. 26 $"German" off \
  1093. 27 $"German (Personal)" off \
  1094. 28 $"Greek" off \
  1095. 29 $"Gujarati" off \
  1096. 30 $"Hebrew" off \
  1097. 31 $"Hindi" off \
  1098. 32 $"Hungarian" off \
  1099. 33 $"Icelandic" off \
  1100. 34 $"Indonesian" off \
  1101. 35 $"Italian" off \
  1102. 36 $"Japanese" off \
  1103. 37 $"Kannada" off \
  1104. 38 $"Khmer" off \
  1105. 39 $"Korean" off \
  1106. 40 $"Lao" off \
  1107. 41 $"Lithuanian" off \
  1108. 42 $"Latvian" off \
  1109. 43 $"Malayalam" off \
  1110. 44 $"Malaysian" off \
  1111. 45 $"Maori (Ngai Tahu)" off \
  1112. 46 $"Maori (Waikoto Uni)" off \
  1113. 47 $"Mongolian" off \
  1114. 48 $"Norwegian" off \
  1115. 49 $"Norwegian (Primary)" off \
  1116. 50 $"Nynorsk" off \
  1117. 51 $"Polish" off \
  1118. 52 $"Portuguese" off \
  1119. 53 $"Portuguese (Brazil)" off \
  1120. 54 $"Romanian" off \
  1121. 55 $"Russian" off \
  1122. 56 $"Samoan" off \
  1123. 57 $"Serbian" off \
  1124. 58 $"Slovak" off \
  1125. 59 $"Slovenian" off \
  1126. 60 $"Somali" off \
  1127. 61 $"Spanish (International)" off \
  1128. 62 $"Swedish" off \
  1129. 63 $"Tagalog" off \
  1130. 64 $"Tamil" off \
  1131. 65 $"Thai" off \
  1132. 66 $"Turkish" off \
  1133. 67 $"Ukrainian" off \
  1134. 68 $"Vietnamese" off 2> $data
  1135. sel=$?
  1136. case $sel in
  1137. 1) exit 1;;
  1138. 255) exit 1;;
  1139. esac
  1140. case $(cat $data) in
  1141. 1) DEFAULT_LANGUAGE='af_ZA.UTF-8';;
  1142. 2) DEFAULT_LANGUAGE='sq_AL.UTF-8';;
  1143. 3) DEFAULT_LANGUAGE='ar_SA.UTF-8';;
  1144. 4) DEFAULT_LANGUAGE='eu_ES.UTF-8';;
  1145. 5) DEFAULT_LANGUAGE='be_BY.UTF-8';;
  1146. 6) DEFAULT_LANGUAGE='bs_BA.UTF-8';;
  1147. 7) DEFAULT_LANGUAGE='bg_BG.UTF-8';;
  1148. 8) DEFAULT_LANGUAGE='ca_ES.UTF-8';;
  1149. 9) DEFAULT_LANGUAGE='hr_HR.UTF-8';;
  1150. 10) DEFAULT_LANGUAGE='zh_CN.UTF-8';;
  1151. 11) DEFAULT_LANGUAGE='zh_TW.UTF-8';;
  1152. 12) DEFAULT_LANGUAGE='cs_CZ.UTF-8';;
  1153. 13) DEFAULT_LANGUAGE='da_DK.UTF-8';;
  1154. 14) DEFAULT_LANGUAGE='nl_NL.UTF-8';;
  1155. 15) DEFAULT_LANGUAGE='en.UTF-8';;
  1156. 16) DEFAULT_LANGUAGE='en_us.UTF-8';;
  1157. 17) DEFAULT_LANGUAGE='et_EE.UTF-8';;
  1158. 18) DEFAULT_LANGUAGE='fa_IR.UTF-8';;
  1159. 19) DEFAULT_LANGUAGE='ph_PH.UTF-8';;
  1160. 20) DEFAULT_LANGUAGE='fi_FI.UTF-8';;
  1161. 21) DEFAULT_LANGUAGE='fr_FR.UTF-8';;
  1162. 22) DEFAULT_LANGUAGE='fr_CA.UTF-8';;
  1163. 23) DEFAULT_LANGUAGE='ga.UTF-8';;
  1164. 24) DEFAULT_LANGUAGE='l_ES.UTF-8';;
  1165. 25) DEFAULT_LANGUAGE='ka_GE.UTF-8';;
  1166. 26) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  1167. 27) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  1168. 28) DEFAULT_LANGUAGE='el_GR.UTF-8';;
  1169. 29) DEFAULT_LANGUAGE='gu.UTF-8';;
  1170. 30) DEFAULT_LANGUAGE='he_IL.utf8';;
  1171. 31) DEFAULT_LANGUAGE='hi_IN.UTF-8';;
  1172. 32) DEFAULT_LANGUAGE='hu.UTF-8';;
  1173. 33) DEFAULT_LANGUAGE='is_IS.UTF-8';;
  1174. 34) DEFAULT_LANGUAGE='id_ID.UTF-8';;
  1175. 35) DEFAULT_LANGUAGE='it_IT.UTF-8';;
  1176. 36) DEFAULT_LANGUAGE='ja_JP.UTF-8';;
  1177. 37) DEFAULT_LANGUAGE='kn_IN.UTF-8';;
  1178. 38) DEFAULT_LANGUAGE='km_KH.UTF-8';;
  1179. 39) DEFAULT_LANGUAGE='ko_KR.UTF-8';;
  1180. 40) DEFAULT_LANGUAGE='lo_LA.UTF-8';;
  1181. 41) DEFAULT_LANGUAGE='lt_LT.UTF-8';;
  1182. 42) DEFAULT_LANGUAGE='lat.UTF-8';;
  1183. 43) DEFAULT_LANGUAGE='ml_IN.UTF-8';;
  1184. 44) DEFAULT_LANGUAGE='ms_MY.UTF-8';;
  1185. 45) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  1186. 46) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  1187. 47) DEFAULT_LANGUAGE='mn.UTF-8';;
  1188. 48) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  1189. 49) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  1190. 50) DEFAULT_LANGUAGE='nn_NO.UTF-8';;
  1191. 51) DEFAULT_LANGUAGE='pl.UTF-8';;
  1192. 52) DEFAULT_LANGUAGE='pt_PT.UTF-8';;
  1193. 53) DEFAULT_LANGUAGE='pt_BR.UTF-8';;
  1194. 54) DEFAULT_LANGUAGE='ro_RO.UTF-8';;
  1195. 55) DEFAULT_LANGUAGE='ru_RU.UTF-8';;
  1196. 56) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  1197. 57) DEFAULT_LANGUAGE='sr_CS.UTF-8';;
  1198. 58) DEFAULT_LANGUAGE='sk_SK.UTF-8';;
  1199. 59) DEFAULT_LANGUAGE='sl_SI.UTF-8';;
  1200. 60) DEFAULT_LANGUAGE='so_SO.UTF-8';;
  1201. 61) DEFAULT_LANGUAGE='es_ES.UTF-8';;
  1202. 62) DEFAULT_LANGUAGE='sv_SE.UTF-8';;
  1203. 63) DEFAULT_LANGUAGE='tl.UTF-8';;
  1204. 64) DEFAULT_LANGUAGE='ta_IN.UTF-8';;
  1205. 65) DEFAULT_LANGUAGE='th_TH.UTF-8';;
  1206. 66) DEFAULT_LANGUAGE='tr_TR.UTF-8';;
  1207. 67) DEFAULT_LANGUAGE='uk_UA.UTF-8';;
  1208. 68) DEFAULT_LANGUAGE='vi_VN.UTF-8';;
  1209. esac
  1210. save_configuration_values
  1211. update-locale LANG=${DEFAULT_LANGUAGE}
  1212. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  1213. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  1214. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  1215. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  1216. }
  1217. function select_user {
  1218. SELECTED_USERNAME=
  1219. users_array=($(ls /home))
  1220. delete=(mirrors git)
  1221. for del in ${delete[@]}
  1222. do
  1223. users_array=(${users_array[@]/$del})
  1224. done
  1225. i=0
  1226. W=()
  1227. name=()
  1228. for u in ${users_array[@]}
  1229. do
  1230. i=$((i+1))
  1231. W+=($i "$u")
  1232. name+=("$u")
  1233. done
  1234. 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)
  1235. if [ $? -eq 0 ]; then
  1236. SELECTED_USERNAME="${name[$((user_index-1))]}"
  1237. fi
  1238. }
  1239. function interactive_config {
  1240. # create a temporary copy of the configuration file
  1241. # which can be used to pre-populate selections
  1242. if [ -f $CONFIGURATION_FILE ]; then
  1243. cp $CONFIGURATION_FILE temp.cfg
  1244. fi
  1245. interactive_select_language
  1246. if [[ $ONION_ONLY == "no" ]]; then
  1247. 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."
  1248. else
  1249. 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."
  1250. fi
  1251. dialog --title $"Freedombone" --msgbox "$INITIAL_MESSAGE" 15 50
  1252. choose_system_variant
  1253. set_main_repo
  1254. choose_username
  1255. choose_full_name
  1256. choose_beaglebone_options
  1257. choose_social_key_management
  1258. choose_rng
  1259. choose_debian_repo
  1260. choose_dns
  1261. ${PROJECT_NAME}-wifi --networksinteractive $WIFI_NETWORKS_FILE
  1262. choose_dynamic_dns
  1263. choose_static_ip
  1264. choose_default_domain_name
  1265. choose_email_address
  1266. install_apps interactive
  1267. # delete the temporary configuration file
  1268. if [ -f temp.cfg ]; then
  1269. shred -zu temp.cfg
  1270. fi
  1271. }
  1272. function show_result {
  1273. #clear
  1274. echo ''
  1275. echo -n $"Configuration filename:"
  1276. echo " $CONFIGURATION_FILE"
  1277. echo ''
  1278. echo $'Contents:'
  1279. echo ''
  1280. cat $CONFIGURATION_FILE
  1281. echo ''
  1282. }
  1283. if [ ! $CONFIGURATION_FILE ]; then
  1284. CONFIGURATION_FILE='freedombone.cfg'
  1285. fi
  1286. read_configuration_values
  1287. interactive_config
  1288. show_result
  1289. exit 0