summaryrefslogtreecommitdiff
path: root/usr.sbin/setkey/scriptdump.pl
blob: fd53d0ee1cbec464449cf7373ad13be7310f154c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! @LOCALPREFIX@/bin/perl
#
#	$NetBSD: scriptdump.pl,v 1.2 1999/07/06 13:13:03 itojun Exp $
#

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, $upper, $proxy) = split(/\s+/, $_);
	} elsif (/^\t(esp|ah) spi=(\d+).*replay=(\d+)/) {
		($proto, $spi, $replay) = ($1, $2, $3);
	} 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;
	} elsif (/^\tstate=/) {
		print "$mode $src $src $upper $spi $proxy -p $proto";
		if ($mode eq 'add') {
			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;
			}
			print " -r $replay" if $replay;
		}
		print ";\n";

		$src = $dst = $upper = $proxy = '';
		$ealgo = $ekey = $aalgo = $akey = '';
	}
}
close(IN);

exit 0;