2000-01-06 12:40:54 +00:00
|
|
|
#! @LOCALPREFIX@/bin/perl
|
|
|
|
# $FreeBSD$
|
|
|
|
|
|
|
|
if ($< != 0) {
|
|
|
|
print STDERR "must be root to invoke this\n";
|
|
|
|
exit 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
$mode = 'add';
|
|
|
|
while ($i = shift @ARGV) {
|
|
|
|
if ($i eq '-d') {
|
|
|
|
$mode = 'delete';
|
|
|
|
} else {
|
|
|
|
print STDERR "usage: scriptdump [-d]\n";
|
|
|
|
exit 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
open(IN, "setkey -D |") || die;
|
|
|
|
foreach $_ (<IN>) {
|
|
|
|
if (/^[^\t]/) {
|
|
|
|
($src, $dst) = split(/\s+/, $_);
|
2000-07-04 16:22:05 +00:00
|
|
|
} elsif (/^\t(esp|ah) mode=(\S+) spi=(\d+).*reqid=(\d+)/) {
|
|
|
|
($proto, $ipsecmode, $spi, $reqid) = ($1, $2, $3, $4);
|
2000-01-06 12:40:54 +00:00
|
|
|
} elsif (/^\tE: (\S+) (.*)/) {
|
|
|
|
$ealgo = $1;
|
|
|
|
$ekey = $2;
|
|
|
|
$ekey =~ s/\s//g;
|
|
|
|
$ekey =~ s/^/0x/g;
|
|
|
|
} elsif (/^\tA: (\S+) (.*)/) {
|
|
|
|
$aalgo = $1;
|
|
|
|
$akey = $2;
|
|
|
|
$akey =~ s/\s//g;
|
|
|
|
$akey =~ s/^/0x/g;
|
2000-07-04 16:22:05 +00:00
|
|
|
} elsif (/^\treplay=(\d+) flags=(0x\d+) state=/) {
|
2001-06-11 12:39:29 +00:00
|
|
|
print "$mode $src $dst $proto $spi";
|
2000-07-04 16:22:05 +00:00
|
|
|
$replay = $1;
|
|
|
|
print " -u $reqid" if $reqid;
|
2000-01-06 12:40:54 +00:00
|
|
|
if ($mode eq 'add') {
|
2001-06-11 12:39:29 +00:00
|
|
|
print " -m $ipsecmode -r $replay" if $replay;
|
2000-01-06 12:40:54 +00:00
|
|
|
if ($proto eq 'esp') {
|
|
|
|
print " -E $ealgo $ekey" if $ealgo;
|
|
|
|
print " -A $aalgo $akey" if $aalgo;
|
|
|
|
} elsif ($proto eq 'ah') {
|
|
|
|
print " -A $aalgo $akey" if $aalgo;
|
|
|
|
}
|
2000-07-04 16:22:05 +00:00
|
|
|
}
|
2000-01-06 12:40:54 +00:00
|
|
|
print ";\n";
|
|
|
|
|
|
|
|
$src = $dst = $upper = $proxy = '';
|
|
|
|
$ealgo = $ekey = $aalgo = $akey = '';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
close(IN);
|
|
|
|
|
|
|
|
exit 0;
|