From eca889e866cdb3ce924a16c7e34ae6d794ce7576 Mon Sep 17 00:00:00 2001 From: checktheroads Date: Mon, 10 Jun 2019 12:22:38 -0700 Subject: [PATCH] all the things --- docs/configuration/branding.md | 398 ++++++++------- docs/configuration/commands.md | 58 +++ docs/configuration/features.md | 256 ++++++++++ docs/configuration/general.md | 158 ------ docs/configuration/index.md | 127 ++--- docs/monitoring.md | 0 docs/traceroute_nanog.pdf | Bin 0 -> 180282 bytes hyperglass/command/construct.py | 55 +- hyperglass/command/execute.py | 126 +++-- hyperglass/command/validate.py | 102 ++-- hyperglass/configuration/__init__.py | 457 +++++++++++------ .../configuration/blacklist.toml.example | 8 - .../requires_ipv6_cidr.toml.example | 4 - hyperglass/hyperglass.py | 126 +++-- hyperglass/render/__init__.py | 188 +++++-- hyperglass/render/templates/404.html | 44 ++ hyperglass/render/templates/429.html | 10 +- hyperglass/render/templates/500.html | 10 +- hyperglass/render/templates/base.html | 27 +- hyperglass/render/templates/bgp_aspath.html | 2 - .../render/templates/bgp_community.html | 2 - .../render/templates/content/.gitignore | 1 - .../templates/content/footer.md.example | 3 - hyperglass/render/templates/credit.html | 2 +- hyperglass/render/templates/footer.html | 2 +- hyperglass/render/templates/hyperglass.scss | 26 +- hyperglass/render/templates/index.html | 150 +++--- hyperglass/render/templates/info/.gitignore | 2 + .../templates/info/bgp_aspath.md.example | 6 + .../templates/info/bgp_community.md.example | 6 + .../templates/info/bgp_route.md.example | 3 + .../render/templates/info/details/.gitignore | 2 + .../details}/bgp_aspath.md.example | 2 +- .../details}/bgp_community.md.example | 2 +- .../templates/info/details/footer.md.example | 3 + .../render/templates/info/ping.md.example | 3 + .../templates/info/traceroute.md.example | 3 + hyperglass/static/js/clipboard.min.js | 7 + hyperglass/static/js/hyperglass.js | 93 ++-- .../static/sass/custom/custom_elements.sass | 31 +- manage.py | 468 ++++++++++++++++-- mkdocs.yml | 5 +- 42 files changed, 2010 insertions(+), 968 deletions(-) create mode 100644 docs/configuration/commands.md create mode 100644 docs/configuration/features.md delete mode 100644 docs/configuration/general.md create mode 100644 docs/monitoring.md create mode 100644 docs/traceroute_nanog.pdf delete mode 100644 hyperglass/configuration/blacklist.toml.example delete mode 100644 hyperglass/configuration/requires_ipv6_cidr.toml.example create mode 100644 hyperglass/render/templates/404.html delete mode 100644 hyperglass/render/templates/bgp_aspath.html delete mode 100644 hyperglass/render/templates/bgp_community.html delete mode 100644 hyperglass/render/templates/content/.gitignore delete mode 100644 hyperglass/render/templates/content/footer.md.example create mode 100644 hyperglass/render/templates/info/.gitignore create mode 100644 hyperglass/render/templates/info/bgp_aspath.md.example create mode 100644 hyperglass/render/templates/info/bgp_community.md.example create mode 100644 hyperglass/render/templates/info/bgp_route.md.example create mode 100644 hyperglass/render/templates/info/details/.gitignore rename hyperglass/render/templates/{content => info/details}/bgp_aspath.md.example (88%) rename hyperglass/render/templates/{content => info/details}/bgp_community.md.example (71%) create mode 100644 hyperglass/render/templates/info/details/footer.md.example create mode 100644 hyperglass/render/templates/info/ping.md.example create mode 100644 hyperglass/render/templates/info/traceroute.md.example create mode 100755 hyperglass/static/js/clipboard.min.js diff --git a/docs/configuration/branding.md b/docs/configuration/branding.md index aef3e38..4c17271 100644 --- a/docs/configuration/branding.md +++ b/docs/configuration/branding.md @@ -12,8 +12,8 @@ From `hyperglass/hyperglass/configuration/configuration.toml` `[branding]` table. -# Site Parameters -#### site_title +# `[branding]` - Site Parameters +#### site_name | Type | Default Value | | ------ | -------------- | @@ -21,6 +21,42 @@ From `hyperglass/hyperglass/configuration/configuration.toml` `[branding]` table HTML `` element that is shown in a browser's title bar. +## `[branding.footer]` - Footer Configuration +#### enable + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables entire footer element. + +The footer text itself can be customized by adding a [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) document to `hyperglass/hyperglass/render/templates/info/details/footer.md`. The example file, `footer.md.example`, can be copied to `footer.md` and modified. All Markdown files in this directory are excluded from change control and will not be overwritten when hyperglass is updated. + +!!! note "Syntax" + The custom content Markdown files *must* have TOML Front Matter, even if there are no attributes used. + +## `[branding.credit]` - Credit Configuration +#### enable + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables text below the footer element, which links to the hyperglass repo: + +> Powered by Hyperglass. Source code licensed BSD 3-Clause Clear. + +## `[branding.peering_db]` - PeeringDB Configuration +#### enable + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables the PeeringDB link in the upper right corner. If `true`, the [primary_asn](#primary_asn) will be automatically used to create the URL to your ASN's PeeringDB entry. + +## `[branding.text]` - Site-Wide Text Customizations + #### title_mode | Type | Default Value | @@ -47,91 +83,113 @@ Controls the title section on the main page. See [primary_asn](#primary_asn) parameter. -#### enable_footer +#### query_type -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | +| Type | Default Value | +| ------ | -------------------- | +| String | `"Query Type"` | -Enables or disables entire footer element, which contains text defined in `hyperglass/hyperglass/render/templates/footer.md`. +Placeholder text that appears in the Query Type dropdown. -#### enable_credit +#### results -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | +| Type | Default Value | +| ------ | -------------------- | +| String | `"Results"` | -Enables or disables hoverable icon on the left side of the footer, which links to the hyperglass repo. +Title text used for the results message box which contains the results of the query. -#### show_peeringdb +#### location -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | +| Type | Default Value | +| ------ | ---------------------- | +| String | `"Select Location..."` | -Enables or disables the PeeringDB link in the upper right corner. If `True`, the [primary_asn](#primary_asn) will be automatically used to create the URL to your ASN's PeeringDB entry. +Placeholder text that appears in the Location dropdown. -# Colors +#### query_placeholder -#### color_btn_submit +| Type | Default Value | +| ------ | ------------------------------------- | +| String | `"IP, Prefix, Community, or AS Path"` | -| Type | Default Value | Preview | -| ------ | ------------- | ----------------------------------------------------------------- | -| String | `"#40798c"` | <span class="bd-color" style="background-color: #40798c;"></span> | +Placeholder text that appears in the main search box. -Sets color of the submit button. +#### bgp_route -#### color_tag_loctitle +| Type | Default Value | +| ------ | ------------- | +| String | `"BGP Route"` | -| Type | Default Value | Preview | -| ------ | ------------- | ----------------------------------------------------------------- | -| String | `"#330036"` | <span class="bd-color" style="background-color: #330036;"></span> | +Dropdown text used for the BGP Route query type. -Sets color of the title portion of the location tag which appears at the top of the results box on the left side. +#### bgp_community -#### color_tag_cmdtitle +| Type | Default Value | +| ------ | ----------------- | +| String | `"BGP Community"` | -| Type | Default Value | Preview | -| ------ | ------------- | ----------------------------------------------------------------- | -| String | `"#330036"` | <span class="bd-color" style="background-color: #330036;"></span> | +Dropdown text used for the BGP Community query type. -Sets color of the title portion of the command tag which appears at the top of the results box on the right side. +#### bgp_aspath -#### color_tag_cmd +| Type | Default Value | +| ------ | --------------- | +| String | `"BGP AS Path"` | -| Type | Default Value | Preview | -| ------ | ------------- | ----------------------------------------------------------------- | -| String | `"#ff5e5b"` | <span class="bd-color" style="background-color: #ff5e5b;"></span> | +Dropdown text used for the BGP AS Path query type. -Sets color of the command name portion of the command tag which appears at the top of the results box on the right side. +#### ping -#### color_tag_loc +| Type | Default Value | +| ------ | ------------- | +| String | `"Ping"` | -| Type | Default Value | Preview | -| ------ | ------------- | ----------------------------------------------------------------- | -| String | `"#40798c"` | <span class="bd-color" style="background-color: #40798c;"></span> | +Dropdown text used for the Ping query type. -Sets color of the location name portion of the location tag which appears at the top of the results box on the left side. +#### traceroute -#### color_bg +| Type | Default Value | +| ------ | -------------- | +| String | `"Traceroute"` | -| Type | Default Value | Preview | -| ------ | ------------- | ----------------------------------------------------------------- | -| String | `"#fbfffe"` | <span class="bd-color" style="background-color: #fbfffe;"></span> | +Dropdown text used for the Traceroute query type. -Sets the background color of the main page. +### `[branding.text.404]` - 404 Error Page Text Customization -#### color_progressbar +The 404 error page will be displayed if a user attempts to visit any non-existent URI, e.g. `http://lg.domain.tld/this_isnt_real` -| Type | Default Value | Preview | -| ------ | ------------- | ----------------------------------------------------------------- | -| String | `"#40798c"` | <span class="bd-color" style="background-color: #40798c;"></span> | +#### title -Sets color of the progress bar that displays while the back-end application processes the request. +| Type | Default Value | +| ------ | ------------- | +| String | `"Error"` | -# Logo +#### subtitle -#### logo_path +| Type | Default Value | +| ------ | ------------------ | +| String | `"Page Not Found"` | + +### `[branding.text.500]` - 500 Error Page Text Customization + +The 500 error page will be displayed if there is a backend problem or if an exception is raised. If you get this page, you should probably enable debug mode to find out why. + +#### title + +| Type | Default Value | +| ------ | ------------- | +| String | `"Error"` | + +#### subtitle + +| Type | Default Value | +| ------ | ------------------------ | +| String | `"Something Went Wrong"` | + +## `[branding.logo]` - Logo & Favicon Configuration + +#### path | Type | Default Value | | ------ | ------------------------------------- | @@ -139,7 +197,10 @@ Sets color of the progress bar that displays while the back-end application proc Sets the path to the logo file, which will be displayed if [title_mode](#title_mode) is set to `"logo_only"`. This file can be any browser-compatible format, such as JPEG, PNG, or SVG. -#### logo_width +!!! note "Custom Files" + The `hyperglass/hyperglass/static/custom/` directory is excluded from change control, and will not be overwritten when hyperglass is updated. Custom image files should be placed here. + +#### width | Type | Default Value | | ------ | ------------- | @@ -147,31 +208,127 @@ Sets the path to the logo file, which will be displayed if [title_mode](#title_m Sets the width of the logo defined in the [logo_path](#logo_path) parameter. This is helpful if your logo is a dimension that doesn't quite work with the default width. -# UI Text - -#### placeholder_prefix +#### favicons | Type | Default Value | | ------ | ------------------------------------- | -| String | `"Prefix, IP, Community, or AS_PATH"` | +| String | `"static/images/favicon/"` | -Sets the placeholder text that appears in the main search box. +Sets the path to the favicons directory (must have a trailing `/`). For full browser and platform comatability, it is recommended to use [RealFaviconGenerator](https://realfavicongenerator.net/) and place all the generated files in `static/custom/images/favicon/` (and update the `favicons` parameter). -#### text_results +## `[branding.color]` - Color Customization + +#### background + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#fbfffe"` | <span class="bd-color" style="background-color: #fbfffe;"></span> | + +Sets the background color of the main page. + + +#### button_submit + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#40798c"` | <span class="bd-color" style="background-color: #40798c;"></span> | + +Sets color of the submit button. + +#### danger + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#ff3860"` | <span class="bd-color" style="background-color: #ff3860;"></span> | + +Sets color of the Bulma "danger" class, which is used for some user-facing error, and as the background color for the 404, 500 and Rate Limit error pages. + +#### progress_bar + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#40798c"` | <span class="bd-color" style="background-color: #40798c;"></span> | + +Sets color of the progress bar that displays while the back-end application processes the request. + +### `[branding.color.tag]` - Tag Color Customization + +Bulma tags are used to show attributes for the active query being run. + +#### type_title + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#330036"` | <span class="bd-color" style="background-color: #330036;"></span> | + +Sets color of the title portion of the query type tag which appears at the top of the results box on the right side. + +#### type + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#ff5e5b"` | <span class="bd-color" style="background-color: #ff5e5b;"></span> | + +Sets color of the type portion of the query type tag which appears at the top of the results box on the right side. + +#### location_title + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#330036"` | <span class="bd-color" style="background-color: #330036;"></span> | + +Sets color of the title portion of the location tag which appears at the top of the results box on the left side. + +#### location + +| Type | Default Value | Preview | +| ------ | ------------- | ----------------------------------------------------------------- | +| String | `"#40798c"` | <span class="bd-color" style="background-color: #40798c;"></span> | + +Sets color of the location name portion of the location tag which appears at the top of the results box on the left side. + +## `[branding.font]` - Font Customization + +Hyperglass makes use of two font families - a primary family and a monospace family. The primary family is used for all paragraph, title/subtitle, and non-code/preformatted text, and the monospace font is used for any code/preformatted blocks as well as the query results. + +The values are passed as a Jinja2 variable to generate `hyperglass/hyperglass/static/sass/hyperglass.scss`, which will be compiled from Sass to CSS. + +### `[branding.font.primary]` - Primary Font Customization + +#### name | Type | Default Value | | ------ | ------------- | -| String | `"Results"` | +| String | `"Nunito"` | -Sets the header text of the results box. +Sets the web font name for the primary font. -#### text_location +#### url + +| Type | Default Value | +| ------ | -------------------------------------------------------------- | +| String | `"https://fonts.googleapis.com/css?family=Nunito:400,600,700"` | + +Sets the web font URL for the primary font. + +### `[branding.font.mono]` - Monospace Font Customization + +#### name | Type | Default Value | | ------ | ------------- | -| String | `"Location"` | +| String | `"Fira Mono"` | + +Sets the web font name for the monospace/code/preformatted text font. + +#### url + +| Type | Default Value | +| ------ | ----------------------------------------------------- | +| String | `"https://fonts.googleapis.com/css?family=Fira+Mono"` | + +Sets the web font URL for the monospace/code/preformatted text font. -Sets the placeholder text of the location selector. #### text_cache @@ -196,110 +353,3 @@ Sets the title text for the site-wide rate limit page. Users are redirected to t | String | `"You have accessed this site more than {rate_limit_site} times in the last minute."` | Sets the subtitle text for the site-wide rate limit page. Users are redirected to this page when they have accessed the site more than the [specified](/configuration/general/#rate_limit_site) limit. `{rate_limit_site}` will be formatted with the value of [rate_limit_site](/configuration/general/#rate_limit_site). - -#### text_500_title - -| Type | Default Value | -| ------ | ----------------- | -| String | `"Error"` | - -Sets the title text for the full general error page. - -#### text_500_subtitle - -| Type | Default Value | -| ------ | ------------------------- | -| String | `"Something went wrong."` | - -Sets the subtitle text for the full general error page. - -#### text_500_button - -| Type | Default Value | -| ------ | ----------------- | -| String | `"Home"` | - -Sets the button text for the full general error page. - -#### text_help_bgp_route - -| Type | Default Value | -| ------ | ------------------------- | -| String | `"Performs BGP table lookup based on IPv4/IPv6 prefix."` | - -Sets the BGP Route query help text, displayed when the **?** icon is hovered. - -#### text_help_bgp_community - -| Type | Default Value | -| ------ | ------------------------- | -| String | `'Performs BGP table lookup based on <a href="https://tools.ietf.org/html/rfc4360">Extended</a> or <a href="https://tools.ietf.org/html/rfc8195">Large</a> community value.'` | - -Sets the BGP Community query help text, displayed when the **?** icon is hovered. - -!!! note - Since there are double quotes (`" "`) in the `<a>` HTML tags, single quotes (`' '`) are required for the TOML string. - -#### text_help_bgp_aspath - -| Type | Default Value | -| ------ | ------------------------- | -| String | `'Performs BGP table lookup based on <code>AS_PATH</code> regular expression.<br>For commonly used BGP regular expressions, <a href="https://hyperglass.readthedocs.io/en/latest/Extras/common_as_path_regex/">click here</a>.'` | - -Sets the BGP AS Path query help text, displayed when the **?** icon is hovered. - -!!! note - Since there are double quotes (`" "`) in the `<a>` HTML tags, single quotes (`' '`) are required for the TOML string. - -#### text_help_ping - -| Type | Default Value | -| ------ | ------------------------- | -| String | `"Sends 5 ICMP echo requests to the target."` | - -Sets the Ping query help text, displayed when the **?** icon is hovered. - -#### text_help_traceroute - -| Type | Default Value | -| ------ | ------------------------- | -| String | `'Performs UDP Based traceroute to the target.<br>For information about how to interpret traceroute results, <a href="https://www.nanog.org/meetings/nanog45/presentations/Sunday/RAS_traceroute_N45.pdf">click here</a>.'` | - -Sets the Traceroute query help text, displayed when the **?** icon is hovered. - -!!! note - Since there are double quotes (`" "`) in the `<a>` HTML tags, single quotes (`' '`) are required for the TOML string. - -# Fonts - -#### primary_font_url - -| Type | Default Value | -| ------ | ------------------------- | -| String | `"https://fonts.googleapis.com/css?family=Nunito:400,600,700"` | - -Sets the web font URL for the primary font. This font is used for all titles, subtitles, and non-code/preformatted text. The value is passed as a Jinja2 variable to the head block in the base template. - -#### primary_font_name - -| Type | Default Value | -| ------ | ------------------------- | -| String | `"Nunito"` | - -Sets the web font name for the primary font. This font is used for all titles, subtitles, and non-code/preformatted text. The value is passed as a Jinja2 variable to generate `hyperglass/hyperglass/static/sass/hyperglass.scss`, which ultimately get passed to CSS. - -#### mono_font_url - -| Type | Default Value | -| ------ | ------------------------- | -| String | `"https://fonts.googleapis.com/css?family=Fira+Mono"` | - -Sets the web font URL for the monospace/code/preformatted text font. This font is used for all query output text, as well as the command title and command name tag. The value is passed as a Jinja2 variable to the head block in the base template. - -#### mono_font_name - -| Type | Default Value | -| ------ | ------------------------- | -| String | `"Fira Mono"` | - -Sets the web font URL for the monospace/code/preformatted text font. This font is used for all query output text, as well as the command title and command name tag. The value is passed as a Jinja2 variable to generate `hyperglass/hyperglass/static/sass/hyperglass.scss`, which ultimately get passed to CSS. diff --git a/docs/configuration/commands.md b/docs/configuration/commands.md new file mode 100644 index 0000000..2cff961 --- /dev/null +++ b/docs/configuration/commands.md @@ -0,0 +1,58 @@ +Commands are defined in `hyperglass/hyperglass/configuration/commands.toml`. A table for each NOS (Network Operating System) contains three nested tables: `dual`, `ipv4`, and `ipv6`. + +| Table | Function | Commands | +| --------- | ----------------------------- | ------------------------------- | +| **dual** | Protocol agnostic commands | `bgp_community` `bgp_aspath` | +| **ipv4** | IPv4-specific commands | `bgp_route` `ping` `traceroute` | +| **ipv6** | IPv6-specific commands | `bgp_route` `ping` `traceroute` | + +#### Variables + +The following variables can be used in the command definitions. + +- `{target}` Maps to search box input. +- `{src_addr_ipv4}` Maps to [src_addr_ipv4](configuration/devices.md/#src_addr_ipv4) +- `{src_addr_ipv6}` Maps to [src_addr_ipv6](configuration/devices.md/#src_addr_ipv6) + +#### Example + +```toml +[[cisco_ios]] +[cisco_ios.dual] +bgp_community = "show bgp all community {target}" +bgp_aspath = 'show bgp all quote-regexp "{target}"' +[cisco_ios.ipv4] +bgp_route = "show bgp ipv4 unicast {target} | exclude pathid:|Epoch" +ping = "ping {target} repeat 5 source {src_addr_ipv4}" +traceroute = "traceroute {target} timeout 1 probe 2 source {src_addr_ipv4}" +[cisco_ios.ipv6] +bgp_route = "show bgp ipv6 unicast {target} | exclude pathid:|Epoch" +ping = "ping ipv6 {target} repeat 5 source {src_addr_ipv6}" +traceroute = "traceroute ipv6 {target} timeout 1 probe 2 source {src_addr_ipv6}" + +[[cisco_xr]] +[cisco_xr.dual] +bgp_community = 'show bgp all unicast community {target} | utility egrep -v "\(BGP |Table |Non-stop\)"' +bgp_aspath = 'show bgp all unicast regexp {target} | utility egrep -v "\(BGP |Table |Non-stop\)"' +[cisco_xr.ipv4] +bgp_route = 'show bgp ipv4 unicast {target} | util egrep "\(BGP routing table entry|Path \#|aggregated by|Origin |Community:|validity| from \)"' +ping = "ping ipv4 {target} count 5 source {src_addr_ipv4}" +traceroute = "traceroute ipv4 {target} timeout 1 probe 2 source {src_addr_ipv4}" +[cisco_xr.ipv6] +bgp_route = 'show bgp ipv6 unicast {target} | util egrep "\(BGP routing table entry|Path \#|aggregated by|Origin |Community:|validity| from \)"' +ping = "ping ipv6 {target} count 5 source {src_addr_ipv6}" +traceroute = "traceroute ipv6 {target} timeout 1 probe 2 source {src_addr_ipv6}" + +[[juniper]] +[juniper.dual] +bgp_community = "show route protocol bgp community {target}" +bgp_aspath = "show route protocol bgp aspath-regex {target}" +[juniper.ipv4] +bgp_route = "show route protocol bgp table inet.0 {target} detail" +ping = "ping inet {target} count 5 source {src_addr_ipv4}" +traceroute = "traceroute inet {target} wait 1 source {src_addr_ipv4}" +[juniper.ipv6] +bgp_route = "show route protocol bgp table inet6.0 {target} detail" +ping = "ping inet6 {target} count 5 source {src_addr_ipv6}" +traceroute = "traceroute inet6 {target} wait 1 source {src_addr_ipv6}" +``` diff --git a/docs/configuration/features.md b/docs/configuration/features.md new file mode 100644 index 0000000..0889838 --- /dev/null +++ b/docs/configuration/features.md @@ -0,0 +1,256 @@ +From `hyperglass/hyperglass/configuration/configuration.toml` `[features]`table. + +`[features]` + +## Rate Limiting +##### `[features.rate_limit.query]` + +#### Query + +Configuration paramters for rate limiting the number of queries per visitor. For information on how this works, please see the [rate limiting documentation](/ratelimiting/#query). + +##### `rate` + +| Type | Default Value | +| ------- | ------------- | +| Integer | `5` | + +Sets the number of queries **per minute** allowed from the remote IP address of the request. + +##### `period` + +| Type | Default Value | +| -------| ------------- | +| String | `"minute"` | + +Sets the time period to which `rate` applies. + +##### `message` + +| Type | Default Value | +| ------ | ------------------------------------------------------------------------------------- | +| String | `"Query limit of {rate} per minute reached. Please wait one {period} and try again."` | + +Message presented to the user when the [query limit](#rate_limit_query) is reached. `{rate_limit_query}` will be formatted as the [`rate_limit_query`](#rate_limit_query) parameter. + +#### Site +`[features.rate_limit.site]` + +Configuration parameters for rate limiting the number of site visits per visitor. For information on how this works, please see the [rate limiting documentation](/ratelimiting/#site). + +##### `rate` + +| Type | Default Value | +| ------- | ------------- | +| Integer | `60` | + +Sets the number of site visits allowed from the remote IP address of the request during the configured [period](#period) below. + +##### `period` + +| Type | Default Value | +| -------| ------------- | +| String | `"minute"` | + +Sets the time period to which `rate` applies. + +##### `title` + +| Type | Default Value | +| ------ | ----------------- | +| String | `"Limit Reached"` | + +Title text on Rate Limit error page. + +##### `subtitle` + +| Type | Default Value | +| ------ | ---------------------------------------------------------------------------- | +| String | `"You have accessed this site more than {rate} times in the last {period}."` | + +Subtitle text on Rate Limit error page. + +## Caching +`[features.cache]` + +For information on how this works, please see the [caching documentation](/caching). + +##### `timeout` + +| Type | Default Value | +| ------- | ------------- | +| Integer | `120` | + +Sets the number of **seconds** to cache the back-end response. + +##### `directory` + +| Type | Default Value | +| ------ | -------------------------------------- | +| String | `"hyperglass/hyperglass/.flask_cache"` | + +Sets the directory where the back-end responses are cached. `hyperglass/hyperglass/.flask_cache` is excluded from change control. + +!!! note "Permissions" + The user hyperglass runs as must have permissions to this directory. + +##### `show_text` + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +If `true`, a message will be displayed at the bottom of the results box: + +> Results will be cached for {seconds / 60} minutes. + +##### `text` + +| Type | Default Value | +| ------ | ----------------------------------------------------- | +| String | `"Results will be cached for {seconds / 60} minutes"` | + +Sets the caching message text if `show_text` is `true`. + +## Maximum Prefix Length +##### `[features.max_prefix]` + +##### `enable` + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `false` | + +Enables or disables a maximum allowed prefix size for BGP Route queries. If enabled, the prefix length of BGP Route queries must be shorter than the `max_prefix_length_ipv4` and `max_prefix_length_ipv6` parameters. For example, a BGP Route query for `192.0.2.0/25` would result in the following error message: + +<img src="/max_prefix_error.png" style="width: 70%"></img> + +##### `ipv4` + +| Type | Default Value | +| ------- | ------------- | +| Integer | `24` | + +If `enable` is `true`, sets the maxiumum prefix length allowed for IPv4 BGP Route queries. + +##### `ipv6` + +| Type | Default Value | +| ------- | ------------- | +| Integer | `64` | + +If `enable` is `true`, sets the maxiumum prefix length allowed for IPv6 BGP Route queries. + +## BGP Route +##### `[features.bgp_route]` + +##### `enable` + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables the BGP Route query type. + +## BGP Community +##### `[features.bgp_community]` + +##### `enable` + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables the BGP Community query type. + +#### Regex +##### `[features.bgp_community.regex]` + +Override the default regex patterns for validating BGP Community input. + +##### `decimal` + +| Type | Default Value | +| ------ | ----------------- | +| String | `"^[0-9]{1,10}$"` | + +Decimal/32 bit community format. + +##### `extended_as` + +| Type | Default Value | +| ------ | -------------------------------- | +| String | `"^([0-9]{0,5})\:([0-9]{1,5})$"` | + +Extended community format + +##### `large` + +| Type | Default Value | +| ------ | ----------------------------------------------- | +| String | `"^([0-9]{1,10})\:([0-9]{1,10})\:[0-9]{1,10}$"` | + +Large community format + +## BGP AS Path +##### `[features.bgp_aspath]` + +##### `enable` + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables the BGP AS Path query type. + +#### Regex +##### `[features.bgp_aspath.regex]` + +##### `mode` + +| Type | Default Value | +| ------ | ------------- | +| String | `"asplain"` | + +Sets the AS Path type used **network-wide**. Options are `asplain`, `asdot`. For more information on what these options mean, [click here](https://tools.ietf.org/html/rfc5396). + +!!! warning "AS_PATH Format" + This pattern will be used to validate AS_PATH queries to your routers, so it should match how your routers are actually configured. + +##### `asplain` + +| Type | Default Value | +| ------ | -------------------------------------------- | +| String | `"^(\^|^\_)(\d+\_|\d+\$|\d+\(\_\.\+\_\))+$"` | + +Regex pattern used to validate `asplain` formatted AS numbers in an AS_PATH. Only used if `mode` is set to `asplain.` + +##### `asdot` + +| Type | Default Value | +| ------ | ----------------------------------------------------------------- | +| String | `"^(\^|^\_)((\d+\.\d+)\_|(\d+\.\d+)\$|(\d+\.\d+)\(\_\.\+\_\))+$"` | + +Regex pattern used to validate `asdot` formatted AS numbers in an AS_PATH. Only used if `mode` is set to `asdot.` + +## Ping +##### `[features.ping]` + +##### `enable` + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables the Ping query type. + +## Traceroute +##### `[features.traceroute]` + +##### `enable` + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `true` | + +Enables or disables the Traceroute query type. diff --git a/docs/configuration/general.md b/docs/configuration/general.md deleted file mode 100644 index 8457a83..0000000 --- a/docs/configuration/general.md +++ /dev/null @@ -1,158 +0,0 @@ -From `hyperglass/hyperglass/configuration/config.toml`: - -### primary_asn - -| Type | Default Value | -| ------ | ------------- | -| String | `"65000"` | - -Your network's _primary_ ASN. Number only, e.g. `65000`, **not** `AS65000`. - -### debug - -| Type | Default Value | -| ------- | ------------- | -| Boolean | `False` | - -Enables Flask debugging. May be used to enable other module debugs in the future. - -### google_analytics - -| Type | Default Value | -| ------ | ------------- | -| String | None | - -Google Analytics ID number. For more information on how to set up Google Analytics, see [here](https://support.google.com/analytics/answer/1008080?hl=en). - -### message_error - -| Type | Default Value | -| ------ | ----------------------- | -| String | `"{input} is invalid."` | - -Message presented to the user when invalid input is detected. `{input}` will be formatted as the input received from the main search field. For each command, input is validated via regular expression in the following patterns: - -| Command | Pattern | -| ------------- | -------------------------------------------- | -| BGP Route | Valid IPv4 or IPv6 Address | -| BGP Community | Valid new-format, 32 bit, or large community | -| BGP AS Path | Any pattern | -| Ping | Valid IPv4 or IPv6 Address | -| Traceroute | Valid IPv4 or IPv6 Address | - -!!! note - The BGP AS Path command currently allows `(.*)` to be submitted to the end device. Obviously, the device itself will return an error for garbage input, but ideally this would be "locked down" further. If you have an idea for a regex pattern to validate an `AS_PATH` regex, please submit a PR. - -### message_blacklist - -| Type | Default Value | -| ------ | --------------------------- | -| String | `"{input} is not allowed."` | - -Message presented to the user when an IPv4 or IPv6 address matches the `blacklist.toml` array. `{input}` will be formatted as the input received from the main search field. For information on how this works, please see the [blacklist documentation](/configuration/blacklist). - -### message_rate_limit_query - -| Type | Default Value | -| ------ | ----------------------------------------------------------------------------------------------- | -| String | `"Query limit of {rate_limit_query} per minute reached. Please wait one minute and try again."` | - -Message presented to the user when the [query limit](#rate_limit_query) is reached. `{rate_limit_query}` will be formatted as the [`rate_limit_query`](#rate_limit_query) parameter. For information on how this works, please see the [rate limiting documentation](/ratelimiting/query). - -### enable_bgp_route - -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | - -Enables or disables the BGP Route query type. - -### enable_bgp_community - -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | - -Enables or disables the BGP Community query type. - -### enable_bgp_aspath - -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | - -Enables or disables the BGP AS Path query type. - -### enable_ping - -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | - -Enables or disables the Ping query type. - -### enable_traceroute - -| Type | Default Value | -| ------- | ------------- | -| Boolean | `True` | - -Enables or disables the Traceroute query type. - -### rate_limit_query - -| Type | Default Value | -| ------ | ------------- | -| String | `"5"` | - -Sets the number of queries **per minute** allowed by `remote_address` of the request. For information on how this works, please see the [rate limiting documentation](/ratelimiting/query). - -### rate_limit_site - -| Type | Default Value | -| ------ | ------------- | -| String | `"120"` | - -Sets the number of site loads **per minute** allowed by `remote_address` of the request. For information on how this works, please see the [rate limiting documentation](/ratelimiting/site). - -### cache_timeout - -| Type | Default Value | -| ------- | ------------- | -| Integer | `120` | - -Sets the number of **seconds** to cache the back-end response. For information on how this works, please see the [caching documentation](/caching). - -### cache_directory - -| Type | Default Value | -| ------ | -------------------------------------- | -| String | `"hyperglass/hyperglass/.flask_cache"` | - -Sets the directory where the back-end responses are cached. For information on how this works, please see the [caching documentation](/caching). - -### enable_max_prefix - -| Type | Default Value | -| ------- | ------------- | -| Boolean | `false` | - -Enables or disables a maximum allowed prefix size for BGP Route queries. If enabled, the prefix length of BGP Route queries must be shorter than the `max_prefix_length_ipv4` and `max_prefix_length_ipv6` parameters. For example, a BGP Route query for `192.0.2.0/25` would result in the following error message: - -<img src="/max_prefix_error.png" style="width: 70%"></img> - -### max_prefix_length_ipv4 - -| Type | Default Value | -| ------- | ------------- | -| Integer | `24` | - -If `enable_max_prefix` is enabled, the maxiumum prefix length allowed for IPv4 BGP Route queries. - -### max_prefix_length_ipv6 - -| Type | Default Value | -| ------- | ------------- | -| Integer | `64` | - -If `enable_max_prefix` is enabled, the maxiumum prefix length allowed for IPv6 BGP Route queries. diff --git a/docs/configuration/index.md b/docs/configuration/index.md index a08eb19..b2eff41 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -4,28 +4,55 @@ Hyperglass configuration files are stored in `hyperglass/hyperglass/configuratio ```console hyperglass/configuration/ -├── blacklist.toml ├── commands.toml ├── configuration.toml -├── devices.toml -└── requires_ipv6_cidr.toml +└── devices.toml ``` -## Blacklist +## Site Parameters -Blacklisted querys are defined in `hyperglass/hyperglass/configuration/blacklist.toml` +Global hyperglass parameters + +#### debug + +| Type | Default Value | +| ------- | ------------- | +| Boolean | `false` | + +Enables hyperglass & Flask debugging. + +!!! warning "Logging" + Enabling debug mode will produce a large amount of log output, as every configuration parameter and backend transaction is logged to stdout. + +#### requires_ipv6_cidr + +| Type | Default Value | +| ----- | ----------------------------- | +| Array | `["cisco_ios", "cisco_nxos"]` | + +Some platforms (namely Cisco IOS) are unable to perform a BGP lookup by IPv6 host address (e.g. 2001:db8::1), but must perform the lookup by prefix (e.g. 2001:db8::/48). `requires_ipv6_cidr` is a list (TOML array) of network operating systems that require this (in Netmiko format). + +If a user attempts to query a device requiring IPv6 lookups in CIDR format with an IPv6 host address, the following message will be displayed: + +<img src="/requires_ipv6_cidr.png" style="width: 70%"></img> + +#### blacklist + +| Type | Default Value | +| ----- | ------------- | +| Array | See Example | The blacklist is a simple TOML array (list) of host IPs or prefixes that you do not want end users to be able to query. For example, if you have one or more hosts/subnets you wish to prevent users from looking up (or any contained host or prefix), add them to the list. -#### Example +##### Example ```toml blacklist = [ -'198.18.0.0/15', -'2001:db8::/32', -'10.0.0.0/8', -'192.168.0.0/16', -'172.16.0.0/12' +"198.18.0.0/15", +"2001:db8::/32", +"10.0.0.0/8", +"192.168.0.0/16", +"172.16.0.0/12" ] ``` @@ -33,76 +60,20 @@ When users attempt to query a matching host/prefix, they will receive the follow <img src="/blacklist_error.png" style="width: 70%"></img> -## Commands +## `[general]` - Site Parameters -Commands are defined in `hyperglass/hyperglass/configuration/commands.toml`. A table for each NOS (Network Operating System) contains three nested tables: `dual`, `ipv4`, and `ipv6`. +#### primary_asn -| Table | Function | Commands | -| --------- | ----------------------------- | ------------------------------- | -| **dual** | Protocol agnostic commands | `bgp_community` `bgp_aspath` | -| **ipv4** | IPv4-specific commands | `bgp_route` `ping` `traceroute` | -| **ipv6** | IPv6-specific commands | `bgp_route` `ping` `traceroute` | +| Type | Default Value | +| ------ | ------------- | +| String | `"65000"` | -#### Variables +Your network's _primary_ ASN. Number only, e.g. `65000`, **not** `AS65000`. -The following variables can be used in the command definitions. +#### google_analytics -- `{target}` Maps to search box input. -- `{src_addr_ipv4}` Maps to [src_addr_ipv4](configuration/devices.md/#src_addr_ipv4) -- `{src_addr_ipv6}` Maps to [src_addr_ipv6](configuration/devices.md/#src_addr_ipv6) +| Type | Default Value | +| ------ | ------------- | +| String | `""` | -#### Example - -```toml -[[cisco_ios]] -[cisco_ios.dual] -bgp_community = "show bgp all community {target}" -bgp_aspath = 'show bgp all quote-regexp "{target}"' -[cisco_ios.ipv4] -bgp_route = "show bgp ipv4 unicast {target} | exclude pathid:|Epoch" -ping = "ping {target} repeat 5 source {src_addr_ipv4}" -traceroute = "traceroute {target} timeout 1 probe 2 source {src_addr_ipv4}" -[cisco_ios.ipv6] -bgp_route = "show bgp ipv6 unicast {target} | exclude pathid:|Epoch" -ping = "ping ipv6 {target} repeat 5 source {src_addr_ipv6}" -traceroute = "traceroute ipv6 {target} timeout 1 probe 2 source {src_addr_ipv6}" - -[[cisco_xr]] -[cisco_xr.dual] -bgp_community = 'show bgp all unicast community {target} | utility egrep -v "\(BGP |Table |Non-stop\)"' -bgp_aspath = 'show bgp all unicast regexp {target} | utility egrep -v "\(BGP |Table |Non-stop\)"' -[cisco_xr.ipv4] -bgp_route = 'show bgp ipv4 unicast {target} | util egrep "\(BGP routing table entry|Path \#|aggregated by|Origin |Community:|validity| from \)"' -ping = "ping ipv4 {target} count 5 source {src_addr_ipv4}" -traceroute = "traceroute ipv4 {target} timeout 1 probe 2 source {src_addr_ipv4}" -[cisco_xr.ipv6] -bgp_route = 'show bgp ipv6 unicast {target} | util egrep "\(BGP routing table entry|Path \#|aggregated by|Origin |Community:|validity| from \)"' -ping = "ping ipv6 {target} count 5 source {src_addr_ipv6}" -traceroute = "traceroute ipv6 {target} timeout 1 probe 2 source {src_addr_ipv6}" - -[[juniper]] -[juniper.dual] -bgp_community = "show route protocol bgp community {target}" -bgp_aspath = "show route protocol bgp aspath-regex {target}" -[juniper.ipv4] -bgp_route = "show route protocol bgp table inet.0 {target} detail" -ping = "ping inet {target} count 5 source {src_addr_ipv4}" -traceroute = "traceroute inet {target} wait 1 source {src_addr_ipv4}" -[juniper.ipv6] -bgp_route = "show route protocol bgp table inet6.0 {target} detail" -ping = "ping inet6 {target} count 5 source {src_addr_ipv6}" -traceroute = "traceroute inet6 {target} wait 1 source {src_addr_ipv6}" -``` - -## IPv6 CIDR Format Required - -Some platforms (namely Cisco IOS) are unable to perform a BGP lookup by IPv6 host address (e.g. 2001:db8::1), but must perform the lookup by prefix (e.g. 2001:db8::/48). `requires_ipv6_cidr.toml` is a list (TOML array) of network operating systems that require this (in Netmiko format). - -#### Example - -```toml -requires_ipv6_cidr = [ -"cisco_ios", -"cisco_nxos" -] -``` +Google Analytics ID number. For more information on how to set up Google Analytics, see [here](https://support.google.com/analytics/answer/1008080?hl=en). diff --git a/docs/monitoring.md b/docs/monitoring.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/traceroute_nanog.pdf b/docs/traceroute_nanog.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9ca8b1847380918b72b2ad34cb1a76dc5fc363d GIT binary patch literal 180282 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%0Db$bILgnSLoZ6qA3uBaTj-u1bZ_C`zI-q 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 JX&pZJzW}%<24?^O literal 0 HcmV?d00001 diff --git a/hyperglass/command/construct.py b/hyperglass/command/construct.py index 507deae..51b3c66 100644 --- a/hyperglass/command/construct.py +++ b/hyperglass/command/construct.py @@ -3,9 +3,14 @@ Accepts filtered & validated input from execute.py, constructs SSH command for Netmiko library or \ API call parameters for hyperglass-frr """ -# Module Imports +# Standard Imports import json import inspect +import logging + +# Module Imports +import logzero +from logzero import logger from netaddr import IPNetwork, IPAddress # pylint: disable=unused-import # Dear PyLint, the netaddr library is a special snowflake. You might not see `IPAddress` get used, \ @@ -17,7 +22,12 @@ from hyperglass import configuration # Configuration Imports codes = configuration.codes() -config = configuration.general() + +# Logzero Configuration +if configuration.debug_state(): + logzero.loglevel(logging.DEBUG) +else: + logzero.loglevel(logging.INFO) def current_function(): @@ -45,79 +55,90 @@ class Construct: src = self.d_src_addr_ipv4 if ver == 6: src = self.d_src_addr_ipv6 + logger.debug(f"Source IPv{ver}: {src}") return src def ping(self, transport, target): """Constructs ping query parameters from pre-validated input""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Constructing {query_type} query for {target} via {transport}...") query = None ip_version = IPNetwork(target).ip.version afi = f"ipv{ip_version}" source = self.get_src(ip_version) if transport == "rest": query = json.dumps( - {"cmd": cmd, "afi": afi, "source": source, "target": target} + {"cmd": query_type, "afi": afi, "source": source, "target": target} ) if transport == "scrape": - conf_command = self.command[afi][cmd] + conf_command = self.command[afi][query_type] fmt_command = conf_command.format(target=target, source=source) query = (self.d_address, self.d_type, fmt_command) + logger.debug(f"Constructed query: {query}") return query def traceroute(self, transport, target): """Constructs traceroute query parameters from pre-validated input""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Constructing {query_type} query for {target} via {transport}...") query = None ip_version = IPNetwork(target).ip.version afi = f"ipv{ip_version}" source = self.get_src(ip_version) if transport == "rest": query = json.dumps( - {"cmd": cmd, "afi": afi, "source": source, "target": target} + {"cmd": query_type, "afi": afi, "source": source, "target": target} ) if transport == "scrape": - conf_command = self.command[afi][cmd] + conf_command = self.command[afi][query_type] fmt_command = conf_command.format(target=target, source=source) query = (self.d_address, self.d_type, fmt_command) + logger.debug(f"Constructed query: {query}") return query def bgp_route(self, transport, target): """Constructs bgp_route query parameters from pre-validated input""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Constructing {query_type} query for {target} via {transport}...") query = None ip_version = IPNetwork(target).ip.version afi = f"ipv{ip_version}" if transport == "rest": - query = json.dumps({"cmd": cmd, "afi": afi, "target": target}) + query = json.dumps({"cmd": query_type, "afi": afi, "target": target}) if transport == "scrape": - conf_command = self.command[afi][cmd] + conf_command = self.command[afi][query_type] fmt_command = conf_command.format(target=target) query = (self.d_address, self.d_type, fmt_command) + logger.debug(f"Constructed query: {query}") return query def bgp_community(self, transport, target): """Constructs bgp_community query parameters from pre-validated input""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Constructing {query_type} query for {target} via {transport}...") afi = "dual" query = None if transport == "rest": - query = json.dumps({"cmd": cmd, "afi": afi, "target": target}) + query = json.dumps({"cmd": query_type, "afi": afi, "target": target}) if transport == "scrape": - conf_command = self.command[afi][cmd] + conf_command = self.command[afi][query_type] fmt_command = conf_command.format(target=target) query = (self.d_address, self.d_type, fmt_command) + logger.debug(f"Constructed query: {query}") return query def bgp_aspath(self, transport, target): """Constructs bgp_aspath query parameters from pre-validated input""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Constructing {query_type} query for {target} via {transport}...") afi = "dual" query = None if transport == "rest": - query = json.dumps({"cmd": cmd, "afi": afi, "target": target}) + query = json.dumps({"cmd": query_type, "afi": afi, "target": target}) if transport == "scrape": - conf_command = self.command[afi][cmd] + conf_command = self.command[afi][query_type] fmt_command = conf_command.format(target=target) query = (self.d_address, self.d_type, fmt_command) + logger.debug(f"Constructed query: {query}") return query diff --git a/hyperglass/command/execute.py b/hyperglass/command/execute.py index 72433b1..4055cd3 100644 --- a/hyperglass/command/execute.py +++ b/hyperglass/command/execute.py @@ -4,12 +4,17 @@ Accepts input from front end application, validates the input and returns errors invalid. Passes validated parameters to construct.py, which is used to build & run the Netmiko \ connectoins or hyperglass-frr API calls, returns the output back to the front end. """ -# Module Imports +# Standard Imports import json import time +import logging +from pprint import pprint + +# Module Imports import requests import requests.exceptions from logzero import logger +import logzero from netmiko import ( ConnectHandler, redispatch, @@ -25,7 +30,14 @@ from hyperglass.command.construct import Construct from hyperglass.command.validate import Validate codes = configuration.codes() -config = configuration.general() +config = configuration.params() +# config = configuration.general() + +# Logzero Configuration +if configuration.debug_state(): + logzero.loglevel(logging.DEBUG) +else: + logzero.loglevel(logging.INFO) class Rest: @@ -34,18 +46,22 @@ class Rest: # pylint: disable=too-few-public-methods # Dear PyLint, sometimes, people need to make their code scalable for future use. <3, -ML - def __init__(self, transport, device, cmd, target): + def __init__(self, transport, device, query_type, target): self.transport = transport self.device = device - self.cmd = cmd + self.query_type = query_type self.target = target self.cred = configuration.credential(self.device["credential"]) - self.query = getattr(Construct(self.device), self.cmd)( + self.query = getattr(Construct(self.device), self.query_type)( self.transport, self.target ) def frr(self): """Sends HTTP POST to router running the hyperglass-frr API""" + # Debug + logger.debug(f"FRR host params:\n{pprint(self.device)}") + logger.debug(f"Raw query parameters: {self.query}") + # End Debug try: headers = { "Content-Type": "application/json", @@ -53,14 +69,23 @@ class Rest: } json_query = json.dumps(self.query) frr_endpoint = f'http://{self.device["address"]}:{self.device["port"]}/frr' + # Debug + logger.debug(f"HTTP Headers:\n{pprint(headers)}") + logger.debug(f"JSON query:\n{json_query}") + logger.debug(f"FRR endpoint: {frr_endpoint}") + # End Debug frr_response = requests.post(frr_endpoint, headers=headers, data=json_query) response = frr_response.text status = frr_response.status_code + # Debug + logger.debug(f"FRR response text:\n{response}") + logger.debug(f"FRR status code: {status}") + # End Debug except requests.exceptions.RequestException as requests_exception: logger.error( f'Error connecting to device {self.device["name"]}: {requests_exception}' ) - response = config["msg_error_general"] + response = config["messages"]["general"] status = codes["danger"] return response, status @@ -71,16 +96,16 @@ class Netmiko: # pylint: disable=too-many-instance-attributes # Dear PyLint, I actually need all these. <3, -ML - def __init__(self, transport, device, cmd, target): + def __init__(self, transport, device, query_type, target): self.device = device self.target = target self.cred = configuration.credential(self.device["credential"]) - self.params = getattr(Construct(device), cmd)(transport, target) - self.router = self.params[0] + self.params = getattr(Construct(device), query_type)(transport, target) + self.location = self.params[0] self.nos = self.params[1] self.command = self.params[2] self.nm_host = { - "host": self.router, + "host": self.location, "device_type": self.nos, "username": self.cred["username"], "password": self.cred["password"], @@ -89,17 +114,24 @@ class Netmiko: def direct(self): """Connects to the router via netmiko library, return the command output""" + # Debug + logger.debug(f"Netmiko host: {pprint(self.nm_host)}") + logger.debug(f"Connecting to host via Netmiko library...") + # End Debug try: nm_connect_direct = ConnectHandler(**self.nm_host) response = nm_connect_direct.send_command(self.command) status = codes["success"] + logger.debug( + f"Response for direction connection with command {self.command}:\n{response}" + ) except ( NetMikoAuthenticationException, NetMikoTimeoutException, NetmikoAuthError, NetmikoTimeoutError, ) as netmiko_exception: - response = config["msg_error_general"] + response = config["messages"]["general"] status = codes["danger"] logger.error(f"{netmiko_exception}, {status}") return response, status @@ -120,29 +152,40 @@ class Netmiko: } nm_connect_proxied = ConnectHandler(**nm_proxy) nm_ssh_command = device_proxy["ssh_command"].format(**self.nm_host) + "\n" + # Debug + logger.debug(f"Netmiko proxy {proxy_name}:\n{pprint(nm_proxy)}") + logger.debug(f"Proxy SSH command: {nm_ssh_command}") + # End Debug nm_connect_proxied.write_channel(nm_ssh_command) time.sleep(1) proxy_output = nm_connect_proxied.read_channel() + logger.debug(f"Proxy output:\n{proxy_output}") try: # Accept SSH key warnings if "Are you sure you want to continue connecting" in proxy_output: + logger.debug(f"Received OpenSSH key warning") nm_connect_proxied.write_channel("yes" + "\n") nm_connect_proxied.write_channel(self.nm_host["password"] + "\n") # Send password on prompt elif "assword" in proxy_output: + logger.debug(f"Received password prompt") nm_connect_proxied.write_channel(self.nm_host["password"] + "\n") proxy_output += nm_connect_proxied.read_channel() # Reclassify netmiko connection as configured device type + logger.debug( + f'Redispatching netmiko with device class {self.nm_host["device_type"]}' + ) redispatch(nm_connect_proxied, self.nm_host["device_type"]) response = nm_connect_proxied.send_command(self.command) status = codes["success"] + logger.debug(f"Netmiko proxied response:\n{response}") except ( NetMikoAuthenticationException, NetMikoTimeoutException, NetmikoAuthError, NetmikoTimeoutError, ) as netmiko_exception: - response = config["msg_error_general"] + response = config["messages"]["general"] status = codes["danger"] logger.error( f'{netmiko_exception}, {status},Proxy: {self.nm_host["proxy"]}' @@ -158,23 +201,24 @@ class Execute: def __init__(self, lg_data): self.input_data = lg_data - self.input_router = lg_data["router"] - self.input_cmd = lg_data["cmd"] - self.input_target = lg_data["ipprefix"] - self.device_config = configuration.device(self.input_router) + self.input_location = lg_data["location"] + self.input_type = lg_data["type"] + self.input_target = lg_data["target"] - def parse(self, output): + def parse(self, output, nos): """Splits BGP output by AFI, returns only IPv4 & IPv6 output for protocol-agnostic \ commands (Community & AS_PATH Lookups)""" - nos = self.device_config["type"] + logger.debug(f"Parsing output...") parsed = output - if self.input_cmd in ["bgp_community", "bgp_aspath"]: + if self.input_type in ["bgp_community", "bgp_aspath"]: if nos in ["cisco_ios"]: + logger.debug(f"Parsing output for device type {nos}") delimiter = "For address family: " parsed_ipv4 = output.split(delimiter)[1] parsed_ipv6 = output.split(delimiter)[2] parsed = delimiter + parsed_ipv4 + delimiter + parsed_ipv6 if nos in ["cisco_xr"]: + logger.debug(f"Parsing output for device type {nos}") delimiter = "Address Family: " parsed_ipv4 = output.split(delimiter)[1] parsed_ipv6 = output.split(delimiter)[2] @@ -186,34 +230,42 @@ class Execute: Initializes Execute.filter(), if input fails to pass filter, returns errors to front end. \ Otherwise, executes queries. """ - # Return error if no query type is specified - if self.input_cmd == "Query Type": - msg = config["msg_error_querytype"] - status = codes["warning"] - return msg, status, self.input_data - validity, msg, status = getattr(Validate(self.device_config), self.input_cmd)( + device_config = configuration.device(self.input_location) + # Debug + logger.debug(f"Received query for {self.input_data}") + logger.debug(f"Matched device config:\n{pprint(device_config)}") + # End Debug + validity, msg, status = getattr(Validate(device_config), self.input_type)( self.input_target ) if not validity: + logger.debug(f"Invalid query") return msg, status, self.input_data connection = None - output = config["msg_error_general"] + output = config["messages"]["general"] info = self.input_data - if self.device_config["type"] == "frr": - connection = Rest( - "rest", self.device_config, self.input_cmd, self.input_target - ) + logger.debug(f"Validity: {validity}, Message: {msg}, Status: {status}") + if device_config["type"] in configuration.rest_list(): + connection = Rest("rest", device_config, self.input_type, self.input_target) raw_output, status = connection.frr() - output = self.parse(raw_output) - if self.device_config["type"] in configuration.scrape_list(): + output = self.parse(raw_output, device_config["type"]) + return output, status, info + if device_config["type"] in configuration.scrape_list(): + logger.debug(f"Initializing Netmiko...") connection = Netmiko( - "scrape", self.device_config, self.input_cmd, self.input_target + "scrape", device_config, self.input_type, self.input_target ) - if self.device_config["proxy"]: + if device_config["proxy"]: raw_output, status = connection.proxied() else: raw_output, status = connection.direct() - output = self.parse(raw_output) - else: - logger.error(f"{output}, {status}, {info}") + output = self.parse(raw_output, device_config["type"]) + logger.debug( + f'Parsed output for device type {device_config["type"]}:\n{output}' + ) + return output, status, info + if device_config["type"] not in configuration.supported_nos(): + logger.error( + f"Device not supported, or no commands for device configured. {status}, {info}" + ) return output, status, info diff --git a/hyperglass/command/validate.py b/hyperglass/command/validate.py index 48b407d..52d4c60 100644 --- a/hyperglass/command/validate.py +++ b/hyperglass/command/validate.py @@ -3,18 +3,33 @@ Accepts raw input data from execute.py, passes it through specific filters based on query type, \ returns validity boolean and specific error message. """ -# Module Imports +# Standard Imports import re import inspect +import logging +from pprint import pprint + +# Module Imports +import logzero from logzero import logger from netaddr.core import AddrFormatError from netaddr import IPNetwork, IPAddress, IPSet # pylint: disable=unused-import +# Dear PyLint, the netaddr library is a special snowflake. You might not see `IPAddress` get used, \ +# but when you use something like `IPNetwork("192.0.2.1/24").ip`, the returned value is \ +# IPAddress("192.0.2.1"), so I do actually need this import. <3, -ML + # Project Imports from hyperglass import configuration # Configuration Imports -config = configuration.general() +config = configuration.params() + +# Logzero Configuration +if configuration.debug_state(): + logzero.loglevel(logging.DEBUG) +else: + logzero.loglevel(logging.INFO) class IPType: @@ -61,8 +76,10 @@ class IPType: ip_version = IPNetwork(target).ip.version state = False if ip_version == 4 and re.match(self.ipv4_host, target): + logger.debug(f"{target} is an IPv{ip_version} host.") state = True if ip_version == 6 and re.match(self.ipv6_host, target): + logger.debug(f"{target} is an IPv{ip_version} host.") state = True return state @@ -89,9 +106,12 @@ def ip_validate(target): or valid_ip.is_loopback() ): validity = False + logger.debug(f"IP {valid_ip} is invalid") if valid_ip.is_unicast(): validity = True + logger.debug(f"IP {valid_ip} is valid") except AddrFormatError: + logger.debug(f"IP {target} is invalid") validity = False return validity @@ -99,6 +119,7 @@ def ip_validate(target): def ip_blacklist(target): """Check blacklist list for prefixes/IPs, return boolean based on list membership""" blacklist = IPSet(configuration.blacklist()) + logger.debug(f"Blacklist: {blacklist}") membership = False if target in blacklist: membership = True @@ -124,44 +145,49 @@ def ip_attributes(target): return valid_attributes -def ip_type_check(cmd, target, device): +def ip_type_check(query_type, target, device): """Checks multiple IP address related validation parameters""" prefix_attr = ip_attributes(target) + logger.debug(f"IP Attributes:\n{pprint(prefix_attr)}") requires_ipv6_cidr = configuration.requires_ipv6_cidr(device["type"]) validity = False - msg = config["msg_error_notallowed"].format(i=target) + msg = config["messages"]["not_allowed"].format(i=target) # If target is a member of the blacklist, return an error. if ip_blacklist(target): validity = False + logger.debug(f"Failed blacklist check") return (validity, msg) # If enable_max_prefix feature enabled, require that BGP Route queries be smaller than\ # configured size limit. - if cmd == "bgp_route" and config["enable_max_prefix"]: - max_length = config[f'max_prefix_length_{prefix_attr["afi"]}'] + if query_type == "bgp_route" and config["features"]["max_prefix"]["enable"]: + max_length = config["features"]["max_prefix"][prefix_attr["afi"]] if prefix_attr["length"] > max_length: validity = False - msg = config["msg_max_prefix"].format( + msg = config["features"]["max_prefix"]["message"].format( m=max_length, i=prefix_attr["network"] ) + logger.debug(f"Failed max prefix length check") return (validity, msg) # If device NOS is listed in requires_ipv6_cidr.toml, and query is an IPv6 host address, \ # return an error. if ( - cmd == "bgp_route" + query_type == "bgp_route" and prefix_attr["version"] == 6 and requires_ipv6_cidr and IPType().is_host(target) ): - msg = config["msg_error_ipv6cidr"].format(d=device["display_name"]) + msg = config["messages"]["requires_ipv6_cidr"].format(d=device["display_name"]) validity = False + logger.debug(f"Failed requires IPv6 CIDR check") return (validity, msg) # If query type is ping or traceroute, and query target is in CIDR format, return an error. - if cmd in ["ping", "traceroute"] and IPType().is_cidr(target): - msg = config["msg_error_directed_cidr"].format(cmd=cmd.capitalize()) + if query_type in ["ping", "traceroute"] and IPType().is_cidr(target): + msg = config["messages"]["directed_cidr"].format(q=query_type.capitalize()) validity = False + logger.debug(f"Failed CIDR format for ping/traceroute check") return (validity, msg) validity = True - msg = f"{target} is a valid {cmd} query." + msg = f"{target} is a valid {query_type} query." return (validity, msg) @@ -183,9 +209,10 @@ class Validate: def ping(self, target): """Ping Query: Input Validation & Error Handling""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Validating {query_type} query for target {target}...") validity = False - msg = config["msg_error_invalidip"].format(i=target) + msg = config["messages"]["invalid_ip"].format(i=target) status = self.codes["warning"] # Perform basic validation of an IP address, return error if not a valid IP. if not ip_validate(target): @@ -193,19 +220,21 @@ class Validate: logger.error(f"{msg}, {status}") return (validity, msg, status) # Perform further validation of a valid IP address, return an error upon failure. - valid_query, msg = ip_type_check(cmd, target, self.device) + valid_query, msg = ip_type_check(query_type, target, self.device) if valid_query: validity = True - msg = f"{target} is a valid {cmd} query." + msg = f"{target} is a valid {query_type} query." status = self.codes["success"] + logger.debug(f"{msg}, {status}") return (validity, msg, status) return (validity, msg, status) def traceroute(self, target): """Traceroute Query: Input Validation & Error Handling""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Validating {query_type} query for target {target}...") validity = False - msg = config["msg_error_invalidip"].format(i=target) + msg = config["messages"]["invalid_ip"].format(i=target) status = self.codes["warning"] # Perform basic validation of an IP address, return error if not a valid IP. if not ip_validate(target): @@ -213,19 +242,21 @@ class Validate: logger.error(f"{msg}, {status}") return (validity, msg, status) # Perform further validation of a valid IP address, return an error upon failure. - valid_query, msg = ip_type_check(cmd, target, self.device) + valid_query, msg = ip_type_check(query_type, target, self.device) if valid_query: validity = True - msg = f"{target} is a valid {cmd} query." + msg = f"{target} is a valid {query_type} query." status = self.codes["success"] + logger.debug(f"{msg}, {status}") return (validity, msg, status) return (validity, msg, status) def bgp_route(self, target): """BGP Route Query: Input Validation & Error Handling""" - cmd = current_function() + query_type = current_function() + logger.debug(f"Validating {query_type} query for target {target}...") validity = False - msg = config["msg_error_invalidip"].format(i=target) + msg = config["messages"]["invalid_ip"].format(i=target) status = self.codes["warning"] # Perform basic validation of an IP address, return error if not a valid IP. if not ip_validate(target): @@ -233,49 +264,56 @@ class Validate: logger.error(f"{msg}, {status}") return (validity, msg, status) # Perform further validation of a valid IP address, return an error upon failure. - valid_query, msg = ip_type_check(cmd, target, self.device) + valid_query, msg = ip_type_check(query_type, target, self.device) if valid_query: validity = True - msg = f"{target} is a valid {cmd} query." + msg = f"{target} is a valid {query_type} query." status = self.codes["success"] + logger.debug(f"{msg}, {status}") return (validity, msg, status) return (validity, msg, status) def bgp_community(self, target): """BGP Community Query: Input Validation & Error Handling""" + query_type = current_function() + logger.debug(f"Validating {query_type} query for target {target}...") validity = False - msg = config["msg_error_invaliddual"].format(i=target, qt="BGP Community") + msg = config["messages"]["invalid_dual"].format(i=target, qt="BGP Community") status = self.codes["danger"] # Validate input communities against configured or default regex pattern # Extended Communities, new-format - if re.match(config["re_bgp_community_new"], target): + if re.match(config["features"][query_type]["regex"]["extended_as"], target): validity = True - msg = f"{target} matched new-format community." + msg = f"{target} matched extended AS format community." status = self.codes["success"] # Extended Communities, 32 bit format - if re.match(config["re_bgp_community_32bit"], target): + if re.match(config["features"][query_type]["regex"]["decimal"], target): validity = True - msg = f"{target} matched 32 bit community." + msg = f"{target} matched decimal format community." status = self.codes["success"] # RFC 8092 Large Community Support - if re.match(config["re_bgp_community_large"], target): + if re.match(config["features"][query_type]["regex"]["large"], target): validity = True msg = f"{target} matched large community." status = self.codes["success"] if not validity: logger.error(f"{msg}, {status}") + logger.debug(f"{msg}, {status}") return (validity, msg, status) def bgp_aspath(self, target): """BGP AS Path Query: Input Validation & Error Handling""" + query_type = current_function() + logger.debug(f"Validating {query_type} query for target {target}...") validity = False - msg = config["msg_error_invaliddual"].format(i=target, qt="AS Path") + msg = config["messages"]["invalid_dual"].format(i=target, qt="AS Path") status = self.codes["danger"] # Validate input AS_PATH regex pattern against configured or default regex pattern - if re.match(config["re_bgp_aspath"], target): + if re.match(config["features"][query_type]["regex"]["pattern"], target): validity = True msg = f"{target} matched AS_PATH regex." status = self.codes["success"] if not validity: logger.error(f"{msg}, {status}") + logger.debug(f"{msg}, {status}") return (validity, msg, status) diff --git a/hyperglass/configuration/__init__.py b/hyperglass/configuration/__init__.py index b75e9a2..99634b5 100644 --- a/hyperglass/configuration/__init__.py +++ b/hyperglass/configuration/__init__.py @@ -5,9 +5,12 @@ Imports configuration varibles from configuration files and returns default valu # Standard Imports import os import math +import logging # Module Imports import toml +import logzero +from logzero import logger # Project Imports import hyperglass @@ -17,20 +20,33 @@ working_dir = os.path.dirname(os.path.abspath(__file__)) hyperglass_root = os.path.dirname(hyperglass.__file__) # TOML Imports -configuration = toml.load(os.path.join(working_dir, "configuration.toml")) +config = toml.load(os.path.join(working_dir, "configuration.toml")) devices = toml.load(os.path.join(working_dir, "devices.toml")) +def debug_state(): + """Returns string for logzero log level""" + state = config.get("debug", False) + return state + + +# Logzero Configuration +if debug_state(): + logzero.loglevel(logging.DEBUG) +else: + logzero.loglevel(logging.INFO) + + def blacklist(): """Returns list of subnets/IPs defined in blacklist.toml""" - blacklist_config = toml.load(os.path.join(working_dir, "blacklist.toml")) + blacklist_config = config["blacklist"] return blacklist_config["blacklist"] def requires_ipv6_cidr(nos): """Returns boolean for input NOS association with the NOS list defined in \ requires_ipv6_cidr.toml""" - nos_list = configuration["requires_ipv6_cidr"] + nos_list = config["requires_ipv6_cidr"] return bool(nos in nos_list) @@ -48,7 +64,17 @@ def networks(): return asn_dict -def networks_list(): +def locations(): + """Returns list of all location identifiers""" + loc_list = [] + routers_list = devices["router"] + for router_config in routers_list.values(): + loc = router_config["location"] + loc_list.append(loc) + return loc_list + + +def locations_list(): """Returns a dictionary of ASNs as keys, list of associated locations, router hostnames, and \ router display names as keys. Used by Flask to populate the /routers/<asn> route, which is \ ingested by a JS Ajax call to populate the list of locations associated with the selected \ @@ -99,6 +125,12 @@ def codes_reason(): return code_desc_dict +def rest_list(): + """Returns list of supported hyperglass API types""" + rest = ["frr"] + return rest + + def scrape_list(): """Returns list of configured network operating systems""" config_commands = toml.load(os.path.join(working_dir, "commands.toml")) @@ -108,6 +140,14 @@ def scrape_list(): return scrape +def supported_nos(): + """Combines scrape_list & rest_list for full list of supported network operating systems""" + scrape = scrape_list() + rest = rest_list() + supported = scrape + rest + return supported + + def command(nos): """Associates input NOS with matched commands defined in commands.toml""" config_commands = toml.load(os.path.join(working_dir, "commands.toml")) @@ -158,165 +198,254 @@ def proxy(prx): ) -def general(): - """Exports general config variables and sets default values if undefined""" - gen = configuration["general"] - re_bgp_aspath_mode = gen["bgp_aspath"].get("mode", "asplain") - if re_bgp_aspath_mode == "asplain": - re_bgp_aspath_default = r"^(\^|^\_)(\d+\_|\d+\$|\d+\(\_\.\+\_\))+$" - if re_bgp_aspath_mode == "asdot": - re_bgp_aspath_default = ( - r"^(\^|^\_)((\d+\.\d+)\_|(\d+\.\d+)\$|(\d+\.\d+)\(\_\.\+\_\))+$" - ) - return dict( - primary_asn=gen.get("primary_asn", "65000"), - org_name=gen.get("org_name", "The Company"), - debug=gen.get("debug", False), - google_analytics=gen.get("google_analytics", ""), - msg_error_querytype=gen.get( - "msg_error_querytype", "You must select a query type." - ), - msg_error_notallowed=gen.get( - "msg_error_notallowed", "<b>{i}</b> is not allowed." - ), - msg_error_ipv6cidr=gen.get( - "msg_error_ipv6cidr", - "<b>{d}</b> requires IPv6 BGP lookups to be in CIDR notation.", - ), - msg_error_invalidip=gen.get( - "msg_error_invalidip", "<b>{i}</b> is not a valid IP address." - ), - msg_error_invaliddual=gen.get( - "msg_error_invaliddual", "<b>{i}</b> is an invalid {qt}." - ), - msg_error_general=gen.get("msg_error_general", "A general error occurred."), - msg_error_directed_cidr=gen.get( - "msg_error_directed_cidr", "<b>{cmd}</b> queries can not be in CIDR format." - ), - msg_max_prefix=gen.get( - "msg_max_prefix", - "Prefix length must be smaller than /{m}. <b>{i}</b> is too specific.", - ), - rate_limit_query=gen.get("rate_limit_query", "5"), - message_rate_limit_query=gen.get( - "message_rate_limit_query", - ( - f'Query limit of {gen.get("rate_limit_query", "5")} per minute reached. ' - "Please wait one minute and try again." - ), - ), - enable_bgp_route=gen.get("enable_bgp_route", True), - enable_bgp_community=gen.get("enable_bgp_community", True), - enable_bgp_aspath=gen.get("enable_bgp_aspath", True), - enable_ping=gen.get("enable_ping", True), - enable_traceroute=gen.get("enable_traceroute", True), - rate_limit_site=gen.get("rate_limit_site", "120"), - cache_timeout=gen.get("cache_timeout", 120), - cache_directory=gen.get( - "cache_directory", os.path.join(hyperglass_root, ".flask_cache") - ), - enable_max_prefix=gen.get("enable_max_prefix", False), - max_prefix_length_ipv4=gen.get("max_prefix_length_ipv4", 24), - max_prefix_length_ipv6=gen.get("max_prefix_length_ipv6", 64), - re_bgp_community_new=gen.get( - "re_bgp_community_new", r"^([0-9]{0,5})\:([0-9]{1,5})$" - ), - re_bgp_community_32bit=gen.get("re_bgp_community_32bit", r"^[0-9]{1,10}$"), - re_bgp_community_large=gen.get( - "re_bgp_community_large", r"^([0-9]{1,10})\:([0-9]{1,10})\:[0-9]{1,10}$" - ), - re_bgp_aspath=gen["bgp_aspath"][re_bgp_aspath_mode].get( - "regex", re_bgp_aspath_default - ), +def params(): + """Builds combined nested dictionary of all parameters defined in configuration.toml, and if \ + undefined, uses a default value""" + # pylint: disable=too-many-statements + # Dear PyLint, this function is intended to be long AF, because hyperglass is inteded to be \ + # customizable AF. It would also be silly AF to break this into multiple functions, and you'd \ + # probably still complain. <3 -ML + general = {} + branding = {} + features = {} + messages = {} + general["primary_asn"] = config["general"].get("primary_asn", "65000") + general["org_name"] = config["general"].get("org_name", "The Company") + general["google_analytics"] = config["general"].get("google_analytics", "") + features["rate_limit"] = config["features"]["rate_limit"] + features["rate_limit"]["query"] = config["features"]["rate_limit"]["query"] + features["rate_limit"]["query"]["rate"] = config["features"]["rate_limit"][ + "query" + ].get("rate", 5) + features["rate_limit"]["query"]["period"] = config["features"]["rate_limit"].get( + "period", "minute" ) - - -def branding(): - """Exports branding config variables and sets default values if undefined""" - brand = configuration["branding"] - gen = general() - return dict( - site_title=brand.get("site_title", "hyperglass"), - title=brand.get("title", "hyperglass"), - subtitle=brand.get("subtitle", f'AS{gen["primary_asn"]}'), - title_mode=brand.get("title_mode", "logo_only"), - enable_footer=brand.get("enable_footer", True), - enable_credit=brand.get("enable_credit", True), - color_btn_submit=brand.get("color_btn_submit", "#40798c"), - color_tag_loctitle=brand.get("color_tag_loctitle", "#330036"), - color_tag_cmdtitle=brand.get("color_tag_cmdtitle", "#330036"), - color_tag_cmd=brand.get("color_tag_cmd", "#ff5e5b"), - color_tag_loc=brand.get("color_tag_loc", "#40798c"), - color_progressbar=brand.get("color_progressbar", "#40798c"), - color_bg=brand.get("color_bg", "#fbfffe"), - color_danger=brand.get("color_danger", "#ff3860"), - logo_path=brand.get( - "logo_path", - os.path.join(hyperglass_root, "static/images/hyperglass-dark.png"), - ), - logo_width=brand.get("logo_width", "384"), - favicon_dir=brand.get("favicon_path", "static/images/favicon/"), - placeholder_prefix=brand.get( - "placeholder_prefix", "IP, Prefix, Community, or AS_PATH" - ), - show_peeringdb=brand.get("show_peeringdb", True), - text_results=brand.get("text_results", "Results"), - text_location=brand.get("text_location", "Select Location..."), - text_cache=brand.get( - "text_cache", - f'Results will be cached for {math.ceil(gen["cache_timeout"] / 60)} minutes.', - ), - primary_font_name=brand.get("primary_font_name", "Nunito"), - primary_font_url=brand.get( - "primary_font_url", - "https://fonts.googleapis.com/css?family=Nunito:400,600,700", - ), - mono_font_name=brand.get("mono_font_name", "Fira Mono"), - mono_font_url=brand.get( - "mono_font_url", "https://fonts.googleapis.com/css?family=Fira+Mono" - ), - text_limiter_title=brand.get("text_limiter_title", "Limit Reached"), - text_limiter_subtitle=brand.get( - "text_limiter_subtitle", - ( - f'You have accessed this site more than {gen["rate_limit_site"]} ' - "times in the last minute." - ), - ), - text_500_title=brand.get("text_500_title", "Error"), - text_500_subtitle=brand.get("text_500_subtitle", "Something went wrong."), - text_500_button=brand.get("text_500_button", "Home"), - text_help_bgp_route=brand.get( - "text_help_bgp_route", - "Performs BGP table lookup based on IPv4/IPv6 prefix.", - ), - text_help_bgp_community=brand.get( - "text_help_bgp_community", - ( - 'Performs BGP table lookup based on <a href="https://tools.ietf.org/html/rfc4360">' - 'Extended</a> or <a href="https://tools.ietf.org/html/rfc8195">Large</a> ' - "community value.<br>" - '<a href="#" onclick="bgpHelpCommunity()">BGP Communities</a>' - ), - ), - text_help_bgp_aspath=brand.get( - "text_help_bgp_aspath", - ( - "Performs BGP table lookup based on <code>AS_PATH</code> regular expression." - '<br>For commonly used BGP regular expressions, <a href="https://hyperglass.' - 'readthedocs.io/en/latest/Extras/common_as_path_regex/">click here</a>.<br>' - '<a href="#" onclick="bgpHelpASPath()">Allowed BGP AS Path Expressions</a>' - ), - ), - text_help_ping=brand.get( - "text_help_ping", "Sends 5 ICMP echo requests to the target." - ), - text_help_traceroute=brand.get( - "text_help_traceroute", - ( - "Performs UDP Based traceroute to the target.<br>For information about how to" - 'interpret traceroute results, <a href="https://www.nanog.org/meetings/nanog45/' - 'presentations/Sunday/RAS_traceroute_N45.pdf">click here</a>.' - ), - ), + features["rate_limit"]["query"]["title"] = config["features"]["rate_limit"][ + "query" + ].get("title", "Query Limit Reached") + features["rate_limit"]["query"]["message"] = config["features"]["rate_limit"][ + "query" + ].get( + "message", + f"""Query limit of {features["rate_limit"]["query"]["rate"]} per \ + {features["rate_limit"]["query"]["period"]} reached. Please wait one minute and try \ + again.""", ) + features["rate_limit"]["query"]["button"] = config["features"]["rate_limit"][ + "query" + ].get("button", "Try Again") + + features["rate_limit"]["message"] = config["features"]["rate_limit"].get( + "message", + f"""Query limit of {features["rate_limit"]["query"]} per minute reached. \ + Please wait one minute and try again.""", + ) + features["rate_limit"]["site"] = config["features"]["rate_limit"]["site"] + features["rate_limit"]["site"]["rate"] = config["features"]["rate_limit"].get( + "rate", 60 + ) + features["rate_limit"]["site"]["period"] = config["features"]["rate_limit"].get( + "period", "minute" + ) + features["rate_limit"]["site"]["title"] = config["features"]["rate_limit"][ + "site" + ].get("title", "Limit Reached") + features["rate_limit"]["site"]["subtitle"] = config["features"]["rate_limit"][ + "site" + ].get( + "subtitle", + f'You have accessed this site more than {features["rate_limit"]["site"]["rate"]} ' + f'times in the last {features["rate_limit"]["site"]["period"]}.', + ) + features["cache"] = config["features"]["cache"] + features["cache"]["timeout"] = config["features"]["cache"].get("timeout", 120) + features["cache"]["directory"] = config["features"]["cache"].get( + "directory", os.path.join(hyperglass_root, ".flask_cache") + ) + features["cache"]["show_text"] = config["features"]["cache"].get("show_text", True) + features["cache"]["text"] = config["features"]["cache"].get( + "text", + f'Results will be cached for {math.ceil(features["cache"]["timeout"] / 60)} minutes.', + ) + features["bgp_route"] = config["features"]["bgp_route"] + features["bgp_route"]["enable"] = config["features"]["bgp_route"].get( + "enable", True + ) + features["bgp_community"] = config["features"]["bgp_community"] + features["bgp_community"]["enable"] = config["features"]["bgp_community"].get( + "enable", True + ) + features["bgp_community"]["regex"] = config["features"]["bgp_community"]["regex"] + features["bgp_community"]["regex"]["decimal"] = config["features"]["bgp_community"][ + "regex" + ].get("decimal", r"^[0-9]{1,10}$") + features["bgp_community"]["regex"]["extended_as"] = config["features"][ + "bgp_community" + ]["regex"].get("extended_as", r"^([0-9]{0,5})\:([0-9]{1,5})$") + features["bgp_community"]["regex"]["large"] = config["features"]["bgp_community"][ + "regex" + ].get("large", r"^([0-9]{1,10})\:([0-9]{1,10})\:[0-9]{1,10}$") + features["bgp_aspath"] = config["features"]["bgp_aspath"] + features["bgp_aspath"]["enable"] = config["features"]["bgp_aspath"].get( + "enable", True + ) + features["bgp_aspath"]["regex"] = config["features"]["bgp_aspath"]["regex"] + features["bgp_aspath"]["regex"]["mode"] = config["features"]["bgp_aspath"][ + "regex" + ].get("mode", "asplain") + features["bgp_aspath"]["regex"]["asplain"] = config["features"]["bgp_aspath"][ + "regex" + ].get("asplain", r"^(\^|^\_)(\d+\_|\d+\$|\d+\(\_\.\+\_\))+$") + features["bgp_aspath"]["regex"]["asdot"] = config["features"]["bgp_aspath"][ + "regex" + ].get("asdot", r"^(\^|^\_)((\d+\.\d+)\_|(\d+\.\d+)\$|(\d+\.\d+)\(\_\.\+\_\))+$") + features["bgp_aspath"]["regex"]["pattern"] = config["features"]["bgp_aspath"][ + "regex" + ].get(features["bgp_aspath"]["regex"]["mode"], None) + features["ping"] = config["features"]["ping"] + features["ping"]["enable"] = config["features"]["ping"].get("enable", True) + features["traceroute"] = config["features"]["traceroute"] + features["traceroute"]["enable"] = config["features"]["traceroute"].get( + "enable", True + ) + features["max_prefix"] = config["features"]["max_prefix"] + features["max_prefix"]["enable"] = config["features"]["max_prefix"].get( + "enable", False + ) + features["max_prefix"]["ipv4"] = config["features"]["max_prefix"].get("ipv4", 24) + features["max_prefix"]["ipv6"] = config["features"]["max_prefix"].get("ipv6", 64) + features["max_prefix"]["message"] = config["features"]["max_prefix"].get( + "message", + "Prefix length must be smaller than /{m}. <b>{i}</b> is too specific.", + ) + messages["no_query_type"] = config["messages"].get( + "no_query_type", "Query Type must be specified." + ) + messages["no_location"] = config["messages"].get( + "no_location", "A location must be selected." + ) + messages["no_input"] = config["messages"].get( + "no_input", "A target must be specified" + ) + messages["not_allowed"] = config["messages"].get( + "not_allowed", "<b>{i}</b> is not allowed." + ) + messages["requires_ipv6_cidr"] = config["messages"].get( + "requires_ipv6_cidr", + "<b>{d}</b> requires IPv6 BGP lookups to be in CIDR notation.", + ) + messages["invalid_ip"] = config["messages"].get( + "invalid_ip", "<b>{i}</b> is not a valid IP address." + ) + messages["invalid_dual"] = config["messages"].get( + "invalid_dual", "<b>{i}</b> is an invalid {qt}." + ) + messages["general"] = config["messages"].get("general", "An error occurred.") + messages["directed_cidr"] = config["messages"].get( + "directed_cidr", "<b>{q}</b> queries can not be in CIDR format." + ) + branding["site_name"] = config["branding"].get("site_name", "hyperglass") + branding["footer"] = config["branding"]["footer"] + branding["footer"]["enable"] = config["branding"]["footer"].get("enable", True) + branding["credit"] = config["branding"]["credit"] + branding["credit"]["enable"] = config["branding"]["credit"].get("enable", True) + branding["peering_db"] = config["branding"]["peering_db"] + branding["peering_db"]["enable"] = config["branding"]["peering_db"].get( + "enable", True + ) + branding["text"] = config["branding"]["text"] + branding["text"]["query_type"] = config["branding"]["text"].get( + "query_type", "Query Type" + ) + branding["text"]["title_mode"] = config["branding"]["text"].get( + "title_mode", "logo_only" + ) + branding["text"]["title"] = config["branding"]["text"].get("title", "hyperglass") + branding["text"]["subtitle"] = config["branding"]["text"].get( + "subtitle", f'AS{general["primary_asn"]}' + ) + branding["text"]["results"] = config["branding"]["text"].get("results", "Results") + branding["text"]["location"] = config["branding"]["text"].get( + "location", "Select Location..." + ) + branding["text"]["query_placeholder"] = config["branding"]["text"].get( + "query_placeholder", "IP, Prefix, Community, or AS Path" + ) + branding["text"]["bgp_route"] = config["branding"]["text"].get( + "bgp_route", "BGP Route" + ) + branding["text"]["bgp_community"] = config["branding"]["text"].get( + "bgp_community", "BGP Community" + ) + branding["text"]["bgp_aspath"] = config["branding"]["text"].get( + "bgp_aspath", "BGP AS Path" + ) + branding["text"]["ping"] = config["branding"]["text"].get("ping", "Ping") + branding["text"]["traceroute"] = config["branding"]["text"].get( + "traceroute", "Traceroute" + ) + branding["text"]["404"]["title"] = config["branding"]["text"]["404"].get( + "title", "Error" + ) + branding["text"]["404"]["subtitle"] = config["branding"]["text"]["404"].get( + "subtitle", "Page Not Found" + ) + branding["text"]["500"]["title"] = config["branding"]["text"]["500"].get( + "title", "Error" + ) + branding["text"]["500"]["subtitle"] = config["branding"]["text"]["500"].get( + "subtitle", "Something Went Wrong" + ) + branding["text"]["500"]["button"] = config["branding"]["text"]["500"].get( + "button", "Home" + ) + branding["logo"] = config["branding"]["logo"] + branding["logo"]["path"] = config["branding"]["logo"].get( + "path", "static/images/hyperglass-dark.png" + ) + branding["logo"]["width"] = config["branding"]["logo"].get("width", 384) + branding["logo"]["favicons"] = config["branding"]["logo"].get( + "favicons", "static/images/favicon/" + ) + branding["color"] = config["branding"]["color"] + branding["color"]["background"] = config["branding"]["color"].get( + "background", "#fbfffe" + ) + branding["color"]["button_submit"] = config["branding"]["color"].get( + "button_submit", "#40798c" + ) + branding["color"]["danger"] = config["branding"]["color"].get("danger", "#ff3860") + branding["color"]["progress_bar"] = config["branding"]["color"].get( + "progress_bar", "#40798c" + ) + branding["color"]["tag"]["type"] = config["branding"]["color"]["tag"].get( + "type", "#ff5e5b" + ) + branding["color"]["tag"]["type_title"] = config["branding"]["color"]["tag"].get( + "type_title", "#330036" + ) + branding["color"]["tag"]["location"] = config["branding"]["color"]["tag"].get( + "location", "#40798c" + ) + branding["color"]["tag"]["location_title"] = config["branding"]["color"]["tag"].get( + "location_title", "#330036" + ) + branding["font"] = config["branding"]["font"] + branding["font"]["primary"] = config["branding"]["font"]["primary"] + branding["font"]["primary"]["name"] = config["branding"]["font"]["primary"].get( + "name", "Nunito" + ) + branding["font"]["primary"]["url"] = config["branding"]["font"]["primary"].get( + "url", "https://fonts.googleapis.com/css?family=Nunito:400,600,700" + ) + branding["font"]["mono"] = config["branding"]["font"]["mono"] + branding["font"]["mono"]["name"] = config["branding"]["font"]["mono"].get( + "name", "Fira Mono" + ) + branding["font"]["mono"]["url"] = config["branding"]["font"]["mono"].get( + "url", "https://fonts.googleapis.com/css?family=Fira+Mono" + ) + params_dict = dict( + general=general, branding=branding, features=features, messages=messages + ) + return params_dict diff --git a/hyperglass/configuration/blacklist.toml.example b/hyperglass/configuration/blacklist.toml.example deleted file mode 100644 index 600beab..0000000 --- a/hyperglass/configuration/blacklist.toml.example +++ /dev/null @@ -1,8 +0,0 @@ -# Define networks that you don't want users to be able to query. Any IP inside the subnet will return an error message. -blacklist = [ -"100.64.0.0/10", -"198.18.0.0/15", -"10.0.0.0/8", -"192.168.0.0/16", -"172.16.0.0/12" -] diff --git a/hyperglass/configuration/requires_ipv6_cidr.toml.example b/hyperglass/configuration/requires_ipv6_cidr.toml.example deleted file mode 100644 index 8d30c01..0000000 --- a/hyperglass/configuration/requires_ipv6_cidr.toml.example +++ /dev/null @@ -1,4 +0,0 @@ -requires_ipv6_cidr = [ -"cisco_ios", -"cisco_nxos" -] diff --git a/hyperglass/hyperglass.py b/hyperglass/hyperglass.py index 708d903..d181465 100644 --- a/hyperglass/hyperglass.py +++ b/hyperglass/hyperglass.py @@ -2,8 +2,13 @@ """ Main Hyperglass Front End """ -# Module Imports +# Standard Imports import json +import logging +from pprint import pprint + +# Module Imports +import logzero from logzero import logger from flask import Flask, request, Response from flask_caching import Cache @@ -12,31 +17,49 @@ from flask_limiter.util import get_ipaddr from prometheus_client import generate_latest, Counter # Project Imports -import hyperglass.configuration as configuration from hyperglass.command import execute +from hyperglass import configuration from hyperglass import render # Main Flask definition app = Flask(__name__, static_url_path="/static") +# Logzero Configuration +if configuration.debug_state(): + logzero.loglevel(logging.DEBUG) +else: + logzero.loglevel(logging.INFO) + # Initialize general configuration parameters for reuse -general = configuration.general() +# brand = configuration.branding() +config = configuration.params() +codes = configuration.codes() codes_reason = configuration.codes_reason() +logger.debug(f"Configuration Parameters:\n {pprint(config)}") # Flask-Limiter Config -rate_limit_query = f'{general["rate_limit_query"]} per minute' -rate_limit_site = f'{general["rate_limit_site"]} per minute' +query_rate = config["features"]["rate_limit"]["query"]["rate"] +query_period = config["features"]["rate_limit"]["query"]["period"] +site_rate = config["features"]["rate_limit"]["site"]["rate"] +site_period = config["features"]["rate_limit"]["site"]["period"] +rate_limit_query = f"{query_rate} per {query_period}" +rate_limit_site = f"{site_rate} per {site_period}" limiter = Limiter(app, key_func=get_ipaddr, default_limits=[rate_limit_site]) +logger.debug(f"Query rate limit: {rate_limit_query}") +logger.debug(f"Site rate limit: {rate_limit_site}") # Flask-Caching Config +cache_directory = config["features"]["cache"]["directory"] +cache_timeout = config["features"]["cache"]["timeout"] cache = Cache( app, config={ "CACHE_TYPE": "filesystem", - "CACHE_DIR": general["cache_directory"], - "CACHE_DEFAULT_TIMEOUT": general["cache_timeout"], + "CACHE_DIR": cache_directory, + "CACHE_DEFAULT_TIMEOUT": cache_timeout, }, ) +logger.debug(f"Cache directory: {cache_directory}, Cache timeout: {cache_timeout}") # Prometheus Config count_data = Counter( @@ -56,22 +79,34 @@ count_ratelimit = Counter( @app.route("/metrics") def metrics(): - CONTENT_TYPE_LATEST = str("text/plain; version=0.0.4; charset=utf-8") - return Response(generate_latest(), mimetype=CONTENT_TYPE_LATEST) + """Prometheus metrics""" + content_type_latest = str("text/plain; version=0.0.4; charset=utf-8") + return Response(generate_latest(), mimetype=content_type_latest) + + +@app.errorhandler(404) +def handle_404(e): + """Renders full error page for too many site queries""" + html = render.html("404") + count_ratelimit.labels(e, get_ipaddr()).inc() + logger.error(e) + return html, 404 @app.errorhandler(429) -def error429(e): +def handle_429(e): """Renders full error page for too many site queries""" html = render.html("429") count_ratelimit.labels(e, get_ipaddr()).inc() - logger.error(f"{e}") + logger.error(e) return html, 429 @app.errorhandler(500) -def general_error(): +def handle_500(e): """General Error Page""" + count_errors.labels(500, e, get_ipaddr(), None, None, None).inc() + logger.error(e) html = render.html("500") return html, 500 @@ -98,15 +133,16 @@ def site(): def test_route(): """Test route for various tests""" html = render.html("500") - return html + return html, 500 -@app.route("/routers/<asn>", methods=["GET"]) -def get_routers(asn): - """Flask GET route provides a JSON list of all routers for the selected network/ASN""" - networks_list = configuration.networks_list() - networks_list_json = json.dumps(networks_list[asn]) - return networks_list_json +@app.route("/locations/<asn>", methods=["GET"]) +def get_locations(asn): + """Flask GET route provides a JSON list of all locations for the selected network/ASN""" + locations_list = configuration.locations_list() + locations_list_json = json.dumps(locations_list[asn]) + logger.debug(f"Locations list:\n{locations_list}") + return locations_list_json @app.route("/lg", methods=["POST"]) @@ -117,28 +153,51 @@ def hyperglass_main(): the backend application to perform the filtering/lookups""" # Get JSON data from Ajax POST lg_data = request.get_json() + logger.debug(f"Unvalidated input: {lg_data}") + # Return error if no target is specified + if not lg_data["target"]: + logger.debug("No input specified") + return Response(config["messages"]["no_input"], codes["danger"]) + # Return error if no location is selected + if lg_data["location"] not in configuration.locations(): + logger.debug("No selection specified") + return Response(config["messages"]["no_location"], codes["danger"]) + # Return error if no query type is selected + if lg_data["type"] not in [ + "bgp_route", + "bgp_community", + "bgp_aspath", + "ping", + "traceroute", + ]: + logger.debug("No query specified") + return Response(config["messages"]["no_query_type"], codes["danger"]) client_addr = request.remote_addr count_data.labels( - client_addr, lg_data["cmd"], lg_data["router"], lg_data["ipprefix"] + client_addr, lg_data["type"], lg_data["location"], lg_data["target"] ).inc() + logger.debug(f"Client Address: {client_addr}") # Stringify the form response containing serialized JSON for the request, use as key for k/v # cache store so each command output value is unique cache_key = str(lg_data) # Check if cached entry exists if cache.get(cache_key) is None: try: + logger.debug(f"Sending query {cache_key} to execute module...") cache_value = execute.Execute(lg_data).response() - logger.info(f"Cache Value: {cache_value}") + logger.debug(f"Validated response...") value_code = cache_value[1] value_entry = cache_value[0:2] - value_params = cache_value[2:] - logger.info(f"No cache match for: {cache_key}") + logger.debug( + f"Status Code: {value_code}, Output: {cache_value[1]}, Info: {cache_value[2]}" + ) # If it doesn't, create a cache entry cache.set(cache_key, value_entry) - logger.info(f"Added cache entry: {value_params}") + logger.debug(f"Added cache entry for query: {cache_key}") # If 200, return output response = cache.get(cache_key) if value_code == 200: + logger.debug(f"Returning {value_code} response") return Response(response[0], response[1]) # If 400 error, return error message and code # Note: 200 & 400 errors are separated mainly for potential future use @@ -147,26 +206,17 @@ def hyperglass_main(): response[1], codes_reason[response[1]], client_addr, - lg_data["cmd"], - lg_data["router"], - lg_data["ipprefix"], + lg_data["type"], + lg_data["location"], + lg_data["target"], ).inc() + logger.debug(f"Returning {value_code} response") return Response(response[0], response[1]) - if value_code == 500: - count_errors.labels( - response[1], - codes_reason[response[1]], - client_addr, - lg_data["cmd"], - lg_data["router"], - lg_data["ipprefix"], - ).inc() - return Response(general["msg_error_general"], 500) except: logger.error(f"Unable to add output to cache: {cache_key}") raise # If it does, return the cached entry else: - logger.info(f"Cache match for: {cache_key}, returning cached entry...") + logger.debug(f"Cache match for: {cache_key}, returning cached entry") response = cache.get(cache_key) return Response(response[0], response[1]) diff --git a/hyperglass/render/__init__.py b/hyperglass/render/__init__.py index ce47356..28cf5fa 100644 --- a/hyperglass/render/__init__.py +++ b/hyperglass/render/__init__.py @@ -4,12 +4,14 @@ Renders Jinja2 & Sass templates for use by the front end application """ # Standard Imports import os +import logging import subprocess # Module Imports import sass import toml import jinja2 +import logzero from logzero import logger from markdown2 import Markdown from flask import render_template @@ -24,40 +26,47 @@ hyperglass_root = os.path.dirname(hyperglass.__file__) file_loader = jinja2.FileSystemLoader(working_directory) env = jinja2.Environment(loader=file_loader) +# Logzero Configuration +if configuration.debug_state(): + logzero.loglevel(logging.DEBUG) +else: + logzero.loglevel(logging.INFO) + # Configuration Imports -branding = configuration.branding() -general = configuration.general() +config = configuration.params() +# branding = configuration.branding() +# general = configuration.general() networks = configuration.networks() -defaults = { +default_details = { "footer": """ +++ +++ -By using {{ site_title }}, you agree to be bound by the following terms of use: All queries \ -executed on this page are logged for analysis and troubleshooting. Users are prohibited from \ -automating queries, or attempting to process queries in bulk. This service is provided on a best \ -effort basis, and {{ org_name }} makes no availability or performance warranties or guarantees \ -whatsoever. +By using {{ branding["site_name"] }}, you agree to be bound by the following terms of use: All \ +queries executed on this page are logged for analysis and troubleshooting. Users are prohibited \ +from automating queries, or attempting to process queries in bulk. This service is provided on a \ +best effort basis, and {{ general["org_name"] }} makes no availability or performance warranties or \ +guarantees whatsoever. """, "bgp_aspath": r""" +++ title = "Supported AS Path Patterns" +++ -{{ site_title }} accepts the following `AS_PATH` regular expression patterns: +{{ branding["site_name"] }} accepts the following `AS_PATH` regular expression patterns: -| Expression | Match | -| :----------------------- | ----------------------------------------------------: | -| `_65000$` | Originated by AS65000 | -| `^65000\_` | Received from AS65000 | -| `_65000_` | Via AS65000 | -| `_65000_65001_` | Via AS65000 and AS65001 | -| `_65000(_.+_)65001$` | Anything from AS65001 that passed through AS65000 | +| Expression | Match | +| :------------------- | :-------------------------------------------- | +| `_65000$` | Originated by 65000 | +| `^65000_` | Received from 65000 | +| `_65000_` | Via 65000 | +| `_65000_65001_` | Via 65000 and 65001 | +| `_65000(_.+_)65001$` | Anything from 65001 that passed through 65000 | """, "bgp_community": """ +++ title = "BGP Communities" +++ -{{ site_title }} makes use of the following BGP communities: +{{ branding["site_name"] }} makes use of the following BGP communities: | Community | Description | | :-------- | :---------- | @@ -67,8 +76,44 @@ title = "BGP Communities" """, } +default_info = { + "bgp_route": """ ++++ ++++ +Performs BGP table lookup based on IPv4/IPv6 prefix. +""", + "bgp_community": """ ++++ +link = '<a href="#" onclick="bgpHelpCommunity()">{{ general["org_name"] }} BGP Communities</a>' ++++ +Performs BGP table lookup based on [Extended](https://tools.ietf.org/html/rfc4360) or \ +[Large](https://tools.ietf.org/html/rfc8195) community value. -def content(file_name): +{{ info["bgp_community"]["link"] }} +""", + "bgp_aspath": """ ++++ +link = '<a href="#" onclick="bgpHelpASPath()">Supported BGP AS Path Expressions</a>' ++++ +Performs BGP table lookup based on `AS_PATH` regular expression. + +{{ info["bgp_aspath"]["link"] }} +""", + "ping": """ ++++ ++++ +Sends 5 ICMP echo requests to the target. +""", + "traceroute": """ ++++ ++++ +Performs UDP Based traceroute to the target.<br>For information about how to interpret traceroute \ +results, [click here](https://hyperglass.readthedocs.io/nanog_traceroute.pdf). +""", +} + + +def info(file_name): """Converts Markdown documents to HTML, renders Jinja2 variables, renders TOML frontmatter \ variables, returns dictionary of variables and HTML content""" html_classes = {"table": "table"} @@ -80,48 +125,89 @@ def content(file_name): "html-classes": html_classes, } ) - delim = "+++" - file = os.path.join(working_directory, f"templates/content/{file_name}.md") - frontmatter_dict = None + file = os.path.join(working_directory, f"templates/info/{file_name}.md") + frontmatter_dict = {} if os.path.exists(file): with open(file, "r") as file_raw: file_read = file_raw.read() - _, frontmatter, content_md = file_read.split(delim) - frontmatter_dict = {file_name: toml.loads(frontmatter)} - content_md_template = jinja2.Environment(loader=jinja2.BaseLoader).from_string( - content_md + _, frontmatter, content = file_read.split("+++") + frontmatter_dict[file_name] = toml.loads(frontmatter) + md_template_fm = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + frontmatter + ) + md_template_content = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + content ) else: - content_read = defaults[file_name] - _, frontmatter, content_md = content_read.split(delim) - frontmatter_dict = {file_name: toml.loads(frontmatter)} - content_md_template = jinja2.Environment(loader=jinja2.BaseLoader).from_string( - content_md + _, frontmatter, content = default_info[file_name].split("+++") + md_template_fm = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + frontmatter ) - content_rendered = content_md_template.render( - **general, **branding, **frontmatter_dict - ) - content_html = markdown.convert(content_rendered) - frontmatter_dict[file_name]["content"] = content_html + md_template_content = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + content + ) + frontmatter_rendered = md_template_fm.render(**config) + frontmatter_dict[file_name] = toml.loads(frontmatter_rendered) + content_rendered = md_template_content.render(**config, info=frontmatter_dict) + frontmatter_dict[file_name]["content"] = markdown.convert(content_rendered) return frontmatter_dict -def html(t): +def details(file_name): + """Converts Markdown documents to HTML, renders Jinja2 variables, renders TOML frontmatter \ + variables, returns dictionary of variables and HTML content""" + html_classes = {"table": "table"} + markdown = Markdown( + extras={ + "break-on-newline": True, + "code-friendly": True, + "tables": True, + "html-classes": html_classes, + } + ) + file = os.path.join(working_directory, f"templates/info/details/{file_name}.md") + frontmatter_dict = {} + if os.path.exists(file): + with open(file, "r") as file_raw: + file_read = file_raw.read() + _, frontmatter, content = file_read.split("+++") + md_template_fm = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + frontmatter + ) + md_template_content = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + content + ) + else: + _, frontmatter, content = default_details[file_name].split("+++") + frontmatter_dict[file_name] = toml.loads(frontmatter) + md_template_fm = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + frontmatter + ) + md_template_content = jinja2.Environment(loader=jinja2.BaseLoader).from_string( + content + ) + frontmatter_rendered = md_template_fm.render(**config) + frontmatter_dict[file_name] = toml.loads(frontmatter_rendered) + content_rendered = md_template_content.render(**config, details=frontmatter_dict) + frontmatter_dict[file_name]["content"] = markdown.convert(content_rendered) + return frontmatter_dict + + +def html(template_name): """Renders Jinja2 HTML templates""" - content_name_list = ["footer", "bgp_aspath", "bgp_community"] - content_dict = {} - for content_name in content_name_list: - # content_file = os.path.join(working_directory, f"templates/content/{c}.md") - content_data = content(content_name) - content_dict.update(content_data) - if t == "index": - template = env.get_template("templates/index.html") - elif t == "429": - template = env.get_template("templates/429.html") - elif t == "500": - template = env.get_template("templates/500.html") + details_name_list = ["footer", "bgp_aspath", "bgp_community"] + details_dict = {} + for details_name in details_name_list: + details_data = details(details_name) + details_dict.update(details_data) + info_list = ["bgp_route", "bgp_aspath", "bgp_community", "ping", "traceroute"] + info_dict = {} + for info_name in info_list: + info_data = info(info_name) + info_dict.update(info_data) + template = env.get_template(f"templates/{template_name}.html") return template.render( - **general, **branding, **content_dict, device_networks=networks + **config, info=info_dict, details=details_dict, networks=networks ) @@ -133,7 +219,7 @@ def css(): try: template_file = "templates/hyperglass.scss" template = env.get_template(template_file) - rendered_output = template.render(**branding) + rendered_output = template.render(**config) with open(scss_file, "w") as scss_output: scss_output.write(rendered_output) except: @@ -144,7 +230,7 @@ def css(): generated_sass = sass.compile(filename=scss_file) with open(css_file, "w") as css_output: css_output.write(generated_sass) - logger.info(f"Compiled Sass file {scss_file} to CSS file {css_file}.") + logger.debug(f"Compiled Sass file {scss_file} to CSS file {css_file}.") except: logger.error(f"Error compiling Sass in file {scss_file}.") raise diff --git a/hyperglass/render/templates/404.html b/hyperglass/render/templates/404.html new file mode 100644 index 0000000..bcaec09 --- /dev/null +++ b/hyperglass/render/templates/404.html @@ -0,0 +1,44 @@ +{% extends "templates/base.html" %} +<!DOCTYPE html> +<html> + +<head> +</head> + +{% block content %} + +<body class="has-background-danger"> + <section class="section"> + <nav class="navbar has-background-danger"> + <div class="container"> + <div class="navbar-brand"> + </div> + </div> + </nav> + <br> + <br> + <br> + <br> + <br> + <br> + </section> + <section> + <div class="container has-text-centered"> + <h1 class="title is-size-1"> + {{ branding["text"]["404"]["title"] }} + </h1> + <h2 class="subtitle is-size-3"> + {{ branding["text"]["404"]["subtitle"] }} + </h2> + <br> + </div> + </section> + {% if branding["footer"]["enable"] == true %} + {% include "templates/footer.html" %} + {% endif %} + {% if branding["credit"]["enable"] == true %} + {% include "templates/credit.html" %} + {% endif %} +{% endblock %} +</body> +</html> diff --git a/hyperglass/render/templates/429.html b/hyperglass/render/templates/429.html index 4ff5a45..444e40a 100644 --- a/hyperglass/render/templates/429.html +++ b/hyperglass/render/templates/429.html @@ -25,19 +25,19 @@ <section> <div class="container has-text-centered"> <h1 class="title is-size-1"> - {{ text_limiter_title }} + {{ features["rate_limit"]["site"]["title"] }} </h1> <h2 class="subtitle is-size-3"> - {{ text_limiter_subtitle }} + {{ features["rate_limit"]["site"]["subtitle"] }} </h2> <br> - <a href="/" class="button is-medium is-rounded is-inverted is-danger is-outlined">Try Again</a> + <a href="/" class="button is-medium is-rounded is-inverted is-danger is-outlined">{{ features["rate_limit"]["site"]["button"] }}</a> </div> </section> - {% if enable_footer == true %} + {% if branding["footer"]["enable"] == true %} {% include "templates/footer.html" %} {% endif %} - {% if enable_credit == true %} + {% if branding["credit"]["enable"] == true %} {% include "templates/credit.html" %} {% endif %} {% endblock %} diff --git a/hyperglass/render/templates/500.html b/hyperglass/render/templates/500.html index 86b4e49..331a4c4 100644 --- a/hyperglass/render/templates/500.html +++ b/hyperglass/render/templates/500.html @@ -25,19 +25,19 @@ <section> <div class="container has-text-centered"> <h1 class="title is-size-1"> - {{ text_500_title }} + {{ branding["text"]["500"]["title"] }} </h1> <h2 class="subtitle is-size-3"> - {{ text_500_subtitle }} + {{ branding["text"]["500"]["subtitle"] }} </h2> <br> - <a href="/" class="button is-medium is-rounded is-inverted is-danger is-outlined">Home</a> + <a href="/" class="button is-medium is-rounded is-inverted is-danger is-outlined">{{ branding["text"]["500"]["button"] }}</a> </div> </section> - {% if enable_footer == true %} + {% if branding["footer"]["enable"] == true %} {% include "templates/footer.html" %} {% endif %} - {% if enable_credit == true %} + {% if branding["credit"]["enable"] == true %} {% include "templates/credit.html" %} {% endif %} {% endblock %} diff --git a/hyperglass/render/templates/base.html b/hyperglass/render/templates/base.html index 64bde26..91c13b8 100644 --- a/hyperglass/render/templates/base.html +++ b/hyperglass/render/templates/base.html @@ -2,19 +2,19 @@ <html> <head> {% block head %} - <title>{{ site_title }} + {{ branding.site_name }} - - - - - - - - - + + + + + + + + + {% endblock %} @@ -24,10 +24,11 @@ {% block scripts %} + -{% if google_analytics|length > 0 %} +{% if general.google_analytics|length > 0 %} - + {% endif %} {% endblock %} diff --git a/hyperglass/render/templates/bgp_aspath.html b/hyperglass/render/templates/bgp_aspath.html deleted file mode 100644 index 4b61503..0000000 --- a/hyperglass/render/templates/bgp_aspath.html +++ /dev/null @@ -1,2 +0,0 @@ -

{{ bgp_aspath["title"] }}

-{{ bgp_aspath["content"] }} diff --git a/hyperglass/render/templates/bgp_community.html b/hyperglass/render/templates/bgp_community.html deleted file mode 100644 index 17dacfb..0000000 --- a/hyperglass/render/templates/bgp_community.html +++ /dev/null @@ -1,2 +0,0 @@ -

{{ bgp_community["title"] }}

-{{ bgp_community["content"] }} diff --git a/hyperglass/render/templates/content/.gitignore b/hyperglass/render/templates/content/.gitignore deleted file mode 100644 index dd44972..0000000 --- a/hyperglass/render/templates/content/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.md diff --git a/hyperglass/render/templates/content/footer.md.example b/hyperglass/render/templates/content/footer.md.example deleted file mode 100644 index 87e607f..0000000 --- a/hyperglass/render/templates/content/footer.md.example +++ /dev/null @@ -1,3 +0,0 @@ -+++ -+++ -By using {{ site_title }}, you agree to be bound by the following terms of use: All queries executed on this page are logged for analysis and troubleshooting. Users are prohibited from automating queries, or attempting to process queries in bulk. This service is provided on a best effort basis, and {{ org_name }} makes no availability or performance warranties or guarantees whatsoever. diff --git a/hyperglass/render/templates/credit.html b/hyperglass/render/templates/credit.html index 3cfacbc..9fb6da1 100644 --- a/hyperglass/render/templates/credit.html +++ b/hyperglass/render/templates/credit.html @@ -1,3 +1,3 @@
-

Powered by Hyperglass. Source code licensed BSD 3-Clause Clear.

+

Powered by hyperglass. Source code licensed BSD 3-Clause Clear.

diff --git a/hyperglass/render/templates/footer.html b/hyperglass/render/templates/footer.html index 9743b4d..641f382 100644 --- a/hyperglass/render/templates/footer.html +++ b/hyperglass/render/templates/footer.html @@ -1,7 +1,7 @@ diff --git a/hyperglass/render/templates/hyperglass.scss b/hyperglass/render/templates/hyperglass.scss index 82f2276..002f3c4 100644 --- a/hyperglass/render/templates/hyperglass.scss +++ b/hyperglass/render/templates/hyperglass.scss @@ -1,24 +1,24 @@ @charset "utf-8"; /* Fonts */ -@import url('{{ primary_font_url }}'); -@import url('{{ mono_font_url }}'); +@import url('{{ branding["font"]["primary"]["url"] }}'); +@import url('{{ branding["font"]["mono"]["url"] }}'); -$family-sans-serif: "{{ primary_font_name }}", sans-serif; -$family-monospace: "{{ mono_font_name }}", monospace; +$family-sans-serif: "{{ branding["font"]["primary"]["name"] }}", sans-serif; +$family-monospace: "{{ branding["font"]["mono"]["name"] }}", monospace; /* Color Changes */ -$body-background-color: {{ color_bg }}; +$body-background-color: {{ branding["color"]["background"] }}; $footer-background-color: transparent; -$danger: {{ color_danger }}; +$danger: {{ branding["color"]["danger"] }}; /* Custom Colors */ -$lg-btn-submit: {{ color_btn_submit }}; -$lg-tag-loctitle: {{ color_tag_loctitle }}; -$lg-tag-cmdtitle: {{ color_tag_cmdtitle }}; -$lg-tag-cmd: {{ color_tag_cmd }}; -$lg-progressbar: {{ color_progressbar }}; -$lg-tag-loc: {{ color_tag_loc }}; +$lg-btn-submit: {{ branding["color"]["button_submit"] }}; +$lg-tag-loc_title: {{ branding["color"]["tag"]["location_title"] }}; +$lg-tag-type_title: {{ branding["color"]["tag"]["type_title"] }}; +$lg-tag-type: {{ branding["color"]["tag"]["type"] }}; +$lg-progressbar: {{ branding["color"]["progress_bar"] }}; +$lg-tag-loc: {{ branding["color"]["tag"]["location"] }}; /* Element Changes */ $footer-padding: 3rem 1.5rem 3rem ; @@ -31,5 +31,5 @@ $footer-padding: 3rem 1.5rem 3rem ; @import "grid/_all"; @import "layout/_all"; -/* Looking Glass Imports */ +/* Hyperglass Imports */ @import "custom/custom_elements"; diff --git a/hyperglass/render/templates/index.html b/hyperglass/render/templates/index.html index 1ba5029..3cc89b0 100644 --- a/hyperglass/render/templates/index.html +++ b/hyperglass/render/templates/index.html @@ -11,35 +11,37 @@ - {% if enable_bgp_aspath == true %} + {% if features["bgp_aspath"]["enable"] == true %} {% endif %} - {% if enable_bgp_community == true %} + {% if features["bgp_community"]["enable"] == true %}