1
0
Files
irix-657m-src/eoe/cmd/proclaim/test-proclaim
2022-09-29 17:59:04 +03:00

301 lines
7.9 KiB
Plaintext
Executable File

#!/usr/bin/perl5
# command line options
# Usage: test-proclaim -N times -D directory -i interface -d -f MACfile
# To use a file containing a list of MAC addresses(fictitious or real)
# should be place in the test directory with the name "testMAC"
# or specified using the -f flag
# The log of operations is placed in a file named testLog.<pid> where
# <pid> is the process id of the this test program
# The simulation begins with each MAC addres being uninitialized "u" state
# continues to perform a number of lease renew, request address, lease
# rebind, lease surender operations randomly choosing the next operation
# and MAC address.
# If the debug flag is on at the end the state of the MAC array is printed
# to the LOG file
# prototypes
sub updateTestMAC(\@p, $r);
$debug = 0; # can be set by -d command-line option
$cidon = 0; # can be set by the -C option
$TEST_DIR = "."; # set by -D dir command-line option
$PROGRAM_DIR = "/usr/etc"; # set by -p dir command-line option
# indices in testMAC array
$MAC = 0;
$NEXTOP = 1;
$SERVER = 2;
$LEASE = 3;
$HOSTNAME= 4;
$IPADDRESS = 5;
$N = 1000; # number of operations to do (-N option)
$MIN_LEASE = 300;
$MAX_LEASE = 3600;
$INTERFACE = "ec0"; # -i option
$MACFILE = "testMAC";
$delay = 10; # delay between transactions
#process command line options
while ($#ARGV > -1) {
if ($ARGV[0] eq "-N") {
shift(@ARGV);
$N = $ARGV[0];
shift(@ARGV) || &usage;
}
elsif ($ARGV[0] eq "-D") {
shift(@ARGV);
$TEST_DIR = $ARGV[0];
shift(@ARGV) || &usage;
}
elsif ($ARGV[0] eq "-p") {
shift(@ARGV);
$PROGRAM_DIR = $ARGV[0];
shift(@ARGV) || &usage;
}
elsif ($ARGV[0] eq "-d") {
shift(@ARGV);
$debug = 1;
}
elsif ($ARGV[0] eq "-i") {
shift(@ARGV);
$INTERFACE = $ARGV[0];
shift(@ARGV) || &usage;
}
elsif ($ARGV[0] eq "-f") {
shift(@ARGV);
$MACFILE = $ARGV[0];
shift(@ARGV) || &usage;
}
elsif ($ARGV[0] eq "-C") {
shift(@ARGV);
$cidon = 1;
}
elsif ($ARGV[0] eq "-T") {
shift(@ARGV);
$delay = $ARGV[0];
shift(@ARGV) || &usage;
}
else {
&usage;
}
}
sub usage {
print STDOUT "Usage: $0 -N times -D directory -i interface -f Macfile -d -T delay\n";
exit();
}
# used to ensure that a call to proclaim does not cause execessive
# delay in the test program
$alarmOn = 0;
$SIG{ALRM} = 'alarmHandler';
sub alarmHandler {
$alarmOn = 1;
}
# read from file of mac addresses to use and initialize testMAC array
open(MAC, "$TEST_DIR/$MACFILE") || die "Cant open $TEST_DIR/$MACFILE: $!\n";
$i = 0;
%hashMAC = ();
while ($line = <MAC>) {
# format is mac address, next operation, server address, lease end,
# hostname, ipaddress
# last operation is the character corresponding to the proclaim option used
# to begin with it is "u" uninitialized
chomp($line);
$macAddr = $line;
$testMAC[$i] = [ ( $macAddr, "u", "", "", "", "" ) ];
$i += 1;
}
close(MAC);
open(LOG, ">$TEST_DIR/testLog.$$") || die "Can't open log file $TEST_DIR/testLog.$$: $!\n";
use FileHandle;
LOG->autoflush();
if ($debug) {
# autoflush LOG 1;
}
srand (time() ^ ($$ + ($$ << 15))); # initialize seed
for ($n = 0; $n < $N; $n++) {
# select a random MAC to operate on
$roll = int(rand $#testMAC);
$mac = $testMAC[$roll][$MAC];
if ($cidon) {
# $cid = "-C " . "1". $mac . " -x 12";
$cid = "-C " . "1". $mac;
}
$nextop = $testMAC[$roll][$NEXTOP];
$ipaddress = $testMAC[$roll][$IPADDRESS];
local(*PROCLAIM);
local(@proclaim);
alarm(20);
print LOG scalar localtime;
if ($nextop eq "u") {
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac $cid|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
elsif ($nextop eq "U") {
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac $cid -H $mac|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
elsif ($nextop eq "b") {
$rno = int(rand ($MAX_LEASE-$MIN_LEASE)) + $MIN_LEASE;
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac:$ipaddress -b $rno $cid|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
elsif ($nextop eq "d") {
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac -d -s $testMAC[$roll][$SERVER] $cid|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
elsif ($nextop eq "l") {
$rno = int(rand ($MAX_LEASE-$MIN_LEASE)) + $MIN_LEASE;
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac:$ipaddress -l $rno $cid|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
elsif ($nextop eq "r") {
$rno = int(rand ($MAX_LEASE-$MIN_LEASE)) + $MIN_LEASE;
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac:$ipaddress -r $rno -s $testMAC[$roll][$SERVER] $cid|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
elsif ($nextop eq "i") {
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac:$ipaddress -i $cid|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
else {
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac:$ipaddress -A $testMAC[$roll][$IPADDRESS] $cid|";
open(PROCLAIM, $command);
print LOG "$n($testMAC[$roll][$IPADDRESS]): $command\n";
}
@proclaim = <PROCLAIM>;
close (PROCLAIM);
alarm 0;
if ($alarmOn) {
print LOG "Alarm received\n";
$alarmOn = 0;
print STDOUT "Alarm OP $n $mac $testMAC[$roll][$NEXTOP]: $command\n";
}
else {
&updateTestMAC(\@proclaim, $roll);
&printTestMAC($roll) if ($debug);
$rno = int(rand $delay);
print STDOUT "OP $n $mac $testMAC[$roll][$NEXTOP]: $command : sleep $rno\n";
sleep $rno;
}
}
if ($debug) {
for $i ( 0 .. $#testMAC ) {
print LOG "\nFinal State $i is: ";
for $j (0 .. $#{$testMAC[$i]} ) {
print LOG "$testMAC[$i][$j]";
}
}
print LOG "\n";
}
# cleanup by releasing all leases
for ($i = 0; $i < $#testMAC; $i++) {
$mac = $testMAC[$i][$MAC];
if ($cidon) {
$cid = "-C " . "1". $mac;
}
if (($testMAC[$i][$NEXTOP] ne "u") && ($testMAC[$i][$NEXTOP] ne "U")) {
$command = sprintf "%s", "$PROGRAM_DIR/proclaim -D 2 -M $mac -d -s $testMAC[$i][$SERVER] $cid|";
open(PROCLAIM, $command);
$n++;
print LOG "$n($testMAC[$i][$IPADDRESS]): $command\n";
print STDOUT "OP $n $mac $testMAC[$roll][$NEXTOP]: $command : sleep $rno\n";
}
}
print STDOUT "The log file is $TEST_DIR/testLog.$$\n";
close(LOG);
sub printTestMAC {
local($roll) = @_;
for $j (0 .. $#{$testMAC[$roll]} ) {
print STDOUT "element $roll $j is $testMAC[$roll][$j]\n";
}
}
sub updateTestMAC {
local($proclaim, $roll) = @_;
local($line);
local($numlines);
$numlines = 0;
foreach $line (@$proclaim) {
$numlines++;
if ($line =~ /^Server Address:\s*([0-9.]+)/) {
$testMAC[$roll][$SERVER] = $1;
print LOG "Server=$1";
}
elsif ($line =~ /^Hostname:\s*([^ ]+)$/) {
$testMAC[$roll][$HOSTNAME] = $1;
$hname=$1;
chomp($hname);
print LOG ", Hostname=$hname";
}
elsif ($line =~ /^IP Address:\s*([0-9.]+)/) {
$testMAC[$roll][$IPADDRESS] = $1;
print LOG ", IPAddress=$1";
}
elsif ($line =~ /^Lease Duration:\s*([0-9]+)/) {
$testMAC[$roll][$LEASE] = $1;
print LOG ", Lease=$1";
}
}
if ($numlines > 0) {
print LOG "\n";
}
if ($testMAC[$roll][$NEXTOP] eq "d") {
$testMAC[$roll][$NEXTOP] = "u";
$rno = rand;
if ($rno > 0.5) {
$testMAC[$roll][$NEXTOP] = "U";
}
}
else {
if ($numlines == 0) {
print LOG "No Reply From Server\n";
return $roll;
}
$rno = rand;
if ($rno > 0.95) {
$testMAC[$roll][$NEXTOP] = "d";
}
elsif ($rno > 0.75) {
$testMAC[$roll][$NEXTOP] = "r";
}
elsif ($rno > 0.5) {
$testMAC[$roll][$NEXTOP] = "l";
}
elsif ($rno > 0.25) {
$testMAC[$roll][$NEXTOP] = "b";
}
elsif ($rno > 0.10) {
$testMAC[$roll][$NEXTOP] = "i";
}
else {
$testMAC[$roll][$NEXTOP] = "A";
}
}
$roll;
}