makedist-recordvm: added tool for generating vm video and images snapshots using qemu

This commit is contained in:
Silvan Calarco 2012-07-09 19:12:57 +02:00
parent 114bd9c94d
commit 4ff86d2987
2 changed files with 134 additions and 1 deletions

View File

@ -1,5 +1,5 @@
# makedist Makefile for installation and packaging
# Copyright (c) 2003-2011 by Silvan Calarco <silvan.calarco@mambasoft.it>
# Copyright (c) 2003-2012 by Silvan Calarco <silvan.calarco@mambasoft.it>
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
@ -15,6 +15,7 @@ dist_archive = $(package)-$(makedist_version).tar.bz2
prefix := /usr
datadir := $(prefix)/share
sysconfdir := /etc
sbindir := $(prefix)/sbin
dist: clean
@git log > ChangeLog.git
@ -38,3 +39,5 @@ install:
cp -a makedist $(DESTDIR)$(datadir)/;\
install -d $(DESTDIR)$(sysconfdir)/makedist;\
cp -a config/config $(DESTDIR)$(sysconfdir)/makedist/config
@install -d $(DESTDIR)$(sbindir);\
cp -a makedist-recordvm $(DESTDIR)$(sbindir)/makedist-recordvm

130
makedist-recordvm Executable file
View File

@ -0,0 +1,130 @@
#!/bin/bash
RECORDVM_DATA=/var/makedist/recordvm
#VBOX=1
VBOX_VMNAME="openmamba-recordvm"
VBOX_DISPLAY=:1
EXECUTION_TIME=200
VIDEO_EXT=.flv
VIDEO_EXT2=.ogv
[ $1 ] || {
echo "Usage:"
echo "recordvm.sh iso_path"
echo
exit 1
}
ISO_PATH=$1
ISO_DIR=`dirname $ISO_PATH`
ISO_NAME=`basename $ISO_PATH`
[ -e $ISO_PATH ] || {
echo "Error: file $ISO_PATH does not exist; aborting."
exit 1
}
echo "Preparing ISO image $ISO_PATH"
ln -sf $ISO_PATH $RECORDVM_DATA/recordvm.iso
echo "Starting virtual machine for $ISO_PATH"
export HOME=$RECORDVM_DATA
xinit -- $VBOX_DISPLAY &
if [ "$VBOX" ]; then
# -nocursor &
# &>$RECORDVM_DATA/recordvm.log &
#VBOX_USER_HOME=$RECORDVM_DATA/VirtualBox DISPLAY=:0 /opt/VirtualBox/VBoxSDL --startvm $VBOX_VMNAME --fixedmode 1024 768 32 >/dev/null &
trap "VBoxManage controlvm $VBOX_VMNAME poweroff" INT QUIT TSTP
sleepcnt=0
while true; do
if [ "`VBoxManage list runningvms | grep $VBOX_VMNAME`" ]; then
break
fi
# xwininfo -display $VBOX_DISPLAY -name "$VBOX_VMNAME - Oracle VM VirtualBox" 2>/dev/null |grep "Window id:"| sed "s|.*Window id: \([0-9a-fx]*\).*|\1|"
# [ "$WINID" ] && break
sleep 1
if [ $sleepcnt -gt 20 ]; then
echo "VirtualBox did not start; aborting."
exit 1
fi
let sleepcnt=sleepcnt+1
done
WINID=`xwininfo -display $VBOX_DISPLAY -name "$VBOX_VMNAME - Oracle VM VirtualBox" 2>/dev/null |grep "Window id:"| sed "s|.*Window id: \([0-9a-fx]*\).*|\1|"`
VBoxManage controlvm $VBOX_VMNAME reset
else
sleepcnt=0
while true; do
WINID=`xwininfo -display $VBOX_DISPLAY -name "QEMU (qemu-recordvm)" 2>/dev/null |grep "Window id:"| sed "s|.*Window id: \([0-9a-fx]*\).*|\1|"`
[ "$WINID" ] && break
if [ $sleepcnt -gt 20 ]; then
echo "qemu did not start; aborting."
exit 1
fi
let sleepcnt=sleepcnt+1
sleep 1
done
fi
echo "Windowid is: $WINID"
echo "Capturing window output"
mkdir -p $ISO_DIR/preview/
DBUS_SESSION_BUS_ADDRESS= HOME=$RECORDVM_DATA DISPLAY=$VBOX_DISPLAY xvidcap \
--cap_geometry 1024x768+0+0 \
--verbose 2 --gui no --audio no \
--time $EXECUTION_TIME --file $ISO_DIR/preview/${ISO_NAME}${VIDEO_EXT} \
--quality 100 >>$RECORDVM_DATA/recordvm.log
#recordmydesktop --no-frame --display $VBOX_DISPLAY --windowid $WINID -o $ISO_DIR/preview/$ISO_NAME.ogv --overwrite --no-sound --no-wm-check --fps 10 --no-cursor &
#echo "Sleeping $EXECUTION_TIME seconds..."
#sleep $EXECUTION_TIME
#killall -TERM recordmydesktop
#echo "Waiting for recordmydesktop to exit"
#while [ "`pidof recordmydesktop`" ]; do
# sleep 1
#done
echo "Powering off VM"
if [ "$VBOX" ]; then
VBoxManage controlvm $VBOX_VMNAME poweroff &
count=0
while [ "`pidof VBoxManage`" ]; do
let count=count+1
sleep 1
if [ $count -gt 60 ]; then
killall -9 VBoxManage
break
fi
done
else
xkill -id $WINID -display $VBOX_DISPLAY
fi
echo "Creating preview images"
rm -f $ISO_DIR/preview/*.jpg
ffmpeg -y -i $ISO_DIR/preview/$ISO_NAME${VIDEO_EXT} -r 1 -f image2 $ISO_DIR/preview/image-%03d.jpg >/dev/null
for i in `seq 200 -1 1`; do
f=`printf %03d $i`
[ -e $ISO_DIR/preview/image-$f.jpg ] && {
convert -size 320x200 $ISO_DIR/preview/image-$f.jpg $ISO_DIR/preview/preview.jpg
convert -size 400x300 $ISO_DIR/preview/image-$f.jpg $ISO_DIR/preview/preview-400x300.jpg
break
}
done
echo "Creating ${VIDEO_EXT2} video from ${VIDEO_EXT}"
#ffmpeg -y -i $ISO_DIR/preview/$ISO_NAME${VIDEO_EXT} $ISO_DIR/preview/$ISO_NAME${VIDEO_EXT2} >/dev/null
ffmpeg2theora -y -i $ISO_DIR/preview/$ISO_NAME${VIDEO_EXT} $ISO_DIR/preview/$ISO_NAME${VIDEO_EXT2} >/dev/null
#cleanup old files
for f in `ls $ISO_DIR/preview/*${VIDEO_EXT}`; do
[ "$f" = "$ISO_DIR/preview/$ISO_NAME${VIDEO_EXT}" ] || rm -f $f
done
for f in `ls $ISO_DIR/preview/*${VIDEO_EXT2}`; do
[ "$f" = "$ISO_DIR/preview/$ISO_NAME${VIDEO_EXT2}" ] || rm -f $f
done
echo "Done."
exit 0