#!/bin/bash
# chkconfig:
# description:
#
#: Script Name	: rename-vdisks.sh
#: Version	: 1.2.2
#: Author	: Matthew Mattoon - http://blog.allanglesit.com
#: Date Created	: January 26, 2013
#: Date Updated	: February 20, 2013
#: Description	: Renames all OVM 3.x virtual disks to a standard naming convention. 
#: Examples	: rename-vdisks.sh -m OVMMANAGER -p PORT -u USER -v
#: 		: rename-vdisks.sh -m ovmserver.localdomain -v

usage()
{
cat << EOF
usage: $0 options

This script allows you to rename all OVM 3.x virtual disks to follow a consistent standard.

Standard:	vmname_system.img (slot 0)
		vmname_dataX.img (slot 1-x where X is the slot number)
		vmname1_vmname2_dataX.img (where a disk is shared between 2 VMs)

OPTIONS:
   -h	Show this message
   -m	OVM 3.x Manager Server (required).
   -p	OVM 3.x Manager Port (default: 10000).
   -u	OVM 3.x Manager User (default: admin).
   -d   Dry Run.  Script will make no changes, but instead provide the output of an actual run.
   -v   Verbose flag.
EOF
}

while getopts "hm:pudv" OPTION
 do
  case $OPTION in
   h) usage; exit 1;;
   m) ovmmgr=$OPTARG;;
   p) ovmport=$OPTARG;;
   u) ovmuser=$OPTARG;;
   d) dryrun=1;;
   v) verbose=1;;
   ?) usage; exit 1;;
  esac
 done

if [[ -z $ovmmgr ]]
 then
  usage
  exit 1
fi

echo ""

if [[ -z $ovmuser ]]
 then
  ovmuser=admin
  echo "Using default OVM User [ $ovmuser ]"
fi

if [[ -z $ovmport ]]
 then
  ovmport=10000
  echo "Using default OVM Port [ $ovmport ]"
fi

if [ "$dryrun" = "1" ]
 then
  echo "Using Dry Run Option"
fi

if [ "$verbose" = "1" ]
 then
  echo "Using Verbose Option"
fi

echo ""
echo ""
echo `sed -n 3p $0 | sed 's/#://'`
echo `sed -n 5p $0 | sed 's/#://'`
echo `sed -n 4p $0 | sed 's/#://'`
echo ""
echo ""

for i in `ssh -p $ovmport $ovmuser@$ovmmgr "list vmdiskmapping" | grep -v 'OVM>\|Command:\|Status:\|Time:\|Data:' | sed 's/  /:/g'`
 do
  id=`echo $i | cut -d ":" -f 3`
  echo "Examining $id  "
  read name id slot emdev vdisk vm <<<$(ssh -p $ovmport $ovmuser@$ovmmgr "show vmdiskmapping id=$id" | grep -v 'OVM>\|Command:\|Status:\|Time:\|Data:' | sed 's/Emulated Block Device/EmulatedBlockDevice/' | sed 's/Virtual Disk Id/VirtualDiskId/' | sed 's/Vm Id/VmId/' | sed 's/  //' | sed 's/ = /=/g' | sed 's/  \[/:\[/g')
   name=`echo $name | cut -d = -f 2`
   id=`echo $id | cut -d = -f 2`
   slot=`echo $slot | cut -d = -f 2`
   emdev=`echo $emdev | cut -d = -f 2`
   vdiskid=`echo $vdisk | cut -d = -f 2 | cut -d ":" -f 1`
   vdiskname=`echo $vdisk | cut -d = -f 2 | cut -d ":" -f 2 | sed 's/\[\|\]//g'` 
   vm=`echo $vm | cut -d = -f 2 | cut -d ":" -f 2 | sed 's/\[\|\]//g'`
  if [ "$slot" != "0" ]
   then
    slotname=data"$slot".img
  else
    slotname=system.img
  fi
  newvdiskname="$vm"_"$slotname"

  imginfo=( `ssh -p $ovmport $ovmuser@$ovmmgr "show virtualdisk id=$vdiskid" | grep -v 'OVM>\|Command:\|Status:\|Time:\|Data:' | sed 's/Max (GiB)/Max(GiB)/' | sed 's/Used (GiB)/Used(GiB)/' | sed 's/Repository Id/RepositoryId/' | sed 's/Vm /Vm/' | sed 's/  //' | sed 's/ = /=/g' | sed 's/  \[/:\[/g'` )
   imgname=`printf "%s\n" "${imginfo[0]}" | cut -d = -f 2`
   imgid=`printf "%s\n" "${imginfo[1]}" | cut -d = -f 2`
   imgmaxsize=`printf "%s\n" "${imginfo[2]}" | cut -d = -f 2`
   imgusedsize=`printf "%s\n" "${imginfo[3]}" | cut -d = -f 2`
   imgshareable=`printf "%s\n" "${imginfo[4]}" | cut -d = -f 2`
   imgrepoid=`printf "%s\n" "${imginfo[5]}" | cut -d = -f 2 | cut -d : -f 1`
   imgreponame=`printf "%s\n" "${imginfo[5]}" | cut -d = -f 2 | cut -d : -f 2 | sed 's/\[\|\]//g'`
  if [ "$verbose" = "1" ]
   then
    echo "  VM Name         :  $vm"
    echo "  Disk Id         :  $vdiskid"
    echo "  Disk Name       :  $vdiskname"
    echo "  Slot Number     :  $slot"
    echo "  Shareable       :  $imgshareable"
  fi
  if [ -n "$vdiskid" -o  "$vdiskid" != *".iso" ]
   then
    if [ "$imgshareable" = "Yes"  ]
     then
      for item in `printf "%s\n" "${imginfo[@]}" | grep Vm | cut -d : -f 2 | sed 's/\[\|\]//g'`
       do
       shareddiskvmnames+="$item"_
       done
      newvdiskname="${shareddiskvmnames}${slotname}"
      unset shareddiskvmnames
    fi
    if [ "$vdiskname" == "EMPTY_CDROM" ]
     then
      echo "EMPTY CDROM Detected.  Rename not Required."
      echo ""
    elif [ "$vdiskname" != "$newvdiskname" ]
     then
      if [ "$verbose" = "1" ]
       then
        echo "  Disk Name       :  $vdiskname"
        echo "  New Disk Name   :  $newvdiskname"
      fi
      echo "Renaming [ $vdiskname ] to follow Standard [ $newvdiskname ]  "
      if [ "$dryrun" = "1" ]
       then
        echo ""
      else
        ssh -p $ovmport $ovmuser@$ovmmgr "edit virtualdisk id=$vdiskid name=$newvdiskname" | grep "Status:"
      fi
      echo ""
    else
      echo "Name [ $vdiskname ] follows Standard [ $newvdiskname ]"
      echo ""
    fi 
  else
    echo "Virtual CDROM Detected.  Rename not Required."
    echo ""
  fi
 done
