# Vagrantfile to install old OpenGnSys 1.0.6b virtual environment using VirtualBox provider.

VAGRANTFILE_API_VERSION = "2"
# VM provider: Oracle VM VirtualBox.
ENV['VAGRANT_DEFAULT_PROVIDER'] = "virtualbox"
# Language (accepted values: es_ES, ca_ES, en_GB).
LANGUAGE = "es_ES"
ENV['LC_ALL'] = LANGUAGE + ".UTF-8"
# Number of OpenGnsys clients (accepted values: from 2 to 9).
NCLIENTS = 4
# Repository virtual disk: file and size (GB).
REPODISK = "ogRepo.vdi"
REPOSIZE = 50
# Amount of memory for server and clients (MB)
SERVERMEM = 1024	# Minimum: 512
CLIENTMEM = 512		# Minimum: 256
# Clients MAC address prefix.
MACPREFIX = "08:00:27:0E:65"
NETPREFIX = "192.168.2"
# Local port to access OpenGnsys Server.
LOCALWEBPORT = 8443

# OpenGnsys Server provisioning script: prepare repo disk, install OpenGnsys, change default interface, configure DHCP server.
OGSERVERSCRIPT = <<EOT
# Exit if OpenGnsys is installed.
[ -f /opt/opengnsys/doc/VERSION.txt ] && echo "Cannot provision, OpenGnsys is already installed." && exit 1
# Create repository disk using LVM, if necesary.
if [ -z "$(blkid /dev/mapper/og-images | grep ext4)" ]; then
    if ! which vgcreate &>/dev/null; then
        apt-get update
        apt-get install -y lvm2
    fi
    pvcreate /dev/sdb
    vgcreate og /dev/sdb
    vgchange -ay
    lvcreate -ay -n images -l 100%VG og
    mkfs -t ext4 /dev/mapper/og-images
    mkdir -p /opt/opengnsys/images
    echo "/dev/mapper/og-images  /opt/opengnsys/images  ext4  defaults  0  0" >> /etc/fstab
    mount -a
fi
# Install OpenGnsys and change server address.
wget -q https://opengnsys.es/svn/tags/opengnsys-1.0.6b/installer/opengnsys_installer.sh -O - | bash || exit $?
mv /opt/opengnsys/log/bash.log /opt/opengnsys/log/opengnsys_installer.log
echo y | /opt/opengnsys/bin/setserveraddr eth1
# Insert DHCP data.
for ((i=#{NCLIENTS+10}; i>10; i--)); do
    sed -i "/^}$/ i host pc${i} { hardware ethernet #{MACPREFIX}:${i}; fixed-address #{NETPREFIX}.${i}; }" /etc/dhcp/dhcpd.conf
done
service isc-dhcp-server restart
# Set language.
export LANG="#{LANGUAGE}.UTF-8"
echo "LANG=\"$LANG\"" > /etc/default/locale
echo "LANG=\"$LANG\"" >> /etc/environment
locale-gen --lang #{LANGUAGE}
sed -i "s/XKBLAYOUT=.*/XKBLAYOUT=\"${LANG%_*}\"/" /etc/default/keyboard
dpkg-reconfigure -fnoninteractive console-setup
# Comment out next lines for automatic data insertion.
#SQL="INSERT INTO aulas (nombreaula, idcentro, urlfoto, grupoid, ubicacion, puestos, modomul, ipmul, pormul, velmul, router, netmask, dns, proxy, modp2p, timep2p) VALUES  ('Aula virtual', 1, 'aula.jpg', 0, 'Despliegue virtual con Vagrant.', 5, 2, '239.194.2.11', 9000, 70, '#{NETPREFIX}.1', '255.255.255.0', '', '', 'peer', 30); INSERT INTO ordenadores (nombreordenador, ip, mac, idaula, idrepositorio, idperfilhard, idmenu, idproautoexec, grupoid, router, mascara, arranque, netiface, netdriver, fotoord) VALUES"
#for ((i=11; i<=#{NCLIENTS+10}; i++)); do
#    SQL="$SQL ('pc$i', '#{NETPREFIX}.$i', REPLACE('#{MACPREFIX}$i',':',''), 1, 1, 0, 0, 0, 0, '#{NETPREFIX}.1', '255.255.255.0', '00unknown', 'eth0', 'generic', 'fotoordenador.gif'),"
#done
#mysql -u usuog -ppassusuog -D ogAdmBD -e "${SQL%,}"
#if ! grep -q "1\.0" /opt/opengnsys/doc/VERSION.txt; then AUX=1; fi
#/opt/opengnsys/bin/setclientmode ogAdmin pc11 $AUX
#for ((i=12; i<=#{NCLIENTS+10}; i++)); do
#    /opt/opengnsys/bin/setclientmode ogClient pc$i $AUX
#done
echo "New OpenGnsys local URL: https://localhost:#{LOCALWEBPORT}/opengnsys/"
EOT

# Client 1 OS provisioning script.
MODELSCRIPT = <<EOT
# Remove network configuration added by Vagrant.
sed -i "/VAGRANT/,$ d" /etc/network/interfaces
echo "After now, use VirtualBox GUI to disable network interface 1 and work with this VM."
# Leave VM halted.
sleep 2
poweroff &
EOT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # OpenGnsys Server VM definition.
  config.vm.define "ogAdministrator", primary: true do |og|
    # Specific VirtualBox configuration.
    og.vm.provider "virtualbox" do |vb|
      # VM name, memory and CPUs.
      vb.name = "ogAdministrator"
      vb.memory = SERVERMEM
      vb.cpus = 1
      # 2nd virtual disk path (current dir on Windows, VM dir on other OSes)
      if Vagrant::Util::Platform.windows? then
        second_disk = File.join(".", REPODISK)
      else
        line = `VBoxManage list systemproperties`.match("Default machine folder.*")[0]
        vb_machine_folder = line.split(':')[1].strip()
        second_disk = File.join(vb_machine_folder, vb.name, REPODISK)
      end
      # Create repo virtual disk, if needed.
      unless File.exist?(second_disk)
        vb.customize ['createhd', '--filename', second_disk, '--size', REPOSIZE * 1024]
      end
      # Attach repo virtual disk.
      vb.customize ['storageattach', :id, '--storagectl', 'SATAController', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', second_disk]
    end
    # VM base and host name.
    og.vm.box = "ubuntu/trusty64"
    og.vm.hostname = "ogAdministrator"
    # Network configuration: forward web port and attach new interface to VMs private network.
    og.vm.network "forwarded_port", guest: 443, host: LOCALWEBPORT, host_ip: "127.0.0.1"
    og.vm.network "private_network", mac: "#{MACPREFIX}10".tr(":",""), ip: "#{NETPREFIX}.10", virtualbox__intnet: true
    # Comment out to disable synced folder.
    #og.vm.synced_folder ".", "/vagrant", disabled: true
    # Launch provisioning script.
    og.vm.provision "shell", inline: OGSERVERSCRIPT
  end

  # Client 1 VM definition.
  config.vm.define "pc11", autostart: false do |v1|
    v1.vm.box = "ubuntu/trusty64"
    v1.vm.hostname = "pc11"
    v1.vm.network "private_network", mac: "#{MACPREFIX}11".tr(":",""), type: "dhcp", virtualbox__intnet: true
    v1.vm.provider "virtualbox" do |vb|
      vb.name = "pc11"
      vb.memory = CLIENTMEM
      vb.cpus = 1
      vb.customize ['modifyvm', :id, '--boot1', 'net', '--boot2', 'disk']
    end
    v1.vm.synced_folder ".", "/vagrant", disabled: true
    v1.vm.provision "shell", inline: MODELSCRIPT
  end

  # Clonable clients definition.
  (2..NCLIENTS).each do |i|
    config.vm.define "pc#{i+10}", autostart: false do |cl|
      cl.vm.box = "clink15/pxe"
      cl.ssh.insert_key = false
      cl.vm.boot_timeout = 5
      cl.vm.network "private_network", mac: "#{MACPREFIX}${i+10}".tr(":",""), type: "dhcp", virtualbox__intnet: true
      cl.vm.provider "virtualbox" do |vb|
        vb.name = "pc#{i+10}"
        vb.memory = CLIENTMEM
        vb.cpus = 1
        vb.customize ['modifyvm', :id, '--boot1', 'net', '--boot2', 'disk']
        vb.customize ["modifyvm", :id, "--nic1", "none"]
      end
    end
  end

end

