Ostinato VM with GUI

This commit is contained in:
Bernhard Ehlers 2016-01-03 18:42:47 +01:00
parent 610fcd92bc
commit 25ad233468
6 changed files with 330 additions and 23 deletions

View File

@ -1,43 +1,44 @@
{
"name": "Ostinato Drone",
"name": "Ostinato",
"category": "guest",
"description": "Ostinato is an open-source, cross-platform network packet crafter/traffic generator and analyzer with a friendly GUI. Craft and send packets of several streams with different protocols at different rates.",
"vendor_name": "Ostinato",
"vendor_url": "http://ostinato.org/",
"documentation_url": "http://ostinato.org/docs.html",
"product_name": "Drone",
"product_url": "http://ostinato.org/",
"registry_version": 1,
"vendor_name": "Ostinato",
"vendor_url": "http://ostinato.org/",
"documentation_url": "http://ostinato.org/docs.html",
"product_name": "Ostinato",
"product_url": "http://ostinato.org/",
"registry_version": 1,
"status": "experimental",
"maintainer": "Bernhard Ehler",
"maintainer": "Bernhard Ehlers",
"maintainer_email": "be@bernhard-ehlers.de",
"usage": "The traffic generator listen on port 50001.\n Use the Ostinato GUI to control it. If you want to use two traffic geneator at the same time you need to modify the port in the VM Qemu options.\nThe drone VM and the Ostinato GUI must use the same version.",
"usage": "Use interfaces starting with eth1 as traffic interfaces, eth0 is only for the (optional) management of the server/drone.",
"port_name_format": "eth{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 1,
"ram": 128,
"adapters": 4,
"ram": 256,
"arch": "i386",
"console_type": "telnet",
"options": "-net nic,vlan=999,model=e1000 -net user,vlan=999,hostfwd=tcp::50001-:7878"
"console_type": "vnc",
"options": "-vga std -usbdevice tablet"
},
"images": [
"images": [
{
"filename": "ost-drone-0.7-v1.qcow2",
"version": "0.7",
"md5sum": "6c20f767f89782e66929e6cbb7143ab1",
"filesize": 18415616,
"download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/install-qemu.html",
"direct_download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/ost-drone-0.7-v1.qcow2"
"filename": "ostinato-0.7.1-2.qcow2",
"version": "0.7.1",
"md5sum": "c534aeb6e7d24b23e0458c36ad4784fc",
"filesize": 56295424,
"download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/index.html",
"direct_download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/ostinato-0.7.1-2.qcow2"
}
],
"versions": [
{
"name": "0.7",
"name": "0.7.1",
"images": {
"hda_disk_image": "ost-drone-0.7-v1.qcow2"
"hda_disk_image": "ostinato-0.7.1-2.qcow2"
}
}
]

View File

@ -38,6 +38,21 @@ A build of Core with Openvswitch preinstalled.
packer build -var-file=openvswitch.json core64-linux.json
Ostinato
'''''''''
A build of Core with Ostinato drone preinstalled.
.. code:: bash
packer build -var-file=ostinato.json core-linux.json
A drone-only VM can be build with:
.. code:: bash
packer build -var-file=ostinato-drone.json core-linux.json
Tiny Core Linux installation
****************************

View File

@ -0,0 +1,5 @@
{
"vm_name": "ostinato-drone.qcow2",
"setup_script": "ostinato-drone.sh",
"disk_size": "200"
}

View File

@ -0,0 +1,5 @@
{
"vm_name": "ostinato.qcow2",
"setup_script": "ostinato.sh",
"disk_size": "200"
}

View File

@ -0,0 +1,132 @@
set -e
set -x
# setup environment
. /etc/profile
. /etc/init.d/tc-functions
getMirror
# load qt-4.x-base without the X dependecies
# alternatively a "tce-load -wi qt-4.x-base" loads it with all dependecies
wget -P /mnt/sda1/tce/optional $MIRROR/qt-4.x-base.tcz
wget -P /mnt/sda1/tce/optional $MIRROR/qt-4.x-base.tcz.md5.txt
touch /mnt/sda1/tce/optional/qt-4.x-base.tcz.dep
tce-load -i /mnt/sda1/tce/optional/qt-4.x-base.tcz
# load the remaining dependencies for ostinato
tce-load -wi qt-4.x-base
tce-load -wi qt-4.x-script
tce-load -wi glib2
tce-load -wi openssl
tce-load -wi libpcap
# load also iperf
tce-load -wi iperf3
# change tcedir to ram disk
mv /etc/sysconfig/tcedir /etc/sysconfig/tcedir.hd
ln -s /tmp/tce /etc/sysconfig/tcedir
# setup compile environment
tce-load -wi compiletc
tce-load -wi squashfs-tools
tce-load -wi curl
export CFLAGS="-march=i486 -mtune=i686 -O2"
export CXXFLAGS="-march=i486 -mtune=i686 -O2"
export LDFLAGS="-Wl,-O1"
# compile protobuf
curl -L -O https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
tar xfz protobuf-2.6.1.tar.gz
cd protobuf-2.6.1
./configure --prefix=/usr/local
make
sudo make install
sudo rm /usr/local/lib/libprotobuf.so
cd ..
rm -rf protobuf*
# compile ostinato
tce-load -wi qt-4.x-dev
tce-load -wi libpcap-dev
ver=`curl -sI https://bintray.com/pstavirs/ostinato/ostinato-src/_latestVersion | sed -n '/Location:/ {s%.*/ostinato-src/%%;s%/view.*%%;p;}'`
curl -k -L -O https://bintray.com/artifact/download/pstavirs/ostinato/ostinato-src-$ver.tar.gz
tar xfz ostinato-src-$ver.tar.gz
cd ostinato-$ver
# patch only useful for ostinato <= 0.7.1
patch -p0 <<'EOF'
--- server/pcapport.cpp.orig 2015-02-24 08:38:33.000000000 +0000
+++ server/pcapport.cpp 2015-02-25 09:58:38.943383048 +0000
@@ -696,7 +696,8 @@
while (curTicks.QuadPart < tgtTicks.QuadPart)
QueryPerformanceCounter(&curTicks);
-#elif defined(Q_OS_LINUX)
+// #elif defined(Q_OS_LINUX)
+#elif 0
struct timeval delay, target, now;
//qDebug("usec delay = %ld", usec);
EOF
qmake -config release "QMAKE_CXXFLAGS+=$CXXFLAGS"
# ostinato >= 0.8 supports building of a component
# make server
# sudo INSTALL_ROOT=/tmp/ostinato make server-install_subtargets
make
sudo INSTALL_ROOT=/tmp/ostinato make install
sudo rm /tmp/ostinato/usr/local/bin/ostinato
sudo chown -R root:root /tmp/ostinato
sudo chmod +s /tmp/ostinato/usr/local/bin/drone
cd ..
mksquashfs /tmp/ostinato ostinato-drone.tcz
md5sum ostinato-drone.tcz > ostinato-drone.tcz.md5.txt
echo -e "qt-4.x-base.tcz\nqt-4.x-script.tcz\nlibpcap.tcz" > ostinato-drone.tcz.dep
mv ostinato-drone.tcz* /mnt/sda1/tce/optional/
echo ostinato-drone.tcz >> /mnt/sda1/tce/onboot.lst
sudo rm -rf /tmp/ostinato
rm -rf ostinato*
# ostinato configuration file
mkdir -p .config/Ostinato
cat > .config/Ostinato/drone.ini <<'EOF'
[General]
RateAccuracy=Low
[PortList]
Include=eth*
Exclude=eth0
EOF
# change tcedir back to hard disk
rm -f /etc/sysconfig/tcedir
mv /etc/sysconfig/tcedir.hd /etc/sysconfig/tcedir
# disable automatic interface configuration with dhcp
sudo sed -i -e '/label .*core/,/append / s/\(append .*\)/\1 nodhcp/' /mnt/sda1/boot/extlinux/extlinux.conf
# add startup script for ostinato
cat >> /opt/bootlocal.sh <<'EOF'
# Boot parameter "nodhcp": network interfaces are not yet configured
if grep -q -w nodhcp /proc/cmdline; then
# This waits until all devices have registered
/sbin/udevadm settle --timeout=10
# configure eth0 with DHCP
/sbin/udhcpc -b -i eth0 -x hostname:$(/bin/hostname) -p /var/run/udhcpc.eth0.pid >/dev/null 2>&1 &
# alternatively configure static interface address and route
#ifconfig eth0 x.x.x.x netmask 255.255.255.0 up
#route add default gw y.y.y.y
# activate other eth devices
NETDEVICES="$(awk -F: '/eth[1-9][0-9]*:/{print $1}' /proc/net/dev 2>/dev/null)"
for DEVICE in $NETDEVICES; do
ifconfig $DEVICE mtu 9000 up
done
fi
# start ostinato drone
HOME=/home/gns3 drone < /dev/null > /var/log/ostinato-drone.log 2>&1 &
EOF
exit 0

View File

@ -0,0 +1,149 @@
set -e
set -x
# setup environment
. /etc/profile
# Install the GUI
tce-load -wi fltk-1.3
tce-load -wi flwm
tce-load -wi Xorg-7.7
tce-load -wi wbar
tce-load -wi Xprogs
tce-load -wi Xlibs
tce-load -wi aterm
# set X resolution to 800x600
cat > 99-resolution.conf <<'EOF'
Section "Screen"
Identifier "Screen0"
DefaultDepth 24
SubSection "Display"
Modes "800x600"
EndSubSection
EndSection
EOF
sudo mv 99-resolution.conf /usr/local/share/X11/xorg.conf.d/
echo usr/local/share/X11/xorg.conf.d >> /opt/.filetool.lst
# load the dependencies for ostinato
tce-load -wi qt-4.x-base
tce-load -wi qt-4.x-script
tce-load -wi libpcap
# load also iperf
tce-load -wi iperf3
# change tcedir to ram disk
mv /etc/sysconfig/tcedir /etc/sysconfig/tcedir.hd
ln -s /tmp/tce /etc/sysconfig/tcedir
# setup compile environment
tce-load -wi compiletc
tce-load -wi squashfs-tools
tce-load -wi curl
export CFLAGS="-march=i486 -mtune=i686 -O2"
export CXXFLAGS="-march=i486 -mtune=i686 -O2"
export LDFLAGS="-Wl,-O1"
# compile protobuf
curl -L -O https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
tar xfz protobuf-2.6.1.tar.gz
cd protobuf-2.6.1
./configure --prefix=/usr/local
make
sudo make install
sudo rm /usr/local/lib/libprotobuf.so
cd ..
rm -rf protobuf*
# compile ostinato
tce-load -wi qt-4.x-dev
tce-load -wi libpcap-dev
ver=`curl -sI https://bintray.com/pstavirs/ostinato/ostinato-src/_latestVersion | sed -n '/Location:/ {s%.*/ostinato-src/%%;s%/view.*%%;p;}'`
curl -k -L -O https://bintray.com/artifact/download/pstavirs/ostinato/ostinato-src-$ver.tar.gz
tar xfz ostinato-src-$ver.tar.gz
cd ostinato-$ver
# patch only useful for ostinato <= 0.7.1
patch -p0 <<'EOF'
--- server/pcapport.cpp.orig 2015-02-24 08:38:33.000000000 +0000
+++ server/pcapport.cpp 2015-02-25 09:58:38.943383048 +0000
@@ -696,7 +696,8 @@
while (curTicks.QuadPart < tgtTicks.QuadPart)
QueryPerformanceCounter(&curTicks);
-#elif defined(Q_OS_LINUX)
+// #elif defined(Q_OS_LINUX)
+#elif 0
struct timeval delay, target, now;
//qDebug("usec delay = %ld", usec);
EOF
qmake -config release "QMAKE_CXXFLAGS+=$CXXFLAGS"
make
sudo INSTALL_ROOT=/tmp/ostinato make install
sudo mkdir -p /tmp/ostinato/usr/local/share/applications
cat > ostinato.desktop <<'EOF'
[Desktop Entry]
Name=Ostinato
Exec=ostinato
Type=Application
OnlyShowIn=Old;
Categories=System;
EOF
sudo mv ostinato.desktop /tmp/ostinato/usr/local/share/applications/
sudo chown -R root:root /tmp/ostinato
sudo chmod +s /tmp/ostinato/usr/local/bin/drone
cd ..
mksquashfs /tmp/ostinato ostinato.tcz
md5sum ostinato.tcz > ostinato.tcz.md5.txt
echo -e "qt-4.x-base.tcz\nqt-4.x-script.tcz\nlibpcap.tcz" > ostinato.tcz.dep
mv ostinato.tcz* /mnt/sda1/tce/optional/
echo ostinato.tcz >> /mnt/sda1/tce/onboot.lst
sudo rm -rf /tmp/ostinato
rm -rf ostinato*
# ostinato configuration file
mkdir -p .config/Ostinato
cat > .config/Ostinato/drone.ini <<'EOF'
[General]
RateAccuracy=Low
[PortList]
Include=eth*
Exclude=eth0
EOF
# change tcedir back to hard disk
rm -f /etc/sysconfig/tcedir
mv /etc/sysconfig/tcedir.hd /etc/sysconfig/tcedir
# disable automatic interface configuration with dhcp
sudo sed -i -e '/label .*core/,/append / s/\(append .*\)/\1 nodhcp/' /mnt/sda1/boot/extlinux/extlinux.conf
# add startup script for ostinato
cat >> /opt/bootlocal.sh <<'EOF'
# Boot parameter "nodhcp": network interfaces are not yet configured
if grep -q -w nodhcp /proc/cmdline; then
# This waits until all devices have registered
/sbin/udevadm settle --timeout=10
# configure eth0 with DHCP
/sbin/udhcpc -b -i eth0 -x hostname:$(/bin/hostname) -p /var/run/udhcpc.eth0.pid >/dev/null 2>&1 &
# alternatively configure static interface address and route
#ifconfig eth0 x.x.x.x netmask 255.255.255.0 up
#route add default gw y.y.y.y
# activate other eth devices
NETDEVICES="$(awk -F: '/eth[1-9][0-9]*:/{print $1}' /proc/net/dev 2>/dev/null)"
for DEVICE in $NETDEVICES; do
ifconfig $DEVICE mtu 9000 up
done
fi
# start ostinato drone
HOME=/home/gns3 drone < /dev/null > /var/log/ostinato-drone.log 2>&1 &
EOF
exit 0