summaryrefslogtreecommitdiffstats
path: root/core/modules/vbox-src/data/opt/openslx/vmchooser/plugins/virtualbox/includes/finalize_machine_config.inc
blob: d0e4f75f824e3d3898eed4dfa1d86b4529e6a549 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
################################################################################
# Include: write final machine configuration file                              #
################################################################################

setup_disk_image() {
	# set read-only image path and uuid
	set_attr \
		"/VirtualBox/Machine/MediaRegistry/HardDisks/HardDisk" \
		"location" "${VBOX_HDD_LINK}"
	set_attr \
		"/VirtualBox/Machine/MediaRegistry/HardDisks/HardDisk" \
		"uuid" "{${HDD_UUID}}"
	

	# add a HardDisk node for the snapshot
	add_node \
		"/VirtualBox/Machine/MediaRegistry/HardDisks/HardDisk" "HardDisk" \
		"uuid={${SNAPSHOT_UUID}}" \
		"location=$VBOX_SNAPSHOT_DIR/{${SNAPSHOT_UUID}}.vdi" \
		"format=VDI" \
		"type=Normal"

	# set snapshot dir
	set_attr "/VirtualBox/Machine" "snapshotFolder" "${VBOX_SNAPSHOT_DIR}"

	# set snapshot uuid
	# there should only be exactly one <AttachedDevice> node from the xml
	# retrieved from the server

	set_attr \
		"/VirtualBox/Machine/StorageControllers/StorageController/AttachedDevice/Image" \
		"uuid" "{${SNAPSHOT_UUID}}"
}

setup_floppies() {
	# add storage controller and 2 floppies to it
	add_node \
		"/VirtualBox/Machine/StorageControllers" "StorageController" \
		"name=Floppy" \
		"type=I82078" \
		"PortCount=1" \
		"useHostIOCache=true"
	add_node \
		'/VirtualBox/Machine/StorageControllers/StorageController[@name="Floppy"]' "AttachedDevice" \
		"type=Floppy" \
		"hotpluggable=false" \
		"port=0" \
		"device=0"
	add_node \
		'/VirtualBox/Machine/StorageControllers/StorageController[@name="Floppy"]' "AttachedDevice" \
		"type=Floppy" \
		"hotpluggable=false" \
		"port=0" \
		"device=1"

	# add the slx floppy to the second drive
	add_node \
		'/VirtualBox/Machine/StorageControllers/StorageController/AttachedDevice[@device="1"]' "Image" \
		"uuid={${SLX_FLOPPY_UUID}}"
}

setup_shared_folders() {
	# TODO common share through shared folders?
	if isempty SHARED_FOLDERS HOME_SHARE_NAME HOME_SHARE_PATH; then
		writelog "Missing information to setup shared folders."
		return 1
	fi
	add_node \
		"/VirtualBox/Machine/Hardware/SharedFolders" "SharedFolder" \
		"name=${HOME_SHARE_NAME}" \
		"hostPath=${HOME_SHARE_PATH}" \
		"writable=true" \
		"autoMount=true"
}

setup_ethernet() {
	# remove ':' from MAC address and set it to the main network adapter
	VM_MAC_ADDR="$(sed 's/://g' <<< ${VM_MAC_ADDR})"
	set_attr "/VirtualBox/Machine/Hardware/Network/Adapter" "MACAddress" "${VM_MAC_ADDR}"

	# TODO bridge other nics
}

setup_cpu_ram() {
	# set vm's memory
	set_attr "/VirtualBox/Machine/Hardware/Memory" "RAMSize" "${VM_MEM}"

	# set cpu cores and features
	set_attr "/VirtualBox/Machine/Hardware/CPU" "count" "${CPU_CORES}"

	# check if KVM is available and activate it if so
	if source /run/hwinfo && [ "${HW_KVM}" = "ENABLED" ]; then
		set_attr "/VirtualBox/Machine/Hardware/Paravirt" "provider" "KVM"
	fi

	# activate IOAPIC needed for multi core (?)
	if [ $CPU_CORES -gt 1 ]; then
		set_attr "/VirtualBox/Machine/Hardware/BIOS/IOAPIC" "enabled" "true"
	fi

	# PAE support?
	local PAE_SUPPORT="false"
	detect_cpu_flag "pae" && PAE_SUPPORT="true"
	set_attr "/VirtualBox/Machine/Hardware/CPU/PAE" "enabled" "${PAE_SUPPORT}"

	# LongMode?
	local LM_SUPPORT="false"
	detect_cpu_flag "lm" && LM_SUPPORT="true"
	set_attr "/VirtualBox/Machine/Hardware/CPU/LongMode" "enabled" "${LM_SUPPORT}"

	# Page size extensions?
	local PSE_SUPPORT="false"
	detect_cpu_flag "pse" && PSE_SUPPORT="true"
	set_attr "/VirtualBox/Machine/Hardware/CPU/HardwareVirtExLargePages" "enabled" "${PSE_SUPPORT}"
}

setup_usb() {
	## Currently not used
	# EXPERIMENTAL: check for USB 3 support and activate it
	local XHCI_OK="$(lsusb -t | grep xhci)"
	if [ -n "$XHCI_OK" ]; then
		# Afaik, there is no way to configure more than one USB controller
		# through the GUI, but it is technically possible through xml editing.
		# To avoid potential problems, we only add a xHCI controller
		# and delete the others, just as the GUI would configure it.
		if node_exists "/VirtualBox/Machine/Hardware/USB"; then
			del_node "/VirtualBox/Machine/Hardware/USB"
			add_node "/VirtualBox/Machine/Hardware/USB/Controllers" "Controller" "name=xHCI" "type=XHCI"
		fi
	fi
}

setup_sound() {
	# force ALSA driver for now and change when others become available
	set_attr "/VirtualBox/Machine/Hardware/AudioAdapter" "driver" "ALSA"
}

finalize_machine_config() {

	# set the generated machine uuid
	set_attr "/VirtualBox/Machine" "uuid" "{${MACHINE_UUID}}"

	setup_disk_image
	setup_floppies
	setup_ethernet
	setup_cpu_ram
	setup_sound
	notempty VBOX_SHARED_FOLDERS && setup_shared_folders

	if ! cp -p "$TMPCONFIG" "$VBOX_MACHINE_CONFIG"; then
		writelog "Could not copy '$TMPCONFIG' to '$VBOX_MACHINE_CONFIG'!"
	fi
}

call_post_source finalize_machine_config