summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.php.example24
-rw-r--r--routers/openbgpd.php151
-rw-r--r--routers/router.php4
3 files changed, 179 insertions, 0 deletions
diff --git a/config.php.example b/config.php.example
index 107ff1d..dd514f0 100644
--- a/config.php.example
+++ b/config.php.example
@@ -77,4 +77,28 @@ $config['routers']['router3']['source-interface-id'] = '192.168.1.1';
// The router description to be displayed in the router list
$config['routers']['router3']['desc'] = 'Example\'s Router 3';
+// Router based on OpenBGPd
+// The hostname or the IP address
+$config['routers']['router4']['host'] = 'r4.example.net';
+// The user to use to connect to the router
+$config['routers']['router4']['user'] = 'openbgpduser';
+// The password of the given user
+$config['routers']['router4']['pass'] = 'openbgpduserpassword';
+// The authentication mecanism to use (can be ssh-password or ssh-key)
+$config['routers']['router4']['auth'] = 'ssh-password';
+// The router type (can only be openbgpd)
+$config['routers']['router4']['type'] = 'openbgpd';
+// The router source address to be used
+$config['routers']['router4']['source-interface-id'] = '192.168.1.1';
+// The router description to be displayed in the router list
+$config['routers']['router4']['desc'] = 'OpenBGPd Router';
+
+// If running on *BSD, disable '-A' which is non-existent
+$config['tools']['ping_options'] = '-c 5';
+// If running on *BSD, disable '-N' which is non-existent
+$config['tools']['traceroute_options'] = '-A -q1 -w2 -m15';
+// If running on *BSD, there is no '-4' or '-6'
+$config['tools']['traceroute6'] = 'traceroute6';
+$config['tools']['traceroute4'] = 'traceroute';
+
// End of config.php
diff --git a/routers/openbgpd.php b/routers/openbgpd.php
new file mode 100644
index 0000000..8b609dc
--- /dev/null
+++ b/routers/openbgpd.php
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * Looking Glass - An easy to deploy Looking Glass
+ * Copyright (C) 2014-2017 Guillaume Mazoyer <gmazoyer@gravitons.in>
+ * Copyright (C) 2017 Denis Fondras <github@ggl.ledeuns.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+require_once('router.php');
+require_once('includes/utils.php');
+
+final class OpenBGPd extends Router {
+ protected function build_ping($destination) {
+ $ping = null;
+
+ if (match_hostname($destination)) {
+ $hostname = $destination;
+ $destination = hostname_to_ip_address($hostname, $this->config);
+
+ if (!$destination) {
+ throw new Exception('No record found for '.$hostname);
+ }
+ }
+
+ if (match_ipv6($destination)) {
+ $ping = 'ping6 '.$this->global_config['tools']['ping_options'].' '.
+ (isset($hostname) ? $hostname : $destination);
+ } else if (match_ipv4($destination)) {
+ $ping = 'ping '.$this->global_config['tools']['ping_options'].' '.
+ (isset($hostname) ? $hostname : $destination);
+ } else {
+ throw new Exception('The parameter does not resolve to an IP address.');
+ }
+
+ if (($ping != null) && $this->has_source_interface_id()) {
+ if (match_ipv6($destination) &&
+ ($this->get_source_interface_id('ipv6') != null)) {
+ $ping .= ' '.$this->global_config['tools']['ping_source_option'].' '.
+ $this->get_source_interface_id('ipv6');
+ } else if (match_ipv4($destination) &&
+ ($this->get_source_interface_id('ipv4') != null)) {
+ $ping .= ' '.$this->global_config['tools']['ping_source_option'].' '.
+ $this->get_source_interface_id('ipv4');
+ }
+ }
+
+ return $ping;
+ }
+
+ protected function build_traceroute($destination) {
+ $traceroute = null;
+
+ if (match_hostname($destination)) {
+ $hostname = $destination;
+ $destination = hostname_to_ip_address($hostname, $this->config);
+
+ if (!$destination) {
+ throw new Exception('No record found for '.$hostname);
+ }
+ }
+
+ if (match_ipv6($destination)) {
+ $traceroute = $this->global_config['tools']['traceroute6'].' '.
+ $this->global_config['tools']['traceroute_options'].' '.
+ (isset($hostname) ? $hostname : $destination);
+ } else if (match_ipv4($destination)) {
+ $traceroute = $this->global_config['tools']['traceroute4'].' '.
+ $this->global_config['tools']['traceroute_options'].' '.
+ (isset($hostname) ? $hostname : $destination);
+ } else {
+ throw new Exception('The parameter does not resolve to an IP address.');
+ }
+
+ if (($traceroute != null) && $this->has_source_interface_id()) {
+ if (match_ipv6($destination) &&
+ ($this->get_source_interface_id('ipv6') != null)) {
+ $traceroute .= ' '.
+ $this->global_config['tools']['traceroute_source_option'].' '.
+ $this->get_source_interface_id('ipv6');
+ } else if (match_ipv4($destination) &&
+ ($this->get_source_interface_id('ipv4') != null)) {
+ $traceroute .= ' '.
+ $this->global_config['tools']['traceroute_source_option'].' '.
+ $this->get_source_interface_id('ipv4');
+ }
+ }
+
+ return $traceroute;
+ }
+
+ protected function build_commands($command, $parameter) {
+ $commands = array();
+
+ $bgpctl = 'bgpctl ';
+
+ switch ($command) {
+ case 'bgp':
+ if (match_ipv6($parameter, false) or match_ipv4($parameter, false)) {
+ $commands[] = $bgpctl.'show ip bgp '.$parameter;
+ } else {
+ throw new Exception('The parameter is not an IP address.');
+ }
+ break;
+
+ case 'as':
+ if (match_as($parameter)) {
+ $commands[] = $bgpctl.'show ip bgp as '.$parameter;
+ } else {
+ throw new Exception('The parameter is not an AS number.');
+ }
+ break;
+
+ case 'ping':
+ try {
+ $commands[] = $this->build_ping($parameter);
+ } catch (Exception $e) {
+ throw $e;
+ }
+ break;
+
+ case 'traceroute':
+ try {
+ $commands[] = $this->build_traceroute($parameter);
+ } catch (Exception $e) {
+ throw $e;
+ }
+ break;
+
+ default:
+ throw new Exception('Command not supported.');
+ }
+
+ return $commands;
+ }
+}
+
+// End of openbgpd.php
diff --git a/routers/router.php b/routers/router.php
index d27ed93..7eadadb 100644
--- a/routers/router.php
+++ b/routers/router.php
@@ -26,6 +26,7 @@ require_once('cisco.php');
require_once('cisco_iosxr.php');
require_once('juniper.php');
require_once('quagga.php');
+require_once('openbgpd.php');
require_once('includes/utils.php');
require_once('auth/authentication.php');
@@ -183,6 +184,9 @@ abstract class Router {
case 'zebra':
return new Quagga($config, $router_config, $id, $requester);
+ case 'openbgpd':
+ return new OpenBGPd($config, $router_config, $id, $requester);
+
default:
print('Unknown router type "'.$router_config['type'].'".');
return null;