OSDN Git Service

adds sha256 checksum verification of the downloaded DC/OS artifacts.
[metasearch/grid-chef-repo.git] / cookbooks / dcos-grid / templates / default / opt / dcos-grid / bootstrap_upgrade.sh
1 #!/usr/bin/env bash
2
3 # https://dcos.io/docs/1.8/administration/upgrading/
4 # https://dcos.io/docs/1.7/administration/upgrading/
5
6 PATH=.:/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:`dirname $0`
7
8 install_dir=<%= File.dirname(node['dcos-grid']['bootstrap']['genconf_dir']) %>
9 release_script_name=<%= node['dcos-grid']['dcos_release_script_name'] %>
10 rel_checksum='<%= node['dcos-grid']['dcos_release_checksum'] %>'
11 port=<%= node['dcos-grid']['bootstrap']['port'] %>
12
13 usage() {
14   echo 'Usage: bootstrap_upgrade.sh [-c] [-E] [-y] [-W] [-h]'
15   echo 'This script upgrades DC/OS bootstrap node.'
16   echo
17   echo "Options:"
18   echo "  -c: commit upgrade."
19   echo "  -E: don't update DC/OS release ($release_script_name)."
20   echo "  -h: this help."
21   echo "  -y: always yes."
22   echo "  -W: why-run mode."
23   echo
24 }
25
26 execute() {
27   CMD=$1
28   echo "[`date '+%Y-%m-%d %H:%M:%S %:z'`] Command: $CMD"
29   [ "$why_run" = 1 ] || eval $CMD
30 }
31
32 ARGS="$@"
33 # Validation
34 while getopts 'cEyWh' OPT; do
35   case $OPT in
36     'c' )
37       commit_flag=1
38       ;;
39     'E' )
40       preserve_same_version=1
41       ;;
42     'y' )
43       always_yes=1
44       ;;
45     'W' )
46       why_run=1
47       ;;
48     'h' )
49       usage
50       exit 0
51       ;;
52     '?' )
53       usage
54       exit 1
55       ;;
56   esac
57 done
58
59 shift $((OPTIND - 1))
60
61 sudo='sudo'
62 [ `whoami` = 'root' ] && sudo=''
63
64 confirm() {
65   while true; do
66     [ "$always_yes" = 1 ] && break
67
68     echo -n 'Continue the process? [y/N]: '
69     read answer
70     case $answer in
71       'y' | 'yes' )
72         break
73         ;;
74       '' | 'n' | 'no' )
75         echo 'Process was aborted by user.'
76         exit 0
77         ;;
78       * )
79         ;;
80     esac
81   done
82 }
83
84 restart_nginx() {
85   echo 'Restart the nginx (Docker container) ...'
86   container_id=`$sudo docker ps | grep "${port}->80/tcp" | awk '{print $1}'`
87   if [ "$container_id" != '' ]; then
88     echo "Docker container (ID: $container_id) for the bootstrap service is already running."
89     echo 'Stop the container ...'
90     execute "$sudo docker stop $container_id"
91   fi
92
93   echo 'Launching Docker container for the bootstrap service ...'
94   execute "$sudo docker run -d -p ${port}:80 -v $PWD/genconf/serve:/usr/share/nginx/html:ro nginx"
95 }
96
97 upgrade() {
98   execute "cd $install_dir"
99
100   echo 'Back up the current installation script ...'
101   execute "$sudo mv ./genconf/serve{,-`date '+%Y%m%d_%H%M%S'`}"
102
103   if [ "$preserve_same_version" = 1 ]; then
104     dcos_release_script="${install_dir}/${release_script_name}"
105     if [ -e "$dcos_release_script" ]; then
106       echo "Preserve same DC/OS release ($dcos_release_script)."
107     else
108       echo "[ERROR] Existing DC/OS release ($dcos_release_script) is not found on the local filesystem."
109       exit 1
110     fi
111   else
112     echo 'Downloading new DC/OS release ...'
113     execute "$sudo curl -O <%= node['dcos-grid']['dcos_release_url'] %>"
114     if [ "$rel_checksum" != '' ]; then
115       if [ "$(sha256sum $release_script_name | awk '{print $1}')" != $rel_checksum ]; then
116         echo '[ERROR] dcos binary file checksum mismatch.'
117         execute "$sudo rm $release_script_name"
118         exit 1
119       fi
120     fi
121   fi
122
123   echo 'Generating new DC/OS configurations ...'
124   execute "$sudo bash $release_script_name"
125
126   echo 'Back up the generated dcos_install.sh script ...'
127   execute "$sudo cp -a ./genconf/serve/dcos_install.sh{,.pkg-dist}"
128
129   echo 'Disable Docker restarts in dcos_install.sh'
130   execute "$sudo sed -i -e 's/systemctl restart systemd-journald//g' -e 's/systemctl restart docker//g' genconf/serve/dcos_install.sh"
131
132   restart_nginx
133
134   cat << EOM
135 Please execute the following command in preparation to get new node in on the cluster
136 after the cluster upgrade finished.
137   $ ${install_dir}/bootstrap_upgrade.sh -c
138 EOM
139 }
140
141 commit() {
142   echo 'Commit the upgrade ...'
143   execute "cd $install_dir"
144   if [ -e ./genconf/serve/dcos_install.sh -a -e ./genconf/serve/dcos_install.sh.pkg-dist ]; then
145     execute "$sudo mv ./genconf/serve/dcos_install{,4upgrade}.sh"
146     execute "$sudo mv ./genconf/serve/dcos_install.sh{.pkg-dist,}"
147
148     restart_nginx
149   else
150     echo '[ERROR] ./genconf/serve/dcos_install.sh or ./genconf/serve/dcos_install.sh.pkg-dist does not exist.'
151     exit 1
152   fi
153 }
154
155 # Main
156 if [ "$commit_flag" = 1 ]; then
157   echo 'This upgrade will be commited.'
158   confirm
159   commit
160 else
161   echo 'This node will be upgraded as a Bootstrap node.'
162   confirm
163   upgrade
164 fi