summaryrefslogtreecommitdiff
path: root/src/VBox/Installer/linux/installer-common.sh
blob: 5bb51b8d50a59ba66e619080e44ccc0c77434054 (plain)
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
}