freedombone-image-customise 44KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  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 '[Service]' >> $MESH_SETUP_DAEMON
  512. echo 'Type=simple' >> $MESH_SETUP_DAEMON
  513. echo 'User=root' >> $MESH_SETUP_DAEMON
  514. echo 'Group=root' >> $MESH_SETUP_DAEMON
  515. echo 'WorkingDirectory=/root' >> $MESH_SETUP_DAEMON
  516. echo "ExecStart=/usr/local/bin/${PROJECT_NAME}-image-mesh ${MESH_STARTUP_PARAMS} > /var/log/mesh-setup.log" >> $MESH_SETUP_DAEMON
  517. echo '' >> $MESH_SETUP_DAEMON
  518. echo 'TimeoutSec=99999' >> $MESH_SETUP_DAEMON
  519. echo '' >> $MESH_SETUP_DAEMON
  520. echo '[Install]' >> $MESH_SETUP_DAEMON
  521. echo 'WantedBy=multi-user.target' >> $MESH_SETUP_DAEMON
  522. chroot "$rootdir" systemctl enable $MESH_SERVICE
  523. }
  524. # User interface for USB drive installs ######################################
  525. function mesh_client_startup_applications {
  526. if [ ! -d $rootdir/home/$MY_USERNAME/Desktop ]; then
  527. mkdir -p $rootdir/home/$MY_USERNAME/Desktop
  528. fi
  529. if [ ! -d $rootdir/home/$MY_USERNAME/.config/autostart ]; then
  530. mkdir -p $rootdir/home/$MY_USERNAME/.config/autostart
  531. chroot "$rootdir" /bin/chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  532. fi
  533. START_DESKTOP=$rootdir/home/$MY_USERNAME/mesh-desktop.sh
  534. FIRST_BOOT=/home/$MY_USERNAME/.first_boot
  535. TAHOE_COMMAND="cd /var/lib/tahoelafs && venv/bin/tahoe"
  536. echo '#!/bin/bash' > $START_DESKTOP
  537. echo "setxkbmap ${KEYBOARD_MAP}" > $START_DESKTOP
  538. echo 'dconf write /org/mate/caja/desktop/volumes-visible false' >> $START_DESKTOP
  539. echo 'dconf write /org/mate/caja/desktop/computer-icon-visible false' >> $START_DESKTOP
  540. echo 'dconf write /org/mate/caja/desktop/home-icon-visible false' >> $START_DESKTOP
  541. echo 'dconf write /org/mate/caja/desktop/network-icon-visible false' >> $START_DESKTOP
  542. echo 'dconf write /org/mate/caja/desktop/trash-icon-visible false' >> $START_DESKTOP
  543. echo 'dconf write /org/mate/caja/desktop/volumes-visible false' >> $START_DESKTOP
  544. echo 'dconf write /org/mate/desktop/media-handling/automount-open false' >> $START_DESKTOP
  545. echo 'dconf write /org/mate/screensaver/lock-enabled false' >> $START_DESKTOP
  546. echo 'dconf write /org/mate/power-manager/lock-keyring-suspend false' >> $START_DESKTOP
  547. echo 'dconf write /org/mate/power-manager/lock-suspend false' >> $START_DESKTOP
  548. echo 'dconf write /org/mate/power-manager/lock-use-screensaver false' >> $START_DESKTOP
  549. echo 'dconf write /org/mate/power-manager/lock-blank-screen false' >> $START_DESKTOP
  550. echo 'dconf write /org/mate/power-manager/lock-hibernate false' >> $START_DESKTOP
  551. echo 'dconf write /org/mate/power-manager/lock-keyring-hibernate false' >> $START_DESKTOP
  552. echo 'dconf write /org/mate/desktop/peripherals/touchpad/scroll-method 2' >> $START_DESKTOP
  553. echo "touch /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  554. echo "chmod 600 /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  555. echo "env | grep DBUS_SESSION_BUS_ADDRESS > /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  556. echo "echo 'export DBUS_SESSION_BUS_ADDRESS' >> /home/$MY_USERNAME/.dbus/Xdbus" >> $START_DESKTOP
  557. echo '' >> $START_DESKTOP
  558. echo "amixer set 'Master' unmute" >> $START_DESKTOP
  559. echo "amixer set 'Master' 50%" >> $START_DESKTOP
  560. echo '' >> $START_DESKTOP
  561. echo '' >> $START_DESKTOP
  562. echo "if [ ! -f $FIRST_BOOT ]; then" >> $START_DESKTOP
  563. echo " $TAHOE_COMMAND start" >> $START_DESKTOP
  564. echo ' exit 0' >> $START_DESKTOP
  565. echo 'fi' >> $START_DESKTOP
  566. echo '' >> $START_DESKTOP
  567. echo 'INITIAL_TOX_USERNAME=""' >> $START_DESKTOP
  568. echo 'while [ ${#INITIAL_TOX_USERNAME} -eq 0 ]; do' >> $START_DESKTOP
  569. echo ' data=$(tempfile 2>/dev/null)' >> $START_DESKTOP
  570. echo ' trap "rm -f $data" 0 1 2 5 15' >> $START_DESKTOP
  571. echo -n " dialog --title \"${MESH_TITLE}\" " >> $START_DESKTOP
  572. echo -n "--backtitle \"${MESH_TITLE}\" " >> $START_DESKTOP
  573. echo -n "--inputbox \"${MESH_SET_USERNAME}\" 12 60 Anon " >> $START_DESKTOP
  574. echo '2>$data' >> $START_DESKTOP
  575. echo ' sel=$?' >> $START_DESKTOP
  576. echo ' case $sel in' >> $START_DESKTOP
  577. echo ' 0)' >> $START_DESKTOP
  578. echo ' INITIAL_TOX_USERNAME=$(<$data)' >> $START_DESKTOP
  579. echo ' ;;' >> $START_DESKTOP
  580. echo ' esac' >> $START_DESKTOP
  581. echo 'done' >> $START_DESKTOP
  582. echo '' >> $START_DESKTOP
  583. echo 'toxid --setuser "$INITIAL_TOX_USERNAME"' >> $START_DESKTOP
  584. echo '' >> $START_DESKTOP
  585. echo "if [ -f /home/$MY_USERNAME/.tahoe/tahoe.cfg ]; then" >> $START_DESKTOP
  586. echo " sed -i 's|nickname =.*|nickname = \$INITIAL_TOX_USERNAME|g' /home/$MY_USERNAME/.tahoe/tahoe.cfg" >> $START_DESKTOP
  587. echo " $TAHOE_COMMAND restart" >> $START_DESKTOP
  588. echo 'fi' >> $START_DESKTOP
  589. echo '' >> $START_DESKTOP
  590. echo "rm -f $FIRST_BOOT" >> $START_DESKTOP
  591. echo '' >> $START_DESKTOP
  592. echo 'exit 0' >> $START_DESKTOP
  593. chmod +x $START_DESKTOP
  594. START_DESKTOP2=$rootdir/home/$MY_USERNAME/.config/autostart/mesh-start.desktop
  595. echo '[Desktop Entry]' > $START_DESKTOP2
  596. echo 'Type=Application' >> $START_DESKTOP2
  597. echo 'Name=Mesh start desktop script' >> $START_DESKTOP2
  598. echo "Exec=bash -c '~/mesh-desktop.sh'" >> $START_DESKTOP2
  599. echo 'X-GNOME-Autostart-enabled=true' >> $START_DESKTOP2
  600. chmod +x $START_DESKTOP2
  601. START_DESKTOP3=$rootdir/home/$MY_USERNAME/.config/autostart/set_username.desktop
  602. echo '[Desktop Entry]' > $START_DESKTOP3
  603. echo 'Version=1.0' >> $START_DESKTOP3
  604. echo 'Name=Set Username' >> $START_DESKTOP3
  605. echo 'Type=Application' >> $START_DESKTOP3
  606. echo 'Comment=Set username' >> $START_DESKTOP3
  607. echo "Exec=mate-terminal -e \"bash -c /home/${MY_USERNAME}/mesh-desktop.sh\"" >> $START_DESKTOP3
  608. echo 'Icon=user-away' >> $START_DESKTOP3
  609. echo 'Terminal=false' >> $START_DESKTOP3
  610. echo 'Categories=Application;' >> $START_DESKTOP3
  611. chmod +x $START_DESKTOP3
  612. }
  613. function mesh_desktop_icons {
  614. if [ ! -d $rootdir/home/$MY_USERNAME/Desktop ]; then
  615. mkdir -p $rootdir/home/$MY_USERNAME/Desktop
  616. fi
  617. # Terminal
  618. #echo '[Desktop Entry]' > $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  619. #echo 'Name=MATE Terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  620. #echo 'Type=Application' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  621. #echo 'Comment=Use the command line' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  622. #echo 'TryExec=mate-terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  623. #echo 'Exec=mate-terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  624. #echo 'Icon=terminal' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  625. #echo 'StartupNotify=true' >> $rootdir/home/$MY_USERNAME/Desktop/terminal.desktop
  626. chroot "$rootdir" /bin/chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop
  627. }
  628. function configure_user_interface {
  629. if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "usb" ]]; then
  630. return
  631. fi
  632. # desktop
  633. chroot "$rootdir" apt-get -yq install mate-desktop-environment
  634. # tool to change desktop settings from command line
  635. chroot "$rootdir" apt-get -yq install dconf-cli dconf-gsettings-backend dbus dbus-x11
  636. # for tomb
  637. chroot "$rootdir" apt-get -yq install pinentry-gtk2
  638. # for tox video
  639. chroot "$rootdir" apt-get -yq install ffmpeg cheese v4l-utils
  640. # to provide notifications
  641. chroot "$rootdir" apt-get -yq install libnotify-bin
  642. # for video/audio
  643. chroot "$rootdir" apt-get -yq install libtheora-bin libvorbis-dev v4l-utils
  644. # a sane editor
  645. chroot "$rootdir" apt-get -yq install emacs24
  646. # for wifi monitoring
  647. chroot "$rootdir" apt-get -yq install horst
  648. # for sound level control
  649. chroot "$rootdir" apt-get -yq install alsa-utils
  650. # to play various media types
  651. chroot "$rootdir" apt-get -yq install vlc
  652. # android adb to allow phones to be connected and for example transfer photos/documents
  653. chroot "$rootdir" apt-get -yq install android-tools-adb
  654. # Produce a text file on the desktop listing users on the mesh
  655. cat <<EOF > $rootdir/usr/bin/list-tox-users
  656. #!/bin/bash
  657. users_list=\$(lstox | awk -F ' ' '{\$1=""; print \$0}' | sed -e 's/^[[:space:]]*//' | sort -d)
  658. if [ ! \$users_list ]; then
  659. no_of_users=0
  660. else
  661. no_of_users=\$(echo "\$users_list" | wc -l)
  662. fi
  663. if [ \$no_of_users -gt 0 ]; then
  664. echo "\$users_list" > /tmp/Users.txt
  665. chown $MY_USERNAME:$MY_USERNAME /tmp/Users.txt
  666. echo 'showing_users=\$(ps aux | grep $MESH_TEXT_EDITOR | grep "Users.txt")' > /home/$MY_USERNAME/showusers
  667. echo 'if [ \${#showing_users} -eq 0 ]; then' >> /home/$MY_USERNAME/showusers
  668. echo ' $MESH_TEXT_EDITOR /tmp/Users.txt' >> /home/$MY_USERNAME/showusers
  669. echo 'fi' >> /home/$MY_USERNAME/showusers
  670. echo 'exit 0' >> /home/$MY_USERNAME/showusers
  671. chmod +x /home/$MY_USERNAME/showusers
  672. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/showusers
  673. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/Users.desktop
  674. if [ \$no_of_users -lt 2 ]; then
  675. echo "Name=\$no_of_users Other User" >> /home/$MY_USERNAME/Desktop/Users.desktop
  676. else
  677. echo "Name=\$no_of_users Other Users" >> /home/$MY_USERNAME/Desktop/Users.desktop
  678. fi
  679. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/Users.desktop
  680. echo 'Comment=List of users' >> /home/$MY_USERNAME/Desktop/Users.desktop
  681. echo 'Exec=bash /home/$MY_USERNAME/showusers' >> /home/$MY_USERNAME/Desktop/Users.desktop
  682. echo 'Icon=/usr/share/$PROJECT_NAME/avatars/otheruser.png' >> /home/$MY_USERNAME/Desktop/Users.desktop
  683. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/Users.desktop
  684. chmod +x /home/$MY_USERNAME/Desktop/Users.desktop
  685. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/Users.desktop
  686. if [ -f /tmp/.ipfs-users ]; then
  687. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/sites.desktop
  688. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/sites.desktop
  689. echo "Name=Visit a site" >> /home/$MY_USERNAME/Desktop/sites.desktop
  690. echo 'Comment=Visit a site' >> /home/$MY_USERNAME/Desktop/sites.desktop
  691. echo 'Exec=mate-terminal -e /usr/local/bin/${PROJECT_NAME}-mesh-visit-site' >> /home/$MY_USERNAME/Desktop/sites.desktop
  692. echo 'Icon=/usr/share/${PROJECT_NAME}/avatars/ipfs.jpg' >> /home/$MY_USERNAME/Desktop/sites.desktop
  693. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/sites.desktop
  694. chmod +x /home/$MY_USERNAME/Desktop/sites.desktop
  695. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/sites.desktop
  696. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/blog.desktop
  697. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/blog.desktop
  698. echo "Name=Blog" >> /home/$MY_USERNAME/Desktop/blog.desktop
  699. echo 'Comment=View or create blog entries' >> /home/$MY_USERNAME/Desktop/blog.desktop
  700. echo 'Exec=mate-terminal -e /usr/local/bin/${PROJECT_NAME}-mesh-blog' >> /home/$MY_USERNAME/Desktop/blog.desktop
  701. echo 'Icon=/usr/share/${PROJECT_NAME}/avatars/blog.png' >> /home/$MY_USERNAME/Desktop/blog.desktop
  702. echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/blog.desktop
  703. chmod +x /home/$MY_USERNAME/Desktop/blog.desktop
  704. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/blog.desktop
  705. fi
  706. if [ ! -f /home/$MY_USERNAME/runtox ]; then
  707. echo 'qtox_running=\$(ps aux | grep qtox | grep data)' > /home/$MY_USERNAME/runtox
  708. echo 'if [ \${#qtox_running} -eq 0 ]; then' >> /home/$MY_USERNAME/runtox
  709. echo ' bash -c "qtox -p data"' >> /home/$MY_USERNAME/runtox
  710. echo 'fi' >> /home/$MY_USERNAME/runtox
  711. echo 'exit 0' >> /home/$MY_USERNAME/runtox
  712. chmod +x /home/$MY_USERNAME/runtox
  713. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/runtox
  714. fi
  715. if [ ! -f /home/$MY_USERNAME/Desktop/tox.desktop ]; then
  716. echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/tox.desktop
  717. echo 'Name=Chat' >> /home/$MY_USERNAME/Desktop/tox.desktop
  718. echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/tox.desktop
  719. echo 'Comment=Chat, Voice and Video' >> /home/$MY_USERNAME/Desktop/tox.desktop
  720. echo 'Exec=bash /home/$MY_USERNAME/runtox' >> /home/$MY_USERNAME/Desktop/tox.desktop
  721. echo "Icon=/usr/share/$PROJECT_NAME/avatars/chat.png" >> /home/$MY_USERNAME/Desktop/tox.desktop
  722. echo 'StartupNotify=true' >> /home/$MY_USERNAME/Desktop/tox.desktop
  723. chmod +x /home/$MY_USERNAME/Desktop/tox.desktop
  724. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/tox.desktop
  725. fi
  726. else
  727. if [ -f /tmp/Users.txt ]; then
  728. rm /tmp/Users.txt
  729. rm /home/$MY_USERNAME/Desktop/Users.desktop
  730. if [ -f /home/$MY_USERNAME/Desktop/Users.desktop ]; then
  731. rm /home/$MY_USERNAME/Desktop/Users.desktop
  732. fi
  733. if [ -f /home/$MY_USERNAME/Desktop/sites.desktop ]; then
  734. rm /home/$MY_USERNAME/Desktop/sites.desktop
  735. fi
  736. if [ -f /home/$MY_USERNAME/Desktop/blog.desktop ]; then
  737. rm /home/$MY_USERNAME/Desktop/blog.desktop
  738. fi
  739. if [ -f /home/$MY_USERNAME/Desktop/tox.desktop ]; then
  740. rm /home/$MY_USERNAME/Desktop/tox.desktop
  741. fi
  742. pkill qtox
  743. fi
  744. fi
  745. EOF
  746. chroot "$rootdir" /bin/chown $MY_USERNAME:$MY_USERNAME /usr/bin/list-tox-users
  747. chroot "$rootdir" /bin/chmod +x /usr/bin/list-tox-users
  748. echo "* * * * * $MY_USERNAME bash -c /usr/bin/list-tox-users > /dev/null" >> $rootdir/etc/crontab
  749. if [[ $VARIANT != "usb" ]]; then
  750. # log in automatically
  751. chroot "$rootdir" apt-get -y install nodm xinit
  752. echo 'NODM_ENABLED=true' > /etc/default/nodm
  753. echo "NODM_USER=$MY_USERNAME" >> /etc/default/nodm
  754. chroot "$rootdir" mkdir /etc/systemd/system/getty@tty1.service.d
  755. echo '[Service]' > $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  756. echo 'ExecStart=' >> $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  757. echo 'ExecStart=-/sbin/agetty --autologin fbone --noclear %I $TERM' >> $rootdir/etc/systemd/system/getty@tty1.service.d/override.conf
  758. echo '[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx' >> $rootdir/home/$MY_USERNAME/.profile
  759. chroot "$rootdir" systemctl set-default multi-user.target
  760. mesh_client_startup_applications
  761. mesh_desktop_icons
  762. # Different desktop background for amnesic
  763. if [[ $AMNESIC != 'no' ]]; then
  764. MESH_DESKTOP_BACKGROUND_IMAGE=/usr/local/share/${PROJECT_NAME}_mesh_amnesic_background.png
  765. fi
  766. # change the desktop background
  767. if [ $MESH_DESKTOP_BACKGROUND_IMAGE ]; then
  768. if [ -f $MESH_DESKTOP_BACKGROUND_IMAGE ]; then
  769. if [ -d $rootdir/usr/share/images/desktop-base ]; then
  770. cp $MESH_DESKTOP_BACKGROUND_IMAGE $rootdir/usr/share/images/desktop-base/${PROJECT_NAME}_mesh_background.png
  771. chroot "$rootdir" /bin/rm /usr/share/images/desktop-base/desktop-background
  772. chroot "$rootdir" ln -s /usr/share/images/desktop-base/${PROJECT_NAME}_mesh_background.png /usr/share/images/desktop-base/desktop-background
  773. fi
  774. fi
  775. fi
  776. else
  777. chroot "$rootdir" apt-get -yq install lightdm
  778. fi
  779. # browser
  780. chroot "$rootdir" apt-get -yq install $BROWSER
  781. # help
  782. mkdir -p $rootdir/home/${MY_USERNAME}/help/images
  783. cd $rootdir/root/${PROJECT_NAME}/website
  784. ./deploy.sh EN $rootdir/home/${MY_USERNAME}/help
  785. chroot "$rootdir" /bin/chown -R ${MY_USERNAME}:${MY_USERNAME} /home/${MY_USERNAME}/help
  786. # Tox user interface
  787. enable_tox_repo
  788. mesh_tox_qtox
  789. # copy the default qtox ini file
  790. if [ ! -d ${rootdir}/home/${MY_USERNAME}/.config/tox ]; then
  791. mkdir ${rootdir}/home/${MY_USERNAME}/.config/tox
  792. cp /usr/local/bin/${PROJECT_NAME}-config-qtox ${rootdir}/home/${MY_USERNAME}/.config/tox/qtox.ini
  793. chroot "$rootdir" /bin/chown -R ${MY_USERNAME}:${MY_USERNAME} /home/${MY_USERNAME}/.config
  794. fi
  795. if [[ $VARIANT == "usb" ]]; then
  796. # tor
  797. chroot "$rootdir" apt-get -y install tor
  798. # xmpp client
  799. chroot "$rootdir" echo "deb ftp://ftp.gajim.org/debian unstable main" > /etc/apt/sources.list.d/gajim.list
  800. chroot "$rootdir" apt-get update
  801. chroot "$rootdir" apt-get -yq install gajim-dev-keyring
  802. chroot "$rootdir" apt-get -yq install git python-dev python-pip gajim-nightly
  803. chroot "$rootdir" mkdir /home/$GENERIC_IMAGE_USERNAME/.local/share/gajim/plugins -p
  804. chroot "$rootdir" git clone https://github.com/omemo/gajim-omemo /home/$GENERIC_IMAGE_USERNAME/.local/share/gajim/plugins/gajim-omemo
  805. chroot "$rootdir" pip install protobuf==2.6.1, python-axolotl==0.1.35
  806. chroot "$rootdir" /bin/chown -R $GENERIC_IMAGE_USERNAME:$GENERIC_IMAGE_USERNAME /home/$GENERIC_IMAGE_USERNAME/.local
  807. # IRC client
  808. chroot "$rootdir" apt-get -yq install hexchat profanity
  809. fi
  810. }
  811. ##############################################################################
  812. # Set to true/false to control if eatmydata is used during build
  813. use_eatmydata=true
  814. rootdir="$1"
  815. fmdir="$(pwd)"
  816. image="$fmdir"/"$2"
  817. cd "$rootdir"
  818. echo info: building $MACHINE for $ARCHITECTURE
  819. export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
  820. export LC_ALL=C LANGUAGE=C LANG=C
  821. # Override libpam-tmpdir setting during build, as the directories
  822. # are not created yet.
  823. export TMP=/tmp/ TMPDIR=/tmp/
  824. if [ ! $MY_USERNAME ]; then
  825. echo $'No username was specified'
  826. exit 52825
  827. fi
  828. username=$MY_USERNAME
  829. echo $"warning: creating initial user $username with well known password!"
  830. password=$MY_PASSWORD
  831. chroot "$rootdir" /usr/bin/env -i \
  832. HOME=/root \
  833. PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
  834. echo "export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:" >> $rootdir/root/.bashrc
  835. chroot "$rootdir" adduser --gecos $username --disabled-password $username
  836. echo $username:$password | chroot "$rootdir" /usr/sbin/chpasswd
  837. chroot "$rootdir" adduser $username sudo
  838. if [ ! $DEBIAN_REPO ]; then
  839. DEBIAN_REPO='ftp.de.debian.org'
  840. fi
  841. if [ ! $DEBIAN_VERSION ]; then
  842. DEBIAN_VERSION='jessie'
  843. fi
  844. set_apt_sources $BUILD_MIRROR
  845. chroot "$rootdir" apt-get clean
  846. chroot "$rootdir" /bin/rm -rf /var/lib/apt/lists/*
  847. chroot "$rootdir" apt-get clean
  848. set_apt_sources $MIRROR
  849. configure_backports
  850. configure_contrib_repo
  851. chroot "$rootdir" apt-get update
  852. chroot "$rootdir" apt-get install -y apt-utils
  853. cat > $rootdir/usr/sbin/policy-rc.d <<EOF
  854. #!/bin/sh
  855. exit 101
  856. EOF
  857. chmod a+rx $rootdir/usr/sbin/policy-rc.d
  858. if $use_eatmydata ; then
  859. enable_eatmydata_override
  860. fi
  861. if [ -n "$CUSTOM_SETUP" ]; then
  862. cp "$CUSTOM_SETUP" "$rootdir"/tmp
  863. chroot "$rootdir" apt-get install -y gdebi-core
  864. chroot "$rootdir" gdebi -n /tmp/"$(basename $CUSTOM_SETUP)"
  865. fi
  866. if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" && $VARIANT != "mesh" ]]; then
  867. chroot "$rootdir" apt-get install -y openssh-server
  868. fi
  869. chroot "$rootdir" apt-get install -y sudo git dialog build-essential
  870. chroot "$rootdir" apt-get install -y avahi-daemon avahi-utils avahi-discover avahi-autoipd
  871. chroot "$rootdir" apt-get install -y iptables dnsutils net-tools network-manager iputils-ping
  872. chroot "$rootdir" apt-get install -y libnss-mdns libnss-myhostname libnss-gw-name nano man ntp
  873. chroot "$rootdir" apt-get install -y locales locales-all debconf wireless-tools wpasupplicant usbutils
  874. if [[ $ARCHITECTURE == 'qemu'* || $ARCHITECTURE == 'i386' || $ARCHITECTURE == 'i686' || $ARCHITECTURE == 'amd64' || $ARCHITECTURE == 'x86_64' ]]; then
  875. chroot "$rootdir" apt-get install -y cryptsetup zsh pinentry-curses iotop bc
  876. chroot "$rootdir" apt-get install -y grub2 hostapd
  877. fi
  878. sed -i "s|#host-name=.*|host-name=${PROJECT_NAME}|g" $rootdir/etc/avahi/avahi-daemon.conf
  879. sed -i "s|host-name=.*|host-name=${PROJECT_NAME}|g" $rootdir/etc/avahi/avahi-daemon.conf
  880. chroot "$rootdir" /bin/bash -x <<EOF
  881. git clone $PROJECT_REPO /root/$PROJECT_NAME
  882. cd /root/$PROJECT_NAME
  883. git checkout origin/stockholm -b stockholm
  884. make install
  885. EOF
  886. chroot "$rootdir" ${PROJECT_NAME}-image-hardware-setup 2>&1 | \
  887. tee $rootdir/var/log/${PROJECT_NAME}-image-hardware-setup.log
  888. rm $rootdir/usr/sbin/policy-rc.d
  889. # Set up HRNG for systems known to have one
  890. # Otherwise install haveged
  891. if [[ "$MACHINE" != "beaglebone" ]]; then
  892. chroot $rootdir apt-get -yq install haveged
  893. else
  894. chroot $rootdir apt-get -yq install rng-tools
  895. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' $rootdir/etc/default/rng-tools
  896. fi
  897. # copy u-boot to beginning of image
  898. case "$MACHINE" in
  899. beaglebone)
  900. dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/MLO of="$image" \
  901. count=1 seek=1 conv=notrunc bs=128k
  902. dd if=$rootdir/usr/lib/u-boot/am335x_boneblack/u-boot.img of="$image" \
  903. count=2 seek=1 conv=notrunc bs=384k
  904. ;;
  905. cubieboard2)
  906. dd if=$rootdir/usr/lib/u-boot/Cubieboard2/u-boot-sunxi-with-spl.bin of="$image" \
  907. seek=8 conv=notrunc bs=1k
  908. ;;
  909. a20-olinuxino-lime)
  910. dd if=$rootdir/usr/lib/u-boot/A20-OLinuXino-Lime/u-boot-sunxi-with-spl.bin \
  911. of="$image" seek=8 conv=notrunc bs=1k
  912. ;;
  913. esac
  914. if $use_eatmydata ; then
  915. disable_eatmydata_override
  916. fi
  917. configure_ssh
  918. configure_networking
  919. admin_user_sudo
  920. create_generic_image
  921. atheros_wifi
  922. continue_installation
  923. initialise_mesh
  924. configure_wifi
  925. configure_user_interface
  926. # remove downloaded packages
  927. chroot $rootdir apt-get clean
  928. cd /
  929. echo $"info: killing leftover processes in chroot"
  930. fuser -mvk $rootdir/. || true
  931. exit 0