VirtualBox

source: vbox/trunk/src/VBox/Installer/linux/vboxnet.sh@ 4394

Last change on this file since 4394 was 4089, checked in by vboxsync, 17 years ago

Updated the Linux vboxnet init script to correctly set permissions on the tun device node

File size: 9.2 KB
Line 
1#! /bin/sh
2# innotek VirtualBox
3# Linux static host networking interface initialization
4#
5
6#
7# Copyright (C) 2007 innotek GmbH
8#
9# This file is part of VirtualBox Open Source Edition (OSE), as
10# available from http://www.virtualbox.org. This file is free software;
11# you can redistribute it and/or modify it under the terms of the GNU
12# General Public License as published by the Free Software Foundation,
13# in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14# distribution. VirtualBox OSE is distributed in the hope that it will
15# be useful, but WITHOUT ANY WARRANTY of any kind.
16
17# chkconfig: 35 30 60
18# description: VirtualBox permanent host networking setup
19#
20### BEGIN INIT INFO
21# Provides: vboxnet
22# Required-Start: $network
23# Required-Stop:
24# Default-Start: 3 5
25# Default-Stop:
26# Description: VirtualBox permanent host networking setup
27### END INIT INFO
28
29PATH=$PATH:/bin:/sbin:/usr/sbin
30CONFIG="/etc/vbox/interfaces"
31VARDIR="/var/run/VirtualBox"
32VARFILE="/var/run/VirtualBox/vboxnet"
33TAPDEV="/dev/net/tun"
34
35if [ -f /etc/redhat-release ]; then
36 system=redhat
37elif [ -f /etc/SuSE-release ]; then
38 system=suse
39elif [ -f /etc/gentoo-release ]; then
40 system=gentoo
41else
42 system=other
43fi
44
45if [ "$system" = "redhat" ]; then
46 . /etc/init.d/functions
47 fail_msg() {
48 echo_failure
49 echo
50 }
51
52 succ_msg() {
53 echo_success
54 echo
55 }
56
57 begin() {
58 echo -n "$1"
59 }
60fi
61
62if [ "$system" = "suse" ]; then
63 . /etc/rc.status
64 fail_msg() {
65 rc_failed 1
66 rc_status -v
67 }
68
69 succ_msg() {
70 rc_reset
71 rc_status -v
72 }
73
74 begin() {
75 echo -n "$1"
76 }
77fi
78
79if [ "$system" = "gentoo" ]; then
80 . /sbin/functions.sh
81 fail_msg() {
82 eend 1
83 }
84
85 succ_msg() {
86 eend $?
87 }
88
89 begin() {
90 ebegin $1
91 }
92
93 if [ "`which $0`" = "/sbin/rc" ]; then
94 shift
95 fi
96fi
97
98if [ "$system" = "other" ]; then
99 fail_msg() {
100 echo " ...fail!"
101 }
102
103 succ_msg() {
104 echo " ...done."
105 }
106
107 begin() {
108 echo -n $1
109 }
110fi
111
112fail() {
113 if [ "$system" = "gentoo" ]; then
114 eerror $1
115 exit 1
116 fi
117 fail_msg
118 echo "($1)"
119 exit 1
120}
121
122running() {
123 test -f "$VARFILE"
124}
125
126valid_ifname() {
127 if expr match "$1" "vbox[0-9][0-9]*$" > /dev/null 2>&1
128 then
129 return 0
130 else
131 return 1
132 fi
133}
134
135# Create all permanent TAP devices registered on the system, add them to a
136# bridge if required and keep a record of proceedings in the file
137# /var/run/VirtualBox/vboxnet. If this file already exists, assume that the
138# script has already been started and do nothing.
139start_network() {
140 begin "Starting VirtualBox host networking"
141 # If the service is already running, return successfully.
142 if [ -f "$VARFILE" ]
143 then
144 succ_msg
145 return 0
146 fi
147 # Fail if we can't create our runtime record file
148 if [ ! -d "$VARDIR" ]
149 then
150 if ! mkdir "$VARDIR" 2> /dev/null
151 then
152 fail_msg
153 return 1
154 fi
155 fi
156 if ! touch "$VARFILE" 2> /dev/null
157 then
158 fail_msg
159 return 1
160 fi
161 # If there is no configuration file, report success
162 if [ ! -f "$CONFIG" ]
163 then
164 succ_msg
165 return 0
166 fi
167 # Fail if we can't read our configuration
168 if [ ! -r "$CONFIG" ]
169 then
170 fail_msg
171 return 1
172 fi
173 # Fail if we don't have tunctl
174 if ! VBoxTunctl -h 2>&1 | grep VBoxTunctl > /dev/null
175 then
176 fail_msg
177 return 1
178 fi
179 succ_msg
180 # Read the configuration file entries line by line and create the
181 # interfaces
182 while read line
183 do
184 set ""$line
185 # If the line is a comment then ignore it
186 if ((! expr match "$1" "#" > /dev/null) && (! test -z "$1"))
187 then
188 # Check that the line is correctly formed (an interface name plus one
189 # or two non-comment entries, possibly followed by a comment).
190 if ((! expr match "$2" "#" > /dev/null) &&
191 (test -z "$4" || expr match "$4" "#" > /dev/null) &&
192 (valid_ifname "$1"))
193 then
194 # Try to create the interface
195 if VBoxTunctl -t "$1" -u "$2" > /dev/null 2>&1
196 then
197 # On SUSE Linux Enterprise Server, the interface does not
198 # appear immediately, so we loop trying to bring it up.
199 i=1
200 while [ $i -le 10 ]
201 do
202 ifconfig "$1" up 2> /dev/null
203 if ifconfig | grep "$1" > /dev/null 2>&1
204 then
205 # Add the interface to a bridge if one was specified
206 if [ ! -z "$3" ]
207 then
208 if brctl addif "$3" "$1" 2> /dev/null
209 then
210 echo "$1 $2 $3" > "$VARFILE"
211 else
212 echo "$1 $2" > "$VARFILE"
213 echo "Warning - failed to add interface $1 to the bridge $3"
214 fi
215 else
216 echo "$1 $2" > $VARFILE
217 fi
218 i=20
219 else
220 i=`expr $i + 1`
221 sleep .1
222 fi
223 done
224 if [ $i -ne 20 ]
225 then
226 echo "Warning - failed to bring up the interface $1"
227 fi
228 else
229 echo "Warning - failed to create the interface $1 for the user $2"
230 fi
231 else
232 echo "Warning - invalid line in $CONFIG:"
233 echo " $line"
234 fi
235 fi
236 done < "$CONFIG"
237 # Set /dev/net/tun to belong to the group vboxusers if it exists and does
238 # yet belong to a group.
239 if ls -g "$TAPDEV" 2>/dev/null | grep root
240 then
241 chgrp vboxusers "$TAPDEV"
242 chmod 0660 "$TAPDEV"
243 fi
244 return 0
245}
246
247# Shut down VirtualBox host networking and remove all permanent TAP
248# interfaces. This action will fail if some interfaces could not be removed.
249stop_network() {
250 begin "Shutting down VirtualBox host networking"
251 # If there is no runtime record file, assume that the service is not
252 # running.
253 if [ ! -f "$VARFILE" ]
254 then
255 succ_msg
256 return 0
257 fi
258 # Fail if we can't read our runtime record file or write to the
259 # folder it is located in
260 if [ ! -r "$VARFILE" -o ! -w "$VARDIR" ]
261 then
262 fail_msg
263 return 1
264 fi
265 # Fail if we don't have tunctl
266 if ! VBoxTunctl -h 2>&1 | grep VBoxTunctl > /dev/null
267 then
268 fail_msg
269 return 1
270 fi
271 # Read the runtime record file entries line by line and delete the
272 # interfaces. The format of the runtime record file is not checked for
273 # errors.
274 while read line
275 do
276 set ""$line
277 # Remove the interface from a bridge if it is part of one
278 if [ ! -z "$3" ]
279 then
280 brctl delif "$3" "$1" 2> /dev/null
281 fi
282 # Remove the interface. Roll back everything and fail if this is not
283 # possible
284 if (! ifconfig "$1" down 2> /dev/null ||
285 ! VBoxTunctl -d "$1" > /dev/null 2>&1)
286 then
287 while read line
288 do
289 set ""$line
290 VBoxTunctl -t "$1" -u "$2" > /dev/null 2>&1
291 ifconfig "$1" up 2> /dev/null
292 if [ ! -z "$3" ]
293 then
294 brctl addif "$3" "$1"
295 fi
296 done < "$VARFILE"
297 fail_msg
298 return 1
299 fi
300 done < "$VARFILE"
301 rm -f "$VARFILE" 2> /dev/null
302 succ_msg
303 return 0
304}
305
306# Shut down VirtualBox host networking and remove all permanent TAP
307# interfaces. This action will succeed even if not all interfaces could be
308# removed. It is only intended for exceptional circumstances such as
309# uninstalling VirtualBox.
310force_stop_network() {
311 begin "Shutting down VirtualBox host networking"
312 # If there is no runtime record file, assume that the service is not
313 # running.
314 if [ ! -f "$VARFILE" ]
315 then
316 succ_msg
317 return 0
318 fi
319 # Fail if we can't read our runtime record file or write to the
320 # folder it is located in
321 if [ ! -r "$VARFILE" -o ! -w "$VARDIR" ]
322 then
323 fail_msg
324 return 1
325 fi
326 # Fail if we don't have tunctl
327 if ! VBoxTunctl -h 2>&1 | grep VBoxTunctl > /dev/null
328 then
329 fail_msg
330 return 1
331 fi
332 # Read the runtime record file entries line by line and delete the
333 # interfaces. The format of the runtime record file is not checked for
334 # errors.
335 while read line
336 do
337 set ""$line
338 # Remove the interface from a bridge if it is part of one
339 if [ ! -z "$3" ]
340 then
341 brctl delif "$3" "$1" 2> /dev/null
342 fi
343 # Remove the interface.
344 ifconfig "$1" down 2> /dev/null
345 VBoxTunctl -d "$1" > /dev/null 2>&1
346 done < "$VARFILE"
347 rm -f "$VARFILE" 2> /dev/null
348 succ_msg
349 return 0
350}
351
352start() {
353 start_network
354}
355
356stop() {
357 stop_network
358}
359
360force_stop() {
361 force_stop_network
362}
363
364restart() {
365 stop_network && start_network
366}
367
368status() {
369 if running; then
370 echo "VirtualBox host networking is loaded."
371 else
372 echo "VirtualBox host networking is not loaded."
373 fi
374}
375
376case "$1" in
377start)
378 start
379 ;;
380stop)
381 stop
382 ;;
383restart)
384 restart
385 ;;
386force-reload)
387 restart
388 ;;
389force-stop)
390 force_stop
391 ;;
392status)
393 status
394 ;;
395*)
396 echo "Usage: `basename $0` {start|stop|restart|force-reload|status}"
397 exit 1
398esac
399
400exit
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette