# Snapshot All VM

모든 VM에 대하여 snapshot을 생성합니다.

1. 전체 VM 리스트를 출력 
    - 이름만 분리하고 오름차순으로 정렬한다.
    - "를 제거하고 VM명과 상태를 출력한다.
2. VM 전체를 Pause 한다 
    - 전체 vm 리스트에 대한 pause를 실행
    - vm명에 "ex"가 있는 경우 skip하고자 하였으나 운영 상 스냅샷을 하는 것이 좋을 것 같아 나중에 수정함
    - 단 vm명에 "ex"가 있는 경우 
        - 실행 상태 확인 
            - 실행상태 
                - 이미 pause 상태를 확인하고 pause인 경우 skip , pause가 아닌 경우 pause [pause 실행 ](http://web.joang.com:8084/books/virtualbox-script/page/virtual-machine-pause-resuming)
        - 실행 상태가 아닌 경우 
            - skip
    - vm명에 "ex"가 없는 경우 
        - 실행 상태 확인 
            - 실행상태 
                - 이미 pause 상태를 확인하고 pause인 경우 skip , pause가 아닌 경우 pause [Pause 실행 ](http://web.joang.com:8084/books/virtualbox-script/page/virtual-machine-pause-resuming)
        - 실행 상태가 아닌 경우 
            - skip
3. 스냅샷을 생성한다 
    - 스냅샷도 Pause와 공일한데 단 "ex"는 시행하지 않는다.
4. 오래된 스냅샷을 삭제한다. [Delete](http://web.joang.com:8084/books/virtualbox-script/page/virtual-machine-snapshot-delete)
    - "ex", "Test"인경우 skip
    - pause된 vm에 한정하여 삭제한다.   
        : 전체 스냅샷 중에서 FinalSnapshotDueDay이전의 스냅샷을 지우되 FinalSnapshotCnt 이하로 지우지는 않는다.
5. Pause를 풀고 Resuming한다. 
    - "ex"인 경우 : pause인 경우 재개한다. pause가 아닌 경우 실행하고 있는 걍우는 skip 그렇지 않은 경우 재개
    - "Test"인 경우 : 모두 skip
    - 그 외에는 running 경우를 제외하고 모두 재개한다.

```shell
#!/bin/bash


echo -e "\n"
echo "##############################################"
echo "############# MAKE SNAPSHOT START ! ##########" 
echo "##############################################"
export _SDATE=$(date +"%Y-%m-%d %H")
echo "START "$_SDATE

echo -e "\n##  Virtural Images list  ##" 
allVm=$(/usr/bin/VBoxManage list vms | awk '{print($1)}' | sort)
runningVm=$(/usr/bin/VBoxManage list runningvms | awk '{print($1)}' | sort -nr)

# Check Status
VmStatus(){
    vmStatus=$(/usr/bin/VBoxManage showvminfo $1 | grep -e ^State | sed s/\ \ //g )
    echo ${vmStatus}
}

# All VM Print
PrintVmList(){
        for i in $allVm
        do
                vmname=$(echo $i | sed -e "s/\"//g")
                echo " > " $vmname " , Status="  $(VmStatus $vmname)
        done
}

# Check Running
IfRunning(){
    runnable=1
    vmStatus=$(/usr/bin/VBoxManage showvminfo $1 | grep -e ^Name: -e ^State | sed s/\ \ //g | grep running | awk '{print($2)}')
    if [ -z $vmStatus ] ; then
        runnable=1
    elif [ $vmStatus = "running" ] ; then
        runnable=0
    else
        runnable=1
    fi
    echo ${runnable}
}

# Check Pause
IfPause(){
    pausevm=1
    vmStatus=$(/usr/bin/VBoxManage showvminfo $1 | grep -e ^Name: -e ^State | sed s/\ \ //g | grep paused | awk '{print($2)}')
    if [ -z $vmStatus ] ; then
        pausevm=1
    elif [ $vmStatus = "paused" ] ; then
        pausevm=0
    else
        pausevm=1
    fi
    echo ${pausevm}
}

# All VM PAUSE 
PauseVM(){
	echo -e "\n##  All Running Virtural Images Pause  ##" 
	for i in $allVm
	do
  		vmname=$(echo $i | sed -e "s/\"//g")
        ex=$(echo $vmname | awk -F'-' '{print $1}')
  		if [ "$ex" = "ex" ] ; then
            if [ $(IfRunning $vmname) = 0 ] ; then
                    if [ $(IfPause $vmname) = 0 ] ; then
                        echo " > " $vmname " is running but Already paused, Ex  Skip PAUSE START ! "
                    else
                        echo " > " $vmname " is running and not paused, Ex  PAUSE START ! "
                        ./002-snapshotVMPause.sh $vmname
                    fi
            else
                    echo " > " $vmname " is not running, Ex PAUSE Skip Pause !"
            fi
        else
            if [ $(IfRunning $vmname) = 0 ] ; then
                    if [ $(IfPause $vmname) = 0 ] ; then
                        echo " > " $vmname " Already paused, notEx  Skip PAUSE START ! "
                    else
                        echo " > " $vmname " is running and not paused, notEx PAUSE START ! "
                        ./002-snapshotVMPause.sh $vmname
                    fi
            else
                    echo " > " $vmname " is not running, notEx Skip Pause !"
            fi
        fi
	done
}

# VM Snapshot
Snapshot(){
	echo -e "\n##  Virtural Images Snapshot  ##"
        for i in $allVm
        do
            vmname=$(echo $i | sed -e "s/\"//g")
            ex=$(echo $vmname | awk -F'-' '{print $1}')
            if [ "$ex" = "ex" ] ; then
                if [ $(IfPause $vmname) = 0 ] ; then
                        echo " > " $vmname " is pause, Ex Snapshot Skip ! "
                else
                        echo " > " $vmname " is not pause, Ex Snapshot Skip !"
                fi
            else
                if [ $(IfPause $vmname) = 0 ] ; then
                    if [ "$ex" = "Test" ] ; then
                        echo " > " $vmname " is pause, notEx but it is Test VM so Snapshot Skip !"
                    else
                        echo " > " $vmname " is pause, notEx Snapshot START !"
                        ./003-snapshotVM.sh $vmname
                    fi
                else
                    echo " > " $vmname " is not pause, notEx Snapshot Skip ! "
                fi
            fi        
        done
}

# VM Delete 
Delete(){
        echo "\n##  Virtural Images Backup Snapshot Delete  ##"
        for i in $allVm
        do
                vmname=$(echo $i | sed -e "s/\"//g")
                ex=$(echo $vmname | awk -F'-' '{print $1}')
                if [ "$ex" = "ex" ] ; then
                        echo " > " $vmname " Skip Snapshot Delete !"
                else
                    if [ "$ex" = "Test" ] ; then
                        echo " > " $vmname " is disable VM so Skip Snapshot Delete !"
                    else
                        if [ $(IfPause $vmname) = 0 ] ; then
                            echo " > " $vmname " is pause, Snapshot Delete START ! "
                            ./004-snapshotiDeleteVM.sh $vmname
                        else
                            echo " > " $vmname " is not pause, notEx Skip Snapshot Delete !"
                        fi
                    fi
                fi
        done
}

# VM Resuming
Resuming(){
        echo "\n##  Virtural Images Snapshot  ##"
        for i in $allVm
        do
            vmname=$(echo $i | sed -e "s/\"//g")
            ex=$(echo $vmname | awk -F'-' '{print $1}')
            if [ "$ex" = "ex" ] ; then
                    if [ $(IfPause $vmname) = 0 ] ; then
                        echo " > " $vmname " is pause, Ex START ! "
                        ./005-snapshotResuming.sh $vmname
                    else
                        echo " > " $vmname " is not pause, Ex Check Start VM !"
                        if [ $(IfRunning $vmname) = 0 ] ; then
                            echo " > " $vmname " is running, Ex Skip Start VM !"
                        else
                            echo " > " $vmname " is not running, Ex Start VM !"
                            ./005-snapshotResuming.sh $vmname
                        fi
                    fi
             else
                    if [ "$ex" = "Test" ] ; then
                        echo " > " $vmname " is disable VM so Not Start VM !"
                    else
                        if [ $(IfPause $vmname) = 0 ] ; then
                            echo " > " $vmname " is pause, notEx Start VM !"
                            ./005-snapshotResuming.sh $vmname
                        else
                            echo " > " $vmname " is not pause, notEx Check Start VM !"
                            if [ $(IfRunning $vmname) = 0 ] ; then
                                echo " > " $vmname " is running, Ex Skip Start VM !"
                            else
                                echo " > " $vmname " is not running, Ex Start VM !"
                                ./005-snapshotResuming.sh $vmname
                            fi
                        fi                        
                        sleep 5
                    fi
            fi
        done
}






cd /home/hyunsu/BackUpCenter/20221014-snapshot/
PrintVmList
PauseVM
Snapshot
Delete
Resuming

echo -e "\n"
echo "##############################################"
echo "############# MAKE SNAPSHOT END ! ############"
echo "##############################################"
echo -e "\n"

```