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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
# Oracle VM VirtualBox
# VirtualBox installer shell routines
#
# Copyright (C) 2007-2011 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
# you can redistribute it and/or modify it under the terms of the GNU
# General Public License (GPL) as published by the Free Software
# Foundation, in version 2 as it comes in the "COPYING" file of the
# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
#
## @todo Make this file into a script in the VirtualBox lib directory once
# enough code has been made shared between the different installers.
# This is used for unit testing and will be reset after the file is sourced for
# test runs.
unset EXTERN
udev_write_vboxdrv() {
VBOXDRV_GRP="$1"
VBOXDRV_MODE="$2"
echo "KERNEL==\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"$VBOXDRV_GRP\", MODE=\"$VBOXDRV_MODE\""
echo "KERNEL==\"vboxdrvu\", NAME=\"vboxdrvu\", OWNER=\"root\", GROUP=\"root\", MODE=\"0666\""
echo "KERNEL==\"vboxnetctl\", NAME=\"vboxnetctl\", OWNER=\"root\", GROUP=\"$VBOXDRV_GRP\", MODE=\"$VBOXDRV_MODE\""
}
udev_write_usb() {
INSTALLATION_DIR="$1"
USB_GROUP="$2"
echo "SUBSYSTEM==\"usb_device\", ACTION==\"add\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}${USB_GROUP}\""
echo "SUBSYSTEM==\"usb\", ACTION==\"add\", ENV{DEVTYPE}==\"usb_device\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}${USB_GROUP}\""
echo "SUBSYSTEM==\"usb_device\", ACTION==\"remove\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\""
echo "SUBSYSTEM==\"usb\", ACTION==\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\""
}
generate_udev_rule() {
VBOXDRV_GRP="$1" # The group owning the vboxdrv device
VBOXDRV_MODE="$2" # The access mode for the vboxdrv device
INSTALLATION_DIR="$3" # The directory VirtualBox is installed in
USB_GROUP="$4" # The group that has permission to access USB devices
NO_INSTALL="$5" # Set this to "1" to remove but not re-install rules
UDEV_STRING="$6" # The output of the udev version command
# Extra space!
case "$USB_GROUP" in ?*) USB_GROUP=" $USB_GROUP" ;; esac
case "$NO_INSTALL" in
"1") ;;
*)
udev_ver=`expr "$UDEV_STRING" : '[^0-9]*\([0-9]*\)'`
udev_fix=""
test "$udev_ver" = "" -o "$udev_ver" -lt 55 &&
udev_fix="1"
udev_do_usb=""
test "$udev_ver" -ge 59 &&
udev_do_usb="1"
case "$udev_fix" in
"1")
udev_write_vboxdrv "$VBOXDRV_GRP" "$VBOXDRV_MODE" |
sed 's/\([^+=]*\)[+=]*\([^"]*"[^"]*"\)/\1=\2/g'
;;
*)
udev_write_vboxdrv "$VBOXDRV_GRP" "$VBOXDRV_MODE"
case "$udev_do_usb" in "1")
udev_write_usb "$INSTALLATION_DIR" "$USB_GROUP" ;;
esac
;;
esac
;;
esac
}
install_udev() {
# install udev rule (disable with INSTALL_NO_UDEV=1 in /etc/default/virtualbox) for distribution packages
VBOXDRV_GRP="$1" # The group owning the vboxdrv device
VBOXDRV_MODE="$2" # The access mode for the vboxdrv device
INSTALLATION_DIR="$3" # The directory VirtualBox is installed in
USB_GROUP="$4" # The group that has permission to access USB devices
NO_INSTALL="$5" # Set this to "1" to remove but not re-install rules
if test -d /etc/udev/rules.d; then
udev_out="`udevadm version 2>/dev/null || udevinfo -V 2>/dev/null`"
generate_udev_rule "$VBOXDRV_GRP" "$VBOXDRV_MODE" "$INSTALLATION_DIR" \
"$USB_GROUP" "$NO_INSTALL" "$udev_out"
fi
# Remove old udev description file
rm -f /etc/udev/rules.d/10-vboxdrv.rules 2> /dev/null
}
# Add a unit test if/when needed following the same pattern as for
# install_udev.
install_create_usb_node_for_sysfs() {
# Create a usb device node for a given sysfs path
path="$1" # sysfs path for the device
usb_createnode="$2" # Path to the USB device node creation script
usb_group="$3" # The group to give ownership of the node to
if $EXTERN test -r "${path}/dev"; then
dev="`$EXTERN cat "${path}/dev" 2> /dev/null`"
major="`expr "$dev" : '\(.*\):' 2> /dev/null`"
minor="`expr "$dev" : '.*:\(.*\)' 2> /dev/null`"
class="`$EXTERN cat ${path}/bDeviceClass 2> /dev/null`"
$EXTERN sh "${usb_createnode}" "$major" "$minor" "$class" \
"${usb_group}" 2>/dev/null
fi
}
# install_device_node_setup contains some aliases for unit testing purposes. # Set them to their normal values here.
udev_rule_file=/etc/udev/rules.d/60-vboxdrv.rules # Set this to /dev/null
# for unit testing
sysfs_usb_devices="/sys/bus/usb/devices/*"
install_device_node_setup() {
# Install udev rules and create device nodes for usb access
# To unit test, set $EXTERN to point to a function simulating these
# functions (defined further up in this file): install_udev;
# install_create_usb_node_for_sysfs. See the code for usage.
VBOXDRV_GRP="$1" # The group that should own /dev/vboxdrv
VBOXDRV_MODE="$2" # The mode to be used for /dev/vboxdrv
INSTALLATION_DIR="$3" # The directory VirtualBox is installed in
USB_GROUP="$4" # The group that should own the /dev/vboxusb device
# nodes unless INSTALL_NO_GROUP=1 in
# /etc/default/virtualbox. Optional.
usb_createnode="$INSTALLATION_DIR/VBoxCreateUSBNode.sh"
# install udev rule (disable with INSTALL_NO_UDEV=1 in
# /etc/default/virtualbox)
if [ "$INSTALL_NO_GROUP" != "1" ]; then
usb_group=$USB_GROUP
vboxdrv_group=$VBOXDRV_GRP
else
usb_group=root
vboxdrv_group=root
fi
$EXTERN install_udev "${vboxdrv_group}" "$VBOXDRV_MODE" \
"$INSTALLATION_DIR" "${usb_group}" \
"$INSTALL_NO_UDEV" > ${udev_rule_file}
# Build our device tree
for i in ${sysfs_usb_devices}; do # This line intentionally without quotes.
$EXTERN install_create_usb_node_for_sysfs "$i" "${usb_createnode}" \
"${usb_group}"
done
}
set_selinux_permissions() {
# XXX SELinux: allow text relocation entries
INSTALLATION_DIR="$1" # Where the VirtualBox binaries are installed to
SHARE_DIR="$2" # Where shared bits are installed to
if [ -x /usr/bin/chcon ]; then
chcon -t texrel_shlib_t "$INSTALLATION_DIR"/*VBox* > /dev/null 2>&1
chcon -t texrel_shlib_t "$INSTALLATION_DIR"/VBoxAuth.so \
> /dev/null 2>&1
chcon -t texrel_shlib_t "$INSTALLATION_DIR"/VirtualBox.so \
> /dev/null 2>&1
chcon -t texrel_shlib_t "$INSTALLATION_DIR"/components/VBox*.so \
> /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/VirtualBox > /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/VBoxSDL > /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/VBoxHeadless \
> /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/VBoxNetDHCP \
> /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/VBoxNetNAT \
> /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/VBoxExtPackHelperApp \
> /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/vboxwebsrv > /dev/null 2>&1
chcon -t java_exec_t "$INSTALLATION_DIR"/webtest > /dev/null 2>&1
chcon -t bin_t "$SHARE_DIR"/src/vboxhost/build_in_tmp \
> /dev/null 2>&1
fi
}
|