diff --git a/LIBVIRT_README.md b/LIBVIRT_README.md
new file mode 100644
index 0000000..8240618
--- /dev/null
+++ b/LIBVIRT_README.md
@@ -0,0 +1,55 @@
+# Detection Lab Libvirt build
+
+## Intro
+
+This page contains the instruction to build DetectionLab for Qemu/LibVirt. This is the provider for you *if*:
+* You are familiar with LibVirt, virt-manager and Qemu and prefer this software stack instead of VirtualBox
+* You are willing to spend a bit more time thinkering with the build process as it is less hands-off than the official DetectionLab
+
+A [step-by-step guide is available here](https://selorasec.wordpress.com/2019/12/03/ad-in-a-box-for-pocs-and-iocs-on-the-cheap-detectionlab-on-libvirt/#Setting_Up_Vagrant).
+
+## Prequisite
+### LibVirt
+
+The `libvirt` and `virt-manager` installation walkthrough and documentation is out of scope of this project. To follow along, you need an already working installation of `libvirt`, `virt-manager`, and `QEMU+kvm`.
+
+### Packer
+
+1. The [Virtio drivers](https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/) ISO needs to be location in the `DetectionLab/Packer/` directory.
+
+* This is a direct [link to the latest version of the virtio drivers ISO](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso).
+* There's also a "stable" version available [here](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso).
+
+2. Edit the windows_X.json files
+* Make sure the following user-defined variables are pointing to the right thing:
+ * `virtio_win_iso` : The ISO containing thethe lastest VirtIO drivers
+ * `packer_build_dir` : Where to output the QCOW2 images. It's a temporary directory, the .box files will still be in DetectionLab/Packer
+
+3. Build the images
+```
+env TMPDIR=/path/to/large/storage/ PACKER_LOG=1 PACKER_LOG_PATH="packer_build.log" packer build --only=qemu windows_2016.json
+env TMPDIR=/path/to/large/storage/ PACKER_LOG=1 PACKER_LOG_PATH="packer_build.log" packer build --only=qemu windows_10.json
+```
+
+### Vagrant
+1. Install the necessary plugins:
+* `vagrant plugin install vagrant-reload vagrant-libvirt vagrant-winrm-syncedfolders`
+* See the guide for ubuntu as the vagrant packages comes with a ton on unofficial & outdated plugins that will cause problems
+2. Add the previously built windows .box files
+* `vagrant box add windows_10_libvirt.box --name windows_10_libvirt`
+* `vagrant box add windows_2016_libvirt.box --name windows_2016_libvirt`
+3. Build: `vagrant up --provider libvirt --no-parallel --provision`
+
+#### Notes:
+The libvirt builder is highly experimental. This sections describes the tradeoffs and the differences between the vanilla DetectionLab.
+
+- No pre-built images and integration with the build.sh script for now. This means building the Windows base boxes with Packer (> 1h) and provisioning with Vagrant manually (> 1h). Fortunately, the process is relatively straightforward.
+- The boxes will have two network adapters
+The vagrant-libvirt provider works by binding to a "management" network adapter IP addresses. The way vagrant finds the VM's IP address is by probing the dnsmasq lease file of libvirt's host. There's probably a better way, but this is the best I could do that just works (tm) so far. Here's what the configuration looks like:
+
+* Management Network: Isolated network, no NAT, no internet access, with DHCP.
+* Detectionlab Network: 192.168.38.0/24, with NAT, with internet access, with DHCP.
+
+- The synced folder is using an old, slow and buggy plugin. While this barely works, it's enough to push the provisioning scripts to the Windows instances. Any modifications to the `vm.synced_folder` in the VagrantFile libvirt provider will likely break the provisionning process
+
+- The graphical and input settings assume the use of virt-manager with the SPICE viewer on Windows and the VNC viewer on Linux (logger). The spice agent for copy/pasting and other quality of life improvement, like auto-resolution changes is *NOT* installed on the Windows hosts. *Guacamole* is a better way to access your VMs.
diff --git a/Packer/answer_files/10_virtio/Autounattend.xml b/Packer/answer_files/10_virtio/Autounattend.xml
new file mode 100755
index 0000000..6d9add4
--- /dev/null
+++ b/Packer/answer_files/10_virtio/Autounattend.xml
@@ -0,0 +1,275 @@
+
+
+
+
+
+
+
+ E:\viostor\w10\amd64
+
+
+ E:\vioscsi\w10\amd64
+
+
+ E:\NetKVM\w10\amd64
+
+
+ E:\Baloon\w10\amd64
+
+
+ E:\pvpanic\w10\amd64
+
+
+ E:\qxldod\w10\amd64
+
+
+
+
+
+
+
+
+
+ 1
+ Primary
+ true
+
+
+
+
+ false
+ NTFS
+ C
+ 1
+ 1
+
+
+
+ 0
+ true
+
+ OnError
+
+
+ true
+ Vagrant
+ Vagrant
+
+
+
+
+ NPPR9-FWDCX-D2C8J-H872K-2YT43
+ Never
+
+
+
+
+
+ 0
+ 1
+
+ OnError
+ false
+
+
+ /IMAGE/NAME
+ Windows 10 Enterprise Evaluation
+
+
+
+
+
+
+
+ en-US
+
+ en-US
+ en-US
+ en-US
+ en-US
+ en-US
+
+
+
+
+ false
+
+
+
+
+ en-US
+ en-US
+ en-US
+ en-US
+
+
+
+
+ vagrant
+ true
+
+
+
+
+ vagrant
+ true
+
+ Vagrant User
+ vagrant
+ administrators
+ vagrant
+
+
+
+
+ true
+ true
+ Home
+ 1
+
+
+
+ vagrant
+ true
+
+ vagrant
+ true
+
+
+
+ cmd.exe /c powershell -Command "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force"
+ Set Execution Policy 64 Bit
+ 1
+ true
+
+
+ C:\Windows\SysWOW64\cmd.exe /c powershell -Command "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force"
+ Set Execution Policy 32 Bit
+ 2
+ true
+
+
+ cmd.exe /c reg add "HKLM\System\CurrentControlSet\Control\Network\NewNetworkWindowOff"
+ Network prompt
+ 3
+ true
+
+
+ cmd.exe /c C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\fixnetwork.ps1
+ Fix public network
+ 4
+ true
+
+
+ C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\disable-winrm.ps1
+ Disable WinRM
+ 5
+ true
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ /v HideFileExt /t REG_DWORD /d 0 /f
+ 6
+ Show file extensions in Explorer
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f
+ 7
+ Enable QuickEdit mode
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ /v Start_ShowRun /t REG_DWORD /d 1 /f
+ 8
+ Show Run command in Start Menu
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ /v StartMenuAdminTools /t REG_DWORD /d 1 /f
+ 9
+ Show Administrative Tools in Start Menu
+
+
+ %SystemRoot%\System32\reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Control\Power\ /v HibernateFileSizePercent /t REG_DWORD /d 0 /f
+ 10
+ Zero Hibernation File
+
+
+ %SystemRoot%\System32\reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Control\Power\ /v HibernateEnabled /t REG_DWORD /d 0 /f
+ 11
+ Disable Hibernation Mode
+
+
+ cmd.exe /c wmic useraccount where "name='vagrant'" set PasswordExpires=FALSE
+ 12
+ Disable password expiration for vagrant user
+
+
+ %SystemRoot%\System32\reg.exe ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "vagrant" /f
+ 13
+ Enable AutoLogon
+
+
+ %SystemRoot%\System32\reg.exe ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f
+ 14
+ Enable AutoLogon
+
+
+
+ cmd.exe /c C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\enable-winrm.ps1
+ Enable WinRM
+ 99
+
+
+
+
+
+
+ false
+
+
+
+
+
+ false
+
+
+ vagrant-10
+ Pacific Standard Time
+
+
+
+ true
+
+
+ true
+
+
+
+
diff --git a/Packer/answer_files/2016_virtio/Autounattend.xml b/Packer/answer_files/2016_virtio/Autounattend.xml
new file mode 100755
index 0000000..1152963
--- /dev/null
+++ b/Packer/answer_files/2016_virtio/Autounattend.xml
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+ E:\viostor\2k16\amd64
+
+
+ E:\vioscsi\2k16\amd64
+
+
+ E:\NetKVM\2k16\amd64
+
+
+ E:\Baloon\2k16\amd64
+
+
+ E:\pvpanic\2k16\amd64
+
+
+ E:\qxldod\2k16\amd64
+
+
+
+
+
+
+ en-US
+
+ en-US
+ en-US
+ en-US
+ en-US
+ en-US
+
+
+
+
+
+
+ Primary
+ 1
+ 350
+
+
+ 2
+ Primary
+ true
+
+
+
+
+ true
+ NTFS
+
+ 1
+ 1
+
+
+ NTFS
+
+ C
+ 2
+ 2
+
+
+ 0
+ true
+
+
+
+
+
+
+ /IMAGE/NAME
+ Windows Server 2016 SERVERSTANDARD
+
+
+
+ 0
+ 2
+
+
+
+
+
+
+
+
+
+ OnError
+
+ true
+ Vagrant
+ Vagrant
+
+
+
+
+
+
+ false
+
+ vagrant-2016
+ Pacific Standard Time
+
+
+
+ true
+
+
+ false
+ false
+
+
+ true
+
+
+ true
+
+
+
+
+ 1
+ Set Execution Policy 64 Bit
+ cmd.exe /c powershell -Command "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force"
+
+
+ 2
+ Set Execution Policy 32 Bit
+ cmd.exe /c powershell -Command "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force"
+
+
+ 3
+ Disable WinRM
+ C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\disable-winrm.ps1
+
+
+
+
+
+
+
+
+ vagrant
+ true
+
+ true
+ vagrant
+
+
+
+ cmd.exe /c powershell -Command "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force"
+ Set Execution Policy 64 Bit
+ 1
+ true
+
+
+ C:\Windows\SysWOW64\cmd.exe /c powershell -Command "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force"
+ Set Execution Policy 32 Bit
+ 2
+ true
+
+
+ C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\disable-winrm.ps1
+ Disable WinRM
+ 3
+ true
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ /v HideFileExt /t REG_DWORD /d 0 /f
+ 4
+ Show file extensions in Explorer
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f
+ 5
+ Enable QuickEdit mode
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ /v Start_ShowRun /t REG_DWORD /d 1 /f
+ 6
+ Show Run command in Start Menu
+
+
+ %SystemRoot%\System32\reg.exe ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ /v StartMenuAdminTools /t REG_DWORD /d 1 /f
+ 7
+ Show Administrative Tools in Start Menu
+
+
+ %SystemRoot%\System32\reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Control\Power\ /v HibernateFileSizePercent /t REG_DWORD /d 0 /f
+ 8
+ Zero Hibernation File
+
+
+ %SystemRoot%\System32\reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Control\Power\ /v HibernateEnabled /t REG_DWORD /d 0 /f
+ 9
+ Disable Hibernation Mode
+
+
+ cmd.exe /c wmic useraccount where "name='vagrant'" set PasswordExpires=FALSE
+ 10
+ Disable password expiration for vagrant user
+
+
+
+ cmd.exe /c C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\enable-winrm.ps1
+ Enable WinRM
+ 99
+
+
+
+
+
+
+
+ true
+ true
+ true
+ true
+ true
+ Home
+ 1
+
+
+
+ vagrant
+ true
+
+
+
+
+ vagrant
+ true
+
+ administrators
+ Vagrant
+ vagrant
+ Vagrant User
+
+
+
+
+
+
+
+
+ false
+
+
+
+
diff --git a/Packer/answer_files/2016_virtio/Autounattend_sysprep.xml b/Packer/answer_files/2016_virtio/Autounattend_sysprep.xml
new file mode 100755
index 0000000..cb538aa
--- /dev/null
+++ b/Packer/answer_files/2016_virtio/Autounattend_sysprep.xml
@@ -0,0 +1,49 @@
+
+
+
+
+ 0
+
+
+ false
+ false
+
+
+
+
+ en-US
+ en-US
+ en-US
+ en-US
+
+
+
+ true
+ 1
+ Home
+ true
+
+ UTC
+
+
+ vagrant
+ true
+
+
+
+
+ vagrant
+ true
+
+ administrators
+ Vagrant
+ vagrant
+ Vagrant User
+
+
+
+
+
+
+
+
diff --git a/Packer/windows_10.json b/Packer/windows_10.json
index 524fd07..ef72bbb 100644
--- a/Packer/windows_10.json
+++ b/Packer/windows_10.json
@@ -1,5 +1,49 @@
{
"builders": [
+ {
+ "type": "qemu",
+ "vm_name":"windows_10",
+ "communicator": "winrm",
+ "iso_url": "{{user `iso_url`}}",
+ "iso_checksum_type": "{{user `iso_checksum_type`}}",
+ "iso_checksum": "{{user `iso_checksum`}}",
+ "headless": true,
+ "boot_wait": "6m",
+ "boot_command": "",
+ "winrm_username": "vagrant",
+ "winrm_password": "vagrant",
+ "winrm_timeout": "4h",
+ "shutdown_timeout": "2h",
+ "shutdown_command": "a:/sysprep.bat",
+
+ "accelerator": "kvm",
+ "disk_size": "{{user `disk_size`}}",
+
+ "output_directory": "{{ user `packer_build_dir`}}",
+
+ "qemuargs": [
+ [ "-m", "2048"],
+ [ "-smp", "2"],
+ [ "-drive", "file={{ user `virtio_win_iso` }},media=cdrom,index=3" ],
+ [ "-drive", "file={{ user `packer_build_dir`}}/{{ .Name }},if=virtio,cache=writeback,discard=ignore,format=qcow2,index=1" ]
+ ],
+
+ "floppy_files": [
+ "{{user `autounattend_virtio`}}",
+ "./floppy/WindowsPowershell.lnk",
+ "./floppy/PinTo10.exe",
+ "./scripts/fixnetwork.ps1",
+ "./scripts/rearm-windows.ps1",
+ "./scripts/disable-screensaver.ps1",
+ "./scripts/disable-winrm.ps1",
+ "./scripts/enable-winrm.ps1",
+ "./scripts/microsoft-updates.bat",
+ "./scripts/win-updates.ps1",
+ "./scripts/unattend.xml",
+ "./scripts/sysprep.bat"
+ ]
+
+ },
{
"type": "vmware-iso",
"vm_name":"windows_10",
@@ -141,6 +185,11 @@
"iso_checksum_type": "sha256",
"iso_url": "https://software-download.microsoft.com/download/pr/18362.30.190401-1528.19h1_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso",
"autounattend": "./answer_files/10/Autounattend.xml",
- "disk_size": "61440"
+ "disk_size": "61440",
+ "virtio_win_iso": "./virtio-win.iso",
+ "autounattend_virtio": "./answer_files/10_virtio/Autounattend.xml",
+ "packer_build_dir": "/media/packer_build_dir/win10"
+ }
+}
}
}
diff --git a/Packer/windows_2016.json b/Packer/windows_2016.json
index 967f465..5592854 100644
--- a/Packer/windows_2016.json
+++ b/Packer/windows_2016.json
@@ -1,5 +1,48 @@
{
"builders": [
+ {
+ "type": "qemu",
+ "vm_name":"windows_10",
+ "communicator": "winrm",
+ "iso_url": "{{user `iso_url`}}",
+ "iso_checksum_type": "{{user `iso_checksum_type`}}",
+ "iso_checksum": "{{user `iso_checksum`}}",
+ "headless": false,
+ "boot_wait": "6m",
+ "boot_command": "",
+ "winrm_username": "vagrant",
+ "winrm_password": "vagrant",
+ "winrm_timeout": "4h",
+ "shutdown_command": "shutdown /s /t 10 /f /d p:4:1 /c \"Packer Shutdown\"",
+
+ "cpus": "2",
+ "memory": "2048",
+ "accelerator": "kvm",
+ "disk_size": "{{user `disk_size`}}",
+
+ "output_directory": "{{ user `packer_build_dir`}}",
+
+ "qemuargs": [
+ [ "-drive", "file={{ user `virtio_win_iso` }},media=cdrom,index=3" ],
+ [ "-drive", "file={{ user `packer_build_dir`}}/{{ .Name }},if=virtio,cache=writeback,discard=ignore,format=qcow2,index=1" ]
+ ],
+
+ "floppy_files": [
+ "{{user `autounattend_virtio`}}",
+ "./floppy/WindowsPowershell.lnk",
+ "./floppy/PinTo10.exe",
+ "./scripts/fixnetwork.ps1",
+ "./scripts/MakeWindows10GreatAgain.ps1",
+ "./scripts/MakeWindows10GreatAgain.reg",
+ "./scripts/rearm-windows.ps1",
+ "./scripts/disable-screensaver.ps1",
+ "./scripts/disable-winrm.ps1",
+ "./scripts/enable-winrm.ps1",
+ "./scripts/microsoft-updates.bat",
+ "./scripts/win-updates.ps1"
+ ]
+
+ },
{
"vm_name":"WindowsServer2016",
"type": "vmware-iso",
diff --git a/Terraform/locals.tf b/Terraform/locals.tf
index f2b5fd1..380edb7 100644
--- a/Terraform/locals.tf
+++ b/Terraform/locals.tf
@@ -4,4 +4,3 @@ locals {
ata_url = "https://${aws_instance.wef.public_ip}"
guacamole_url = "http://${aws_instance.logger.public_ip}:8080/guacamole"
}
-
diff --git a/Vagrant/Vagrantfile b/Vagrant/Vagrantfile
index b63a906..cce7dc4 100644
--- a/Vagrant/Vagrantfile
+++ b/Vagrant/Vagrantfile
@@ -1,7 +1,26 @@
+libvirt_win10_box = "../Boxes/windows_10_libvirt.box"
+libvirt_win2016_box = "../Boxes/windows_2016_libvirt.box"
+
Vagrant.configure("2") do |config|
+ config.vm.provider "libvirt" do |libvirt|
+ # This is required for Vagrant to properly configure the network interfaces.
+ # See libvirt's README section for more information
+
+ libvirt.management_network_name = "VagrantMgmt"
+ libvirt.management_network_address = "192.168.123.0/24"
+ libvirt.management_network_mode = "none"
+
+ libvirt.cpu_mode = "host-passthrough"
+
+ # Which storage pool path to use. Default to /var/lib/libvirt/images or ~/.local/share/libvirt/images depending on if you are running a system or user QEMU/KVM session.
+ #libvirt.storage_pool_path = '/media/storage_nvme/system_session_vm_pool'
+ libvirt.storage_pool_name = 'default'
+ end
+
config.vm.define "logger" do |cfg|
- cfg.vm.box = "bento/ubuntu-18.04"
+ cfg.vm.box = "generic/ubuntu1604"
+
cfg.vm.hostname = "logger"
cfg.vm.provision :shell, path: "bootstrap.sh"
cfg.vm.network :private_network, ip: "192.168.38.105", gateway: "192.168.38.1", dns: "8.8.8.8"
@@ -24,6 +43,17 @@ Vagrant.configure("2") do |config|
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["setextradata", "global", "GUI/SuppressMessages", "all" ]
end
+
+ cfg.vm.provider "libvirt" do |lv, override|
+ lv.graphics_type = "vnc"
+ lv.video_type = "vga"
+ lv.input :type => "tablet", :bus => "usb"
+ lv.video_vram = 32768
+ lv.memory = 4096
+ lv.cpus = 2
+
+ override.vm.synced_folder './', '/vagrant', type: 'rsync'
+ end
end
config.vm.define "dc" do |cfg|
@@ -35,9 +65,10 @@ Vagrant.configure("2") do |config|
cfg.winrm.basic_auth_only = true
cfg.winrm.timeout = 300
cfg.winrm.retry_limit = 20
- cfg.vm.network :private_network, ip: "192.168.38.102", gateway: "192.168.38.1"
+ cfg.vm.network :private_network, ip: "192.168.38.102", gateway: "192.168.38.1", dns: "8.8.8.8"
- cfg.vm.provision "shell", path: "scripts/fix-second-network.ps1", privileged: false, args: "192.168.38.102"
+ # Added DNS here because libvirt fails to properly configure the windows client otherwise... :(
+ cfg.vm.provision "shell", path: "scripts/fix-second-network.ps1", privileged: true, args: "-ip 192.168.38.102 -dns 8.8.8.8 -gateway 192.168.38.1"
cfg.vm.provision "shell", path: "scripts/provision.ps1", privileged: false
cfg.vm.provision "reload"
cfg.vm.provision "shell", path: "scripts/provision.ps1", privileged: false
@@ -77,6 +108,26 @@ Vagrant.configure("2") do |config|
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["setextradata", "global", "GUI/SuppressMessages", "all" ]
end
+
+ cfg.vm.provider "libvirt" do |lv, override|
+ lv.graphics_type = "spice"
+ lv.video_type = "qxl"
+ lv.input :type => "tablet", :bus => "usb"
+
+ override.vm.box = libvirt_win2016_box
+ lv.video_vram = 32768
+ lv.memory = 3072
+ lv.cpus = 2
+ # This is NOT the right semantic for Vagrant synced folder. It's a dirty hack around :
+ # https://github.com/Cimpress-MCP/vagrant-winrm-syncedfolders/issues/11
+ # If dest is /vagrant, it'll upload in C:\vagrant\Vagrant....
+ # It's like 'cp /my/dir /my/dir2' vs 'cp /my/dir /my/dir2/'
+ #
+ # The Winrm synced folder plugin is also excruciatingly slow. Would gladly replace with something else
+ # that works with linux host and windows guest...
+
+ override.vm.synced_folder '.', '/', type: 'winrm'
+ end
end
config.vm.define "wef" do |cfg|
@@ -89,7 +140,7 @@ Vagrant.configure("2") do |config|
cfg.winrm.retry_limit = 20
cfg.vm.network :private_network, ip: "192.168.38.103", gateway: "192.168.38.1", dns: "192.168.38.102"
- cfg.vm.provision "shell", path: "scripts/fix-second-network.ps1", privileged: false, args: "-ip 192.168.38.103 -dns 192.168.38.102"
+ cfg.vm.provision "shell", path: "scripts/fix-second-network.ps1", privileged: true, args: "-ip 192.168.38.103 -dns 8.8.8.8 -gateway 192.168.38.1"
cfg.vm.provision "shell", path: "scripts/provision.ps1", privileged: false
cfg.vm.provision "shell", inline: "cscript c:\\windows\\system32\\slmgr.vbs -rearm", privileged: false
cfg.vm.provision "reload"
@@ -129,6 +180,25 @@ Vagrant.configure("2") do |config|
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["setextradata", "global", "GUI/SuppressMessages", "all" ]
end
+
+ cfg.vm.provider "libvirt" do |lv, override|
+ lv.graphics_type = "spice"
+ lv.video_type = "qxl"
+ lv.input :type => "tablet", :bus => "usb"
+ override.vm.box = libvirt_win2016_box
+ lv.video_vram = 32768
+ lv.memory = 2048
+ lv.cpus = 2
+ # This is NOT the right semantic for Vagrant synced folder. It's a dirty hack around :
+ # https://github.com/Cimpress-MCP/vagrant-winrm-syncedfolders/issues/11
+ # If dest is /vagrant, it'll upload in C:\vagrant\Vagrant....
+ # It's like 'cp /my/dir /my/dir2' vs 'cp /my/dir /my/dir2/'
+ #
+ # The Winrm synced folder plugin is also excruciatingly slow. Would gladly replace with something else
+ # that works with linux host and windows guest...
+
+ override.vm.synced_folder '.', '/', type: 'winrm'
+ end
end
config.vm.define "win10" do |cfg|
@@ -141,7 +211,7 @@ Vagrant.configure("2") do |config|
cfg.winrm.retry_limit = 20
cfg.vm.network :private_network, ip: "192.168.38.104", gateway: "192.168.38.1", dns: "192.168.38.102"
- cfg.vm.provision "shell", path: "scripts/fix-second-network.ps1", privileged: false, args: "-ip 192.168.38.104 -dns 192.168.38.102"
+ cfg.vm.provision "shell", path: "scripts/fix-second-network.ps1", privileged: true, args: "-ip 192.168.38.104 -dns 8.8.8.8 -gateway 192.168.38.1"
cfg.vm.provision "shell", path: "scripts/MakeWindows10GreatAgain.ps1", privileged: false
cfg.vm.provision "shell", path: "scripts/provision.ps1", privileged: false
cfg.vm.provision "shell", inline: "cscript c:\\windows\\system32\\slmgr.vbs -rearm", privileged: false
@@ -178,5 +248,23 @@ Vagrant.configure("2") do |config|
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["setextradata", "global", "GUI/SuppressMessages", "all" ]
end
+ cfg.vm.provider "libvirt" do |lv, override|
+ lv.graphics_type = "spice"
+ lv.video_type = "qxl"
+ lv.input :type => "tablet", :bus => "usb"
+ override.vm.box = libvirt_win10_box
+ lv.video_vram = 32768
+ lv.memory = 2048
+ lv.cpus = 2
+ # This is NOT the right semantic for Vagrant synced folder. It's a dirty hack around :
+ # https://github.com/Cimpress-MCP/vagrant-winrm-syncedfolders/issues/11
+ # If dest is /vagrant, it'll upload in C:\vagrant\Vagrant....
+ # It's like 'cp /my/dir /my/dir2' vs 'cp /my/dir /my/dir2/'
+ #
+ # The Winrm synced folder plugin is also excruciatingly slow. Would gladly replace with something else
+ # that works with linux host and windows guest...
+
+ override.vm.synced_folder '.', '/', type: 'winrm'
+ end
end
end
diff --git a/Vagrant/bootstrap.sh b/Vagrant/bootstrap.sh
index 906f5a2..e121e8e 100644
--- a/Vagrant/bootstrap.sh
+++ b/Vagrant/bootstrap.sh
@@ -57,6 +57,11 @@ test_prerequisites() {
}
fix_eth1_static_ip() {
+ USING_KVM=$(sudo lsmod | grep kvm)
+ if [ ! -z "$USING_KVM" ]; then
+ echo "[*] Using KVM, no need to fix DHCP for eth1 iface"
+ return 0
+ fi
# There's a fun issue where dhclient keeps messing with eth1 despite the fact
# that eth1 has a static IP set. We workaround this by setting a static DHCP lease.
echo -e 'interface "eth1" {
diff --git a/Vagrant/scripts/fix-second-network.ps1 b/Vagrant/scripts/fix-second-network.ps1
index 4c199cc..d38f7fe 100755
--- a/Vagrant/scripts/fix-second-network.ps1
+++ b/Vagrant/scripts/fix-second-network.ps1
@@ -1,10 +1,32 @@
# Source: https://github.com/StefanScherer/adfs2
-param ([String] $ip, [String] $dns)
+param ([String] $ip, [String] $dns, [String] $gateway)
-if (! (Test-Path 'C:\Program Files\VMware\VMware Tools')) {
+if ( (Get-NetAdapter | Select-Object -First 1 | Select-Object -ExpandProperty InterfaceDescription).Contains('Red Hat VirtIO')) {
+ Write-Host "Setting Network Configuration for LibVirt interface"
+ $subnet = $ip -replace "\.\d+$", ""
+ $name = (Get-NetIPAddress -AddressFamily IPv4 `
+ | Where-Object -FilterScript { ($_.IPAddress).StartsWith("$subnet") } `
+ ).InterfaceAlias
+ if ($name) {
+ Write-Host "Set IP address to $ip of interface $name"
+ & netsh.exe int ip set address "$name" static $ip 255.255.255.0 "$gateway"
+ if ($dns) {
+ Write-Host "Set DNS server address to $dns of interface $name"
+ & netsh.exe interface ipv4 add dnsserver "$name" address=$dns index=1
+ }
+ } else {
+ Write-Error "Could not find a interface with subnet $subnet.xx"
+ }
+
+ exit 0
+}
+
+if (! (Test-Path 'C:\Program Files\VMware\VMware Tools') ) {
Write-Host "Nothing to do for other providers than VMware."
exit 0
}
+
+
Write-Host "$('[{0:HH:mm}]' -f (Get-Date))"
Write-Host "Setting IP address and DNS information for the Ethernet1 interface"
Write-Host "If this step times out, it's because vagrant is connecting to the VM on the wrong interface"