freedombone-config 87KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163
  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="http://freedombone.uk.to"
  39. # Contact details
  40. FREEDOMBONE_BITMESSAGE="BM-2cWuhmBvVdfrHhLoZTdspCkKeiTorUesSL"
  41. # Minimum number of characters in a password
  42. MINIMUM_PASSWORD_LENGTH=10
  43. # file containing new password
  44. IMAGE_PASSWORD_FILE=/root/login.txt
  45. # Different system variants which may be specified within
  46. # the SYSTEM_TYPE option
  47. VARIANT_FULL="full"
  48. VARIANT_WRITER="writer"
  49. VARIANT_CLOUD="cloud"
  50. VARIANT_CHAT="chat"
  51. VARIANT_MAILBOX="mailbox"
  52. VARIANT_NONMAILBOX="nonmailbox"
  53. VARIANT_SOCIAL="social"
  54. VARIANT_MEDIA="media"
  55. VARIANT_DEVELOPER="developer"
  56. VARIANT_MESH="mesh"
  57. VARIANT_MESH_USER="mesh-user"
  58. MY_USERNAME=
  59. DEFAULT_DOMAIN_NAME=
  60. DEFAULT_DOMAIN_CODE=
  61. MY_EMAIL_ADDRESS=
  62. SYSTEM_TYPE=
  63. INSTALLING_ON_BBB="no"
  64. DDNS_PROVIDER=
  65. DDNS_USERNAME=
  66. DDNS_PASSWORD=
  67. MY_NAME=
  68. LOCAL_NETWORK_STATIC_IP_ADDRESS=
  69. ROUTER_IP_ADDRESS=
  70. ENABLE_CJDNS=
  71. ENABLE_BATMAN=
  72. ENABLE_BABEL=
  73. DEBIAN_REPO=
  74. NAMESERVER1=
  75. NAMESERVER2=
  76. WIKI_TITLE=
  77. WIKI_DOMAIN_NAME=
  78. WIKI_CODE=
  79. MY_BLOG_TITLE=
  80. FULLBLOG_DOMAIN_NAME=
  81. FULLBLOG_CODE=
  82. OWNCLOUD_DOMAIN_NAME=
  83. OWNCLOUD_CODE=
  84. MEDIAGOBLIN_ENABLED='no'
  85. MEDIAGOBLIN_DOMAIN_NAME=
  86. MEDIAGOBLIN_CODE=
  87. HUBZILLA_DOMAIN_NAME=
  88. HUBZILLA_CODE=
  89. MICROBLOG_DOMAIN_NAME=
  90. MICROBLOG_CODE=
  91. MICROBLOG_WELCOME_MESSAGE=$"<h1>Welcome to \$MICROBLOG_DOMAIN_NAME – a federated microblog</h1><p>Another $PROJECT_NAME site</p>"
  92. MICROBLOG_BACKGROUND_IMAGE_URL=
  93. GIT_DOMAIN_NAME=
  94. GIT_CODE=
  95. MEDIAGOBLIN_DOMAIN_NAME=
  96. MEDIAGOBLIN_CODE=
  97. USB_DRIVE=/dev/sdb1
  98. HWRNG_TYPE=
  99. ENABLE_SOCIAL_KEY_MANAGEMENT=
  100. ESSID='mesh'
  101. BATMAN_CELLID='any'
  102. WIFI_CHANNEL=
  103. CONFIGURATION_FILE=
  104. DH_KEYLENGTH=
  105. MINIMAL_INSTALL="yes"
  106. DEFAULT_LANGUAGE='en_GB.UTF-8'
  107. ONION_ONLY="no"
  108. SELECTED_USERNAME=
  109. # Mirrors settings
  110. FRIENDS_MIRRORS_SERVER=
  111. FRIENDS_MIRRORS_SSH_PORT=2222
  112. FRIENDS_MIRRORS_PASSWORD=
  113. MY_MIRRORS_PASSWORD=
  114. VALID_CODE=
  115. function show_help {
  116. echo ''
  117. echo $"${PROJECT_NAME}-config -f [config filename] -m [min password length]"
  118. echo ''
  119. echo $'Creates an inventory of remote backup locations'
  120. echo ''
  121. echo ''
  122. echo $' -h --help Show help'
  123. echo $' -f --filename Configuration file (usually freedombone.cfg)'
  124. echo $' -m --min Minimum password length (characters)'
  125. echo $' -w --www Freedombone web site'
  126. echo $' -b --bm Freedombone support Bitmessage address'
  127. echo $' -o --onion [yes|no] Whether to only create .onion sites'
  128. echo $' --minimal [yes|no] For minimalistic "consumer grade" installs'
  129. echo ''
  130. exit 0
  131. }
  132. function validate_freedns_code {
  133. freedns_code="$1"
  134. 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."
  135. if [[ "$freedns_code" == *"."* || "$freedns_code" == "http"* || "$freedns_code" == *"wget "* || "$freedns_code" == *" "* ]]; then
  136. dialog --title $"Invalid FreeDNS Code" --msgbox "$FREEDNS_MESSAGE" 10 70
  137. VALID_CODE=
  138. fi
  139. if [ ${#freedns_code} -lt 30 ]; then
  140. dialog --title $"Invalid FreeDNS Code" --msgbox $'FreeDNS code is too short. Did you enter the entire code?' 6 70
  141. VALID_CODE=
  142. fi
  143. VALID_CODE='yes'
  144. }
  145. # Get the commandline options
  146. while [[ $# > 1 ]]
  147. do
  148. key="$1"
  149. case $key in
  150. -h|--help)
  151. show_help
  152. ;;
  153. # Configuration filename
  154. -f|--filename)
  155. shift
  156. CONFIGURATION_FILE="$1"
  157. ;;
  158. # Minimum password length
  159. -m|--min)
  160. shift
  161. MINIMUM_PASSWORD_LENGTH="$1"
  162. ;;
  163. # Freedombone website
  164. -w|--www)
  165. shift
  166. FREEDOMBONE_WEBSITE="$1"
  167. ;;
  168. # Bitmessage address for support
  169. -b|--bm)
  170. shift
  171. FREEDOMBONE_BITMESSAGE="$1"
  172. ;;
  173. --minimal)
  174. shift
  175. MINIMAL_INSTALL="$1"
  176. ;;
  177. -o|--onion)
  178. shift
  179. ONION_ONLY="$1"
  180. ;;
  181. *)
  182. # unknown option
  183. ;;
  184. esac
  185. shift
  186. done
  187. function save_configuration_file {
  188. if [ ! $CONFIGURATION_FILE ]; then
  189. CONFIGURATION_FILE='freedombone.cfg'
  190. fi
  191. echo "MY_USERNAME=$MY_USERNAME" > $CONFIGURATION_FILE
  192. echo "DEFAULT_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME" >> $CONFIGURATION_FILE
  193. if [ $DEFAULT_DOMAIN_CODE ]; then
  194. echo "DEFAULT_DOMAIN_CODE=$DEFAULT_DOMAIN_CODE" >> $CONFIGURATION_FILE
  195. fi
  196. echo "SYSTEM_TYPE=$SYSTEM_TYPE" >> $CONFIGURATION_FILE
  197. echo "INSTALLING_ON_BBB=$INSTALLING_ON_BBB" >> $CONFIGURATION_FILE
  198. echo "USB_DRIVE=$USB_DRIVE" >> $CONFIGURATION_FILE
  199. echo "DDNS_PROVIDER=$DDNS_PROVIDER" >> $CONFIGURATION_FILE
  200. echo "DDNS_USERNAME=$DDNS_USERNAME" >> $CONFIGURATION_FILE
  201. echo "DDNS_PASSWORD=$DDNS_PASSWORD" >> $CONFIGURATION_FILE
  202. echo "DEFAULT_LANGUAGE=$DEFAULT_LANGUAGE" >> $CONFIGURATION_FILE
  203. if [ "$MY_NAME" ]; then
  204. echo "MY_NAME=$MY_NAME" >> $CONFIGURATION_FILE
  205. fi
  206. echo "MY_EMAIL_ADDRESS=$MY_EMAIL_ADDRESS" >> $CONFIGURATION_FILE
  207. if [ $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  208. echo "LOCAL_NETWORK_STATIC_IP_ADDRESS=$LOCAL_NETWORK_STATIC_IP_ADDRESS" >> $CONFIGURATION_FILE
  209. echo "ROUTER_IP_ADDRESS=$ROUTER_IP_ADDRESS" >> $CONFIGURATION_FILE
  210. fi
  211. if [ $ENABLE_CJDNS ]; then
  212. echo "ENABLE_CJDNS=$ENABLE_CJDNS" >> $CONFIGURATION_FILE
  213. fi
  214. if [ $ENABLE_BATMAN ]; then
  215. echo "ENABLE_BATMAN=$ENABLE_BATMAN" >> $CONFIGURATION_FILE
  216. fi
  217. if [ $ENABLE_BABEL ]; then
  218. echo "ENABLE_BABEL=$ENABLE_BABEL" >> $CONFIGURATION_FILE
  219. fi
  220. echo "DEBIAN_REPO=$DEBIAN_REPO" >> $CONFIGURATION_FILE
  221. if [ $NAMESERVER1 ]; then
  222. echo "NAMESERVER1=$NAMESERVER1" >> $CONFIGURATION_FILE
  223. fi
  224. if [ $NAMESERVER2 ]; then
  225. echo "NAMESERVER2=$NAMESERVER2" >> $CONFIGURATION_FILE
  226. fi
  227. if [ "$WIKI_TITLE" ]; then
  228. echo "WIKI_TITLE=$WIKI_TITLE" >> $CONFIGURATION_FILE
  229. fi
  230. if [ $WIKI_DOMAIN_NAME ]; then
  231. echo "WIKI_DOMAIN_NAME=$WIKI_DOMAIN_NAME" >> $CONFIGURATION_FILE
  232. fi
  233. if [ $WIKI_CODE ]; then
  234. echo "WIKI_CODE=$WIKI_CODE" >> $CONFIGURATION_FILE
  235. fi
  236. if [ "$MY_BLOG_TITLE" ]; then
  237. echo "MY_BLOG_TITLE=$MY_BLOG_TITLE" >> $CONFIGURATION_FILE
  238. fi
  239. if [ $FULLBLOG_DOMAIN_NAME ]; then
  240. echo "FULLBLOG_DOMAIN_NAME=$FULLBLOG_DOMAIN_NAME" >> $CONFIGURATION_FILE
  241. fi
  242. if [ $FULLBLOG_CODE ]; then
  243. echo "FULLBLOG_CODE=$FULLBLOG_CODE" >> $CONFIGURATION_FILE
  244. fi
  245. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  246. echo "OWNCLOUD_DOMAIN_NAME=$OWNCLOUD_DOMAIN_NAME" >> $CONFIGURATION_FILE
  247. fi
  248. if [ $OWNCLOUD_CODE ]; then
  249. echo "OWNCLOUD_CODE=$OWNCLOUD_CODE" >> $CONFIGURATION_FILE
  250. fi
  251. if [ $HUBZILLA_DOMAIN_NAME ]; then
  252. echo "HUBZILLA_DOMAIN_NAME=$HUBZILLA_DOMAIN_NAME" >> $CONFIGURATION_FILE
  253. fi
  254. if [ $HUBZILLA_CODE ]; then
  255. echo "HUBZILLA_CODE=$HUBZILLA_CODE" >> $CONFIGURATION_FILE
  256. fi
  257. if [ $MICROBLOG_DOMAIN_NAME ]; then
  258. echo "MICROBLOG_DOMAIN_NAME=$MICROBLOG_DOMAIN_NAME" >> $CONFIGURATION_FILE
  259. fi
  260. if [ $MICROBLOG_CODE ]; then
  261. echo "MICROBLOG_CODE=$MICROBLOG_CODE" >> $CONFIGURATION_FILE
  262. fi
  263. if [ ${#MICROBLOG_WELCOME_MESSAGE} -gt 1 ]; then
  264. echo "MICROBLOG_WELCOME_MESSAGE=$MICROBLOG_WELCOME_MESSAGE" >> $CONFIGURATION_FILE
  265. fi
  266. if [ $MICROBLOG_BACKGROUND_IMAGE_URL ]; then
  267. echo "MICROBLOG_BACKGROUND_IMAGE_URL=$MICROBLOG_BACKGROUND_IMAGE_URL" >> $CONFIGURATION_FILE
  268. fi
  269. if [ $GIT_DOMAIN_NAME ]; then
  270. echo "GIT_DOMAIN_NAME=$GIT_DOMAIN_NAME" >> $CONFIGURATION_FILE
  271. fi
  272. if [ $GIT_CODE ]; then
  273. echo "GIT_CODE=$GIT_CODE" >> $CONFIGURATION_FILE
  274. fi
  275. if [ $MEDIAGOBLIN_DOMAIN_NAME ]; then
  276. echo "MEDIAGOBLIN_DOMAIN_NAME=$MEDIAGOBLIN_DOMAIN_NAME" >> $CONFIGURATION_FILE
  277. fi
  278. if [ $MEDIAGOBLIN_CODE ]; then
  279. echo "MEDIAGOBLIN_CODE=$MEDIAGOBLIN_CODE" >> $CONFIGURATION_FILE
  280. fi
  281. if [ $HWRNG_TYPE ]; then
  282. echo "HWRNG_TYPE=$HWRNG_TYPE" >> $CONFIGURATION_FILE
  283. fi
  284. if [ $ENABLE_SOCIAL_KEY_MANAGEMENT ]; then
  285. echo "ENABLE_SOCIAL_KEY_MANAGEMENT=$ENABLE_SOCIAL_KEY_MANAGEMENT" >> $CONFIGURATION_FILE
  286. fi
  287. if [ $ESSID ]; then
  288. echo "ESSID=$ESSID" >> $CONFIGURATION_FILE
  289. fi
  290. if [ $BATMAN_CELLID ]; then
  291. echo "BATMAN_CELLID=$BATMAN_CELLID" >> $CONFIGURATION_FILE
  292. fi
  293. if [ $WIFI_CHANNEL ]; then
  294. echo "WIFI_CHANNEL=$WIFI_CHANNEL" >> $CONFIGURATION_FILE
  295. fi
  296. if [ $DH_KEYLENGTH ]; then
  297. echo "DH_KEYLENGTH=$DH_KEYLENGTH" >> $CONFIGURATION_FILE
  298. fi
  299. echo "ONION_ONLY=$ONION_ONLY" >> $CONFIGURATION_FILE
  300. if [ $FRIENDS_MIRRORS_SERVER ]; then
  301. echo "FRIENDS_MIRRORS_SERVER=$FRIENDS_MIRRORS_SERVER" >> $CONFIGURATION_FILE
  302. fi
  303. if [ $FRIENDS_MIRRORS_SSH_PORT ]; then
  304. echo "FRIENDS_MIRRORS_SSH_PORT=$FRIENDS_MIRRORS_SSH_PORT" >> $CONFIGURATION_FILE
  305. fi
  306. if [ $FRIENDS_MIRRORS_PASSWORD ]; then
  307. echo "FRIENDS_MIRRORS_PASSWORD=$FRIENDS_MIRRORS_PASSWORD" >> $CONFIGURATION_FILE
  308. fi
  309. }
  310. # test a domain name to see if it's valid
  311. function validate_domain_name {
  312. # count the number of dots in the domain name
  313. dots=${TEST_DOMAIN_NAME//[^.]}
  314. no_of_dots=${#dots}
  315. if (( no_of_dots > 3 )); then
  316. 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"
  317. fi
  318. if (( no_of_dots == 0 )); then
  319. 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"
  320. fi
  321. }
  322. function interactive_gpg_from_remote {
  323. REMOTE_SERVERS_LIST=/home/$MY_USERNAME/keyshareservers.txt
  324. # get a list of remote servers
  325. ${PROJECT_NAME}-remote -u $MY_USERNAME -l $REMOTE_SERVERS_LIST -t "Remote server"
  326. if [ ! -f $REMOTE_SERVERS_LIST ]; then
  327. dialog --title $"Encryption keys" --msgbox $'Error obtaining server list' 6 70
  328. return 1
  329. fi
  330. # check the number of entries in the file
  331. no_of_servers=$(cat $REMOTE_SERVERS_LIST | wc -l)
  332. if (( no_of_servers < 3 )); then
  333. dialog --title $"Encryption keys" \
  334. --msgbox $'There must be at least three servers to recover the key' 6 70
  335. return 2
  336. fi
  337. # try to recover the key from the servers
  338. apt-get -y install libgfshare-bin gnupg
  339. ${PROJECT_NAME}-recoverkey -u $MY_USERNAME -l $REMOTE_SERVERS_LIST
  340. if [ ! "$?" = "0" ]; then
  341. dialog --title $"Encryption keys" --msgbox $'Your key could not be recovered' 6 70
  342. return 3
  343. fi
  344. dialog --title $"Encryption keys" --msgbox $'Your key has been recovered' 6 70
  345. return 0
  346. }
  347. function reconstruct_key {
  348. if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
  349. return
  350. fi
  351. cd /home/$MY_USERNAME/.gnupg_fragments
  352. no_of_shares=$(ls -afq keyshare.asc.* | wc -l)
  353. if (( no_of_shares < 4 )); then
  354. dialog --title $"Encryption keys" --msgbox $'Not enough fragments to reconstruct the key' 6 70
  355. exit 7348
  356. fi
  357. apt-get -y install libgfshare-bin gnupg
  358. gfcombine /home/$MY_USERNAME/.gnupg_fragments/keyshare*
  359. if [ ! "$?" = "0" ]; then
  360. dialog --title $"Encryption keys" --msgbox $'Unable to reconstruct the key' 6 70
  361. exit 7348
  362. fi
  363. KEYS_FILE=/home/$MY_USERNAME/.gnupg_fragments/keyshare.asc
  364. if [ ! -f $KEYS_FILE ]; then
  365. dialog --title $"Encryption keys" --msgbox $'Unable to reconstruct the key' 6 70
  366. fi
  367. su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME
  368. if [ ! "$?" = "0" ]; then
  369. echo $'Unable to import gpg key'
  370. shred -zu $KEYS_FILE
  371. rm -rf /home/$MY_USERNAME/.tempgnupg
  372. exit 9654
  373. fi
  374. shred -zu $KEYS_FILE
  375. dialog --title $"Encryption keys" --msgbox $'Key has been reconstructed' 6 70
  376. }
  377. function interactive_gpg_from_usb {
  378. dialog --title $"Encryption keys" \
  379. --msgbox $'Plug in a USB drive containing a copy of your full key or key fragment' 6 70
  380. HOME_DIR=/home/$MY_USERNAME
  381. GPG_LOADING="yes"
  382. SSH_IMPORTED="no"
  383. GPG_CTR=0
  384. while [[ $GPG_LOADING == "yes" ]]
  385. do
  386. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  387. GPG_USB_DRIVE='/dev/sda1'
  388. if [ ! -b $GPG_USB_DRIVE ]; then
  389. if (( GPG_CTR > 0 )); then
  390. reconstruct_key
  391. return 0
  392. fi
  393. dialog --title $"Encryption keys" --msgbox $'No USB drive found' 6 30
  394. exit 739836
  395. fi
  396. else
  397. GPG_USB_DRIVE='/dev/sdb1'
  398. if [ ! -b $GPG_USB_DRIVE ]; then
  399. GPG_USB_DRIVE='/dev/sdc1'
  400. if [ ! -b $GPG_USB_DRIVE ]; then
  401. GPG_USB_DRIVE='/dev/sdd1'
  402. if [ ! -b $GPG_USB_DRIVE ]; then
  403. if (( GPG_CTR > 0 )); then
  404. reconstruct_key
  405. return 0
  406. fi
  407. dialog --title $"Encryption keys" --msgbox $'No USB drive found' 6 30
  408. exit 27852
  409. fi
  410. fi
  411. fi
  412. fi
  413. GPG_USB_MOUNT='/mnt/usb'
  414. umount -f $GPG_USB_MOUNT
  415. if [ ! -d $GPG_USB_MOUNT ]; then
  416. mkdir -p $GPG_USB_MOUNT
  417. fi
  418. if [ -f /dev/mapper/encrypted_usb ]; then
  419. rm -rf /dev/mapper/encrypted_usb
  420. fi
  421. cryptsetup luksClose encrypted_usb
  422. cryptsetup luksOpen $GPG_USB_DRIVE encrypted_usb
  423. if [ "$?" = "0" ]; then
  424. GPG_USB_DRIVE=/dev/mapper/encrypted_usb
  425. fi
  426. mount $GPG_USB_DRIVE $GPG_USB_MOUNT
  427. if [ ! "$?" = "0" ]; then
  428. if (( GPG_CTR > 0 )); then
  429. rm -rf $GPG_USB_MOUNT
  430. reconstruct_key
  431. return 0
  432. fi
  433. dialog --title $"Encryption keys" \
  434. --msgbox $"There was a problem mounting the USB drive to $GPG_USB_MOUNT" 6 70
  435. rm -rf $GPG_USB_MOUNT
  436. exit 74393
  437. fi
  438. if [ ! -d $GPG_USB_MOUNT/.gnupg ]; then
  439. if [ ! -d $GPG_USB_MOUNT/.gnupg_fragments ]; then
  440. if (( GPG_CTR > 0 )); then
  441. umount -f $GPG_USB_MOUNT
  442. rm -rf $GPG_USB_MOUNT
  443. reconstruct_key
  444. return 0
  445. fi
  446. dialog --title $"Encryption keys" \
  447. --msgbox $"The directory $GPG_USB_MOUNT/.gnupg or $GPG_USB_MOUNT/.gnupg_fragments was not found" 6 70
  448. umount -f $GPG_USB_MOUNT
  449. rm -rf $GPG_USB_MOUNT
  450. exit 723814
  451. fi
  452. fi
  453. if [ -d $GPG_USB_MOUNT/.gnupg ]; then
  454. if [ ! -d $HOME_DIR/.gnupg ]; then
  455. mkdir $HOME_DIR/.gnupg
  456. fi
  457. cp -r $GPG_USB_MOUNT/.gnupg/* $HOME_DIR/.gnupg
  458. GPG_LOADING="no"
  459. dialog --title $"Encryption keys" \
  460. --msgbox $"GPG Keyring loaded to $HOME_DIR" 6 70
  461. else
  462. if [ ! -d $HOME_DIR/.gnupg_fragments ]; then
  463. mkdir $HOME_DIR/.gnupg_fragments
  464. fi
  465. cp -r $GPG_USB_MOUNT/.gnupg_fragments/* $HOME_DIR/.gnupg_fragments
  466. fi
  467. if [[ $SSH_IMPORTED == "no" ]]; then
  468. if [ -d $GPG_USB_MOUNT/.ssh ]; then
  469. if [ ! -d $HOME_DIR/.ssh ]; then
  470. mkdir $HOME_DIR/.ssh
  471. fi
  472. cp $GPG_USB_MOUNT/.ssh/* $HOME_DIR/.ssh
  473. dialog --title $"Encryption keys" \
  474. --msgbox $"ssh keys imported" 6 70
  475. SSH_IMPORTED="yes"
  476. fi
  477. fi
  478. umount -f $GPG_USB_MOUNT
  479. rm -rf $GPG_USB_MOUNT
  480. if [[ $GPG_LOADING == "yes" ]]; then
  481. dialog --title $"Encryption keys" \
  482. --msgbox $"Now remove the USB drive. Insert the next drive containing a key fragment, or select Ok to finish" 6 70
  483. fi
  484. GPG_CTR=$((GPG_CTR + 1))
  485. done
  486. }
  487. function interactive_gpg {
  488. GPG_CONFIGURED="no"
  489. while [[ $GPG_CONFIGURED != "yes" ]]
  490. do
  491. GPG_CONFIGURED="yes"
  492. data=$(tempfile 2>/dev/null)
  493. trap "rm -f $data" 0 1 2 5 15
  494. dialog --backtitle $"Freedombone Configuration" \
  495. --radiolist $"GPG/PGP keys for your system:" 13 70 3 \
  496. 1 $"Generate new keys (new user)" on \
  497. 2 $"Import keys from USB drive/s" off \
  498. 3 $"Retrieve keys from friends servers" off 2> $data
  499. sel=$?
  500. case $sel in
  501. 1) exit 1;;
  502. 255) exit 2;;
  503. esac
  504. case $(cat $data) in
  505. 1) if [ -d /home/$MY_USERNAME/.gnupg ]; then
  506. rm -rf /home/$MY_USERNAME/.gnupg
  507. fi
  508. break;;
  509. 2) interactive_gpg_from_usb
  510. break;;
  511. 3) interactive_gpg_from_remote
  512. if [ ! "$?" = "0" ]; then
  513. GPG_CONFIGURED="no"
  514. fi;;
  515. esac
  516. done
  517. }
  518. function set_main_repo {
  519. data=$(tempfile 2>/dev/null)
  520. trap "rm -f $data" 0 1 2 5 15
  521. dialog --backtitle $"Freedombone Control Panel" \
  522. --title $"Main Repository (Mirrors)" \
  523. --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 \
  524. $"URL:" 1 1 "$FRIENDS_MIRRORS_SERVER" 1 18 40 18 \
  525. $"SSH Port:" 2 1 "$FRIENDS_MIRRORS_SSH_PORT" 2 18 10 10000 \
  526. $"Password:" 3 1 "$FRIENDS_MIRRORS_PASSWORD" 3 18 40 10000 \
  527. 2> $data
  528. sel=$?
  529. case $sel in
  530. 1) return;;
  531. 255) return;;
  532. esac
  533. new_mirrors_url=$(cat $data | sed -n 1p)
  534. new_mirrors_ssh_port=$(cat $data | sed -n 2p)
  535. new_mirrors_password=$(cat $data | sed -n 3p)
  536. if [ ${#new_mirrors_url} -lt 2 ]; then
  537. return
  538. fi
  539. if [ ${#new_mirrors_ssh_port} -lt 1 ]; then
  540. return
  541. fi
  542. if [ ${#new_mirrors_password} -lt 10 ]; then
  543. dialog --title $"Main Repository" \
  544. --msgbox $'Mirrors password was too short. Should be at least 10 characters.' 6 40
  545. return
  546. fi
  547. if [[ $new_mirrors_url == *"."* ]]; then
  548. FRIENDS_MIRRORS_SERVER=$new_mirrors_url
  549. FRIENDS_MIRRORS_SSH_PORT=$new_mirrors_ssh_port
  550. FRIENDS_MIRRORS_PASSWORD=$new_mirrors_password
  551. dialog --title $"Main Repository" \
  552. --msgbox $"Main repository set to $FRIENDS_MIRRORS_SERVER" 6 60
  553. fi
  554. }
  555. function interactive_select_language {
  556. data=$(tempfile 2>/dev/null)
  557. trap "rm -f $data" 0 1 2 5 15
  558. dialog --backtitle $"Freedombone Configuration" \
  559. --radiolist $"Select your language:" 12 40 4 \
  560. 1 $"Afrikaans" off \
  561. 2 $"Albanian" off \
  562. 3 $"Arabic" off \
  563. 4 $"Basque" off \
  564. 5 $"Belarusian" off \
  565. 6 $"Bosnian" off \
  566. 7 $"Bulgarian" off \
  567. 8 $"Catalan" off \
  568. 9 $"Croatian" off \
  569. 10 $"Chinese (Simplified)" off \
  570. 11 $"Chinese (Traditional)" off \
  571. 12 $"Czech" off \
  572. 13 $"Danish" off \
  573. 14 $"Dutch" off \
  574. 15 $"English" on \
  575. 16 $"English (US)" off \
  576. 17 $"Estonian" off \
  577. 18 $"Farsi" off \
  578. 19 $"Filipino" off \
  579. 20 $"Finnish" off \
  580. 21 $"French" off \
  581. 22 $"French (Canada)" off \
  582. 23 $"Gaelic" off \
  583. 24 $"Gallego" off \
  584. 25 $"Georgian" off \
  585. 26 $"German" off \
  586. 27 $"German (Personal)" off \
  587. 28 $"Greek" off \
  588. 29 $"Gujarati" off \
  589. 30 $"Hebrew" off \
  590. 31 $"Hindi" off \
  591. 32 $"Hungarian" off \
  592. 33 $"Icelandic" off \
  593. 34 $"Indonesian" off \
  594. 35 $"Italian" off \
  595. 36 $"Japanese" off \
  596. 37 $"Kannada" off \
  597. 38 $"Khmer" off \
  598. 39 $"Korean" off \
  599. 40 $"Lao" off \
  600. 41 $"Lithuanian" off \
  601. 42 $"Latvian" off \
  602. 43 $"Malayalam" off \
  603. 44 $"Malaysian" off \
  604. 45 $"Maori (Ngai Tahu)" off \
  605. 46 $"Maori (Waikoto Uni)" off \
  606. 47 $"Mongolian" off \
  607. 48 $"Norwegian" off \
  608. 49 $"Norwegian (Primary)" off \
  609. 50 $"Nynorsk" off \
  610. 51 $"Polish" off \
  611. 52 $"Portuguese" off \
  612. 53 $"Portuguese (Brazil)" off \
  613. 54 $"Romanian" off \
  614. 55 $"Russian" off \
  615. 56 $"Samoan" off \
  616. 57 $"Serbian" off \
  617. 58 $"Slovak" off \
  618. 59 $"Slovenian" off \
  619. 60 $"Somali" off \
  620. 61 $"Spanish (International)" off \
  621. 62 $"Swedish" off \
  622. 63 $"Tagalog" off \
  623. 64 $"Tamil" off \
  624. 65 $"Thai" off \
  625. 66 $"Turkish" off \
  626. 67 $"Ukrainian" off \
  627. 68 $"Vietnamese" off 2> $data
  628. sel=$?
  629. case $sel in
  630. 1) exit 1;;
  631. 255) exit 1;;
  632. esac
  633. case $(cat $data) in
  634. 1) DEFAULT_LANGUAGE='af_ZA.UTF-8';;
  635. 2) DEFAULT_LANGUAGE='sq_AL.UTF-8';;
  636. 3) DEFAULT_LANGUAGE='ar_SA.UTF-8';;
  637. 4) DEFAULT_LANGUAGE='eu_ES.UTF-8';;
  638. 5) DEFAULT_LANGUAGE='be_BY.UTF-8';;
  639. 6) DEFAULT_LANGUAGE='bs_BA.UTF-8';;
  640. 7) DEFAULT_LANGUAGE='bg_BG.UTF-8';;
  641. 8) DEFAULT_LANGUAGE='ca_ES.UTF-8';;
  642. 9) DEFAULT_LANGUAGE='hr_HR.UTF-8';;
  643. 10) DEFAULT_LANGUAGE='zh_CN.UTF-8';;
  644. 11) DEFAULT_LANGUAGE='zh_TW.UTF-8';;
  645. 12) DEFAULT_LANGUAGE='cs_CZ.UTF-8';;
  646. 13) DEFAULT_LANGUAGE='da_DK.UTF-8';;
  647. 14) DEFAULT_LANGUAGE='nl_NL.UTF-8';;
  648. 15) DEFAULT_LANGUAGE='en.UTF-8';;
  649. 16) DEFAULT_LANGUAGE='en_us.UTF-8';;
  650. 17) DEFAULT_LANGUAGE='et_EE.UTF-8';;
  651. 18) DEFAULT_LANGUAGE='fa_IR.UTF-8';;
  652. 19) DEFAULT_LANGUAGE='ph_PH.UTF-8';;
  653. 20) DEFAULT_LANGUAGE='fi_FI.UTF-8';;
  654. 21) DEFAULT_LANGUAGE='fr_FR.UTF-8';;
  655. 22) DEFAULT_LANGUAGE='fr_CA.UTF-8';;
  656. 23) DEFAULT_LANGUAGE='ga.UTF-8';;
  657. 24) DEFAULT_LANGUAGE='l_ES.UTF-8';;
  658. 25) DEFAULT_LANGUAGE='ka_GE.UTF-8';;
  659. 26) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  660. 27) DEFAULT_LANGUAGE='de_DE.UTF-8';;
  661. 28) DEFAULT_LANGUAGE='el_GR.UTF-8';;
  662. 29) DEFAULT_LANGUAGE='gu.UTF-8';;
  663. 30) DEFAULT_LANGUAGE='he_IL.utf8';;
  664. 31) DEFAULT_LANGUAGE='hi_IN.UTF-8';;
  665. 32) DEFAULT_LANGUAGE='hu.UTF-8';;
  666. 33) DEFAULT_LANGUAGE='is_IS.UTF-8';;
  667. 34) DEFAULT_LANGUAGE='id_ID.UTF-8';;
  668. 35) DEFAULT_LANGUAGE='it_IT.UTF-8';;
  669. 36) DEFAULT_LANGUAGE='ja_JP.UTF-8';;
  670. 37) DEFAULT_LANGUAGE='kn_IN.UTF-8';;
  671. 38) DEFAULT_LANGUAGE='km_KH.UTF-8';;
  672. 39) DEFAULT_LANGUAGE='ko_KR.UTF-8';;
  673. 40) DEFAULT_LANGUAGE='lo_LA.UTF-8';;
  674. 41) DEFAULT_LANGUAGE='lt_LT.UTF-8';;
  675. 42) DEFAULT_LANGUAGE='lat.UTF-8';;
  676. 43) DEFAULT_LANGUAGE='ml_IN.UTF-8';;
  677. 44) DEFAULT_LANGUAGE='ms_MY.UTF-8';;
  678. 45) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  679. 46) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  680. 47) DEFAULT_LANGUAGE='mn.UTF-8';;
  681. 48) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  682. 49) DEFAULT_LANGUAGE='no_NO.UTF-8';;
  683. 50) DEFAULT_LANGUAGE='nn_NO.UTF-8';;
  684. 51) DEFAULT_LANGUAGE='pl.UTF-8';;
  685. 52) DEFAULT_LANGUAGE='pt_PT.UTF-8';;
  686. 53) DEFAULT_LANGUAGE='pt_BR.UTF-8';;
  687. 54) DEFAULT_LANGUAGE='ro_RO.UTF-8';;
  688. 55) DEFAULT_LANGUAGE='ru_RU.UTF-8';;
  689. 56) DEFAULT_LANGUAGE='mi_NZ.UTF-8';;
  690. 57) DEFAULT_LANGUAGE='sr_CS.UTF-8';;
  691. 58) DEFAULT_LANGUAGE='sk_SK.UTF-8';;
  692. 59) DEFAULT_LANGUAGE='sl_SI.UTF-8';;
  693. 60) DEFAULT_LANGUAGE='so_SO.UTF-8';;
  694. 61) DEFAULT_LANGUAGE='es_ES.UTF-8';;
  695. 62) DEFAULT_LANGUAGE='sv_SE.UTF-8';;
  696. 63) DEFAULT_LANGUAGE='tl.UTF-8';;
  697. 64) DEFAULT_LANGUAGE='ta_IN.UTF-8';;
  698. 65) DEFAULT_LANGUAGE='th_TH.UTF-8';;
  699. 66) DEFAULT_LANGUAGE='tr_TR.UTF-8';;
  700. 67) DEFAULT_LANGUAGE='uk_UA.UTF-8';;
  701. 68) DEFAULT_LANGUAGE='vi_VN.UTF-8';;
  702. esac
  703. save_configuration_file
  704. update-locale LANG=${DEFAULT_LANGUAGE}
  705. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  706. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  707. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  708. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  709. }
  710. function select_user {
  711. SELECTED_USERNAME=
  712. users_array=($(ls /home))
  713. delete=(mirrors git)
  714. for del in ${delete[@]}
  715. do
  716. users_array=(${users_array[@]/$del})
  717. done
  718. i=0
  719. W=()
  720. name=()
  721. for u in ${users_array[@]}
  722. do
  723. i=$((i+1))
  724. W+=($i "$u")
  725. name+=("$u")
  726. done
  727. 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)
  728. if [ $? -eq 0 ]; then
  729. SELECTED_USERNAME="${name[$((user_index-1))]}"
  730. fi
  731. }
  732. function interactive_configuration {
  733. # create a temporary copy of the configuration file
  734. # which can be used to pre-populate selections
  735. if [ -f $CONFIGURATION_FILE ]; then
  736. cp $CONFIGURATION_FILE temp.cfg
  737. fi
  738. interactive_select_language
  739. if [[ $ONION_ONLY == "no" ]]; then
  740. 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 or send a Bitmessage to $FREEDOMBONE_BITMESSAGE"
  741. else
  742. 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 or send a Bitmessage to $FREEDOMBONE_BITMESSAGE"
  743. fi
  744. dialog --title $"Freedombone" --msgbox "$INITIAL_MESSAGE" 15 50
  745. data=$(tempfile 2>/dev/null)
  746. trap "rm -f $data" 0 1 2 5 15
  747. dialog --backtitle $"Freedombone Configuration" \
  748. --radiolist $"Type of Installation:" 18 40 11 \
  749. 1 $"Full" on \
  750. 2 $"Writer" off \
  751. 3 $"Cloud" off \
  752. 4 $"Chat" off \
  753. 5 $"Mailbox" off \
  754. 6 $"Non-Mailbox" off \
  755. 7 $"Social" off \
  756. 8 $"Media" off \
  757. 9 $"Developer" off \
  758. 10 $"Mesh (router)" off \
  759. 11 $"Mesh (user device)" off 2> $data
  760. sel=$?
  761. case $sel in
  762. 1) exit 1;;
  763. 255) exit 1;;
  764. esac
  765. case $(cat $data) in
  766. 1) SYSTEM_TYPE=$VARIANT_FULL;;
  767. 2) SYSTEM_TYPE=$VARIANT_WRITER;;
  768. 3) SYSTEM_TYPE=$VARIANT_CLOUD;;
  769. 4) SYSTEM_TYPE=$VARIANT_CHAT;;
  770. 5) SYSTEM_TYPE=$VARIANT_MAILBOX;;
  771. 6) SYSTEM_TYPE=$VARIANT_NONMAILBOX;;
  772. 7) SYSTEM_TYPE=$VARIANT_SOCIAL;;
  773. 8) SYSTEM_TYPE=$VARIANT_MEDIA;;
  774. 9) SYSTEM_TYPE=$VARIANT_DEVELOPER;;
  775. 10) SYSTEM_TYPE=$VARIANT_MESH;;
  776. 11) SYSTEM_TYPE=$VARIANT_MESH_USER;;
  777. esac
  778. save_configuration_file
  779. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" && $SYSTEM_TYPE != "$VARIANT_MESH_USER" ]]; then
  780. set_main_repo
  781. save_configuration_file
  782. fi
  783. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" || $SYSTEM_TYPE == "$VARIANT_MESH_USER" ]]; then
  784. ENABLE_BATMAN="yes"
  785. ENABLE_CJDNS="no"
  786. ENABLE_BABEL="no"
  787. #data=$(tempfile 2>/dev/null)
  788. #trap "rm -f $data" 0 1 2 5 15
  789. #dialog --backtitle "Freedombone Configuration" \
  790. # --radiolist "Select your type of mesh network:" 10 40 3 \
  791. # 1 "Babel" off \
  792. # 2 "B.A.T.M.A.N. Advanced" on \
  793. # 3 "cjdns" off 2> $data
  794. #sel=$?
  795. #case $sel in
  796. # 1) exit 1;;
  797. # 255) exit 1;;
  798. #esac
  799. #case $(cat $data) in
  800. # 1) ENABLE_BABEL="yes";;
  801. # 2) ENABLE_BATMAN="yes";;
  802. # 3) ENABLE_CJDNS="yes";;
  803. #esac
  804. save_configuration_file
  805. data=$(tempfile 2>/dev/null)
  806. trap "rm -f $data" 0 1 2 5 15
  807. dialog --backtitle $"Freedombone Configuration" \
  808. --inputbox $"Wireless Mesh ESSID\n\nIf you press enter the default will be '$ESSID'" 10 40 "$(grep 'ESSID' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  809. sel=$?
  810. case $sel in
  811. 0) ESSID=$(cat $data);;
  812. 1) exit 1;;
  813. 255) exit 1;;
  814. esac
  815. save_configuration_file
  816. if [[ $SYSTEM_TYPE != "$VARIANT_MESH_USER" ]]; then
  817. data=$(tempfile 2>/dev/null)
  818. trap "rm -f $data" 0 1 2 5 15
  819. dialog --backtitle $"Freedombone Configuration" \
  820. --inputbox $"Give your mesh peer a name" 10 40 "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  821. sel=$?
  822. case $sel in
  823. 0) DEFAULT_DOMAIN_NAME=$(cat $data);;
  824. 1) exit 1;;
  825. 255) exit 1;;
  826. esac
  827. else
  828. DEFAULT_DOMAIN_NAME=$(hostname)
  829. fi
  830. save_configuration_file
  831. data=$(tempfile 2>/dev/null)
  832. trap "rm -f $data" 0 1 2 5 15
  833. dialog --backtitle $"Freedombone Configuration" \
  834. --radiolist $"Wifi Channel (spaced to be non-overlapping):" 11 50 4 \
  835. 1 "1" on \
  836. 2 "5" off \
  837. 3 "9" off \
  838. 4 "13" off 2> $data
  839. sel=$?
  840. case $sel in
  841. 1) exit 1;;
  842. 255) exit 1;;
  843. esac
  844. case $(cat $data) in
  845. 1) WIFI_CHANNEL=1;;
  846. 2) WIFI_CHANNEL=5;;
  847. 3) WIFI_CHANNEL=9;;
  848. 4) WIFI_CHANNEL=13;;
  849. esac
  850. save_configuration_file
  851. fi
  852. #if [[ $ENABLE_BATMAN == "yes" ]]; then
  853. # data=$(tempfile 2>/dev/null)
  854. # trap "rm -f $data" 0 1 2 5 15
  855. # dialog --backtitle "Freedombone Configuration" \
  856. # --inputbox "Optionally register with an Access Point" 10 40 "$(grep 'BATMAN_CELLID' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  857. # sel=$?
  858. # case $sel in
  859. # 0) BATMAN_CELLID=$(cat $data);;
  860. # 1) exit 1;;
  861. # 255) exit 1;;
  862. # esac
  863. # save_configuration_file
  864. #fi
  865. if [[ $SYSTEM_TYPE == "$VARIANT_MESH_USER" ]]; then
  866. ${PROJECT_NAME}-client --essid $ESSID --channel $WIFI_CHANNEL
  867. if [ "$?" = "0" ]; then
  868. clear
  869. echo ".---. . . "
  870. echo "| | | "
  871. echo "|--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. "
  872. echo "| | (.-' (.-' ( | ( )| | | | )( )| | (.-' "
  873. echo "' ' --' --' -' - -' ' ' -' -' -' ' - --'"
  874. echo ''
  875. echo $'Your system is now ready for connection to the mesh network'
  876. echo ''
  877. echo $'To connect to the network open a terminal and type:'
  878. echo ''
  879. echo ' meshweb'
  880. echo ''
  881. echo $'To disconnect from the mesh and return to the internet type:'
  882. echo ''
  883. echo ' sudo batman stop'
  884. echo ''
  885. echo $'To turn your system into a dedicated mesh peer you could add'
  886. echo $'the meshweb command to your startup applications'
  887. echo ''
  888. touch /tmp/meshuserdevice
  889. exit 0
  890. else
  891. echo $'Failed to fully install the mesh networking system'
  892. exit 74589
  893. fi
  894. fi
  895. if [ -d /home/$GENERIC_IMAGE_USERNAME ]; then
  896. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  897. echo 'Cannot find the password file for the admin user'
  898. exit 62753
  899. fi
  900. # when installing from an image which comes with a known default user account
  901. SELECTED_USERNAME=
  902. while [ ! $SELECTED_USERNAME ]
  903. do
  904. if [ ! $SELECTED_USERNAME ]; then
  905. SELECTED_USERNAME=$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')
  906. fi
  907. data=$(tempfile 2>/dev/null)
  908. trap "rm -f $data" 0 1 2 5 15
  909. dialog --backtitle $"Freedombone Configuration" \
  910. --title $"Username" \
  911. --inputbox $"Set your username for the system\n\nYour username should not contain any spaces" 12 60 "$SELECTED_USERNAME" 2> $data
  912. sel=$?
  913. case $sel in
  914. 0) possible_username=$(cat $data)
  915. SELECTED_USERNAME=
  916. if [[ $possible_username != *' '* && $possible_username != *'/'* && $possible_username != *'\'* && $possible_username != *'*'* ]]; then
  917. if [ $possible_username ]; then
  918. if [ ${#possible_username} -gt 1 ]; then
  919. if [[ $possible_username != $GENERIC_IMAGE_USERNAME ]]; then
  920. MY_USERNAME=$(cat $data)
  921. useradd -m -s /bin/bash $MY_USERNAME
  922. if [ -d /home/$MY_USERNAME ]; then
  923. echo "${MY_USERNAME}:$(printf `cat $IMAGE_PASSWORD_FILE`)" | chpasswd
  924. # Add the user as a sudoer - they will be the new admin user
  925. if ! grep -q "$MY_USERNAME ALL=(ALL) ALL" /etc/sudoers; then
  926. echo "$MY_USERNAME ALL=(ALL) ALL" >> /etc/sudoers
  927. # remove the generic image admin user from sudoers
  928. sed -i "s|${GENERIC_IMAGE_USERNAME}.*||g" /etc/sudoers
  929. fi
  930. break
  931. fi
  932. fi
  933. fi
  934. fi
  935. fi
  936. ;;
  937. 1) exit 1;;
  938. 255) exit 1;;
  939. esac
  940. done
  941. else
  942. no_of_users=$(find /home/* -maxdepth 0 -type d | wc -l)
  943. if [ $no_of_users -eq 1 ]; then
  944. # only a single user on the system
  945. MY_USERNAME=$(ls /home)
  946. else
  947. # select one from a number of users
  948. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" && $DEFAULT_DOMAIN_NAME && -d /home/$DEFAULT_DOMAIN_NAME ]]; then
  949. MY_USERNAME=$DEFAULT_DOMAIN_NAME
  950. else
  951. select_user
  952. if [ ! $SELECTED_USERNAME ]; then
  953. echo $'No username selected'
  954. exit 72589
  955. fi
  956. MY_USERNAME="$SELECTED_USERNAME"
  957. fi
  958. fi
  959. fi
  960. if [ ! $MY_USERNAME ]; then
  961. echo $'No user account was selected'
  962. exit 64398
  963. fi
  964. if [[ $MY_USERNAME == '-f' ]]; then
  965. echo $'No user account was selected'
  966. exit 8347
  967. fi
  968. if [[ $MY_USERNAME == 'debian' || $MY_USERNAME == 'fbone' ]]; then
  969. echo $"Don't use the default user account"
  970. exit 9341
  971. fi
  972. if [ ! -d /home/$MY_USERNAME ]; then
  973. echo $"The directory /home/$MY_USERNAME does not exist"
  974. exit 6437
  975. fi
  976. save_configuration_file
  977. if [[ $MINIMAL_INSTALL == "no" ]]; then
  978. if [[ $(grep "INSTALLING_ON_BBB" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
  979. dialog --title $"Install Target" \
  980. --backtitle $"Freedombone Configuration" \
  981. --yesno $"\nAre you installing onto a Beaglebone Black?" 7 60
  982. else
  983. dialog --title $"Install Target" \
  984. --backtitle $"Freedombone Configuration" \
  985. --defaultno \
  986. --yesno $"\nAre you installing onto a Beaglebone Black?" 7 60
  987. fi
  988. sel=$?
  989. case $sel in
  990. 0) INSTALLING_ON_BBB="yes";;
  991. 1) INSTALLING_ON_BBB="no";;
  992. 255) exit 1;;
  993. esac
  994. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  995. USB_DRIVE=/dev/sda1
  996. fi
  997. save_configuration_file
  998. fi
  999. if [[ $MINIMAL_INSTALL == "no" ]]; then
  1000. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  1001. interactive_gpg
  1002. data=$(tempfile 2>/dev/null)
  1003. trap "rm -f $data" 0 1 2 5 15
  1004. 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."
  1005. if [[ $(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" temp.cfg | awk -F '=' '{print $2}') == "yes" ]]; then
  1006. dialog --title $"Social Key Management" \
  1007. --backtitle $"Freedombone Configuration" \
  1008. --yesno "$SOCIAL_KEY_STR" 15 60
  1009. else
  1010. dialog --title $"Social Key Management" \
  1011. --backtitle $"Freedombone Configuration" \
  1012. --defaultno \
  1013. --yesno "$SOCIAL_KEY_STR" 15 60
  1014. fi
  1015. sel=$?
  1016. case $sel in
  1017. 0) ENABLE_SOCIAL_KEY_MANAGEMENT="yes";;
  1018. 255) exit 1;;
  1019. esac
  1020. save_configuration_file
  1021. fi
  1022. else
  1023. # enable for the minimal case
  1024. ENABLE_SOCIAL_KEY_MANAGEMENT="yes"
  1025. fi
  1026. if [[ $MINIMAL_INSTALL == "no" ]]; then
  1027. data=$(tempfile 2>/dev/null)
  1028. trap "rm -f $data" 0 1 2 5 15
  1029. if [[ $INSTALLING_ON_BBB != "yes" ]]; then
  1030. dialog --backtitle $"Freedombone Configuration" \
  1031. --radiolist $"Type of Random Number Generator:" 10 40 2 \
  1032. 1 Haveged on \
  1033. 2 OneRNG off 2> $data
  1034. sel=$?
  1035. case $sel in
  1036. 1) exit 1;;
  1037. 255) exit 1;;
  1038. esac
  1039. case $(cat $data) in
  1040. 2) HWRNG_TYPE="onerng"
  1041. dialog --title $"OneRNG Device" \
  1042. --msgbox $"Please ensure that the OneRNG device is disconnected. You can reconnect it later during the installation" 8 60
  1043. ;;
  1044. 255) exit 1;;
  1045. esac
  1046. else
  1047. HWRNG_TYPE="beaglebone"
  1048. fi
  1049. save_configuration_file
  1050. fi
  1051. if [[ $MINIMAL_INSTALL == "no" ]]; then
  1052. data=$(tempfile 2>/dev/null)
  1053. trap "rm -f $data" 0 1 2 5 15
  1054. dialog --backtitle $"Freedombone Configuration" \
  1055. --radiolist $"Where to download Debian packages from:" 25 45 49 \
  1056. 1 $"Australia" off \
  1057. 2 $"Austria" off \
  1058. 3 $"Belarus" off \
  1059. 4 $"Belgium" off \
  1060. 5 $"Bosnia and Herzegovina" off \
  1061. 6 $"Brazil" off \
  1062. 7 $"Bulgaria" off \
  1063. 8 $"Canada" off \
  1064. 9 $"Chile" off \
  1065. 10 $"China" off \
  1066. 11 $"Croatia" off \
  1067. 12 $"Czech Republic" off \
  1068. 13 $"Denmark" off \
  1069. 14 $"El Salvador" off \
  1070. 15 $"Estonia" off \
  1071. 16 $"Finland" off \
  1072. 17 $"France 1" off \
  1073. 18 $"France 2" off \
  1074. 19 $"Germany 1" off \
  1075. 20 $"Germany 2" off \
  1076. 21 $"Greece" off \
  1077. 22 $"Hungary" off \
  1078. 23 $"Iceland" off \
  1079. 24 $"Iran" off \
  1080. 25 $"Ireland" off \
  1081. 26 $"Italy" off \
  1082. 27 $"Japan" off \
  1083. 28 $"Korea" off \
  1084. 29 $"Lithuania" off \
  1085. 30 $"Mexico" off \
  1086. 31 $"Netherlands" off \
  1087. 32 $"New Caledonia" off \
  1088. 33 $"New Zealand" off \
  1089. 34 $"Norway" off \
  1090. 35 $"Poland" off \
  1091. 36 $"Portugal" off \
  1092. 37 $"Romania" off \
  1093. 38 $"Russia" off \
  1094. 39 $"Slovakia" off \
  1095. 40 $"Slovenia" off \
  1096. 41 $"Spain" off \
  1097. 42 $"Sweden" off \
  1098. 43 $"Switzerland" off \
  1099. 44 $"Taiwan" off \
  1100. 45 $"Thailand" off \
  1101. 46 $"Turkey" off \
  1102. 47 $"Ukraine" off \
  1103. 48 $"United Kingdom" off \
  1104. 49 $"United States" on 2> $data
  1105. sel=$?
  1106. case $sel in
  1107. 1) exit 1;;
  1108. 255) exit 1;;
  1109. esac
  1110. case $(cat $data) in
  1111. 1) DEBIAN_REPO='ftp.au.debian.org';;
  1112. 2) DEBIAN_REPO='ftp.at.debian.org';;
  1113. 3) DEBIAN_REPO='ftp.by.debian.org';;
  1114. 4) DEBIAN_REPO='ftp.be.debian.org';;
  1115. 5) DEBIAN_REPO='ftp.ba.debian.org';;
  1116. 6) DEBIAN_REPO='ftp.br.debian.org';;
  1117. 7) DEBIAN_REPO='ftp.bg.debian.org';;
  1118. 8) DEBIAN_REPO='ftp.ca.debian.org';;
  1119. 9) DEBIAN_REPO='ftp.cl.debian.org';;
  1120. 10) DEBIAN_REPO='ftp.cn.debian.org';;
  1121. 11) DEBIAN_REPO='ftp.hr.debian.org';;
  1122. 12) DEBIAN_REPO='ftp.cz.debian.org';;
  1123. 13) DEBIAN_REPO='ftp.dk.debian.org';;
  1124. 14) DEBIAN_REPO='ftp.sv.debian.org';;
  1125. 15) DEBIAN_REPO='ftp.ee.debian.org';;
  1126. 16) DEBIAN_REPO='ftp.fi.debian.org';;
  1127. 17) DEBIAN_REPO='ftp2.fr.debian.org';;
  1128. 18) DEBIAN_REPO='ftp.fr.debian.org';;
  1129. 19) DEBIAN_REPO='ftp2.de.debian.org';;
  1130. 20) DEBIAN_REPO='ftp.de.debian.org';;
  1131. 21) DEBIAN_REPO='ftp.gr.debian.org';;
  1132. 22) DEBIAN_REPO='ftp.hu.debian.org';;
  1133. 23) DEBIAN_REPO='ftp.is.debian.org';;
  1134. 24) DEBIAN_REPO='ftp.ir.debian.org';;
  1135. 25) DEBIAN_REPO='ftp.ie.debian.org';;
  1136. 26) DEBIAN_REPO='ftp.it.debian.org';;
  1137. 27) DEBIAN_REPO='ftp.jp.debian.org';;
  1138. 28) DEBIAN_REPO='ftp.kr.debian.org';;
  1139. 29) DEBIAN_REPO='ftp.lt.debian.org';;
  1140. 30) DEBIAN_REPO='ftp.mx.debian.org';;
  1141. 31) DEBIAN_REPO='ftp.nl.debian.org';;
  1142. 32) DEBIAN_REPO='ftp.nc.debian.org';;
  1143. 33) DEBIAN_REPO='ftp.nz.debian.org';;
  1144. 34) DEBIAN_REPO='ftp.no.debian.org';;
  1145. 35) DEBIAN_REPO='ftp.pl.debian.org';;
  1146. 36) DEBIAN_REPO='ftp.pt.debian.org';;
  1147. 37) DEBIAN_REPO='ftp.ro.debian.org';;
  1148. 38) DEBIAN_REPO='ftp.ru.debian.org';;
  1149. 39) DEBIAN_REPO='ftp.sk.debian.org';;
  1150. 40) DEBIAN_REPO='ftp.si.debian.org';;
  1151. 41) DEBIAN_REPO='ftp.es.debian.org';;
  1152. 42) DEBIAN_REPO='ftp.se.debian.org';;
  1153. 43) DEBIAN_REPO='ftp.ch.debian.org';;
  1154. 44) DEBIAN_REPO='ftp.tw.debian.org';;
  1155. 45) DEBIAN_REPO='ftp.th.debian.org';;
  1156. 46) DEBIAN_REPO='ftp.tr.debian.org';;
  1157. 47) DEBIAN_REPO='ftp.ua.debian.org';;
  1158. 48) DEBIAN_REPO='ftp.uk.debian.org';;
  1159. 49) DEBIAN_REPO='ftp.us.debian.org';;
  1160. 255) exit 1;;
  1161. esac
  1162. save_configuration_file
  1163. else
  1164. DEBIAN_REPO='ftp.de.debian.org'
  1165. fi
  1166. if [[ $MINIMAL_INSTALL == "no" && $ONION_ONLY == "no" ]]; then
  1167. data=$(tempfile 2>/dev/null)
  1168. trap "rm -f $data" 0 1 2 5 15
  1169. dialog --backtitle $"Freedombone Configuration" \
  1170. --radiolist $"Pick a domain name service (DNS):" 25 50 16 \
  1171. 1 $"Digital Courage" on \
  1172. 2 $"German Privacy Foundation 1" off \
  1173. 3 $"German Privacy Foundation 2" off \
  1174. 4 $"Chaos Computer Club" off \
  1175. 5 $"ClaraNet" off \
  1176. 6 $"OpenNIC 1" off \
  1177. 7 $"OpenNIC 2" off \
  1178. 8 $"OpenNIC 3" off \
  1179. 9 $"OpenNIC 4" off \
  1180. 10 $"OpenNIC 5" off \
  1181. 11 $"OpenNIC 6" off \
  1182. 12 $"OpenNIC 7" off \
  1183. 13 $"PowerNS" off \
  1184. 14 $"ValiDOM" off \
  1185. 15 $"Freie Unzensierte" off \
  1186. 16 $"Google" off 2> $data
  1187. sel=$?
  1188. case $sel in
  1189. 1) exit 1;;
  1190. 255) exit 1;;
  1191. esac
  1192. case $(cat $data) in
  1193. 1) NAMESERVER1='85.214.73.63'
  1194. NAMESERVER2='213.73.91.35'
  1195. ;;
  1196. 2) NAMESERVER1='87.118.100.175'
  1197. NAMESERVER2='94.75.228.29'
  1198. ;;
  1199. 3) NAMESERVER1='85.25.251.254'
  1200. NAMESERVER2='2.141.58.13'
  1201. ;;
  1202. 4) NAMESERVER1='213.73.91.35'
  1203. NAMESERVER2='85.214.73.63'
  1204. ;;
  1205. 5) NAMESERVER1='212.82.225.7'
  1206. NAMESERVER2='212.82.226.212'
  1207. ;;
  1208. 6) NAMESERVER1='58.6.115.42'
  1209. NAMESERVER2='58.6.115.43'
  1210. ;;
  1211. 7) NAMESERVER1='119.31.230.42'
  1212. NAMESERVER2='200.252.98.162'
  1213. ;;
  1214. 8) NAMESERVER1='217.79.186.148'
  1215. NAMESERVER2='81.89.98.6'
  1216. ;;
  1217. 9) NAMESERVER1='78.159.101.37'
  1218. NAMESERVER2='203.167.220.153'
  1219. ;;
  1220. 10) NAMESERVER1='82.229.244.191'
  1221. NAMESERVER2='82.229.244.191'
  1222. ;;
  1223. 11) NAMESERVER1='216.87.84.211'
  1224. NAMESERVER2='66.244.95.20'
  1225. ;;
  1226. 12) NAMESERVER1='207.192.69.155'
  1227. NAMESERVER2='72.14.189.120'
  1228. ;;
  1229. 13) NAMESERVER1='194.145.226.26'
  1230. NAMESERVER2='77.220.232.44'
  1231. ;;
  1232. 14) NAMESERVER1='78.46.89.147'
  1233. NAMESERVER2='88.198.75.145'
  1234. ;;
  1235. 15) NAMESERVER1='85.25.149.144'
  1236. NAMESERVER2='87.106.37.196'
  1237. ;;
  1238. 16) NAMESERVER1='8.8.8.8'
  1239. NAMESERVER2='4.4.4.4'
  1240. ;;
  1241. 255) exit 1;;
  1242. esac
  1243. save_configuration_file
  1244. else
  1245. # as defaults for a minimal install process these settings are debatable
  1246. NAMESERVER1='85.214.73.63'
  1247. NAMESERVER2='213.73.91.35'
  1248. fi
  1249. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" && $ONION_ONLY == "no" ]]; then
  1250. data=$(tempfile 2>/dev/null)
  1251. trap "rm -f $data" 0 1 2 5 15
  1252. dialog --backtitle $"Freedombone Configuration" \
  1253. --radiolist $"Choose Dynamic DNS provider:" 15 40 14 \
  1254. 1 dyndns off \
  1255. 2 freedns on \
  1256. 3 zoneedit off \
  1257. 4 no-ip off \
  1258. 5 easydns off \
  1259. 6 tzo off \
  1260. 7 3322 off \
  1261. 8 dnsomatic off \
  1262. 9 tunnelbroker off \
  1263. 10 dns.he.net off \
  1264. 11 dynsip off \
  1265. 12 sitelutions off \
  1266. 13 dnsexit off \
  1267. 14 changeip off 2> $data
  1268. sel=$?
  1269. case $sel in
  1270. 1) exit 1;;
  1271. 255) exit 1;;
  1272. esac
  1273. case $(cat $data) in
  1274. 1) DDNS_PROVIDER="default@dyndns.org";;
  1275. 2) DDNS_PROVIDER="default@freedns.afraid.org";;
  1276. 3) DDNS_PROVIDER="default@zoneedit.com";;
  1277. 4) DDNS_PROVIDER="default@no-ip.com";;
  1278. 5) DDNS_PROVIDER="default@easydns.com";;
  1279. 6) DDNS_PROVIDER="default@tzo.com";;
  1280. 7) DDNS_PROVIDER="dyndns@3322.org";;
  1281. 8) DDNS_PROVIDER="default@dnsomatic.com";;
  1282. 9) DDNS_PROVIDER="ipv6tb@he.net";;
  1283. 10) DDNS_PROVIDER="dyndns@he.net";;
  1284. 11) DDNS_PROVIDER="default@dynsip.org";;
  1285. 12) DDNS_PROVIDER="default@sitelutions.com";;
  1286. 13) DDNS_PROVIDER="default@dnsexit.com";;
  1287. 14) DDNS_PROVIDER="default@changeip.com";;
  1288. 255) exit 1;;
  1289. esac
  1290. save_configuration_file
  1291. valid_ddns_username=
  1292. while [ ! $valid_ddns_username ]
  1293. do
  1294. data=$(tempfile 2>/dev/null)
  1295. trap "rm -f $data" 0 1 2 5 15
  1296. dialog --backtitle $"Freedombone Configuration" \
  1297. --inputbox $"Dynamic DNS provider username" 10 30 "$(grep 'DDNS_USERNAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  1298. sel=$?
  1299. case $sel in
  1300. 0) possible_username=$(cat $data)
  1301. if [ "$possible_username" ]; then
  1302. if [ ${#possible_username} -gt 1 ]; then
  1303. valid_ddns_username=$(cat $data)
  1304. DDNS_USERNAME=$valid_ddns_username
  1305. break;
  1306. fi
  1307. fi
  1308. ;;
  1309. 1) exit 1;;
  1310. 255) exit 1;;
  1311. esac
  1312. done
  1313. save_configuration_file
  1314. valid_ddns_password=
  1315. while [ ! $valid_ddns_password ]
  1316. do
  1317. data=$(tempfile 2>/dev/null)
  1318. trap "rm -f $data" 0 1 2 5 15
  1319. dialog --backtitle $"Freedombone Configuration" \
  1320. --clear \
  1321. --insecure \
  1322. --passwordbox $"Dynamic DNS provider password" 10 30 "$(grep 'DDNS_PASSWORD' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  1323. sel=$?
  1324. case $sel in
  1325. 0) possible_password=$(cat $data)
  1326. if [ "$possible_password" ]; then
  1327. if [ ${#possible_password} -gt 1 ]; then
  1328. valid_ddns_password=$(cat $data)
  1329. DDNS_PASSWORD=$valid_ddns_password
  1330. break;
  1331. fi
  1332. fi
  1333. ;;
  1334. 1) exit 1;;
  1335. 255) exit 1;;
  1336. esac
  1337. if [ ${#DDNS_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
  1338. 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
  1339. DDNS_PASSWORD=""
  1340. fi
  1341. done
  1342. save_configuration_file
  1343. fi
  1344. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  1345. valid_name=
  1346. while [ ! $valid_name ]
  1347. do
  1348. data=$(tempfile 2>/dev/null)
  1349. trap "rm -f $data" 0 1 2 5 15
  1350. dialog --backtitle $"Freedombone Configuration" \
  1351. --inputbox $"Your full name (or nick)" 10 30 "$(grep 'MY_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  1352. sel=$?
  1353. case $sel in
  1354. 0) possible_name=$(cat $data)
  1355. if [ "$possible_name" ]; then
  1356. if [ ${#possible_name} -gt 1 ]; then
  1357. valid_name="$possible_name"
  1358. MY_NAME="$possible_name"
  1359. break;
  1360. fi
  1361. fi
  1362. ;;
  1363. 1) exit 1;;
  1364. 255) exit 1;;
  1365. esac
  1366. done
  1367. save_configuration_file
  1368. fi
  1369. if [[ $MINIMAL_INSTALL == "no" && $ONION_ONLY == "no" ]]; then
  1370. SET_STATIC_IP="no"
  1371. dialog --title $"Static local IP address" \
  1372. --backtitle $"Freedombone Configuration" \
  1373. --defaultno \
  1374. --yesno $"\nDo you want to set a static local IP address for this system?\n\nFor example, 192.168.1.10" 10 60
  1375. sel=$?
  1376. case $sel in
  1377. 0) SET_STATIC_IP="yes";;
  1378. 255) exit 1;;
  1379. esac
  1380. if [[ $SET_STATIC_IP == "yes" ]]; then
  1381. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  1382. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep 'LOCAL_NETWORK_STATIC_IP_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
  1383. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  1384. LOCAL_NETWORK_STATIC_IP_ADDRESS='192.168..'
  1385. fi
  1386. fi
  1387. if [ ! $ROUTER_IP_ADDRESS ]; then
  1388. ROUTER_IP_ADDRESS=$(grep 'ROUTER_IP_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
  1389. if [ ! $ROUTER_IP_ADDRESS ]; then
  1390. ROUTER_IP_ADDRESS='192.168..'
  1391. fi
  1392. fi
  1393. data=$(tempfile 2>/dev/null)
  1394. trap "rm -f $data" 0 1 2 5 15
  1395. dialog --backtitle $"Freedombone Configuration" \
  1396. --title $"Local Network Configuration" \
  1397. --form $"\nPlease enter the IP addresses:" 11 55 3 \
  1398. $"This system:" 1 1 "$LOCAL_NETWORK_STATIC_IP_ADDRESS" 1 16 16 15 \
  1399. $"Internet router:" 2 1 "$ROUTER_IP_ADDRESS" 2 16 16 15 \
  1400. 2> $data
  1401. sel=$?
  1402. case $sel in
  1403. 1) exit 1;;
  1404. 255) exit 1;;
  1405. esac
  1406. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(cat $data | sed -n 1p)
  1407. ROUTER_IP_ADDRESS=$(cat $data | sed -n 2p)
  1408. save_configuration_file
  1409. fi
  1410. fi
  1411. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
  1412. if [[ $ONION_ONLY != "no" ]]; then
  1413. WIKI_TITLE='My Wiki'
  1414. WIKI_DOMAIN_NAME='wiki.local'
  1415. else
  1416. WIKI_DETAILS_COMPLETE=
  1417. while [ ! $WIKI_DETAILS_COMPLETE ]
  1418. do
  1419. data=$(tempfile 2>/dev/null)
  1420. trap "rm -f $data" 0 1 2 5 15
  1421. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1422. dialog --backtitle $"Freedombone Configuration" \
  1423. --title $"Wiki Configuration" \
  1424. --form $"\nPlease enter your wiki details:" 11 55 4 \
  1425. $"Title:" 1 1 "$(grep 'WIKI_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1426. $"Domain:" 2 1 "$(grep 'WIKI_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 40 \
  1427. $"Code:" 3 1 "$(grep 'WIKI_CODE' temp.cfg | awk -F '=' '{print $2}')" 3 16 33 255 \
  1428. 2> $data
  1429. else
  1430. dialog --backtitle $"Freedombone Configuration" \
  1431. --title $"Wiki Configuration" \
  1432. --form $"\nPlease enter your wiki details:" 11 55 3 \
  1433. $"Title:" 1 1 "$(grep 'WIKI_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1434. $"Domain:" 2 1 "$(grep 'WIKI_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 40 \
  1435. 2> $data
  1436. fi
  1437. sel=$?
  1438. case $sel in
  1439. 1) exit 1;;
  1440. 255) exit 1;;
  1441. esac
  1442. WIKI_TITLE=$(cat $data | sed -n 1p)
  1443. WIKI_DOMAIN_NAME=$(cat $data | sed -n 2p)
  1444. if [ $WIKI_DOMAIN_NAME ]; then
  1445. TEST_DOMAIN_NAME=$WIKI_DOMAIN_NAME
  1446. validate_domain_name
  1447. if [[ $TEST_DOMAIN_NAME != $WIKI_DOMAIN_NAME ]]; then
  1448. WIKI_DOMAIN_NAME=
  1449. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1450. else
  1451. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1452. WIKI_CODE=$(cat $data | sed -n 3p)
  1453. validate_freedns_code "$WIKI_CODE"
  1454. if [ ! $VALID_CODE ]; then
  1455. WIKI_DOMAIN_NAME=
  1456. fi
  1457. fi
  1458. fi
  1459. fi
  1460. if [ $WIKI_DOMAIN_NAME ]; then
  1461. WIKI_DETAILS_COMPLETE="yes"
  1462. fi
  1463. done
  1464. fi
  1465. save_configuration_file
  1466. fi
  1467. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
  1468. if [[ $ONION_ONLY != "no" ]]; then
  1469. MY_BLOG_TITLE='My Blog'
  1470. FULLBLOG_DOMAIN_NAME='blog.local'
  1471. else
  1472. FULLBLOG_DETAILS_COMPLETE=
  1473. while [ ! $FULLBLOG_DETAILS_COMPLETE ]
  1474. do
  1475. data=$(tempfile 2>/dev/null)
  1476. trap "rm -f $data" 0 1 2 5 15
  1477. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1478. dialog --backtitle $"Freedombone Configuration" \
  1479. --title $"Blog Configuration" \
  1480. --form $"\nPlease enter your blog details:" 11 55 4 \
  1481. $"Title:" 1 1 "$(grep 'MY_BLOG_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1482. $"Domain:" 2 1 "$(grep 'FULLBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 40 \
  1483. $"Code:" 3 1 "$(grep 'FULLBLOG_CODE' temp.cfg | awk -F '=' '{print $2}')" 3 16 33 255 \
  1484. 2> $data
  1485. else
  1486. dialog --backtitle $"Freedombone Configuration" \
  1487. --title $"Blog Configuration" \
  1488. --form $"\nPlease enter your blog details:" 11 55 3 \
  1489. $"Title:" 1 1 "$(grep 'MY_BLOG_TITLE' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1490. $"Domain:" 2 1 "$(grep 'FULLBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 40 \
  1491. 2> $data
  1492. fi
  1493. sel=$?
  1494. case $sel in
  1495. 1) exit 1;;
  1496. 255) exit 1;;
  1497. esac
  1498. MY_BLOG_TITLE=$(cat $data | sed -n 1p)
  1499. FULLBLOG_DOMAIN_NAME=$(cat $data | sed -n 2p)
  1500. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1501. if [[ $FULLBLOG_DOMAIN_NAME == "$WIKI_DOMAIN_NAME" ]]; then
  1502. FULLBLOG_DOMAIN_NAME=""
  1503. fi
  1504. TEST_DOMAIN_NAME=$FULLBLOG_DOMAIN_NAME
  1505. validate_domain_name
  1506. if [[ $TEST_DOMAIN_NAME != $FULLBLOG_DOMAIN_NAME ]]; then
  1507. FULLBLOG_DOMAIN_NAME=
  1508. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1509. else
  1510. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1511. FULLBLOG_CODE=$(cat $data | sed -n 3p)
  1512. validate_freedns_code "$FULLBLOG_CODE"
  1513. if [ ! $VALID_CODE ]; then
  1514. FULLBLOG_DOMAIN_NAME=
  1515. fi
  1516. fi
  1517. fi
  1518. fi
  1519. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1520. FULLBLOG_DETAILS_COMPLETE="yes"
  1521. fi
  1522. done
  1523. fi
  1524. save_configuration_file
  1525. fi
  1526. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
  1527. if [[ $ONION_ONLY != "no" ]]; then
  1528. OWNCLOUD_DOMAIN_NAME='owncloud.local'
  1529. else
  1530. OWNCLOUD_DETAILS_COMPLETE=
  1531. while [ ! $OWNCLOUD_DETAILS_COMPLETE ]
  1532. do
  1533. data=$(tempfile 2>/dev/null)
  1534. trap "rm -f $data" 0 1 2 5 15
  1535. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1536. dialog --backtitle $"Freedombone Configuration" \
  1537. --title $"Owncloud Configuration" \
  1538. --form $"\nPlease enter your Owncloud details:" 11 55 3 \
  1539. $"Domain:" 1 1 "$(grep 'OWNCLOUD_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1540. $"Code:" 2 1 "$(grep 'OWNCLOUD_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 255 \
  1541. 2> $data
  1542. else
  1543. dialog --backtitle $"Freedombone Configuration" \
  1544. --title $"Owncloud Configuration" \
  1545. --form $"\nPlease enter your Owncloud details:" 11 55 3 \
  1546. $"Domain:" 1 1 "$(grep 'OWNCLOUD_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1547. 2> $data
  1548. fi
  1549. sel=$?
  1550. case $sel in
  1551. 1) exit 1;;
  1552. 255) exit 1;;
  1553. esac
  1554. OWNCLOUD_DOMAIN_NAME=$(cat $data | sed -n 1p)
  1555. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1556. TEST_DOMAIN_NAME=$OWNCLOUD_DOMAIN_NAME
  1557. validate_domain_name
  1558. if [[ $TEST_DOMAIN_NAME != $OWNCLOUD_DOMAIN_NAME ]]; then
  1559. OWNCLOUD_DOMAIN_NAME=
  1560. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1561. else
  1562. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1563. OWNCLOUD_CODE=$(cat $data | sed -n 2p)
  1564. validate_freedns_code "$OWNCLOUD_CODE"
  1565. if [ ! $VALID_CODE ]; then
  1566. OWNCLOUD_DOMAIN_NAME=
  1567. fi
  1568. fi
  1569. fi
  1570. fi
  1571. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1572. OWNCLOUD_DETAILS_COMPLETE="yes"
  1573. fi
  1574. done
  1575. fi
  1576. save_configuration_file
  1577. fi
  1578. if [[ $MEDIAGOBLIN_ENABLED == 'yes' ]]; then
  1579. if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
  1580. if [[ $ONION_ONLY != "no" ]]; then
  1581. MEDIAGOBLIN_DOMAIN_NAME='media.local'
  1582. else
  1583. MEDIAGOBLIN_DETAILS_COMPLETE=
  1584. while [ ! $MEDIAGOBLIN_DETAILS_COMPLETE ]
  1585. do
  1586. data=$(tempfile 2>/dev/null)
  1587. trap "rm -f $data" 0 1 2 5 15
  1588. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1589. dialog --backtitle $"Freedombone Configuration" \
  1590. --title $"Mediagoblin Configuration" \
  1591. --form $"\nPlease enter your Mediagoblin details, or just select Ok if you don't need a Mediagoblin site:" 11 55 2 \
  1592. $"Domain:" 1 1 "$(grep 'MEDIAGOBLIN_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1593. $"Code:" 2 1 "$(grep 'MEDIAGOBLIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 255 \
  1594. 2> $data
  1595. else
  1596. dialog --backtitle $"Freedombone Configuration" \
  1597. --title $"Mediagoblin Configuration" \
  1598. --form $"\nPlease enter your Mediagoblin details, or just select Ok if you don't need a Mediagoblin site:" 11 55 2 \
  1599. $"Domain:" 1 1 "$(grep 'MEDIAGOBLIN_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1600. 2> $data
  1601. fi
  1602. sel=$?
  1603. case $sel in
  1604. 1) exit 1;;
  1605. 255) exit 1;;
  1606. esac
  1607. MEDIAGOBLIN_DOMAIN_NAME=$(cat $data | sed -n 1p)
  1608. if [ $MEDIAGOBLIN_DOMAIN_NAME ]; then
  1609. TEST_DOMAIN_NAME=$MEDIAGOBLIN_DOMAIN_NAME
  1610. validate_domain_name
  1611. if [[ $TEST_DOMAIN_NAME != $MEDIAGOBLIN_DOMAIN_NAME ]]; then
  1612. MEDIAGOBLIN_DOMAIN_NAME='invalid'
  1613. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1614. else
  1615. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1616. MEDIAGOBLIN_CODE=$(cat $data | sed -n 2p)
  1617. validate_freedns_code "$MEDIAGOBLIN_CODE"
  1618. if [ ! $VALID_CODE ]; then
  1619. MEDIAGOBLIN_DOMAIN_NAME='invalid'
  1620. fi
  1621. fi
  1622. fi
  1623. fi
  1624. if [ $MEDIAGOBLIN_DOMAIN_NAME ]; then
  1625. if [[ $MEDIAGOBLIN_DOMAIN_NAME == 'invalid' ]]; then
  1626. MEDIAGOBLIN_DOMAIN_NAME=
  1627. else
  1628. MEDIAGOBLIN_DETAILS_COMPLETE="yes"
  1629. fi
  1630. fi
  1631. done
  1632. fi
  1633. save_configuration_file
  1634. fi
  1635. fi
  1636. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
  1637. if [[ $ONION_ONLY != "no" ]]; then
  1638. HUBZILLA_DOMAIN_NAME='hubzilla.local'
  1639. else
  1640. HUBZILLA_DETAILS_COMPLETE=
  1641. while [ ! $HUBZILLA_DETAILS_COMPLETE ]
  1642. do
  1643. data=$(tempfile 2>/dev/null)
  1644. trap "rm -f $data" 0 1 2 5 15
  1645. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1646. dialog --backtitle $"Freedombone Configuration" \
  1647. --title $"Hubzilla Configuration" \
  1648. --form $"\nPlease enter your Hubzilla details.\n\nIMPORTANT: This should be a domain name which is supported by Let's Encrypt:" 14 55 3 \
  1649. $"Domain:" 1 1 "$(grep 'HUBZILLA_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1650. $"Code:" 2 1 "$(grep 'HUBZILLA_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 255 \
  1651. 2> $data
  1652. else
  1653. dialog --backtitle $"Freedombone Configuration" \
  1654. --title $"Hubzilla Configuration" \
  1655. --form $"\nPlease enter your Hubzilla details\n\nIMPORTANT: This should be a domain name which is supported by Let's Encrypt:" 11 55 3 \
  1656. $"Domain:" 1 1 "$(grep 'HUBZILLA_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1657. 2> $data
  1658. fi
  1659. sel=$?
  1660. case $sel in
  1661. 1) exit 1;;
  1662. 255) exit 1;;
  1663. esac
  1664. HUBZILLA_DOMAIN_NAME=$(cat $data | sed -n 1p)
  1665. if [ $HUBZILLA_DOMAIN_NAME ]; then
  1666. TEST_DOMAIN_NAME=$HUBZILLA_DOMAIN_NAME
  1667. validate_domain_name
  1668. if [[ $TEST_DOMAIN_NAME != $HUBZILLA_DOMAIN_NAME ]]; then
  1669. HUBZILLA_DOMAIN_NAME=
  1670. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1671. else
  1672. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1673. HUBZILLA_CODE=$(cat $data | sed -n 2p)
  1674. validate_freedns_code "$HUBZILLA_CODE"
  1675. if [ ! $VALID_CODE ]; then
  1676. HUBZILLA_DOMAIN_NAME=
  1677. fi
  1678. fi
  1679. fi
  1680. fi
  1681. if [ $HUBZILLA_DOMAIN_NAME ]; then
  1682. HUBZILLA_DETAILS_COMPLETE="yes"
  1683. fi
  1684. done
  1685. fi
  1686. save_configuration_file
  1687. fi
  1688. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
  1689. if [[ $ONION_ONLY != "no" ]]; then
  1690. MICROBLOG_DOMAIN_NAME='microblog.local'
  1691. else
  1692. MICROBLOG_DETAILS_COMPLETE=
  1693. while [ ! $MICROBLOG_DETAILS_COMPLETE ]
  1694. do
  1695. data=$(tempfile 2>/dev/null)
  1696. trap "rm -f $data" 0 1 2 5 15
  1697. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1698. dialog --backtitle $"Freedombone Configuration" \
  1699. --title $"Microblog Configuration" \
  1700. --form $"\nPlease enter your Microblog details. Welcome message and background image URL can be left blank.\n\nIMPORTANT: This should be a domain name which is supported by Let's Encrypt:" 16 65 4 \
  1701. $"Domain:" 1 1 "$(grep 'MICROBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 25 33 40 \
  1702. $"Welcome Message:" 2 1 "$(grep '$MICROBLOG_WELCOME_MESSAGE' temp.cfg | awk -F '=' '{print $2}')" 2 25 255 255 \
  1703. $"Background image URL:" 3 1 "$(grep '$MICROBLOG_BACKGROUND_IMAGE_URL' temp.cfg | awk -F '=' '{print $2}')" 3 25 255 255 \
  1704. $"Code:" 4 1 "$(grep 'MICROBLOG_CODE' temp.cfg | awk -F '=' '{print $2}')" 4 25 33 255 \
  1705. 2> $data
  1706. else
  1707. dialog --backtitle $"Freedombone Configuration" \
  1708. --title $"Microblog Configuration" \
  1709. --form $"\nPlease enter your Microblog details. Welcome message and background image URL can be left blank.\n\nIMPORTANT: This should be a domain name which is supported by Let's Encrypt:" 16 65 4 \
  1710. $"Domain:" 1 1 "$(grep 'MICROBLOG_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 25 33 40 \
  1711. $"Welcome Message:" 2 1 "$(grep '$MICROBLOG_WELCOME_MESSAGE' temp.cfg | awk -F '=' '{print $2}')" 2 25 255 255 \
  1712. $"Background image URL:" 3 1 "$(grep '$MICROBLOG_BACKGROUND_IMAGE_URL' temp.cfg | awk -F '=' '{print $2}')" 3 25 255 255 \
  1713. 2> $data
  1714. fi
  1715. sel=$?
  1716. case $sel in
  1717. 1) exit 1;;
  1718. 255) exit 1;;
  1719. esac
  1720. MICROBLOG_DOMAIN_NAME=$(cat $data | sed -n 1p)
  1721. welcome_msg=$(cat $data | sed -n 2p)
  1722. if [ ${#welcome_msg} -gt 1 ]; then
  1723. MICROBLOG_WELCOME_MESSAGE=$welcome_msg
  1724. fi
  1725. img_url=$(cat $data | sed -n 3p)
  1726. if [ ${#img_url} -gt 1 ]; then
  1727. MICROBLOG_BACKGROUND_IMAGE_URL=$img_url
  1728. fi
  1729. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1730. if [[ $MICROBLOG_DOMAIN_NAME == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1731. MICROBLOG_DOMAIN_NAME=""
  1732. fi
  1733. TEST_DOMAIN_NAME=$MICROBLOG_DOMAIN_NAME
  1734. validate_domain_name
  1735. if [[ $TEST_DOMAIN_NAME != $MICROBLOG_DOMAIN_NAME ]]; then
  1736. MICROBLOG_DOMAIN_NAME=
  1737. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1738. else
  1739. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1740. MICROBLOG_CODE=$(cat $data | sed -n 4p)
  1741. validate_freedns_code "$MICROBLOG_CODE"
  1742. if [ ! $VALID_CODE ]; then
  1743. MICROBLOG_DOMAIN_NAME=
  1744. fi
  1745. fi
  1746. fi
  1747. fi
  1748. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1749. MICROBLOG_DETAILS_COMPLETE="yes"
  1750. fi
  1751. done
  1752. fi
  1753. save_configuration_file
  1754. fi
  1755. if [[ $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_FULL" ]]; then
  1756. if [[ $ONION_ONLY != "no" ]]; then
  1757. GIT_DOMAIN_NAME='git.local'
  1758. else
  1759. DEVELOPER_DETAILS_COMPLETE=
  1760. while [ ! $DEVELOPER_DETAILS_COMPLETE ]
  1761. do
  1762. data=$(tempfile 2>/dev/null)
  1763. trap "rm -f $data" 0 1 2 5 15
  1764. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1765. dialog --backtitle $"Freedombone Configuration" \
  1766. --title $"Developer Configuration" \
  1767. --form $"\nPlease enter your Git hosting site details.\nIf You don't need developer tools then just select Ok" 11 55 3 \
  1768. $"Domain:" 1 1 "$(grep 'GIT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1769. $"Code:" 2 1 "$(grep 'GIT_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 255 \
  1770. 2> $data
  1771. else
  1772. dialog --backtitle $"Freedombone Configuration" \
  1773. --title $"Developer Configuration" \
  1774. --form $"\nPlease enter your Git hosting site details.\nIf You don't need developer tools then just select Ok" 11 55 2 \
  1775. $"Domain:" 1 1 "$(grep 'GIT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1776. 2> $data
  1777. fi
  1778. sel=$?
  1779. case $sel in
  1780. 1) exit 1;;
  1781. 255) exit 1;;
  1782. esac
  1783. GIT_DOMAIN_NAME=$(cat $data | sed -n 1p)
  1784. if [ $GIT_DOMAIN_NAME ]; then
  1785. TEST_DOMAIN_NAME=$GIT_DOMAIN_NAME
  1786. validate_domain_name
  1787. if [[ $TEST_DOMAIN_NAME != $GIT_DOMAIN_NAME ]]; then
  1788. GIT_DOMAIN_NAME=
  1789. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1790. else
  1791. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1792. GIT_CODE=$(cat $data | sed -n 2p)
  1793. validate_freedns_code "$GIT_CODE"
  1794. if [ ! $VALID_CODE ]; then
  1795. GIT_DOMAIN_NAME=
  1796. fi
  1797. fi
  1798. fi
  1799. else
  1800. DEVELOPER_DETAILS_COMPLETE="yes"
  1801. fi
  1802. if [ $GIT_DOMAIN_NAME ]; then
  1803. DEVELOPER_DETAILS_COMPLETE="yes"
  1804. fi
  1805. done
  1806. fi
  1807. save_configuration_file
  1808. fi
  1809. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  1810. if [[ $ONION_ONLY != "no" ]]; then
  1811. DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
  1812. else
  1813. DEFAULT_DOMAIN_DETAILS_COMPLETE=
  1814. while [ ! $DEFAULT_DOMAIN_DETAILS_COMPLETE ]
  1815. do
  1816. data=$(tempfile 2>/dev/null)
  1817. trap "rm -f $data" 0 1 2 5 15
  1818. if [[ $DDNS_PROVIDER == "default@freedns.afraid.org" ]]; then
  1819. dialog --backtitle $"Freedombone Configuration" \
  1820. --title $"Your main domain name" \
  1821. --form $"\nWhich domain name should your email/XMPP/IRC/VoIP be associated with?" 11 55 3 \
  1822. $"Domain:" 1 1 "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 1 16 33 40 \
  1823. $"Code:" 2 1 "$(grep 'DEFAULT_DOMAIN_CODE' temp.cfg | awk -F '=' '{print $2}')" 2 16 33 255 \
  1824. 2> $data
  1825. sel=$?
  1826. case $sel in
  1827. 1) exit 1;;
  1828. 255) exit 1;;
  1829. esac
  1830. DEFAULT_DOMAIN_NAME=$(cat $data | sed -n 1p)
  1831. DEFAULT_DOMAIN_CODE=$(cat $data | sed -n 2p)
  1832. if [ $DEFAULT_DOMAIN_NAME ]; then
  1833. validate_freedns_code "$DEFAULT_DOMAIN_CODE"
  1834. if [ ! $VALID_CODE ]; then
  1835. DEFAULT_DOMAIN_NAME=
  1836. fi
  1837. fi
  1838. else
  1839. dialog --backtitle $"Freedombone Configuration" \
  1840. --inputbox $"Which domain name should your email/XMPP/IRC/VoIP be associated with?" 10 45 \
  1841. "$(grep 'DEFAULT_DOMAIN_NAME' temp.cfg | awk -F '=' '{print $2}')" 2> $data
  1842. sel=$?
  1843. case $sel in
  1844. 0) DEFAULT_DOMAIN_NAME=$(cat $data);;
  1845. 1) exit 1;;
  1846. 255) exit 1;;
  1847. esac
  1848. fi
  1849. if [ $DEFAULT_DOMAIN_NAME ]; then
  1850. TEST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  1851. validate_domain_name
  1852. if [[ $TEST_DOMAIN_NAME != $DEFAULT_DOMAIN_NAME ]]; then
  1853. DEFAULT_DOMAIN_NAME=
  1854. dialog --title $"Domain name validation" --msgbox "$TEST_DOMAIN_NAME" 15 50
  1855. else
  1856. DEFAULT_DOMAIN_DETAILS_COMPLETE="yes"
  1857. fi
  1858. fi
  1859. done
  1860. fi
  1861. save_configuration_file
  1862. if [[ $ONION_ONLY != "no" ]]; then
  1863. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  1864. else
  1865. while [ ${#MY_EMAIL_ADDRESS} -lt 5 ]
  1866. do
  1867. EMAIL_ADDRESS=$(grep 'MY_EMAIL_ADDRESS' temp.cfg | awk -F '=' '{print $2}')
  1868. if [ ! $EMAIL_ADDRESS ]; then
  1869. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  1870. fi
  1871. if [ ${#MY_EMAIL_ADDRESS} -lt 5 ]; then
  1872. EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  1873. fi
  1874. data=$(tempfile 2>/dev/null)
  1875. trap "rm -f $data" 0 1 2 5 15
  1876. dialog --backtitle $"Freedombone Configuration" \
  1877. --inputbox $"Your email address" 10 30 "$EMAIL_ADDRESS" 2> $data
  1878. sel=$?
  1879. case $sel in
  1880. 0) MY_EMAIL_ADDRESS=$(cat $data);;
  1881. 1) exit 1;;
  1882. 255) exit 1;;
  1883. esac
  1884. done
  1885. fi
  1886. save_configuration_file
  1887. fi
  1888. # delete the temporary configuration file
  1889. if [ -f temp.cfg ]; then
  1890. shred -zu temp.cfg
  1891. fi
  1892. }
  1893. function show_result {
  1894. #clear
  1895. echo ''
  1896. echo -n $"Configuration filename:"
  1897. echo " $CONFIGURATION_FILE"
  1898. echo ''
  1899. echo $'Contents:'
  1900. echo ''
  1901. cat $CONFIGURATION_FILE
  1902. echo ''
  1903. }
  1904. function read_configuration {
  1905. if [ ! $CONFIGURATION_FILE ]; then
  1906. CONFIGURATION_FILE='freedombone.cfg'
  1907. fi
  1908. if [ -f $CONFIGURATION_FILE ]; then
  1909. if grep -q "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE; then
  1910. FRIENDS_MIRRORS_SERVER=$(grep "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1911. fi
  1912. if grep -q "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE; then
  1913. FRIENDS_MIRRORS_SSH_PORT=$(grep "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1914. fi
  1915. if grep -q "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  1916. FRIENDS_MIRRORS_PASSWORD=$(grep "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1917. fi
  1918. if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
  1919. ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1920. fi
  1921. if grep -q "GIT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1922. GIT_DOMAIN_NAME=$(grep "GIT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1923. fi
  1924. if grep -q "GIT_CODE" $CONFIGURATION_FILE; then
  1925. GIT_CODE=$(grep "GIT_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1926. fi
  1927. if grep -q "MY_USERNAME" $CONFIGURATION_FILE; then
  1928. MY_USERNAME=$(grep "MY_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1929. fi
  1930. if grep -q "DOMAIN_NAME" $CONFIGURATION_FILE; then
  1931. # for backwards compatability
  1932. DEFAULT_DOMAIN_NAME=$(grep "DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1933. fi
  1934. if grep -q "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1935. DEFAULT_DOMAIN_NAME=$(grep "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1936. fi
  1937. if grep -q "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE; then
  1938. DEFAULT_DOMAIN_CODE=$(grep "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1939. fi
  1940. if grep -q "NAMESERVER1" $CONFIGURATION_FILE; then
  1941. NAMESERVER1=$(grep "NAMESERVER1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1942. fi
  1943. if grep -q "NAMESERVER2" $CONFIGURATION_FILE; then
  1944. NAMESERVER2=$(grep "NAMESERVER2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1945. fi
  1946. if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
  1947. DEBIAN_REPO=$(grep "DEBIAN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1948. CHECK_MESSAGE="Check your internet connection, /etc/network/interfaces and /etc/resolv.conf, then delete $COMPLETION_FILE, run 'rm -fR /var/lib/apt/lists/* && apt-get update --fix-missing' and run this script again. If hash sum mismatches persist then try setting $DEBIAN_REPO to a different mirror and also change /etc/apt/sources.list."
  1949. fi
  1950. if grep -q "DDNS_PROVIDER" $CONFIGURATION_FILE; then
  1951. DDNS_PROVIDER=$(grep "DDNS_PROVIDER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1952. fi
  1953. if grep -q "DDNS_USERNAME" $CONFIGURATION_FILE; then
  1954. DDNS_USERNAME=$(grep "DDNS_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1955. fi
  1956. if grep -q "DDNS_PASSWORD" $CONFIGURATION_FILE; then
  1957. DDNS_PASSWORD=$(grep "DDNS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1958. fi
  1959. if grep -q "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE; then
  1960. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1961. fi
  1962. if grep -q "ENABLE_CJDNS" $CONFIGURATION_FILE; then
  1963. ENABLE_CJDNS=$(grep "ENABLE_CJDNS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1964. fi
  1965. if grep -q "ENABLE_BATMAN" $CONFIGURATION_FILE; then
  1966. ENABLE_BATMAN=$(grep "ENABLE_BATMAN" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1967. fi
  1968. if grep -q "ENABLE_BABEL" $CONFIGURATION_FILE; then
  1969. ENABLE_BABEL=$(grep "ENABLE_BABEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1970. fi
  1971. if grep -q "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE; then
  1972. ROUTER_IP_ADDRESS=$(grep "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1973. fi
  1974. if grep -q "WIKI_TITLE" $CONFIGURATION_FILE; then
  1975. WIKI_TITLE=$(grep "WIKI_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1976. fi
  1977. if grep -q "MY_NAME" $CONFIGURATION_FILE; then
  1978. MY_NAME=$(grep "MY_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1979. fi
  1980. if grep -q "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE; then
  1981. MY_EMAIL_ADDRESS=$(grep "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1982. fi
  1983. if grep -q "INSTALLING_ON_BBB" $CONFIGURATION_FILE; then
  1984. INSTALLING_ON_BBB=$(grep "INSTALLING_ON_BBB" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1985. fi
  1986. if grep -q "USB_DRIVE" $CONFIGURATION_FILE; then
  1987. USB_DRIVE=$(grep "USB_DRIVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1988. fi
  1989. if grep -q "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE; then
  1990. PUBLIC_MAILING_LIST=$(grep "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1991. fi
  1992. if grep -q "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1993. MICROBLOG_DOMAIN_NAME=$(grep "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1994. fi
  1995. if grep -q "MICROBLOG_CODE" $CONFIGURATION_FILE; then
  1996. MICROBLOG_CODE=$(grep "MICROBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1997. fi
  1998. if grep -q "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE; then
  1999. MICROBLOG_WELCOME_MESSAGE=$(grep "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2000. fi
  2001. if grep -q "MICROBLOG_BACKGROUND_IMAGE_URL" $CONFIGURATION_FILE; then
  2002. MICROBLOG_BACKGROUND_IMAGE_URL=$(grep "MICROBLOG_BACKGROUND_IMAGE_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2003. fi
  2004. if grep -q "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE; then
  2005. HUBZILLA_DOMAIN_NAME=$(grep "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2006. fi
  2007. if grep -q "HUBZILLA_CODE" $CONFIGURATION_FILE; then
  2008. HUBZILLA_CODE=$(grep "HUBZILLA_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2009. fi
  2010. if grep -q "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE; then
  2011. OWNCLOUD_DOMAIN_NAME=$(grep "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2012. fi
  2013. if grep -q "OWNCLOUD_CODE" $CONFIGURATION_FILE; then
  2014. OWNCLOUD_CODE=$(grep "OWNCLOUD_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2015. fi
  2016. if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
  2017. MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2018. fi
  2019. if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
  2020. MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2021. fi
  2022. if grep -q "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE; then
  2023. WIKI_DOMAIN_NAME=$(grep "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2024. fi
  2025. if grep -q "WIKI_CODE" $CONFIGURATION_FILE; then
  2026. WIKI_CODE=$(grep "WIKI_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2027. fi
  2028. if grep -q "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  2029. FULLBLOG_DOMAIN_NAME=$(grep "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2030. fi
  2031. if grep -q "FULLBLOG_CODE" $CONFIGURATION_FILE; then
  2032. FULLBLOG_CODE=$(grep "FULLBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2033. fi
  2034. if grep -q "MY_BLOG_TITLE" $CONFIGURATION_FILE; then
  2035. MY_BLOG_TITLE=$(grep "MY_BLOG_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2036. fi
  2037. if grep -q "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE; then
  2038. MY_BLOG_SUBTITLE=$(grep "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2039. fi
  2040. if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
  2041. MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2042. fi
  2043. if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
  2044. MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2045. fi
  2046. if grep -q "ESSID" $CONFIGURATION_FILE; then
  2047. ESSID=$(grep "ESSID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2048. fi
  2049. if grep -q "BATMAN_CELLID" $CONFIGURATION_FILE; then
  2050. BATMAN_CELLID=$(grep "BATMAN_CELLID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2051. fi
  2052. if grep -q "WIFI_CHANNEL" $CONFIGURATION_FILE; then
  2053. WIFI_CHANNEL=$(grep "WIFI_CHANNEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2054. fi
  2055. if grep -q "ONION_ONLY" $CONFIGURATION_FILE; then
  2056. ONION_ONLY=$(grep "ONION_ONLY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  2057. fi
  2058. fi
  2059. }
  2060. read_configuration
  2061. interactive_configuration
  2062. show_result
  2063. exit 0