#!/usr/bin/perl -w
use FindBin;
+use Expect;
# Create startup script in ramdisk
my $S99 = "$FindBin::Bin/initramfs/etc/init.d/S99benchmark";
system("rm -f $S99");
system("cat > $S99; chmod +x $S99") unless -t STDIN;
-# Boot gateway
-my $boot;
-my $pid = &run_boot;
-$|=1;
-
-my $ready;
-while (<$boot>){
- last if ($ready = m/Welcome to Buildroot/ ||
- m/UGW started/ ||
- m/t...a...s...k...s... ...s...t...a...r...t...e...d/); # RTEMS has bug - it sends 4 characters instead of just one
-}
-die "Boot failed" unless $ready;
+# Boot the gateway
+# die("No boot command") if ($#ARGV eq -1);
+my $bootcmd = scalar @ARGV ? "'".join("' '", @ARGV)."'" : "$FindBin::Bin/boot";
+$exp = Expect->spawn($bootcmd);
+$exp->expect(120,
+ 'Welcome to Buildroot',
+ 'UGW started',
+ '-re', 't...a...s...k...s... ...s...t...a...r...t...e...d') # RTEMS has bug - it sends 4 characters instead of just one
+ or die "Cannot spawn $bootcmd: $!";
# Measure latencies
my $latester=<<'EOF';
+set -e
rm -f tmp-stat.txt
echo "Starting latester"
-sudo ip l set eth0 down
+sudo /sbin/ifdown eth0
sudo ~/bin/latester -d can0 -d can1 -d can2 -c 3200 -q --oneattime -n tmp
r=$?
-sudo ip l set eth0 up
+sudo /sbin/ifup eth0
set -e
source tmp-stat.txt
for i in sent lost enobufs $(seq -f percentile%g 0 10 100); do keyval="$keyval $i=$((i))"; done
echo "! PERF: gw_latency $avg µs $keyval ok"
+test $avg -eq 0 && exit 1
exit $r
EOF
my $status = system((qw(ssh -T glab), $latester));
-kill('TERM', -$pid);
+$exp->close();
exit($status >> 8);
-
-# Helper functions
-sub kill_boot() { kill('TERM', -$pid) if defined $pid; }
-sub run_boot()
-{
- # die("No boot command") if ($#ARGV eq -1);
- my $bootcmd = scalar @ARGV ? "'".join("' '", @ARGV)."'" : "$FindBin::Bin/boot";
-
- $SIG{INT} = sub { kill_boot(); exit; };
-
- pipe($boot, $wh) || die("pipe: $!");
- my $pid = fork() // die("fork: $!");
- if ($pid == 0) {
- setpgrp(); # Start new process group so that we can kill all
- # background processes at once
- close($boot);
- open(STDERR, ">&", $wh) || die "Can't dup STDERR: $!";
- my $cmd = "$bootcmd 2>&1 | tee /dev/stderr";
- exec($cmd) || die "Can't exec $cmd: $!";
- }
- close($wh);
- return $pid;
-}
-
-END { kill_boot(); }