hc
2024-07-02 39af2116d7581c9a12be9e73bb6bdc31496495ef
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
#!/bin/sh
 
DAEMON="libvirtd"
EXECFILE="/usr/sbin/$DAEMON"
PIDFILE="/var/run/$DAEMON.pid"
 
LIBVIRTD_ARGS=""
 
# shellcheck source=/dev/null
[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
 
trap 'rm -f "$TMP_MODULE_LIST" "$TMP_PIDFILE_LIST"' EXIT
 
is_alive() {
   [ -e "$1" ] \
   && exe="/proc/$(cat "$1" 2>/dev/null)/exe" \
   && [ -s "$exe" ] \
   && [ "$(readlink -f "$exe")" = "$2" ]
}
 
load_modules() {
   printf 'Loading kernel modules: '
   kver="$(uname -r)"
   TMP_MODULE_LIST="$(mktemp -q)" || {
       echo 'FAIL creating temporary modules list'
       exit 1
   }
   [ -d "/lib/modules/$kver/kernel/drivers/net" ] && \
       find "/lib/modules/$kver/kernel/drivers/net" \
       -name "tun.ko*" >> "$TMP_MODULE_LIST"
   [ -d "/lib/modules/$kver/kernel/drivers/vhost" ] && \
       find "/lib/modules/$kver/kernel/drivers/vhost" \
       -name "vhost?net.ko*" >> "$TMP_MODULE_LIST"
   [ -d "/lib/modules/$kver/kernel/drivers/net" ] && \
       find "/lib/modules/$kver/kernel/drivers/vfio" \
       -name "*.ko*" >> "$TMP_MODULE_LIST"
   while read -r f; do
       m="$(basename "${f%.ko*}")"
       if modprobe -q "$m"; then
           printf '%s ' "$m"
       else
           echo "FAIL on $m"
           exit 1
       fi
   done < "$TMP_MODULE_LIST"
   echo "OK"
}
 
#
# If libvirtd dies it leves behind one stale dnsmasq per virtual network that
# must be killed before starting libvirtd again.
#
rm_stale_dnsmasq() {
   [ -d /var/run/libvirt/network ] || return 0
   TMP_PIDFILE_LIST="$(mktemp -q)" || {
       echo "Could not create temporary pidfile list"
       exit 1
   }
   find /var/run/libvirt/network -name '*.pid' > "$TMP_PIDFILE_LIST"
   while read -r pidfile; do
       if is_alive "$pidfile" /usr/sbin/dnsmasq; then
           start-stop-daemon -K -q -p "$pidfile" -x /usr/sbin/dnsmasq
           status=$?
           if [ "$status" -ne 0 ]; then
               echo "Could not stop stale dnsmasq daemons"
               exit 1
           fi
           rm -f "$pidfile"
       fi
   done < "$TMP_PIDFILE_LIST"
}
 
start() {
   if is_alive "$PIDFILE" "$EXECFILE"; then
       # libvirtd is already running. Leave it alone.
       printf 'Starting %s: FAIL\n' "$DAEMON"
       return 1
   fi
   rm_stale_dnsmasq
   load_modules
   printf 'Starting %s: ' "$DAEMON"
   # shellcheck disable=SC2086 # we need the word splitting
   start-stop-daemon -S -q -p "$PIDFILE" -x "$EXECFILE" \
       -- -d $LIBVIRTD_ARGS
   status=$?
   if [ "$status" -eq 0 ]; then
       echo "OK"
   else
       echo "FAIL"
   fi
   return "$status"
}
 
stop() {
   printf 'Stopping %s: ' "$DAEMON"
   start-stop-daemon -K -q -p "$PIDFILE" -x "$EXECFILE"
   status=$?
   if [ "$status" -eq 0 ]; then
       rm_stale_dnsmasq
       echo "OK"
   else
       echo "FAIL"
   fi
   return "$status"
}
 
restart() {
   stop
   sleep 1
   start
}
 
# On receipt of SIGHUP libvirtd will reload its configuration.
reload() {
   printf 'Reloading %s: ' "$DAEMON"
   start-stop-daemon -K -s HUP -q -p "$PIDFILE" -x "$EXECFILE"
   status=$?
   if [ "$status" -eq 0 ]; then
       echo "OK"
   else
       echo "FAIL"
   fi
   return "$status"
}
 
case "$1" in
   start|stop|restart|reload)
       "$1";;
   *)
       echo "Usage: $0 {start|stop|restart|reload}"
       exit 1
esac