freedombone-config 48KB

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