summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRobert Bays <rbays@moresby.(none)>2007-11-14 21:58:13 -0800
committerRobert Bays <rbays@moresby.(none)>2007-11-14 21:58:13 -0800
commit04a2f81e5559f7a0d2f1cb22e1b72196e19b3d0b (patch)
tree934243a72b5c01a6c787f46d1b16e1b7617d4fd3 /scripts
parent1a9535e68042f67087cd400523dc42103292c2fe (diff)
downloadvyatta-cfg-quagga-04a2f81e5559f7a0d2f1cb22e1b72196e19b3d0b.tar.gz
vyatta-cfg-quagga-04a2f81e5559f7a0d2f1cb22e1b72196e19b3d0b.zip
enable peer-groups
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/bgp/vyatta-bgp.pl83
1 files changed, 82 insertions, 1 deletions
diff --git a/scripts/bgp/vyatta-bgp.pl b/scripts/bgp/vyatta-bgp.pl
index d20ad8fa..ee4c9a49 100755
--- a/scripts/bgp/vyatta-bgp.pl
+++ b/scripts/bgp/vyatta-bgp.pl
@@ -1,12 +1,29 @@
#!/usr/bin/perl
use lib "/opt/vyatta/share/perl5/";
+use VyattaConfig;
use VyattaMisc;
use Getopt::Long;
GetOptions("check-peer-name=s" => \$peername,
+ "check-as" => \$checkas,
+ "check-peer-groups" => \$checkpeergroups,
+ "peergroup=s" => \$pg,
+ "as=s" => \$as,
+ "neighbor=s" => \$neighbor,
);
-if (defined $peername) { check_peer_name($peername); }
+if (defined $peername) { check_peer_name($peername); }
+elsif (defined $checkpeergroups &&
+ defined $pg &&
+ defined $as) { check_for_peer_groups($pg, $as); }
+elsif (defined $neighbor &&
+ defined $as &&
+ defined $checkas &&
+ defined $pg) { check_as($pg, $neighbor, $as); }
+elsif (defined $neighbor &&
+ defined $as &&
+ defined $checkas) { check_as(-1, $neighbor, $as); }
+
exit 0;
@@ -20,3 +37,67 @@ sub check_peer_name() {
}
exit 0;
}
+
+sub check_for_peer_groups() {
+ my $config = new VyattaConfig;
+ my $pg = shift;
+ my $as = shift;
+ my $node;
+ my @peers, @neighbors;
+
+ $config->setLevel("protocols bgp $as neighbor");
+ my @neighbors = $config->listNodes();
+
+ foreach $node (@neighbors) {
+ my $peergroup = $config->returnValue("$node peer-group");
+ if ($peergroup eq $pg) { push @peers, $node; }
+ }
+
+ if (@peers) {
+ foreach $node (@peers) {
+ print "neighbor $node uses peer-group $pg\n";
+ }
+
+ print "please delete these peers before removing the peer-group\n";
+ exit 1;
+ }
+
+ exit 0;
+}
+
+sub check_as() {
+ my $pg = shift;
+ my $neighbor = shift;
+ my $as = shift;
+ my $config = new VyattaConfig;
+ my $pgtest = $neighbor;
+
+ $pgtest =~ s/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}//;
+ if ($pgtest ne "") { return; }
+
+ $config->setLevel("protocols bgp $as neighbor $neighbor");
+ $remoteas = $config->returnValue("remote-as");
+
+ if (! defined $remoteas) {
+ if ($pg > 0) {
+ $peergroup = 1;
+ $peergroupas = 1;
+ }
+ else {
+ $peergroup = $config->returnValue("peer-group");
+ $peergroupas = $config->returnValue(" .. $peergroup remote-as");
+ }
+
+ if (! defined $peergroup) {
+ print "You must define a remote-as or peer-group for neighbor $neighbor before commiting\n";
+ exit 1;
+ }
+
+ if (! defined $peergroupas) {
+ print "You must define a remote-as in neighbor $neighbor or peer-group $peergroup before commiting\n";
+ exit 1;
+ }
+ }
+
+ exit 0;
+}