freedombone-image 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Creates a debian image using vmdebootstrap
  12. #
  13. # To shut down after error: fuser -mvk /tmp/tmpdir/build
  14. #
  15. # License
  16. # =======
  17. #
  18. # Copyright (C) 2015-2018 Bob Mottram <bob@freedombone.net>
  19. #
  20. # This program is free software: you can redistribute it and/or modify
  21. # it under the terms of the GNU Affero General Public License as published by
  22. # the Free Software Foundation, either version 3 of the License, or
  23. # (at your option) any later version.
  24. #
  25. # This program is distributed in the hope that it will be useful,
  26. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28. # GNU Affero General Public License for more details.
  29. #
  30. # You should have received a copy of the GNU Affero General Public License
  31. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  32. PROJECT_NAME='freedombone'
  33. export TEXTDOMAIN=${PROJECT_NAME}-image
  34. export TEXTDOMAINDIR="/usr/share/locale"
  35. USERHOME=$HOME
  36. PROJECT_INSTALL_DIR=/usr/local/bin
  37. if [ -f /usr/bin/${PROJECT_NAME} ]; then
  38. PROJECT_INSTALL_DIR=/usr/bin
  39. fi
  40. source "$PROJECT_INSTALL_DIR/${PROJECT_NAME}-vars"
  41. #get the project repo
  42. PROJECT_REPO="https://github.com/bashrc/${PROJECT_NAME}"
  43. UTILS_FILES="/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-*"
  44. for f in $UTILS_FILES
  45. do
  46. source "$f"
  47. done
  48. read_config_param PROJECT_REPO
  49. # recommended RAM for virtual machines
  50. VM_MEMORY='1G'
  51. VARIANT='full'
  52. # fixed username and password when the --generic option is used
  53. GENERIC_IMAGE_USERNAME='fbone'
  54. GENERIC_IMAGE_PASSWORD='freedombone'
  55. IMAGE_TYPE='beaglebone'
  56. CURR_DIR=$(pwd)
  57. CURR_USER="$USER"
  58. TEMPBUILD_DIR=~/.tmp_${PROJECT_NAME}_build
  59. VMDEBOOTSTRAP_REPO=git://git.liw.fi/vmdebootstrap
  60. VMDEBOOTSTRAP_VERSION=0.8
  61. MAKEFILE=${PROJECT_NAME}-image-makefile
  62. IMAGE_SIZE=7.9G
  63. IMAGE_SIZE_SPECIFIED=
  64. IMAGE_NAME='full'
  65. USERNAME="$USER"
  66. PASSWORD=
  67. # IP address of the router (gateway)
  68. ROUTER_IP_ADDRESS="192.168.1.254"
  69. # The fixed IP address of the Beaglebone Black (or other SBC) on your local network
  70. BOX_IP_ADDRESS="192.168.1.55"
  71. # DNS
  72. NAMESERVER1='213.73.91.35'
  73. NAMESERVER2='85.214.20.141'
  74. NAMESERVER3='213.73.91.35'
  75. NAMESERVER4='85.214.73.63'
  76. NAMESERVER5='84.200.69.80'
  77. NAMESERVER6='84.200.70.40'
  78. # An optional freedombone configuration file
  79. CONFIG_FILENAME=
  80. DEFAULT_DOMAIN_NAME="${LOCAL_NAME}.local"
  81. # Minimum number of characters in a password
  82. MINIMUM_PASSWORD_LENGTH=$(grep 'MINIMUM_PASSWORD_LENGTH=' "/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-passwords" | head -n 1 | awk -F '=' '{print $2}')
  83. # Optional ssh public key to allow
  84. SSH_PUBKEY="no"
  85. # interactive mode
  86. INTERACTIVE="no"
  87. # Whether this is a generic image for mass redistribution on the interwebs
  88. GENERIC_IMAGE="yes"
  89. # Whether to reduce the number of decisions during interactive install
  90. MINIMAL_INSTALL="yes"
  91. # default SSH port
  92. SSH_PORT=2222
  93. # Whether sites are accessible only within a Tor browser
  94. ONION_ONLY="no"
  95. # Where to fetch packages
  96. #MIRROR='http://httpredir.debian.org/debian'
  97. MIRROR='http://ftp.de.debian.org/debian'
  98. # Whether to only install debian but nothing else
  99. DEBIAN_INSTALL_ONLY='no'
  100. # wifi settings
  101. WIFI_INTERFACE='wlan0'
  102. WIFI_SSID=
  103. WIFI_TYPE='wpa2-psk'
  104. WIFI_PASSPHRASE=
  105. WIFI_HOTSPOT='no'
  106. WIFI_NETWORKS_FILE=~/${PROJECT_NAME}-wifi.cfg
  107. # Whether to install non-free wifi drivers for the mesh client
  108. INSECURE='no'
  109. # for mesh installs whether to delete all data and generate
  110. # a new identity at every shutdown/boot
  111. AMNESIC='no'
  112. # Is this a dedicated gnusocial or postactiv instance?
  113. SOCIALINSTANCE=
  114. # Versions used for Arch/Parabola setup
  115. MBR_VERSION='1.1.11'
  116. # version of cliapp to use with parabola
  117. CLIAPP_COMMIT='cb17626e6441a5bf43a1d3f17a769f8e44ff4977'
  118. # version of mbr to use with parabola
  119. MBR_COMMIT='fb7ac88f251a1529b8aa759abc49acb2e99094b2'
  120. # defining repo variables here ensures that they will be mirrored
  121. MULTIPATH_TOOLS_REPO="https://aur.archlinux.org/multipath-tools.git"
  122. MBR_REPO="https://aur.archlinux.org/mbr.git"
  123. CLIAPP_REPO="git://git.liw.fi/cliapp"
  124. function image_setup {
  125. setup_type=$1
  126. case $setup_type in
  127. debian|ubuntu|trisquel|mint)
  128. sudo apt-get -yq remove vmdebootstrap
  129. sudo apt-get -yq install build-essential gcc-multilib g++-multilib libc6-dev
  130. sudo apt-get -yq install libc6-dev-i386
  131. sudo apt-get -yq install git python-docutils mktorrent xz-utils debootstrap
  132. sudo apt-get -yq install dosfstools btrfs-tools extlinux python-distro-info mbr
  133. sudo apt-get -yq install qemu-user-static binfmt-support u-boot-tools qemu
  134. sudo apt-get -yq install python-cliapp kpartx
  135. sudo cp /sbin/install-mbr /usr/bin/install-mbr
  136. ;;
  137. parabola|arch)
  138. sudo pacman -S --noconfirm libc++ git gcc gcc-libs python-docutils mktorrent patch
  139. sudo pacman -S --noconfirm debootstrap xz dosfstools btrfs-progs syslinux python-pip
  140. sudo pacman -S --noconfirm qemu-static binfmt-qemu-static uboot-tools qemu parted
  141. sudo pacman -S --noconfirm dpkg-devtools bin86 arch-install-scripts qemu-arch-extra
  142. sudo pacman -S --noconfirm syncthing
  143. mkdir "$USERHOME/develop"
  144. if [ -d "$USERHOME/develop/python-cliapp" ]; then
  145. sudo rm -rf "$USERHOME/develop/python-cliapp"
  146. fi
  147. if ! git_clone "$CLIAPP_REPO" "$USERHOME/develop/python-cliapp"; then
  148. echo $"Failed to clone python-cliapp"
  149. return
  150. fi
  151. if [ ! -d "$USERHOME/develop/python-cliapp" ]; then
  152. echo $"Couldn't clone python-cliapp"
  153. return
  154. fi
  155. sudo pacman -S --noconfirm python2-coverage python2-pytest-cov python2-sphinx
  156. sudo pacman -S --noconfirm autopep8 python2-pylint python2-yaml python2-xdg python2-pip
  157. cd "$USERHOME/develop/python-cliapp" || exit 7824526242
  158. git checkout $CLIAPP_COMMIT -b $CLIAPP_COMMIT
  159. sudo python2 setup.py install
  160. sudo pip2 install distro-info logging
  161. if [ -d "$USERHOME/develop/mbr" ]; then
  162. sudo rm -rf "$USERHOME/develop/mbr"
  163. fi
  164. if ! git_clone $MBR_REPO "$USERHOME/develop/mbr"; then
  165. echo $"Failed to clone mbr"
  166. return
  167. fi
  168. if [ ! -d "$USERHOME/develop/mbr" ]; then
  169. echo $"Couldn't clone mbr"
  170. return
  171. fi
  172. cd "$USERHOME/develop/mbr" || exit 2468724524
  173. git checkout $MBR_COMMIT -b $MBR_COMMIT
  174. makepkg --force --noconfirm
  175. if [ ! -f mbr-${MBR_VERSION}.tar.gz ]; then
  176. echo $"mbr tarball was not found for version ${MBR_VERSION}"
  177. return
  178. fi
  179. tar -xzvf mbr-${MBR_VERSION}.tar.gz
  180. if [ ! -d "$USERHOME/develop/mbr/mbr-${MBR_VERSION}" ]; then
  181. echo $"mbr tarball could not be extracted"
  182. return
  183. fi
  184. cd "$USERHOME/develop/mbr/mbr-${MBR_VERSION}" || exit 13584584
  185. cp ../*.patch .
  186. patch -p0 < *.patch
  187. ./configure
  188. make
  189. sudo make install
  190. if [ ! -f /usr/local/sbin/install-mbr ]; then
  191. echo $'Failed to install mbr'
  192. return
  193. fi
  194. sudo cp /usr/local/sbin/install-mbr /sbin
  195. if [ -d "$USERHOME/develop/multipath-tools" ]; then
  196. sudo rm -rf "$USERHOME/develop/multipath-tools"
  197. fi
  198. if ! git_clone "$MULTIPATH_TOOLS_REPO" "$USERHOME/develop/multipath-tools"; then
  199. echo $"Failed to clone multipath-tools"
  200. return
  201. fi
  202. if [ ! -d "$USERHOME/develop/multipath-tools" ]; then
  203. echo $"Couldn't clone multipath-tools"
  204. return
  205. fi
  206. sudo pacman -S --noconfirm device-mapper libaio liburcu fakeroot
  207. cd "$USERHOME/develop/multipath-tools" || exit 27462454
  208. makepkg --force --noconfirm
  209. makepkg -i --force --noconfirm
  210. sudo wget "https://raw.githubusercontent.com/bashrc/freedombone/master/image_build/debootstrap/scripts/${DEBIAN_VERSION}" -O /usr/share/debootstrap/scripts/debscript
  211. sudo cp -f "/usr/share/debootstrap/scripts/debscript" "/usr/share/debootstrap/scripts/${DEBIAN_VERSION}"
  212. if [ ! -f "/usr/share/debootstrap/scripts/${DEBIAN_VERSION}" ]; then
  213. echo $"No debian debootstrap script was found for $DEBIAN_VERSION"
  214. return
  215. fi
  216. debian_script_hash=$(sha256sum "/usr/share/debootstrap/scripts/${DEBIAN_VERSION}" | awk -F ' ' '{print $1}')
  217. expected_debian_script_hash='620fa84c7ef64d10349aed38fa9cc2e7f00a6fcd1bc425f33ca2b57cc946fd0c'
  218. if [[ "$debian_script_hash" != "$expected_debian_script_hash" ]]; then
  219. echo $"Invalid hash for debootstrap ${DEBIAN_VERSION} script"
  220. return
  221. fi
  222. sudo chmod +x "/usr/share/debootstrap/scripts/${DEBIAN_VERSION}"
  223. ;;
  224. *)
  225. echo $'Unkown operating system'
  226. return
  227. ;;
  228. esac
  229. echo $'Setup complete'
  230. }
  231. function mesh_router_setup_script {
  232. # create a setup script for a mesh router
  233. mesh_script_filename=$1
  234. { echo "MY_USERNAME=${USERNAME}";
  235. echo "DEFAULT_DOMAIN_NAME=${USERNAME}";
  236. echo 'SYSTEM_TYPE=mesh';
  237. echo 'INSTALLING_ON_BBB=no';
  238. echo 'USB_DRIVE=/dev/sda1';
  239. echo 'DDNS_PROVIDER=';
  240. echo 'DDNS_USERNAME=';
  241. echo 'DDNS_PASSWORD=';
  242. echo 'DEFAULT_LANGUAGE=en_GB.UTF-8';
  243. echo 'MY_EMAIL_ADDRESS=';
  244. echo 'ENABLE_BATMAN=yes';
  245. echo 'DEBIAN_REPO=';
  246. echo 'NAMESERVER1=';
  247. echo 'NAMESERVER2=';
  248. echo 'NAMESERVER3=';
  249. echo 'NAMESERVER4=';
  250. echo 'NAMESERVER5=';
  251. echo 'NAMESERVER6=';
  252. echo 'BATMAN_CELLID=any';
  253. echo 'WIFI_CHANNEL=9'; } > "$mesh_script_filename"
  254. }
  255. while [ $# -gt 1 ]
  256. do
  257. key="$1"
  258. case $key in
  259. -h|--help)
  260. show_help
  261. ;;
  262. -c|--config)
  263. shift
  264. CONFIG_FILENAME="$1"
  265. if [ ! -f "$CONFIG_FILENAME" ]; then
  266. echo $"Config file $CONFIG_FILENAME not found"
  267. exit 3
  268. fi
  269. DEFAULT_DOMAIN_NAME=$(grep 'DEFAULT_DOMAIN_NAME' "$CONFIG_FILENAME" | awk -F '=' '{print $2}')
  270. ;;
  271. -t|--target|--board)
  272. shift
  273. IMAGE_TYPE="$1"
  274. ;;
  275. -u|--user|--username)
  276. shift
  277. USERNAME="$1"
  278. ;;
  279. -p|--password)
  280. shift
  281. PASSWORD="$1"
  282. if [ ${#PASSWORD} -lt "$MINIMUM_PASSWORD_LENGTH" ]; then
  283. echo $"Your password chould contain at least ${MINIMUM_PASSWORD_LENGTH} characters"
  284. exit 3628
  285. fi
  286. ;;
  287. --sshkey|--sshpubkey|--pubkey)
  288. shift
  289. SSH_PUBKEY="$1"
  290. ;;
  291. -s|--size)
  292. shift
  293. IMAGE_SIZE="$1"
  294. IMAGE_SIZE_SPECIFIED=1
  295. ;;
  296. # Box static IP address on the LAN
  297. --ip)
  298. shift
  299. BOX_IP_ADDRESS="$1"
  300. ;;
  301. # Router IP address on the LAN
  302. --iprouter)
  303. shift
  304. ROUTER_IP_ADDRESS="$1"
  305. ;;
  306. # nameserver 1
  307. --ns1|--nameserver1)
  308. shift
  309. NAMESERVER1="$1"
  310. ;;
  311. # nameserver 2
  312. --ns2|--nameserver2)
  313. shift
  314. NAMESERVER2="$1"
  315. ;;
  316. # nameserver 3
  317. --ns3|--nameserver3)
  318. shift
  319. NAMESERVER2="$1"
  320. ;;
  321. # nameserver 4
  322. --ns4|--nameserver4)
  323. shift
  324. NAMESERVER4="$1"
  325. ;;
  326. # nameserver 5
  327. --ns5|--nameserver5)
  328. shift
  329. NAMESERVER5="$1"
  330. ;;
  331. # nameserver 6
  332. --ns6|--nameserver6)
  333. shift
  334. NAMESERVER6="$1"
  335. ;;
  336. -i|--interactive)
  337. shift
  338. INTERACTIVE="$1"
  339. ;;
  340. -g|--generic)
  341. shift
  342. GENERIC_IMAGE="$1"
  343. ;;
  344. --minimal)
  345. shift
  346. MINIMAL_INSTALL="$1"
  347. ;;
  348. --ssh|--sshport)
  349. shift
  350. SSH_PORT="$1"
  351. ;;
  352. -v|--variant)
  353. shift
  354. VARIANT="$1"
  355. ;;
  356. -o|--onion|--onion-addresses|--onion-addresses-only)
  357. shift
  358. ONION_ONLY="$1"
  359. ;;
  360. -a|--amnesic)
  361. shift
  362. AMNESIC="$1"
  363. ;;
  364. -r|--repo|--repository)
  365. shift
  366. PROJECT_REPO="$1"
  367. ;;
  368. --social|--instance)
  369. shift
  370. SOCIALINSTANCE="$1"
  371. ;;
  372. -m|--mirror)
  373. shift
  374. MIRROR="$1"
  375. ;;
  376. --debianonly|--basic)
  377. shift
  378. DEBIAN_INSTALL_ONLY="$1"
  379. ;;
  380. --interface|--if)
  381. shift
  382. WIFI_INTERFACE="$1"
  383. ;;
  384. --ssid|--essid)
  385. shift
  386. WIFI_SSID="$1"
  387. ;;
  388. --wifitype)
  389. shift
  390. WIFI_TYPE="$1"
  391. ;;
  392. --wifipass|--passphrase)
  393. shift
  394. WIFI_PASSPHRASE="$1"
  395. ;;
  396. --hotspot)
  397. shift
  398. if [[ $"$1" == $'yes' || $"$1" == $'y' ]]; then
  399. WIFI_HOTSPOT='yes'
  400. fi
  401. ;;
  402. --networks)
  403. shift
  404. WIFI_NETWORKS_FILE="$1"
  405. ;;
  406. --insecure)
  407. shift
  408. INSECURE="$1"
  409. ;;
  410. --setup)
  411. shift
  412. image_setup "$1"
  413. exit 0
  414. ;;
  415. --local|--localname)
  416. shift
  417. LOCAL_NAME="$1"
  418. ;;
  419. *)
  420. # unknown option
  421. ;;
  422. esac
  423. shift
  424. done
  425. if [[ $INTERACTIVE == "yes" || $INTERACTIVE == "y" || $INTERACTIVE == "Yes" ]]; then
  426. ${PROJECT_NAME}-config --minimal "$MINIMAL_INSTALL"
  427. if [ -f "$HOME/${PROJECT_NAME}.cfg" ]; then
  428. CONFIG_FILENAME=$HOME/${PROJECT_NAME}.cfg
  429. DEFAULT_DOMAIN_NAME=$(grep 'DEFAULT_DOMAIN_NAME' "$CONFIG_FILENAME" | awk -F '=' '{print $2}')
  430. fi
  431. fi
  432. if [[ $GENERIC_IMAGE == "yes" ]]; then
  433. USERNAME=$GENERIC_IMAGE_USERNAME
  434. PASSWORD=$GENERIC_IMAGE_PASSWORD
  435. fi
  436. if [ ! $PASSWORD ]; then
  437. # generate a random password
  438. PASSWORD=$(openssl rand -base64 32 | tr -dc A-Za-z0-9 | head -c "${MINIMUM_PASSWORD_LENGTH}")
  439. fi
  440. # Move any existing images into a build subdirectory
  441. image_types=( xz img sig vdi qcow2 )
  442. # shellcheck disable=SC2068
  443. for im in ${image_types[@]}
  444. do
  445. # shellcheck disable=SC2012,SC2086
  446. no_of_files=$(ls -afq ${CURR_DIR}/${PROJECT_NAME}*.${im} | wc -l)
  447. if (( no_of_files > 0 )); then
  448. if [ ! -d "${CURR_DIR}/build" ]; then
  449. mkdir "${CURR_DIR}/build"
  450. fi
  451. # shellcheck disable=SC2086
  452. mv -f ${CURR_DIR}/${PROJECT_NAME}*.${im} ${CURR_DIR}/build
  453. fi
  454. done
  455. # Delete anything which didn't move
  456. # shellcheck disable=SC2068
  457. for im in ${image_types[@]}
  458. do
  459. # shellcheck disable=SC2012,SC2086
  460. no_of_files=$(ls -afq ${CURR_DIR}/${PROJECT_NAME}*.${im} | wc -l)
  461. if (( no_of_files > 0 )); then
  462. rm -f "${CURR_DIR}/${PROJECT_NAME}*.${im}"
  463. fi
  464. done
  465. # Remove any existing login credentials file
  466. if [ -f "${CURR_DIR}/${PROJECT_NAME}_login_credentials.txt" ]; then
  467. rm "${CURR_DIR}/${PROJECT_NAME}_login_credentials.txt"
  468. fi
  469. if [ -d $TEMPBUILD_DIR ]; then
  470. rm -rf $TEMPBUILD_DIR
  471. fi
  472. mkdir -p $TEMPBUILD_DIR
  473. if [ -f /usr/local/bin/$MAKEFILE ]; then
  474. cp /usr/local/bin/$MAKEFILE $TEMPBUILD_DIR/Makefile
  475. else
  476. cp /usr/bin/$MAKEFILE $TEMPBUILD_DIR/Makefile
  477. fi
  478. cp -r /etc/${PROJECT_NAME}/* $TEMPBUILD_DIR
  479. rm -rf $TEMPBUILD_DIR/vendor
  480. chown -R "$CURR_USER":"$CURR_USER" $TEMPBUILD_DIR
  481. cd $TEMPBUILD_DIR || exit 24729847
  482. if [[ $MINIMAL_INSTALL == "yes" ]]; then
  483. IMAGE_NAME=$'min'
  484. fi
  485. if [[ $ONION_ONLY != "no" ]]; then
  486. IMAGE_NAME=$'onion'
  487. fi
  488. if [[ $VARIANT == 'mesh' ]]; then
  489. IMAGE_NAME=$'mesh'
  490. # typically not much disk space is needed for a mesh node
  491. if [ ! $IMAGE_SIZE_SPECIFIED ]; then
  492. IMAGE_SIZE=5G
  493. fi
  494. fi
  495. if [[ $VARIANT == 'meshclient' || $VARIANT == 'meshusb' ]]; then
  496. IMAGE_NAME=$'meshclient'
  497. if [[ $INSECURE != 'no' ]]; then
  498. IMAGE_NAME=$'meshclient-insecure'
  499. fi
  500. if [ ! $IMAGE_SIZE_SPECIFIED ]; then
  501. IMAGE_SIZE=15.0G
  502. fi
  503. fi
  504. if [[ $VARIANT == 'usb' ]]; then
  505. IMAGE_NAME=$'usb'
  506. fi
  507. # append amnesic to the image name if needed
  508. if [[ $AMNESIC != 'no' ]]; then
  509. IMAGE_NAME="${IMAGE_NAME}-amnesic"
  510. fi
  511. if [[ "$SOCIALINSTANCE" == "gnusocial" || "$SOCIALINSTANCE" == "postactiv" || "$SOCIALINSTANCE" == "pleroma" ]]; then
  512. IMAGE_NAME="${IMAGE_NAME}-${SOCIALINSTANCE}"
  513. fi
  514. cd $TEMPBUILD_DIR || exit 724245267
  515. make "$IMAGE_TYPE" \
  516. MYUSERNAME="$USERNAME" \
  517. MYPASSWORD="$PASSWORD" \
  518. ROUTER_IP_ADDRESS="$ROUTER_IP_ADDRESS" \
  519. BOX_IP_ADDRESS="$BOX_IP_ADDRESS" \
  520. NAMESERVER1="$NAMESERVER1" \
  521. NAMESERVER2="$NAMESERVER2" \
  522. NAMESERVER3="$NAMESERVER3" \
  523. NAMESERVER4="$NAMESERVER4" \
  524. NAMESERVER5="$NAMESERVER5" \
  525. NAMESERVER6="$NAMESERVER6" \
  526. PROJECT_NAME="$PROJECT_NAME" \
  527. CONFIG_FILENAME="$CONFIG_FILENAME" \
  528. IMAGE_SIZE="$IMAGE_SIZE" \
  529. SSH_PUBKEY="$SSH_PUBKEY" \
  530. GENERIC_IMAGE="$GENERIC_IMAGE" \
  531. MINIMAL_INSTALL="$MINIMAL_INSTALL" \
  532. SSH_PORT="$SSH_PORT" \
  533. ONION_ONLY="$ONION_ONLY" \
  534. IMAGE_NAME="$IMAGE_NAME" \
  535. PROJECT_REPO="$PROJECT_REPO" \
  536. MIRROR="$MIRROR" \
  537. BUILD_MIRROR="$MIRROR" \
  538. DEBIAN_INSTALL_ONLY="$DEBIAN_INSTALL_ONLY" \
  539. WIFI_INTERFACE="$WIFI_INTERFACE" \
  540. WIFI_SSID="$WIFI_SSID" \
  541. WIFI_TYPE="$WIFI_TYPE" \
  542. WIFI_PASSPHRASE="$WIFI_PASSPHRASE" \
  543. WIFI_HOTSPOT="$WIFI_HOTSPOT" \
  544. WIFI_NETWORKS_FILE="$WIFI_NETWORKS_FILE" \
  545. VARIANT="$VARIANT" \
  546. MINIMUM_PASSWORD_LENGTH="$MINIMUM_PASSWORD_LENGTH" \
  547. INSECURE="$INSECURE" \
  548. AMNESIC="$AMNESIC" \
  549. SOCIALINSTANCE="$SOCIALINSTANCE" \
  550. LOCAL_NAME="$LOCAL_NAME"
  551. # shellcheck disable=SC2181
  552. if [ ! "$?" = "0" ]; then
  553. echo $'Build failed'
  554. rm -rf $TEMPBUILD_DIR
  555. exit 1
  556. fi
  557. EXPECTED_EXTENSION='xz'
  558. if [[ $IMAGE_TYPE == "qemu"* ]]; then
  559. EXPECTED_EXTENSION='qcow2'
  560. fi
  561. shopt -s nullglob
  562. imgfiles=("build/${PROJECT_NAME}*.${EXPECTED_EXTENSION}")
  563. if [ ${#imgfiles[@]} -eq 0 ]; then
  564. echo $'Image was not created'
  565. rm -rf $TEMPBUILD_DIR
  566. exit 2
  567. fi
  568. # Move images from temporary directory to the current directory
  569. # shellcheck disable=SC2068
  570. for im in ${image_types[@]}
  571. do
  572. # shellcheck disable=SC2012,SC2086
  573. no_of_files=$(ls -afq build/${PROJECT_NAME}*.${im} | wc -l)
  574. if (( no_of_files > 0 )); then
  575. # shellcheck disable=SC2086
  576. mv build/${PROJECT_NAME}*.${im} ${CURR_DIR}/
  577. # shellcheck disable=SC2086
  578. sudo chown "${CURR_USER}":"${CURR_USER}" ${CURR_DIR}/*.${im}
  579. fi
  580. done
  581. # Remove the temporary directory
  582. rm -rf ${TEMPBUILD_DIR}
  583. cd "${CURR_DIR}" || exit 2842845284
  584. clear
  585. if [[ $VARIANT != 'meshclient' && $VARIANT != 'meshusb' && $VARIANT != 'mesh' ]]; then
  586. echo $"
  587. Image was created.
  588. You will be able to log into it with:
  589. "
  590. if [[ $IMAGE_TYPE != "qemu"* ]]; then
  591. echo $" ssh $USERNAME@$DEFAULT_DOMAIN_NAME -p $SSH_PORT
  592. Password: $PASSWORD
  593. "
  594. else
  595. if [[ $IMAGE_TYPE != "qemu"* ]]; then
  596. echo $" Username: $USERNAME
  597. Password: $PASSWORD
  598. "
  599. else
  600. if [[ $IMAGE_TYPE != "qemu-x86_64"* && $IMAGE_TYPE != "qemu-amd64"* ]]; then
  601. echo "qemu-system-i386 -m ${VM_MEMORY} $(ls ${PROJECT_NAME}*.qcow2)"
  602. else
  603. echo "qemu-system-x86_64 -m ${VM_MEMORY} $(ls ${PROJECT_NAME}*.qcow2)"
  604. fi
  605. echo $"
  606. Username: $USERNAME
  607. Password: $PASSWORD
  608. "
  609. fi
  610. fi
  611. else
  612. echo $"
  613. Image was created.
  614. "
  615. fi
  616. ls -lh ${PROJECT_NAME}*.img ${PROJECT_NAME}*.sig ${PROJECT_NAME}*.xz ${PROJECT_NAME}*.vdi ${PROJECT_NAME}*.qcow2
  617. # Remove the mesh script after use
  618. if [[ $VARIANT == "mesh"* ]]; then
  619. rm -f "$CONFIG_FILENAME"
  620. fi
  621. # record the default login credentials for later use
  622. echo $"Username: $USERNAME
  623. Password: $PASSWORD" > "${CURR_DIR}/${PROJECT_NAME}_login_credentials.txt"
  624. chmod 600 "${CURR_DIR}/${PROJECT_NAME}_login_credentials.txt"
  625. if [[ $IMAGE_TYPE != "qemu"* ]]; then
  626. echo ''
  627. if [[ $VARIANT != 'meshclient' && $VARIANT != 'meshusb' ]]; then
  628. echo $'You can copy the image to a microSD card with:'
  629. else
  630. echo $'You can copy the image to a USB drive with:'
  631. fi
  632. echo ''
  633. echo " unxz -k ${PROJECT_NAME}*.img.xz"
  634. echo ' sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8'
  635. echo " sudo dd bs=1M if=${PROJECT_NAME}*.img of=/dev/sdX conv=fdatasync"
  636. echo ''
  637. fi
  638. exit 0