# Vagrantfile to install OpenGnsys virtual environment (production version) using VirtualBox provider. VAGRANTFILE_API_VERSION = "2" # VM provider: Oracle VM VirtualBox. ENV['VAGRANT_DEFAULT_PROVIDER'] = "virtualbox" # OpenGnsys version and OGAgent version. OGVERSION="1.1.1d" # OGAgent version. OGAGENTVERSION="1.4.2-1" # 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 = ENV['NUMBER_OF_CLIENTS']|| 2 NCLIENTS = NCLIENTS.to_i # Repository virtual disk: file and size (GB). #REPODISK = "ogRepo.vdi" #REPOSIZE = 50 # Amount of memory for server and clients (MB) SERVERMEM = 1536 # Minimum: 512 CLIENTMEM = 512 # Minimum: 256 # Prefixes for MAC and IP addresses. MACPREFIX = ENV['OGN_MAC_PREFIX'] || "08:00:27:0E:65" NETPREFIX = ENV['OGN_NET_PREFIX'] || "192.168.2" # OpenGnsys Server IP address. SERVERIP = "#{NETPREFIX}.10" # Local port to access OpenGnsys Server. LOCALWEBPORT = 8443 # OpenGnsys Server provisioning script: prepare repo disk, install OpenGnsys, change default interface, configure DHCP server. OGSERVERSCRIPT = <> /etc/hosts # Exit if OpenGnsys is installed. [ -f /opt/opengnsys/doc/VERSION.json ] && echo "Cannot provision, OpenGnsys is already installed." && exit 1 #echo Creating a repository disk #if [ -z "$(blkid /dev/mapper/og-images | grep ext4)" ]; then # 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. if which curl &>/dev/null; then DOWNLOAD="curl -s" elif which wget &>/dev/null; then DOWNLOAD="wget -q -O -" fi if [[ -f /install-from-repo/opengnsys_installer_devel_esxi.sh ]]; then ## installer will have REMOTE=1. Usage: cp installer/opengnsys_installer_devel_esxi.sh .; VAGRANT_VAGRANTFILE=installer/vagrant/Vagrantfile-1.1.1d-vbox INSTALL_FROM_REPO=. vagrant up ogAdministrator; rm -f opengnsys_installer_devel_esxi.sh /install-from-repo/opengnsys_installer_devel_esxi.sh || exit $? elif [[ -f /install-from-repo/installer/opengnsys_installer_devel_esxi.sh ]]; then ## installer will have REMOTE=0. Usage: VAGRANT_VAGRANTFILE=installer/vagrant/Vagrantfile-1.1.1d-vbox INSTALL_FROM_REPO=. vagrant up ogAdministrator /install-from-repo/installer/opengnsys_installer_devel_esxi.sh || exit $? else BRANCH="opengnsys-#{OGVERSION}" $DOWNLOAD "https://raw.githubusercontent.com/opengnsys/OpenGnsys/$BRANCH/installer/opengnsys_installer.sh" | bash || exit $? fi [ -e /opt/opengnsys/log/bash.log ] && mv /opt/opengnsys/log/bash.log /opt/opengnsys/log/opengnsys_installer.log echo y | /opt/opengnsys/bin/setserveraddr $(ip -o link show | tail -1 | cut -d: -f2) # Insert DHCP data. sed -i "/^}$/ i host modelo { hardware ethernet #{MACPREFIX}:FF; fixed-address #{NETPREFIX}.199; }" /etc/dhcp/dhcpd.conf 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. #echo Setting up language and locales #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. echo Creating an aula and some clients SQL="INSERT INTO aulas (nombreaula, idcentro, urlfoto, grupoid, ubicacion, puestos, modomul, ipmul, pormul, velmul, router, netmask, ntp, dns, proxy, modp2p, timep2p) VALUES ('Aula virtual', 1, 'aula.jpg', 0, 'Despliegue virtual con Vagrant.', 5, 2, '239.194.2.11', 9000, 70, '#{SERVERIP}', '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 ('modelo', '#{NETPREFIX}.199', REPLACE('#{MACPREFIX}FF',':',''), 1, 1, 0, 0, 0, 0, '#{SERVERIP}', '255.255.255.0', '00unknown', 'eth0', 'generic', 'fotoordenador.gif')," for ((i=11; i<=#{NCLIENTS+10}; i++)); do SQL="$SQL ('pc$i', '#{NETPREFIX}.$i', REPLACE('#{MACPREFIX}$i',':',''), 1, 1, 0, 0, 0, 0, '#{SERVERIP}', '255.255.255.0', '00unknown', 'eth0', 'generic', 'fotoordenador.gif')," done mysql -u usuog -ppassusuog -D ogAdmBD -e "${SQL%,}" /opt/opengnsys/bin/setclientmode ogLiveAdmin modelo PERM #/opt/opengnsys/bin/setclientmode ogLiveAdmin pc11 PERM #for ((i=12; i<=#{NCLIENTS+10}; i++)); do # /opt/opengnsys/bin/setclientmode ogLive pc$i PERM #done echo "Giving internet connectivity to clients, required to install ogagent's pyqt6 dependencies" iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE echo 1 >/proc/sys/net/ipv4/ip_forward echo "Notes:" echo "- OpenGnsys Server URL: https://localhost:#{LOCALWEBPORT}/opengnsys/" exit 0 EOT # Client 1 OS provisioning script. MODELSCRIPT = </etc/sudoers.d/qindel ## don't point to systemd's resolver, as there's no systemd in oglive rm /etc/resolv.conf cat >/etc/resolv.conf </etc/netplan/01-nati.yaml fi echo "Notes:" echo "- Now run: VBoxManage modifyvm modelo --nic1 intnet --nic2 none --macaddress1 #{MACPREFIX}FF" echo "- Afterwards, do NOT start this VM using vagrant--use this: VBoxManage startvm modelo" # 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', 'IDE Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', second_disk] end # VM base and host name. og.vm.box = "alvistack/ubuntu-24.04" 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: "#{SERVERIP}", virtualbox__intnet: true # Comment out to disable synced folder. #og.vm.synced_folder ".", "/vagrant", disabled: true if (ENV['INSTALL_FROM_REPO']) og.vm.synced_folder ENV['INSTALL_FROM_REPO'], "/install-from-repo" end # Launch provisioning script. og.vm.provision "shell", inline: OGSERVERSCRIPT end # Client 1 VM definition. config.vm.define "modelo", autostart: false do |v1| v1.vm.box = "debian/bookworm64" v1.vm.hostname = "modelo" v1.vm.network "private_network", mac: "#{MACPREFIX}FF".tr(":",""), type: "dhcp", virtualbox__intnet: true v1.vm.provider "virtualbox" do |vb| vb.name = "modelo" vb.memory = CLIENTMEM vb.cpus = 1 vb.customize ['modifyvm', :id, '--boot1', 'net', '--boot2', 'disk'] ## 2nd disk for partitioning, imaging and booting from vb.customize ['createhd', '--filename', 'modelo-8gb.vdi', '--size', 8192] vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', 'modelo-8gb.vdi'] 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