xref: /OK3568_Linux_fs/buildroot/package/libvirt/S92libvirtd (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#!/bin/sh
2
3DAEMON="libvirtd"
4EXECFILE="/usr/sbin/$DAEMON"
5PIDFILE="/var/run/$DAEMON.pid"
6
7LIBVIRTD_ARGS=""
8
9# shellcheck source=/dev/null
10[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
11
12trap 'rm -f "$TMP_MODULE_LIST" "$TMP_PIDFILE_LIST"' EXIT
13
14is_alive() {
15	[ -e "$1" ] \
16	&& exe="/proc/$(cat "$1" 2>/dev/null)/exe" \
17	&& [ -s "$exe" ] \
18	&& [ "$(readlink -f "$exe")" = "$2" ]
19}
20
21load_modules() {
22	printf 'Loading kernel modules: '
23	kver="$(uname -r)"
24	TMP_MODULE_LIST="$(mktemp -q)" || {
25		echo 'FAIL creating temporary modules list'
26		exit 1
27	}
28	[ -d "/lib/modules/$kver/kernel/drivers/net" ] && \
29		find "/lib/modules/$kver/kernel/drivers/net" \
30		-name "tun.ko*" >> "$TMP_MODULE_LIST"
31	[ -d "/lib/modules/$kver/kernel/drivers/vhost" ] && \
32		find "/lib/modules/$kver/kernel/drivers/vhost" \
33		-name "vhost?net.ko*" >> "$TMP_MODULE_LIST"
34	[ -d "/lib/modules/$kver/kernel/drivers/net" ] && \
35		find "/lib/modules/$kver/kernel/drivers/vfio" \
36		-name "*.ko*" >> "$TMP_MODULE_LIST"
37	while read -r f; do
38		m="$(basename "${f%.ko*}")"
39		if modprobe -q "$m"; then
40			printf '%s ' "$m"
41		else
42			echo "FAIL on $m"
43			exit 1
44		fi
45	done < "$TMP_MODULE_LIST"
46	echo "OK"
47}
48
49#
50# If libvirtd dies it leves behind one stale dnsmasq per virtual network that
51# must be killed before starting libvirtd again.
52#
53rm_stale_dnsmasq() {
54	[ -d /var/run/libvirt/network ] || return 0
55	TMP_PIDFILE_LIST="$(mktemp -q)" || {
56		echo "Could not create temporary pidfile list"
57		exit 1
58	}
59	find /var/run/libvirt/network -name '*.pid' > "$TMP_PIDFILE_LIST"
60	while read -r pidfile; do
61		if is_alive "$pidfile" /usr/sbin/dnsmasq; then
62			start-stop-daemon -K -q -p "$pidfile" -x /usr/sbin/dnsmasq
63			status=$?
64			if [ "$status" -ne 0 ]; then
65				echo "Could not stop stale dnsmasq daemons"
66				exit 1
67			fi
68			rm -f "$pidfile"
69		fi
70	done < "$TMP_PIDFILE_LIST"
71}
72
73start() {
74	if is_alive "$PIDFILE" "$EXECFILE"; then
75		# libvirtd is already running. Leave it alone.
76		printf 'Starting %s: FAIL\n' "$DAEMON"
77		return 1
78	fi
79	rm_stale_dnsmasq
80	load_modules
81	printf 'Starting %s: ' "$DAEMON"
82	# shellcheck disable=SC2086 # we need the word splitting
83	start-stop-daemon -S -q -p "$PIDFILE" -x "$EXECFILE" \
84		-- -d $LIBVIRTD_ARGS
85	status=$?
86	if [ "$status" -eq 0 ]; then
87		echo "OK"
88	else
89		echo "FAIL"
90	fi
91	return "$status"
92}
93
94stop() {
95	printf 'Stopping %s: ' "$DAEMON"
96	start-stop-daemon -K -q -p "$PIDFILE" -x "$EXECFILE"
97	status=$?
98	if [ "$status" -eq 0 ]; then
99		rm_stale_dnsmasq
100		echo "OK"
101	else
102		echo "FAIL"
103	fi
104	return "$status"
105}
106
107restart() {
108	stop
109	sleep 1
110	start
111}
112
113# On receipt of SIGHUP libvirtd will reload its configuration.
114reload() {
115	printf 'Reloading %s: ' "$DAEMON"
116	start-stop-daemon -K -s HUP -q -p "$PIDFILE" -x "$EXECFILE"
117	status=$?
118	if [ "$status" -eq 0 ]; then
119		echo "OK"
120	else
121		echo "FAIL"
122	fi
123	return "$status"
124}
125
126case "$1" in
127	start|stop|restart|reload)
128		"$1";;
129	*)
130		echo "Usage: $0 {start|stop|restart|reload}"
131		exit 1
132esac
133