Administração de VirtualBox com ShellScript

Publicado por Ricardo Lino Olonca (última atualização em 25/08/2012)

[ Hits: 6.673 ]

Homepage: ricardoolonca.blogspot.com.br

Download vm.sh




Administração de máquina virtuais através de Shell Script usando Dialog. Inclui criação, manutenção, importação e exportação de máquinas virtuais; criação, manutenção e importação de discos e dvd virtuais; administração de snapshot; administração de até quatro interfaces de rede, número de cpus, quantidade de memória ram e de video, entre outros. Possui uma interface de menus.

Esse script foi feito para demonstrar como um script bash combinado com Dailog pode ser muito útil e conter uma aparência bem amigável.

  



Esconder código-fonte

#!/bin/bash
# Administra um servidor VirtualBox através da linha de comando
# Feito por Ricardo Lino Olonca em 22/08/2012
# Versao 0

# Checa se todas as dependências estão satisfeitas
function depend(){
  erro=0
  which dialog 2>/dev/null >/dev/null
  if [ $? -ne 0 ]
  then
    echo O programa dialog não está instalado.
    echo 'Tente instalar o pacote dialog através do gerenciador de pacotes da tua distribuição Linux.'
    return 1
  else 
    which VBoxManage 2>/dev/null >/dev/null
    if [ $? -ne 0 ]
    then
   dialog \
     --title 'Falta de dependência' \
     --msgbox 'O programa VBoxManager não está instalado.\nTente instalar o pacote virtualbox-ose através do gerenciador de pacotes da tua distribuição Linux.'\
     6 40
   return 2
    else
   if [ ! -e /dev/vboxdrv ]
   then
     dialog \
       --title 'Falta de dependência' \
       --msgbox 'Está faltando o módulo do kernel para o VirtualBox.\nTente instalar o pacote virtualbox-ose-dkms através do gerenciador de pacotes da tua distribuição Linux.'\
       6 40
     return 3
   fi
    fi
  fi
}

# Lista as máquinas virtuais
function listarvm(){
  echo 'dialog --stdout \' > $$.listar.tmp
  echo '--title "Listagem das máquina virtuais" \' >> $$.listar.tmp
  echo '--menu "Escolha a máquina virtual:" \' >> $$.listar.tmp
  echo '0 0 0 \' >> $$.listar.tmp
  rodando=$(VBoxManage list runningvms | grep ^\" | cut -d"\"" -f2)
  for i in `VBoxManage list vms | grep ^\" | cut -d"\"" -f2`
  do
    echo $rodando | grep $i > /dev/null
    if [ $? == 0 ]
    then
   echo "$i" "Executando..." \\ >> $$.listar.tmp
    else
   echo "$i" "Desligada" \\ >> $$.listar.tmp
    fi
  done
  chmod +x $$.listar.tmp >> /dev/null
}

# Configura o acesso via vnc na máquina virtual que sobe em segundo plano
function segundo_plano(){
  while true
  do
    porta=$( dialog --stdout \
   --inputbox 'Porta de conexão remota ("0" para desabilitar o recurso):' 0 0 5900 )
    if [ -z $porta ]
    then
     break
    elif [ $porta -eq 0 ]
    then
     VBoxHeadless -s $1 >> /dev/null 2>>/dev/null &
     break
    elif [ $porta -gt 1023 ] && [ $porta -lt 65536 ]
    then
   netstat -na | grep 0.0.0.0:$porta >> /dev/null
   if [ $? -eq 0 ]
   then
   dialog \
     --title 'Porta em uso' \
     --msgbox 'A porta está em uso. Escolha outra porta.'\
     6 40
   else
     senha=$(dialog --stdout \
       --title 'Senha de acesso' \
       --passwordbox 'Digite a senha de acesso (deixe em branco ou cancele se não quiser senha):'  \
       0 0 )
     if [ -z $senha ]
     then
       VBoxHeadless -s $1 -n -m $porta >> /dev/null 2>>/dev/null &
     else
       VBoxHeadless -s $1 -n -m $porta -o $senha >> /dev/null 2>>/dev/null &
     fi
     break
   fi
    else
   dialog \
     --title 'Porta inválida' \
     --msgbox 'A porta deve ser um número entre 1024 e 65535.'\
     6 40
    fi
  done
}

# Para, pausa e desliga a máquina virtual
function parar(){
  while true
  do
    case "$2" in
   "running") 
     parar=$( dialog --stdout \
      --title "Administração da máquina $1" \
      --menu "Opções: " \
      0 0 0 \
      Pausa 'Congela a VM' \
      Reset 'Reinicia a VM "a força"' \
      Desligar 'Desliga a VM "a força"' \
      Salvar 'Faz a VM hibernar' \
      Acpi 'Tenta desligar a VM de modo seguro')
     case $parar in
       "Pausa")
      VBoxManage controlvm $1 pause >> /dev/null
      sleep 3
      return
      ;;
       "Reset")
      VBoxManage controlvm $1 reset >> /dev/null
      return
      ;;
       "Desligar")
      VBoxManage controlvm $1 poweroff >> /dev/null
      sleep 3
      return
      ;;
       "Salvar")
      VBoxManage controlvm $1 savestate >> /dev/null 2 >>/dev/null
      sleep 3
      return
      ;;
       "Acpi")
      VBoxManage controlvm $1 acpipowerbutton >> /dev/null 2 >>/dev/null
      dialog \
        --sleep 5 \
        --title "Aguarde a VM $1 desligar" \
        --infobox 'Dependendo a máquina, isso pode demorar um pouco...' \
        0 0
      return
      ;;
       *)
      return
      ;;
     esac
     ;;
   "paused" | "stopping")
     parar=$( dialog --stdout \
      --title "Administração da máquina $1" \
      --menu "Opções: " \
      0 0 0 \
      Continuar 'Continuar a VM' \
      Desligar 'Desliga a VM "a força"')
     case $parar in
       "Continuar")
      VBoxManage controlvm $1 resume >> /dev/null
      sleep 3
      return
      ;;
       "Desligar")
      VBoxManage controlvm $1 poweroff >> /dev/null
      sleep 3
      return
      ;;
       *)
      return
      ;;
     esac
     ;;
   "powered" | "saved" | "aborted")
     parar=$( dialog --stdout \
         --title "Administração da máquina $1" \
      --menu "Opções: " \
      0 0 0 \
      Backgroud "Iniciar a VM $1 em segundo plano" \
      Gui "Inicia a VM $1 em uma janela normal" \
      Sdl "Iniciar a VM $1 em uma janela minimalista" )
     case $parar in
       "Backgroud")
      segundo_plano $1
      sleep 3
      ;;
       "Gui")
      VBoxManage startvm $1 --type gui >>/dev/null 2>>/dev/null &
      sleep 3
      return
      ;;
       "Sdl")
      VBoxManage startvm $1 --type sdl >>/dev/null 2>>/dev/null  &
      sleep 3
      return
      ;;
       *)
      return
      ;;
     esac
     ;;
   *)
     break
     ;;
   esac
  done
}

# Exporta uma máquina virtual
function exportarvm(){
  while true
  do
    arquivo=$(dialog --stdout \
   --title 'Escolha o nome do arquivo (sem a extensão)' \
   --inputbox 'Nome:' 0 0 "vm_exportada" ) 
    if [ -z $arquivo ]
    then
   break
    elif [ -f $arquivo.ovf ]
   then
     dialog \
     --title 'Arquivo existe' \
     --msgbox "O arquivo $arquivo já existe." \
     6 40
    else
   touch $$.out
   echo 'VBoxManage export ' $1 '-o ' $arquivo.ovf '> '$$.out > $$.export.tmp
   echo "rm $$.out" >> $$.export.tmp
   bash $$.export.tmp &
   sleep 3
   while true
   do
     if [ -f $$.out ]
     then
       dialog  \
      --title 'Exportanto a vm'  \
      --sleep 1 \
      --infobox `tail -1 $$.out | grep ^0` \
      0 0
     else
       break
       rm $$.export.sh
     fi
   done
    fi
  done
}

# Cria um snapshot da máquina virtual
function criarsnapshot(){
  nome=$(dialog --stdout \
    --title 'Escolha o nome do snapshot' \
    --inputbox 'Nome:' 0 0 "Snapshot1" )
  if [ -z $nome ]
  then
    echo > /dev/null
  else
    grep ^Snapshot $$.detalhes.tmp | grep $nome
    if [ $? -eq 0 ]
    then
   dialog \
     --title 'Snapshot já existe' \
     --msgbox 'Já existe um snapshot com esse nome' \
     16 40
    else
   VBoxManage snapshot $1 take $nome
   if [ $? -ne 0 ]
   then
     dialog \
       --title 'Erro!' \
       --msgbox 'Houve um erro na criação do snapshot' \
       16 40
   fi
    fi
  fi
  break
}

# Administração de snapshot
function snapshot(){
  while true
  do
    echo 'dialog --stdout \' > $$.snap.tmp
    echo '--title "Snapshot" \' >> $$.snap.tmp
    echo '--menu "Escolha a ação" \' >> $$.snap.tmp
    echo '0 0 0 \' >> $$.snap.tmp
    for i in $snap
    do
   echo $i Snapshot \\ >> $$.snap.tmp
    done
    echo 'Novo "Criar um novo snapshot"' >> $$.snap.tmp
    chmod +x $$.snap.tmp
    opcao=$(./$$.snap.tmp)
    if [ -z $opcao ]
    then
   break
    elif [ $opcao == "Novo" ]
    then
   criarsnapshot $1
    else
   manutsnapshot=$( dialog --stdout \
     --title "Administração do snapshot $opcao" \
     --menu "Opções: " \
     0 0 0 \
     Apagar 'Apagar este snapshot' \
     Restaurar 'Restaurar este snapshot')
   case $manutsnapshot in 
     "Apagar")
       if [ "${valor[5]}" = "powered" ]
       then
      VBoxManage snapshot $1 delete $opcao 2>/dev/null >/dev/null
       else
      dialog \
        --title 'Desligue o servidor' \
        --msgbox 'É necessário desligar o servidor virtual antes de apagar o snapshot' \
        10 40   
       fi
       break
       ;;
     "Restaurar")
       if [ "${valor[5]}" = "powered" ]
       then
      VBoxManage snapshot $1 restore $opcao 2>/dev/null >/dev/null
       else
      dialog \
        --title 'Desligue o servidor' \
        --msgbox 'É necessário desligar o servidor virtual antes de efetuar o restore do snapshot' \
        10 40   
       fi
       ;;
     *)
       break
      ;;
   esac
    fi
  done
}

# Escolhendo a interface que fará bridge
function lanbridged(){
  echo 'dialog --stdout \' > $$.lanbridged.tmp
  echo '--title "Lan real ' "$1" '" \' >> $$.lanbridged.tmp
  echo '--menu "Escolha a interface de rede real:" \' >> $$.lanbridged.tmp
  echo '0 0 0 \' >> $$.lanbridged.tmp
  for i in `ifconfig -a | grep Link\ encap | awk '{print $1}'`
  do
    ip=`ifconfig $i | grep Bcast | awk '{print $4}' | cut -d":" -f2`
    if [ -z $ip ]
    then
   echo 
    else
   echo $i `ifconfig $i | grep Bcast | awk '{print $4}' | cut -d":" -f2` ' \'>> $$.lanbridged.tmp
    fi   
  done
  chmod +x $$.lanbridged.tmp
  lanreal=$( ./$$.lanbridged.tmp )
# if [ -z $lanreal ]
#  then
    echo $lanreal
#  else
#    VBoxManage modifyvm $1 --nic$lan bridged --bridgeadapter$2 $lanreal >> /dev/null 2>>/dev/null
#  fi
}

# Configuração do cd na máquina virtual
function confcddvd(){
  listarcddvd
  echo Nenhum \'Retirar o Cd/Dvd\' '\' >> $$.cdv.tmp
  cdv=$( ./$$.cdv.tmp )
  if [ -z $cdv ]
  then
    break
  elif [ $cdv == "Nenhum" ]
  then
    VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium emptydrive > /dev/null 2>/dev/null
  elif [ $cdv == "Cd_local" ]
  then
    VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium host:/dev/cdrom > /dev/null 2>/dev/null
  elif [ $cdv == "Novo" ]
  then
    importarcddvd
    if [ -n $arquivo ]
    then
   VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium $arquivo > /dev/null 2>/dev/null
    fi
  else
    caminho=`VBoxManage list dvds | grep $cdv | awk '{print $2}'`
    VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium $caminho > /dev/null 2>/dev/null
  fi
}

# Configuração da rede
function confrede(){
  rede=$( dialog --stdout \
    --title "Tipo de rede" \
    --menu "Defina o tipo de rede. (Você não pode adicionar ou retirar interfaces com a máquina ligada)." \
    0 0 0 \
    Nat 'A vm acessa tudo, mas ninguém acessa ela' \
    Bridged 'A vm terá um ip da vlan real' \
    Interna 'Rede apenas internamente, sem comunicação com a rede real' \
    Hostonly 'A vm será acessada via roteamento para a interface virtual vboxnet0' \
    None 'Cabo de rede desconectado' \
    Ajuda 'Ajuda sobre as opções acima' )
}

# Tela de ajuda na configuração de rede
function ajudarede(){
  echo 'Com Nat, a máquina virtual vai funcionar como uma aplicação na máquina real. Ela conseguirá acessar todo o mundo' > $$.ajuda.tmp
  echo 'externo com o ip da máquina real. Porém ninguém conseguirá acessá-la.' >> $$.ajuda.tmp
  echo "" >> $$.ajuda.tmp
  echo 'Com Bridged, a máquina virtual vai ganhar um ip da rede local, acessará o mundo externo por esse ip, e todo' >> $$.ajuda.tmp
  echo 'poderão de conectar nela através desse endereço. Em outras palavras, ela será vista como uma máquina normal da' >> $$.ajuda.tmp
  echo 'rede local. Você terá que escolher em qual placa de rede real a máquina virtual estará pendurada.' >> $$.ajuda.tmp
  echo "" >> $$.ajuda.tmp
  echo 'Com Interna, a máquina virtual terá acesso apenas a uma rede virtual que funciona apenas internamente na máquina' >> $$.ajuda.tmp
  echo 'real. Ela poderá se comunicar com outras máquina virtuais que também tenham acesso a essa rede virtual.' >> $$.ajuda.tmp
  echo "" >> $$.ajuda.tmp
  echo 'Com Hostonly, a máquina ganhará um ip na rede virtual 192.168.56.0/24. A máquina real tem uma interface virtual' >> $$.ajuda.tmp
  echo 'com ip 192.168.56.1, que deverá ser o gateway padrão da máquina virtual. Em outras palavras, a máquina real' >> $$.ajuda.tmp
  echo 'atuará como um roteador, sendo necessário regras de firewall e/ou nat para que a máquina virtual possa' >> $$.ajuda.tmp
  echo 'comunicar com a rede real. As máquinas da rede real poderão se conectar a essa máquina virtual configurando' >> $$.ajuda.tmp
  echo 'rotas específicas, ou através de nat.' >> $$.ajuda.tmp
  echo "" >> $$.ajuda.tmp
  echo 'None, desabilita a rede. É semelhante a retirar a placa de rede da máquina virtual.' >> $$.ajuda.tmp
  echo "" >> $$.ajuda.tmp
  dialog \
    --title 'Ajuda das opções de rede' \
    --textbox $$.ajuda.tmp \
  0 0
}

# Gerenciamento de uma máquina virtual específica.
function detalhes_vm(){
  while true
  do
    unset snap
    VBoxManage showvminfo $1 > $$.detalhes.tmp
    detalhes[1]='Sistema'
    valor[1]=`grep 'Guest OS:' $$.detalhes.tmp | awk '{print $3 $4 $5 $6 $7 $8 $9}'`
    detalhes[2]='Memória'
    valor[2]=`grep 'Memory size:' $$.detalhes.tmp | awk '{print $3}'`
    detalhes[3]='Vídeo'
    valor[3]=`grep 'VRAM size:' $$.detalhes.tmp | awk '{print $3}'`
    detalhes[4]='Cpu'
    valor[4]=`grep 'Number of CPUs:' $$.detalhes.tmp | awk '{print $4}'`
    detalhes[5]='Status'
    valor[5]=`grep 'State:' $$.detalhes.tmp | awk '{print $2}'`
    detalhes[6]='Rede\ 1'
    valor[6]=`grep 'NIC 1:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2`
    detalhes[7]='Rede\ 2'
    valor[7]=`grep 'NIC 2:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2`
    detalhes[8]='Rede\ 3'
    valor[8]=`grep 'NIC 3:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2`
    detalhes[9]='Rede\ 4'
    valor[9]=`grep 'NIC 4:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2`
    detalhes[10]='Audio'
    valor[10]=`grep 'Audio:' $$.detalhes.tmp | cut -d"(" -f2 | cut -d")" -f1`
    detalhes[11]='Cd/Dvd'
    valor[11]=`grep ^Controladora\ IDE $$.detalhes.tmp | awk '{print $5}' | head -1` 
    detalhes[12]='HD'
    valor[12]=`grep ^Controladora\ SATA $$.detalhes.tmp | awk '{print $5}' | head -1` 
    detalhes[13]='Boot'
    valor[13]=`grep ^Boot\ Device $$.detalhes.tmp | head -1 | cut -d" " -f4`
    detalhes[14]='Snapshot'
    for i in `grep -A 100 ^Snapshot $$.detalhes.tmp | grep Name |awk '{print $2}'`
    do
   snap=`echo -n $snap\ $i`
    done
    valor[14]=$snap
    detalhes[15]='Exportar'
    valor[15]='Exportar a máquina virtual' 
    detalhes[16]='Excluir'
    valor[16]='Excluir a máquina virtual'
    menu_detalhes=0
    echo 'dialog --stdout \' > $$.detalhes.tmp
    echo '--title "VM ' "$1" '" \' >> $$.detalhes.tmp
    echo '--menu "Escolha o item para alterar:" \' >> $$.detalhes.tmp
    echo '0 0 0 \' >> $$.detalhes.tmp
    for i in `seq 16`
    do
   echo "${detalhes[$i]}" "'""${valor[$i]}" "'" ' \'>> $$.detalhes.tmp
    done
    chmod +x $$.detalhes.tmp >> /dev/null
    menu_detalhes=$( ./$$.detalhes.tmp )
    if [ -z "$menu_detalhes" ]
    then
   break
    else
   if [ "${valor[5]}" != "powered" ] 
   then
     case $menu_detalhes in
       "Status")
      parar "$1" "${valor[5]}"
      ;;
       "Rede 1"|"Rede 2"|"Rede 3"|"Rede 4")
      lan=`echo $menu_detalhes | cut -d" " -f2`   
      confrede
      case $rede in 
        "Nat")
          VBoxManage controlvm $1 nic$lan nat >> /dev/null 2>>/dev/null
          VBoxManage controlvm $1 setlinkstate$lan on >>/dev/null 2>>/dev/null
          ;;
        "Bridged")
          lanreal=`lanbridged $1`
          VBoxManage controlvm $1 nic$lan bridged $lanreal setlinkstate$lan on >> /dev/null 2>>/dev/null
          ;;
        "Interna")
          VBoxManage controlvm $1 nic$lan intnet intnet setlinkstate$lan on >> /dev/null 2>>/dev/null
          VBoxManage controlvm $1 setlinkstate$lan on >>/dev/null 2>>/dev/null
          ;;
        "Hostonly")
          VBoxManage controlvm $1 nic$lan hostonly vboxnet0 setlinkstate$lan on >> /dev/null 2>>/dev/null
          VBoxManage controlvm $1 setlinkstate$lan on >>/dev/null 2>>/dev/null
          ;;
        "None")
          VBoxManage controlvm $1 setlinkstate$lan off >> /dev/null 2>>/dev/null
          ;;
        "Ajuda")
          ajudarede
          ;;
        *)
          break
          ;;
      esac
      ;;

       "Cd/Dvd")
      confcddvd $1
      ;;
       "Snapshot")
      snapshot $1
      ;;
       *)
      dialog \
        --title 'Máquina em execução' \
        --msgbox 'A máquina virtual precisa estar parada para que essa opção possa ser alterada' \
        10 40
      ;;
     esac
   else
     case $menu_detalhes in
       "Status")
      parar "$1" "${valor[5]}"
      ;;
       "Sistema")
      tiposistema
      sistema=$( ./$$.sistema.tmp )
      if [ -n $sistema ] 
      then
        VBoxManage modifyvm $1 --ostype $sistema >> /dev/null 2>>/dev/null
      fi
      ;;
       "Memória")
      echo 'dialog --stdout \' > $$.sistema.tmp
      echo '--title "Memória Ram" \' >> $$.sistema.tmp 
      echo '--menu "Defina o valor da memória Ram da VM:" \' >> $$.sistema.tmp
      echo '0 0 0 \' >> $$.sistema.tmp
      x=$((`free | grep Mem | awk '{print $2}'` / 4096))
      i=0
      mem=16
      while [ $x -gt $mem ]
      do
        i=$(($i + 1))
        mem=$(($mem * 2))
          for i in 0 1 2 3
          do
            mem1=$(($mem / 4 * $i))
            mem2=$(($mem + mem1))
            echo $mem2 'MB \' >> $$.sistema.tmp
             done
      done
      chmod +x $$.sistema.tmp
      sistema=$( ./$$.sistema.tmp )
      if [ -n $sistema ] 
      then
        VBoxManage modifyvm $1 --memory $sistema >> /dev/null 2>>/dev/null
      fi      
      ;;
       "Vídeo")
      echo 'dialog --stdout \' > $$.sistema.tmp
      echo '--title "Memória de vídeo" \' >> $$.sistema.tmp 
      echo '--menu "Defina o valor da memória de Vídeo:" \' >> $$.sistema.tmp
      echo '0 0 0 \' >> $$.sistema.tmp
      x=$((`free | grep Mem | awk '{print $2}'` / 20480))
      i=0
      mem=4
      while [ $x -gt $mem ]
      do
        i=$(($i + 1))
        mem=$(($mem * 2))
        echo $mem 'MB \' >> $$.sistema.tmp
      done
      chmod +x $$.sistema.tmp
      sistema=$( ./$$.sistema.tmp )
      if [ -n $sistema ] 
      then
        VBoxManage modifyvm $1 --vram $sistema >> /dev/null 2>>/dev/null
      fi
      ;;
       "Cpu")
      echo 'dialog --stdout \' > $$.sistema.tmp
      echo '--title "Número de processadores" \' >> $$.sistema.tmp 
      echo '--menu "Defina o número de processadores:" \' >> $$.sistema.tmp
      echo '0 0 0 \' >> $$.sistema.tmp
      x=$((`grep processor /proc/cpuinfo | wc -l`))
      for i in `seq $x`
      do
        echo $i 'Cpu\(s\) \' >> $$.sistema.tmp
      done
      chmod +x $$.sistema.tmp
      sistema=$( ./$$.sistema.tmp )
      if [ -n $sistema ] 
      then
        VBoxManage modifyvm $1 --cpus $sistema --ioapic on >> /dev/null 2>>/dev/null
      fi
      ;;
       "Rede 1"|"Rede 2"|"Rede 3"|"Rede 4")
      lan=`echo $menu_detalhes | cut -d" " -f2`
      confrede
      case $rede in
        "Nat")
          VBoxManage modifyvm $1 --nic$lan nat >> /dev/null 2>>/dev/null
          ;;
        "Bridged")
          lanreal=`lanbridged $1`
          VBoxManage modifyvm $1 --nic$lan bridged --bridgeadapter$lan $lanreal >> /dev/null 2>>/dev/null
          ;;
        "Interna")
          VBoxManage modifyvm $1 --nic$lan intnet >> /dev/null 2>>/dev/null
          ;;
        "Hostonly")
          VBoxManage modifyvm $1 --nic$lan hostonly --hostonlyadapter$lan vboxnet0 >> /dev/null 2>>/dev/null
          ;;
        "None")
          VBoxManage modifyvm $1 --nic$lan none >> /dev/null 2>>/dev/null
          ;;
        "Ajuda")
          ajudarede
          ;;
        *)
          break
          ;;
      esac
      ;;
       "Audio")
      som=`VBoxManage showvminfo $1 | grep Audio | awk '{print $2}'`
      if [ $som == "enabled" ] 
      then
        VBoxManage modifyvm $1 --audio none > /dev/null 2>/dev/null
      else
        VBoxManage modifyvm $1 --audio alsa > /dev/null 2>/dev/null
      fi
      ;;
       "Cd/Dvd")
      confcddvd $1
      ;;
       "Boot")
      boot=$( dialog --stdout \
        --title "Boot por" \
        --menu "Opções: " \
        0 0 0 \
        HD 'Primeiro hd' \
        CD 'Drive de cd/dvd')
      if [ $boot == "HD" ]
      then
        VBoxManage modifyvm $1 --boot1 disk >/dev/null 2>/dev/null
      elif [ $boot == "CD" ]
      then
        VBoxManage modifyvm $1 --boot1 dvd >/dev/null 2>/dev/null
      fi
      ;;
       "Snapshot")
      snapshot $1
      ;;
       "HD")
      listarhd
      echo 'Nenhum' \'Sem nenhum disco\' '\' >> $$.cdv.tmp
      hd=$( ./$$.cdv.tmp)
      if [ -z $hd ]
      then
        echo . >> /dev/null
      elif [ $hd == "Novo" ]
      then
        novohd $1
        if [ $? == 0 ]
        then
          VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$hd >/dev/null 2>/dev/null
        fi
      elif [ $hd == "Nenhum" ]
      then
        VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium none   >/dev/null 2>/dev/null     
      else
        VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$hd >/dev/null 2>/dev/null
      fi
      ;;
       "Exportar")
      exportarvm $1
      ;;      
       "Excluir")
      dialog \
        --title "AVISO \!\!\!" \
        --yesno "Deseja realmente excluir a vm $1 ? Isso apagará todos os snapshot desta VM." \
        0 0
      if [ $? -eq 0 ]
      then
        VBoxManage storagectl $1 --name "Controladora SATA" --remove > /dev/null 2>/dev/null
        VBoxManage storagectl $1 --name "Controladora IDE" --remove > /dev/null 2>/dev/null
        for i in `VBoxManage showvminfo $1 | grep -A 100 -i snapshot | grep Name | awk '{print $2}'`
        do
          VBoxManage snapshot $1 delete $i 2>/dev/null >/dev/null
        done
        VBoxManage unregistervm $1 --delete >> /dev/null 2>>/dev/null
        return
      fi
      ;;
     esac
   fi
    fi
  done
}

# Importa uma vm
function importarvm(){
  while true
  do
    arquivo=$( dialog --stdout \
   --title 'Selecione o arquivo'  \
   --fselect ~ \
   10 55)
    if [ -z $arquivo ]
    then
   break
    elif [ -f $arquivo ]
    then
   VBoxManage import $arquivo 2>/dev/null >/dev/null
   break
    else
    dialog \
     --title 'Arquivo não existe' \
     --msgbox "O arquivo $arquivo não existe." \
   6 40
    fi
  done
}

# Escolha do tipo de sistema operacional da nova máquina virtual
function tiposistema(){
  echo 'dialog --stdout \' > $$.sistema.tmp
  echo '--title "Tipo de sistema operacional" \' >> $$.sistema.tmp 
  echo '--menu "Escolha o sistema operacional:" \' >> $$.sistema.tmp
  echo '0 0 0 \' >> $$.sistema.tmp
  VBoxManage list ostypes | grep ^ID | cut -d":" -f2 | sed s/" "/""/g | grep -v ^$ > $$.id.tmp
  VBoxManage list ostypes | grep ^Description | cut -d":" -f2 | sed s/" "/""/g | grep -v ^$ > $$.desc.tmp
  paste $$.id.tmp $$.desc.tmp | sed 's/$/ \\/g' | sed s/'('/"_"/g | sed s/')'/""/g >> $$.sistema.tmp
  chmod +x $$.sistema.tmp
}

# Criação de uma nova vm
function novavm(){
  while true
  do
    nomevm="$( dialog --stdout \
   --inputbox 'Nome da nova vm:' 0 0 )"
    if [ -z $nomevm ]
    then
   break
    else
   nomevm=$(echo "$nomevm" | sed s/" "//g | sed s/[^a-zA-Z0-9]//g)
   VBoxManage list vms | grep \"$nomevm\"  >> /dev/null 2>>/dev/null
   if [ $? -eq 0 ]
   then
     dialog \
       --title 'Crição de vm' \
       --msgbox 'Já existe uma vm com este nome'\
       6 40   
   else
     tiposistema
     sistema=$( ./$$.sistema.tmp )
     if [ -n $sistema ] 
     then
       VBoxManage createvm --name $nomevm --ostype $sistema >> /dev/null 2>>/dev/null
       VBoxManage registervm $HOME/.VirtualBox/Machines/$nomevm/$nomevm.xml >> /dev/null 2>>/dev/null
     else
       VBoxManage createvm --name $nomevm >> /dev/null 2>>/dev/null
       VBoxManage registervm $HOME/.VirtualBox/Machines/$nomevm/$nomevm.xml >> /dev/null 2>>/dev/null
     fi
     VBoxManage storagectl $nomevm --name "Controladora SATA" --add sata > /dev/null 2>/dev/null
     VBoxManage storagectl $nomevm --name "Controladora IDE" --add ide > /dev/null 2>/dev/null
     break
   fi
    fi
  done
}

# Gerencia as máquinas virtuais
function listar(){
  while true
  do
    listarvm
    echo "Nova 'Criar uma nova máquina virtual' \\" >> $$.listar.tmp
    echo "Importar 'Importar uma máquina virtual' " >> $$.listar.tmp
    menu_listar=$(./$$.listar.tmp)
    if [ -z $menu_listar ]
    then
   break
    else
   case $menu_listar in
     "Nova")
       novavm
       ;;
     "Importar")
       importarvm
       ;;
     *)
       detalhes_vm $menu_listar
       ;;
   esac
    fi
  done
}

# Lista os discos virtuais
function listarhd(){
  echo 'dialog --stdout \' > $$.cdv.tmp
  echo '--title "Hd virtual" \' >> $$.cdv.tmp
  echo '--menu "Escolha o hd virtual:" \' >> $$.cdv.tmp
  echo '0 0 0 \' >> $$.cdv.tmp
  VBoxManage list hdds | grep Location | grep -v Snapshot | awk '{print $2}' | cut -d"/" -f6 > $$.cdv2.tmp
  for i in `cat $$.cdv2.tmp`
  do
    usado_por=`VBoxManage list hdds | grep -A3 $i | grep Usage | awk '{print $2}'`
    if [ "a$usado_por" == "a" ]
    then
   echo $i \'Sem uso\' '\' >> $$.cdv.tmp
    else
   echo $i \'Usado por $usado_por\' '\' >> $$.cdv.tmp
    fi
  done
  echo 'Novo' \'Criar um novo disco\' '\' >> $$.cdv.tmp
  chmod +x $$.cdv.tmp
}

# Cria um novo disco virtual
function novohd(){
  while true
  do
    criarnovohd
    if [ -z $arquivo ] 
    then
   break
    elif [ -f ~/.VirtualBox/HardDisks/$arquivo.vdi ]
    then
      dialog \
      --title 'Arquivo já existe' \
     --msgbox 'O arquivo já existe.'\
     6 40
    else
      echo 'dialog --stdout \' > $$.sistema.tmp
      echo '--title "Tamanho do disco" \' >> $$.sistema.tmp 
      echo '--menu "Defina o tamanho do disco:" \' >> $$.sistema.tmp
      echo '0 0 0 \' >> $$.sistema.tmp
      x=$((`df -hm /home | tail -1 | awk '{print $4}'`))
      i=0
      tam=40
      while [ $x -gt $tam ]
      do
     i=$(($i + 1))
     tam=$(($tam * 2))
     for i in 0 1 2 3
     do
       tam1=$(($tam / 4 * $i))
       tam2=$(($tam + $tam1))
       echo $tam2 'MB \' >> $$.sistema.tmp
     done
   done
      chmod +x $$.sistema.tmp
      tamanho=$( ./$$.sistema.tmp )
      if [ -z $sistema ]
      then
     VBoxManage createhd --filename $arquivo.vdi --size $tamanho >/dev/null 2>/dev/null
     VBoxManage openmedium disk ~/.VirtualBox/HardDisks/$arquivo.vdi >/dev/null 2>/dev/null
     VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$arquivo.vdi >/dev/null 2>/dev/null
     hd=$arquivo.vdi
     listarhd
     return 0
      fi
    fi
  done
} 

# Exclui uma hd virtual
function excluirhd(){
  dialog \
    --title 'AVISO!!!' \
    --yesno 'Deseja realmente excluir PERMANENTEMENTE o disco virtual?' \
    0 0
  if  [ $? -eq 0 ]
  then
    VBoxManage closemedium disk ~/.VirtualBox/HardDisks/$hd 2>/dev/null >/dev/null
    rm -f ~/.VirtualBox/HardDisks/$hd
  fi
}

# Retira um determinado hd de todas as vm
function nenhumhd(){
  for i in `VBoxManage list vms | grep ^\" | cut -d"\"" -f2`
  do
    VBoxManage showvminfo $i | grep $1 2>/dev/null >/dev/null
   if [ $? == 0 ]
   then
     VBoxManage storageattach $i --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium none
   fi
  done
}

# Pede o nome de um novo hd
function criarnovohd(){
  arquivo=$(dialog --stdout \
    --title 'Escolha o nome do novo disco virtual' \
    --inputbox 'Nome:' 0 0 "Novo_disco" ) 
}

# Clona um hd virtual
function clonar(){
  while true
  do
    criarnovohd
    if [ -z $arquivo ]
    then
   break
    elif [ -f ~/.VirtualBox/HardDisks/$arquivo ]
    then
   dialog \
   --title 'Arquivo existe' \
   --msgbox "O arquivo $arquivo já existe." \
   6 40
    else
   VBoxManage clonehd ~/.VirtualBox/HardDisks/$hd ~/.VirtualBox/HardDisks/$arquivo >/dev/null 2>/dev/null
   VBoxManage openmedium disk ~/.VirtualBox/HardDisks/$arquivo >/dev/null 2>/dev/null
   break
    fi
  done
}

# Manutenção em hd virtual
function hd(){
  while true
  do
    hd=$( ./$$.cdv.tmp)
    if  [ -z $hd ]
    then
   return
    elif  [ $hd == "Novo" ] 
    then
   novohd
    else
   id=`VBoxManage list hdds | grep -B3 $hd | head -1 | awk '{print $2}'`
   VBoxManage showhdinfo $id | tail -8 > $$.id.tmp
   dialog \
     --title 'Detalhes do disco virtual' \
     --tailbox $$.id.tmp \
     0 0   
   acao=$( dialog --stdout \
     --title "Ação no disco" \
     --menu "Escolha o tipo de ação no disco:" \
     0 0 0 \
     'Compactar' 'Compactar o hd virtual' \
     'Clonar' 'Copiar um disco disco' \
     'Excluir' 'Excluir o disco virtual' \
     'Associar' 'Associar a uma máquina virtual' \
     'Ajuda' 'Breve explicação sobre os menus acima')
   case $acao in
   "Compactar")
     VBoxManage modifyhd $id --compact > $$.compact.tmp &
     sleep 1
     grep ^0%... $$.compact.tmp
     if [ $? -eq 0 ]
     then
       ps wax | grep $id | grep -v grep 2>/dev/null >/dev/null
       while [ $? -eq 0 ]
       do
      per=`grep ^0 $$.compact.tmp`
      dialog \
        --title 'Compactando o disco virtual' \
        --infobox $per \
        0 0
      sleep 1
      ps wax | grep $id | grep -v grep 2>/dev/null >/dev/null
       done
     else
       dialog \
      --title 'Não é possível compactar o disco' \
      --msgbox 'Não foi possível compactar o disco. Certifique-se de que ele não esteja em uso por alguma máquina virtual no momento.'\
      6 40
     fi
     ;;
   "Clonar")
     clonar
     ;;
   "Excluir")
     VBoxManage list hdds | grep -A3 $hd | grep Usage 2>/dev/null >/dev/null
     if [ $? == 0 ]
     then
     dialog \
       --title 'Não é possível excluir o disco' \
       --msgbox 'Este disco está associado a uma máquina vitual. Antes de excluí-lo, é necessário retirá-lo da vm.'\
       6 40          
     else
       excluirhd
     fi
     ;;
   "Associar")
     listarvm
     vm=$( ./$$.listar.tmp )
     if [ -z $vm ]
     then
       break
     elif [ $vm == "Nenhum" ]
     then
       nenhumhd $hd
     else
       VBoxManage storageattach $vm --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$hd 2>/dev/null >/dev/null
     fi
       break
     ;;
   "Ajuda")
     echo 'O menu Comptactar é usado para reorganizar o disco virtual, diminuindo o espaço real dele.' > $$.ajuda.tmp
     echo 'É aconselhado fazer isso quando muitos arquivos são apagados na máquina virtual que utiliza esse disco.' >> $$.ajuda.tmp
     echo "" >> $$.ajuda.tmp
     echo 'No menu Clonar você pode fazer uma cópia do disco, útil em migrações e para testar um sistema.' >> $$.ajuda.tmp
     echo "" >> $$.ajuda.tmp
     echo 'O menu Excluir apaga o disco virtual.' >> $$.ajuda.tmp
     echo "" >> $$.ajuda.tmp
     echo 'No menu Associar você pode conectar o disco virtual em uma máquina virtual.' >> $$.ajuda.tmp
     dialog \
       --title 'Ajuda do menu Principal' \
       --textbox $$.ajuda.tmp \
       0 0
     ;;
   *)
     ;;
   esac
   listarhd
    fi
  done
}

# Lista os cd e dvd virtuais
function listarcddvd(){
  echo 'dialog --stdout \' > $$.cdv.tmp
  echo '--title "Cd virtual" \' >> $$.cdv.tmp
  echo '--menu "Escolha o cd virtual:" \' >> $$.cdv.tmp
  echo '0 0 0 \' >> $$.cdv.tmp
  VBoxManage list dvds | grep Location | cut -d"/" -f5 > $$.cdv2.tmp
  for i in `cat $$.cdv2.tmp`
  do
    usado_por=`VBoxManage list dvds | grep -A3 $i | grep Usage | awk '{print $2}'`
    if [ "a$usado_por" == "a" ]
    then
   echo $i \'Sem uso\' '\' >> $$.cdv.tmp
    else
   echo $i \'Usado por $usado_por\' '\' >> $$.cdv.tmp
    fi
  done
  echo 'Cd_local' 'Drive\ de\ cd\ do\ servidor' '\' >> $$.cdv.tmp
  echo 'Novo' 'Utilizar\ um\ novo\ cd/dvd\ virtual' '\' >> $$.cdv.tmp
  chmod +x $$.cdv.tmp
}

# Importação de cd e dvd virtuais  
function importarcddvd(){
  while true
  do
    arquivo=$( dialog --stdout \
   --title 'Selecione o arquivo'  \
   --fselect ~ \
   10 55)
    if [ -z $arquivo ]
    then
   break
    elif [ -f $arquivo ]
    then
   VBoxManage openmedium dvd $arquivo 2>/dev/null >/dev/null
   if [ $? -ne 0 ] 
   then
     dialog \
      --title 'Erro!!!' \
      --msgbox "Não consegui anexar o cd/dvd virtual." \
       6 40
   else
     break
   fi
    else
    dialog \
     --title 'Arquivo não existe' \
     --msgbox "O arquivo $arquivo não existe." \
    6 40
    fi
  done
}

# Retira o cd de todas as vm's
function nenhumcd(){
  for i in `VBoxManage list vms | grep ^\" | cut -d"\"" -f2`
  do
    VBoxManage showvminfo $i | grep $1 > /dev/null 2>/dev/null
    if [ $? -eq 0 ] 
    then
   VBoxManage storageattach $i --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium emptydrive > /dev/null 2>/dev/null
    fi
  done
}

# Manutenção em cd virtual
function cdd(){
  while true
  do
    cdv=$( ./$$.cdv.tmp )
    if [ -z $cdv ]
    then
   return
    elif [ $cdv == "Novo" ]
    then
   importarcddvd
    else
   listarvm
   echo Nenhum \'Retirar de todos as Vms\' '\' >> $$.listar.tmp
   echo Excluir \'Exclui o cd/dvd virtual\' '\' >> $$.listar.tmp
   vms=$(./$$.listar.tmp)
   caminho=`VBoxManage list dvds | grep $cdv | awk '{print $2}'`
   if [ -z $vms ]
   then
     return
   elif [ $vms == "Nenhum" ]   
   then
     nenhumcd $cdv
   elif [ $vms == "Excluir" ]
   then
     nenhumcd $cdv
     VBoxManage closemedium dvd $caminho > /dev/null 2>/dev/null
   else
     VBoxManage storageattach $vms --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium $caminho > /dev/null 2>/dev/null
   fi
    fi
    listarcddvd
  done
}

# Gerencia os discos e unidades de dvd virtuais
function discos(){
  while true
  do
    discos=$( dialog --stdout \
   --title "Tipo de midia" \
   --menu "Escolha o tipo de midia:" \
   0 0 0 \
   'Cd virtual' 'Arquivo de imagem .iso' \
   'Hd virtual' 'Arquivo de disco virtual' \
   'Ajuda' 'Breve explicação sobre os menus acima' )
    case $discos in
   "Cd virtual")
     listarcddvd
     cdd
     ;;
   "Hd virtual")
     listarhd
     hd
     ;;
   "Ajuda")
     echo 'No menu Cd Virtual você pode administrar os cds virtuais, criar, importar, excluir, etc.' > $$.ajuda.tmp
     echo "" >> $$.ajuda.tmp
     echo 'No menu Hd Virtual você pode administrar os HDs virtuais, criar, assciá-los a uma VM, excluir, compactar, tirar snapshot, etc.' >> $$.ajuda.tmp
     dialog \
       --title 'Ajuda do menu Discos' \
       --textbox $$.ajuda.tmp \
       0 0
     
     ;;
   *)
     break
     ;;
   esac
done
}

# Checa se a máscara de subrede é válida
function checamask(){
  ipa=`echo $1 | cut -d"." -f1`
  ipb=`echo $1 | cut -d"." -f2`
  ipc=`echo $1 | cut -d"." -f3`
  ipd=`echo $1 | cut -d"." -f4`
  for i in $ipa $ipb $ipc $ipd 
  do
    if [ $i != 0 ] && [ $i != 128 ] && [ $i != 192 ] && [ $i != 224 ] && [ $i != 240 ] && [ $i != 248 ] && [ $i != 252 ] && [ $i != 254 ] && [ $i != 255 ]
    then
   dialog \
     --title 'Máscara inválida' \
     --msgbox 'A máscara só aceita os valors 0, 128, 192, 224, 240, 248, 252, 254 e 255 no formato xxx.xxx.xxx.xxx.'\
     6 40
   return 1
    fi
  done
  return 0
}

# Mensagem padrão para endereço ip inválido
function erroip(){
  dialog \
    --title 'Ip inválido' \
    --msgbox 'O ip só pode conter números entre 0 e 255 no formato xxx.xxx.xxx.xxx.'\
    6 40
}

# Checa se o ip digitado é válido
function checaip(){
  ipa=`echo $1 | cut -d"." -f1`
  ipb=`echo $1 | cut -d"." -f2`
  ipc=`echo $1 | cut -d"." -f3`
  ipd=`echo $1 | cut -d"." -f4`
  for i in $ipa $ipb $ipc $ipd 
  do
    echo $i | grep [^0-9] 2>/dev/null >/dev/null
    if [ $? == 0 ]
    then
   erroip
   return 1
    elif [ $i -gt 255 ] || [ $i -lt 0 ]
    then
   erroip
   return 1
    fi
  done
  return 0
}

# Configuração do endereço ip
function ip(){
  while true
  do
    ip=$(dialog --stdout \
   --title 'Digite o ip' \
   --inputbox 'Ip' 0 0 "$ip" )
    if [ -z $ip ]
    then
   return 1
    fi
    checaip $ip
    if [ $? -eq 0 ]
    then
   return
    fi
  done
}

# Configuração da máscara de subrede
function mask(){
  while true
  do
    mask=$(dialog --stdout \
   --title 'Digite a máscara de rede' \
   --inputbox 'Máscara de sub-rede:' 0 0 "$mask" )
    if [ -z $mask ]
    then
   return 1
    fi
    checamask $mask
    if [ $? -eq 0 ]
    then
   return
    fi
  done
}

# Configuração da rota padrão
function gw(){
  while true
  do
    gw=$(dialog --stdout \
   --title 'Digite o gateway padrão' \
   --inputbox 'Default gateway:' 0 0 "$gw" )
    if [ -z $gw ]
    then
     return 1
    fi
    checaip $gw
    if [ $? -eq 0 ]
    then
   return
    fi
  done
}

# Configurção da rede
function rede(){
  while true
  do
    echo 'dialog --stdout \' > $$.rede.tmp
    echo '--title "Interfaces de rede" \' >> $$.rede.tmp
    echo '--menu "Escolha a interface de rede:" \' >> $$.rede.tmp
    echo '0 0 0 \' >> $$.rede.tmp
    ifconfig | grep encap | sed s/"Link encap"//g | awk '{print $1$2}'| sed s/":"/" "/g | sed 's/$/ \\/g' >> $$.rede.tmp
    chmod +x $$.rede.tmp
    rede=$(./$$.rede.tmp)
    if [ -z $rede ] 
    then
   return
    else
   ip=`ifconfig $rede | grep inet | grep -v inet6 | awk '{print $3}'`
   mask=`ifconfig $rede | grep inet | grep -v inet6 | awk '{print $5}' | cut -d":" -f2`
   gw=`netstat -nr | grep ^0.0.0.0 | awk '{print $2}'`
   ip
   if [ $? -eq 0 ]
   then
     mask
     if [ $? -eq 0 ]
     then
       gw
       if [ $? -eq 0 ]
       then
      ifconfig $rede $ip netmask $mask 2>/dev/null >/dev/null
      route delete -net default 2>/dev/null >/dev/null
      route add -net default gw $gw 2>/dev/null >/dev/null
       fi
     fi
   fi
    fi
  done
}

# Configurações do servidor real.
function servidor(){
  while true
  do
    menu_servidor=$( dialog --stdout \
   --title "Administração do Servidor" \
   --menu "Opções: " \
   0 0 0 \
   Update 'Atualização dos pacotes' \
   Informacoes 'Informações sobre o status do servidor' \
   Rede 'Configuração da rede' \
   Console 'Acesso ao console do servidor' \
   Ajuda 'Breve explicação sobre os menus acima')
    case $menu_servidor in
   "Update")
     clear
     apt-get update
     apt-get -y upgrade
     read
     ;;
      "Informacoes")
     dialog --no-shadow \
       --sleep 1 \
       --infobox 'Aguarde...' 12 40 --and-widget &
     cpu=`top -b -n 2 | grep Cpu | tail -1 | awk '{print $2}'`
     tarefas=`top -b -n 1 | grep Tasks | tail -1 | awk '{print $2}'`
     ioread=`iostat -dm 1 2 | grep -v ^$ | tail -1 | awk '{print $3}'`
     iowrite=`iostat -dm 1 2 | grep -v ^$ | tail -1 | awk '{print $4}'`
     swap=`free -m | tail -1 | awk '{print $3}'`
     free=0
     y=`free -m | grep ^Mem | awk '{print $4" "$6" "$7}'`
     for i in $y
     do
       free=$(($free + $i))
     done
     in1=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $2}' | cut -d":" -f2` / 1024))
     out1=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $6}' | cut -d":" -f2` / 1024))
     sleep 1
     in2=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $2}' | cut -d":" -f2` / 1024))
     out2=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $6}' | cut -d":" -f2` / 1024))
     in=$(( $in2 - $in1 ))
     out=$(( $out2 - $out1 ))
     hora=`date "+%H:%M"`
     conn=`netstat -na | grep ESTAB | wc -l`
     echo "Hora:            $hora" > $$.servidor.tmp
     echo "Tarefas:         $tarefas" >> $$.servidor.tmp
     echo "Uso de cpu:         $cpu" >> $$.servidor.tmp
     echo "Leitura de disco (Mb/s):   $ioread" >> $$.servidor.tmp
     echo "Escrita em disco (Mb/s):    $iowrite" >> $$.servidor.tmp
     echo "Uso de swap (Mb):      $swap" >> $$.servidor.tmp
     echo "Inbound (eth0, Kb/s):      $in" >> $$.servidor.tmp
     echo "Outbound (eth0, Kb/s):      $out" >> $$.servidor.tmp
     echo "Conexões ativas (eth0):   $conn" >> $$.servidor.tmp
     echo "Memória ram livre (Mb):   $free" >> $$.servidor.tmp
     dialog \
       --title 'Detalhes do servidor' \
       --textbox $$.servidor.tmp  \
       16 50    
     ;;
   "Rede")
     rede
     ;;
      "Console")
     clear
     read -p "Para voltar ao menu, digite 'Exit'. " -t 3
     /bin/bash
     ;;
   "Ajuda")
     echo 'No menu Update você pode atualizar os programa via apt-get. É necessário estar logado como root' > $$.ajuda.tmp
     echo "" >> $$.ajuda.tmp
     echo 'No menu Informações é mostrado um status do servidor, como uso de cpu, memória ram, espaço em disco, etc.' >> $$.ajuda.tmp
     echo "" >> $$.ajuda.tmp
     echo 'No menu Rede é possível alterar as configurações de rede. Essas configurações serão perdidas no próximo boot.'  >> $$.ajuda.tmp
     echo '  Para que as configurações fiquem permanentes, acesse o menu Console e altere o arquivo /etc/network/interfaces.'  >> $$.ajuda.tmp
     echo "" >> $$.ajuda.tmp
     echo 'O menu Console dá acesso ao console do servidor, permitindo fazer configurações e ajustes avançados.'  >> $$.ajuda.tmp
     dialog \
       --title 'Ajuda do menu Servidor' \
       --textbox $$.ajuda.tmp \
       0 0
     ;;
   *)
     break
   ;;
    esac
  done
}

# Programa principal
depend
if [ $? -ne 0 ]
then
  exit 255
fi
versao=`VBoxManage -v`
while true
do
  menu_principal=$( dialog --stdout \
    --title "Administração do VirtualBox versão $versao" \
    --menu "Opções: " \
    0 0 0 \
    VMs 'Administrar as máquinas virtuais' \
    Discos 'Administraçãos dos discos e imagens de cd e dvd' \
    Servidor 'Administração do servidor' \
    Ajuda 'Breve explicação sobre os menus acima')
  case $menu_principal in
    "VMs")
     listar
      ;;
    "Discos")
   discos
   ;;
    "Servidor")
   servidor
   ;;
    "Ajuda")
      echo 'No menu VMs você pode administrar as máquinas virtuais, criar, iniciar, congelar, excluir, etc.' > $$.ajuda.tmp
   echo "" >> $$.ajuda.tmp
   echo 'No menu Discos você pode administrar os HDs e CDs virtuais, criar, assciá-los a uma VM, excluir, etc.' >> $$.ajuda.tmp
   echo "" >> $$.ajuda.tmp
   echo 'No menu Servidor você pode administrar o servidor real, obter informações, status, efetuar atualizações, etc' >> $$.ajuda.tmp
   dialog \
     --title 'Ajuda do menu Principal' \
     --textbox $$.ajuda.tmp \
     0 0
      ;;
    *)
   rm $$.*.tmp > /dev/null 2>/dev/null 
   break
   ;;
  esac
done

Scripts recomendados

Monitorar status de transferência das interfaces de rede

iptables, sem frescuras!

Loadbalance FAILOVER V.5

Fazendo Perguntas

Invertendo strings usando vetores


  

Comentários
[1] Comentário enviado por thyagobrasileiro em 25/08/2012 - 13:26h

Que trabalho grande!!!!! Quanto tempo vc gastou nesse projeto?

[2] Comentário enviado por erisrjr em 25/08/2012 - 13:42h

Realmente um ótimo script! Posso adapta lo para uso com o CentOS, Red Hat(posto aqui depois o resultado)?

[3] Comentário enviado por asdf2 em 26/08/2012 - 14:15h

belo trabalho, foi pro favoritos, valeu

[4] Comentário enviado por ricardoolonca em 27/08/2012 - 17:30h


[1] Comentário enviado por thyagobrasileiro em 25/08/2012 - 13:26h:

Que trabalho grande!!!!! Quanto tempo vc gastou nesse projeto?


Fui fazendo aos poucos. Levou cerca de um ano.

[5] Comentário enviado por ricardoolonca em 27/08/2012 - 17:31h


[2] Comentário enviado por erisrjr em 25/08/2012 - 13:42h:

Realmente um ótimo script! Posso adapta lo para uso com o CentOS, Red Hat(posto aqui depois o resultado)?


Fique à vontade, inclusive para melhorá-lo.

[6] Comentário enviado por cesar-linux em 18/07/2013 - 16:10h

Meus parabéns pelo trabalho!

[7] Comentário enviado por schrodinger em 22/09/2014 - 10:19h

Muito legal!!! parabéns!!!

[8] Comentário enviado por ricardoolonca em 02/10/2014 - 11:11h


[7] Comentário enviado por iagolira em 22/09/2014 - 10:19h:

Muito legal!!! parabéns!!!


Obrigado.


Contribuir com comentário