#! /bin/bash conf=/etc/xen/sync.conf host=$(echo $1 | cut -d : -f1) check_host(){ echo -n "Send ICMP package to host $host: " fping -a ${host} 2>&1> /dev/null if [ $? -eq 1 ]; then echo 'Failed!' exit 1 else echo 'OK' fi dir_name=$(rsync rsync://192.168.120.40/ | tail -1 | awk '{print $1}') echo } warn(){ echo $@ >&2 logger -p local0.notice -t "SYNCVMS" "$@" sleep 2 continue } sizetest(){ [ -z "$(echo $1 | grep -E 'M|G')" ] && warn "Size in line $num in $conf is not valid." echo -n "Checking VG space. " local value=$(echo $1 | sed 's/[MG]$//') local sizevar=${#value} local result=$(echo $value | sed -n "/^[0-9]\{$sizevar\}$/p") [ "$result" != "$value" ] && warn "Format in line $num in $conf is not numeric." if [ -n "$(echo $1 | grep 'G' )" ]; then echo $[ ( $(echo $value | sed -n "/^[0-9]\{$sizevar\}$/p") * 1024 ) ] else echo $(echo $value | sed -n "/^[0-9]\{$sizevar\}$/p") fi } check_host num=0 for vmd in $(cat $conf | sed '/^#/d'); do let num++ name=$(echo $vmd | cut -d: -f1) type=$(echo $vmd | cut -d: -f2) vg=$(echo $vmd | cut -d: -f3) sd1=$(echo $vmd | cut -d: -f4) sd2=$(echo $vmd | cut -d: -f5) echo -n "Preparing ${name}: " if [ -n "$name" -a -n "$vg" -a -n "$sd1" ]; then [ "$vg" = "$(vgdisplay $vg | awk '/VG Name/{print $3}')" ] || warn "VG $vg at line $num in $conf not found." sd1_size=$(sizetest $sd1) vg_free=$(vgs -o vg_free --units M --noheadings $vg | cut -d , -f 1) if [ -n "$sd2" ]; then sd2_size=$(sizetest $sd2) total_size=$[ ( $sd1_size + $sd2_size ) ] else total_size=$sd1_size fi [ $vg_free -le $total_size ] && warn "No space left on VG $vg." [ -L /dev/$vg/$name ] && warn "LV /dev/$vg/$name already exist. Remove it first." echo -n "Creating disk. " lvcreate -L ${sd1} -n${name} ${vg} > /dev/null if [ "${type}" == "pvm" ]; then echo -n "Formating disk. " mkfs.ext3 /dev/$vg/$name > /dev/null 2> /dev/null if [ -n "$sd2" ]; then [ -L /dev/${vg}/${name}-swap ] && lvremove /dev/${vg}/${name}-swap echo -n "Creating swap. " lvcreate -L ${sd2} -n${name}-swap ${vg} > /dev/null echo -n "Formating swap. " mkswap /dev/${vg}/${name}-swap > /dev/null fi [ ! -d /mnt/${name} ] && mkdir /mnt/${name} echo -n "Mounting disk. " mount /dev/${vg}/${name} /mnt/${name} echo "Running rsync, wait... " rsync -aHA rsync://${1}/${dir_name}/${name}/* /mnt/${name}/ 2> /dev/null > /dev/null if [ $? -eq 0 ]; then umount /mnt/${name}/ echo "Task completed." else echo "rysnc failed to copy $name. Found Rsync deamon on $host at port $port? See it." >&2 pkill rsync logger -p local0.notice -t "SYNCVMS" "rysnc failed to copy $name. Found Rsync deamon on $host at port $port? See it." echo "Umounting /mnt/${name}/" umount /mnt/${name}/ echo "Removing LV /dev/${vg}/${name} /dev/${vg}/${name}-swap" lvremove -f /dev/${vg}/${name} /dev/${vg}/${name}-swap > /dev/null fi elif [ "${type}" == "hvm" ]; then echo "Running rsync, wait... " rsync -aHA rsync://${1}/${dir_name}/${name}.img.gz /mnt/ 2> /dev/null > /dev/null if [ $? -eq 0 ]; then cat /mnt/${name}.img > /dev/${vg}/${name} if [ $? -eq 0 ]; then echo "Task completed." else logger -p local0.notice -t "SYNCVMS" "Erro copying ${name}.img to /dev/${vg}/${name}." fi else echo "rysnc failed to copy $name. Found Rsync deamon on $host at port $port? See it." >&2 pkill rsync logger -p local0.notice -t "SYNCVMS" "rysnc failed to copy $name. Found Rsync deamon on $host at port $port? See it." echo "Removing LV /dev/${vg}/${name} /dev/${vg}/${name}-swap" lvremove -f /dev/${vg}/${name} > /dev/null fi fi fi done