freedombone-image-customise 43KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Based on bin/freedombox-customize from freedom-maker
  12. #
  13. # License
  14. # =======
  15. #
  16. # This program is free software: you can redistribute it and/or modify
  17. # it under the terms of the GNU Affero General Public License as published by
  18. # the Free Software Foundation, either version 3 of the License, or
  19. # (at your option) any later version.
  20. #
  21. # This program is distributed in the hope that it will be useful,
  22. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  24. # GNU Affero General Public License for more details.
  25. #
  26. # You should have received a copy of the GNU Affero General Public License
  27. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  28. set -e
  29. set -x
  30. PROJECT_NAME='freedombone'
  31. INSTALL_DIR=/root/build
  32. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  33. PROJECT_REPO="https://github.com/bashrc/${PROJECT_NAME}"
  34. VARIANT='full'
  35. # username created by default within a debian image
  36. GENERIC_IMAGE_USERNAME='fbone'
  37. export TEXTDOMAIN=${PROJECT_NAME}-image-customise
  38. export TEXTDOMAINDIR="/usr/share/locale"
  39. # Whether to minimise the number of decisions during interactive install
  40. MINIMAL_INSTALL="yes"
  41. MY_USERNAME='debian'
  42. MY_PASSWORD="${PROJECT_NAME}"
  43. # Minimum number of characters in a password
  44. MINIMUM_PASSWORD_LENGTH=10
  45. # IP address of the router (gateway)
  46. ROUTER_IP_ADDRESS="192.168.1.254"
  47. # The fixed IP address of the Beaglebone Black on your local network
  48. BOX_IP_ADDRESS="192.168.1.55"
  49. # DNS
  50. NAMESERVER1='213.73.91.35'
  51. NAMESERVER2='85.214.20.141'
  52. # optional configuration file containing freedombone settings
  53. CONFIG_FILENAME=
  54. # Optional ssh public key to allow
  55. SSH_PUBKEY="no"
  56. # Whether this is a generic image for mass redistribution on the interwebs
  57. GENERIC_IMAGE="no"
  58. # default SSH port
  59. SSH_PORT=2222
  60. # for mesh installs
  61. TRACKER_PORT=6969
  62. # Whether sites are accessible only within a Tor browser
  63. ONION_ONLY="no"
  64. # Whether to only install debian and nothing else
  65. DEBIAN_INSTALL_ONLY="no"
  66. # wifi settings
  67. WIFI_INTERFACE='wlan0'
  68. WIFI_SSID=
  69. WIFI_TYPE='wpa2-psk'
  70. WIFI_PASSPHRASE=
  71. WIFI_HOTSPOT='no'
  72. WIFI_NETWORKS_FILE=~/${PROJECT_NAME}-wifi.cfg
  73. # Whether to install non-free wifi drivers for the mesh client
  74. INSECURE='no'
  75. # optional desktop background image for mesh
  76. MESH_DESKTOP_BACKGROUND_IMAGE=/usr/local/share/${PROJECT_NAME}_mesh_initial_background.png
  77. # The browser application to use
  78. BROWSER=midori
  79. MESH_INSTALL_DIR=/var/lib
  80. # for mesh installs whether to delete all data and generate
  81. # a new identity at every shutdown/boot
  82. AMNESIC='no'
  83. # defines the initial keyboard layout
  84. KEYBOARD_MAP='gb'
  85. # Strings used for setting the username
  86. MESH_TITLE=$"Freedombone Mesh"
  87. MESH_SET_USERNAME=$"Welcome to the Freedombone mesh.\n\nThe first thing you will need to do is set a username so that other peers can find you."
  88. # Whether to enable zeronet on the mesh
  89. ENABLE_ZERONET=
  90. MESH_TEXT_EDITOR='pluma'
  91. PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
  92. function configure_backports {
  93. echo "deb http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-backports main" >> $rootdir/etc/apt/sources.list
  94. }
  95. function configure_contrib_repo {
  96. if ! grep -q "contrib" $rootdir/etc/apt/sources.list; then
  97. chroot "$rootdir" /bin/sed -i "s| main| main contrib|g" /etc/apt/sources.list
  98. fi
  99. }
  100. enable_eatmydata_override() {
  101. chroot $rootdir apt-get install -y eatmydata
  102. if [ -x $rootdir/usr/bin/eatmydata ] && \
  103. [ ! -f $rootdir/etc/apt/apt.conf.d/95debian-edu-install-dpkg-eatmydata ]; then
  104. echo $"info: Adding apt config to call dpkg via eatmydata"
  105. printf "#!/bin/sh\nexec eatmydata dpkg \"\$@\"\n" \
  106. > $rootdir/var/tmp/dpkg-eatmydata
  107. chmod 755 $rootdir/var/tmp/dpkg-eatmydata
  108. cat > $rootdir/etc/apt/apt.conf.d/95debian-edu-install-dpkg-eatmydata <<EOF
  109. Dir::Bin::dpkg "/var/tmp/dpkg-eatmydata";
  110. EOF
  111. else
  112. echo $"error: unable to find /usr/bin/eatmydata after installing the eatmydata package"
  113. fi
  114. }
  115. disable_eatmydata_override() {
  116. for override in \
  117. /etc/apt/apt.conf.d/95debian-edu-install-dpkg-eatmydata \
  118. /var/tmp/dpkg-eatmydata ; do
  119. echo $"info: Removing apt config to call dpkg via eatmydata"
  120. if [ -f $rootdir$override ] ; then
  121. rm -f $rootdir$override
  122. else
  123. echo $"warning: missing $rootdir$override"
  124. fi
  125. done
  126. sync # Flush file buffers before continuing
  127. }
  128. set_apt_sources() {
  129. NEW_MIRROR="$1"
  130. COMPONENTS="main"
  131. cat <<EOF > etc/apt/sources.list
  132. deb $NEW_MIRROR $SUITE $COMPONENTS
  133. deb-src $NEW_MIRROR $SUITE $COMPONENTS
  134. #deb http://security.debian.org/ $SUITE/updates main
  135. #deb-src http://security.debian.org/ $SUITE/updates main
  136. EOF
  137. }
  138. configure_networking() {
  139. if [[ $DEBIAN_INSTALL_ONLY != "no" ]]; then
  140. return
  141. fi
  142. if [[ $GENERIC_IMAGE == "no" ]]; then
  143. echo "# This file describes the network interfaces available on your system
  144. # and how to activate them. For more information, see interfaces(5).
  145. # The loopback network interface
  146. auto lo
  147. iface lo inet loopback
  148. # The primary network interface
  149. auto eth0
  150. iface eth0 inet static
  151. address $BOX_IP_ADDRESS
  152. netmask 255.255.255.0
  153. gateway $ROUTER_IP_ADDRESS
  154. dns-nameservers $NAMESERVER1 $NAMESERVER2
  155. # Example to keep MAC address between reboots
  156. #hwaddress ether B5:A2:BE:3F:1A:FE
  157. # The secondary network interface
  158. #auto eth1
  159. #iface eth1 inet dhcp
  160. # WiFi Example
  161. #auto wlan0
  162. #iface wlan0 inet dhcp
  163. # wpa-ssid \"essid\"
  164. # wpa-psk \"password\"
  165. # Ethernet/RNDIS gadget (g_ether)
  166. # ... or on host side, usbnet and random hwaddr
  167. # Note on some boards, usb0 is automaticly setup with an init script
  168. #iface usb0 inet static
  169. # address 192.168.7.2
  170. # netmask 255.255.255.0
  171. # network 192.168.7.0
  172. # gateway 192.168.7.1" > $rootdir/etc/network/interfaces
  173. hexarray=( 1 2 3 4 5 6 7 8 9 0 a b c d e f )
  174. a=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
  175. b=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
  176. c=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
  177. d=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
  178. e=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
  179. sed -i "s|#hwaddress ether.*|hwaddress ether de:$a:$b:$c:$d:$e|g" \
  180. $rootdir/etc/network/interfaces
  181. fi
  182. sed -i "s/nameserver.*/nameserver $NAMESERVER1/g" $rootdir/etc/resolv.conf
  183. sed -i "/nameserver $NAMESERVER1/a\nameserver $NAMESERVER2" $rootdir/etc/resolv.conf
  184. if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then
  185. # change the motd to show further install instructions
  186. echo $"
  187. .---. . .
  188. | | |
  189. |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  190. | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  191. ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  192. Initial base install
  193. Your system is not yet installed. To complete the process run the
  194. following commands, then enter your details.
  195. sudo su
  196. ${PROJECT_NAME} menuconfig
  197. " > $rootdir/etc/motd
  198. else
  199. echo $"
  200. .---. . .
  201. | | |
  202. |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  203. | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  204. ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  205. Freedom in the Mesh
  206. " > $rootdir/etc/motd
  207. fi
  208. }
  209. configure_ssh() {
  210. if [[ $VARIANT == "mesh" || $VARIANT == "meshclient" || $VARIANT == "meshusb" ]]; then
  211. return
  212. fi
  213. sed -i "s/Port .*/Port ${SSH_PORT}/g" $rootdir/etc/ssh/sshd_config
  214. if [[ "$SSH_PUBKEY" != "no" ]]; then
  215. if [ ! -d $rootdir/home/$MY_USERNAME/.ssh ]; then
  216. mkdir $rootdir/home/$MY_USERNAME/.ssh
  217. fi
  218. echo "$SSH_PUBKEY" > $rootdir/home/$MY_USERNAME/.ssh/authorized_keys
  219. chroot $rootdir /bin/chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  220. sed -i 's|PasswordAuthentication.*|PasswordAuthentication no|g' $rootdir/etc/ssh/sshd_config
  221. echo $"Using ssh public key:"
  222. echo $SSH_PUBKEY
  223. echo $'Password ssh authentication turned off'
  224. fi
  225. }
  226. admin_user_sudo() {
  227. echo "$MY_USERNAME ALL=(ALL) ALL" >> $rootdir/etc/sudoers
  228. }
  229. create_generic_image() {
  230. if [[ $DEBIAN_INSTALL_ONLY != "no" ]]; then
  231. return
  232. fi
  233. if [[ $GENERIC_IMAGE == "no" ]]; then
  234. return
  235. fi
  236. if [ $CONFIG_FILENAME ]; then
  237. if [[ "$CONFIG_FILENAME" == *"mesh.cfg"* ]]; then
  238. VARIANT="mesh"
  239. fi
  240. fi
  241. # Don't install any configuration. This will be a base system
  242. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then
  243. CONFIG_FILENAME=
  244. else
  245. touch $rootdir/root/.initial_mesh_setup
  246. fi
  247. # Stick with the existing login for mesh clients
  248. if [[ $VARIANT == "meshclient" || $VARIANT == "meshusb" ]]; then
  249. return
  250. fi
  251. # The presence of this file indicates that the initial
  252. # setup has not yet been completed
  253. touch $rootdir/home/$MY_USERNAME/.initial_setup
  254. chroot $rootdir /bin/chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.initial_setup
  255. touch $rootdir/root/.initial_setup
  256. cat >> $rootdir/home/$MY_USERNAME/.bashrc <<EOF
  257. # initial setup of the system
  258. if [ -f ~/.initial_setup ]; then
  259. clear
  260. echo "
  261. .---. . .
  262. | | |
  263. |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  264. | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  265. ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  266. Initial setup process
  267. Please enter your password a second time.
  268. "
  269. sudo su
  270. fi
  271. EOF
  272. echo "MY_USERNAME=${MY_USERNAME}" >> $rootdir/root/.bashrc
  273. echo "SSH_PORT=${SSH_PORT}" >> $rootdir/root/.bashrc
  274. echo '# initial setup of the system' >> $rootdir/root/.bashrc
  275. echo 'if [ -f ~/.initial_setup ]; then' >> $rootdir/root/.bashrc
  276. echo ' if [ -f ~/login.txt ]; then' >> $rootdir/root/.bashrc
  277. echo ' NEW_USER_PASSWORD=$(printf `cat ~/login.txt`)' >> $rootdir/root/.bashrc
  278. echo ' else' >> $rootdir/root/.bashrc
  279. echo ' ENTROPY=$(cat /proc/sys/kernel/random/entropy_avail)' >> $rootdir/root/.bashrc
  280. echo ' if [ $ENTROPY -lt 500 ]; then' >> $rootdir/root/.bashrc
  281. ENTROPY_MESSAGE1=$'Initial setup process'
  282. ENTROPY_MESSAGE2=$'Password Generation'
  283. ENTROPY_MESSAGE3=$'WARNING: The entropy available on this system is too low to generate a password.\n\nThe installation process cannot continue.'
  284. echo " dialog --backtitle \"${ENTROPY_MESSAGE1}\" --title \"${ENTROPY_MESSAGE2}\" --msgbox \"${ENTROPY_MESSAGE3}\" 8 50" >> $rootdir/root/.bashrc
  285. echo ' exit' >> $rootdir/root/.bashrc
  286. echo ' fi' >> $rootdir/root/.bashrc
  287. echo -n ' NEW_USER_PASSWORD="$(openssl rand -base64 30 | cut -c1-' >> $rootdir/root/.bashrc
  288. echo "${DEFAULT_PASSWORD_LENGTH})\"" >> $rootdir/root/.bashrc
  289. echo ' fi' >> $rootdir/root/.bashrc
  290. echo ' echo "${NEW_USER_PASSWORD}" > ~/login.txt' >> $rootdir/root/.bashrc
  291. echo ' clear' >> $rootdir/root/.bashrc
  292. echo ' echo ""' >> $rootdir/root/.bashrc
  293. NEW_LOGIN_PASSWORD_MESSAGE1=$'Your new login password is:'
  294. NEW_LOGIN_PASSWORD_MESSAGE2=$'Use it whenever you wish to ssh into this system.'
  295. NEW_LOGIN_PASSWORD_MESSAGE3=$'IMPORTANT: Please take a moment to enter the above password into a\npassword manager or write it down somewhere.'
  296. PRESS_KEY_MESSAGE=$'Press any key to continue...'
  297. echo " echo \"${NEW_LOGIN_PASSWORD_MESSAGE1}\"" >> $rootdir/root/.bashrc
  298. echo ' echo ""' >> $rootdir/root/.bashrc
  299. echo ' echo " ${NEW_USER_PASSWORD}"' >> $rootdir/root/.bashrc
  300. echo ' echo ""' >> $rootdir/root/.bashrc
  301. echo " echo \"${NEW_LOGIN_PASSWORD_MESSAGE2}\"" >> $rootdir/root/.bashrc
  302. echo ' echo ""' >> $rootdir/root/.bashrc
  303. echo " echo \"${NEW_LOGIN_PASSWORD_MESSAGE3}\"" >> $rootdir/root/.bashrc
  304. echo ' echo ""' >> $rootdir/root/.bashrc
  305. echo " read -n1 -r -p \"${PRESS_KEY_MESSAGE}\" key" >> $rootdir/root/.bashrc
  306. # change the password for the admin user
  307. echo -n " echo \"${MY_USERNAME}:" >> $rootdir/root/.bashrc
  308. echo '$(printf `cat ~/login.txt`)"|chpasswd' >> $rootdir/root/.bashrc
  309. # update before continuing
  310. echo " cd /root/${PROJECT_NAME}" >> $rootdir/root/.bashrc
  311. echo " git stash" >> $rootdir/root/.bashrc
  312. echo " git pull" >> $rootdir/root/.bashrc
  313. echo " make install" >> $rootdir/root/.bashrc
  314. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "usb" ]]; then
  315. if [[ $ONION_ONLY == "no" ]]; then
  316. if [[ $MINIMAL_INSTALL == "no" ]]; then
  317. echo " ${PROJECT_NAME} menuconfig-full" >> $rootdir/root/.bashrc
  318. else
  319. echo " ${PROJECT_NAME} menuconfig" >> $rootdir/root/.bashrc
  320. fi
  321. else
  322. echo " ${PROJECT_NAME} menuconfig-onion" >> $rootdir/root/.bashrc
  323. fi
  324. else
  325. echo " echo ''" >> $rootdir/root/.bashrc
  326. fi
  327. echo ' if [ "$?" = "0" ]; then' >> $rootdir/root/.bashrc
  328. echo " if [ -f ~/${PROJECT_NAME}-completed.txt ]; then" >> $rootdir/root/.bashrc
  329. # Remove the initial setup files
  330. echo ' rm /root/.initial_setup' >> $rootdir/root/.bashrc
  331. echo " rm /home/${MY_USERNAME}/.initial_setup" >> $rootdir/root/.bashrc
  332. echo " touch /root/.remove_${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  333. echo ' shred -zu ~/login.txt' >> $rootdir/root/.bashrc
  334. END_MESSAGE1=$'Congratulations!'
  335. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "usb" ]]; then
  336. END_MESSAGE2=$'\nYour system has now installed\n\nThe onion ssh service is at:\n\n ssh ${MY_USERNAME}@${SSH_ONION_HOSTNAME} -p ${SSH_PORT}\n\nTo copy the above address hold down the shift key and double left click on it, then right click and select "copy".\n\nPress any key to reboot and begin using the system'
  337. echo ' SSH_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_ssh/hostname)' >> $rootdir/root/.bashrc
  338. echo ' if [ ${#SSH_ONION_HOSTNAME} -lt 2 ]; then' >> $rootdir/root/.bashrc
  339. echo ' exit 62392' >> $rootdir/root/.bashrc
  340. echo ' fi' >> $rootdir/root/.bashrc
  341. END_MESSAGE_HEIGHT=16
  342. else
  343. END_MESSAGE2=$'\nYour system has now installed\n\nPress any key to reboot and begin using it'
  344. END_MESSAGE_HEIGHT=12
  345. fi
  346. echo " dialog --title '$END_MESSAGE1' --msgbox \"$END_MESSAGE2\" ${END_MESSAGE_HEIGHT} 60" >> $rootdir/root/.bashrc
  347. echo ' reboot' >> $rootdir/root/.bashrc
  348. echo ' fi' >> $rootdir/root/.bashrc
  349. echo ' else' >> $rootdir/root/.bashrc
  350. echo ' key=' >> $rootdir/root/.bashrc
  351. echo ' while [[ $key != "x" ]]; do' >> $rootdir/root/.bashrc
  352. INSTALL_FAIL_MESSAGE=$"Install failed. Press x to continue..."
  353. echo " read -n1 -r -p \"${INSTALL_FAIL_MESSAGE}\" key" >> $rootdir/root/.bashrc
  354. echo ' done' >> $rootdir/root/.bashrc
  355. echo ' fi' >> $rootdir/root/.bashrc
  356. echo ' exit' >> $rootdir/root/.bashrc
  357. echo 'else' >> $rootdir/root/.bashrc
  358. echo ' # Remove default account after install' >> $rootdir/root/.bashrc
  359. echo " if [ -f /root/.remove_${GENERIC_IMAGE_USERNAME} ]; then" >> $rootdir/root/.bashrc
  360. echo " if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then" >> $rootdir/root/.bashrc
  361. echo " userdel -r ${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  362. echo " if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then" >> $rootdir/root/.bashrc
  363. echo " rm -rf /home/${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  364. echo " rm /root/.remove_${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  365. echo ' fi' >> $rootdir/root/.bashrc
  366. echo ' fi' >> $rootdir/root/.bashrc
  367. echo ' fi' >> $rootdir/root/.bashrc
  368. echo 'fi' >> $rootdir/root/.bashrc
  369. }
  370. continue_installation() {
  371. # If a configuration file exists then run with it
  372. # otherwise the interactive installer can be used
  373. # This is equivalent to installing freedombox-setup on freedombox
  374. if [ $CONFIG_FILENAME ]; then
  375. if [ ${#CONFIG_FILENAME} -gt 2 ]; then
  376. cp $CONFIG_FILENAME $rootdir/root/$PROJECT_NAME.cfg
  377. cat $rootdir/root/$PROJECT_NAME.cfg
  378. chroot "$rootdir" su -c "$PROJECT_NAME -c /root/$PROJECT_NAME.cfg" - root
  379. fi
  380. fi
  381. }
  382. atheros_wifi() {
  383. firmware_filename="open-ath9k-htc-firmware_1.3-1_all.deb"
  384. firmware_hash='5fea58ffefdf0ef15b504db7fbe3bc078c03e0d927bba64085e4b6f2546102f5'
  385. firmware_url="http://us.archive.trisquel.info/trisquel/pool/main/o/open-ath9k-htc-firmware/$firmware_filename"
  386. firmware_tempfile="/tmp/$firmware_filename"
  387. wget "$firmware_url" -O "$rootdir$firmware_tempfile"
  388. downloaded_firmware_hash=$(sha256sum "$rootdir$firmware_tempfile" | awk -F ' ' '{print $1}')
  389. if [[ "$downloaded_firmware_hash" == "$firmware_hash" ]]; then
  390. chroot "$rootdir" dpkg -i "$firmware_tempfile"
  391. else
  392. echo 'WARNING: Atheros Wifi firmware hash does not match. The driver has not been installed.'
  393. fi
  394. }
  395. configure_wifi() {
  396. if [[ $VARIANT == "mesh" || $VARIANT == "meshclient" || $VARIANT == "meshusb" ]]; then
  397. return
  398. fi
  399. if [ -f $WIFI_NETWORKS_FILE ]; then
  400. chroot "$rootdir" ${PROJECT_NAME}-wifi -i $WIFI_INTERFACE --networks $WIFI_NETWORKS_FILE
  401. return
  402. fi
  403. if [[ $WIFI_TYPE != 'none' ]]; then
  404. if [ ${#WIFI_PASSPHRASE} -lt 2 ]; then
  405. return
  406. fi
  407. chroot "$rootdir" ${PROJECT_NAME}-wifi -i $WIFI_INTERFACE -s $WIFI_SSID -t $WIFI_TYPE -p $WIFI_PASSPHRASE --hotspot $WIFI_HOTSPOT
  408. else
  409. chroot "$rootdir" ${PROJECT_NAME}-wifi -i $WIFI_INTERFACE -s $WIFI_SSID -t $WIFI_TYPE --hotspot $WIFI_HOTSPOT
  410. fi
  411. }
  412. ##############################################################################
  413. # Mesh networking
  414. ##############################################################################
  415. # for mesh installs
  416. TRACKER_PORT=6969
  417. WIFI_CHANNEL=2
  418. # B.A.T.M.A.N settings
  419. BATMAN_CELLID='02:BA:00:00:03:01'
  420. WIFI_SSID='mesh'
  421. # To avoid confusions these are obtained from the main project file
  422. TOXID_REPO=
  423. TOX_PORT=
  424. TOXCORE_REPO=
  425. TOXIC_REPO=
  426. TOXCORE_COMMIT=
  427. TOXIC_COMMIT=
  428. # These are some default nodes, but you can replace them with trusted nodes
  429. # as you prefer. See https://wiki.tox.im/Nodes
  430. TOX_NODES=
  431. #TOX_NODES=(
  432. # '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
  433. # '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
  434. #)
  435. # To avoid confusions these are obtained from the main project file
  436. ZERONET_REPO=
  437. ZERONET_COMMIT=
  438. ZERONET_PORT=
  439. ZERONET_BLOG_REPO=
  440. ZERONET_BLOG_COMMIT=
  441. ZERONET_MAIL_REPO=
  442. ZERONET_MAIL_COMMIT=
  443. ZERONET_FORUM_REPO=
  444. ZERONET_FORUM_COMMIT=
  445. ZERONET_ID_REPO=
  446. ZERONET_ID_COMMIT=
  447. # Directory where source code is downloaded and compiled
  448. INSTALL_DIR=$HOME/build
  449. INSTALLING_MESH=
  450. initialise_mesh() {
  451. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then
  452. return
  453. fi
  454. if [[ $DEBIAN_INSTALL_ONLY != "no" ]]; then
  455. return
  456. fi
  457. if [[ $INSECURE == $'yes' ]]; then
  458. echo '*********************************************************'
  459. echo $'WARNING: non-free wifi drivers are being installed.'
  460. echo $' This may compromise the security of your system.'
  461. echo '*********************************************************'
  462. # enable non-free repo
  463. if ! grep -q "non-free" $rootdir/etc/apt/sources.list; then
  464. chroot "$rootdir" /bin/sed -i "s| main| main non-free|g" /etc/apt/sources.list
  465. fi
  466. chroot "$rootdir" apt-get update
  467. # install proprietary wifi drivers
  468. # see https://wiki.debian.org/iwlwifi
  469. chroot "$rootdir" apt-get -y install firmware-iwlwifi firmware-b43-installer firmware-brcm80211
  470. fi
  471. INSTALLING_MESH=1
  472. configure_firewall
  473. install_avahi
  474. install_batman
  475. install_tomb
  476. #install_tahoelafs
  477. #install_librevault
  478. install_ipfs
  479. install_tox
  480. install_web_server
  481. install_blogstatic
  482. if [ $ENABLE_ZERONET ]; then
  483. install_zeronet
  484. fi
  485. MESH_SERVICE='mesh-setup.service'
  486. MESH_SETUP_DAEMON=$rootdir/etc/systemd/system/$MESH_SERVICE
  487. MESH_STARTUP_PARAMS="${MY_USERNAME}"
  488. if [[ $AMNESIC != 'no' ]]; then
  489. MESH_STARTUP_PARAMS="${MY_USERNAME} amnesic"
  490. fi
  491. echo '[Unit]' > $MESH_SETUP_DAEMON
  492. echo 'Description=Initial mesh router configuration' >> $MESH_SETUP_DAEMON
  493. echo 'After=syslog.target' >> $MESH_SETUP_DAEMON
  494. echo 'After=network.target' >> $MESH_SETUP_DAEMON
  495. echo '[Service]' >> $MESH_SETUP_DAEMON
  496. echo 'Type=simple' >> $MESH_SETUP_DAEMON
  497. echo 'User=root' >> $MESH_SETUP_DAEMON
  498. echo 'Group=root' >> $MESH_SETUP_DAEMON
  499. echo 'WorkingDirectory=/root' >> $MESH_SETUP_DAEMON
  500. echo "ExecStart=/usr/local/bin/${PROJECT_NAME}-image-mesh ${MESH_STARTUP_PARAMS} > /var/log/mesh-setup.log" >> $MESH_SETUP_DAEMON
  501. echo '' >> $MESH_SETUP_DAEMON
  502. echo 'TimeoutSec=99999' >> $MESH_SETUP_DAEMON
  503. echo '' >> $MESH_SETUP_DAEMON
  504. echo '[Install]' >> $MESH_SETUP_DAEMON
  505. echo 'WantedBy=multi-user.target' >> $MESH_SETUP_DAEMON
  506. chroot "$rootdir" systemctl enable $MESH_SERVICE
  507. }
  508. # User interface for USB drive installs ######################################
  509. function mesh_client_startup_applications {
  510. if [ ! -d $rootdir/home/$MY_USERNAME/Desktop ]; then
  511. mkdir -p $rootdir/home/$MY_USERNAME/Desktop
  512. fi
  513. if [ ! -d $rootdir/home/$MY_USERNAME/.config/autostart ]; then
  514. mkdir -p $rootdir/home/$MY_USERNAME/.config/autostart
  515. chroot "$rootdir" /bin/chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  516. fi
  517. START_DESKTOP=$rootdir/home/$MY_USERNAME/mesh-desktop.sh
  518. FIRST_BOOT=/home/$MY_USERNAME/.first_boot
  519. TAHOE_COMMAND="cd /var/lib/tahoelafs && venv/bin/tahoe"
  520. echo '#!/bin/bash' > $START_DESKTOP
  521. echo "setxkbmap ${KEYBOARD_MAP}" > $START_DESKTOP
  522. echo 'dconf write /org/mate/caja/desktop/volumes-visible false' >> $START_DESKTOP
  523. echo 'dconf write /org/mate/caja/desktop/computer-icon-visible false' >> $START_DESKTOP
  524. echo 'dconf write /org/mate/caja/desktop/home-icon-visible false' >> $START_DESKTOP
  525. echo 'dconf write /org/mate/caja/desktop/network-icon-visible false' >> $START_DESKTOP
  526. echo 'dconf write /org/mate/caja/desktop/trash-icon-visible false' >> $START_DESKTOP
  527. echo 'dconf write /org/mate/caja/desktop/volumes-visible false' >> $START_DESKTOP
  528. echo 'dconf write /org/mate/desktop/media-handling/automount-open false' >> $START_DESKTOP
  529. echo 'dconf write /org/mate/screensaver/lock-enabled false' >> $START_DESKTOP
  530. echo 'dconf write /org/mate/power-manager/lock-keyring-suspend false' >> $START_DESKTOP
  531. echo 'dconf write /org/mate/power-manager/lock-suspend false' >> $START_DESKTOP
  532. echo 'dconf write /org/mate/power-manager/lock-use-screensaver false' >> $START_DESKTOP
  533. echo 'dconf write /org/mate/power-manager/lock-blank-screen false' >> $START_DESKTOP
  534. echo 'dconf write /org/mate/power-manager/lock-hibernate false' >> $START_DESKTOP
  535. echo 'dconf write /org/mate/power-manager/lock-keyring-hibernate false' >> $START_DESKTOP
  536. echo 'dconf write /org/mate/desktop/peripherals/touchpad/scroll-method 2' >> $START_DESKTOP
  537. echo "touch /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  538. echo "chmod 600 /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  539. echo "env | grep DBUS_SESSION_BUS_ADDRESS > /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  540. echo "echo 'export DBUS_SESSION_BUS_ADDRESS' >> /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  541. echo '' >> $START_DESKTOP
  542. echo "amixer set 'Master' unmute" >> $START_DESKTOP
  543. echo "amixer set 'Master' 50%" >> $START_DESKTOP
  544. echo '' >> $START_DESKTOP
  545. echo '' >> $START_DESKTOP
  546. echo "if [ ! -f $FIRST_BOOT ]; then" >> $START_DESKTOP
  547. echo " $TAHOE_COMMAND start" >> $START_DESKTOP
  548. echo ' exit 0' >> $START_DESKTOP
  549. echo 'fi' >> $START_DESKTOP
  550. echo '' >> $START_DESKTOP
  551. echo 'INITIAL_TOX_USERNAME=""' >> $START_DESKTOP
  552. echo 'while [ ${#INITIAL_TOX_USERNAME} -eq 0 ]; do' >> $START_DESKTOP
  553. echo ' data=$(tempfile 2>/dev/null)' >> $START_DESKTOP
  554. echo ' trap "rm -f $data" 0 1 2 5 15' >> $START_DESKTOP
  555. echo -n " dialog --title \"${MESH_TITLE}\" " >> $START_DESKTOP
  556. echo -n "--backtitle \"${MESH_TITLE}\" " >> $START_DESKTOP
  557. echo -n "--inputbox \"${MESH_SET_USERNAME}\" 12 60 Anon " >> $START_DESKTOP
  558. echo '2>$data' >> $START_DESKTOP
  559. echo ' sel=$?' >> $START_DESKTOP
  560. echo ' case $sel in' >> $START_DESKTOP
  561. echo ' 0)' >> $START_DESKTOP
  562. echo ' INITIAL_TOX_USERNAME=$(<$data)' >> $START_DESKTOP
  563. echo ' ;;' >> $START_DESKTOP
  564. echo ' esac' >> $START_DESKTOP
  565. echo 'done' >> $START_DESKTOP
  566. echo '' >> $START_DESKTOP
  567. echo 'toxid --setuser "$INITIAL_TOX_USERNAME"' >> $START_DESKTOP
  568. echo '' >> $START_DESKTOP
  569. echo "if [ -f /home/$MY_USERNAME/.tahoe/tahoe.cfg ]; then" >> $START_DESKTOP
  570. echo " sed -i 's|nickname =.*|nickname = \$INITIAL_TOX_USERNAME|g' /home/$MY_USERNAME/.tahoe/tahoe.cfg" >> $START_DESKTOP
  571. echo " $TAHOE_COMMAND restart" >> $START_DESKTOP
  572. echo 'fi' >> $START_DESKTOP
  573. echo '' >> $START_DESKTOP
  574. echo "rm -f $FIRST_BOOT" >> $START_DESKTOP
  575. echo '' >> $START_DESKTOP
  576. echo 'exit 0' >> $START_DESKTOP
  577. chmod +x $START_DESKTOP
  578. START_DESKTOP2=$rootdir/home/$MY_USERNAME/.config/autostart/mesh-start.desktop
  579. echo '[Desktop Entry]' > $START_DESKTOP2
  580. echo 'Type=Application' >> $START_DESKTOP2
  581. echo 'Name=Mesh start desktop script' >> $START_DESKTOP2
  582. echo "Exec=bash -c '~/mesh-desktop.sh'" >> $START_DESKTOP2
  583. echo 'X-GNOME-Autostart-enabled=true' >> $START_DESKTOP2
  584. chmod +x $START_DESKTOP2
  585. START_DESKTOP3=$rootdir/home/$MY_USERNAME/.config/autostart/set_username.desktop
  586. echo '[Desktop Entry]' > $START_DESKTOP3
  587. echo 'Version=1.0' >> $START_DESKTOP3
  588. echo 'Name=Set Username' >> $START_DESKTOP3
  589. echo 'Type=Application' >> $START_DESKTOP3
  590. echo 'Comment=Set username' >> $START_DESKTOP3
  591. echo "Exec=mate-terminal -e \"bash -c /home/${MY_USERNAME}/mesh-desktop.sh\"" >> $START_DESKTOP3
  592. echo 'Icon=user-away' >> $START_DESKTOP3
  593. echo 'Terminal=false' >> $START_DESKTOP3
  594. echo 'Categories=Application;' >> $START_DESKTOP3
  595. chmod +x $START_DESKTOP3
  596. }
  597. function mesh_desktop_icons {
  598. if [ ! -d $rootdir/home/$MY_USERNAME/Desktop ]; then
  599. mkdir -p $rootdir/home/$MY_USERNAME/Desktop
  600. fi
  601. # Terminal
  602. #echo '[Desktop Entry]' > $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  603. #echo 'Name=MATE Terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  604. #echo 'Type=Application' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  605. #echo 'Comment=Use the command line' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  606. #echo 'TryExec=mate-terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  607. #echo 'Exec=mate-terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  608. #echo 'Icon=terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  609. #echo 'StartupNotify=true' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  610. chroot "$rootdir" /bin/chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop
  611. }
  612. function configure_user_interface {
  613. if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "usb" ]]; then
  614. return
  615. fi
  616. # desktop
  617. chroot "$rootdir" apt-get -y install mate-desktop-environment
  618. # tool to change desktop settings from command line
  619. chroot "$rootdir" apt-get -y install dconf-cli dconf-gsettings-backend dbus dbus-x11
  620. # for tomb
  621. chroot "$rootdir" apt-get -y install pinentry-gtk2
  622. # for tox video
  623. chroot "$rootdir" apt-get -y install ffmpeg cheese v4l-utils
  624. # to provide notifications
  625. chroot "$rootdir" apt-get -y install libnotify-bin
  626. # for video/audio
  627. chroot "$rootdir" apt-get -y install libtheora-bin libvorbis-dev v4l-utils
  628. # a sane editor
  629. chroot "$rootdir" apt-get -y install emacs24
  630. # for wifi monitoring
  631. chroot "$rootdir" apt-get -y install horst
  632. # for sound level control
  633. chroot "$rootdir" apt-get -y install alsa-utils
  634. # to play various media types
  635. chroot "$rootdir" apt-get -y install vlc
  636. # android adb to allow phones to be connected and for example transfer photos/documents
  637. chroot "$rootdir" apt-get -y install android-tools-adb
  638. # Produce a text file on the desktop listing users on the mesh
  639. cat <<EOF > $rootdir/usr/bin/list-tox-users
  640. #!/bin/bash
  641. users_list=\$(lstox | awk -F ' ' '{\$1=""; print \$0}' | sed -e 's/^[[:space:]]*//' | sort -d)
  642. if [ ! \$users_list ]; then
  643. no_of_users=0
  644. else
  645. no_of_users=\$(echo "\$users_list" | wc -l)
  646. fi
  647. if [ \$no_of_users -gt 0 ]; then
  648. echo "\$users_list" > /tmp/Users.txt
  649. chown $MY_USERNAME:$MY_USERNAME /tmp/Users.txt
  650. echo 'showing_users=\$(ps aux | grep $MESH_TEXT_EDITOR | grep "Users.txt")' > /home/$MY_USERNAME/showusers
  651. echo 'if [ \${#showing_users} -eq 0 ]; then' >> /home/$MY_USERNAME/showusers
  652. echo ' $MESH_TEXT_EDITOR /tmp/Users.txt' >> /home/$MY_USERNAME/showusers
  653. echo 'fi' >> /home/$MY_USERNAME/showusers
  654. echo 'exit 0' >> /home/$MY_USERNAME/showusers
  655. chmod +x /home/$MY_USERNAME/showusers
  656. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/showusers
  657. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/Users.desktop
  658. if [ \$no_of_users -lt 2 ]; then
  659. echo "Name=\$no_of_users Other User" >> /home/$MY_USERNAME/Desktop/Users.desktop
  660. else
  661. echo "Name=\$no_of_users Other Users" >> /home/$MY_USERNAME/Desktop/Users.desktop
  662. fi
  663. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/Users.desktop
  664. echo 'Comment=List of users' >> /home/$MY_USERNAME/Desktop/Users.desktop
  665. echo 'Exec=bash /home/$MY_USERNAME/showusers' >> /home/$MY_USERNAME/Desktop/Users.desktop
  666. echo 'Icon=/usr/share/$PROJECT_NAME/avatars/otheruser.png' >> /home/$MY_USERNAME/Desktop/Users.desktop
  667. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/Users.desktop
  668. chmod +x /home/$MY_USERNAME/Desktop/Users.desktop
  669. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/Users.desktop
  670. if [ -f /tmp/.ipfs-users ]; then
  671. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/sites.desktop
  672. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/sites.desktop
  673. echo "Name=Visit a site" >> /home/$MY_USERNAME/Desktop/sites.desktop
  674. echo 'Comment=Visit a site' >> /home/$MY_USERNAME/Desktop/sites.desktop
  675. echo 'Exec=mate-terminal -e /usr/local/bin/${PROJECT_NAME}-mesh-visit-site' >> /home/$MY_USERNAME/Desktop/sites.desktop
  676. echo 'Icon=/usr/share/${PROJECT_NAME}/avatars/ipfs.jpg' >> /home/$MY_USERNAME/Desktop/sites.desktop
  677. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/sites.desktop
  678. chmod +x /home/$MY_USERNAME/Desktop/sites.desktop
  679. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/sites.desktop
  680. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/blog.desktop
  681. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/blog.desktop
  682. echo "Name=Blog" >> /home/$MY_USERNAME/Desktop/blog.desktop
  683. echo 'Comment=View or create blog entries' >> /home/$MY_USERNAME/Desktop/blog.desktop
  684. echo 'Exec=mate-terminal -e /usr/local/bin/${PROJECT_NAME}-mesh-blog' >> /home/$MY_USERNAME/Desktop/blog.desktop
  685. echo 'Icon=/usr/share/${PROJECT_NAME}/avatars/blog.png' >> /home/$MY_USERNAME/Desktop/blog.desktop
  686. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/blog.desktop
  687. chmod +x /home/$MY_USERNAME/Desktop/blog.desktop
  688. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/blog.desktop
  689. fi
  690. if [ ! -f /home/$MY_USERNAME/runtox ]; then
  691. echo 'qtox_running=\$(ps aux | grep qtox | grep data)' > /home/$MY_USERNAME/runtox
  692. echo 'if [ \${#qtox_running} -eq 0 ]; then' >> /home/$MY_USERNAME/runtox
  693. echo ' bash -c "qtox -p data"' >> /home/$MY_USERNAME/runtox
  694. echo 'fi' >> /home/$MY_USERNAME/runtox
  695. echo 'exit 0' >> /home/$MY_USERNAME/runtox
  696. chmod +x /home/$MY_USERNAME/runtox
  697. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/runtox
  698. fi
  699. if [ ! -f /home/$MY_USERNAME/Desktop/tox.desktop ]; then
  700. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/tox.desktop
  701. echo 'Name=Chat' >> /home/$MY_USERNAME/Desktop/tox.desktop
  702. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/tox.desktop
  703. echo 'Comment=Chat, Voice and Video' >> /home/$MY_USERNAME/Desktop/tox.desktop
  704. echo 'Exec=bash /home/$MY_USERNAME/runtox' >> /home/$MY_USERNAME/Desktop/tox.desktop
  705. echo "Icon=/usr/share/$PROJECT_NAME/avatars/chat.png" >> /home/$MY_USERNAME/Desktop/tox.desktop
  706. echo 'StartupNotify=true' >> /home/$MY_USERNAME/Desktop/tox.desktop
  707. chmod +x /home/$MY_USERNAME/Desktop/tox.desktop
  708. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/tox.desktop
  709. fi
  710. else
  711. if [ -f /tmp/Users.txt ]; then
  712. rm /tmp/Users.txt
  713. rm /home/$MY_USERNAME/Desktop/Users.desktop
  714. if [ -f /home/$MY_USERNAME/Desktop/Users.desktop ]; then
  715. rm /home/$MY_USERNAME/Desktop/Users.desktop
  716. fi
  717. if [ -f /home/$MY_USERNAME/Desktop/sites.desktop ]; then
  718. rm /home/$MY_USERNAME/Desktop/sites.desktop
  719. fi
  720. if [ -f /home/$MY_USERNAME/Desktop/blog.desktop ]; then
  721. rm /home/$MY_USERNAME/Desktop/blog.desktop
  722. fi
  723. if [ -f /home/$MY_USERNAME/Desktop/tox.desktop ]; then
  724. rm /home/$MY_USERNAME/Desktop/tox.desktop
  725. fi
  726. pkill qtox
  727. fi
  728. fi
  729. EOF
  730. chroot "$rootdir" /bin/chown $MY_USERNAME:$MY_USERNAME /usr/bin/list-tox-users
  731. chroot "$rootdir" /bin/chmod +x /usr/bin/list-tox-users
  732. echo "* * * * * $MY_USERNAME bash -c /usr/bin/list-tox-users > /dev/null" >> $rootdir/etc/crontab
  733. if [[ $VARIANT != "usb" ]]; then
  734. # log in automatically
  735. chroot "$rootdir" apt-get -y install nodm xinit
  736. echo 'NODM_ENABLED=true' > /etc/default/nodm
  737. echo "NODM_USER=$MY_USERNAME" >> /etc/default/nodm
  738. chroot "$rootdir" mkdir /etc/systemd/system/getty@tty1.service.d
  739. echo '[Service]' > $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  740. echo 'ExecStart=' >> $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  741. echo 'ExecStart=-/sbin/agetty --autologin fbone --noclear %I $TERM' >> $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  742. echo '[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx' >> $rootdir/home/$MY_USERNAME/.profile
  743. chroot "$rootdir" systemctl set-default multi-user.target
  744. mesh_client_startup_applications
  745. mesh_desktop_icons
  746. # Different desktop background for amnesic
  747. if [[ $AMNESIC != 'no' ]]; then
  748. MESH_DESKTOP_BACKGROUND_IMAGE=/usr/local/share/${PROJECT_NAME}_mesh_amnesic_background.png
  749. fi
  750. # change the desktop background
  751. if [ $MESH_DESKTOP_BACKGROUND_IMAGE ]; then
  752. if [ -f $MESH_DESKTOP_BACKGROUND_IMAGE ]; then
  753. if [ -d $rootdir/usr/share/images/desktop-base ]; then
  754. cp $MESH_DESKTOP_BACKGROUND_IMAGE $rootdir/usr/share/images/desktop-base/${PROJECT_NAME}_mesh_background.png
  755. chroot "$rootdir" /bin/rm /usr/share/images/desktop-base/desktop-background
  756. chroot "$rootdir" ln -s /usr/share/images/desktop-base/${PROJECT_NAME}_mesh_background.png /usr/share/images/desktop-base/desktop-background
  757. fi
  758. fi
  759. fi
  760. else
  761. chroot "$rootdir" apt-get -y install lightdm
  762. fi
  763. # browser
  764. chroot "$rootdir" apt-get -y install $BROWSER
  765. # help
  766. mkdir -p $rootdir/home/${MY_USERNAME}/help/images
  767. cd $rootdir/root/${PROJECT_NAME}/website
  768. ./deploy.sh EN $rootdir/home/${MY_USERNAME}/help
  769. chroot "$rootdir" /bin/chown -R ${MY_USERNAME}:${MY_USERNAME} /home/${MY_USERNAME}/help
  770. # Tox user interface
  771. enable_tox_repo
  772. mesh_tox_qtox
  773. # copy the default qtox ini file
  774. if [ ! -d ${rootdir}/home/${MY_USERNAME}/.config/tox ]; then
  775. mkdir ${rootdir}/home/${MY_USERNAME}/.config/tox
  776. cp /usr/local/bin/${PROJECT_NAME}-config-qtox ${rootdir}/home/${MY_USERNAME}/.config/tox/qtox.ini
  777. chroot "$rootdir" /bin/chown -R ${MY_USERNAME}:${MY_USERNAME} /home/${MY_USERNAME}/.config
  778. fi
  779. if [[ $VARIANT == "usb" ]]; then
  780. # tor
  781. chroot "$rootdir" apt-get -y install tor
  782. # xmpp client
  783. chroot "$rootdir" echo "deb ftp://ftp.gajim.org/debian unstable main" > /etc/apt/sources.list.d/gajim.list
  784. chroot "$rootdir" apt-get update
  785. chroot "$rootdir" apt-get -y install gajim-dev-keyring
  786. chroot "$rootdir" apt-get -y install git python-dev python-pip gajim-nightly
  787. chroot "$rootdir" mkdir /home/$GENERIC_IMAGE_USERNAME/.local/share/gajim/plugins -p
  788. chroot "$rootdir" git clone https://github.com/omemo/gajim-omemo /home/$GENERIC_IMAGE_USERNAME/.local/share/gajim/plugins/gajim-omemo
  789. chroot "$rootdir" pip install protobuf==2.6.1, python-axolotl==0.1.35
  790. chroot "$rootdir" /bin/chown -R $GENERIC_IMAGE_USERNAME:$GENERIC_IMAGE_USERNAME /home/$GENERIC_IMAGE_USERNAME/.local
  791. # IRC client
  792. chroot "$rootdir" apt-get -y install hexchat profanity
  793. fi
  794. }
  795. ##############################################################################
  796. # Set to true/false to control if eatmydata is used during build
  797. use_eatmydata=true
  798. rootdir="$1"
  799. fmdir="$(pwd)"
  800. image="$fmdir"/"$2"
  801. cd "$rootdir"
  802. echo info: building $MACHINE for $ARCHITECTURE
  803. export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
  804. export LC_ALL=C LANGUAGE=C LANG=C
  805. # Override libpam-tmpdir setting during build, as the directories
  806. # are not created yet.
  807. export TMP=/tmp/ TMPDIR=/tmp/
  808. if [ ! $MY_USERNAME ]; then
  809. echo $'No username was specified'
  810. exit 52825
  811. fi
  812. username=$MY_USERNAME
  813. echo $"warning: creating initial user $username with well known password!"
  814. password=$MY_PASSWORD
  815. chroot "$rootdir" /usr/bin/env -i \
  816. HOME=/root \
  817. PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
  818. echo "export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:" >> $rootdir/root/.bashrc
  819. chroot "$rootdir" adduser --gecos $username --disabled-password $username
  820. echo $username:$password | chroot "$rootdir" /usr/sbin/chpasswd
  821. chroot "$rootdir" adduser $username sudo
  822. case "$MACHINE" in
  823. qemu)
  824. # hide irrelevant console keyboard messages.
  825. echo "echo \"4 4 1 7\" > /proc/sys/kernel/printk" \
  826. >> /etc/init.d/rc.local
  827. ;;
  828. esac
  829. if [ ! $DEBIAN_REPO ]; then
  830. DEBIAN_REPO='ftp.de.debian.org'
  831. fi
  832. if [ ! $DEBIAN_VERSION ]; then
  833. DEBIAN_VERSION='jessie'
  834. fi
  835. set_apt_sources $BUILD_MIRROR
  836. chroot "$rootdir" apt-get clean
  837. chroot "$rootdir" /bin/rm -rf /var/lib/apt/lists/*
  838. chroot "$rootdir" apt-get clean
  839. set_apt_sources $MIRROR
  840. configure_backports
  841. configure_contrib_repo
  842. chroot "$rootdir" apt-get update
  843. chroot "$rootdir" apt-get install -y apt-utils
  844. cat > $rootdir/usr/sbin/policy-rc.d <<EOF
  845. #!/bin/sh
  846. exit 101
  847. EOF
  848. chmod a+rx $rootdir/usr/sbin/policy-rc.d
  849. if $use_eatmydata ; then
  850. enable_eatmydata_override
  851. fi
  852. if [ -n "$CUSTOM_SETUP" ]; then
  853. cp "$CUSTOM_SETUP" "$rootdir"/tmp
  854. chroot "$rootdir" apt-get install -y gdebi-core
  855. chroot "$rootdir" gdebi -n /tmp/"$(basename $CUSTOM_SETUP)"
  856. fi
  857. if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "mesh" ]]; then
  858. chroot "$rootdir" apt-get install -y openssh-server
  859. fi
  860. chroot "$rootdir" apt-get install -y sudo git dialog build-essential
  861. chroot "$rootdir" apt-get install -y avahi-daemon avahi-utils avahi-discover avahi-autoipd
  862. chroot "$rootdir" apt-get install -y iptables dnsutils net-tools network-manager iputils-ping
  863. chroot "$rootdir" apt-get install -y libnss-mdns libnss-myhostname libnss-gw-name nano man ntp
  864. chroot "$rootdir" apt-get install -y locales locales-all debconf wireless-tools wpasupplicant usbutils
  865. if [[ $ARCHITECTURE == 'qemu'* || $ARCHITECTURE == 'i386' || $ARCHITECTURE == 'i686' || $ARCHITECTURE == 'amd64' || $ARCHITECTURE == 'x86_64' ]]; then
  866. chroot "$rootdir" apt-get install -y cryptsetup zsh pinentry-curses iotop bc
  867. chroot "$rootdir" apt-get install -y grub2 hostapd
  868. fi
  869. sed -i "s|#host-name=.*|host-name=${PROJECT_NAME}|g" $rootdir/etc/avahi/avahi-daemon.conf
  870. sed -i "s|host-name=.*|host-name=${PROJECT_NAME}|g" $rootdir/etc/avahi/avahi-daemon.conf
  871. chroot "$rootdir" /bin/bash -x <<EOF
  872. git clone $PROJECT_REPO /root/$PROJECT_NAME
  873. cd /root/$PROJECT_NAME
  874. git checkout origin/stockholm -b stockholm
  875. make install
  876. EOF
  877. chroot "$rootdir" ${PROJECT_NAME}-image-hardware-setup 2>&1 | \
  878. tee $rootdir/var/log/${PROJECT_NAME}-image-hardware-setup.log
  879. rm $rootdir/usr/sbin/policy-rc.d
  880. # Set up HRNG for systems known to have one
  881. # Otherwise install haveged
  882. if [[ "$MACHINE" != "beaglebone" ]]; then
  883. chroot $rootdir apt-get -y install haveged
  884. else
  885. chroot $rootdir apt-get -y install rng-tools
  886. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' $rootdir/etc/default/rng-tools
  887. fi
  888. # copy u-boot to beginning of image
  889. case "$MACHINE" in
  890. beaglebone)
  891. dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/MLO of="$image" \
  892. count=1 seek=1 conv=notrunc bs=128k
  893. dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/u-boot.img of="$image" \
  894. count=2 seek=1 conv=notrunc bs=384k
  895. ;;
  896. cubieboard2)
  897. dd if=$rootdir/usr/lib/u-boot/Cubieboard2/u-boot-sunxi-with-spl.bin of="$image" \
  898. seek=8 conv=notrunc bs=1k
  899. ;;
  900. a20-olinuxino-lime)
  901. dd if=$rootdir/usr/lib/u-boot/A20-OLinuXino-Lime/u-boot-sunxi-with-spl.bin \
  902. of="$image" seek=8 conv=notrunc bs=1k
  903. ;;
  904. esac
  905. if $use_eatmydata ; then
  906. disable_eatmydata_override
  907. fi
  908. configure_ssh
  909. configure_networking
  910. admin_user_sudo
  911. create_generic_image
  912. atheros_wifi
  913. continue_installation
  914. initialise_mesh
  915. configure_wifi
  916. configure_user_interface
  917. # remove downloaded packages
  918. chroot $rootdir apt-get clean
  919. cd /
  920. echo $"info: killing leftover processes in chroot"
  921. fuser -mvk $rootdir/. || true
  922. exit 0