]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sbin/setkey/scriptdump.pl
MFC r368207,368607:
[FreeBSD/stable/10.git] / sbin / setkey / scriptdump.pl
1 #! @LOCALPREFIX@/bin/perl
2 # $FreeBSD$
3
4 if ($< != 0) {
5         print STDERR "must be root to invoke this\n";
6         exit 1;
7 }
8
9 $mode = 'add';
10 while ($i = shift @ARGV) {
11         if ($i eq '-d') {
12                 $mode = 'delete';
13         } else {
14                 print STDERR "usage: scriptdump [-d]\n";
15                 exit 1;
16         }
17 }
18
19 open(IN, "setkey -D |") || die;
20 foreach $_ (<IN>) {
21         if (/^[^\t]/) {
22                 ($src, $dst) = split(/\s+/, $_);
23         } elsif (/^\t(esp|ah) mode=(\S+) spi=(\d+).*reqid=(\d+)/) {
24                 ($proto, $ipsecmode, $spi, $reqid) = ($1, $2, $3, $4);
25         } elsif (/^\tE: (\S+) (.*)/) {
26                 $ealgo = $1;
27                 $ekey = $2;
28                 $ekey =~ s/\s//g;
29                 $ekey =~ s/^/0x/g;
30         } elsif (/^\tA: (\S+) (.*)/) {
31                 $aalgo = $1;
32                 $akey = $2;
33                 $akey =~ s/\s//g;
34                 $akey =~ s/^/0x/g;
35         } elsif (/^\tseq=(0x\d+) replay=(\d+) flags=(0x\d+) state=/) {
36                 print "$mode $src $dst $proto $spi";
37                 $replay = $2;
38                 print " -u $reqid" if $reqid;
39                 if ($mode eq 'add') {
40                         print " -m $ipsecmode -r $replay" if $replay;
41                         if ($proto eq 'esp') {
42                                 print " -E $ealgo $ekey" if $ealgo;
43                                 print " -A $aalgo $akey" if $aalgo;
44                         } elsif ($proto eq 'ah') {
45                                 print " -A $aalgo $akey" if $aalgo;
46                         }
47                 } 
48                 print ";\n";
49
50                 $src = $dst = $upper = $proxy = '';
51                 $ealgo = $ekey = $aalgo = $akey = '';
52         }
53 }
54 close(IN);
55
56 exit 0;