freedombone-config 48KB

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