First Upload
583
CHANGELOG.md
Normal file
@@ -0,0 +1,583 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## 2.0.4 - 2024-06-30
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#264](https://github.com/thatmattlove/hyperglass/issues/264): Fixed issue where IPv6 traceroutes fail on Juniper devices due to `traceroute: wait must be >1 sec.` error. Thanks @renatoornelas!
|
||||
- [#267](https://github.com/thatmattlove/hyperglass/issues/267): Fixed issue where responses were incorrectly cached, resulting in no data being shown in the AS Path viewer.
|
||||
- [#268](https://github.com/thatmattlove/hyperglass/issues/268): Fixed issue where some Mikrotik commands failed to execute properly.
|
||||
- [#269](https://github.com/thatmattlove/hyperglass/issues/269): Updated documentation regarding `structured.rpki.mode`.
|
||||
- Removed unnecessary logging statements which caused logging errors.
|
||||
- Fixed issue where validation of structured BGP route data may have failed under certain conditions.
|
||||
|
||||
### Changed
|
||||
- Error responses are no longer cached.
|
||||
|
||||
## 2.0.3 - 2024-06-16
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#262](https://github.com/thatmattlove/hyperglass/issues/262): Fix issue where Mikrotik output was improperly parsed and displayed an error as a result.
|
||||
- Fixed issue where incorrect error styles were displayed.
|
||||
- Fixed issue where 'results' accordion component did not re-open when closed.
|
||||
- Fixed issue where pattern-based directive rules failed validation.
|
||||
|
||||
### Changed
|
||||
|
||||
- Set default logo width (back) to 50%, adjusted how the `web.logo.width` setting is handled in the UI.
|
||||
|
||||
## 2.0.2 - 2024-06-01
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#257](https://github.com/thatmattlove/hyperglass/issues/257): Fix issue where if `web.location_display_mode` is set to `dropdown` (automatically or otherwise), the menu would remain open but become detached from the main element because the Query Type element came into view.
|
||||
- [#253](https://github.com/thatmattlove/hyperglass/issues/253): _Actually_ fix issue where configuration values were improperly prepended with the `HYPERGLASS_APP_PATH` value.
|
||||
- [#258](https://github.com/thatmattlove/hyperglass/issues/258): Center logo alignment on small screens.
|
||||
- Fix broken license link in default credit menu.
|
||||
|
||||
### Added
|
||||
|
||||
- Added license to docs.
|
||||
- [#254](https://github.com/thatmattlove/hyperglass/issues/254): Users may specify their own DNS over HTTPS provider if desired.
|
||||
|
||||
## 2.0.1 - 2024-05-31
|
||||
|
||||
### Fixed
|
||||
- [#244](https://github.com/thatmattlove/hyperglass/issues/244): Fix issue with UI build where UI build directory already existed and therefore could not be created.
|
||||
- [#249](https://github.com/thatmattlove/hyperglass/issues/249): Fix issue where configuration values were improperly prepended with the `HYPERGLASS_APP_PATH` value.
|
||||
- [#251](https://github.com/thatmattlove/hyperglass/issues/251): Fix issue where browser-based DNS resolution did not show, causing FQDN queries to fail due to validation.
|
||||
- Fix issue where logo was improperly sized on small screens.
|
||||
|
||||
## 2.0.0 - 2024-05-28
|
||||
|
||||
_v2.0.0 is a major release of hyperglass. Many things have changed, and it is likely best to redeploy hyperglass in a new environment to migrate to v2._
|
||||
|
||||
### Added
|
||||
|
||||
- Commands are now defined as [directives](https://hyperglass.dev/configuration/directives), which is a configuration definition of one or more commands to run on a device. A directive defines:
|
||||
- What command (or commands) to run on the device
|
||||
- Type of UI field, text input or select
|
||||
- If the field can accept multiple values
|
||||
- Help information to show about the directive
|
||||
- Validation rules
|
||||
- hyperglass now supports Docker, and using Docker is the default and recommended method for deployment.
|
||||
- The list of locations (devices) is displayed as a gallery when the number of devices is 5 or less. This is a default value and is configurable.
|
||||
- hyperglass now supports custom [input or output plugins](https://hyperglass.dev/plugins).
|
||||
- Input Plugins: Apply custom validation logic or transform user input before the query is sent to a device.
|
||||
- Output Plugins: Interact with the output from a device before it's displayed to the user.
|
||||
- [#206](https://github.com/thatmattlove/hyperglass/issues/206): OpenBGPD is natively supported by hyperglass.
|
||||
- [#176](https://github.com/thatmattlove/hyperglass/issues/176): Custom javascript or HTML can be injected into the web page (for tracking applications such as Google Analytics).
|
||||
- [#173](https://github.com/thatmattlove/hyperglass/issues/173): Any output, such as BGP Communities, can be highlighted in the UI by defining [highlight patterns](https://hyperglass.dev/configuration/config/web-ui#highlighting).
|
||||
- [#155](https://github.com/thatmattlove/hyperglass/issues/155): A user can now use the "My IP" button to insert their own IP into the query target field.
|
||||
- [#143](https://github.com/thatmattlove/hyperglass/issues/143): Any HTTP endpoint may be configured as device from which to collect output.
|
||||
|
||||
### Fixed
|
||||
- [#229](https://github.com/thatmattlove/hyperglass/issues/229): Fixed an issue where the logo was not visible when using Firefox.
|
||||
- [#180](https://github.com/thatmattlove/hyperglass/issues/180): Fixed an issue where certain FQDNs were considered invalid.
|
||||
- [#178](https://github.com/thatmattlove/hyperglass/issues/178): Fixed an issue where parsing of Arista EOS routes failed if MED is unset.
|
||||
- [#145](https://github.com/thatmattlove/hyperglass/issues/145): Fixed an issue where menu links were improperly generated.
|
||||
|
||||
## 1.0.4 - 2021-07-03
|
||||
|
||||
### Fixed
|
||||
- [#148](https://github.com/thatmattlove/hyperglass/issues/148): Update Debian/Ubuntu Python package name in installer and documentation.
|
||||
- [#151](https://github.com/thatmattlove/hyperglass/issues/151): Fix issue with Junos structured output parsing from d1160fe where hyperglass would always query both IPv4 and IPv6 for any query type.
|
||||
|
||||
### Changed
|
||||
- Improve handling of Junos XML errors. When a Junos device returns an error in the XML output, it will be displayed in the UI.
|
||||
- Improve `hyperglass system-info` output. NodeJS version is now included in the output.
|
||||
|
||||
## 1.0.3 - 2021-06-23
|
||||
|
||||
_1.0.3 is a cosmetic release to factor in code-level changes related to the repository name change from checktheroads to thatmattlove._
|
||||
|
||||
## 1.0.2 - 2021-06-18
|
||||
|
||||
### Fixed
|
||||
- [#150](https://github.com/thatmattlove/hyperglass/issues/150): Fix handling of BIRD AS_PATH/Community targets.
|
||||
|
||||
## 1.0.1 - 2021-06-17
|
||||
|
||||
### Fixed
|
||||
- UI: fix body overflow issue
|
||||
|
||||
## 1.0.0 - 2021-05-30
|
||||
|
||||
### BREAKING CHANGES
|
||||
- The `external_link`, `help`, and `terms` parameters no longer exist and have been replaced with generic `links` and `menus` options.
|
||||
- The transitionary `frr_ssh` and `bird_ssh` NOS parameters no longer exist — `frr` and `bird` can now be used for SSH-based connectivity. hyperglass-agent users must now use `frr_legacy` and `bird_legacy` until hyperglass-agent is fully deprecated.
|
||||
|
||||
### Fixed
|
||||
- [#139](https://github.com/thatmattlove/hyperglass/issues/139): Fix an issue where the API cannot be queried by device name.
|
||||
|
||||
### Changed
|
||||
- Updated UI dependencies
|
||||
|
||||
### Added
|
||||
- [#140](https://github.com/thatmattlove/hyperglass/issues/140): Genericize links and menus so that multiple links and/or menus can be defined and fully customized.
|
||||
|
||||
## 1.0.0-beta.82 - 2021-04-22
|
||||
|
||||
### BREAKING CHANGE
|
||||
**NodeJS 14.15 or later is required**. See [the docs](https://hyperglass.dev/docs/getting-started) for installation instructions.
|
||||
|
||||
### Fixed
|
||||
- [#135](https://github.com/thatmattlove/hyperglass/issues/135): Fix an issue where Juniper indirect next-hops were empty.
|
||||
- Fix an issue where Juniper structured AS_PATH or Community queries would appear to fail if one address family (IPv4 or IPv6) had an empty response. For example, if an AS_PATH query for `.* 29414 .*` was made (which only returns IPv4 routes), the query would fail.
|
||||
|
||||
### Changed
|
||||
- Updated major Python dependencies (FastAPI, Scrapli, Netmiko, Pydantic, Uvicorn, Gunicorn, etc.)
|
||||
- Updated UI dependencies
|
||||
- [#128](https://github.com/thatmattlove/hyperglass/pull/128): Add `best` to all Juniper BGP Route queries. See [Juniper docs](https://www.juniper.net/documentation/us/en/software/junos/bgp/topics/ref/command/show-route-best.html) for more details.
|
||||
|
||||
### Added
|
||||
- The driver for devices can now be overridden with the `driver` parameter.
|
||||
|
||||
## 1.0.0-beta.81 - 2021-04-10
|
||||
|
||||
### Fixed
|
||||
- [#124](https://github.com/thatmattlove/hyperglass/issues/124): Fix an issue where networks weren't always sorted alphabetically.
|
||||
- [#126](https://github.com/thatmattlove/hyperglass/issues/126): Fix rendering of markdown tables.
|
||||
- [#132](https://github.com/thatmattlove/hyperglass/issues/132): Fix an issue where iBGP routes on Arista devices caused output parsing to fail.
|
||||
- [#133](https://github.com/thatmattlove/hyperglass/issues/133): Use body styles for background/foreground color, allowing the user to override the `light` and `dark` colors per the docs.
|
||||
- Fix an issue with select menu list style.
|
||||
|
||||
### 1.0.0-beta.80 - 2021-03-03
|
||||
|
||||
### Fixed
|
||||
- Fix an issue where the UI did not properly filter and detect the correct Query VRF when only one was defined.
|
||||
- [#121](https://github.com/thatmattlove/hyperglass/issues/121): Fix issue with select menu styling in light mode.
|
||||
|
||||
### 1.0.0-beta.79 - 2021-02-26
|
||||
|
||||
### BREAKING CHANGE
|
||||
**Major changes have been made to how VRFs are defined and handled.** Previously, you would signal to hyperglass that a VRF was the "default" VRF (meaning, a VRF does not need to be specified in any commands) by setting `name: default` in the VRF block. This limitation meant that a VRF named `default` _had_ to be defined, and that any users who keep their global routing table in a non-default VRF must define it separately.
|
||||
|
||||
Moving forward, the `name` field is only used to define the name of the VRF **as known by the device**. To signal that hyperglass should use the device's default VRF, set `default: true` on the VRF. **This is not the default**.
|
||||
|
||||
### Fixed
|
||||
- Fix an issue where long-running commands, such as traceroutes that never complete, time out and display an error instead of the output.
|
||||
|
||||
### Changed
|
||||
- Don't do external RPKI lookups for non global unicast prefixes.
|
||||
- Migrate to palette-by-numbers for theming.
|
||||
- Update UI dependencies.
|
||||
|
||||
### 1.0.0-beta.78 - 2021-02-12
|
||||
|
||||
### Added
|
||||
- Experimental table output/structured data support for Arista EOS.
|
||||
|
||||
### Fixed
|
||||
- Corrected warning color on active routes in table output.
|
||||
|
||||
### Changed
|
||||
- Caught fetch errors now display the HTTP status text in the UI, instead of the caught error message.
|
||||
|
||||
### 1.0.0-beta.77 - 2021-02-10
|
||||
|
||||
**POTENTIALLY BREAKING CHANGE**: The device `display_name` field is being deprecated, in favor of a single `name` field, which will be displayed to the end user. The `display_name` field still works, but you should migrate away from it as soon as possible.
|
||||
|
||||
### Fixed
|
||||
- [#117](https://github.com/thatmattlove/hyperglass/issues/117): Fix naming and mapping of the Arista EOS driver. `arista` and `arista_eos` will both work now.
|
||||
|
||||
### Changed
|
||||
- Removed `display_name` field from device model. The `name` field will be used in the UI. If a `display_name` is defined, it will be used, for backwards compatibility.
|
||||
|
||||
### 1.0.0-beta.76 - 2021-02-06
|
||||
|
||||
**NOTICE**: *[hyperglass-agent](https://github.com/thatmattlove/hyperglass-agent) will be deprecated soon. Use `frr_ssh` or `bird_ssh` for SSH connectivity in the meantime.*
|
||||
|
||||
### Added
|
||||
- FRR & BIRD may now be accessed via standard SSH using the `frr_ssh` and `bird_ssh` NOS. [See the docs](https://hyperglass.dev/docs/platforms#caveats) for important caveats.
|
||||
|
||||
### Changed
|
||||
- `port` in `devices.yaml` now defaults to 22 if not specified.
|
||||
|
||||
### Fixed
|
||||
- AS Path graph view now uses [dagre](https://github.com/dagrejs/dagre) to properly arrange each AS.
|
||||
- Added timeout argument to `hyperglass start --build` - fixes issue where running a UI build in this way failed due to a missing timeout argument error.
|
||||
|
||||
### 1.0.0-beta.75 - 2021-01-28
|
||||
|
||||
### Changed
|
||||
- Default UI build timeout is now 180 seconds.
|
||||
- The hyperglass `build-ui` CLI command now accepts a `--timeout` argument to override the UI build timeout.
|
||||
|
||||
### 1.0.0-beta.74 - 2021-01-25
|
||||
|
||||
### Changed
|
||||
- The Scrapli driver no longer specifically ignores the system's SSH config file.
|
||||
- Updated UI dependencies.
|
||||
|
||||
### Fixed
|
||||
- [#109](https://github.com/thatmattlove/hyperglass/issues/109): Remove the custom error page, because it doesn't work and doesn't really add much.
|
||||
|
||||
### 1.0.0-beta.73 - 2021-01-18
|
||||
|
||||
### Added
|
||||
- [#106](https://github.com/thatmattlove/hyperglass/issues/106): Add built-in support for Nokia SR OS (thanks @paunadeu!).
|
||||
|
||||
### Changed
|
||||
- [#105](https://github.com/thatmattlove/hyperglass/issues/105): Check NodeJS version on startup to ensure the minimum supported version is present.
|
||||
- Update UI dependencies.
|
||||
|
||||
### Fixed
|
||||
- [#107](https://github.com/thatmattlove/hyperglass/issues/107): Fix footer menu styling so it doesn't overflow the viewport, especially on mobile.
|
||||
|
||||
### 1.0.0-beta.72 - 2021-01-16
|
||||
|
||||
### Fixed
|
||||
- [#104](https://github.com/thatmattlove/hyperglass/issues/104): Handle the usage of `juniper_junos` as a NOS. `juniper_junos` will now automatically be mapped to `juniper`.
|
||||
- Fix an issue with dual RP juniper devices and structured output, where output containing `{master}` outside of the XML output was improperly stripped out, causing a parsing failure.
|
||||
|
||||
### Changed
|
||||
- **BREAKING**: The installer no longer generates a Systemd service file. While this was likely convenient for most, it introduced significant complexity and caused most installations using `~/hyperglass` as the app path to fail, with no clear way to resolve it. Further, while Systemd is arguably the most common, it is not the *only* process manager available. As such, the docs will be updated with a Systemd example, much like the current reverse proxy documentation.
|
||||
|
||||
### 1.0.0-beta.71 - 2021-01-10
|
||||
|
||||
### Added
|
||||
- Added Google Analytics Support. Use the `google_analytics` field for the tracking ID in `hyperglass.yaml`.
|
||||
|
||||
### Changed
|
||||
- Minor frontend code improvements.
|
||||
|
||||
### 1.0.0-beta.70 - 2021-01-05
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#100](https://github.com/thatmattlove/hyperglass/issues/100): Fix result panel bug where incorrect panels would open, or panels would not open at all. Resolved by accessing internal state of the `Accordion />` component via `useAccordionContext()` instead of directly changing the index prop via state.
|
||||
|
||||
### Changed
|
||||
- Query results now automatically cancel when each result panel unmounts (e.g. when one clicks the back button).
|
||||
|
||||
### 1.0.0-beta.69 - 2021-01-03
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix Safari browser-specific issues
|
||||
- Setup no longer fails when `commands.yaml` doesn't exist, even though it isn't needed.
|
||||
|
||||
### Changed
|
||||
|
||||
- Setup no longer adds example files
|
||||
|
||||
### 1.0.0-beta.67 - 2021-01-02
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix handling of `web.theme.default_color_mode`. Starting in 1.0.0-beta.65, it was completely ignored and used the library's default of `light`. Now, it's handled properly.
|
||||
- Fix table output layout issues, particularly on mobile.
|
||||
|
||||
### 1.0.0-beta.66 - 2021-01-02
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed Safari browser-specific issues
|
||||
- Fixed mobile layout issues
|
||||
|
||||
### Changed
|
||||
|
||||
- `web.theme.colors.black` and `web.theme.colors.white` are now `web.theme.colors.dark` and `web.theme.colors.light respectively`
|
||||
|
||||
### 1.0.0-beta.65 - 2021-01-01
|
||||
|
||||
### Added
|
||||
|
||||
- [#72](https://github.com/thatmattlove/hyperglass/issues/72): _EXPERIMENTAL_ BGP map support for devices supporting structured output (Juniper Junos, currently).
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix an issue causing Juniper Junos BGP output parsing to fail if the XML output contains a banner.
|
||||
|
||||
### Changed
|
||||
|
||||
- `web.text.title` and `web.text.subtitle` now carry a 32 character limit for simpler styling.
|
||||
- Various UI layout, styling improvements, and stability improvements.
|
||||
|
||||
### 1.0.0-beta.63 - 2020-10-18
|
||||
|
||||
### Added
|
||||
|
||||
- [#87](https://github.com/thatmattlove/hyperglass/issues/87): [TNSR] Support. To add a TNSR device, use the `tnsr` [NOS key](https://hyperglass.dev/docs/adding-devices#all-device-parameters).
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix an issue causing hyperglass custom exceptions to not be properly raised, which caused more generic error messages in the UI/API.
|
||||
|
||||
### 1.0.0-beta.62 - 2020-10-17
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix an issue causing exceptions not to be logged to the log file (but logged to stdout).
|
||||
|
||||
### 1.0.0-beta.61 - 2020-10-11
|
||||
|
||||
### POTENTIALLY BREAKING CHANGE
|
||||
|
||||
When hyperglass starts up, it will check to see if `~/hyperglass` or `/etc/hyperglass/` exists. Previously, it would silently choose the first one found, even if both exist. Now, if both exist, an exception is raised with instruction to delete one of them. If your system has both directories, hyperglass may not start up normally after you upgrade.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix a DNS resolution issue which caused Debian systems to be unable to resolve the hostnames of any devices. This was due to differences in how the Python socket module works on Debian vs other distros (even Ubuntu).
|
||||
|
||||
### Added
|
||||
|
||||
- [#81](https://github.com/thatmattlove/hyperglass/issues/81): Add support for SSH key authentication. See [the docs](https://hyperglass.dev/docs/adding-devices#credential) for more details.
|
||||
|
||||
### 1.0.0-beta.60 - 2020-10-10
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#90](https://github.com/thatmattlove/hyperglass/issues/90): Fix a typing error that caused ping & traceroute queries to fail for certain devices.
|
||||
|
||||
### Added
|
||||
|
||||
- [#82](https://github.com/thatmattlove/hyperglass/issues/82): Add support for Redis password authentication. Authentication can be configured in the following manner:
|
||||
|
||||
```yaml
|
||||
# hyperglass.yaml
|
||||
cache:
|
||||
password: examplepassword
|
||||
```
|
||||
|
||||
This would correspond with the following stanza in the Redis configuration file:
|
||||
|
||||
```
|
||||
requirepass examplepassword
|
||||
```
|
||||
|
||||
### 1.0.0-beta.59 - 2020-10-05
|
||||
|
||||
### Added
|
||||
|
||||
- Native Mikrotik support.
|
||||
- `hyperglass clear-cache` command for easy manual clearing of the Redis cache.
|
||||
|
||||
### Changed
|
||||
|
||||
- Improve output parsing scalability - parsers can now be defined on a per-NOS basis regardless of whether or not structured-data is used.
|
||||
- Restructure model locations & importing to remove some complexities.
|
||||
|
||||
### 1.0.0-beta.58 - 2020-09-28
|
||||
|
||||
### Changed
|
||||
|
||||
- [#79](https://github.com/thatmattlove/hyperglass/issues/79): Run the UI build on startup & clarify docs.
|
||||
- Removed all f-strings from log messages.
|
||||
- Migrate icon library to [@meronex/icons](https://github.com/meronex/meronex-icons) for better tree-shaking.
|
||||
- Improve console (stdout) logging
|
||||
- Fix file logging format
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#74](https://github.com/thatmattlove/hyperglass/issues/74): Fix UI build failures caused by `.alias.js`.
|
||||
- [#75](https://github.com/thatmattlove/hyperglass/issues/75): Fix whitespace stripping of query target.
|
||||
- [#77](https://github.com/thatmattlove/hyperglass/issues/77): Allow dashes in FQDN validation pattern.
|
||||
- [#83](https://github.com/thatmattlove/hyperglass/issues/83): Fix lack of support for `protocol-nh` field in Juniper XML BGP table.
|
||||
|
||||
### 1.0.0-beta.57 - 2020-07-30
|
||||
|
||||
### BREAKING CHANGE
|
||||
|
||||
If you use [hyperglass-agent](https://github.com/thatmattlove/hyperglass-agent), you must upgrade your version of hyperglass-agent to 0.1.6 or later. If using hyperglass-agent with SSL, this release will require you to re-generate & re-send your SSL certificates to hyperglass:
|
||||
|
||||
```console
|
||||
$ hyperglass-agent certificate
|
||||
$ hyperglass-agent send-certificate
|
||||
```
|
||||
|
||||
### Changed
|
||||
|
||||
- Verify a device's address is either an IPv4 or IPv6 address, or a resolvable hostname.
|
||||
- Devices using hyperglass-agent (FRR, BIRD) no longer need to use a DNS-resolvable hostname in the `address:` field, as long as the certificate has been generated by hyperglass-agent, and the proper IP addresses were selected during the prompts to generate the certificate. _If using your own certificate and you want to connect to hyperglass-agent via an IP address instead of a hostname, you need to ensure the IP address of hyperglass-agent is listed as a Subject Alternative Name in the certificate extensions._
|
||||
- Refactored device, query, proxy models to no longer scrub unsupported characters from the device name for the purposes of Python class attribute accessing.
|
||||
- Updated hyperglass-agent docs.
|
||||
|
||||
### 1.0.0-beta.56 - 2020-07-28
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved Gunicorn address formatting.
|
||||
- Improved Redis connection error handling.
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#56](https://github.com/thatmattlove/hyperglass/issues/56): Fix a silent Redis connection error if the Redis server was anything other than `localhost`, preventing hyperglass from starting.
|
||||
|
||||
### 1.0.0-beta.55 - 2020-07-27
|
||||
|
||||
### Changed
|
||||
|
||||
- Removed JS favicon build process in favor of native Python implementation ([favicons](https://github/thatmattlove/favicons))
|
||||
|
||||
### 1.0.0-beta.54 - 2020-07-25
|
||||
|
||||
### Fixed
|
||||
|
||||
- Queries to hyperglass-agent devices failed due to the error `AttributeError: 'AgentConnection' object has no attribute 'collect'`
|
||||
|
||||
### 1.0.0-beta.53 - 2020-07-23
|
||||
|
||||
### Added
|
||||
|
||||
- **BREAKING CHANGE**: [Scrapli](https://github.com/carlmontanari/scrapli) is now used for SSH connectivity to Cisco IOS, Cisco IOS-XE, Cisco IOS-XR, Cisco NX-OS Juniper Junos, and Arista EOS, which should improve the speed at which output is gathered from devices. _As of this release, Cisco IOS/IOS-XE and Juniper Junos have been directly tested and worked without issue. However, if you discover any anomalies with any of these operating systems, please [open an issue](https://github.com/thatmattlove/hyperglass/issues)._
|
||||
|
||||
### Changed
|
||||
|
||||
- Refactor of SSH & HTTPS command execution to enable pluggable underlying driver capabilities.
|
||||
- Remove `aiofile` dependency by removing unnecessary asyncio file operations in the UI build process.
|
||||
- Added `scrapli[asyncssh]` dependency for Scrapli driver support.
|
||||
|
||||
### Fixed
|
||||
|
||||
- UI: Error messages couldn't be copied with the copy button
|
||||
|
||||
### 1.0.0-beta.52 - 2020-07-19
|
||||
|
||||
### Added
|
||||
|
||||
- API route `/api/info`, which displays general system information such as the name of the organization and version of hyperglass.
|
||||
- API docs configuration parameters for the `/api/info` route.
|
||||
- [#63](https://github.com/thatmattlove/hyperglass/issues/63): Minimum RAM requirements.
|
||||
- `hyperglass system-info` CLI command to gather system CPU, Memory, Disk, Python Version, hyperglass Version, & OS info. _Note: this information is only gathered if you run the command, and even then, is printed to the console and not otherwise shared or exported_.
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated docs dependencies.
|
||||
- Improved YAML alias & anchor docs.
|
||||
- [#55](https://github.com/thatmattlove/hyperglass/issues/55): Removed YAML alias & anchors from default examples to avoid confusion.
|
||||
|
||||
### Fixed
|
||||
|
||||
- API docs logo URL now displays correctly.
|
||||
- [#62](https://github.com/thatmattlove/hyperglass/issues/62): Added `epel-release` to CentOS installation instructions.
|
||||
- [#59](https://github.com/thatmattlove/hyperglass/issues/59): Fixed copy output for Juniper devices on non-table output query types.
|
||||
- [hyperglass-agent #6](https://github.com/hyperglass-agent/issues/6): Fixed hyperglass-agent documentation issues.
|
||||
- Improve command customization docs.
|
||||
- [#61](https://github.com/thatmattlove/hyperglass/issues/61): Fixed copy output for table data. Output is now a bulleted list of parsed data.
|
||||
|
||||
### 1.0.0-beta.51 - 2020-07-13
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved config import process & error handling.
|
||||
- Improved logging initialization so that noisy logs aren't generated on startup unless debugging is enabled.
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#54](https://github.com/thatmattlove/hyperglass/issues/54): A Junos parsing error caused routes with no communities to raise an error.
|
||||
- Pre-validated config files are no longer logged on startup unless debugging is enabled.
|
||||
|
||||
### 1.0.0-beta.50 - 2020-07-12
|
||||
|
||||
### Added
|
||||
|
||||
- Synchronous API for Redis caching.
|
||||
- New `redis-py` dependency for synchronous Redis communication.
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved cache type conversion when reading cached data.
|
||||
- External data via [bgp.tools](https://bgp.tools) is now gathered via their bulk mode API.
|
||||
- External data via [bgp.tools](https://bgp.tools) is now cached via Redis to reduce external traffic and improve performance.
|
||||
- RPKI validation via [Cloudflare](https://rpki.cloudflare.com/) is now cached via Redis to reduce external traffic and improve performance.
|
||||
- Update Python dependencies.
|
||||
|
||||
### Fixed
|
||||
|
||||
- [#54](https://github.com/thatmattlove/hyperglass/issues/54): A Junos structured/table output parsing error caused routes with multiple next-hops to raise an error.
|
||||
- RPKI validation no longer occurs twice (once on serialization of the output, once on validation of the API response).
|
||||
|
||||
### 1.0.0-beta.49 - 2020-07-05
|
||||
|
||||
### Changed
|
||||
|
||||
- Update UI dependencies
|
||||
- Removed react-textfit in favor of responsive font sizes and line breaking
|
||||
- Refactor & clean up React components
|
||||
|
||||
### Fixed
|
||||
|
||||
- Route lookups for private (RFC 1918) addresses failed due to an unnecessary lookup to [bgp.tools](https://bgp.tools)
|
||||
|
||||
### 1.0.0-beta.48 - 2020-07-04
|
||||
|
||||
### Added
|
||||
|
||||
- New NOS: **VyOS**. [See docs for important caveats](https://hyperglass.dev/docs/commands).
|
||||
|
||||
### Fixed
|
||||
|
||||
- UI: If the logo `width` parameter was set to ~ 50% and the `title_mode` was set to `logo_subtitle`, the subtitle would appear next to the logo instead of underneath.
|
||||
- When copying the opengraph image, the copied image was not deleted.
|
||||
- Default traceroute help link now _actually_ points to the new docs site.
|
||||
|
||||
### 1.0.0-beta.47 - 2020-07-04
|
||||
|
||||
### Added
|
||||
|
||||
- Opengraph images are now automatically generated in the correct format from any valid image file.
|
||||
- Better color mode toggle icons (they now match [hyperglass.dev](https://hyperglass.dev)).
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved SEO & Accessibility for UI.
|
||||
- Default traceroute help link now points to new docs site.
|
||||
- Slightly different default black & white colors (they now match [hyperglass.dev](https://hyperglass.dev)).
|
||||
- Various docs site improvements
|
||||
|
||||
### Fixed
|
||||
|
||||
- Remove `platform.linux_distribution()` which was removed in Python 3.8
|
||||
- Width of page is no longer askew when `logo_subtitle` is set as the `title_mode`
|
||||
- Generated favicon manifest files now go to the correct directory.
|
||||
- Various docs site fixes
|
||||
|
||||
### 1.0.0-beta.46 - 2020-06-28
|
||||
|
||||
### Added
|
||||
|
||||
- Support for hyperglass-agent [0.1.5](https://github.com/thatmattlove/hyperglass-agent)
|
||||
|
||||
### 1.0.0-beta.45 - 2020-06-27
|
||||
|
||||
### Changed
|
||||
|
||||
- Removed RIPEStat for external data gathering, switched to [bgp.tools](https://bgp.tools)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Webhook construction bugs that caused webhooks not to send
|
||||
- Empty response handling for table output
|
||||
|
||||
### 1.0.0-beta.44 - 2020-06-26
|
||||
|
||||
### Added
|
||||
|
||||
- Support for Microsoft Teams webhook
|
||||
|
||||
### Fixed
|
||||
|
||||
- If webhooks were enabled, a hung test connection to RIPEStat would cause the query to time out
|
||||
|
||||
### 1.0.0-beta.43 - 2020-06-22
|
||||
|
||||
### Fixed
|
||||
|
||||
- Logo path handling in UI
|
||||
|
||||
### 1.0.0-beta.42 - 2020-06-21
|
||||
|
||||
### Added
|
||||
|
||||
- Automatic favicon generation
|
||||
|
||||
### Changed
|
||||
|
||||
- **BREAKING CHANGE**: The `logo` section now requires the full path for logo files. See [the docs](https://hyperglass.dev/docs/ui/logo) for details.
|
32
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# hyperglass Code of Conduct
|
||||
|
||||
Like the technical community as a whole, the hyperglass community is made up of a mixture of professionals and volunteers from all over the world, working on every aspect of the project.
|
||||
|
||||
Diversity is a core value of the hyperglass community, but it can also lead to communication issues. To that end, we have a few ground rules that we ask people to adhere to. This code applies equally to founders, contributors, and those seeking help and guidance.
|
||||
|
||||
This isn’t an exhaustive list of things that you can’t do. Rather, take it in the spirit in which it’s intended — a guide to make it easier to enrich all of us and the technical communities in which we participate.
|
||||
|
||||
This code of conduct applies to all spaces managed by the hyperglass community. This includes mailing lists, the issue tracker, Telegram groups, Gitter communities, and any other forums created by the project team which the community uses for communication. In addition, violations of this code outside these spaces may affect a person's ability to participate within them.
|
||||
|
||||
If you believe someone is violating the code of conduct, we ask that you report it by emailing [matt@hyperglass.dev](mailto:matt@hyperglass.dev).
|
||||
|
||||
**Be friendly and patient.** Be welcoming. We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, color, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability.
|
||||
|
||||
**Be considerate.** Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language.
|
||||
|
||||
**Be respectful.** Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. Members of the hyperglass community should be respectful when dealing with other members as well as with people outside the hyperglass community.
|
||||
|
||||
**Be careful in the words that you choose.** We are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. This includes, but is not limited to:
|
||||
|
||||
- Violent threats or language directed against another person.
|
||||
- Discriminatory jokes and language.
|
||||
- Posting sexually explicit or violent material.
|
||||
- Posting (or threatening to post) other people's personally identifying information ("doxing").
|
||||
- Personal insults, especially those using racist or sexist terms.
|
||||
- Unwelcome sexual attention.
|
||||
- Advocating for, or encouraging, any of the above behavior.
|
||||
- Repeated harassment of others. In general, if someone asks you to stop, then stop.
|
||||
|
||||
**When we disagree, try to understand why.** Disagreements, both social and technical, happen all the time and this project is no exception. Disagreements and differing views must be resolved constructively. Remember that we’re different. The strength of hyperglass comes from its varied community, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes.
|
||||
|
||||
Original text courtesy of the [Django project](https://www.djangoproject.com/conduct/).
|
18
CONTRIBUTING.md
Normal file
@@ -0,0 +1,18 @@
|
||||
hyperglass is primarily maintained by me, [Matt Love](https://github.com/thatmattlove). This was my first ever open source application, and as such, it's kind of my "baby". When I first started writing hyperglass, I knew _nothing_ about development, Python, JavaScript/TypeScript, or GitHub. I was a network engineer trying to solve a problem and learn a few things while I was at it.
|
||||
|
||||
Because I've been solo-maintaining and building hyperglass since around April 2019, I've become pretty particular about things that might seem trivial to someone just trying to help out. While I welcome development contributions, please don't be offended if pull requests are denied, if I request things to be done a certain way, or if I integrate something similar to your changes separately from your PR. To help understand why, here are some of the development design goals for hyperglass:
|
||||
|
||||
- **Pristine code quality**
|
||||
- [Black](https://github.com/python/black) formatting for Python.
|
||||
- Strict adherence to ESLint/Prettier configs for frontend code.
|
||||
- _ZERO_ linting errors.
|
||||
- Linting exceptions only used when there is _no other way_, and should be accompanied with comments about why there is no other way.
|
||||
- **No hard-coding**
|
||||
- Anything visible to the end-user _must_ be customizable by the administrator. If it's not, or can't be, leave code or PR comments as to why.
|
||||
- This includes things like timeouts, error messages, etc.
|
||||
- **Mobile & Accessible**
|
||||
- All UI element must be available on both desktop and mobile devices.
|
||||
- UI must achieve a 100 Lighthouse/PageInsights score for accessibility.
|
||||
- **IPv6 Support**
|
||||
- Any new device support must include IPv6 commands.
|
||||
- All frontend and backend code must support IPv6, both for running the application and processing queries.
|
24
Dockerfile
Normal file
@@ -0,0 +1,24 @@
|
||||
FROM python:3.12.3-alpine as base
|
||||
WORKDIR /opt/hyperglass
|
||||
ENV HYPERGLASS_APP_PATH=/etc/hyperglass
|
||||
ENV HYPERGLASS_HOST=0.0.0.0
|
||||
ENV HYPERGLASS_PORT=8001
|
||||
ENV HYPERGLASS_DEBUG=false
|
||||
ENV HYPERGLASS_DEV_MODE=false
|
||||
ENV HYPERGLASS_REDIS_HOST=redis
|
||||
ENV HYPEGLASS_DISABLE_UI=true
|
||||
ENV HYPERGLASS_CONTAINER=true
|
||||
COPY . .
|
||||
|
||||
FROM base as ui
|
||||
WORKDIR /opt/hyperglass/hyperglass/ui
|
||||
RUN apk add build-base pkgconfig cairo-dev nodejs npm
|
||||
RUN npm install -g pnpm
|
||||
RUN pnpm install -P
|
||||
|
||||
FROM ui as hyperglass
|
||||
WORKDIR /opt/hyperglass
|
||||
RUN pip3 install -e .
|
||||
|
||||
EXPOSE ${HYPERGLASS_PORT}
|
||||
CMD ["python3", "-m", "hyperglass.console", "start"]
|
32
LICENSE
Normal file
@@ -0,0 +1,32 @@
|
||||
The Clear BSD License
|
||||
|
||||
Copyright (c) 2024 Matthew Love
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted (subject to the limitations in the disclaimer
|
||||
below) provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
|
||||
THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
80
README.md
Normal file
@@ -0,0 +1,80 @@
|
||||
<div align="center">
|
||||
<br/>
|
||||
<img src="https://res.cloudinary.com/hyperglass/image/upload/v1593916013/logo-light.svg" width=300></img>
|
||||
<br/>
|
||||
<h3>The network looking glass that tries to make the internet better.</h3>
|
||||
<br/>
|
||||
A looking glass is implemented by network operators as a way of providing customers, peers, or the general public with a way to easily view elements of, or run tests from the provider's network.
|
||||
</div>
|
||||
|
||||
<hr/>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[**Documentation**](https://hyperglass.dev) | [**Live Demo**](https://demo.hyperglass.dev/)
|
||||
|
||||
[](https://github.com/thatmattlove/hyperglass/actions/workflows/frontend.yml)
|
||||
[](https://github.com/thatmattlove/hyperglass/actions/workflows/backend.yml)
|
||||
|
||||
<br/>
|
||||
|
||||
hyperglass is intended to make implementing a looking glass too easy not to do, with the lofty goal of improving the internet community at large by making looking glasses more common across autonomous systems of any size.
|
||||
|
||||
</div>
|
||||
|
||||
### [Changelog](https://hyperglass.dev/changelog)
|
||||
|
||||
## Features
|
||||
|
||||
- BGP Route, BGP Community, BGP AS Path, Ping, & Traceroute, or [add your own commands](https://hyperglass.dev/configuration/directives).
|
||||
- Full IPv6 support
|
||||
- Customizable everything: features, theme, UI/API text, error messages, commands
|
||||
- Built-in support for:
|
||||
- Arista EOS
|
||||
- BIRD
|
||||
- Cisco IOS
|
||||
- Cisco NX-OS
|
||||
- Cisco IOS-XR
|
||||
- FRRouting
|
||||
- Huawei VRP
|
||||
- Juniper Junos
|
||||
- Mikrotik
|
||||
- Nokia SR OS
|
||||
- OpenBGPD
|
||||
- TNSR
|
||||
- VyOS
|
||||
- Configurable support for any other [supported platform](https://hyperglass.dev/platforms)
|
||||
- Optionally access devices via an SSH proxy/jump server
|
||||
- Access-list/prefix-list style query control to whitelist or blacklist query targets
|
||||
- REST API with automatic, configurable OpenAPI documentation
|
||||
- Modern, responsive UI built on [ReactJS](https://reactjs.org/), with [NextJS](https://nextjs.org/) & [Chakra UI](https://chakra-ui.com/), written in [TypeScript](https://www.typescriptlang.org/)
|
||||
- Query multiple devices simultaneously
|
||||
- Browser-based DNS-over-HTTPS resolution of FQDN queries
|
||||
|
||||
*To request support for a specific platform, please [submit a Github Issue](https://github.com/thatmattlove/hyperglass/issues/new) with the **feature** label.*
|
||||
|
||||
### [Get Started →](https://hyperglass.dev/installation)
|
||||
|
||||
## Community
|
||||
|
||||
- [Slack](https://netdev.chat/)
|
||||
- [Telegram](https://t.me/hyperglasslg)
|
||||
|
||||
Any users, potential users, or contributors of hyperglass are welcome to join and discuss usage, feature requests, bugs, and other things.
|
||||
|
||||
**hyperglass is developed with the express intention of being free to the networking community**.
|
||||
|
||||
*However, if you're feeling particularly helpful or generous, small donations are welcome.*
|
||||
|
||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZQFH3BB2B5M3E&source=url)
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
hyperglass is built entirely on open-source software. Here are some of the awesome libraries used, check them out too!
|
||||
|
||||
- [Netmiko](https://github.com/ktbyers/netmiko)
|
||||
- [Litestar](https://litestar.dev)
|
||||
- [Pydantic](https://docs.pydantic.dev/latest/)
|
||||
- [Chakra UI](https://chakra-ui.com/)
|
||||
|
||||
[](https://github.com/thatmattlove/hyperglass/blob/main/LICENSE)
|
48
biome.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
|
||||
"organizeImports": {
|
||||
"enabled": true
|
||||
},
|
||||
"files": {
|
||||
"ignore": [
|
||||
"node_modules",
|
||||
"dist",
|
||||
".next/",
|
||||
"out/",
|
||||
"favicon-formats.ts",
|
||||
"custom.*[js, html]",
|
||||
"hyperglass.json"
|
||||
]
|
||||
},
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": true,
|
||||
"complexity": {
|
||||
"noUselessTypeConstraint": "off",
|
||||
"noBannedTypes": "off"
|
||||
},
|
||||
"style": {
|
||||
"noInferrableTypes": "off",
|
||||
"noNonNullAssertion": "off"
|
||||
},
|
||||
"correctness": {
|
||||
"useExhaustiveDependencies": "off"
|
||||
}
|
||||
}
|
||||
},
|
||||
"formatter": {
|
||||
"indentStyle": "space",
|
||||
"lineWidth": 100,
|
||||
"indentWidth": 2
|
||||
},
|
||||
"javascript": {
|
||||
"formatter": {
|
||||
"quoteStyle": "single",
|
||||
"bracketSpacing": true,
|
||||
"semicolons": "always",
|
||||
"arrowParentheses": "asNeeded",
|
||||
"trailingComma": "all"
|
||||
}
|
||||
}
|
||||
}
|
21
compose.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
services:
|
||||
redis:
|
||||
image: "redis:alpine"
|
||||
hyperglass:
|
||||
depends_on:
|
||||
- redis
|
||||
environment:
|
||||
- HYPERGLASS_APP_PATH=/etc/hyperglass
|
||||
- HYPERGLASS_HOST=${HYPERGLASS_HOST-0.0.0.0}
|
||||
- HYPERGLASS_PORT=${HYPERGLASS_PORT-8001}
|
||||
- HYPERGLASS_DEBUG=${HYPERGLASS_DEBUG-false}
|
||||
- HYPERGLASS_DEV_MODE=${HYPERGLASS_DEV_MODE-false}
|
||||
- HYPERGLASS_REDIS_HOST=${HYPERGLASS_REDIS_HOST-redis}
|
||||
- HYPEGLASS_DISABLE_UI=${HYPEGLASS_DISABLE_UI-false}
|
||||
- HYPERGLASS_CONTAINER=${HYPERGLASS_CONTAINER-true}
|
||||
- HYPERGLASS_ORIGINAL_APP_PATH=${HYPERGLASS_APP_PATH}
|
||||
build: .
|
||||
ports:
|
||||
- "${HYPERGLASS_PORT-8001}:${HYPERGLASS_PORT-8001}"
|
||||
volumes:
|
||||
- ${HYPERGLASS_APP_PATH-/etc/hyperglass}:/etc/hyperglass
|
10
docs/.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
.DS_Store
|
||||
.env*
|
||||
*.tsbuildinfo
|
||||
*.tmp*
|
||||
*.log
|
||||
node_modules/
|
||||
fonts/
|
||||
.next
|
||||
out
|
||||
pages/changelog.mdx
|
29
docs/components/color.tsx
Normal file
@@ -0,0 +1,29 @@
|
||||
type ColorProps = {
|
||||
hex: string;
|
||||
noText?: boolean;
|
||||
};
|
||||
|
||||
export const Color = (props: ColorProps) => {
|
||||
const { hex, noText = false } = props;
|
||||
return (
|
||||
<span className="color-swatch-container">
|
||||
<span className={["nx-rounded-sm", "color-swatch"].join(" ")} />
|
||||
<code>{noText ? "" : hex}</code>
|
||||
<style jsx>{`
|
||||
span.color-swatch-container {
|
||||
display: inline-flex;
|
||||
align-items: ${noText ? "flex-end" : "center"};
|
||||
justify-content: space-between;
|
||||
}
|
||||
span.color-swatch {
|
||||
display: inline-flex;
|
||||
background-color: ${hex};
|
||||
height: 1.5rem;
|
||||
width: 1.5rem;
|
||||
padding: 0.5rem 0.5rem;
|
||||
margin-right: ${noText ? "unset" : "0.5rem"};
|
||||
}
|
||||
`}</style>
|
||||
</span>
|
||||
);
|
||||
};
|
36
docs/components/docs-button.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
import NextLink from "next/link";
|
||||
import { Button } from "nextra/components";
|
||||
|
||||
const DocsIcon = () => (
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 16 16"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className="bi bi-file-earmark-text-fill"
|
||||
>
|
||||
<title>Docs</title>
|
||||
<path d="M9.293 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.707A1 1 0 0 0 13.707 4L10 .293A1 1 0 0 0 9.293 0M9.5 3.5v-2l3 3h-2a1 1 0 0 1-1-1M4.5 9a.5.5 0 0 1 0-1h7a.5.5 0 0 1 0 1zM4 10.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5m.5 2.5a.5.5 0 0 1 0-1h4a.5.5 0 0 1 0 1z" />
|
||||
</svg>
|
||||
);
|
||||
|
||||
export interface DocsButtonProps extends React.ComponentProps<"button"> {
|
||||
href: string;
|
||||
side?: "left" | "right";
|
||||
}
|
||||
|
||||
export const DocsButton = (props: DocsButtonProps) => {
|
||||
const { href, side = "left", ...rest } = props;
|
||||
return (
|
||||
<NextLink href={href}>
|
||||
<Button
|
||||
title="Docs"
|
||||
className={`nx-p-0 nx-m${side === "left" ? "r" : "l"}-2`}
|
||||
{...rest}
|
||||
>
|
||||
<DocsIcon />
|
||||
</Button>
|
||||
</NextLink>
|
||||
);
|
||||
};
|
14
docs/components/not-supported-icon.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
export const NotSupported = (props: React.ComponentProps<"svg">) => (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="16"
|
||||
height="16"
|
||||
fill="#edae49"
|
||||
viewBox="0 0 16 16"
|
||||
{...props}
|
||||
>
|
||||
<title>Not Supported</title>
|
||||
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" />
|
||||
<path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z" />
|
||||
</svg>
|
||||
);
|
44
docs/components/platforms.tsx
Normal file
@@ -0,0 +1,44 @@
|
||||
import { Code, Table, Td, Th, Tr } from "nextra/components";
|
||||
import platforms from "~/platforms.json";
|
||||
import { NotSupported } from "./not-supported-icon";
|
||||
import { Supported } from "./supported-icon";
|
||||
|
||||
export const SupportedPlatforms = () => (
|
||||
<ul className="nx-mt-2 first:nx-mt-0 ltr:nx-ml-6 rtl:nx-mr-6">
|
||||
{platforms.reduce<React.ReactNode[]>((final, platform) => {
|
||||
if (platform.native) {
|
||||
const element = (
|
||||
<li key={platform.name}>
|
||||
<Supported style={{ display: "inline", marginRight: "0.5rem" }} />
|
||||
{platform.name}
|
||||
</li>
|
||||
);
|
||||
final.push(element);
|
||||
}
|
||||
return final;
|
||||
}, [])}
|
||||
</ul>
|
||||
);
|
||||
|
||||
export const PlatformTable = () => (
|
||||
<Table>
|
||||
<tbody>
|
||||
<Tr>
|
||||
<Th>Platform Keys</Th>
|
||||
<Th>Natively Supported</Th>
|
||||
</Tr>
|
||||
{platforms.map((spec) => (
|
||||
<Tr key={spec.keys.join("--")}>
|
||||
<Td>
|
||||
{spec.keys.map((key) => (
|
||||
<Code className="nx-mx-2" key={key}>
|
||||
{key}
|
||||
</Code>
|
||||
))}
|
||||
</Td>
|
||||
<Td align="center">{spec.native ? <Supported /> : <NotSupported />}</Td>
|
||||
</Tr>
|
||||
))}
|
||||
</tbody>
|
||||
</Table>
|
||||
);
|
13
docs/components/supported-icon.tsx
Normal file
@@ -0,0 +1,13 @@
|
||||
export const Supported = (props: React.ComponentProps<"svg">) => (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="16"
|
||||
height="16"
|
||||
fill="#35b246"
|
||||
viewBox="0 0 16 16"
|
||||
{...props}
|
||||
>
|
||||
<title>Supported</title>
|
||||
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z" />
|
||||
</svg>
|
||||
);
|
80
docs/favicon-formats.ts
Normal file
@@ -0,0 +1,80 @@
|
||||
interface Favicon {
|
||||
rel: string | null;
|
||||
dimensions: [number, number];
|
||||
image_format: string;
|
||||
prefix: string;
|
||||
}
|
||||
|
||||
export default [
|
||||
{ dimensions: [48, 48], image_format: "ico", prefix: "favicon", rel: null },
|
||||
{ dimensions: [16, 16], image_format: "png", prefix: "favicon", rel: "icon" },
|
||||
{ dimensions: [32, 32], image_format: "png", prefix: "favicon", rel: "icon" },
|
||||
{ dimensions: [64, 64], image_format: "png", prefix: "favicon", rel: "icon" },
|
||||
{ dimensions: [96, 96], image_format: "png", prefix: "favicon", rel: "icon" },
|
||||
{ dimensions: [180, 180], image_format: "png", prefix: "favicon", rel: "icon" },
|
||||
{
|
||||
dimensions: [57, 57],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [60, 60],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [72, 72],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [76, 76],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [114, 114],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [120, 120],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [144, 144],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [152, 152],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [167, 167],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{
|
||||
dimensions: [180, 180],
|
||||
image_format: "png",
|
||||
prefix: "apple-touch-icon",
|
||||
rel: "apple-touch-icon",
|
||||
},
|
||||
{ dimensions: [70, 70], image_format: "png", prefix: "mstile", rel: null },
|
||||
{ dimensions: [270, 270], image_format: "png", prefix: "mstile", rel: null },
|
||||
{ dimensions: [310, 310], image_format: "png", prefix: "mstile", rel: null },
|
||||
{ dimensions: [310, 150], image_format: "png", prefix: "mstile", rel: null },
|
||||
{ dimensions: [196, 196], image_format: "png", prefix: "favicon", rel: "shortcut icon" },
|
||||
] as Favicon[];
|
8
docs/global.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
declare global {
|
||||
namespace NodeJS {
|
||||
interface ProcessEnv {
|
||||
NODE_ENV: 'development' | 'production';
|
||||
CF_PAGES_BRANCH: string;
|
||||
}
|
||||
}
|
||||
}
|
7
docs/global.module.css
Normal file
@@ -0,0 +1,7 @@
|
||||
.logo {
|
||||
color: #d84b4b;
|
||||
}
|
||||
|
||||
html[class~=dark] .logo {
|
||||
color: #fff;
|
||||
}
|
5
docs/next-env.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
35
docs/next.config.mjs
Normal file
@@ -0,0 +1,35 @@
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import withNextra from "nextra";
|
||||
|
||||
function copyChangelog() {
|
||||
const dir = path.dirname(fileURLToPath(import.meta.url));
|
||||
const src = path.resolve(dir, "..", "CHANGELOG.md");
|
||||
const data = fs.readFileSync(src);
|
||||
const replaced = data.toString().replace("# Changelog\n\n", "");
|
||||
const dst = path.resolve(dir, "pages", "changelog.mdx");
|
||||
fs.writeFileSync(dst, replaced);
|
||||
}
|
||||
|
||||
copyChangelog();
|
||||
|
||||
/**
|
||||
* @type {import('nextra').NextraConfig}
|
||||
*/
|
||||
const nextraConfig = {
|
||||
theme: "nextra-theme-docs",
|
||||
themeConfig: "./theme.config.tsx",
|
||||
};
|
||||
|
||||
/**
|
||||
* @type {import('next').NextConfig}
|
||||
*/
|
||||
const config = {
|
||||
images: {
|
||||
unoptimized: true,
|
||||
},
|
||||
output: "export",
|
||||
};
|
||||
|
||||
export default withNextra(nextraConfig)(config);
|
24
docs/package.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "hyperglass-docs",
|
||||
"version": "2.0.0",
|
||||
"description": "hyperglass documentation",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"start": "next start",
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"author": "thatmattlove <matt@hyperglass.dev>",
|
||||
"license": "BSD-3-Clause-Clear",
|
||||
"dependencies": {
|
||||
"next": "^14.1.1",
|
||||
"nextra": "3.0.0-alpha.24",
|
||||
"nextra-theme-docs": "3.0.0-alpha.24",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.11.24",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
42
docs/pages/_meta.tsx
Normal file
@@ -0,0 +1,42 @@
|
||||
export default {
|
||||
index: { title: "Introduction", theme: { breadcrumb: false } },
|
||||
"---": {
|
||||
type: "separator",
|
||||
},
|
||||
installation: "Installation",
|
||||
configuration: "Configuration",
|
||||
platforms: "Platforms",
|
||||
plugins: "Plugins",
|
||||
documentation: {
|
||||
title: "Documentation",
|
||||
type: "menu",
|
||||
items: {
|
||||
installation: {
|
||||
title: "Installation",
|
||||
href: "/installation",
|
||||
},
|
||||
configuration: {
|
||||
title: "Configuration",
|
||||
href: "/configuration",
|
||||
},
|
||||
plugins: {
|
||||
title: "Plugins",
|
||||
href: "/plugins",
|
||||
},
|
||||
changelog: {
|
||||
title: "Changelog",
|
||||
href: "/changelog",
|
||||
},
|
||||
license: {
|
||||
title: "License",
|
||||
href: "/license",
|
||||
},
|
||||
},
|
||||
},
|
||||
demo: {
|
||||
title: "Demo",
|
||||
type: "page",
|
||||
href: "https://demo.hyperglass.dev",
|
||||
newWindow: true,
|
||||
},
|
||||
};
|
7
docs/pages/configuration/_meta.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
overview: "Overview",
|
||||
config: "Config File",
|
||||
devices: "Devices File",
|
||||
directives: "Directives File",
|
||||
examples: "Examples",
|
||||
};
|
44
docs/pages/configuration/config.mdx
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Configuration File
|
||||
description: hyperglass config.yaml file reference
|
||||
---
|
||||
|
||||
The `config.yaml` file is broken into multiple sections:
|
||||
|
||||
## Top Level Parameters
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------------- | :-------------- | :------------------------------- | :------------------------------------------------------------ |
|
||||
| `org_name` | String | Beloved Hyperglass User | Your organization's name. |
|
||||
| `plugins` | List of Strings | | List of hyperglass [plugins](/plugins) to load. |
|
||||
| `primary_asn` | String | 65000 | Your organization's primary ASN. Used to set default UI text. |
|
||||
| `request_timeout` | Number | 90 | Global timeout in seconds for all requests. |
|
||||
| `site_description` | String | `org_name` Network Looking Glass | `<meta>` description, also used in the API documentation. |
|
||||
| `site_title` | String | `org_name` | Browser title, also used in the default terms & conditions. |
|
||||
|
||||
#### Example with Defaults
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
org_name: Beloved Hyperglass User
|
||||
plugins: []
|
||||
primary_asn: 65000
|
||||
request_timeout: 90
|
||||
site_description: Beloved Hyperglass User Network Looking Glass
|
||||
site_title: Beloved Hyperglass User
|
||||
```
|
||||
|
||||
## Other Configuration Sections
|
||||
|
||||
| Parameter | Docs | Description |
|
||||
| :----------- | :--------------------------------------------------------------------- | :--------------------------------------------------------------- |
|
||||
| `cache` | [Caching Docs](/configuration/config/caching.mdx) | Customize how hyperglass caches responses. |
|
||||
| `logging` | [Logging Docs](/configuration/config/logging.mdx) | Customize file logging, syslog, webhooks, etc. |
|
||||
| `messages` | [Messages Docs](/configuration/config/messages.mdx) | Customize messages shown to users. |
|
||||
| `structured` | [Structured Output Docs](/configuration/config/structured-ouptput.mdx) | Customize how hyperglass handles structured output from devices. |
|
||||
| `web` | [Web UI Docs](/configuration/config/web-ui.mdx) | Customize the look and feel of hyperglass's web UI. |
|
||||
|
||||
## Caveats
|
||||
|
||||
### Arista EOS
|
||||
|
||||
For whatever reason, the tested version of Arista EOS does not supply certain details about routes in its JSON output when running commands `show ip bgp regex <pattern>` or `show ip bgp community <community>`. Specifically, the the route's timestamp and any attached communities are not supplied. When these commands are used with Arista EOS, hyperglass sets the timestamp to the current time, and the community to an empty list.
|
8
docs/pages/configuration/config/_meta.tsx
Normal file
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
"api-docs": "API Docs",
|
||||
caching: "Caching",
|
||||
logging: "Logging & Webhooks",
|
||||
messages: "Messages",
|
||||
"structured-output": "Structured Output",
|
||||
"web-ui": "Web UI",
|
||||
};
|
72
docs/pages/configuration/config/api-docs.mdx
Normal file
@@ -0,0 +1,72 @@
|
||||
## API Docs
|
||||
|
||||
hyperglass automatically generates documentation for the REST API. The `docs` section allows users to customize the look, feel, and text used for the REST API documentation.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------------- | :------ | :----------------------------- | :---------------------------------------------------------------------------------------------- |
|
||||
| `docs.base_url` | String | https://lg.example.com | Used for REST API samples. See the [demo](https://demo.hyperglass.dev/api/docs) for an example. |
|
||||
| `docs.enable` | Boolean | `true` | Enable or disable the REST API documentation. |
|
||||
| `docs.path` | String | /api/docs | Path to the REST API documentation. |
|
||||
| `docs.title` | String | `site_title` API Documentation | API docs title. Uses the `site_title` parameter from the [global](#global) parameters. |
|
||||
| `docs.description` | String | | API docs description. Appears below the title. |
|
||||
|
||||
The documentation for API endpoints follow a common schema:
|
||||
|
||||
- `devices`
|
||||
- `info`
|
||||
- `queries`
|
||||
- `query`
|
||||
|
||||
### Schema
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| :------------ | :----- | :------------------------------------------------------------------------------- |
|
||||
| `title` | String | API endpoint title, displayed as the header text above the API endpoint section. |
|
||||
| `description` | String | API endpoint description, displayed inside each API endpoint section. |
|
||||
| `summary` | String | API endpoint summary, displayed beside the API endpoint path. |
|
||||
|
||||
### Parameters
|
||||
|
||||
| Parameter | Default Value |
|
||||
| :------------------------- | :------------------------------------------------------------------------------------------ |
|
||||
| `docs.devices.title` | Devices |
|
||||
| `docs.devices.description` | List of all devices/locations with associated identifiers, display names, networks, & VRFs. |
|
||||
| `docs.devices.summary` | Devices List |
|
||||
| `docs.info.title` | System Information |
|
||||
| `docs.info.description` | General information about this looking glass. |
|
||||
| `docs.info.summary` | System Information |
|
||||
| `docs.queries.title` | Supported Queries |
|
||||
| `docs.queries.description` | List of supported query types. |
|
||||
| `docs.queries.summary` | Query Types |
|
||||
| `docs.query.title` | Supported Query |
|
||||
| `docs.query.description` | Request a query response per-location. |
|
||||
| `docs.query.summary` | Query the Looking Glass |
|
||||
|
||||
#### Example with Defaults
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
docs:
|
||||
base_url: https://lg.example.com
|
||||
enable: true
|
||||
mode: redoc
|
||||
path: /api/docs
|
||||
title: Beloved Hyperglass User Looking Glass API Documentation
|
||||
description: null
|
||||
# API Endpoints ↓
|
||||
devices:
|
||||
title: Devices
|
||||
description: List of all devices/locations with associated identifiers, display names, networks, & VRFs.
|
||||
summary: Devices List
|
||||
info:
|
||||
title: System Information
|
||||
description: General information about this looking glass.
|
||||
summary: System Information
|
||||
queries:
|
||||
title: Supported Queries
|
||||
description: List of supported query types.
|
||||
summary: Query Types
|
||||
query:
|
||||
title: Supported Query
|
||||
description: Request a query response per-location.
|
||||
summary: Query the Looking Glass
|
||||
```
|
16
docs/pages/configuration/config/caching.mdx
Normal file
@@ -0,0 +1,16 @@
|
||||
## Cache
|
||||
|
||||
hyperglass automatically caches responses to reduce the number of times devices are queried for the same information.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :---------------- | :------ | :------------ | :------------------------------------------------------------------------------ |
|
||||
| `cache.timeout` | Number | 120 | Number of seconds for which to cache device responses. |
|
||||
| `cache.show_text` | Boolean | True | If true, an indication that a user is viewing cached information will be shown. |
|
||||
|
||||
### Example with Defaults
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
cache:
|
||||
timeout: 120
|
||||
show_text: true
|
||||
```
|
90
docs/pages/configuration/config/logging.mdx
Normal file
@@ -0,0 +1,90 @@
|
||||
## Logging
|
||||
|
||||
Console, file, HTTP, and/or syslog logging configuration.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :---------- | :----- | :------------ | :---------------------------------------------- |
|
||||
| `directory` | String | /tmp | Path to directory where logs will be created. |
|
||||
| `format` | String | text | Log text format, must be `text` or `json`. |
|
||||
| `max_size` | String | 50MB | Maximum log file size before being overwritten. |
|
||||
|
||||
### Syslog
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :-------- | :----- | :------------ | :---------------------- |
|
||||
| `host` | String | | Syslog target host. |
|
||||
| `port` | Number | 514 | Syslog target UDP port. |
|
||||
|
||||
##### Syslog Example
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
logging:
|
||||
syslog:
|
||||
host: log.example.com
|
||||
port: 514
|
||||
```
|
||||
|
||||
### HTTP Logging
|
||||
|
||||
If enabled, logs will be sent by HTTP `POST` method.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------- | :------ | :------------ | :---------------------------------------------- |
|
||||
| `provider` | String | generic | Must be `generic`, `msteams`, or `slack`. |
|
||||
| `host` | String | | URL |
|
||||
| `headers` | Map | | |
|
||||
| `params` | Map | | |
|
||||
| `verify_ssl` | Boolean | true | Enable or disable SSL certificate verification. |
|
||||
| `timeout` | Number | 5 | HTTP connection timeout in seconds. |
|
||||
|
||||
#### Authentication
|
||||
|
||||
Authentication is supported using HTTP basic authentication or an API key.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------------------------- | :----- | :------------ | :--------------------------------------------------------------------------------------------------------- |
|
||||
| `http.authentication.mode` | String | basic | Must be `basic` or `api_key`. |
|
||||
| `http.authentication.username` | String | | Basic authentication username if `mode` is set to `basic`. |
|
||||
| `http.authentication.password` | String | | Basic authentication password if `mode` is set to `basic`, or API key value if `mode` is set to `api_key`. |
|
||||
| `http.authentication.header` | String | X-API-Key | Header name if `mode` is set to `api_key`. |
|
||||
|
||||
#### Examples
|
||||
|
||||
##### Generic
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
logging:
|
||||
http:
|
||||
provider: generic
|
||||
host: https://httpbin.org
|
||||
headers:
|
||||
x-special-header: super special header value
|
||||
params:
|
||||
source: hyperglass
|
||||
verify_ssl: true
|
||||
timeout: 5
|
||||
authentication:
|
||||
mode: basic
|
||||
username: your username
|
||||
password: super secret password
|
||||
```
|
||||
|
||||
In the above example, hyperglass will send a `POST` request to `https://httpbin.org?source=hyperglass` with Basic Authentication headers set.
|
||||
|
||||
##### Microsoft Teams Webhook
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
logging:
|
||||
http:
|
||||
provider: msteams
|
||||
host: <MS Teams webhook URL>
|
||||
```
|
||||
|
||||
##### Slack
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
logging:
|
||||
http:
|
||||
provider: slack
|
||||
host: <Slack webhook URL>
|
||||
```
|
23
docs/pages/configuration/config/messages.mdx
Normal file
@@ -0,0 +1,23 @@
|
||||
## Message Customization
|
||||
|
||||
hyperglass provides as much control over user-facing text/messages as possible. The following messages may be adjusted as needed:
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------------------------ | :----- | :------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `messages.authentication_error` | String | Authentication error occurred. | Displayed when hyperglass is unable to authenticate to a device. Usually, this indicates a configuration error. |
|
||||
| `messages.connection_error` | String | Error connecting to \{device_name\}: \{error\} | Displayed when hyperglass is unable to connect to a device. Usually, this indicates a configuration error. `{device_name}` and `{error}` will be used to display the device in question and the specific connection error. |
|
||||
| `messages.general` | String | Something went wrong. | Displayed when errors occur that hyperglass didn't anticipate or handle correctly. Seeing this error message may indicate a bug in hyperglass. If you see this in the wild, try enabling [debug mode](#global) and review the logs to pinpoint the source of the error. |
|
||||
| `messages.invalid_input` | String | \{target\} is not valid. | Displayed when a query target's value is invalid in relation to the corresponding query type. `{target}` will be used to display the invalid target. |
|
||||
| `messages.invalid_query` | String | \{target\} is not a valid \{query_type\} target. | Displayed when a query target's value is invalid in relation to the corresponding query type. `{target}` and `{query_type}` may be used to display the invalid target and corresponding query type. |
|
||||
| `messages.no_input` | String | \{field\} must be specified. | Displayed when a required field is not specified. `{field}` will be used to display the name of the field that was omitted. |
|
||||
| `messages.no_output` | String | The query completed, but no matching results were found. | Displayed when hyperglass can connect to a device and execute a query, but the response is empty. |
|
||||
| `messages.not_found` | String | \{type\} '\{name\}' not found. | Displayed when an object property does not exist in the configuration. `{type}` corresponds to a user-friendly name of the object type (for example, 'Device'), `{name}` corresponds to the object name that was not found. |
|
||||
| `messages.request_timeout` | String | Request timed out. | Displayed when the [`request_timeout`](#global) time expires. |
|
||||
| `messages.target_not_allowed` | String | \{target\} is not allowed. | Displayed when a query target is implicitly denied by a configured rule. `{target}` will be used to display the denied query target. |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
message:
|
||||
general: Something with wrong.
|
||||
```
|
61
docs/pages/configuration/config/structured-output.mdx
Normal file
@@ -0,0 +1,61 @@
|
||||
## Structured
|
||||
|
||||
Devices that support responding to a query with structured or easily parsable data can have their response data placed into an easier to read table (or JSON, when using the REST API). Currently, the following platforms have structured data supported in hyperglass:
|
||||
|
||||
- Arista EOS
|
||||
- Juniper Junos
|
||||
|
||||
When structured output is available, hyperglass checks the RPKI state of each BGP prefix returned using one of two methods:
|
||||
|
||||
1. From the router's perspective
|
||||
2. From the perspective of [Cloudflare's RPKI Service](https://rpki.cloudflare.com/)
|
||||
|
||||
Additionally, hyperglass provides the ability to control which BGP communities are shown to the end user.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------------------------- | :-------------- | :------------ | :---------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `structured.rpki.mode` | String | router | Use `router` to use the router's view of the RPKI state (1 above), or `external` to use Cloudflare's view (2 above). |
|
||||
| `structured.communities.mode` | String | deny | Use `deny` to deny any communities listed in `structured.communities.items`, or `permit` to _only_ permit communities listed. |
|
||||
| `structured.communities.items` | List of Strings | | List of communities to match. |
|
||||
|
||||
### RPKI Examples
|
||||
|
||||
#### Show RPKI State from the Device's Perspective
|
||||
|
||||
```yaml filename="config.yaml" copy {2}
|
||||
structured:
|
||||
rpki:
|
||||
mode: router
|
||||
```
|
||||
|
||||
#### Show RPKI State from a Public/External Perspective
|
||||
|
||||
```yaml filename="config.yaml" copy {2}
|
||||
structured:
|
||||
rpki:
|
||||
mode: external
|
||||
```
|
||||
|
||||
### Community Filtering Examples
|
||||
|
||||
#### Deny Listed Communities by Regex pattern
|
||||
|
||||
```yaml filename="config.yaml" {5-6}
|
||||
structured:
|
||||
communities:
|
||||
mode: deny
|
||||
items:
|
||||
- '^65000:1\d+$' # don't show any communities starting with 65000:1. 65000:1234 would be denied, but 65000:4321 would be permitted.
|
||||
- "65000:2345" # don't show the 65000:2345 community.
|
||||
```
|
||||
|
||||
#### Permit only Listed Communities
|
||||
|
||||
```yaml filename="config.yaml" {5-6}
|
||||
structured:
|
||||
communities:
|
||||
mode: permit
|
||||
items:
|
||||
- "^65000:.*$" # permit any communities starting with 65000, but no others.
|
||||
- "1234:1" # permit only the 1234:1 community.
|
||||
```
|
294
docs/pages/configuration/config/web-ui.mdx
Normal file
@@ -0,0 +1,294 @@
|
||||
import { Callout } from "nextra/components";
|
||||
import { Color } from "~/components/color";
|
||||
|
||||
## Web UI
|
||||
|
||||
hyperglass provides extensive customization options for the look and feel of the web UI.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :-------------------------- | :----- | :------------ | :----------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `web.location_display_mode` | String | auto | Show the locations field as a `dropdown`, `gallery`. When using `auto`, if there are more than 5 location groups, `dropdown` will be used. |
|
||||
| `web.custom_javascript` | String | | Path to a javascript file that will be loaded with the website. |
|
||||
| `web.custom_html` | String | | Path to a custom HTML file that will be loaded with the website and rendered beneath the app. |
|
||||
|
||||
### DNS over HTTPS
|
||||
|
||||
[DNS over HTTPS](https://www.rfc-editor.org/rfc/rfc8484) is used to look up an FQDN query target from the perspective of the user's browser.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------------ | :----- | :------------------------------------- | :-------------------------------------------------------------------------- |
|
||||
| `dns_provider.name` | String | cloudflare | If `cloudflare` or `google` are provided, no URL is necessary. |
|
||||
| `dns_provider.url` | String | `https://cloudflare-dns.com/dns-query` | Provide a custom DNS over HTTPS URL if you'd like to use your own resolver. |
|
||||
|
||||
### Logo
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------------- | :--------------- | :------------ | :------------------------------------------------- |
|
||||
| `web.logo.light` | String | | Path to logo to show in light mode. |
|
||||
| `web.logo.dark` | String | | Path to logo to show in dark mode. |
|
||||
| `web.logo.favicon` | String | | Path to icon/logo from which to generate favicons. |
|
||||
| `web.logo.width` | Number or String | 100% | Width of logo, either as pixels or a percentage. |
|
||||
| `web.logo.height` | Number or String | | Height of logo, either as pixels or a percentage. |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
web:
|
||||
logo:
|
||||
light: /path/to/light-logo.svg
|
||||
dark: /path/to/dark-logo.svg
|
||||
favicon: /path/to/favicon.svg
|
||||
width: 100%
|
||||
height: null
|
||||
```
|
||||
|
||||
### Greeting
|
||||
|
||||
The greeting is an optional modal/popup window that will present itself to users in the Web UI. It can be used for anything you want; for example:
|
||||
|
||||
- A data privacy acknowledgement that must be acknowledged prior to proceeding
|
||||
- Information about your company
|
||||
- Instructions on how to use hyperglass
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :---------------------- | :------ | :------------ | :--------------------------------------------------------------------------------------------------- |
|
||||
| `web.greeting.enable` | Boolean | False | Enable or disable the greeting. |
|
||||
| `web.greeting.file` | String | | Path to markdown or plain text file that contains greeting content. |
|
||||
| `web.greeting.title` | String | Welcome | Text to be used as the greeting title. |
|
||||
| `web.greeting.button` | String | Continue | Text to be used for the button that acknowledges/closes the greeting. |
|
||||
| `web.greeting.required` | Boolean | False | If `true`, users cannot close the modal or run any queries until the greeting has been acknowledged. |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
web:
|
||||
greeting:
|
||||
enable: true
|
||||
file: /path/to/your/file.md
|
||||
title: Welcome
|
||||
button: Continue
|
||||
required: false
|
||||
```
|
||||
|
||||
### OpenGraph
|
||||
|
||||
[OpenGraph](https://ogp.me/) is the thing that generates the pretty pictures, titles, and descriptions for links when you post them to sites/tools such as Facebook, Twitter, Slack, etc. By default, [this Opengraph image](/opengraph.jpg) is used, but you can provide your own image. You don't need to worry about sizing or formatting it properly, hyperglass will handle this for you.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :-------------------- | :----- | :------------ | :---------------------------- |
|
||||
| `web.opengraph.image` | String | | Path to your OpenGraph image. |
|
||||
|
||||
### Highlighting
|
||||
|
||||
hyperglass can highlight special values in your router output and provide users with additional information about the content. For example, your organization's BGP communities or IP address space can be visually highlighted, and a tooltip can be shown when a user hovers over the highlighted value.
|
||||
|
||||
Each value you wish to be highlighted is defined with the following schema:
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :-------- | :----- | :------------ | :------------------------------------------------------ |
|
||||
| `pattern` | String | | RegEx pattern or string to match against router output. |
|
||||
| `label` | String | | Tooltip value when the highlighted text is hovered. |
|
||||
| `color` | String | | Color name from [`web.theme.colors`](#colors). |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
web:
|
||||
highlight:
|
||||
- pattern: "65000:1234"
|
||||
label: Special snowflake community that does a thing
|
||||
color: primary
|
||||
- pattern: '^192\.0\.2\.[0-9]+$'
|
||||
label: Magical IP Address
|
||||
color: blue
|
||||
```
|
||||
|
||||
### Menus
|
||||
|
||||
hyperglass can show completely-customizable menus in the footer. Each menu can be configured with the following schema:
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :-------- | :----- | :------------ | :------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `title` | String | | Menu title, will be the text that shows on footer. |
|
||||
| `content` | String | | Plain text or markdown content of the menu or path to a file that contains plain text or markdown content. |
|
||||
| `side` | String | left | Side of the footer with which the menu will be grouped. |
|
||||
| `order` | Number | 0 | Optionally specify an order for each menu item. If not specified, menus will be rendered in the order they are configured. |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
web:
|
||||
menus:
|
||||
- title: Terms & Conditions
|
||||
content:
|
||||
| **Don't** break stuff!
|
||||
_please_
|
||||
side: right
|
||||
order: 1
|
||||
- title: Help
|
||||
content: /path/to/help/file.md
|
||||
side: left
|
||||
order: 0
|
||||
```
|
||||
|
||||
### Links
|
||||
|
||||
hyperglass can show customizable links to anything you think your users might find helpful. Each link can be configured with the following schema:
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :---------- | :------ | :------------ | :-------------------------------------------------------------------------------------------------------------------- |
|
||||
| `title` | String | | Link text. |
|
||||
| `url` | String | | Link URL. |
|
||||
| `show_icon` | Boolean | True | If `true`, an icon indicating the link is an external link is shown. |
|
||||
| `side` | String | left | Side of the footer with which the link will be grouped. |
|
||||
| `order` | Number | 0 | Optionally specify an order for each link. If not specified, links will be rendered in the order they are configured. |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
web:
|
||||
links:
|
||||
- title: PeeringDB
|
||||
url: https://www.peeringdb.com/65000
|
||||
show_icon: true
|
||||
side: right
|
||||
order: 1
|
||||
- title: Our Website
|
||||
url: https://example.com
|
||||
show_icon: false
|
||||
side: left
|
||||
order: 0
|
||||
```
|
||||
|
||||
### Credit
|
||||
|
||||
| Parameter | Type | Default | Description |
|
||||
| :-------- | :-----: | :-----: | :--------------------------------------------------------------------------------------- |
|
||||
| `enable` | Boolean | `true` | Enable or disable the display of developer credit & link to hyperglass GitHub repository |
|
||||
|
||||
<Callout emoji="❤️" type="info">
|
||||
**Note from the Developer**
|
||||
<br /> If your organization's policy allows, and you don't mind, I request that you keep `credit`
|
||||
enabled. Remember: my goal for this project is get more networks to use looking glasses to make all
|
||||
of our lives easier. Because it's primarily other network operators who will use this tool to begin
|
||||
with, I'd love for any operators that use your looking glass to know where they can get their own.
|
||||
</Callout>
|
||||
|
||||
### Text
|
||||
|
||||
Most of the text in the hyperglass UI can be overridden to suit your needs.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :--------------------------- | :----- | :------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `web.text.title_mode` | String | logo_only | See [title mode section](#title-mode) |
|
||||
| `web.text.title` | String | hyperglass | Title text. |
|
||||
| `web.text.subtitle` | String | Network Looking Glass | Subtitle text. |
|
||||
| `web.text.query_location` | String | Location | Text used to label the query location (router) field. |
|
||||
| `web.text.query_type` | String | Query Type | Text used to label the query type (directive) field. |
|
||||
| `web.text.query_target` | String | Target | Text used to label the query target field. |
|
||||
| `web.text.fqdn_tooltip` | String | Use \{protocol\} | Tooltip text used when a user hovers over the FQDN tooltip. |
|
||||
| `web.text.fqdn_message` | String | Your browser has resolved \{fqdn\} to | Text used when prompting a user to select a resolve IPv4 or IPv6 address for an FQDN query. |
|
||||
| `web.text.fqdn_error` | String | Unable to resolve \{fqdn\} | Text used when an FQDN is not resolvable. |
|
||||
| `web.text.fqdn_error_button` | String | Try Again | Button text used when an FQDN is not resolvable. |
|
||||
| `web.text.cache_prefix` | String | Results cached for | Text displayed with the cache timeout countdown. |
|
||||
| `web.text.cache_icon` | String | Cached from \{time\} UTC | Text used when a user hovers over the cache icon, which is displayed when a response was a cached response. `{time}` is replaced with the _original_ query's timestamp. |
|
||||
| `web.text.complete_time` | String | Completed in \{seconds\} | Text used when a user hovers over the success icon for a query result. `{seconds}` will be replaced with 'n seconds' where n is the time a query took to complete. |
|
||||
| `web.text.rpki_invalid` | String | Invalid | Text used in table output when a route's RPKI status is invalid. |
|
||||
| `web.text.rpki_valid` | String | Valid | Text used in table output when a route's RPKI status is valid. |
|
||||
| `web.text.rpki_unknown` | String | No ROAs Exist | Text used in table output when a route's RPKI status is unknown. |
|
||||
| `web.text.rpki_unverified` | String | Not Verified | Text used in table output when a route's RPKI status is unverified. |
|
||||
| `web.text.no_communities` | String | No Communities | Text used in table output when a route has no communities. |
|
||||
| `web.text.ip_error` | String | Unable to determine IP Address | Error displayed if hyperglass is unable to determine the user's IP. |
|
||||
| `web.text.no_ip` | String | No \{protocol\} Address | Text displayed if the user doesn't have an IP address of \{protocol\} (IPv4 or IPv6). |
|
||||
| `web.text.ip_select` | String | Select an IP Address | Text used to label the IP Address selection for the user's IP. |
|
||||
| `web.text.ip_button` | String | My IP | Text used for the user IP button. |
|
||||
|
||||
#### Title Mode
|
||||
|
||||
Available title modes are:
|
||||
|
||||
| `title_mode` Value | Action |
|
||||
| :----------------- | :------------------------------------------------------------------ |
|
||||
| `logo_only` | Only the logo is displayed, no title or subtitle will be visible. |
|
||||
| `text_only` | Only the title and subtitle are displayed, no logo will be visible. |
|
||||
| `logo_subtitle` | Only the logo and subtitle are displayed, no title will be visible. |
|
||||
| `all` | Logo, title, and subtitle will all be visible. |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
web:
|
||||
text:
|
||||
title: Our Looking Glass
|
||||
subtitle: Company Name, Inc.
|
||||
title_mode: text_only
|
||||
```
|
||||
|
||||
### Theme
|
||||
|
||||
hyperglass allows you to customize the colors and fonts used in the Web UI.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------------------------- | :----- | :------------ | :--------------------------------------------------------------------------------------------------------------- |
|
||||
| `web.theme.default_color_mode` | String | | Set hyperglass's default color mode. By default, the user's system preference is used. Must be `light` or `dark` |
|
||||
|
||||
#### Colors
|
||||
|
||||
##### Intrinsic Colors
|
||||
|
||||
| Parameter | Default Value |
|
||||
| :------------------------ | :---------------------- |
|
||||
| `web.theme.colors.black` | <Color hex="#000000" /> |
|
||||
| `web.theme.colors.white` | <Color hex="#ffffff" /> |
|
||||
| `web.theme.colors.dark` | <Color hex="#010101"/> |
|
||||
| `web.theme.colors.light` | <Color hex="#f5f6f7"/> |
|
||||
| `web.theme.colors.gray` | <Color hex="#c1c7cc"/> |
|
||||
| `web.theme.colors.red` | <Color hex="#d84b4b"/> |
|
||||
| `web.theme.colors.orange` | <Color hex="#ff6b35"/> |
|
||||
| `web.theme.colors.yellow` | <Color hex="#edae49"/> |
|
||||
| `web.theme.colors.green` | <Color hex="#35b246"/> |
|
||||
| `web.theme.colors.blue` | <Color hex="#314cb6"/> |
|
||||
| `web.theme.colors.teal` | <Color hex="#35b299"/> |
|
||||
| `web.theme.colors.cyan` | <Color hex="#118ab2"/> |
|
||||
| `web.theme.colors.pink` | <Color hex="#f2607d"/> |
|
||||
| `web.theme.colors.purple` | <Color hex="#8d30b5"/> |
|
||||
|
||||
##### Functional Colors
|
||||
|
||||
| Parameter | Default Value |
|
||||
| :--------------------------- | :--------------------- |
|
||||
| `web.theme.colors.primary` | <Color hex="#118ab2"/> |
|
||||
| `web.theme.colors.secondary` | <Color hex="#314cb6"/> |
|
||||
| `web.theme.colors.success` | <Color hex="#35b246"/> |
|
||||
| `web.theme.colors.warning` | <Color hex="#edae49"/> |
|
||||
| `web.theme.colors.error` | <Color hex="#ff6b35"/> |
|
||||
| `web.theme.colors.danger` | <Color hex="#d84b4b"/> |
|
||||
|
||||
###### Example
|
||||
|
||||
To override hyperglass's primary color, it's recommended to override its mapped intrinsic color. For example, to override the default primary color to <Color hex="#00ffff" noText /> cyan:
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
web:
|
||||
theme:
|
||||
colors:
|
||||
cyan: "#00ffff"
|
||||
```
|
||||
|
||||
#### Fonts
|
||||
|
||||
hyperglass's fonts are loaded from [Google Fonts](https://fonts.google.com/). Any Google font name may be specified to override the default fonts.
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :--------------------- | :----- | :------------ | :--------------------------------------------------------------------------------------- |
|
||||
| `web.theme.fonts.body` | String | Nunito | Font for all standard body text, including headings. |
|
||||
| `web.theme.fonts.mono` | String | Fire Code | Font for all monospace text such as inline code or code blocks, including device output. |
|
||||
|
||||
##### Example
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
web:
|
||||
theme:
|
||||
fonts:
|
||||
body: Inter
|
||||
```
|
135
docs/pages/configuration/devices.mdx
Normal file
@@ -0,0 +1,135 @@
|
||||
import { Callout } from "nextra/components";
|
||||
import { SupportedPlatforms } from "~/components/platforms";
|
||||
import { DocsButton } from "~/components/docs-button";
|
||||
|
||||
## Device Configuration Parameters
|
||||
|
||||
Each configured device may have the following parameters:
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------------ | :-------------- | :------------ | :----------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `name` | String | | Display name of the device. |
|
||||
| `description` | String | | Description of the device, displayed as a subtle label. |
|
||||
| `avatar` | String | | Path to an avatar/logo image for this site. Used when [`web.location_display_mode`](/configuration/config/web-ui.mdx) is set to `gallery`. |
|
||||
| `address` | String | | IPv4 address, IPv6 address, or hostname of the device. |
|
||||
| `group` | String | | Group name, used to visually group devices in the UI. |
|
||||
| `port` | Number | | TCP port on which to connect to the device. |
|
||||
| `platform` | String | | Device platform/OS. Must be a [supported platform](/platforms.mdx). |
|
||||
| `structured_output` | Boolean | True | Disable structured output for a device that supports it. |
|
||||
| `directives` | List of Strings | | Enable referenced directives configured in the [directives config file](/configuration/directives.mdx). |
|
||||
| `driver` | String | netmiko | Specify which driver to use for this device. Currently, only `netmiko` is supported. |
|
||||
| `driver_config` | Mapping | | Mapping/dict of options to pass to the connection driver. |
|
||||
| `attrs` | Mapping | | Mapping/dict of variables, as referenced in configured directives. |
|
||||
| `credential` | Mapping | | Mapping/dict of a [credential configuration](/configuration/devices/credentials.mdx). |
|
||||
| `http` | Mapping | | Mapping/dict of [HTTP client options](/configuration/devices/http-device.mdx), if this device is connected via HTTP. |
|
||||
| `proxy` | Mapping | | Mapping/dict of [SSH proxy config](/configuration/devices/ssh-proxy.mdx) to use for this device's requests. |
|
||||
|
||||
<Callout type="tip">
|
||||
|
||||
hyperglass ships with predefined [directives](/configuration/directives.mdx) (commands) for the following [platforms](platforms.mdx):
|
||||
|
||||
<SupportedPlatforms />
|
||||
|
||||
All built in directives require that the following `attrs` be defined on each device using the directive:
|
||||
|
||||
| Attribute | Value |
|
||||
| :-------- | :-------------------------------------------------------- |
|
||||
| `source4` | IPv4 address used to source Ping and Traceroute commands. |
|
||||
| `source6` | IPv6 address used to source Ping and Traceroute commands. |
|
||||
|
||||
**Example**
|
||||
|
||||
```yaml filename="devices.yaml" {5-7} copy
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
attrs:
|
||||
source4: 192.0.2.1
|
||||
source6: "2001:db8::1"
|
||||
```
|
||||
|
||||
</Callout>
|
||||
|
||||
<Callout type="warning">
|
||||
If you do not utilize IPv6 in your network, you'll need to create your own directive that only
|
||||
has IPv4 commands.
|
||||
</Callout>
|
||||
|
||||
## Examples
|
||||
|
||||
### Simple
|
||||
|
||||
```yaml filename="devices.yaml" copy
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
credential:
|
||||
username: you
|
||||
password: your password
|
||||
- name: San Francisco, CA
|
||||
address: 192.0.2.2
|
||||
platform: juniper
|
||||
credential:
|
||||
username: you
|
||||
password: your password
|
||||
```
|
||||
|
||||
<h3 className="_font-semibold _tracking-tight _text-slate-900 dark:_text-slate-100 _mt-8 _text-2xl">
|
||||
{" "}
|
||||
<DocsButton href="/configuration/directives" /> With Directives
|
||||
</h3>
|
||||
|
||||
In this example, an additional directive `cisco-show-lldp-neighbors` is added to the built-in directives.
|
||||
|
||||
```yaml filename="devices.yaml" copy {8-9}
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
credential:
|
||||
username: you
|
||||
password: your password
|
||||
directives:
|
||||
- cisco-show-lldp-neighbors
|
||||
```
|
||||
|
||||
<h3 className="_font-semibold _tracking-tight _text-slate-900 dark:_text-slate-100 _mt-8 _text-2xl">
|
||||
{" "}
|
||||
<DocsButton href="/configuration/directives" /> Disable Built-in Directives
|
||||
</h3>
|
||||
|
||||
In this example, _only_ the `cisco-show-lldp-neighbors` directive will be available. Built-in directives are disabled.
|
||||
|
||||
```yaml filename="devices.yaml" copy {8-10}
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
credential:
|
||||
username: you
|
||||
password: your password
|
||||
directives:
|
||||
- builtin: false
|
||||
- cisco-show-lldp-neighbors
|
||||
```
|
||||
|
||||
<h3 className="_font-semibold _tracking-tight _text-slate-900 dark:_text-slate-100 _mt-8 _text-2xl">
|
||||
{" "}
|
||||
<DocsButton href="/configuration/directives" /> Enable Specifc Built-in Directives
|
||||
</h3>
|
||||
|
||||
In this example, only specified built-in directives are made available.
|
||||
|
||||
```yaml filename="devices.yaml" copy {8-9}
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
credential:
|
||||
username: you
|
||||
password: your password
|
||||
directives:
|
||||
- builtin: [bgp_route, traceroute]
|
||||
```
|
5
docs/pages/configuration/devices/_meta.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
credentials: "Credentials",
|
||||
"http-device": "HTTP Device",
|
||||
"ssh-proxy": "SSH Proxy",
|
||||
};
|
35
docs/pages/configuration/devices/credentials.mdx
Normal file
@@ -0,0 +1,35 @@
|
||||
Each device must be configured with credentials with which hyperglass can log into the device and execute commands.
|
||||
|
||||
## Credential Configuration
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :-------------------- | :----- | :------------ | :----------------------------------------------------- |
|
||||
| `credential.username` | String | | Username to use for authentication to the device. |
|
||||
| `credential.password` | String | | Password to use for authentication to the device. |
|
||||
| `credential.key` | String | | Path to SSH key used for authentication to the device. |
|
||||
|
||||
### Examples
|
||||
|
||||
#### Username & Password
|
||||
|
||||
```yaml filename="devices.yaml" copy {5-7}
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
credential:
|
||||
username: you
|
||||
password: your password
|
||||
```
|
||||
|
||||
#### SSH Private Key
|
||||
|
||||
```yaml filename="devices.yaml" copy {5-7}
|
||||
devices:
|
||||
- name: San Francisco, CA
|
||||
address: 192.0.2.2
|
||||
platform: juniper
|
||||
credential:
|
||||
username: you
|
||||
key: /path/to/your/ssh/key
|
||||
```
|
85
docs/pages/configuration/devices/http-device.mdx
Normal file
@@ -0,0 +1,85 @@
|
||||
hyperglass supports collecting output from a generic HTTP endpoint.
|
||||
|
||||
## HTTP Configuration
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :---------------------- | :------ | :------------ | :--------------------------------------------------------------------------------------------------------------------- |
|
||||
| `http.attribute_map` | Mapping | | Mapping/dict of hyperglass query fields as keys, and hyperglass query field replacements as values. |
|
||||
| `http.basic_auth` | Mapping | | If basic authentication is required, provide a mapping/dict containing the basic authentication username and password. |
|
||||
| `http.body_format` | String | json | Body format, options are `json` `yaml` `xml` `text` |
|
||||
| `http.follow_redirects` | Boolean | `false` | Follow HTTP redirects from server. |
|
||||
| `http.headers` | Mapping | | Mapping/dict of http headers to append to requests. |
|
||||
| `http.method` | String | GET | HTTP method to use for requests. |
|
||||
| `http.path` | String | / | HTTP URI/Path. |
|
||||
| `http.query` | Mapping | | Mapping/Dict of URL Query Parameters. |
|
||||
| `http.retries` | Number | 0 | Number of retries to perform before request failure. |
|
||||
| `http.scheme` | String | https | HTTP schema, must be `http` or `https` |
|
||||
| `http.source` | String | | Request source IP address. |
|
||||
| `http.ssl_ca` | String | | Path to SSL CA certificate file for SSL validation. |
|
||||
| `http.ssl_client` | String | | Path to client SSL certificates for request. |
|
||||
| `http.timeout` | Number | 5 | Request timeout in seconds. |
|
||||
| `http.verify_ssl` | Boolean | `true` | If `false`, invalid certificates for HTTPS hosts will be ignored. |
|
||||
|
||||
### Example
|
||||
|
||||
#### Basic
|
||||
|
||||
The following example will send an HTTP POST request to `https://192.0.2/path/to/query/device` with HTTP basic authentication, and will not verify the SSL certificate.
|
||||
|
||||
```yaml filename="devices.yaml" copy
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
http:
|
||||
path: /path/to/query/device
|
||||
method: POST
|
||||
verify_ssl: false
|
||||
basic_auth:
|
||||
username: you
|
||||
password: your password
|
||||
```
|
||||
|
||||
Given the following hyperglass query:
|
||||
|
||||
| Field | Value |
|
||||
| :------------- | :------------------ |
|
||||
| Query Target | `192.0.2.0/24` |
|
||||
| Query Location | `your_location` |
|
||||
| Query Type | `example_directive` |
|
||||
|
||||
The body of the request will be:
|
||||
|
||||
```json
|
||||
{
|
||||
"query_target": "192.0.2.0/24",
|
||||
"query_location": "your_location",
|
||||
"query_type": "example_directive"
|
||||
}
|
||||
```
|
||||
|
||||
#### Non-HTTPS Request
|
||||
|
||||
The following example will send an HTTP GET request to `http://192.0.2.1/path/to/query/device`:
|
||||
|
||||
```yaml filename="devices.yaml" {6} copy
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
http:
|
||||
path: /path/to/query/device
|
||||
scheme: http
|
||||
```
|
||||
|
||||
#### Header Authentication
|
||||
|
||||
The following example will send an HTTP GET request to `https://192.0.2.1/path/to/query/device` with an `Authorization` header:
|
||||
|
||||
```yaml filename="devices.yaml" {6-7} copy
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
http:
|
||||
path: /path/to/query/device
|
||||
headers:
|
||||
Authorization: your special token
|
||||
```
|
30
docs/pages/configuration/devices/ssh-proxy.mdx
Normal file
@@ -0,0 +1,30 @@
|
||||
In cases where access to the devices is secured behind a "jump box" or other intermediary server/device, hyperglass can use SSH local port forwarding to SSH to an intermedary device first, and then to the device.
|
||||
|
||||
## SSH Proxy Configuration
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :----------------- | :------ | :------------ | :----------------------------------------------------------------------------------- |
|
||||
| `proxy.address` | String | | IPv4 address, IPv6 address, or hostname of SSH proxy. |
|
||||
| `proxy.port` | Number | 22 | TCP port to use for connecting to the SSH proxy. |
|
||||
| `proxy.platform` | String | linux_ssh | Currently, only `linux_ssh` is supported. |
|
||||
| `proxy.credential` | Mapping | | Mapping/dict of a [credential configuration](/configuration/config/credentials.mdx). |
|
||||
|
||||
### Examples
|
||||
|
||||
#### Use an SSH Proxy When Connecting to a Device
|
||||
|
||||
```yaml filename="devices.yaml" copy
|
||||
devices:
|
||||
- name: New York, NY
|
||||
address: 192.0.2.1
|
||||
credential:
|
||||
username: you
|
||||
password: your password
|
||||
proxy:
|
||||
address: 203.0.113.1
|
||||
credential:
|
||||
username: your proxy username
|
||||
password: your proxy password
|
||||
```
|
||||
|
||||
In the above example, the credentials `your proxy username`/`your proxy password` will be used to authenticate from the hyperglass server to the SSH proxy, and the credentials `you`/`your password` will be used to authentiate from the SSH proxy to the device.
|
186
docs/pages/configuration/directives.mdx
Normal file
@@ -0,0 +1,186 @@
|
||||
import { Callout } from "nextra/components";
|
||||
|
||||
## What is a directive?
|
||||
|
||||
<Callout type="tip">
|
||||
|
||||
A <strong style={{color: "#ff5e5b"}}>directive</strong> is a defined configuration for one or more **commands** to run on a device. For example, a BGP Route query is a built-in directive. A directive defines:
|
||||
|
||||
- What command (or commands) to run on the device
|
||||
- Type of UI field, text input or select
|
||||
- If the field can accept multiple values
|
||||
- Help information to show about the directive
|
||||
- Validation rules
|
||||
|
||||
</Callout>
|
||||
|
||||
Each directive has the following options:
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------------- | :-------------- | :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `name` | String | | Display name of the directive. |
|
||||
| `rules` | List of Rules | | List of [rule configs](#rules) |
|
||||
| `field` | Mapping | | Mapping/dict of [fields config](#fields) |
|
||||
| `info` | String | | File path to markdown-formatted help information about the directive. |
|
||||
| `plugins` | List of Strings | | List of plugin names to use with this directive. |
|
||||
| `groups` | List of Strings | | List of names by which directives are grouped in the UI. |
|
||||
| `multiple` | Boolean | `false` | Command supports receiving multiple values. For example, Cisco IOS's `show ip bgp community` accepts multiple communities as arguments. |
|
||||
| `multiple_separator` | String | `" "` | String by which multiple values are separated. For example, a list of values `[65001, 65002, 65003]` would be rendered as `65001 65002 65003` for when the command is run. |
|
||||
|
||||
## Rules
|
||||
|
||||
A rule is a way of saying "if a query target matches the rule's conditions, run this command".
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :---------- | :-------------- | :------------ | :--------------------------------------------------------------------------------------------- |
|
||||
| `condition` | String | | Regular expression to match or IP prefix in which the value being evaluated must be contained. |
|
||||
| `action` | String | permit | `permit` or `deny` the directive target when this rule is matched. |
|
||||
| `commands` | List of Strings | | Commands to run when this rule matches. `{target}` is replaced with the query target. |
|
||||
|
||||
### IP Rule
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------------ | :------ | :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `ge` | Number | 0 | Prefix length greater than defined will be matched. |
|
||||
| `le` | Number | 32,128 | `32` for IPv4 evaluations, `128` for IPv6 evaluations. Prefix length less than defined will be matched. |
|
||||
| `allow_reserved` | Boolean | `false` | Allow reserved ([RFC1918](https://www.rfc-editor.org/rfc/rfc1918), [RFC5735](https://www.rfc-editor.org/rfc/rfc5735), [RFC5737](https://www.rfc-editor.org/rfc/rfc5737.html), etc.) addresses to pass validation. |
|
||||
| `allow_unspecified` | Boolean | `false` | Allow unspecified addresses (`0.0.0.0` `::`) to pass validation. |
|
||||
| `allow_loopback` | Boolean | `false` | Allow [loopback addresses](https://www.rfc-editor.org/rfc/rfc1700.html) (`127.0.0.0/8` `::1`) to pass validation. |
|
||||
|
||||
#### Examples
|
||||
|
||||
##### Require IPv4 Queries between /8 and /24
|
||||
|
||||
```yaml filename="directives.yaml" {5-6} /{target} {mask}/ copy
|
||||
your-directive:
|
||||
name: IP Route
|
||||
rules:
|
||||
- condition: 0.0.0.0/0
|
||||
ge: 8
|
||||
le: 24
|
||||
command: "show ip route {target} {mask}"
|
||||
```
|
||||
|
||||
Given a query target of 198.18.0.0/15, the command run on the device would be:
|
||||
|
||||
```none /198.18.0.0 255.254.0.0/
|
||||
show ip route 198.18.0.0 255.254.0.0
|
||||
```
|
||||
|
||||
##### Deny a Specific Prefix
|
||||
|
||||
```yaml filename="directives.yaml" {5} copy
|
||||
your directive:
|
||||
name: BGP Route
|
||||
rules:
|
||||
- condition: "192.0.2.0/24"
|
||||
action: deny
|
||||
- condition: "0.0.0.0/0"
|
||||
command: "show ip bgp {target}"
|
||||
```
|
||||
|
||||
In this example, a query of any IP address or prefix contained within 192.0.2.0/24 will result in an error.
|
||||
|
||||
##### Run Multiple Commands
|
||||
|
||||
```yaml filename="directives.yaml" /{target}/ {6-7} copy
|
||||
your-directive:
|
||||
name: BGP Communities
|
||||
rules:
|
||||
- condition: "65000:[0-9]+"
|
||||
commands:
|
||||
- "show route table inet.0 community {target} detail"
|
||||
- "show route table inet6.0 community {target} detail"
|
||||
```
|
||||
|
||||
In this example, a query of `65000:1` would result in the following commands being sent to the device:
|
||||
|
||||
```none /65000:1/
|
||||
show route table inet.0 community 65000:1 detail
|
||||
show route table inet6.0 community 65000:1 detail
|
||||
```
|
||||
|
||||
The output for both commands will be shown as the query result.
|
||||
|
||||
### Regex Validation
|
||||
|
||||
To validate input by regex pattern, just specify a regex pattern as the `condition`
|
||||
|
||||
```yaml filename="directives.yaml" copy
|
||||
your-directive:
|
||||
name: DNS Query
|
||||
rules:
|
||||
- condition: '^.+\.yourdomain\.com$'
|
||||
```
|
||||
|
||||
### No Validation
|
||||
|
||||
```yaml filename="directives.yaml" /{target}/ copy {4}
|
||||
your-directive:
|
||||
name: IP Route
|
||||
rules:
|
||||
- condition: null
|
||||
command: show ip route {target}
|
||||
```
|
||||
|
||||
In this example, any query would pass, regardless of query input. For instance, if a user selected this directive/query type and queried `your mom`, the real command sent to the device will be:
|
||||
|
||||
```none /your mom/
|
||||
show ip route your mom
|
||||
```
|
||||
|
||||
## Fields
|
||||
|
||||
### Text Input
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------ | :----- | :------------ | :---------------------------------------------------- |
|
||||
| `description` | String | | Field description, displayed as a label or help text. |
|
||||
| `validation` | String | | Regex pattern to validate text input. |
|
||||
|
||||
### Select
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------ | :-------------- | :------------ | :---------------------------------------------------- |
|
||||
| `description` | String | | Field description, displayed as a label or help text. |
|
||||
| `options` | List of Options | | |
|
||||
|
||||
#### Options
|
||||
|
||||
Each select option uses the following schema:
|
||||
|
||||
| Parameter | Type | Default Value | Description |
|
||||
| :------------ | :----- | :------------ | :------------------------------------------------------- |
|
||||
| `description` | String | | Field description, displayed as a label or help text. |
|
||||
| `name` | String | | If specified, will be used as the option's display name. |
|
||||
| `value` | String | | Option value sent to the device. |
|
||||
|
||||
### Examples
|
||||
|
||||
Example of a text directive expecting a string value matching a regex pattern:
|
||||
|
||||
```yaml filename="directives.yaml" copy {6-7}
|
||||
your-directive:
|
||||
name: IP Route
|
||||
rules:
|
||||
- condition: null
|
||||
command: show ip route {target}
|
||||
field:
|
||||
validation: '[0-9a-f\.\:]+'
|
||||
```
|
||||
|
||||
Example of a select directive:
|
||||
|
||||
```yaml filename="directives.yaml" copy {6-12}
|
||||
your-directive:
|
||||
name: BGP Community
|
||||
rules:
|
||||
- condition: null
|
||||
command: show ip bgp community {target}
|
||||
field:
|
||||
options:
|
||||
- value: "65001:1"
|
||||
description: Provider A Routes
|
||||
- value: "65001:2"
|
||||
description: Provider B Routes
|
||||
```
|
5
docs/pages/configuration/examples/_meta.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
"basic-configuration": "Basic Configuration",
|
||||
"add-your-own-command": "Add Your Own Command",
|
||||
"customize-the-ui": "Customize the UI",
|
||||
};
|
60
docs/pages/configuration/examples/add-your-own-command.mdx
Normal file
@@ -0,0 +1,60 @@
|
||||
import { Steps } from "nextra/components";
|
||||
|
||||
## Add Your Own Command
|
||||
|
||||
While hyperglass does come with several built-in [directives](/configuration/configuration/directives.mdx) (commands), you can also add your own. For example, say you want to add a command that shows the BGP summary from a device:
|
||||
|
||||
<Steps>
|
||||
|
||||
### Create the Directive
|
||||
|
||||
```yaml filename="directives.yaml" copy
|
||||
show-bgp-summary:
|
||||
name: BGP Summary
|
||||
rules:
|
||||
- condition: null
|
||||
command: show bgp all summary
|
||||
field: null
|
||||
```
|
||||
|
||||
### Associate the Directive with the Device
|
||||
|
||||
```yaml filename="devices.yaml" {5-6} copy
|
||||
devices:
|
||||
- name: Your Router
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
directives:
|
||||
- show-bgp-summary
|
||||
```
|
||||
|
||||
</Steps>
|
||||
|
||||
## Default Directives
|
||||
|
||||
By default, all built-in directives are _also_ enabled. If you wish to _only_ enable directives you specify, you can use `builtins: false` as a directive:
|
||||
|
||||
```yaml filename="devices.yaml" {6-7} copy
|
||||
devices:
|
||||
- name: Your Router
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
directives:
|
||||
- builtins: false
|
||||
- show-bgp-summary
|
||||
```
|
||||
|
||||
In the above example, _only_ the `show-bgp-summary` directive will be enabled.
|
||||
|
||||
You can also selectively enable certain built-in directives:
|
||||
|
||||
```yaml filename="devices.yaml" {6} copy
|
||||
devices:
|
||||
- name: Your Router
|
||||
address: 192.0.2.1
|
||||
platform: cisco_ios
|
||||
directives:
|
||||
- builtins: [bgp_route, traceroute]
|
||||
```
|
||||
|
||||
In the above example, _only_ the BGP Route and Traceroute built-in directives will be enabled.
|
30
docs/pages/configuration/examples/basic-configuration.mdx
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: Basic Configuration
|
||||
description: Get started with a basic hyperglass configuration
|
||||
---
|
||||
|
||||
import { Callout } from "nextra/components";
|
||||
|
||||
To get started, hyperglass only needs to know about your devices.
|
||||
|
||||
<Callout type="info">
|
||||
**Devices** are your routers, switches, or whatever else you want to call the endpoints
|
||||
hyperglass will query for information.
|
||||
</Callout>
|
||||
|
||||
## Simple Device Configuration
|
||||
|
||||
```yaml filename="devices.yaml"
|
||||
devices:
|
||||
- name: NYC Router 1
|
||||
address: <IP address hyperglass will use to log into the router>
|
||||
credential:
|
||||
username: <Username hyperglass will use to log into the router>
|
||||
password: <Password hyperglass will use to log into the router>
|
||||
platform: cisco_ios
|
||||
attrs:
|
||||
source4: <IPv4 address from which to source ping & traceroute commands>
|
||||
source6: <IPv4 address from which to source ping & traceroute commands>
|
||||
```
|
||||
|
||||
That's it!
|
60
docs/pages/configuration/examples/customize-the-ui.mdx
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
description: Customize hyperglass to fit your needs.
|
||||
---
|
||||
|
||||
import { DocsButton } from "~/components/docs-button";
|
||||
|
||||
<h3 className="_font-semibold _tracking-tight _text-slate-900 dark:_text-slate-100 _mt-8 _text-2xl">
|
||||
{" "}
|
||||
<DocsButton href="/configuration/config" /> Change the Title and Organization Name
|
||||
</h3>
|
||||
|
||||
```yaml filename="config.yaml"
|
||||
site_title: Our super neat looking glass
|
||||
org_name: Cool Company
|
||||
```
|
||||
|
||||
<h3 className="_font-semibold _tracking-tight _text-slate-900 dark:_text-slate-100 _mt-8 _text-2xl">
|
||||
{" "}
|
||||
<DocsButton href="/configuration/config/web-ui#logo" /> Change the Logo
|
||||
</h3>
|
||||
|
||||
```yaml filename="config.yaml" {2-4} copy
|
||||
web:
|
||||
logo:
|
||||
light: <path to logo image file to use in light mode>
|
||||
dark: <path to logo image file to use in dark mode>
|
||||
```
|
||||
|
||||
<h3 className="_font-semibold _tracking-tight _text-slate-900 dark:_text-slate-100 _mt-8 _text-2xl">
|
||||
{" "}
|
||||
<DocsButton href="/configuration/config/web-ui#theme" /> Change the Color Scheme
|
||||
</h3>
|
||||
|
||||
```yaml filename="config.yaml" copy {3-5}
|
||||
web:
|
||||
theme:
|
||||
colors:
|
||||
primary: "#d84b4b"
|
||||
secondary: "#118ab2"
|
||||
```
|
||||
|
||||
<h3 className="_font-semibold _tracking-tight _text-slate-900 dark:_text-slate-100 _mt-8 _text-2xl">
|
||||
{" "}
|
||||
<DocsButton href="/configuration/config/web-ui#menus" /> Add a Link to the Footer
|
||||
</h3>
|
||||
|
||||
```yaml filename="config.yaml" copy
|
||||
web:
|
||||
links:
|
||||
- title: PeeringDB
|
||||
url: https://www.peeringdb.com/65000
|
||||
show_icon: true
|
||||
side: right
|
||||
order: 1
|
||||
- title: Our Website
|
||||
url: https://example.com
|
||||
show_icon: false
|
||||
side: left
|
||||
order: 0
|
||||
```
|
76
docs/pages/configuration/overview.mdx
Normal file
@@ -0,0 +1,76 @@
|
||||
import { Code, Table, Td, Th, Tr, Callout } from "nextra/components";
|
||||
import { SupportedPlatforms } from "~/components/platforms";
|
||||
|
||||
Once you've gotten started with a basic configuration, you'll probably want to customize the look and feel of hyperglass by changing the logo or color scheme. Fortunately, there are _a lot_ ways to customize hyperglass.
|
||||
|
||||
## Configuration Files
|
||||
|
||||
| File Name | Docs | Purpose |
|
||||
| :----------- | :---------------------------------------------------: | :------------------------------------------------------------------------- |
|
||||
| `config` | [Config File Docs](/configuration/config.mdx) | Application-wide configuration such as logging, web UI customization, etc. |
|
||||
| `devices` | [Devices File Docs](/configuration/devices.mdx) | Your devices and their associated configurations. |
|
||||
| `directives` | [Directives File Docs](/configuration/directives.mdx) | Custom directives (commands). |
|
||||
|
||||
<Callout type="info">
|
||||
**File Extensions** <br />
|
||||
All the examples in the docs are provided in [YAML](https://yaml.org/) format, but [TOML](https://toml.io/),
|
||||
JSON, and Python files are also supported.
|
||||
</Callout>
|
||||
|
||||
### Using a Python File
|
||||
|
||||
When using a Python file for a hyperglass configuration, one of the following methods may be used:
|
||||
|
||||
#### Define a Function Named `main`
|
||||
|
||||
```python filename="Example: Using a Python function to define configuration parameters"
|
||||
def main():
|
||||
return {
|
||||
"org_name": "Your Organization Name",
|
||||
"web": {
|
||||
"theme": {
|
||||
"colors": {
|
||||
"blue": "#0000ff",
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# The main function can also be an async function.
|
||||
async def main():
|
||||
config = await some_function_to_fetch_config()
|
||||
return config
|
||||
```
|
||||
|
||||
#### Define a Dictionary Named `main`
|
||||
|
||||
```python filename="Example: Using a Python dictionary to define configuration parameters"
|
||||
main = {
|
||||
"org_name": "Your Organization Name",
|
||||
"web": {
|
||||
"theme": {
|
||||
"colors": {
|
||||
"blue": "#0000ff",
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Built-in Directives
|
||||
|
||||
hyperglass ships with predefined [directives](/configuration/directives.mdx) for the following [platforms](platforms.mdx):
|
||||
|
||||
<SupportedPlatforms />
|
||||
|
||||
All built in directives require that the following `attrs` be defined on each device using the directive:
|
||||
|
||||
| Attribute | Value |
|
||||
| :-------- | :-------------------------------------------------------- |
|
||||
| `source4` | IPv4 address used to source Ping and Traceroute commands. |
|
||||
| `source6` | IPv6 address used to source Ping and Traceroute commands. |
|
||||
|
||||
<Callout type="warning">
|
||||
If you do not utilize IPv6 in your network, you'll need to create your own directive that only
|
||||
has IPv4 commands.
|
||||
</Callout>
|
35
docs/pages/index.mdx
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: Introduction
|
||||
description: Get started with hyperglass
|
||||
---
|
||||
|
||||
import { Cards } from "nextra/components";
|
||||
import { SupportedPlatforms } from "~/components/platforms";
|
||||
|
||||
## What is hyperglass?
|
||||
|
||||
<strong style={{ color: "#ff5e5b" }}>hyperglass</strong> is an open source network looking glass written
|
||||
by a network engineer for other network engineers. The purpose of a looking glass is to provide customers,
|
||||
peers, and complete strangers with unattended visibility into the an operator's network.
|
||||
|
||||
hyperglass was created with the lofty goal of benefiting the internet community at-large by providing a faster, easier, and more secure way for operators to provide looking glass services to their customers, peers, and other network operators.
|
||||
|
||||
## Features
|
||||
|
||||
- BGP Route, BGP Community, BGP AS Path, Ping, & Traceroute
|
||||
- Full IPv6 support
|
||||
- Customizable everything: features, theme, UI/API text, error messages, commands
|
||||
- Built in support for:
|
||||
<SupportedPlatforms />
|
||||
- Configurable support for any other [supported platform](platforms.mdx)
|
||||
- Optionally access devices via an SSH proxy/jump server
|
||||
- VRF support
|
||||
- Access List/prefix-list style query control to whitelist or blacklist query targets on a per-VRF basis
|
||||
- REST API with automatic, configurable OpenAPI documentation
|
||||
- Modern, responsive UI
|
||||
- Query multiple devices simultaneously
|
||||
- Browser-based DNS-over-HTTPS resolution of FQDN queries
|
||||
|
||||
<Cards>
|
||||
<Cards.Card title="Get Started" href="installation/docker" arrow />
|
||||
</Cards>
|
11
docs/pages/installation.mdx
Normal file
@@ -0,0 +1,11 @@
|
||||
import { Cards } from "nextra/components";
|
||||
|
||||
<Cards>
|
||||
<Cards.Card href="installation/docker" title="Using Docker" />
|
||||
<Cards.Card href="installation/manual" title="Manual Installation" />
|
||||
</Cards>
|
||||
|
||||
<Cards>
|
||||
<Cards.Card href="installation/environment-variables" title="Environment Variables" />
|
||||
<Cards.Card href="installation/reverse-proxy" title="Reverse Proxy" />
|
||||
</Cards>
|
7
docs/pages/installation/_meta.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
docker: "Using Docker",
|
||||
manual: "Manual Installation",
|
||||
"environment-variables": "Environment Variables",
|
||||
"reverse-proxy": "Reverse Proxy",
|
||||
upgrading: "Upgrading hyperglass",
|
||||
};
|
60
docs/pages/installation/docker.mdx
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
title: Using Docker
|
||||
description: Installing hyperglass with Docker
|
||||
---
|
||||
|
||||
import { Cards, Steps, Callout } from "nextra/components";
|
||||
// import { Callout } from "nextra-theme-docs";
|
||||
|
||||
<Callout type="info">**Docker is the recommended method for running hyperglass.**</Callout>
|
||||
|
||||
<Steps>
|
||||
|
||||
### Install Docker
|
||||
|
||||
<Cards>
|
||||
<Cards.Card
|
||||
title="Docker Engine Installation Guide"
|
||||
href="https://docs.docker.com/engine/install/"
|
||||
target="_blank"
|
||||
arrow
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
### Download hyperglass
|
||||
|
||||
```shell copy
|
||||
mkdir /etc/hyperglass
|
||||
cd /opt
|
||||
git clone https://github.com/thatmattlove/hyperglass.git --depth=1
|
||||
cd /opt/hyperglass
|
||||
```
|
||||
|
||||
### Optional: Quickstart
|
||||
|
||||
Do this if you just want to see the hyperglass page working with a fake device.
|
||||
|
||||
```shell copy
|
||||
cp /opt/hyperglass/.samples/sample_devices.yaml /etc/hyperglass/devices.yaml
|
||||
cd /opt/hyperglass
|
||||
docker compose up
|
||||
```
|
||||
|
||||
Navigate to http://localhost:8001
|
||||
|
||||
### Create a `systemd` service
|
||||
|
||||
<Callout type="info">
|
||||
Before you create and start the hyperglass service, you may want to verify whether or not you
|
||||
intend to change any [environment variables](environment-variables.mdx) and change them first.
|
||||
</Callout>
|
||||
|
||||
```shell copy
|
||||
cp /opt/hyperglass/.samples/hyperglass-docker.service /etc/hyperglass/hyperglass.service
|
||||
ln -s /etc/hyperglass/hyperglass.service /etc/systemd/system/hyperglass.service
|
||||
systemctl daemon-reload
|
||||
systemctl enable hyperglass
|
||||
systemctl start hyperglass
|
||||
```
|
||||
|
||||
</Steps>
|
22
docs/pages/installation/environment-variables.mdx
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: Environment Variables
|
||||
description: hyperglass environment variables
|
||||
---
|
||||
|
||||
There are some configuration variables that must be supplied before hyperglass can start or read its configuration files. Most of the time, you should not need to modify these.
|
||||
|
||||
Environment variables may be overridden at the command line, or by placing them in `${HYPERGLASS_APP_PATH}/hyperglass.env`.
|
||||
|
||||
| Variable Name | Type | Default | Description |
|
||||
| :-------------------------- | :------ | :---------------- | :----------------------------------------------------------------------------------------------------------------- |
|
||||
| `HYPERGLASS_DEBUG` | boolean | `false` | Enable debug logging |
|
||||
| `HYPERGLASS_DEV_MODE` | boolean | `false` | Enable developer mode. This should only be used if you are developing hyperglass under specific circumstances. |
|
||||
| `HYPERGLASS_DISABLE_UI` | boolean | `false` | If set to `true`, the hyperglass UI is not built or served. The only way to access hyperglass is via REST API. |
|
||||
| `HYPERGLASS_APP_PATH` | string | `/etc/hyperglass` | Directory where hyperglass configuration files and static web UI files are contained. |
|
||||
| `HYPERGLASS_REDIS_HOST` | string | `localhost` | Host on which Redis is running. |
|
||||
| `HYPERGLASS_REDIS_PASSWORD` | string | — | Redis password, if any. |
|
||||
| `HYPERGLASS_REDIS_DB` | number | `1` | Redis database number. |
|
||||
| `HYPERGLASS_REDIS_DSN` | string | — | Redis DSN. If supplied, overrides `HYPERGLASS_REDIS_HOST`, `HYPERGLASS_REDIS_DB`, and `HYPERGLASS_REDIS_PASSWORD`. |
|
||||
| `HYPERGLASS_HOST` | string | `[::1]` | Address on which hyperglass listens for requests. |
|
||||
| `HYPERGLASS_PORT` | number | `8001` | TCP port on which hyperglass listens for requests. |
|
||||
| `HYPERGLASS_CA_CERT` | string | — | Path to CA certificate file for validating HTTPS certificates. If not supplied, system CAs are used. |
|
66
docs/pages/installation/manual.mdx
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
title: Manual Installation
|
||||
description: Installing hyperglass manually
|
||||
---
|
||||
|
||||
import { Steps, Callout } from "nextra/components";
|
||||
|
||||
<Steps>
|
||||
|
||||
### Install Dependencies
|
||||
|
||||
To install hyperglass manually, you'll need to install the following dependencies:
|
||||
|
||||
1. [Python 3.11, or 3.12](https://www.python.org/downloads/) and [`pip`](https://pip.pypa.io/en/stable/installation/)
|
||||
2. [NodeJS 20.14 or later](https://nodejs.org/en/download)
|
||||
3. [PNPM 8 or later](https://pnpm.io/installation)
|
||||
4. [Redis 7.2 or later](https://redis.io/download/)
|
||||
|
||||
<Callout type="warning">Make sure the Redis server is started.</Callout>
|
||||
|
||||
### Install hyperglass
|
||||
|
||||
Once these dependencies are installed, install hyperglass via PyPI:
|
||||
|
||||
```shell copy
|
||||
git clone https://github.com/thatmattlove/hyperglass --depth=1
|
||||
cd hyperglass
|
||||
pip3 install -e .
|
||||
```
|
||||
|
||||
### Create app directory
|
||||
|
||||
<Callout type="info">
|
||||
If you plan on using a different directory, be sure to set the directory you wish to use in your
|
||||
[environment variables](environment-variables.mdx).
|
||||
</Callout>
|
||||
|
||||
```shell copy
|
||||
mkdir /etc/hyperglass
|
||||
```
|
||||
|
||||
### Optional: Quickstart
|
||||
|
||||
Do this if you just want to see the hyperglass page working with default settings and a fake device.
|
||||
|
||||
```shell copy
|
||||
curl -o /etc/hyperglass/devices.yaml https://raw.githubusercontent.com/thatmattlove/hyperglass/main/.samples/sample_devices.yaml
|
||||
hyperglass start
|
||||
```
|
||||
|
||||
### Create a `systemd` service
|
||||
|
||||
```shell copy
|
||||
curl -o /etc/hyperglass/hyperglass.service https://raw.githubusercontent.com/thatmattlove/hyperglass/main/.samples/hyperglass-manual.service
|
||||
ln -s /etc/hyperglass/hyperglass.service /etc/systemd/system/hyperglass.service
|
||||
systemctl daemon-reload
|
||||
systemctl enable hyperglass
|
||||
systemctl start hyperglass
|
||||
```
|
||||
|
||||
<Callout type="info">
|
||||
If you used a different app directory from the default `/etc/hyperglass`, change the
|
||||
`EnvironmentFile` value in the `hyperglass.service` file.
|
||||
</Callout>
|
||||
|
||||
</Steps>
|
44
docs/pages/installation/reverse-proxy.mdx
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Reverse Proxy
|
||||
description: Setting up a reverse proxy for hyperglass
|
||||
---
|
||||
|
||||
import { Cards, Callout } from "nextra/components";
|
||||
|
||||
[Caddy](https://caddyserver.com) is recommended, but any reverse proxy ([NGINX](https://www.nginx.com), [Apache2](https://httpd.apache.org)) will work.
|
||||
|
||||
## Caddy
|
||||
|
||||
<Cards>
|
||||
<Cards.Card
|
||||
title="Install Caddy"
|
||||
target="_blank"
|
||||
href="https://caddyserver.com/docs/install"
|
||||
arrow
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
```shell copy
|
||||
cp /opt/hyperglass/.samples/Caddyfile /etc/caddy/Caddyfile
|
||||
```
|
||||
|
||||
Change the `lg.example.com` and `person@example.com` values to match your hyperglass FQDN and email address (the email address is for automatic SSL certificate generation via Let's Encrypt).
|
||||
|
||||
<Callout type="info">
|
||||
If you prefer to use other Let's Encrypt validation methods or your own SSL certificate, modify
|
||||
your `/etc/hyperglass/Caddyfile` in accordance with the [Caddy
|
||||
docs](https://caddyserver.com/docs/caddyfile-tutorial).
|
||||
</Callout>
|
||||
|
||||
Restart the Caddy service: `systemctl restart caddy{:shell}`
|
||||
|
||||
## NGINX
|
||||
|
||||
```shell copy
|
||||
cp /opt/hyperglass/.samples/hyperglass.nginx /etc/nginx/sites-available/hyperglass
|
||||
ln -s /etc/nginx/sites-available/hyperglass /etc/nginx/sites-enabled/hyperglass
|
||||
```
|
||||
|
||||
Change the `lg.example.com` value to match your hyperglass FQDN.
|
||||
|
||||
Change the `<path to cert chain>` and `<path to key>` values to match the path to your certificate and private key files.
|
11
docs/pages/installation/upgrading.mdx
Normal file
@@ -0,0 +1,11 @@
|
||||
## Using Docker
|
||||
|
||||
```shell copy
|
||||
cd /opt/hyperglass
|
||||
docker compose down
|
||||
docker compose rm -f
|
||||
git fetch
|
||||
git checkout v2.0.4
|
||||
docker compose build
|
||||
docker compose up
|
||||
```
|
20
docs/pages/license.mdx
Normal file
@@ -0,0 +1,20 @@
|
||||
# The Clear BSD License
|
||||
|
||||
export const Year = () => new Date().getFullYear();
|
||||
|
||||
**Copyright © <Year/> Matthew Love**
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted (subject to the limitations in the disclaimer below) provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
- Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
> NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
docs/pages/platforms.mdx
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
description: Platforms supported by hyperglass
|
||||
---
|
||||
|
||||
import { Callout } from "nextra/components";
|
||||
import { PlatformTable } from "~/components/platforms";
|
||||
|
||||
hyperglass uses [Netmiko](https://github.com/ktbyers/netmiko) to interact with devices via SSH/telnet. [All platforms supported by Netmiko](https://github.com/ktbyers/netmiko/blob/develop/PLATFORMS.md) are supported by hyperglass.
|
||||
|
||||
## Netmiko Platforms
|
||||
|
||||
<Callout type="info">
|
||||
Just because Netmiko supports a given platform doesn't mean it will automatically work with
|
||||
hyperglass. hyperglass has a limited number of built in directives (listed below). Any platforms
|
||||
other than the ones listed below will require you to [add a custom
|
||||
directive](configuration/examples/add-your-own-command.mdx) for each command you wish to make
|
||||
available.
|
||||
</Callout>
|
||||
|
||||
<br />
|
||||
|
||||
<PlatformTable />
|
||||
|
||||
## Other Platforms
|
||||
|
||||
| Platform | Key | Natively Supported |
|
||||
| :---------------- | :----- | :------------------------------------------------------------------: |
|
||||
| Any HTTP Endpoint | `http` | [See HTTP Device Docs](configuration/devices.mdx#http-configuration) |
|
144
docs/pages/plugins.mdx
Normal file
@@ -0,0 +1,144 @@
|
||||
---
|
||||
title: Plugins
|
||||
description: hyperglass Plugins
|
||||
---
|
||||
|
||||
import { Cards, Card } from "nextra/components";
|
||||
|
||||
Starting in version 2.0, hyperglass supports custom plugins. There are two main types of plugins:
|
||||
|
||||
- [**Input Plugins**](#input-plugins): Apply custom validation logic to or transform user input before the query is sent to a device.
|
||||
- [**Output Plugins**](#output-plugins): Interact with the output from a device before it's displayed to the user.
|
||||
|
||||
Plugins are associated with a directive.
|
||||
|
||||
## Examples
|
||||
|
||||
### Input Plugins
|
||||
|
||||
#### Convert a CIDR Prefix to Network and Mask
|
||||
|
||||
In this example, the following query is sent to hyperglass:
|
||||
|
||||
```json filename="Example Query"
|
||||
{
|
||||
"query_target": "192.0.2.0/24",
|
||||
"query_location": "your_location",
|
||||
"query_type": "ip_route_directive"
|
||||
}
|
||||
```
|
||||
|
||||
The below plugin is defined and referenced by a directive:
|
||||
|
||||
```python filename="/path/to/your/transform_plugin.py"
|
||||
from ipaddress import ip_network
|
||||
from hyperglass.plugins import InputPlugin
|
||||
|
||||
|
||||
class TransformCIDR(InputPlugin):
|
||||
def transform(self, query):
|
||||
(target := query.query_target)
|
||||
target_network = ip_network(target)
|
||||
if target_network.version == 4:
|
||||
return f"{target_network.network_address!s} {target_network.netmask!s}"
|
||||
return target
|
||||
```
|
||||
|
||||
```yaml filename="directives.yaml"
|
||||
ip_route_directive:
|
||||
name: IP Route
|
||||
plugins:
|
||||
- "/path/to/your/transform_plugin.py"
|
||||
rules:
|
||||
- condition: "0.0.0.0/0"
|
||||
action: permit
|
||||
command: "show ip route {target}"
|
||||
- condition: "::/0"
|
||||
action: permit
|
||||
command: "show ipv6 route {target}"
|
||||
```
|
||||
|
||||
When the query is received, the query target is transformed, resulting in this being sent to the device:
|
||||
|
||||
```
|
||||
show ip route 192.0.2.0 255.255.255.0
|
||||
```
|
||||
|
||||
instead of:
|
||||
|
||||
```
|
||||
show ip route 192.0.2.0/24
|
||||
```
|
||||
|
||||
#### Validate User Input
|
||||
|
||||
In this example, we want to perform some custom validation not available via the directives `condition` API. For instance, say you wanted to ensure a query target isn't contained within a dynamic list of [bogon prefixes from Team Cymru](https://www.team-cymru.com/bogon-networks).
|
||||
|
||||
```python filename="/path/to/your/validation_plugin.py"
|
||||
from ipaddress import ip_network
|
||||
|
||||
from hyperglass.plugins import InputPlugin
|
||||
from hyperglass.external import HTTPClient
|
||||
|
||||
class BogonPlugin(InputPlugin):
|
||||
def validate(self, query):
|
||||
target = ip_network(query.query_target)
|
||||
|
||||
with HTTPClient(base_url="https://team-cymru.org") as client:
|
||||
response = client.get("/Services/Bogons/fullbogons-ipv4.txt")
|
||||
|
||||
bogon_strings = [line.strip() for line in response.text.split("\n") if not line.startswith("#")]
|
||||
bogons = [ip_network(bogon) for bogon in bogon_strings]
|
||||
|
||||
for bogon in bogons:
|
||||
if target in bogon or target == bogon:
|
||||
return False # Return false to fail validation.
|
||||
return True
|
||||
```
|
||||
|
||||
This isn't the best real-world example, since the above plugin would be run on every request, likely resulting in slow query responses, but it illustrates the power of plugins.
|
||||
|
||||
### Output Plugins
|
||||
|
||||
#### Redact Sensitive Information
|
||||
|
||||
Say one of your directives might show some sensitive information in the query output. Using an output plugin, we can replace any text matching a pattern (or multiple patterns) with some other text.
|
||||
|
||||
```python
|
||||
import re
|
||||
from hyperglass.plugins import OutputPlugin
|
||||
|
||||
SENSITIVE_PATTERN = re.compile("SuperSecretInfo")
|
||||
|
||||
class Redact(OutputPlugin):
|
||||
def process(self, output, query):
|
||||
result = []
|
||||
for each_output in output:
|
||||
redacted = SENSITIVE_PATTERN.sub("<REDACTED>", each_output)
|
||||
result.append(redacted)
|
||||
return result
|
||||
```
|
||||
|
||||
If the query output was:
|
||||
|
||||
```text
|
||||
Lorem ipsum dolor sit amet, SuperSecretInfo consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
||||
Viverra suspendisse potenti nullam ac. At elementum eu facilisis sed odio morbi. SuperSecretInfo iaculis urna id volutpat lacus.Nisl nisi
|
||||
scelerisque eu ultrices vitae. Accumsan SuperSecretInfo tortor posuere ac ut consequat semper viverra nam libero. Libero id faucibus nisl
|
||||
tincidunt eget nullam non nisi. Et ligula ullamcorper malesuada SuperSecretInfo proin libero nunc. Et malesuada fames ac turpis egestas sed.
|
||||
Nulla facilisi cras fermentum odio eu. SuperSecretInfo condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Nisl rhoncus
|
||||
mattis rhoncus urna neque. Tortor aliquam nulla facilisi cras SuperSecretInfo fermentum odio eu feugiat. Neque egestas congue quisque egestas
|
||||
diam in arcu cursus SuperSecretInfo.
|
||||
```
|
||||
|
||||
The above plugin would transform the output to:
|
||||
|
||||
```text
|
||||
Lorem ipsum dolor sit amet, <REDACTED> consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
||||
Viverra suspendisse potenti nullam ac. At elementum eu facilisis sed odio morbi. <REDACTED> iaculis urna id volutpat lacus.Nisl nisi
|
||||
scelerisque eu ultrices vitae. Accumsan <REDACTED> tortor posuere ac ut consequat semper viverra nam libero. Libero id faucibus nisl
|
||||
tincidunt eget nullam non nisi. Et ligula ullamcorper malesuada <REDACTED> proin libero nunc. Et malesuada fames ac turpis egestas sed.
|
||||
Nulla facilisi cras fermentum odio eu. <REDACTED> condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Nisl rhoncus
|
||||
mattis rhoncus urna neque. Tortor aliquam nulla facilisi cras <REDACTED> fermentum odio eu feugiat. Neque egestas congue quisque egestas
|
||||
diam in arcu cursus <REDACTED>.
|
||||
```
|
1
docs/platforms.json
Normal file
3554
docs/pnpm-lock.yaml
generated
Normal file
21
docs/public/hyperglass-dark.svg
Normal file
@@ -0,0 +1,21 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2759.9 544.87">
|
||||
<g fill="#ff5e5b">
|
||||
<g>
|
||||
<path d="M931.39,683.15q20.28,21.23,20.28,62.74l0,134.13c0,3.35-.85,5.94-2.51,7.76a10.52,10.52,0,0,1-14.15,0c-1.67-1.82-2.51-4.4-2.5-7.75l0-131.86q0-35.58-14.12-51.79t-45.62-16.21q-35.13,0-56.35,21.65t-21.24,57.71l0,120.44q0,5-2.51,7.76a9.12,9.12,0,0,1-7.07,2.74,9,9,0,0,1-6.84-3A10.66,10.66,0,0,1,776,880l.12-305.23q0-5,2.51-7.76a10.52,10.52,0,0,1,14.15,0c1.66,1.83,2.5,4.41,2.5,7.76l0,131.39a71.74,71.74,0,0,1,30.13-32.83q20.07-11.4,46.08-11.39Q911.09,661.93,931.39,683.15Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1201.26,663a9.19,9.19,0,0,1,6.39,2.51,8.56,8.56,0,0,1,2.73,6.62,14.35,14.35,0,0,1-.91,4.1l-131,290.12q-2.75,5.48-8.22,5.47a8.83,8.83,0,0,1-6.16-2.28,7.66,7.66,0,0,1-2.5-5.93l.91-3.65,32.88-72.08L999.6,676.1a14.33,14.33,0,0,1-.91-4.11,8.65,8.65,0,0,1,3.19-6.84,10.93,10.93,0,0,1,7.3-2.73q5,0,7.76,5.48l88,198.49.91-2.28,86.76-194.78C1194.42,665.08,1197.31,662.94,1201.26,663Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1406.57,676.48q22.34,14.38,34.66,40.39t12.29,60.69q0,34.22-12.34,60t-34.69,39.91q-22.37,14.13-51.56,14.12-27.84,0-47.67-12.33t-29.88-35.6l0,118.62c0,3.35-.84,5.93-2.51,7.76a9.15,9.15,0,0,1-7.07,2.73q-9.59,0-9.58-10.5l.11-289.25a10.34,10.34,0,0,1,2.51-7.3,10.49,10.49,0,0,1,14.14,0,10.42,10.42,0,0,1,2.51,7.3v36q10-22.81,29.89-34.9T1355,662.09Q1384.21,662.11,1406.57,676.48ZM1412,848q20.54-24.85,20.55-70.48T1412,706.37q-20.52-25.56-57-25.57-37.41,0-57.5,24.84t-20.1,70.94q0,46.09,20,71.18t57,25.12Q1391.44,872.9,1412,848Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1688.91,847.68a8.28,8.28,0,0,1,2.28,5.71,14.17,14.17,0,0,1-3.43,8.89q-3.42,4.35-12.09,9.81-32.85,19.6-68,19.59-49.73,0-78.23-30.6t-28.49-84q0-34.22,12.8-60.22t36.06-40.36q23.28-14.37,53.39-14.35,42,0,66.14,27.4t24.15,74.83q0,8.21-3.19,11.86t-11.41,3.65l-157-.06q.43,44.71,22.56,68.9t62.27,24.2q21.9,0,36.27-5.91a146.07,146.07,0,0,0,28.07-15.51q9.57-6.37,12.32-6.38A7.16,7.16,0,0,1,1688.91,847.68Zm-141.61-146q-21.22,21.68-24.89,60.44l152.85.06q-.91-39.69-19.6-60.91T1603.2,680Q1568.52,680,1547.3,701.63Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1855.05,663.19c3.65,0,6.16.69,7.52,2.06s2.06,3.42,2.06,6.16q0,7.77-9.59,9.12l-13.69,1.37q-33.3,3.18-50.19,24.61a77.43,77.43,0,0,0-16.9,49.27l0,124.56q0,5-2.51,7.75a10.5,10.5,0,0,1-14.15,0c-1.67-1.83-2.5-4.41-2.5-7.76l.08-206.68q0-10.49,9.58-10.49a9.25,9.25,0,0,1,6.84,2.74c1.83,1.83,2.74,4.41,2.74,7.76v32.85q19.62-39.22,71.19-42.86l6.38-.46Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2078.6,666a9.84,9.84,0,0,1,2.74,7.3l-.08,204.85q0,47.45-22.38,71.62T1992.26,974q-24.65,0-43.34-4.58a127.8,127.8,0,0,1-36-15.07q-8.67-5.47-12.32-9.81a13.79,13.79,0,0,1-3.64-8.9,7.82,7.82,0,0,1,8.21-8.21q2.28,0,11.86,5.48a204.67,204.67,0,0,0,32.85,16q16.86,6.39,43.34,6.4,33.75,0,51.56-18.91t17.81-55.43l0-47.9q-9.59,23.71-29.9,36.26t-49.05,12.53q-29.2,0-51.78-13.71t-35.11-38.8q-12.54-25.08-12.53-57.49t12.57-57.25q12.56-24.85,35.15-38.54t51.79-13.67q28.27,0,48.35,12.34t30.1,35.14l0-36q0-10.5,9.58-10.49A9.25,9.25,0,0,1,2078.6,666Zm-37.25,172.67q20.78-24.39,20.79-66.83t-20.73-66.62q-20.76-24.18-57.71-24.2-36.51,0-57.72,24.16t-21.25,66.6q0,42.88,21.19,67.08t57.71,24.2Q2020.59,863.1,2041.35,838.69Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2161.32,888.24c-1.67-1.83-2.51-4.41-2.5-7.76l.11-305.22q0-5,2.51-7.76a9.09,9.09,0,0,1,7.08-2.73,9,9,0,0,1,6.84,3,10.73,10.73,0,0,1,2.73,7.53L2178,880.49a10.75,10.75,0,0,1-2.74,7.53,9,9,0,0,1-6.85,3A9.09,9.09,0,0,1,2161.32,888.24Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2416.64,744.16l0,136q0,5-2.51,7.76a9.12,9.12,0,0,1-7.08,2.73,9.45,9.45,0,0,1-7.29-3,10.66,10.66,0,0,1-2.74-7.53V848.18q-10,21-29,32.38T2324.88,892a84.41,84.41,0,0,1-38.32-8.68,71.93,71.93,0,0,1-27.6-23.51,59.47,59.47,0,0,1-10.71-33.08q-.43-25.08,12.34-38.78t42.89-19.6q30.12-5.91,84.41-5.9H2397V743.24q0-32.38-13-47.22t-40.83-14.85q-21.9,0-39,5.69t-27.15,13q-1.83,1.38-7.53,5.25c-3.81,2.59-6.93,3.87-9.36,3.87a7.82,7.82,0,0,1-5.7-2.51,8.37,8.37,0,0,1-2.51-6.16q0-8.65,16-18.24a134.23,134.23,0,0,1,34.91-14.59,146.13,146.13,0,0,1,37.64-5Q2416.67,662.5,2416.64,744.16ZM2361.85,863a69.15,69.15,0,0,0,25.78-27.13q9.36-17.34,9.37-39.24V780.2h-8.67q-47.91,0-73,3.85t-35.14,13.21q-10,9.36-10,27.6,0,21,15.49,34.46t39.24,13.47Q2345.41,872.79,2361.85,863Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2526.54,886.78a122.09,122.09,0,0,1-31.93-14.38q-9.14-5.92-12.32-9.82a13.55,13.55,0,0,1-3.19-8.89,8.24,8.24,0,0,1,2.29-5.71,7.17,7.17,0,0,1,5.47-2.5q2.28,0,6.16,2.51c2.58,1.67,4.33,2.82,5.25,3.42a142.87,142.87,0,0,0,27.59,15.75q14.37,6.17,36.27,6.18,29.65,0,45.63-10.94t16-31q0-11.85-5.7-19.62t-18.7-13.46q-13-5.7-37.17-11.19Q2522,778,2504.69,763.82t-17.33-37.42q0-28.29,22.15-46.08t57.26-17.77a114.74,114.74,0,0,1,32.4,4.58,95.21,95.21,0,0,1,27.37,12.78q8.65,6.4,12.54,11.19a15.49,15.49,0,0,1,3.87,9.81,8.24,8.24,0,0,1-2.28,5.7,7.18,7.18,0,0,1-5.48,2.51c-2.44,0-6.38-2.29-11.86-6.85a127.56,127.56,0,0,0-24.86-15.07q-13-5.93-32.62-5.94-25.54,0-41.29,12.07T2508.81,725q0,11.87,5,19.39t17.1,13q12.09,5.47,34.45,10.5,31.47,7.78,48.35,15.76t24,19.18q7.07,11.18,7.06,28.51,0,27.38-22.6,44t-60,16.63A125.17,125.17,0,0,1,2526.54,886.78Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2743.71,886.86a121.76,121.76,0,0,1-31.93-14.38q-9.14-5.93-12.32-9.81a13.6,13.6,0,0,1-3.19-8.9,8.25,8.25,0,0,1,2.29-5.7,7.14,7.14,0,0,1,5.47-2.51q2.28,0,6.16,2.51l5.25,3.42a143.22,143.22,0,0,0,27.6,15.76q14.36,6.16,36.26,6.17,29.65,0,45.63-10.93t16-31q0-11.87-5.69-19.62t-18.7-13.47q-13-5.7-37.18-11.19-40.15-9.13-57.48-23.29t-17.32-37.42q0-28.29,22.14-46.07T2784,662.64a114.31,114.31,0,0,1,32.39,4.57A94.83,94.83,0,0,1,2843.71,680q8.65,6.39,12.54,11.18a15.51,15.51,0,0,1,3.87,9.81,8.24,8.24,0,0,1-2.28,5.7,7.12,7.12,0,0,1-5.47,2.51q-3.66,0-11.86-6.85a128.65,128.65,0,0,0-24.86-15.07q-13-5.92-32.62-5.94-25.56,0-41.3,12.08T2726,725.12q0,11.86,5,19.39t17.1,13q12.09,5.47,34.45,10.51,31.47,7.77,48.35,15.76t24,19.17q7.07,11.19,7.06,28.51,0,27.38-22.6,44t-60,16.62A125.19,125.19,0,0,1,2743.71,886.86Z" transform="translate(-102 -476.45)" />
|
||||
</g>
|
||||
<g>
|
||||
<path d="M629,748.94A254.5,254.5,0,0,1,177.8,910.5a253.51,253.51,0,0,1-57-141.26A254.75,254.75,0,0,1,269.49,517c48.18-22.05,103.68-28.13,155.56-17.55a253.76,253.76,0,0,1,204,249.5c0,11.58,18,11.6,18,0-.15-56.09-17.45-111.67-50.07-157.4A275.77,275.77,0,0,0,468,492.94c-53.4-19.67-113.16-21.73-167.89-6.22A272.65,272.65,0,0,0,141.23,889.87c28.26,46.62,70.66,84.65,120.38,107.11a275.73,275.73,0,0,0,167.55,18.95,272.71,272.71,0,0,0,142.15-78.52c38.14-39.87,64-91.3,72.33-145.91A287.4,287.4,0,0,0,647,748.94C647,737.36,629,737.34,629,748.94Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M276.33,926.44a203,203,0,0,0,98.67,26c7.72,0,7.73-12,0-12a190.29,190.29,0,0,1-92.62-24.36c-6.74-3.79-12.79,6.58-6.05,10.36Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M233.58,611c-28.56,28.78-48.31,65.84-55.4,105.83a199.79,199.79,0,0,0,55.4,177c5.45,5.49,13.93-3,8.48-8.48C186.68,829.56,171,742.65,205.27,671.45a191.94,191.94,0,0,1,36.79-52c5.45-5.48-3-14-8.48-8.48Z" transform="translate(-102 -476.45)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.0 KiB |
7
docs/public/hyperglass-icon-dark.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1072 1072">
|
||||
<g fill="#ff5e5b">
|
||||
<path d="M1464,1000a515,515,0,0,1-4.41,66.71l1.28-9.57a502,502,0,0,1-34.62,127.3l3.63-8.6a504.73,504.73,0,0,1-65,111.35l5.63-7.28a508.39,508.39,0,0,1-90.59,90.59l7.28-5.63a504.73,504.73,0,0,1-111.35,65l8.6-3.63a502,502,0,0,1-127.3,34.62l9.57-1.28a510.21,510.21,0,0,1-133.42,0l9.57,1.28a502,502,0,0,1-127.3-34.62l8.6,3.63a504.73,504.73,0,0,1-111.35-65l7.28,5.63a508.39,508.39,0,0,1-90.59-90.59l5.63,7.28a504.73,504.73,0,0,1-65-111.35l3.63,8.6a502,502,0,0,1-34.62-127.3l1.28,9.57a510.21,510.21,0,0,1,0-133.42l-1.28,9.57a502,502,0,0,1,34.62-127.3l-3.63,8.6a504.73,504.73,0,0,1,65-111.35l-5.63,7.28a508.39,508.39,0,0,1,90.59-90.59l-7.28,5.63a504.73,504.73,0,0,1,111.35-65l-8.6,3.63a502,502,0,0,1,127.3-34.62l-9.57,1.28a510.21,510.21,0,0,1,133.42,0l-9.57-1.28a502,502,0,0,1,127.3,34.62l-8.6-3.63a504.73,504.73,0,0,1,111.35,65l-7.28-5.63a508.39,508.39,0,0,1,90.59,90.59l-5.63-7.28a504.73,504.73,0,0,1,65,111.35l-3.63-8.6a502,502,0,0,1,34.62,127.3l-1.28-9.57A515,515,0,0,1,1464,1000c0,18.83,16.54,36.87,36,36s36-15.82,36-36c-.08-55.42-8.52-111.43-25.65-164.17-16.55-51-40.5-99.86-71.58-143.54a557.67,557.67,0,0,0-116.28-120.13c-42.63-32.66-90.23-57.89-140.61-76.39-51.82-19-107.06-29.25-162.18-31.39a533.2,533.2,0,0,0-312.23,86.46c-44.52,29.28-85.17,64.88-119.06,106A563.88,563.88,0,0,0,540,724.75c-14.59,24.29-26.7,49.77-37.45,76-20.92,51-32.75,105.19-37,160.07a534.52,534.52,0,0,0,177.42,438.88C682.81,1435,727.64,1465,776.25,1487a556.45,556.45,0,0,0,79.53,29.37c28.09,7.84,56.76,12.87,85.71,16.24,55.9,6.52,112.74,3.31,167.85-7.85a534.41,534.41,0,0,0,277.91-154.19c36.66-38.42,68.14-82.48,91.8-130,24.24-48.73,41.65-100.88,49.89-154.72A572.24,572.24,0,0,0,1536,1000c0-18.83-16.58-36.87-36-36S1464,979.82,1464,1000Z" transform="translate(-463.99 -463.99)" />
|
||||
<path d="M807.35,1347.71a396.14,396.14,0,0,0,193.6,51c12.55,0,24.58-11.06,24-24s-10.55-24-24-24c-15.93,0-32.51-.36-48.23-3.13,6.6,1.17.54,0-.61-.12q-3-.46-6.09-1-5.61-.94-11.21-2.06-11.52-2.3-22.89-5.34a365.56,365.56,0,0,1-43.22-14.52c-1.06-.42-2.11-.86-3.16-1.3l2.58,1.09a64.07,64.07,0,0,1-6.25-2.75q-4.65-2.1-9.25-4.33c-7.14-3.46-14.15-7.17-21-11.07-10.93-6.17-26.72-3-32.83,8.61-6,11.37-3.07,26.25,8.61,32.84Z" transform="translate(-463.99 -463.99)" />
|
||||
<path d="M723.68,729.37c-55.5,55.73-94.41,128.21-108.25,205.78A398.38,398.38,0,0,0,647.77,1177a391.15,391.15,0,0,0,75.91,106.88c8.87,8.91,25.18,9.54,33.94,0s9.47-24.43,0-33.94q-9.81-9.85-18.91-20.38-4-4.68-7.9-9.51c-.65-.8-1.29-1.61-1.93-2.41s-2.5-4.54-1-1.24c1.37,3,.22.27-.47-.64s-1.55-2.07-2.31-3.11a367.19,367.19,0,0,1-29.26-46.63Q689.5,1154,684,1141.42c-.41-1-.8-1.93-1.23-2.88,2.49,5.5,1.11,2.65.6,1.39-.78-1.94-1.57-3.88-2.33-5.83q-2.73-7-5.16-14a367.36,367.36,0,0,1-14-53.89c-.81-4.51-1.52-9-2.18-13.55-.63-4.26.16,1,.2,1.56-.08-1.07-.27-2.16-.4-3.22q-.5-4.05-.88-8.1-1.4-14.33-1.69-28.74t.55-29q.39-7,1.06-13.89.35-3.66.77-7.3c.12-1.08.26-2.15.38-3.23.59-4.9-.79,5.22,0-.05A386.85,386.85,0,0,1,671.76,906q4-13.21,9-26.09c.76-2,1.53-3.9,2.32-5.84l.3-.73c1-2.4.79-1.93-.6,1.39a14,14,0,0,1,1.23-2.88q2.82-6.45,5.87-12.79a367.61,367.61,0,0,1,30.71-52.19q2.24-3.17,4.53-6.28c1-1.43,6.28-8,1.84-2.55,3.24-4,6.41-8.07,9.74-12q10-11.79,20.91-22.73c8.87-8.91,9.56-25.16,0-33.94s-24.48-9.51-33.94,0Z" transform="translate(-463.99 -463.99)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
7
docs/public/hyperglass-icon-light.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1072 1072">
|
||||
<g fill="#40798C">
|
||||
<path d="M1464,1000a515,515,0,0,1-4.41,66.71l1.28-9.57a502,502,0,0,1-34.62,127.3l3.63-8.6a504.73,504.73,0,0,1-65,111.35l5.63-7.28a508.39,508.39,0,0,1-90.59,90.59l7.28-5.63a504.73,504.73,0,0,1-111.35,65l8.6-3.63a502,502,0,0,1-127.3,34.62l9.57-1.28a510.21,510.21,0,0,1-133.42,0l9.57,1.28a502,502,0,0,1-127.3-34.62l8.6,3.63a504.73,504.73,0,0,1-111.35-65l7.28,5.63a508.39,508.39,0,0,1-90.59-90.59l5.63,7.28a504.73,504.73,0,0,1-65-111.35l3.63,8.6a502,502,0,0,1-34.62-127.3l1.28,9.57a510.21,510.21,0,0,1,0-133.42l-1.28,9.57a502,502,0,0,1,34.62-127.3l-3.63,8.6a504.73,504.73,0,0,1,65-111.35l-5.63,7.28a508.39,508.39,0,0,1,90.59-90.59l-7.28,5.63a504.73,504.73,0,0,1,111.35-65l-8.6,3.63a502,502,0,0,1,127.3-34.62l-9.57,1.28a510.21,510.21,0,0,1,133.42,0l-9.57-1.28a502,502,0,0,1,127.3,34.62l-8.6-3.63a504.73,504.73,0,0,1,111.35,65l-7.28-5.63a508.39,508.39,0,0,1,90.59,90.59l-5.63-7.28a504.73,504.73,0,0,1,65,111.35l-3.63-8.6a502,502,0,0,1,34.62,127.3l-1.28-9.57A515,515,0,0,1,1464,1000c0,18.83,16.54,36.87,36,36s36-15.82,36-36c-.08-55.42-8.52-111.43-25.65-164.17-16.55-51-40.5-99.86-71.58-143.54a557.67,557.67,0,0,0-116.28-120.13c-42.63-32.66-90.23-57.89-140.61-76.39-51.82-19-107.06-29.25-162.18-31.39a533.2,533.2,0,0,0-312.23,86.46c-44.52,29.28-85.17,64.88-119.06,106A563.88,563.88,0,0,0,540,724.75c-14.59,24.29-26.7,49.77-37.45,76-20.92,51-32.75,105.19-37,160.07a534.52,534.52,0,0,0,177.42,438.88C682.81,1435,727.64,1465,776.25,1487a556.45,556.45,0,0,0,79.53,29.37c28.09,7.84,56.76,12.87,85.71,16.24,55.9,6.52,112.74,3.31,167.85-7.85a534.41,534.41,0,0,0,277.91-154.19c36.66-38.42,68.14-82.48,91.8-130,24.24-48.73,41.65-100.88,49.89-154.72A572.24,572.24,0,0,0,1536,1000c0-18.83-16.58-36.87-36-36S1464,979.82,1464,1000Z" transform="translate(-463.99 -463.99)" />
|
||||
<path d="M807.35,1347.71a396.14,396.14,0,0,0,193.6,51c12.55,0,24.58-11.06,24-24s-10.55-24-24-24c-15.93,0-32.51-.36-48.23-3.13,6.6,1.17.54,0-.61-.12q-3-.46-6.09-1-5.61-.94-11.21-2.06-11.52-2.3-22.89-5.34a365.56,365.56,0,0,1-43.22-14.52c-1.06-.42-2.11-.86-3.16-1.3l2.58,1.09a64.07,64.07,0,0,1-6.25-2.75q-4.65-2.1-9.25-4.33c-7.14-3.46-14.15-7.17-21-11.07-10.93-6.17-26.72-3-32.83,8.61-6,11.37-3.07,26.25,8.61,32.84Z" transform="translate(-463.99 -463.99)" />
|
||||
<path d="M723.68,729.37c-55.5,55.73-94.41,128.21-108.25,205.78A398.38,398.38,0,0,0,647.77,1177a391.15,391.15,0,0,0,75.91,106.88c8.87,8.91,25.18,9.54,33.94,0s9.47-24.43,0-33.94q-9.81-9.85-18.91-20.38-4-4.68-7.9-9.51c-.65-.8-1.29-1.61-1.93-2.41s-2.5-4.54-1-1.24c1.37,3,.22.27-.47-.64s-1.55-2.07-2.31-3.11a367.19,367.19,0,0,1-29.26-46.63Q689.5,1154,684,1141.42c-.41-1-.8-1.93-1.23-2.88,2.49,5.5,1.11,2.65.6,1.39-.78-1.94-1.57-3.88-2.33-5.83q-2.73-7-5.16-14a367.36,367.36,0,0,1-14-53.89c-.81-4.51-1.52-9-2.18-13.55-.63-4.26.16,1,.2,1.56-.08-1.07-.27-2.16-.4-3.22q-.5-4.05-.88-8.1-1.4-14.33-1.69-28.74t.55-29q.39-7,1.06-13.89.35-3.66.77-7.3c.12-1.08.26-2.15.38-3.23.59-4.9-.79,5.22,0-.05A386.85,386.85,0,0,1,671.76,906q4-13.21,9-26.09c.76-2,1.53-3.9,2.32-5.84l.3-.73c1-2.4.79-1.93-.6,1.39a14,14,0,0,1,1.23-2.88q2.82-6.45,5.87-12.79a367.61,367.61,0,0,1,30.71-52.19q2.24-3.17,4.53-6.28c1-1.43,6.28-8,1.84-2.55,3.24-4,6.41-8.07,9.74-12q10-11.79,20.91-22.73c8.87-8.91,9.56-25.16,0-33.94s-24.48-9.51-33.94,0Z" transform="translate(-463.99 -463.99)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
21
docs/public/hyperglass-light.svg
Normal file
@@ -0,0 +1,21 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2759.9 544.87">
|
||||
<g fill="#40798C">
|
||||
<g>
|
||||
<path d="M931.39,683.15q20.28,21.23,20.28,62.74l0,134.13c0,3.35-.85,5.94-2.51,7.76a10.52,10.52,0,0,1-14.15,0c-1.67-1.82-2.51-4.4-2.5-7.75l0-131.86q0-35.58-14.12-51.79t-45.62-16.21q-35.13,0-56.35,21.65t-21.24,57.71l0,120.44q0,5-2.51,7.76a9.12,9.12,0,0,1-7.07,2.74,9,9,0,0,1-6.84-3A10.66,10.66,0,0,1,776,880l.12-305.23q0-5,2.51-7.76a10.52,10.52,0,0,1,14.15,0c1.66,1.83,2.5,4.41,2.5,7.76l0,131.39a71.74,71.74,0,0,1,30.13-32.83q20.07-11.4,46.08-11.39Q911.09,661.93,931.39,683.15Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1201.26,663a9.19,9.19,0,0,1,6.39,2.51,8.56,8.56,0,0,1,2.73,6.62,14.35,14.35,0,0,1-.91,4.1l-131,290.12q-2.75,5.48-8.22,5.47a8.83,8.83,0,0,1-6.16-2.28,7.66,7.66,0,0,1-2.5-5.93l.91-3.65,32.88-72.08L999.6,676.1a14.33,14.33,0,0,1-.91-4.11,8.65,8.65,0,0,1,3.19-6.84,10.93,10.93,0,0,1,7.3-2.73q5,0,7.76,5.48l88,198.49.91-2.28,86.76-194.78C1194.42,665.08,1197.31,662.94,1201.26,663Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1406.57,676.48q22.34,14.38,34.66,40.39t12.29,60.69q0,34.22-12.34,60t-34.69,39.91q-22.37,14.13-51.56,14.12-27.84,0-47.67-12.33t-29.88-35.6l0,118.62c0,3.35-.84,5.93-2.51,7.76a9.15,9.15,0,0,1-7.07,2.73q-9.59,0-9.58-10.5l.11-289.25a10.34,10.34,0,0,1,2.51-7.3,10.49,10.49,0,0,1,14.14,0,10.42,10.42,0,0,1,2.51,7.3v36q10-22.81,29.89-34.9T1355,662.09Q1384.21,662.11,1406.57,676.48ZM1412,848q20.54-24.85,20.55-70.48T1412,706.37q-20.52-25.56-57-25.57-37.41,0-57.5,24.84t-20.1,70.94q0,46.09,20,71.18t57,25.12Q1391.44,872.9,1412,848Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1688.91,847.68a8.28,8.28,0,0,1,2.28,5.71,14.17,14.17,0,0,1-3.43,8.89q-3.42,4.35-12.09,9.81-32.85,19.6-68,19.59-49.73,0-78.23-30.6t-28.49-84q0-34.22,12.8-60.22t36.06-40.36q23.28-14.37,53.39-14.35,42,0,66.14,27.4t24.15,74.83q0,8.21-3.19,11.86t-11.41,3.65l-157-.06q.43,44.71,22.56,68.9t62.27,24.2q21.9,0,36.27-5.91a146.07,146.07,0,0,0,28.07-15.51q9.57-6.37,12.32-6.38A7.16,7.16,0,0,1,1688.91,847.68Zm-141.61-146q-21.22,21.68-24.89,60.44l152.85.06q-.91-39.69-19.6-60.91T1603.2,680Q1568.52,680,1547.3,701.63Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1855.05,663.19c3.65,0,6.16.69,7.52,2.06s2.06,3.42,2.06,6.16q0,7.77-9.59,9.12l-13.69,1.37q-33.3,3.18-50.19,24.61a77.43,77.43,0,0,0-16.9,49.27l0,124.56q0,5-2.51,7.75a10.5,10.5,0,0,1-14.15,0c-1.67-1.83-2.5-4.41-2.5-7.76l.08-206.68q0-10.49,9.58-10.49a9.25,9.25,0,0,1,6.84,2.74c1.83,1.83,2.74,4.41,2.74,7.76v32.85q19.62-39.22,71.19-42.86l6.38-.46Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2078.6,666a9.84,9.84,0,0,1,2.74,7.3l-.08,204.85q0,47.45-22.38,71.62T1992.26,974q-24.65,0-43.34-4.58a127.8,127.8,0,0,1-36-15.07q-8.67-5.47-12.32-9.81a13.79,13.79,0,0,1-3.64-8.9,7.82,7.82,0,0,1,8.21-8.21q2.28,0,11.86,5.48a204.67,204.67,0,0,0,32.85,16q16.86,6.39,43.34,6.4,33.75,0,51.56-18.91t17.81-55.43l0-47.9q-9.59,23.71-29.9,36.26t-49.05,12.53q-29.2,0-51.78-13.71t-35.11-38.8q-12.54-25.08-12.53-57.49t12.57-57.25q12.56-24.85,35.15-38.54t51.79-13.67q28.27,0,48.35,12.34t30.1,35.14l0-36q0-10.5,9.58-10.49A9.25,9.25,0,0,1,2078.6,666Zm-37.25,172.67q20.78-24.39,20.79-66.83t-20.73-66.62q-20.76-24.18-57.71-24.2-36.51,0-57.72,24.16t-21.25,66.6q0,42.88,21.19,67.08t57.71,24.2Q2020.59,863.1,2041.35,838.69Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2161.32,888.24c-1.67-1.83-2.51-4.41-2.5-7.76l.11-305.22q0-5,2.51-7.76a9.09,9.09,0,0,1,7.08-2.73,9,9,0,0,1,6.84,3,10.73,10.73,0,0,1,2.73,7.53L2178,880.49a10.75,10.75,0,0,1-2.74,7.53,9,9,0,0,1-6.85,3A9.09,9.09,0,0,1,2161.32,888.24Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2416.64,744.16l0,136q0,5-2.51,7.76a9.12,9.12,0,0,1-7.08,2.73,9.45,9.45,0,0,1-7.29-3,10.66,10.66,0,0,1-2.74-7.53V848.18q-10,21-29,32.38T2324.88,892a84.41,84.41,0,0,1-38.32-8.68,71.93,71.93,0,0,1-27.6-23.51,59.47,59.47,0,0,1-10.71-33.08q-.43-25.08,12.34-38.78t42.89-19.6q30.12-5.91,84.41-5.9H2397V743.24q0-32.38-13-47.22t-40.83-14.85q-21.9,0-39,5.69t-27.15,13q-1.83,1.38-7.53,5.25c-3.81,2.59-6.93,3.87-9.36,3.87a7.82,7.82,0,0,1-5.7-2.51,8.37,8.37,0,0,1-2.51-6.16q0-8.65,16-18.24a134.23,134.23,0,0,1,34.91-14.59,146.13,146.13,0,0,1,37.64-5Q2416.67,662.5,2416.64,744.16ZM2361.85,863a69.15,69.15,0,0,0,25.78-27.13q9.36-17.34,9.37-39.24V780.2h-8.67q-47.91,0-73,3.85t-35.14,13.21q-10,9.36-10,27.6,0,21,15.49,34.46t39.24,13.47Q2345.41,872.79,2361.85,863Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2526.54,886.78a122.09,122.09,0,0,1-31.93-14.38q-9.14-5.92-12.32-9.82a13.55,13.55,0,0,1-3.19-8.89,8.24,8.24,0,0,1,2.29-5.71,7.17,7.17,0,0,1,5.47-2.5q2.28,0,6.16,2.51c2.58,1.67,4.33,2.82,5.25,3.42a142.87,142.87,0,0,0,27.59,15.75q14.37,6.17,36.27,6.18,29.65,0,45.63-10.94t16-31q0-11.85-5.7-19.62t-18.7-13.46q-13-5.7-37.17-11.19Q2522,778,2504.69,763.82t-17.33-37.42q0-28.29,22.15-46.08t57.26-17.77a114.74,114.74,0,0,1,32.4,4.58,95.21,95.21,0,0,1,27.37,12.78q8.65,6.4,12.54,11.19a15.49,15.49,0,0,1,3.87,9.81,8.24,8.24,0,0,1-2.28,5.7,7.18,7.18,0,0,1-5.48,2.51c-2.44,0-6.38-2.29-11.86-6.85a127.56,127.56,0,0,0-24.86-15.07q-13-5.93-32.62-5.94-25.54,0-41.29,12.07T2508.81,725q0,11.87,5,19.39t17.1,13q12.09,5.47,34.45,10.5,31.47,7.78,48.35,15.76t24,19.18q7.07,11.18,7.06,28.51,0,27.38-22.6,44t-60,16.63A125.17,125.17,0,0,1,2526.54,886.78Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2743.71,886.86a121.76,121.76,0,0,1-31.93-14.38q-9.14-5.93-12.32-9.81a13.6,13.6,0,0,1-3.19-8.9,8.25,8.25,0,0,1,2.29-5.7,7.14,7.14,0,0,1,5.47-2.51q2.28,0,6.16,2.51l5.25,3.42a143.22,143.22,0,0,0,27.6,15.76q14.36,6.16,36.26,6.17,29.65,0,45.63-10.93t16-31q0-11.87-5.69-19.62t-18.7-13.47q-13-5.7-37.18-11.19-40.15-9.13-57.48-23.29t-17.32-37.42q0-28.29,22.14-46.07T2784,662.64a114.31,114.31,0,0,1,32.39,4.57A94.83,94.83,0,0,1,2843.71,680q8.65,6.39,12.54,11.18a15.51,15.51,0,0,1,3.87,9.81,8.24,8.24,0,0,1-2.28,5.7,7.12,7.12,0,0,1-5.47,2.51q-3.66,0-11.86-6.85a128.65,128.65,0,0,0-24.86-15.07q-13-5.92-32.62-5.94-25.56,0-41.3,12.08T2726,725.12q0,11.86,5,19.39t17.1,13q12.09,5.47,34.45,10.51,31.47,7.77,48.35,15.76t24,19.17q7.07,11.19,7.06,28.51,0,27.38-22.6,44t-60,16.62A125.19,125.19,0,0,1,2743.71,886.86Z" transform="translate(-102 -476.45)" />
|
||||
</g>
|
||||
<g>
|
||||
<path d="M629,748.94A254.5,254.5,0,0,1,177.8,910.5a253.51,253.51,0,0,1-57-141.26A254.75,254.75,0,0,1,269.49,517c48.18-22.05,103.68-28.13,155.56-17.55a253.76,253.76,0,0,1,204,249.5c0,11.58,18,11.6,18,0-.15-56.09-17.45-111.67-50.07-157.4A275.77,275.77,0,0,0,468,492.94c-53.4-19.67-113.16-21.73-167.89-6.22A272.65,272.65,0,0,0,141.23,889.87c28.26,46.62,70.66,84.65,120.38,107.11a275.73,275.73,0,0,0,167.55,18.95,272.71,272.71,0,0,0,142.15-78.52c38.14-39.87,64-91.3,72.33-145.91A287.4,287.4,0,0,0,647,748.94C647,737.36,629,737.34,629,748.94Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M276.33,926.44a203,203,0,0,0,98.67,26c7.72,0,7.73-12,0-12a190.29,190.29,0,0,1-92.62-24.36c-6.74-3.79-12.79,6.58-6.05,10.36Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M233.58,611c-28.56,28.78-48.31,65.84-55.4,105.83a199.79,199.79,0,0,0,55.4,177c5.45,5.49,13.93-3,8.48-8.48C186.68,829.56,171,742.65,205.27,671.45a191.94,191.94,0,0,1,36.79-52c5.45-5.48-3-14-8.48-8.48Z" transform="translate(-102 -476.45)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.0 KiB |
21
docs/public/hyperglass.svg
Normal file
@@ -0,0 +1,21 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2759.9 544.87">
|
||||
<g fill="currentColor">
|
||||
<g>
|
||||
<path d="M931.39,683.15q20.28,21.23,20.28,62.74l0,134.13c0,3.35-.85,5.94-2.51,7.76a10.52,10.52,0,0,1-14.15,0c-1.67-1.82-2.51-4.4-2.5-7.75l0-131.86q0-35.58-14.12-51.79t-45.62-16.21q-35.13,0-56.35,21.65t-21.24,57.71l0,120.44q0,5-2.51,7.76a9.12,9.12,0,0,1-7.07,2.74,9,9,0,0,1-6.84-3A10.66,10.66,0,0,1,776,880l.12-305.23q0-5,2.51-7.76a10.52,10.52,0,0,1,14.15,0c1.66,1.83,2.5,4.41,2.5,7.76l0,131.39a71.74,71.74,0,0,1,30.13-32.83q20.07-11.4,46.08-11.39Q911.09,661.93,931.39,683.15Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1201.26,663a9.19,9.19,0,0,1,6.39,2.51,8.56,8.56,0,0,1,2.73,6.62,14.35,14.35,0,0,1-.91,4.1l-131,290.12q-2.75,5.48-8.22,5.47a8.83,8.83,0,0,1-6.16-2.28,7.66,7.66,0,0,1-2.5-5.93l.91-3.65,32.88-72.08L999.6,676.1a14.33,14.33,0,0,1-.91-4.11,8.65,8.65,0,0,1,3.19-6.84,10.93,10.93,0,0,1,7.3-2.73q5,0,7.76,5.48l88,198.49.91-2.28,86.76-194.78C1194.42,665.08,1197.31,662.94,1201.26,663Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1406.57,676.48q22.34,14.38,34.66,40.39t12.29,60.69q0,34.22-12.34,60t-34.69,39.91q-22.37,14.13-51.56,14.12-27.84,0-47.67-12.33t-29.88-35.6l0,118.62c0,3.35-.84,5.93-2.51,7.76a9.15,9.15,0,0,1-7.07,2.73q-9.59,0-9.58-10.5l.11-289.25a10.34,10.34,0,0,1,2.51-7.3,10.49,10.49,0,0,1,14.14,0,10.42,10.42,0,0,1,2.51,7.3v36q10-22.81,29.89-34.9T1355,662.09Q1384.21,662.11,1406.57,676.48ZM1412,848q20.54-24.85,20.55-70.48T1412,706.37q-20.52-25.56-57-25.57-37.41,0-57.5,24.84t-20.1,70.94q0,46.09,20,71.18t57,25.12Q1391.44,872.9,1412,848Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1688.91,847.68a8.28,8.28,0,0,1,2.28,5.71,14.17,14.17,0,0,1-3.43,8.89q-3.42,4.35-12.09,9.81-32.85,19.6-68,19.59-49.73,0-78.23-30.6t-28.49-84q0-34.22,12.8-60.22t36.06-40.36q23.28-14.37,53.39-14.35,42,0,66.14,27.4t24.15,74.83q0,8.21-3.19,11.86t-11.41,3.65l-157-.06q.43,44.71,22.56,68.9t62.27,24.2q21.9,0,36.27-5.91a146.07,146.07,0,0,0,28.07-15.51q9.57-6.37,12.32-6.38A7.16,7.16,0,0,1,1688.91,847.68Zm-141.61-146q-21.22,21.68-24.89,60.44l152.85.06q-.91-39.69-19.6-60.91T1603.2,680Q1568.52,680,1547.3,701.63Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M1855.05,663.19c3.65,0,6.16.69,7.52,2.06s2.06,3.42,2.06,6.16q0,7.77-9.59,9.12l-13.69,1.37q-33.3,3.18-50.19,24.61a77.43,77.43,0,0,0-16.9,49.27l0,124.56q0,5-2.51,7.75a10.5,10.5,0,0,1-14.15,0c-1.67-1.83-2.5-4.41-2.5-7.76l.08-206.68q0-10.49,9.58-10.49a9.25,9.25,0,0,1,6.84,2.74c1.83,1.83,2.74,4.41,2.74,7.76v32.85q19.62-39.22,71.19-42.86l6.38-.46Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2078.6,666a9.84,9.84,0,0,1,2.74,7.3l-.08,204.85q0,47.45-22.38,71.62T1992.26,974q-24.65,0-43.34-4.58a127.8,127.8,0,0,1-36-15.07q-8.67-5.47-12.32-9.81a13.79,13.79,0,0,1-3.64-8.9,7.82,7.82,0,0,1,8.21-8.21q2.28,0,11.86,5.48a204.67,204.67,0,0,0,32.85,16q16.86,6.39,43.34,6.4,33.75,0,51.56-18.91t17.81-55.43l0-47.9q-9.59,23.71-29.9,36.26t-49.05,12.53q-29.2,0-51.78-13.71t-35.11-38.8q-12.54-25.08-12.53-57.49t12.57-57.25q12.56-24.85,35.15-38.54t51.79-13.67q28.27,0,48.35,12.34t30.1,35.14l0-36q0-10.5,9.58-10.49A9.25,9.25,0,0,1,2078.6,666Zm-37.25,172.67q20.78-24.39,20.79-66.83t-20.73-66.62q-20.76-24.18-57.71-24.2-36.51,0-57.72,24.16t-21.25,66.6q0,42.88,21.19,67.08t57.71,24.2Q2020.59,863.1,2041.35,838.69Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2161.32,888.24c-1.67-1.83-2.51-4.41-2.5-7.76l.11-305.22q0-5,2.51-7.76a9.09,9.09,0,0,1,7.08-2.73,9,9,0,0,1,6.84,3,10.73,10.73,0,0,1,2.73,7.53L2178,880.49a10.75,10.75,0,0,1-2.74,7.53,9,9,0,0,1-6.85,3A9.09,9.09,0,0,1,2161.32,888.24Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2416.64,744.16l0,136q0,5-2.51,7.76a9.12,9.12,0,0,1-7.08,2.73,9.45,9.45,0,0,1-7.29-3,10.66,10.66,0,0,1-2.74-7.53V848.18q-10,21-29,32.38T2324.88,892a84.41,84.41,0,0,1-38.32-8.68,71.93,71.93,0,0,1-27.6-23.51,59.47,59.47,0,0,1-10.71-33.08q-.43-25.08,12.34-38.78t42.89-19.6q30.12-5.91,84.41-5.9H2397V743.24q0-32.38-13-47.22t-40.83-14.85q-21.9,0-39,5.69t-27.15,13q-1.83,1.38-7.53,5.25c-3.81,2.59-6.93,3.87-9.36,3.87a7.82,7.82,0,0,1-5.7-2.51,8.37,8.37,0,0,1-2.51-6.16q0-8.65,16-18.24a134.23,134.23,0,0,1,34.91-14.59,146.13,146.13,0,0,1,37.64-5Q2416.67,662.5,2416.64,744.16ZM2361.85,863a69.15,69.15,0,0,0,25.78-27.13q9.36-17.34,9.37-39.24V780.2h-8.67q-47.91,0-73,3.85t-35.14,13.21q-10,9.36-10,27.6,0,21,15.49,34.46t39.24,13.47Q2345.41,872.79,2361.85,863Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2526.54,886.78a122.09,122.09,0,0,1-31.93-14.38q-9.14-5.92-12.32-9.82a13.55,13.55,0,0,1-3.19-8.89,8.24,8.24,0,0,1,2.29-5.71,7.17,7.17,0,0,1,5.47-2.5q2.28,0,6.16,2.51c2.58,1.67,4.33,2.82,5.25,3.42a142.87,142.87,0,0,0,27.59,15.75q14.37,6.17,36.27,6.18,29.65,0,45.63-10.94t16-31q0-11.85-5.7-19.62t-18.7-13.46q-13-5.7-37.17-11.19Q2522,778,2504.69,763.82t-17.33-37.42q0-28.29,22.15-46.08t57.26-17.77a114.74,114.74,0,0,1,32.4,4.58,95.21,95.21,0,0,1,27.37,12.78q8.65,6.4,12.54,11.19a15.49,15.49,0,0,1,3.87,9.81,8.24,8.24,0,0,1-2.28,5.7,7.18,7.18,0,0,1-5.48,2.51c-2.44,0-6.38-2.29-11.86-6.85a127.56,127.56,0,0,0-24.86-15.07q-13-5.93-32.62-5.94-25.54,0-41.29,12.07T2508.81,725q0,11.87,5,19.39t17.1,13q12.09,5.47,34.45,10.5,31.47,7.78,48.35,15.76t24,19.18q7.07,11.18,7.06,28.51,0,27.38-22.6,44t-60,16.63A125.17,125.17,0,0,1,2526.54,886.78Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M2743.71,886.86a121.76,121.76,0,0,1-31.93-14.38q-9.14-5.93-12.32-9.81a13.6,13.6,0,0,1-3.19-8.9,8.25,8.25,0,0,1,2.29-5.7,7.14,7.14,0,0,1,5.47-2.51q2.28,0,6.16,2.51l5.25,3.42a143.22,143.22,0,0,0,27.6,15.76q14.36,6.16,36.26,6.17,29.65,0,45.63-10.93t16-31q0-11.87-5.69-19.62t-18.7-13.47q-13-5.7-37.18-11.19-40.15-9.13-57.48-23.29t-17.32-37.42q0-28.29,22.14-46.07T2784,662.64a114.31,114.31,0,0,1,32.39,4.57A94.83,94.83,0,0,1,2843.71,680q8.65,6.39,12.54,11.18a15.51,15.51,0,0,1,3.87,9.81,8.24,8.24,0,0,1-2.28,5.7,7.12,7.12,0,0,1-5.47,2.51q-3.66,0-11.86-6.85a128.65,128.65,0,0,0-24.86-15.07q-13-5.92-32.62-5.94-25.56,0-41.3,12.08T2726,725.12q0,11.86,5,19.39t17.1,13q12.09,5.47,34.45,10.51,31.47,7.77,48.35,15.76t24,19.17q7.07,11.19,7.06,28.51,0,27.38-22.6,44t-60,16.62A125.19,125.19,0,0,1,2743.71,886.86Z" transform="translate(-102 -476.45)" />
|
||||
</g>
|
||||
<g>
|
||||
<path d="M629,748.94A254.5,254.5,0,0,1,177.8,910.5a253.51,253.51,0,0,1-57-141.26A254.75,254.75,0,0,1,269.49,517c48.18-22.05,103.68-28.13,155.56-17.55a253.76,253.76,0,0,1,204,249.5c0,11.58,18,11.6,18,0-.15-56.09-17.45-111.67-50.07-157.4A275.77,275.77,0,0,0,468,492.94c-53.4-19.67-113.16-21.73-167.89-6.22A272.65,272.65,0,0,0,141.23,889.87c28.26,46.62,70.66,84.65,120.38,107.11a275.73,275.73,0,0,0,167.55,18.95,272.71,272.71,0,0,0,142.15-78.52c38.14-39.87,64-91.3,72.33-145.91A287.4,287.4,0,0,0,647,748.94C647,737.36,629,737.34,629,748.94Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M276.33,926.44a203,203,0,0,0,98.67,26c7.72,0,7.73-12,0-12a190.29,190.29,0,0,1-92.62-24.36c-6.74-3.79-12.79,6.58-6.05,10.36Z" transform="translate(-102 -476.45)" />
|
||||
<path d="M233.58,611c-28.56,28.78-48.31,65.84-55.4,105.83a199.79,199.79,0,0,0,55.4,177c5.45,5.49,13.93-3,8.48-8.48C186.68,829.56,171,742.65,205.27,671.45a191.94,191.94,0,0,1,36.79-52c5.45-5.48-3-14-8.48-8.48Z" transform="translate(-102 -476.45)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.0 KiB |
BIN
docs/public/img/android-chrome-144x144.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/public/img/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/public/img/android-chrome-256x256.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
docs/public/img/android-chrome-36x36.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
docs/public/img/android-chrome-384x384.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
docs/public/img/android-chrome-48x48.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
docs/public/img/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
docs/public/img/android-chrome-72x72.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
docs/public/img/android-chrome-96x96.png
Normal file
After Width: | Height: | Size: 7.7 KiB |
BIN
docs/public/img/apple-touch-icon-1024x1024.png
Normal file
After Width: | Height: | Size: 103 KiB |
BIN
docs/public/img/apple-touch-icon-114x114.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
docs/public/img/apple-touch-icon-120x120.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
docs/public/img/apple-touch-icon-144x144.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/public/img/apple-touch-icon-152x152.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/public/img/apple-touch-icon-167x167.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
docs/public/img/apple-touch-icon-180x180.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
docs/public/img/apple-touch-icon-57x57.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
docs/public/img/apple-touch-icon-60x60.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
docs/public/img/apple-touch-icon-72x72.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
docs/public/img/apple-touch-icon-76x76.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
docs/public/img/apple-touch-icon-precomposed.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
docs/public/img/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
docs/public/img/apple-touch-startup-image-1125x2436.png
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
docs/public/img/apple-touch-startup-image-1136x640.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
docs/public/img/apple-touch-startup-image-1242x2208.png
Normal file
After Width: | Height: | Size: 136 KiB |
BIN
docs/public/img/apple-touch-startup-image-1242x2688.png
Normal file
After Width: | Height: | Size: 139 KiB |
BIN
docs/public/img/apple-touch-startup-image-1334x750.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
docs/public/img/apple-touch-startup-image-1536x2048.png
Normal file
After Width: | Height: | Size: 170 KiB |
BIN
docs/public/img/apple-touch-startup-image-1620x2160.png
Normal file
After Width: | Height: | Size: 179 KiB |
BIN
docs/public/img/apple-touch-startup-image-1668x2224.png
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
docs/public/img/apple-touch-startup-image-1668x2388.png
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
docs/public/img/apple-touch-startup-image-1792x828.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
docs/public/img/apple-touch-startup-image-2048x1536.png
Normal file
After Width: | Height: | Size: 170 KiB |
BIN
docs/public/img/apple-touch-startup-image-2048x2732.png
Normal file
After Width: | Height: | Size: 234 KiB |
BIN
docs/public/img/apple-touch-startup-image-2160x1620.png
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
docs/public/img/apple-touch-startup-image-2208x1242.png
Normal file
After Width: | Height: | Size: 138 KiB |
BIN
docs/public/img/apple-touch-startup-image-2224x1668.png
Normal file
After Width: | Height: | Size: 187 KiB |
BIN
docs/public/img/apple-touch-startup-image-2388x1668.png
Normal file
After Width: | Height: | Size: 188 KiB |
BIN
docs/public/img/apple-touch-startup-image-2436x1125.png
Normal file
After Width: | Height: | Size: 127 KiB |
BIN
docs/public/img/apple-touch-startup-image-2688x1242.png
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
docs/public/img/apple-touch-startup-image-2732x2048.png
Normal file
After Width: | Height: | Size: 236 KiB |