You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

327 lines
8.5 KiB

  1. #!/bin/bash
  2. set -eux
  3. ## 0k git remote path
  4. GIT_0K_BASE=${GIT_0K_BASE:-"0k-ro:/var/git"}
  5. ## 0k git remote options
  6. GIT_0K_CLONE_OPTIONS=${GIT_0K_CLONE_OPTIONS:-""}
  7. ##
  8. ## Install 0k-manage
  9. ##
  10. mkdir -p /opt/apps
  11. (
  12. if [ -d "/opt/apps/0k-manage" ]; then
  13. cd /opt/apps/0k-manage &&
  14. git pull -r
  15. else
  16. cd /opt/apps &&
  17. git clone $GIT_0K_CLONE_OPTIONS "$GIT_0K_BASE/0k/0k-manage.git" &&
  18. cd /opt/apps/0k-manage &&
  19. git checkout 0k/prod/master
  20. fi
  21. pip install sact.epoch || exit 1
  22. if [ "$(python -c 'import sact.epoch' 2>&1 | tail -n 1)" == "ImportError: No module named interface" ]; then
  23. echo "Error: conflicting installation of zope.interface detected. Trying workaround."
  24. (
  25. cd /usr/local/lib/python2.7/dist-packages
  26. mv zope zope-bad
  27. ) &&
  28. pip install zope.interface --upgrade &&
  29. pip install zope.component --upgrade
  30. if [ "$(python -c 'import sact.epoch' 2>&1 | tail -n 1)" == "" ]; then
  31. echo "Workaround worked."
  32. else
  33. echo "Failed work around."
  34. exit 1
  35. fi
  36. fi
  37. # ln -sf /opt/apps/0k-manage/src/bin/* /usr/local/bin/
  38. )
  39. ##
  40. ## Install 0k-charm
  41. ##
  42. (
  43. apt-get install -y kal-shlib-charm kal-shlib-cache kal-shlib-cmdline </dev/null
  44. if [ -d "/opt/apps/0k-charm" ]; then
  45. cd /opt/apps/0k-charm &&
  46. git checkout master &&
  47. git pull -r
  48. else
  49. cd /opt/apps &&
  50. git clone $GIT_0K_CLONE_OPTIONS "$GIT_0K_BASE/0k/0k-charm.git"
  51. fi
  52. ln -sfn /opt/apps/0k-charm/bin/charm /usr/local/sbin/
  53. )
  54. ##
  55. ## Install 0k-charms
  56. ##
  57. (
  58. if [ -d "/opt/apps/0k-charms" ]; then
  59. cd /opt/apps/0k-charms &&
  60. git checkout master &&
  61. git pull -r
  62. else
  63. cd /opt/apps &&
  64. git clone $GIT_0K_CLONE_OPTIONS "$GIT_0K_BASE/0k/0k-charms.git"
  65. fi
  66. if ! [ -d "/srv/charm-store" ]; then
  67. mkdir -p /srv/charm-store
  68. fi
  69. ln -sfn /opt/apps/0k-charms /srv/charm-store/0k-charms
  70. )
  71. ##
  72. ## Install lxc-scripts
  73. ##
  74. (
  75. if ! [ -d "/opt/apps/lxc-scripts" ]; then
  76. cd /opt/apps &&
  77. git clone $GIT_0K_CLONE_OPTIONS "$GIT_0K_BASE/0k/lxc-scripts.git"
  78. fi
  79. cd /opt/apps/lxc-scripts &&
  80. git checkout master &&
  81. git pull -r &&
  82. ln -sfn /opt/apps/lxc-scripts/bin/lxc-* /usr/local/sbin/ &&
  83. if [ -f /etc/default/lxc ]; then
  84. if [ -f /etc/default/lxc.pre-install ]; then
  85. cp /etc/default/lxc.pre-install /etc/default/lxc
  86. else
  87. cp /etc/default/lxc /etc/default/lxc.pre-install
  88. fi
  89. [ -d /usr/lib/lxc/templates ] && {
  90. ln -sfn /opt/apps/lxc-scripts/usr/lib/lxc/templates/lxc-0k-ubuntu-cloud /usr/lib/lxc/templates/
  91. echo TEMPLATE_PATH=/usr/lib/lxc/templates >> /etc/default/lxc
  92. }
  93. [ -d /usr/share/lxc/templates ] && {
  94. ln -sfn /opt/apps/lxc-scripts/usr/lib/lxc/templates/lxc-0k-ubuntu-cloud /usr/share/lxc/templates
  95. echo TEMPLATE_PATH=/usr/share/lxc/templates >> /etc/default/lxc
  96. }
  97. fi
  98. )
  99. ##
  100. ## Install 0k-docker
  101. ##
  102. (
  103. if [ -d "/opt/apps/0k-docker" ]; then
  104. cd /opt/apps/0k-docker &&
  105. git checkout master &&
  106. git pull -r
  107. else
  108. cd /opt/apps &&
  109. git clone $GIT_0K_CLONE_OPTIONS "$GIT_0K_BASE/0k/0k-docker"
  110. fi
  111. ln -sfn /opt/apps/0k-docker/bin/* /usr/local/sbin/
  112. ln -sfn /opt/apps/0k-docker/bin/docker-clean /etc/cron.daily/docker-clean
  113. ## in update, will remove broken links to binaries that were removed
  114. find -L /usr/local/sbin -maxdepth 1 -type l -delete
  115. )
  116. ##
  117. ## Install 0k.io certificate authority
  118. ##
  119. ## Note that docker should be installed after (or be restarted).
  120. apt-get install -y curl </dev/null
  121. ## This does not seem to work anymore (docker v1.12, ubutnu 14.04 on gani)
  122. echo "Fetching 0k.io CA certificate..."
  123. curl http://docker.0k.io/get/ca.0k.io.pem > /etc/ssl/ca.0k.io.pem
  124. cat /etc/ssl/ca.0k.io.pem >> /etc/ssl/certs/ca-certificates.crt
  125. ## This is the new way: https://docs.docker.com/engine/security/certificates/
  126. mkdir -p /etc/docker/certs.d/docker.0k.io
  127. ln -sfn /etc/ssl/ca.0k.io.pem /etc/docker/certs.d/docker.0k.io/ca.crt
  128. service docker restart
  129. echo "Login into our server."
  130. docker login -u vm -p iamavm https://docker.0k.io
  131. sed -ri 's/^#(net\.ipv4\.ip_forward=1)$/\1/g' /etc/sysctl.conf
  132. sysctl -w net.ipv4.ip_forward=1
  133. ##
  134. ## docker-compose
  135. ##
  136. if type -p docker-compose >/dev/null; then
  137. #echo "Found docker-compose..." >&2
  138. if ! CURRENT_VERSION_TEXT="$(docker-compose --version 2>/dev/null)"; then
  139. echo "'docker-compose' failed ! Please check your docker-compose binary."
  140. echo "Failed install."
  141. docker-compose --version
  142. exit 1
  143. fi
  144. VALID_VERSION_TEXT="docker-compose version 1.21.2, build "
  145. if ! [[ "$CURRENT_VERSION_TEXT" == "$VALID_VERSION_TEXT"* ]]; then
  146. echo "Invalid version of docker-compose: we need exactly:"
  147. echo "version text: $VALID_VERSION_TEXT"
  148. echo "current version: $CURRENT_VERSION_TEXT"
  149. echo "Failed install."
  150. exit 1
  151. fi
  152. else
  153. if ! [ -d /opt/apps/docker-compose ]; then
  154. (
  155. mkdir -p /opt/apps
  156. cd /opt/apps
  157. git clone https://github.com/docker/compose.git docker-compose &&
  158. cd docker-compose &&
  159. git checkout 0898c783ad2e0d01bd55b47fcb9eb7183edc1015 ## version pinning
  160. )
  161. fi
  162. mkdir -p /opt/venv
  163. if ! type -p virtualenv >/dev/null; then
  164. pip install virtualenv==13.1.2
  165. fi
  166. if ! [ -d /opt/venv/docker-compose ]; then
  167. virtualenv /opt/venv/docker-compose/
  168. fi
  169. set +eux
  170. . /opt/venv/docker-compose/bin/activate
  171. set -eux
  172. ## XXXvlab: docker version 3.5.0 is bugged on its requirement list:
  173. ## error: Setup script exited with error in docker setup command: 'tests_require' must be a string or list of strings containing valid project/version requirement specifiers; Expected ',' or end-of-list in pytest==2.9.1; python_version == '3.3' at ; python_version == '3.3'
  174. pip install $(cat <<EOF
  175. backports.ssl-match-hostname==3.5.0.1
  176. cached-property==1.4.3
  177. certifi==2018.4.16
  178. chardet==3.0.4
  179. docker==3.4.1
  180. docker-compose==1.21.2
  181. docker-pycreds==0.3.0
  182. dockerpty==0.4.1
  183. docopt==0.6.2
  184. enum34==1.1.6
  185. functools32==3.2.3.post2
  186. idna==2.5
  187. ipaddress==1.0.22
  188. jsonschema==2.6.0
  189. python-dateutil==2.7.3
  190. pytz==2018.5
  191. PyYAML==3.13
  192. requests==2.17.3
  193. sact.epoch==1.3.0
  194. shyaml==0.5.2
  195. six==1.11.0
  196. texttable==0.9.1
  197. urllib3==1.21.1
  198. websocket-client==0.48.0
  199. wheel==0.24.0
  200. zope.component==4.4.1
  201. zope.event==4.3.0
  202. zope.interface==4.5.0
  203. EOF
  204. )
  205. ( cd /opt/apps/docker-compose &&
  206. python setup.py install )
  207. if ! pip freeze | grep "^requests==2.17.3\$" >/dev/null 2>&1; then
  208. pip install requests==2.17.3 --upgrade
  209. fi
  210. deactivate
  211. mkdir -p /etc/compose
  212. if ! grep "^. /opt/venv/docker-compose/bin/activate$" /etc/compose/local.conf >/dev/null 2>&1; then
  213. cat <<EOF >> /etc/compose/local.conf
  214. . /opt/venv/docker-compose/bin/activate
  215. EOF
  216. fi
  217. fi
  218. ##
  219. ## Installation of compose
  220. ##
  221. apt-get install kal-shlib-common kal-shlib-pretty kal-shlib-charm kal-shlib-array -y --force-yes </dev/null
  222. if [ -d "/opt/apps/0k-compose" ]; then
  223. cd "/opt/apps/0k-compose" &&
  224. git pull -r
  225. else
  226. mkdir -p /opt/apps && cd /opt/apps
  227. git clone "$GIT_0K_BASE"/0k/0k-compose.git
  228. fi
  229. [ -e /usr/local/bin/compose ] || ln -sfv /opt/apps/0k-compose/bin/compose /usr/local/bin/
  230. rm -rf /var/cache/compose
  231. cat <<EOF > /etc/default/datastore
  232. DATASTORE=/srv/datastore
  233. SNAPSHOT_BACKUP=/var/backups/snapshot
  234. EOF
  235. cat <<EOF > /etc/default/compose
  236. ## if not provided, this will be the default service launched.
  237. export DEFAULT_SERVICES=""
  238. export DEFAULT_PROJECT_NAME=$(hostname | cut -f 2 -d . )
  239. export DOCKER_DATASTORE=\$([ -e /etc/default/datastore ] && . /etc/default/datastore && echo \$DATASTORE)
  240. export DATASTORE=\$DOCKER_DATASTORE/data
  241. export CONFIGSTORE=\$DOCKER_DATASTORE/config
  242. EOF
  243. if ! egrep "^DEFAULT_COMPOSE_FILE=/etc/compose/compose.yml$" /etc/compose/local.conf >/dev/null 2>&1; then
  244. echo "DEFAULT_COMPOSE_FILE=/etc/compose/compose.yml" >> /etc/compose/local.conf
  245. fi
  246. ##
  247. ## Install pgm
  248. ##
  249. (
  250. if [ -d "/opt/apps/0k-pgm" ]; then
  251. cd /opt/apps/0k-pgm &&
  252. git pull -r
  253. else
  254. cd /opt/apps &&
  255. git clone $GIT_0K_CLONE_OPTIONS "$GIT_0K_BASE/0k/0k-pgm.git" &&
  256. cd /opt/apps/0k-pgm &&
  257. git checkout master
  258. fi
  259. ln -sf /opt/apps/0k-pgm/bin/* /usr/local/bin/
  260. apt-get install -y --force-yes pv buffer < /dev/null
  261. apt-get install -y postgresql-client </dev/null
  262. )