freedombone-image-customise 44KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  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. create_generic_image() {
  227. if [[ $DEBIAN_INSTALL_ONLY != "no" ]]; then
  228. return
  229. fi
  230. if [[ $GENERIC_IMAGE == "no" ]]; then
  231. return
  232. fi
  233. if [ $CONFIG_FILENAME ]; then
  234. if [[ "$CONFIG_FILENAME" == *"mesh.cfg"* ]]; then
  235. VARIANT="mesh"
  236. fi
  237. fi
  238. # Don't install any configuration. This will be a base system
  239. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then
  240. CONFIG_FILENAME=
  241. else
  242. touch $rootdir/root/.initial_mesh_setup
  243. fi
  244. # Stick with the existing login for mesh clients
  245. if [[ $VARIANT == "meshclient" || $VARIANT == "meshusb" ]]; then
  246. return
  247. fi
  248. # The presence of this file indicates that the initial
  249. # setup has not yet been completed
  250. touch $rootdir/home/$MY_USERNAME/.initial_setup
  251. chroot $rootdir /bin/chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.initial_setup
  252. touch $rootdir/root/.initial_setup
  253. cat >> $rootdir/home/$MY_USERNAME/.bashrc <<EOF
  254. # initial setup of the system
  255. if [ -f ~/.initial_setup ]; then
  256. clear
  257. echo "
  258. .---. . .
  259. | | |
  260. |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  261. | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  262. ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  263. Initial setup process
  264. Please enter your password a second time.
  265. "
  266. sudo su
  267. fi
  268. EOF
  269. echo "MY_USERNAME=${MY_USERNAME}" >> $rootdir/root/.bashrc
  270. echo "SSH_PORT=${SSH_PORT}" >> $rootdir/root/.bashrc
  271. echo '# initial setup of the system' >> $rootdir/root/.bashrc
  272. echo 'if [ -f ~/.initial_setup ]; then' >> $rootdir/root/.bashrc
  273. echo ' if [ -f ~/login.txt ]; then' >> $rootdir/root/.bashrc
  274. echo ' NEW_USER_PASSWORD=$(printf `cat ~/login.txt`)' >> $rootdir/root/.bashrc
  275. echo ' else' >> $rootdir/root/.bashrc
  276. echo ' ENTROPY=$(cat /proc/sys/kernel/random/entropy_avail)' >> $rootdir/root/.bashrc
  277. echo ' if [ $ENTROPY -lt 500 ]; then' >> $rootdir/root/.bashrc
  278. ENTROPY_MESSAGE1=$'Initial setup process'
  279. ENTROPY_MESSAGE2=$'Password Generation'
  280. ENTROPY_MESSAGE3=$'WARNING: The entropy available on this system is too low to generate a password.\n\nThe installation process cannot continue.'
  281. echo " dialog --backtitle \"${ENTROPY_MESSAGE1}\" --title \"${ENTROPY_MESSAGE2}\" --msgbox \"${ENTROPY_MESSAGE3}\" 8 50" >> $rootdir/root/.bashrc
  282. echo ' exit' >> $rootdir/root/.bashrc
  283. echo ' fi' >> $rootdir/root/.bashrc
  284. echo -n ' NEW_USER_PASSWORD="$(openssl rand -base64 30 | cut -c1-' >> $rootdir/root/.bashrc
  285. echo "${DEFAULT_PASSWORD_LENGTH})\"" >> $rootdir/root/.bashrc
  286. echo ' fi' >> $rootdir/root/.bashrc
  287. echo ' echo "${NEW_USER_PASSWORD}" > ~/login.txt' >> $rootdir/root/.bashrc
  288. echo ' clear' >> $rootdir/root/.bashrc
  289. echo ' echo ""' >> $rootdir/root/.bashrc
  290. NEW_LOGIN_PASSWORD_MESSAGE1=$'Your new login password is:'
  291. NEW_LOGIN_PASSWORD_MESSAGE2=$'Use it whenever you wish to ssh into this system.'
  292. NEW_LOGIN_PASSWORD_MESSAGE3=$'IMPORTANT: Please take a moment to enter the above password into a\npassword manager or write it down somewhere.'
  293. PRESS_KEY_MESSAGE=$'Press any key to continue...'
  294. echo " echo \"${NEW_LOGIN_PASSWORD_MESSAGE1}\"" >> $rootdir/root/.bashrc
  295. echo ' echo ""' >> $rootdir/root/.bashrc
  296. echo ' echo " ${NEW_USER_PASSWORD}"' >> $rootdir/root/.bashrc
  297. echo ' echo ""' >> $rootdir/root/.bashrc
  298. echo " echo \"${NEW_LOGIN_PASSWORD_MESSAGE2}\"" >> $rootdir/root/.bashrc
  299. echo ' echo ""' >> $rootdir/root/.bashrc
  300. echo " echo \"${NEW_LOGIN_PASSWORD_MESSAGE3}\"" >> $rootdir/root/.bashrc
  301. echo ' echo ""' >> $rootdir/root/.bashrc
  302. echo " read -n1 -r -p \"${PRESS_KEY_MESSAGE}\" key" >> $rootdir/root/.bashrc
  303. # change the password for the admin user
  304. echo -n " echo \"${MY_USERNAME}:" >> $rootdir/root/.bashrc
  305. echo '$(printf `cat ~/login.txt`)"|chpasswd' >> $rootdir/root/.bashrc
  306. # update before continuing
  307. echo " cd /root/${PROJECT_NAME}" >> $rootdir/root/.bashrc
  308. echo " git stash" >> $rootdir/root/.bashrc
  309. echo " git pull" >> $rootdir/root/.bashrc
  310. echo " make install" >> $rootdir/root/.bashrc
  311. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "usb" ]]; then
  312. if [[ $ONION_ONLY == "no" ]]; then
  313. if [[ $MINIMAL_INSTALL == "no" ]]; then
  314. echo " ${PROJECT_NAME} menuconfig-full" >> $rootdir/root/.bashrc
  315. else
  316. echo " ${PROJECT_NAME} menuconfig" >> $rootdir/root/.bashrc
  317. fi
  318. else
  319. echo " ${PROJECT_NAME} menuconfig-onion" >> $rootdir/root/.bashrc
  320. fi
  321. else
  322. echo " echo ''" >> $rootdir/root/.bashrc
  323. fi
  324. echo ' if [ "$?" = "0" ]; then' >> $rootdir/root/.bashrc
  325. echo " if [ -f ~/${PROJECT_NAME}-completed.txt ]; then" >> $rootdir/root/.bashrc
  326. # Remove the initial setup files
  327. echo ' rm /root/.initial_setup' >> $rootdir/root/.bashrc
  328. echo ' rm /home/fbone/.initial_setup' >> $rootdir/root/.bashrc
  329. echo " touch /root/.remove_${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  330. echo ' shred -zu ~/login.txt' >> $rootdir/root/.bashrc
  331. END_MESSAGE1=$'Congratulations!'
  332. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "usb" ]]; then
  333. END_MESSAGE2=$'\nYour system has now installed\n\nThe onion ssh service is at:\n\n ${SSH_ONION_HOSTNAME}\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'
  334. echo ' SSH_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_ssh/hostname)' >> $rootdir/root/.bashrc
  335. echo ' if [ ${#SSH_ONION_HOSTNAME} -lt 2 ]; then' >> $rootdir/root/.bashrc
  336. echo ' exit 62392' >> $rootdir/root/.bashrc
  337. echo ' fi' >> $rootdir/root/.bashrc
  338. END_MESSAGE_HEIGHT=16
  339. else
  340. END_MESSAGE2=$'\nYour system has now installed\n\nPress any key to reboot and begin using it'
  341. END_MESSAGE_HEIGHT=12
  342. fi
  343. echo " if [ -f /root/${PROJECT_NAME}-wifi.cfg ]; then" >> $rootdir/root/.bashrc
  344. echo " echo '[Unit]' > /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  345. echo " echo 'Description=WifiStartup (Start wifi networking)' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  346. echo " echo 'After=syslog.target' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  347. echo " echo 'After=network.target' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  348. echo " echo 'After=remote-fs.target' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  349. echo " echo '' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  350. echo " echo '[Service]' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  351. echo " echo 'Type=simple' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  352. echo " echo 'User=root' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  353. echo " echo 'Group=root' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  354. echo " echo 'WorkingDirectory=/root' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  355. echo " echo 'ExecStart=/usr/local/bin/freedombone-wifi --wait 5 2> /dev/null' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  356. echo " echo '' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  357. echo " echo '[Install]' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  358. echo " echo 'WantedBy=multi-user.target' >> /etc/systemd/system/wifistart.service" >> $rootdir/root/.bashrc
  359. echo " systemctl enable wifistart" >> $rootdir/root/.bashrc
  360. echo " systemctl daemon-reload" >> $rootdir/root/.bashrc
  361. echo ' fi' >> $rootdir/root/.bashrc
  362. echo " dialog --title '$END_MESSAGE1' --msgbox \"$END_MESSAGE2\" ${END_MESSAGE_HEIGHT} 60" >> $rootdir/root/.bashrc
  363. echo ' reboot' >> $rootdir/root/.bashrc
  364. echo ' fi' >> $rootdir/root/.bashrc
  365. echo ' else' >> $rootdir/root/.bashrc
  366. echo ' key=' >> $rootdir/root/.bashrc
  367. echo ' while [[ $key != "x" ]]; do' >> $rootdir/root/.bashrc
  368. INSTALL_FAIL_MESSAGE=$"Install failed. Press x to continue..."
  369. echo " read -n1 -r -p \"${INSTALL_FAIL_MESSAGE}\" key" >> $rootdir/root/.bashrc
  370. echo ' done' >> $rootdir/root/.bashrc
  371. echo ' fi' >> $rootdir/root/.bashrc
  372. echo ' exit' >> $rootdir/root/.bashrc
  373. echo 'else' >> $rootdir/root/.bashrc
  374. echo ' # Remove default account after install' >> $rootdir/root/.bashrc
  375. echo " if [ -f /root/.remove_${GENERIC_IMAGE_USERNAME} ]; then" >> $rootdir/root/.bashrc
  376. echo " if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then" >> $rootdir/root/.bashrc
  377. echo " userdel -r ${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  378. echo " if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then" >> $rootdir/root/.bashrc
  379. echo " rm -rf /home/${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  380. echo " rm /root/.remove_${GENERIC_IMAGE_USERNAME}" >> $rootdir/root/.bashrc
  381. echo ' fi' >> $rootdir/root/.bashrc
  382. echo ' fi' >> $rootdir/root/.bashrc
  383. echo ' fi' >> $rootdir/root/.bashrc
  384. echo 'fi' >> $rootdir/root/.bashrc
  385. }
  386. continue_installation() {
  387. # If a configuration file exists then run with it
  388. # otherwise the interactive installer can be used
  389. # This is equivalent to installing freedombox-setup on freedombox
  390. if [ $CONFIG_FILENAME ]; then
  391. if [ ${#CONFIG_FILENAME} -gt 2 ]; then
  392. cp $CONFIG_FILENAME $rootdir/root/$PROJECT_NAME.cfg
  393. cat $rootdir/root/$PROJECT_NAME.cfg
  394. chroot "$rootdir" su -c "$PROJECT_NAME -c /root/$PROJECT_NAME.cfg" - root
  395. fi
  396. fi
  397. }
  398. atheros_wifi() {
  399. firmware_filename="open-ath9k-htc-firmware_1.3-1_all.deb"
  400. firmware_hash='5fea58ffefdf0ef15b504db7fbe3bc078c03e0d927bba64085e4b6f2546102f5'
  401. firmware_url="http://us.archive.trisquel.info/trisquel/pool/main/o/open-ath9k-htc-firmware/$firmware_filename"
  402. firmware_tempfile="/tmp/$firmware_filename"
  403. wget "$firmware_url" -O "$rootdir$firmware_tempfile"
  404. downloaded_firmware_hash=$(sha256sum "$rootdir$firmware_tempfile" | awk -F ' ' '{print $1}')
  405. if [[ "$downloaded_firmware_hash" == "$firmware_hash" ]]; then
  406. chroot "$rootdir" dpkg -i "$firmware_tempfile"
  407. else
  408. echo 'WARNING: Atheros Wifi firmware hash does not match. The driver has not been installed.'
  409. fi
  410. }
  411. configure_wifi() {
  412. if [[ $VARIANT == "mesh"* ]]; then
  413. return
  414. fi
  415. if [ -f $WIFI_NETWORKS_FILE ]; then
  416. chroot "$rootdir" ${PROJECT_NAME}-wifi --networks $WIFI_NETWORKS_FILE
  417. return
  418. fi
  419. if [[ $WIFI_TYPE != 'none' ]]; then
  420. if [ ${#WIFI_PASSPHRASE} -lt 2 ]; then
  421. return
  422. fi
  423. chroot "$rootdir" ${PROJECT_NAME}-wifi -s $WIFI_SSID -t $WIFI_TYPE -p $WIFI_PASSPHRASE --hotspot $WIFI_HOTSPOT
  424. else
  425. chroot "$rootdir" ${PROJECT_NAME}-wifi -s $WIFI_SSID -t $WIFI_TYPE --hotspot $WIFI_HOTSPOT
  426. fi
  427. }
  428. ##############################################################################
  429. # Mesh networking
  430. ##############################################################################
  431. # for mesh installs
  432. TRACKER_PORT=6969
  433. WIFI_CHANNEL=2
  434. # B.A.T.M.A.N settings
  435. BATMAN_CELLID='02:BA:00:00:03:01'
  436. WIFI_SSID='mesh'
  437. # To avoid confusions these are obtained from the main project file
  438. TOXID_REPO=
  439. TOX_PORT=
  440. TOXCORE_REPO=
  441. TOXIC_REPO=
  442. TOXCORE_COMMIT=
  443. TOXIC_COMMIT=
  444. # These are some default nodes, but you can replace them with trusted nodes
  445. # as you prefer. See https://wiki.tox.im/Nodes
  446. TOX_NODES=
  447. #TOX_NODES=(
  448. # '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
  449. # '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
  450. #)
  451. # To avoid confusions these are obtained from the main project file
  452. ZERONET_REPO=
  453. ZERONET_COMMIT=
  454. ZERONET_PORT=
  455. ZERONET_BLOG_REPO=
  456. ZERONET_BLOG_COMMIT=
  457. ZERONET_MAIL_REPO=
  458. ZERONET_MAIL_COMMIT=
  459. ZERONET_FORUM_REPO=
  460. ZERONET_FORUM_COMMIT=
  461. ZERONET_ID_REPO=
  462. ZERONET_ID_COMMIT=
  463. # Directory where source code is downloaded and compiled
  464. INSTALL_DIR=$HOME/build
  465. INSTALLING_MESH=
  466. initialise_mesh() {
  467. if [[ $VARIANT != "mesh" && $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then
  468. return
  469. fi
  470. if [[ $DEBIAN_INSTALL_ONLY != "no" ]]; then
  471. return
  472. fi
  473. if [[ $INSECURE == $'yes' ]]; then
  474. echo '*********************************************************'
  475. echo $'WARNING: non-free wifi drivers are being installed.'
  476. echo $' This may compromise the security of your system.'
  477. echo '*********************************************************'
  478. # enable non-free repo
  479. if ! grep -q "non-free" $rootdir/etc/apt/sources.list; then
  480. chroot "$rootdir" /bin/sed -i "s| main| main non-free|g" /etc/apt/sources.list
  481. fi
  482. chroot "$rootdir" apt-get update
  483. # install proprietary wifi drivers
  484. # see https://wiki.debian.org/iwlwifi
  485. chroot "$rootdir" apt-get -yq install firmware-iwlwifi firmware-b43-installer firmware-brcm80211
  486. fi
  487. INSTALLING_MESH=1
  488. configure_firewall
  489. install_avahi
  490. install_batman
  491. install_tomb
  492. #install_tahoelafs
  493. #install_librevault
  494. install_ipfs
  495. install_tox
  496. install_web_server
  497. install_pelican
  498. if [ $ENABLE_ZERONET ]; then
  499. install_zeronet
  500. fi
  501. MESH_SERVICE='mesh-setup.service'
  502. MESH_SETUP_DAEMON=$rootdir/etc/systemd/system/$MESH_SERVICE
  503. MESH_STARTUP_PARAMS="${MY_USERNAME}"
  504. if [[ $AMNESIC != 'no' ]]; then
  505. MESH_STARTUP_PARAMS="${MY_USERNAME} amnesic"
  506. fi
  507. echo '[Unit]' > $MESH_SETUP_DAEMON
  508. echo 'Description=Initial mesh router configuration' >> $MESH_SETUP_DAEMON
  509. echo 'After=syslog.target' >> $MESH_SETUP_DAEMON
  510. echo 'After=network.target' >> $MESH_SETUP_DAEMON
  511. echo '' >> $MESH_SETUP_DAEMON
  512. echo '[Service]' >> $MESH_SETUP_DAEMON
  513. echo 'Type=simple' >> $MESH_SETUP_DAEMON
  514. echo 'User=root' >> $MESH_SETUP_DAEMON
  515. echo 'Group=root' >> $MESH_SETUP_DAEMON
  516. echo 'WorkingDirectory=/root' >> $MESH_SETUP_DAEMON
  517. echo "ExecStart=/usr/local/bin/${PROJECT_NAME}-image-mesh ${MESH_STARTUP_PARAMS} > /var/log/mesh-setup.log" >> $MESH_SETUP_DAEMON
  518. echo '' >> $MESH_SETUP_DAEMON
  519. echo 'TimeoutSec=99999' >> $MESH_SETUP_DAEMON
  520. echo '' >> $MESH_SETUP_DAEMON
  521. echo '[Install]' >> $MESH_SETUP_DAEMON
  522. echo 'WantedBy=multi-user.target' >> $MESH_SETUP_DAEMON
  523. chmod +x $MESH_SETUP_DAEMON
  524. chroot "$rootdir" systemctl enable $MESH_SERVICE
  525. }
  526. # User interface for USB drive installs ######################################
  527. function mesh_client_startup_applications {
  528. if [ ! -d $rootdir/home/$MY_USERNAME/Desktop ]; then
  529. mkdir -p $rootdir/home/$MY_USERNAME/Desktop
  530. fi
  531. if [ ! -d $rootdir/home/$MY_USERNAME/.config/autostart ]; then
  532. mkdir -p $rootdir/home/$MY_USERNAME/.config/autostart
  533. chroot "$rootdir" /bin/chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  534. fi
  535. START_DESKTOP=$rootdir/home/$MY_USERNAME/mesh-desktop.sh
  536. FIRST_BOOT=/home/$MY_USERNAME/.first_boot
  537. TAHOE_COMMAND="cd /var/lib/tahoelafs && venv/bin/tahoe"
  538. echo '#!/bin/bash' > $START_DESKTOP
  539. echo "setxkbmap ${KEYBOARD_MAP}" > $START_DESKTOP
  540. echo 'dconf write /org/mate/caja/desktop/volumes-visible false' >> $START_DESKTOP
  541. echo 'dconf write /org/mate/caja/desktop/computer-icon-visible false' >> $START_DESKTOP
  542. echo 'dconf write /org/mate/caja/desktop/home-icon-visible false' >> $START_DESKTOP
  543. echo 'dconf write /org/mate/caja/desktop/network-icon-visible false' >> $START_DESKTOP
  544. echo 'dconf write /org/mate/caja/desktop/trash-icon-visible false' >> $START_DESKTOP
  545. echo 'dconf write /org/mate/caja/desktop/volumes-visible false' >> $START_DESKTOP
  546. echo 'dconf write /org/mate/desktop/media-handling/automount-open false' >> $START_DESKTOP
  547. echo 'dconf write /org/mate/screensaver/lock-enabled false' >> $START_DESKTOP
  548. echo 'dconf write /org/mate/power-manager/lock-keyring-suspend false' >> $START_DESKTOP
  549. echo 'dconf write /org/mate/power-manager/lock-suspend false' >> $START_DESKTOP
  550. echo 'dconf write /org/mate/power-manager/lock-use-screensaver false' >> $START_DESKTOP
  551. echo 'dconf write /org/mate/power-manager/lock-blank-screen false' >> $START_DESKTOP
  552. echo 'dconf write /org/mate/power-manager/lock-hibernate false' >> $START_DESKTOP
  553. echo 'dconf write /org/mate/power-manager/lock-keyring-hibernate false' >> $START_DESKTOP
  554. echo 'dconf write /org/mate/desktop/peripherals/touchpad/scroll-method 2' >> $START_DESKTOP
  555. echo "touch /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  556. echo "chmod 600 /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  557. echo "env | grep DBUS_SESSION_BUS_ADDRESS > /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  558. echo "echo 'export DBUS_SESSION_BUS_ADDRESS' >> /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  559. echo '' >> $START_DESKTOP
  560. echo "amixer set 'Master' unmute" >> $START_DESKTOP
  561. echo "amixer set 'Master' 50%" >> $START_DESKTOP
  562. echo '' >> $START_DESKTOP
  563. echo '' >> $START_DESKTOP
  564. echo "if [ ! -f $FIRST_BOOT ]; then" >> $START_DESKTOP
  565. echo " $TAHOE_COMMAND start" >> $START_DESKTOP
  566. echo ' exit 0' >> $START_DESKTOP
  567. echo 'fi' >> $START_DESKTOP
  568. echo '' >> $START_DESKTOP
  569. echo 'INITIAL_TOX_USERNAME=""' >> $START_DESKTOP
  570. echo 'while [ ${#INITIAL_TOX_USERNAME} -eq 0 ]; do' >> $START_DESKTOP
  571. echo ' data=$(tempfile 2>/dev/null)' >> $START_DESKTOP
  572. echo ' trap "rm -f $data" 0 1 2 5 15' >> $START_DESKTOP
  573. echo -n " dialog --title \"${MESH_TITLE}\" " >> $START_DESKTOP
  574. echo -n "--backtitle \"${MESH_TITLE}\" " >> $START_DESKTOP
  575. echo -n "--inputbox \"${MESH_SET_USERNAME}\" 12 60 Anon " >> $START_DESKTOP
  576. echo '2>$data' >> $START_DESKTOP
  577. echo ' sel=$?' >> $START_DESKTOP
  578. echo ' case $sel in' >> $START_DESKTOP
  579. echo ' 0)' >> $START_DESKTOP
  580. echo ' INITIAL_TOX_USERNAME=$(<$data)' >> $START_DESKTOP
  581. echo ' ;;' >> $START_DESKTOP
  582. echo ' esac' >> $START_DESKTOP
  583. echo 'done' >> $START_DESKTOP
  584. echo '' >> $START_DESKTOP
  585. echo 'toxid --setuser "$INITIAL_TOX_USERNAME"' >> $START_DESKTOP
  586. echo '' >> $START_DESKTOP
  587. echo "if [ -f /home/$MY_USERNAME/.tahoe/tahoe.cfg ]; then" >> $START_DESKTOP
  588. echo " sed -i 's|nickname =.*|nickname = \$INITIAL_TOX_USERNAME|g' /home/$MY_USERNAME/.tahoe/tahoe.cfg" >> $START_DESKTOP
  589. echo " $TAHOE_COMMAND restart" >> $START_DESKTOP
  590. echo 'fi' >> $START_DESKTOP
  591. echo '' >> $START_DESKTOP
  592. echo "rm -f $FIRST_BOOT" >> $START_DESKTOP
  593. echo '' >> $START_DESKTOP
  594. echo 'exit 0' >> $START_DESKTOP
  595. chmod +x $START_DESKTOP
  596. START_DESKTOP2=$rootdir/home/$MY_USERNAME/.config/autostart/mesh-start.desktop
  597. echo '[Desktop Entry]' > $START_DESKTOP2
  598. echo 'Type=Application' >> $START_DESKTOP2
  599. echo 'Name=Mesh start desktop script' >> $START_DESKTOP2
  600. echo "Exec=bash -c '~/mesh-desktop.sh'" >> $START_DESKTOP2
  601. echo 'X-GNOME-Autostart-enabled=true' >> $START_DESKTOP2
  602. chmod +x $START_DESKTOP2
  603. START_DESKTOP3=$rootdir/home/$MY_USERNAME/.config/autostart/set_username.desktop
  604. echo '[Desktop Entry]' > $START_DESKTOP3
  605. echo 'Version=1.0' >> $START_DESKTOP3
  606. echo 'Name=Set Username' >> $START_DESKTOP3
  607. echo 'Type=Application' >> $START_DESKTOP3
  608. echo 'Comment=Set username' >> $START_DESKTOP3
  609. echo "Exec=mate-terminal -e \"bash -c /home/${MY_USERNAME}/mesh-desktop.sh\"" >> $START_DESKTOP3
  610. echo 'Icon=user-away' >> $START_DESKTOP3
  611. echo 'Terminal=false' >> $START_DESKTOP3
  612. echo 'Categories=Application;' >> $START_DESKTOP3
  613. chmod +x $START_DESKTOP3
  614. }
  615. function mesh_desktop_icons {
  616. if [ ! -d $rootdir/home/$MY_USERNAME/Desktop ]; then
  617. mkdir -p $rootdir/home/$MY_USERNAME/Desktop
  618. fi
  619. # Terminal
  620. #echo '[Desktop Entry]' > $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  621. #echo 'Name=MATE Terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  622. #echo 'Type=Application' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  623. #echo 'Comment=Use the command line' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  624. #echo 'TryExec=mate-terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  625. #echo 'Exec=mate-terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  626. #echo 'Icon=terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  627. #echo 'StartupNotify=true' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  628. chroot "$rootdir" /bin/chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop
  629. }
  630. function configure_user_interface {
  631. if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "usb" ]]; then
  632. return
  633. fi
  634. # desktop
  635. chroot "$rootdir" apt-get -yq install mate-desktop-environment
  636. # tool to change desktop settings from command line
  637. chroot "$rootdir" apt-get -yq install dconf-cli dconf-gsettings-backend dbus dbus-x11
  638. # for tomb
  639. chroot "$rootdir" apt-get -yq install pinentry-gtk2
  640. # for tox video
  641. chroot "$rootdir" apt-get -yq install ffmpeg cheese v4l-utils
  642. # to provide notifications
  643. chroot "$rootdir" apt-get -yq install libnotify-bin
  644. # for video/audio
  645. chroot "$rootdir" apt-get -yq install libtheora-bin libvorbis-dev v4l-utils
  646. # a sane editor
  647. chroot "$rootdir" apt-get -yq install emacs24
  648. # for wifi monitoring
  649. chroot "$rootdir" apt-get -yq install horst
  650. # for sound level control
  651. chroot "$rootdir" apt-get -yq install alsa-utils
  652. # to play various media types
  653. chroot "$rootdir" apt-get -yq install vlc
  654. # android adb to allow phones to be connected and for example transfer photos/documents
  655. chroot "$rootdir" apt-get -yq install android-tools-adb
  656. # Produce a text file on the desktop listing users on the mesh
  657. cat <<EOF > $rootdir/usr/bin/list-tox-users
  658. #!/bin/bash
  659. users_list=\$(lstox | awk -F ' ' '{\$1=""; print \$0}' | sed -e 's/^[[:space:]]*//' | sort -d | uniq)
  660. if [ ! \$users_list ]; then
  661. no_of_users=0
  662. else
  663. no_of_users=\$(echo "\$users_list" | wc -l)
  664. fi
  665. if [ \$no_of_users -gt 0 ]; then
  666. echo "\$users_list" > /tmp/Users.txt
  667. chown $MY_USERNAME:$MY_USERNAME /tmp/Users.txt
  668. echo 'showing_users=\$(ps aux | grep $MESH_TEXT_EDITOR | grep "Users.txt")' > /home/$MY_USERNAME/showusers
  669. echo 'if [ \${#showing_users} -eq 0 ]; then' >> /home/$MY_USERNAME/showusers
  670. echo ' $MESH_TEXT_EDITOR /tmp/Users.txt' >> /home/$MY_USERNAME/showusers
  671. echo 'fi' >> /home/$MY_USERNAME/showusers
  672. echo 'exit 0' >> /home/$MY_USERNAME/showusers
  673. chmod +x /home/$MY_USERNAME/showusers
  674. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/showusers
  675. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/Users.desktop
  676. if [ \$no_of_users -lt 2 ]; then
  677. echo "Name=\$no_of_users Other User" >> /home/$MY_USERNAME/Desktop/Users.desktop
  678. else
  679. echo "Name=\$no_of_users Other Users" >> /home/$MY_USERNAME/Desktop/Users.desktop
  680. fi
  681. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/Users.desktop
  682. echo 'Comment=List of users' >> /home/$MY_USERNAME/Desktop/Users.desktop
  683. echo 'Exec=bash /home/$MY_USERNAME/showusers' >> /home/$MY_USERNAME/Desktop/Users.desktop
  684. echo 'Icon=/usr/share/$PROJECT_NAME/avatars/otheruser.png' >> /home/$MY_USERNAME/Desktop/Users.desktop
  685. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/Users.desktop
  686. chmod +x /home/$MY_USERNAME/Desktop/Users.desktop
  687. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/Users.desktop
  688. if [ -f /tmp/.ipfs-users ]; then
  689. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/sites.desktop
  690. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/sites.desktop
  691. echo "Name=Visit a site" >> /home/$MY_USERNAME/Desktop/sites.desktop
  692. echo 'Comment=Visit a site' >> /home/$MY_USERNAME/Desktop/sites.desktop
  693. echo 'Exec=mate-terminal -e /usr/local/bin/${PROJECT_NAME}-mesh-visit-site' >> /home/$MY_USERNAME/Desktop/sites.desktop
  694. echo 'Icon=/usr/share/${PROJECT_NAME}/avatars/ipfs.jpg' >> /home/$MY_USERNAME/Desktop/sites.desktop
  695. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/sites.desktop
  696. chmod +x /home/$MY_USERNAME/Desktop/sites.desktop
  697. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/sites.desktop
  698. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/blog.desktop
  699. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/blog.desktop
  700. echo "Name=Blog" >> /home/$MY_USERNAME/Desktop/blog.desktop
  701. echo 'Comment=View or create blog entries' >> /home/$MY_USERNAME/Desktop/blog.desktop
  702. echo 'Exec=mate-terminal -e /usr/local/bin/${PROJECT_NAME}-mesh-blog' >> /home/$MY_USERNAME/Desktop/blog.desktop
  703. echo 'Icon=/usr/share/${PROJECT_NAME}/avatars/blog.png' >> /home/$MY_USERNAME/Desktop/blog.desktop
  704. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/blog.desktop
  705. chmod +x /home/$MY_USERNAME/Desktop/blog.desktop
  706. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/blog.desktop
  707. fi
  708. if [ ! -f /home/$MY_USERNAME/runtox ]; then
  709. echo 'qtox_running=\$(ps aux | grep qtox | grep data)' > /home/$MY_USERNAME/runtox
  710. echo 'if [ \${#qtox_running} -eq 0 ]; then' >> /home/$MY_USERNAME/runtox
  711. echo ' bash -c "qtox -p data"' >> /home/$MY_USERNAME/runtox
  712. echo 'fi' >> /home/$MY_USERNAME/runtox
  713. echo 'exit 0' >> /home/$MY_USERNAME/runtox
  714. chmod +x /home/$MY_USERNAME/runtox
  715. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/runtox
  716. fi
  717. if [ ! -f /home/$MY_USERNAME/Desktop/tox.desktop ]; then
  718. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/tox.desktop
  719. echo 'Name=Chat' >> /home/$MY_USERNAME/Desktop/tox.desktop
  720. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/tox.desktop
  721. echo 'Comment=Chat, Voice and Video' >> /home/$MY_USERNAME/Desktop/tox.desktop
  722. echo 'Exec=bash /home/$MY_USERNAME/runtox' >> /home/$MY_USERNAME/Desktop/tox.desktop
  723. echo "Icon=/usr/share/$PROJECT_NAME/avatars/chat.png" >> /home/$MY_USERNAME/Desktop/tox.desktop
  724. echo 'StartupNotify=true' >> /home/$MY_USERNAME/Desktop/tox.desktop
  725. chmod +x /home/$MY_USERNAME/Desktop/tox.desktop
  726. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/tox.desktop
  727. fi
  728. else
  729. if [ -f /tmp/Users.txt ]; then
  730. rm /tmp/Users.txt
  731. rm /home/$MY_USERNAME/Desktop/Users.desktop
  732. if [ -f /home/$MY_USERNAME/Desktop/Users.desktop ]; then
  733. rm /home/$MY_USERNAME/Desktop/Users.desktop
  734. fi
  735. if [ -f /home/$MY_USERNAME/Desktop/sites.desktop ]; then
  736. rm /home/$MY_USERNAME/Desktop/sites.desktop
  737. fi
  738. if [ -f /home/$MY_USERNAME/Desktop/blog.desktop ]; then
  739. rm /home/$MY_USERNAME/Desktop/blog.desktop
  740. fi
  741. if [ -f /home/$MY_USERNAME/Desktop/tox.desktop ]; then
  742. rm /home/$MY_USERNAME/Desktop/tox.desktop
  743. fi
  744. pkill qtox
  745. fi
  746. fi
  747. EOF
  748. chroot "$rootdir" /bin/chown $MY_USERNAME:$MY_USERNAME /usr/bin/list-tox-users
  749. chroot "$rootdir" /bin/chmod +x /usr/bin/list-tox-users
  750. echo "* * * * * $MY_USERNAME bash -c /usr/bin/list-tox-users > /dev/null" >> $rootdir/etc/crontab
  751. if [[ $VARIANT != "usb" ]]; then
  752. # log in automatically
  753. chroot "$rootdir" apt-get -y install nodm xinit
  754. echo 'NODM_ENABLED=true' > /etc/default/nodm
  755. echo "NODM_USER=$MY_USERNAME" >> /etc/default/nodm
  756. chroot "$rootdir" mkdir /etc/systemd/system/getty@tty1.service.d
  757. echo '[Service]' > $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  758. echo 'ExecStart=' >> $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  759. echo 'ExecStart=-/sbin/agetty --autologin fbone --noclear %I $TERM' >> $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  760. echo '[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx' >> $rootdir/home/$MY_USERNAME/.profile
  761. chroot "$rootdir" systemctl set-default multi-user.target
  762. mesh_client_startup_applications
  763. mesh_desktop_icons
  764. # Different desktop background for amnesic
  765. if [[ $AMNESIC != 'no' ]]; then
  766. MESH_DESKTOP_BACKGROUND_IMAGE=/usr/local/share/${PROJECT_NAME}_mesh_amnesic_background.png
  767. fi
  768. # change the desktop background
  769. if [ $MESH_DESKTOP_BACKGROUND_IMAGE ]; then
  770. if [ -f $MESH_DESKTOP_BACKGROUND_IMAGE ]; then
  771. if [ -d $rootdir/usr/share/images/desktop-base ]; then
  772. cp $MESH_DESKTOP_BACKGROUND_IMAGE $rootdir/usr/share/images/desktop-base/${PROJECT_NAME}_mesh_background.png
  773. chroot "$rootdir" /bin/rm /usr/share/images/desktop-base/desktop-background
  774. chroot "$rootdir" ln -s /usr/share/images/desktop-base/${PROJECT_NAME}_mesh_background.png /usr/share/images/desktop-base/desktop-background
  775. fi
  776. fi
  777. fi
  778. else
  779. chroot "$rootdir" apt-get -yq install lightdm
  780. fi
  781. # browser
  782. chroot "$rootdir" apt-get -yq install $BROWSER
  783. # help
  784. mkdir -p $rootdir/home/${MY_USERNAME}/help/images
  785. cd $rootdir/root/${PROJECT_NAME}/website
  786. ./deploy.sh EN $rootdir/home/${MY_USERNAME}/help
  787. chroot "$rootdir" /bin/chown -R ${MY_USERNAME}:${MY_USERNAME} /home/${MY_USERNAME}/help
  788. # Tox user interface
  789. enable_tox_repo
  790. mesh_tox_qtox
  791. # copy the default qtox ini file
  792. if [ ! -d ${rootdir}/home/${MY_USERNAME}/.config/tox ]; then
  793. mkdir ${rootdir}/home/${MY_USERNAME}/.config/tox
  794. cp /usr/local/bin/${PROJECT_NAME}-config-qtox ${rootdir}/home/${MY_USERNAME}/.config/tox/qtox.ini
  795. chroot "$rootdir" /bin/chown -R ${MY_USERNAME}:${MY_USERNAME} /home/${MY_USERNAME}/.config
  796. fi
  797. if [[ $VARIANT == "usb" ]]; then
  798. # tor
  799. chroot "$rootdir" apt-get -y install tor
  800. # xmpp client
  801. chroot "$rootdir" echo "deb ftp://ftp.gajim.org/debian unstable main" > /etc/apt/sources.list.d/gajim.list
  802. chroot "$rootdir" apt-get update
  803. chroot "$rootdir" apt-get -yq install gajim-dev-keyring
  804. chroot "$rootdir" apt-get -yq install git python-dev python-pip gajim-nightly
  805. chroot "$rootdir" mkdir /home/$GENERIC_IMAGE_USERNAME/.local/share/gajim/plugins -p
  806. chroot "$rootdir" git clone https://github.com/omemo/gajim-omemo /home/$GENERIC_IMAGE_USERNAME/.local/share/gajim/plugins/gajim-omemo
  807. chroot "$rootdir" pip install protobuf==2.6.1, python-axolotl==0.1.35
  808. chroot "$rootdir" /bin/chown -R $GENERIC_IMAGE_USERNAME:$GENERIC_IMAGE_USERNAME /home/$GENERIC_IMAGE_USERNAME/.local
  809. # IRC client
  810. chroot "$rootdir" apt-get -yq install hexchat profanity
  811. fi
  812. }
  813. ##############################################################################
  814. # Set to true/false to control if eatmydata is used during build
  815. use_eatmydata=true
  816. rootdir="$1"
  817. fmdir="$(pwd)"
  818. image="$fmdir"/"$2"
  819. cd "$rootdir"
  820. echo info: building $MACHINE for $ARCHITECTURE
  821. export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
  822. export LC_ALL=C LANGUAGE=C LANG=C
  823. # Override libpam-tmpdir setting during build, as the directories
  824. # are not created yet.
  825. export TMP=/tmp/ TMPDIR=/tmp/
  826. if [ ! $MY_USERNAME ]; then
  827. echo $'No username was specified'
  828. exit 52825
  829. fi
  830. username=$MY_USERNAME
  831. echo $"warning: creating initial user $username with well known password!"
  832. password=$MY_PASSWORD
  833. chroot "$rootdir" /usr/bin/env -i \
  834. HOME=/root \
  835. PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
  836. echo "export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:" >> $rootdir/root/.bashrc
  837. chroot "$rootdir" adduser --gecos $username --disabled-password $username
  838. echo $username:$password | chroot "$rootdir" /usr/sbin/chpasswd
  839. chroot "$rootdir" adduser $username sudo
  840. if [ ! $DEBIAN_REPO ]; then
  841. DEBIAN_REPO='ftp.de.debian.org'
  842. fi
  843. if [ ! $DEBIAN_VERSION ]; then
  844. DEBIAN_VERSION='jessie'
  845. fi
  846. set_apt_sources $BUILD_MIRROR
  847. chroot "$rootdir" apt-get clean
  848. chroot "$rootdir" /bin/rm -rf /var/lib/apt/lists/*
  849. chroot "$rootdir" apt-get clean
  850. set_apt_sources $MIRROR
  851. configure_backports
  852. configure_contrib_repo
  853. chroot "$rootdir" apt-get update
  854. chroot "$rootdir" apt-get install -y apt-utils
  855. cat > $rootdir/usr/sbin/policy-rc.d <<EOF
  856. #!/bin/sh
  857. exit 101
  858. EOF
  859. chmod a+rx $rootdir/usr/sbin/policy-rc.d
  860. if $use_eatmydata ; then
  861. enable_eatmydata_override
  862. fi
  863. if [ -n "$CUSTOM_SETUP" ]; then
  864. cp "$CUSTOM_SETUP" "$rootdir"/tmp
  865. chroot "$rootdir" apt-get install -y gdebi-core
  866. chroot "$rootdir" gdebi -n /tmp/"$(basename $CUSTOM_SETUP)"
  867. fi
  868. if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "mesh" ]]; then
  869. chroot "$rootdir" apt-get install -y openssh-server
  870. fi
  871. chroot "$rootdir" apt-get install -y sudo git dialog build-essential
  872. chroot "$rootdir" apt-get install -y avahi-daemon avahi-utils avahi-discover avahi-autoipd
  873. chroot "$rootdir" apt-get install -y iptables dnsutils net-tools network-manager iputils-ping
  874. chroot "$rootdir" apt-get install -y libnss-mdns libnss-myhostname libnss-gw-name nano man ntp
  875. chroot "$rootdir" apt-get install -y locales locales-all debconf wireless-tools wpasupplicant usbutils
  876. if [[ $ARCHITECTURE == 'qemu'* || $ARCHITECTURE == 'i386' || $ARCHITECTURE == 'i686' || $ARCHITECTURE == 'amd64' || $ARCHITECTURE == 'x86_64' ]]; then
  877. chroot "$rootdir" apt-get install -y cryptsetup zsh pinentry-curses iotop bc
  878. chroot "$rootdir" apt-get install -y grub2 hostapd
  879. fi
  880. sed -i "s|#host-name=.*|host-name=${PROJECT_NAME}|g" $rootdir/etc/avahi/avahi-daemon.conf
  881. sed -i "s|host-name=.*|host-name=${PROJECT_NAME}|g" $rootdir/etc/avahi/avahi-daemon.conf
  882. chroot "$rootdir" /bin/bash -x <<EOF
  883. git clone $PROJECT_REPO /root/$PROJECT_NAME
  884. cd /root/$PROJECT_NAME
  885. git checkout origin/stockholm -b stockholm
  886. make install
  887. EOF
  888. chroot "$rootdir" ${PROJECT_NAME}-image-hardware-setup 2>&1 | \
  889. tee $rootdir/var/log/${PROJECT_NAME}-image-hardware-setup.log
  890. rm $rootdir/usr/sbin/policy-rc.d
  891. # Set up HRNG for systems known to have one
  892. # Otherwise install haveged
  893. if [[ "$MACHINE" != "beaglebone" ]]; then
  894. chroot $rootdir apt-get -yq install haveged
  895. else
  896. chroot $rootdir apt-get -yq install rng-tools
  897. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' $rootdir/etc/default/rng-tools
  898. fi
  899. # copy u-boot to beginning of image
  900. case "$MACHINE" in
  901. beaglebone)
  902. dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/MLO of="$image" \
  903. count=1 seek=1 conv=notrunc bs=128k
  904. dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/u-boot.img of="$image" \
  905. count=2 seek=1 conv=notrunc bs=384k
  906. ;;
  907. cubieboard2)
  908. dd if=$rootdir/usr/lib/u-boot/Cubieboard2/u-boot-sunxi-with-spl.bin of="$image" \
  909. seek=8 conv=notrunc bs=1k
  910. ;;
  911. a20-olinuxino-lime)
  912. dd if=$rootdir/usr/lib/u-boot/A20-OLinuXino-Lime/u-boot-sunxi-with-spl.bin \
  913. of="$image" seek=8 conv=notrunc bs=1k
  914. ;;
  915. esac
  916. if $use_eatmydata ; then
  917. disable_eatmydata_override
  918. fi
  919. configure_ssh
  920. configure_networking
  921. admin_user_sudo
  922. create_generic_image
  923. atheros_wifi
  924. continue_installation
  925. initialise_mesh
  926. configure_wifi
  927. configure_user_interface
  928. # remove downloaded packages
  929. chroot $rootdir apt-get clean
  930. cd /
  931. echo $"info: killing leftover processes in chroot"
  932. fuser -mvk $rootdir/. || true
  933. exit 0