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