freedombone-config 49KB

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