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