| #!/bin/bash |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| #set -x |
| |
| usage() { |
| printf "Usage: %s [vhd file in secondary storage] [template directory in secondary storage] \n" $(basename $0) |
| } |
| |
| cleanup() |
| { |
| if [ ! -z $snapshotdir ]; then |
| umount $snapshotdir |
| if [ $? -eq 0 ]; then |
| rmdir $snapshotdir |
| fi |
| fi |
| if [ ! -z $templatedir ]; then |
| umount $templatedir |
| if [ $? -eq 0 ]; then |
| rmdir $templatedir |
| fi |
| fi |
| } |
| |
| if [ -z $1 ]; then |
| usage |
| echo "2#no vhd file path" |
| exit 0 |
| else |
| snapshoturl=${1%/*} |
| vhdfilename=${1##*/} |
| fi |
| |
| if [ -z $2 ]; then |
| usage |
| echo "3#no template path" |
| exit 0 |
| else |
| templateurl=$2 |
| fi |
| |
| snapshotdir=/var/run/cloud_mount/$(uuidgen -r) |
| mkdir -p $snapshotdir |
| if [ $? -ne 0 ]; then |
| echo "4#can't make dir $snapshotdir" |
| exit 0 |
| fi |
| |
| mount -o tcp $snapshoturl $snapshotdir |
| if [ $? -ne 0 ]; then |
| rmdir $snapshotdir |
| echo "5#can not mount $snapshoturl to $snapshotdir" |
| exit 0 |
| fi |
| |
| templatedir=/var/run/cloud_mount/$(uuidgen -r) |
| mkdir -p $templatedir |
| if [ $? -ne 0 ]; then |
| templatedir="" |
| cleanup |
| echo "6#can't make dir $templatedir" |
| exit 0 |
| fi |
| |
| mount -o tcp $templateurl $templatedir |
| if [ $? -ne 0 ]; then |
| rmdir $templatedir |
| templatedir="" |
| cleanup |
| echo "7#can not mount $templateurl to $templatedir" |
| exit 0 |
| fi |
| |
| VHDUTIL="/opt/cloud/bin/vhd-util" |
| |
| upgradeSnapshot() |
| { |
| local ssvhd=$1 |
| local parent=`$VHDUTIL query -p -n $ssvhd` |
| if [ $? -ne 0 ]; then |
| echo "30#failed to query $ssvhd" |
| cleanup |
| exit 0 |
| fi |
| if [ "${parent##*vhd has}" = " no parent" ]; then |
| dd if=$templatevhd of=$snapshotdir/$templatefilename bs=2M |
| if [ $? -ne 0 ]; then |
| echo "31#failed to dd $templatevhd to $snapshotdir/$templatefilenamed" |
| cleanup |
| exit 0 |
| fi |
| |
| $VHDUTIL modify -p $snapshotdir/$templatefilename -n $ssvhd |
| if [ $? -ne 0 ]; then |
| echo "32#failed to set parent of $ssvhd to $snapshotdir/$templatefilenamed" |
| cleanup |
| exit 0 |
| fi |
| |
| rm -f $parent |
| else |
| upgradeSnapshot $parent |
| fi |
| } |
| |
| templatevhd=$(ls $templatedir/*.vhd) |
| if [ $? -ne 0 ]; then |
| echo "8#template vhd doesn't exist for $templateurl" |
| cleanup |
| exit 0 |
| fi |
| templatefilename=${templatevhd##*/} |
| snapshotvhd=$snapshotdir/$vhdfilename |
| upgradeSnapshot $snapshotvhd |
| cleanup |
| echo "0#success" |
| exit 0 |