freedombone-image 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. # License
  14. # =======
  15. #
  16. # Copyright (C) 2015 Bob Mottram <bob@robotics.uk.to>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. PROJECT_NAME='freedombone'
  31. IMAGE_TYPE='beaglebone'
  32. CURR_DIR=$(pwd)
  33. BUILD_DIR=~/.tmp_${PROJECT_NAME}_build
  34. VMDEBOOTSTRAP_REPO=git://git.liw.fi/vmdebootstrap
  35. VMDEBOOTSTRAP_VERSION=0.8
  36. MAKEFILE=${PROJECT_NAME}-image-makefile
  37. IMAGE_SIZE=4G
  38. USERNAME=$(echo $USER)
  39. PASSWORD=
  40. # IP address of the router (gateway)
  41. ROUTER_IP_ADDRESS="192.168.1.254"
  42. # The fixed IP address of the Beaglebone Black (or other SBC) on your local network
  43. BOX_IP_ADDRESS="192.168.1.55"
  44. # DNS
  45. NAMESERVER1='213.73.91.35'
  46. NAMESERVER2='85.214.20.141'
  47. # An optional freedombone configuration file
  48. CONFIG_FILENAME=
  49. DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
  50. # Minimum number of characters in a password
  51. MINIMUM_PASSWORD_LENGTH=10
  52. # Optional ssh public key to allow
  53. SSH_PUBKEY="no"
  54. # interactive mode
  55. INTERACTIVE="no"
  56. while [[ $# > 1 ]]
  57. do
  58. key="$1"
  59. case $key in
  60. -h|--help)
  61. show_help
  62. ;;
  63. -c|--config)
  64. shift
  65. CONFIG_FILENAME="$1"
  66. if [ ! -f $CONFIG_FILENAME ]; then
  67. echo "Config file $CONFIG_FILENAME not found"
  68. exit 3
  69. fi
  70. DEFAULT_DOMAIN_NAME=$(cat $CONFIG_FILENAME | grep 'DEFAULT_DOMAIN_NAME' | awk -F '=' '{print $2}')
  71. ;;
  72. -t|--target|--board)
  73. shift
  74. IMAGE_TYPE="$1"
  75. ;;
  76. -u|--user|--username)
  77. shift
  78. USERNAME="$1"
  79. ;;
  80. -p|--password)
  81. shift
  82. PASSWORD="$1"
  83. if [ ${#PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
  84. echo "Your password chould contain at least ${MINIMUM_PASSWORD_LENGTH} characters"
  85. exit 3628
  86. fi
  87. ;;
  88. --sshkey|--sshpubkey|--pubkey)
  89. shift
  90. SSH_PUBKEY="$1"
  91. ;;
  92. -s|--size)
  93. shift
  94. IMAGE_SIZE="$1"
  95. ;;
  96. # Box static IP address on the LAN
  97. --ip)
  98. shift
  99. BOX_IP_ADDRESS="$1"
  100. ;;
  101. # Router IP address on the LAN
  102. --iprouter)
  103. shift
  104. ROUTER_IP_ADDRESS="$1"
  105. ;;
  106. # nameserver 1
  107. --ns1|--nameserver1)
  108. shift
  109. NAMESERVER1="$1"
  110. ;;
  111. # nameserver 2
  112. --ns2|--nameserver2)
  113. shift
  114. NAMESERVER2="$1"
  115. ;;
  116. -i|--interactive)
  117. shift
  118. INTERACTIVE="$1"
  119. ;;
  120. *)
  121. # unknown option
  122. ;;
  123. esac
  124. shift
  125. done
  126. if [[ $INTERACTIVE == "yes" || $INTERACTIVE == "y" || $INTERACTIVE == "Yes" ]]; then
  127. freedombone-config
  128. if [ -f freedombone.cfg ]; then
  129. CONFIG_FILENAME=freedombone.cfg
  130. DEFAULT_DOMAIN_NAME=$(cat $CONFIG_FILENAME | grep 'DEFAULT_DOMAIN_NAME' | awk -F '=' '{print $2}')
  131. fi
  132. fi
  133. if [ ! $PASSWORD ]; then
  134. # generate a random password
  135. PASSWORD="$(openssl rand -base64 10 | cut -c1-8)"
  136. fi
  137. rm $CURR_DIR/*.img.bz2
  138. rm $CURR_DIR/*.img
  139. rm $CURR_DIR/*.sig
  140. if [ -d $BUILD_DIR ]; then
  141. rm -rf $BUILD_DIR
  142. fi
  143. mkdir -p $BUILD_DIR
  144. if [ -f /usr/local/bin/$MAKEFILE ]; then
  145. cp /usr/local/bin/$MAKEFILE $BUILD_DIR/Makefile
  146. else
  147. cp /usr/bin/$MAKEFILE $BUILD_DIR/Makefile
  148. fi
  149. cp -r /etc/${PROJECT_NAME}/* $BUILD_DIR
  150. cd $BUILD_DIR
  151. rm -rf vendor
  152. mkdir vendor
  153. if [ -d vendor/vmdebootstrap ] ; then
  154. (cd vendor/vmdebootstrap; git checkout .; git pull)
  155. else
  156. git clone $VMDEBOOTSTRAP_REPO vendor/vmdebootstrap
  157. fi
  158. cd vendor/vmdebootstrap
  159. git checkout tags/vmdebootstrap-${VMDEBOOTSTRAP_VERSION}
  160. git checkout -b tags/vmdebootstrap-${VMDEBOOTSTRAP_VERSION}
  161. for f in ../../vendor-patches/vmdebootstrap/* ; do
  162. echo applying $(basename $f)
  163. patch -p1 < $f
  164. done
  165. cd $BUILD_DIR
  166. make $IMAGE_TYPE \
  167. USERNAME="$USERNAME" \
  168. PASSWORD="$PASSWORD" \
  169. ROUTER_IP_ADDRESS="$ROUTER_IP_ADDRESS" \
  170. BOX_IP_ADDRESS="$BOX_IP_ADDRESS" \
  171. NAMESERVER1="$NAMESERVER1" \
  172. NAMESERVER2="$NAMESERVER2" \
  173. PROJECT_NAME="$PROJECT_NAME" \
  174. CONFIG_FILENAME="$CONFIG_FILENAME" \
  175. IMAGE_SIZE="$IMAGE_SIZE" \
  176. SSH_PUBKEY="$SSH_PUBKEY"
  177. shopt -s nullglob
  178. imgfiles=(build/${PROJECT_NAME}*.img)
  179. if [ ${#imgfiles[@]} -eq 0 ]; then
  180. echo 'Image was not created'
  181. rm -rf $BUILD_DIR
  182. exit 1
  183. fi
  184. mv build/${PROJECT_NAME}*.bz2 ${CURR_DIR}
  185. mv build/${PROJECT_NAME}*.img ${CURR_DIR}
  186. mv build/${PROJECT_NAME}*.sig ${CURR_DIR}
  187. rm -rf ${BUILD_DIR}
  188. cd ${CURR_DIR}
  189. if [[ $IMAGE_TYPE == "virtualbox"* ]]; then
  190. imgfiles=(${PROJECT_NAME}*.img)
  191. VBoxManage convertdd ${imgfiles[0]} ${imgfiles[0]}.vdi
  192. fi
  193. clear
  194. echo "
  195. Image was created.
  196. You will be able to log into it with:
  197. ssh $USERNAME@$DEFAULT_DOMAIN_NAME -p 2222
  198. Password: $PASSWORD
  199. "
  200. ls -lh ${PROJECT_NAME}*.img ${PROJECT_NAME}*.sig ${PROJECT_NAME}*.bz2
  201. # record the default login credentials for later use
  202. echo "Username: $USERNAME
  203. Password: $PASSWORD" > ${CURR_DIR}/${PROJECT_NAME}_login_credentials.txt
  204. chmod 600 ${CURR_DIR}/${PROJECT_NAME}_login_credentials.txt
  205. exit 0