blob: 40972ce9f30a7e43fa4a362a2cc15f05facdbc28 (
plain)
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
|
#!/bin/sh
set -e
set -x
# Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
# Date: 2009-10-08
# License: GPL v3+
## expect to pull these values from the environment:
# VMNAME=snapper
# OWNER=jrollins
# TAP=tap0
# RAM=512
# MAC=52:54:00:12:34:56
if [ -z "$VMNAME" ] ; then
exit 1
fi
###################
OWNERGROUP=$(groups "$OWNER" | cut -f1 -d\ )
OWNERHOME=$(getent passwd "$OWNER" | cut -f6 -d: )
VGNAME=vg_$(hostname)0
up() {
# bring up the network tap:
modprobe -v tun
tunctl -u "$OWNER" -t "$TAP"
ip link set "$TAP" up
brctl addif br0 "$TAP"
# make sure the block device is readable by the owner:
chgrp "$OWNERGROUP" "/dev/mapper/${VGNAME}-$VMNAME"
chpst -u "$OWNER:$OWNERGROUP" mkdir -p "$OWNERHOME/vms/$VMNAME"
CDISO="$OWNERHOME/vms/$VMNAME/cd.iso"
NETBOOT="$OWNERHOME/vms/$VMNAME/netboot"
KVMARGS=
if [ -e "$NETBOOT" ] ; then
KVMARGS="-boot n"
elif [ -e "$CDISO" ] && [ -e $(readlink -f "$CDISO") ] ; then
KVMARGS="-cdrom $CDISO -boot d"
fi
LOGNAME="$OWNERHOME/vms/$VMNAME/console"
ln -sfT "$LOGNAME" ./servicelog
if [ -e "$LOGNAME" ] ; then
chpst -u "$OWNER" mv "$LOGNAME" "$LOGNAME".$(date +%F_%T%z|tr : .)
fi
exec chpst -u "$OWNER:$OWNERGROUP:kvm" /usr/bin/screen -D -m -L -c /etc/screenrc.kvm-manager -S "$VMNAME" -t "$VMNAME" -s /bin/false /usr/bin/kvm $KVMARGS -nographic -name "$VMNAME" -m "$RAM" -net nic,"macaddr=$MAC" -net "tap,hostname=$VMNAME,ifname=$TAP,script=no,downscript=no" -no-reboot -serial stdio "/dev/mapper/${VGNAME}-$VMNAME"
}
down() {
brctl delif br0 "$TAP"
ip link set "$TAP" down
tunctl -d "$TAP"
# no need to lock up the block device as well, since the owner might
# prefer to manipulate the disk directly.
}
log() {
LOGDIR="$OWNERHOME/vms/$VMNAME/servicelog"
chpst -u "$OWNER" mkdir -p "$LOGDIR"
exec chpst -u "$OWNER" svlogd -tt "$LOGDIR"
}
case "$1" in
up|down|log)
"$1"
;;
*)
echo "Usage: $0 [up|down]"
exit 1
;;
esac
|