diff options
-rw-r--r-- | includes/config.defaults.php | 10 | ||||
-rw-r--r-- | includes/utils.php | 50 | ||||
-rw-r--r-- | index.php | 4 | ||||
-rw-r--r-- | routers/bird.php | 24 | ||||
-rw-r--r-- | routers/cisco.php | 20 | ||||
-rw-r--r-- | routers/juniper.php | 8 | ||||
-rw-r--r-- | routers/quagga.php | 24 |
7 files changed, 71 insertions, 69 deletions
diff --git a/includes/config.defaults.php b/includes/config.defaults.php index bd1687f..0fbca1a 100644 --- a/includes/config.defaults.php +++ b/includes/config.defaults.php @@ -132,15 +132,15 @@ $config = array( ), // Documentation for the 'ping' query 'ping' => array( - 'command' => 'ping IP_ADDRESS|FQDN', - 'description' => 'Send 10 pings to the given destination.', - 'parameter' => 'The parameter must be an IPv4/IPv6 address (without mask) or a fully qualified domain name.<br />RFC1918 addresses, IPv6 starting with FD or FC, and IPv4 reserved ranges (0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 and 224.0.0.0/4) may be refused.<br /><br />Example of valid arguments:<br /><ul><li>8.8.8.8</li><li>2001:db8:1337::42</li><li>example.com</li></ul>' + 'command' => 'ping IP_ADDRESS|HOSTNAME', + 'description' => 'Send pings to the given destination.', + 'parameter' => 'The parameter must be an IPv4/IPv6 address (without mask) or a hostname.<br />RFC1918 addresses, IPv6 starting with FD or FC, and IPv4 reserved ranges (0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 and 224.0.0.0/4) may be refused.<br /><br />Example of valid arguments:<br /><ul><li>8.8.8.8</li><li>2001:db8:1337::42</li><li>example.com</li></ul>' ), // Documentation for the 'traceroute' query 'traceroute' => array( - 'command' =>'traceroute IP_ADDRESS|FQDN', + 'command' =>'traceroute IP_ADDRESS|HOSTNAME', 'description' => 'Display the path to a given destination.', - 'parameter' => 'The parameter must be an IPv4/IPv6 address (without mask) or a fully qualified domain name.<br />RFC1918 addresses, IPv6 starting with FD or FC, and IPv4 reserved ranges (0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 and 224.0.0.0/4) may be refused.<br /><br />Example of valid arguments:<br /><ul><li>8.8.8.8</li><li>2001:db8:1337::42</li><li>example.com</li></ul>' + 'parameter' => 'The parameter must be an IPv4/IPv6 address (without mask) or a hostname.<br />RFC1918 addresses, IPv6 starting with FD or FC, and IPv4 reserved ranges (0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 and 224.0.0.0/4) may be refused.<br /><br />Example of valid arguments:<br /><ul><li>8.8.8.8</li><li>2001:db8:1337::42</li><li>example.com</li></ul>' ) ), diff --git a/includes/utils.php b/includes/utils.php index 828832f..79888dd 100644 --- a/includes/utils.php +++ b/includes/utils.php @@ -142,24 +142,25 @@ function match_ipv6($ip, $ip_only = true) { } /** - * Test if a given parameter is a valid FQDN or not. + * Test if a given parameter is a valid hostname or not. * - * @param string $fqdn the parameter to test. - * @return boolean true if the parameter matches a valid FQDN, false otherwise. + * See: http://stackoverflow.com/a/4694816 + * http://stackoverflow.com/a/2183140 + * for references. + * + * @param string $hostname the parameter to test. + * @return boolean true if the parameter matches a valid hostname, false + * otherwise. */ -function match_fqdn($fqdn) { - $regex = '/(?=^.{4,255}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)/'; - - if (empty($fqdn)) { - return false; - } - - if ((preg_match($regex, $fqdn) === false) || - (preg_match($regex, $fqdn) === 0)) { - return false; - } else { - return true; - } +function match_hostname($hostname) { + return ( + // Valid characters check + preg_match('/^(_?[a-z\d](-*[_a-z\d])*)(\.(_?[a-z\d](-*[_a-z\d])*))*$/i', $hostname) + // Length check + && preg_match('/^.{1,253}$/', $hostname) + // Length of each label check + && preg_match('/^[^\.]{1,63}(\.[^\.]{1,63})*$/', $hostname) + ); } /** @@ -212,19 +213,20 @@ function match_aspath_regex($aspath_regex) { } /** - * For a given FQDN try to find the corresponding IPv4 or IPv6 address. + * For a given hostname try to find the corresponding IPv4 or IPv6 address. * - * If there is multiple addresses attached to the same FQDN it will give the - * first IPv4 or IPv6 found. + * If there is multiple addresses attached to the same hostname it will give + * the first IPv4 or IPv6 found. * - * If the FQDN have both IPv4 and IPv6 addresses it will give the first IPv6 - * address found. + * If the hostname have both IPv4 and IPv6 addresses it will give the first + * IPv6 address found. * - * @param string $fqdn the FQDN to use to search in the DNS databases. + * @param string $hostname the hostname to use to search in the DNS + * databases. * @return string an IPv4 or IPv6 address based on the DNS records. */ -function fqdn_to_ip_address($fqdn) { - $dns_record = dns_get_record($fqdn, DNS_A + DNS_AAAA); +function hostname_to_ip_address($hostname) { + $dns_record = dns_get_record($hostname, DNS_A + DNS_AAAA); // No DNS record found if (!$dns_record) { @@ -65,8 +65,8 @@ final class LookingGlass { print('<option value="bgp" selected="selected">show route IP_ADDRESS</option>'); print('<option value="as-path-regex">show route as-path-regex AS_PATH_REGEX</option>'); print('<option value="as">show route AS</option>'); - print('<option value="ping">ping IP_ADDRESS|FQDN</option>'); - print('<option value="traceroute">traceroute IP_ADDRESS|FQDN</option>'); + print('<option value="ping">ping IP_ADDRESS|HOSTNAME</option>'); + print('<option value="traceroute">traceroute IP_ADDRESS|HOSTNAME</option>'); print('</select>'); print('</div>'); } diff --git a/routers/bird.php b/routers/bird.php index fe9b197..b1a75b8 100644 --- a/routers/bird.php +++ b/routers/bird.php @@ -26,21 +26,21 @@ final class Bird extends Router { protected function build_ping($destination) { $ping = null; - if (match_fqdn($destination)) { - $fqdn = $destination; - $destination = fqdn_to_ip_address($fqdn); + if (match_hostname($destination)) { + $hostname = $destination; + $destination = hostname_to_ip_address($hostname); if (!$destination) { - throw new Exception('No A or AAAA record found for '.$fqdn); + throw new Exception('No A or AAAA record found for '.$hostname); } } if (match_ipv4($destination)) { $ping = 'ping '.$this->global_config['tools']['ping_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else if (match_ipv6($destination)) { $ping = 'ping6 '.$this->global_config['tools']['ping_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else { throw new Exception('The parameter does not resolve to an IPv4/IPv6 address.'); } @@ -63,23 +63,23 @@ final class Bird extends Router { protected function build_traceroute($destination) { $traceroute = null; - if (match_fqdn($destination)) { - $fqdn = $destination; - $destination = fqdn_to_ip_address($fqdn); + if (match_hostname($destination)) { + $hostname = $destination; + $destination = hostname_to_ip_address($hostname); if (!$destination) { - throw new Exception('No A or AAAA record found for '.$fqdn); + throw new Exception('No A or AAAA record found for '.$hostname); } } if (match_ipv4($destination)) { $traceroute = $this->global_config['tools']['traceroute4'].' '. $this->global_config['tools']['traceroute_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else if (match_ipv6($destination)) { $traceroute = $this->global_config['tools']['traceroute6'].' '. $this->global_config['tools']['traceroute_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else { throw new Exception('The parameter does not resolve to an IPv4/IPv6 address.'); } diff --git a/routers/cisco.php b/routers/cisco.php index 0763bd7..e36a6bf 100644 --- a/routers/cisco.php +++ b/routers/cisco.php @@ -27,10 +27,10 @@ final class Cisco extends Router { $ping = null; if (match_ipv4($destination) || match_ipv6($destination) || - match_fqdn($destination)) { + match_hostname($destination)) { $ping = 'ping '.$destination.' repeat 10'; } else { - throw new Exception('The parameter is not an IPv4/IPv6 address or a FQDN.'); + throw new Exception('The parameter is not an IPv4/IPv6 address or a hostname.'); } if (($ping != null) && $this->has_source_interface_id()) { @@ -44,25 +44,25 @@ final class Cisco extends Router { $traceroute = null; if (match_ipv4($destination) || match_ipv6($destination) || - (match_fqdn($destination) && !$this->has_source_interface_id())) { + (match_hostname($destination) && !$this->has_source_interface_id())) { $traceroute = 'traceroute '.$destination; - } else if (match_fqdn($destination)) { - $fqdn = $destination; - $destination = fqdn_to_ip_address($fqdn); + } else if (match_hostname($destination)) { + $hostname = $destination; + $destination = hostname_to_ip_address($hostname); if (!$destination) { - throw new Exception('No A or AAAA record found for '.$fqdn); + throw new Exception('No A or AAAA record found for '.$hostname); } if (match_ipv4($destination)) { - $traceroute = 'traceroute ip '.(isset($fqdn) ? $fqdn : $destination); + $traceroute = 'traceroute ip '.(isset($hostname) ? $hostname : $destination); } else if (match_ipv6($destination)) { - $traceroute = 'traceroute ipv6 '.(isset($fqdn) ? $fqdn : $destination); + $traceroute = 'traceroute ipv6 '.(isset($hostname) ? $hostname : $destination); } else { throw new Exception('The parameter does not resolve to an IPv4/IPv6 address.'); } } else { - throw new Exception('The parameter is not an IPv4/IPv6 address or a FQDN.'); + throw new Exception('The parameter is not an IPv4/IPv6 address or a hostname.'); } if (($traceroute != null) && $this->has_source_interface_id() && diff --git a/routers/juniper.php b/routers/juniper.php index b5c3449..3eb34e5 100644 --- a/routers/juniper.php +++ b/routers/juniper.php @@ -27,10 +27,10 @@ final class Juniper extends Router { $ping = null; if (match_ipv4($destination) || match_ipv6($destination) || - match_fqdn($destination)) { + match_hostname($destination)) { $ping = 'ping count 10 rapid '.$destination; } else { - throw new Exception('The parameter is not an IPv4/IPv6 address or a FQDN.'); + throw new Exception('The parameter is not an IPv4/IPv6 address or a hostname.'); } if (($ping != null) && $this->has_source_interface_id()) { @@ -45,10 +45,10 @@ final class Juniper extends Router { if (match_ipv4($destination)) { $traceroute = 'traceroute as-number-lookup '.$destination; - } else if (match_ipv6($destination) || match_fqdn($destination)) { + } else if (match_ipv6($destination) || match_hostname($destination)) { $traceroute = 'traceroute '.$destination; } else { - throw new Exception('The parameter is not an IPv4/IPv6 address or a FQDN.'); + throw new Exception('The parameter is not an IPv4/IPv6 address or a hostname.'); } if (($traceroute != null) && $this->has_source_interface_id()) { diff --git a/routers/quagga.php b/routers/quagga.php index 1944273..9ce6606 100644 --- a/routers/quagga.php +++ b/routers/quagga.php @@ -26,21 +26,21 @@ final class Quagga extends Router { protected function build_ping($destination) { $ping = null; - if (match_fqdn($destination)) { - $fqdn = $destination; - $destination = fqdn_to_ip_address($fqdn); + if (match_hostname($destination)) { + $hostname = $destination; + $destination = hostname_to_ip_address($hostname); if (!$destination) { - throw new Exception('No A or AAAA record found for '.$fqdn); + throw new Exception('No A or AAAA record found for '.$hostname); } } if (match_ipv4($destination)) { $ping = 'ping '.$this->global_config['tools']['ping_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else if (match_ipv6($destination)) { $ping = 'ping6 '.$this->global_config['tools']['ping_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else { throw new Exception('The parameter does not resolve to an IPv4/IPv6 address.'); } @@ -63,23 +63,23 @@ final class Quagga extends Router { protected function build_traceroute($destination) { $traceroute = null; - if (match_fqdn($destination)) { - $fqdn = $destination; - $destination = fqdn_to_ip_address($fqdn); + if (match_hostname($destination)) { + $hostname = $destination; + $destination = hostname_to_ip_address($hostname); if (!$destination) { - throw new Exception('No A or AAAA record found for '.$fqdn); + throw new Exception('No A or AAAA record found for '.$hostname); } } if (match_ipv4($destination)) { $traceroute = $this->global_config['tools']['traceroute4'].' '. $this->global_config['tools']['traceroute_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else if (match_ipv6($destination)) { $traceroute = $this->global_config['tools']['traceroute6'].' '. $this->global_config['tools']['traceroute_options'].' '. - (isset($fqdn) ? $fqdn : $destination); + (isset($hostname) ? $hostname : $destination); } else { throw new Exception('The parameter does not resolve to an IPv4/IPv6 address.'); } |