xref: /freebsd-src/sbin/setkey/scriptdump.pl (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
19a4365d0SYoshinobu Inoue#! @LOCALPREFIX@/bin/perl
29a4365d0SYoshinobu Inoue
39a4365d0SYoshinobu Inoueif ($< != 0) {
49a4365d0SYoshinobu Inoue	print STDERR "must be root to invoke this\n";
59a4365d0SYoshinobu Inoue	exit 1;
69a4365d0SYoshinobu Inoue}
79a4365d0SYoshinobu Inoue
89a4365d0SYoshinobu Inoue$mode = 'add';
99a4365d0SYoshinobu Inouewhile ($i = shift @ARGV) {
109a4365d0SYoshinobu Inoue	if ($i eq '-d') {
119a4365d0SYoshinobu Inoue		$mode = 'delete';
129a4365d0SYoshinobu Inoue	} else {
139a4365d0SYoshinobu Inoue		print STDERR "usage: scriptdump [-d]\n";
149a4365d0SYoshinobu Inoue		exit 1;
159a4365d0SYoshinobu Inoue	}
169a4365d0SYoshinobu Inoue}
179a4365d0SYoshinobu Inoue
189a4365d0SYoshinobu Inoueopen(IN, "setkey -D |") || die;
199a4365d0SYoshinobu Inoueforeach $_ (<IN>) {
209a4365d0SYoshinobu Inoue	if (/^[^\t]/) {
219a4365d0SYoshinobu Inoue		($src, $dst) = split(/\s+/, $_);
223c62e87aSJun-ichiro itojun Hagino	} elsif (/^\t(esp|ah) mode=(\S+) spi=(\d+).*reqid=(\d+)/) {
233c62e87aSJun-ichiro itojun Hagino		($proto, $ipsecmode, $spi, $reqid) = ($1, $2, $3, $4);
249a4365d0SYoshinobu Inoue	} elsif (/^\tE: (\S+) (.*)/) {
259a4365d0SYoshinobu Inoue		$ealgo = $1;
269a4365d0SYoshinobu Inoue		$ekey = $2;
279a4365d0SYoshinobu Inoue		$ekey =~ s/\s//g;
289a4365d0SYoshinobu Inoue		$ekey =~ s/^/0x/g;
299a4365d0SYoshinobu Inoue	} elsif (/^\tA: (\S+) (.*)/) {
309a4365d0SYoshinobu Inoue		$aalgo = $1;
319a4365d0SYoshinobu Inoue		$akey = $2;
329a4365d0SYoshinobu Inoue		$akey =~ s/\s//g;
339a4365d0SYoshinobu Inoue		$akey =~ s/^/0x/g;
34*232bdaf6SHajimu UMEMOTO	} elsif (/^\tseq=(0x\d+) replay=(\d+) flags=(0x\d+) state=/) {
3533841545SHajimu UMEMOTO		print "$mode $src $dst $proto $spi";
36*232bdaf6SHajimu UMEMOTO		$replay = $2;
373c62e87aSJun-ichiro itojun Hagino		print " -u $reqid" if $reqid;
389a4365d0SYoshinobu Inoue		if ($mode eq 'add') {
3933841545SHajimu UMEMOTO			print " -m $ipsecmode -r $replay" if $replay;
409a4365d0SYoshinobu Inoue			if ($proto eq 'esp') {
419a4365d0SYoshinobu Inoue				print " -E $ealgo $ekey" if $ealgo;
429a4365d0SYoshinobu Inoue				print " -A $aalgo $akey" if $aalgo;
439a4365d0SYoshinobu Inoue			} elsif ($proto eq 'ah') {
449a4365d0SYoshinobu Inoue				print " -A $aalgo $akey" if $aalgo;
459a4365d0SYoshinobu Inoue			}
469a4365d0SYoshinobu Inoue		}
479a4365d0SYoshinobu Inoue		print ";\n";
489a4365d0SYoshinobu Inoue
499a4365d0SYoshinobu Inoue		$src = $dst = $upper = $proxy = '';
509a4365d0SYoshinobu Inoue		$ealgo = $ekey = $aalgo = $akey = '';
519a4365d0SYoshinobu Inoue	}
529a4365d0SYoshinobu Inoue}
539a4365d0SYoshinobu Inoueclose(IN);
549a4365d0SYoshinobu Inoue
559a4365d0SYoshinobu Inoueexit 0;
56