mirror of
https://github.com/valitydev/wazuh-kibana-app.git
synced 2024-11-06 01:45:18 +00:00
Backports for Wazuh 3.12.0 [6.8.7] (#2132)
* Remove console.log * Navigate from agents dashboard * Change state by props * Fix settings-wizard * Fix when joinning hosts and registry * Check for new API entries * Close add api component * Remove await * Improve checks for new apis * Test if API is down in wazuh-api * Check down APIs * Api is down component finish * Transform hosts in the backend * Fix key * Adapt removeOrphanentries * Adapt settings-wizard * Improve api-is-down component * Change the way to display the helpers components * Check APIs status when get them * Remove console.log * Check manager sets the status to the API entry * Prevent create wazuh-registry.json without hosts * FIx extensions * Add panel * Change style for wazuh hosts * Show add api component from the table * Refresh API entries * Update wazuh-hosts * Api is down table loading effect * Show API is down when accessing to settings if any API is up * Update cluster info in the settings wizard * Update Kibana version * Refactor design of guides * Change color * Remove wazuh-hosts.yml * Remove hosts from configuration * Change foreach by for * Solves asynchronous problem * Adapt ruleset handler * Upload files * Add more modules to the guide * Show what files were upload and hwat not * Detail the error * Expand fail list * Add button to refresh lists * Fix \n in the migration * Fix api-count * Back from dahsboards * Fix typo * Fix when getting an empty file * Prevent empty lines in cdb lists * Hide index pattern is there are only one * Add missing `await` * Fix eui loader * Change the properties of register-agent component Set the background to transparent Change the title: Add => Deploy * Add register-agent component to add user to group * Show button in general when no agents registered * Show button in FIM when no agents registered * Hide Logtest and Test config * Update output of success/fail uploaded files * More modules * Some fixes * Fix API wizard * Add the RegisterAgent component to overview * Make module selector scrollable and fit current screen * Add Rootcheck. Fix extra attributes * Add reconnect_time to log collection section * Fix example in getting started guide * Detect if is Agent * Scroll to bottom when configuration is generated * Fix groups interactive guide * Revert "Merge branch 'extend-add-new-agent-1767' of https://github.com/wazuh/wazuh-kibana-app" This reverts commit7e56d49a75
, reversing changes made to7706a2e853
. * Fix style * Avoid error when agent is not Active * Revert "Revert "Merge branch 'extend-add-new-agent-1767' of https://github.com/wazuh/wazuh-kibana-app"" This reverts commit6724d12571
. * Delete from groups.html the actrl instance * Fix typos * Refresh hosts in api-is-down component * Set default in props * Fix API count * Iterates the api entries to set one as default * Fix component unmount * Fix flick * Validate method and path in Requests * Adapt 7.4 to 3.10 * Bump version (547) * Fix the documentation broken links (#1853) * Update AWS map * Remove babel-polyfill * Remove babel-polyfill * Restore babel-polyfill for cover simple-tail dependency * Restore babel-polyfill for cover simple-tail dependency * Filters fix (#1854) * Filters fix * Fix the documentation broken links (#1853) * Update AWS map * Removed Discover component from top menu * Update readme * Bump version * Set the correct field in the geoMap viz * Bump version (549 for 3.10.2-7.4.2) * Revert "Set the correct field in the geoMap viz" This reverts commiteffc3b8b55
. * Update branch for 7.4.2 * Update README.md * Update package.json * Fix logo when reverse proxy is enabled (#1888) * Fix hidden overflow in the fim configuration (#1887) * Fix ambiguous message (#1875) * Amazon s3 status fix (#1889) * Fix amazon s3 status error * Fix check aws s3 status * Update wz-no-config.html * Add pinned filters after refresh (#1909) * Fix missing fields in the Visualizations (#1913) * Fixed infinite load on Ciscat view (#1916) * Fixed infinite load on Ciscat-agent view (#1920) * Normalize the field whodata in the group reporting (#1921) * Fix registration guide (#1926) * Fix decoders file (#1929) * Add new table for windows hotfixes (#1932) * Remove visualizations legend (#1936) * XML validator false error for \< (#1895) * Add validator true to \< * Add to gitignore wazuh-registry * Minor Fix * Revert changes for package.json and gitignore * Refactor syscheck table (#1941) (#1956) * Fix missing fields in the Visualizations (#1913) * Fixed infinite load on Ciscat view (#1916) * Fixed infinite load on Ciscat-agent view (#1920) * Normalize the field whodata in the group reporting (#1921) * Fix registration guide (#1926) * Fix decoders file (#1929) * Add new table for windows hotfixes (#1932) * Remove visualizations legend (#1936) * XML validator false error for \< (#1895) * Add validator true to \< * Add to gitignore wazuh-registry * Minor Fix * Revert changes for package.json and gitignore * Refactor syscheck table * Set fixed width to table columns * Expand row to get extra details * Add search bar & allow search * Show extra details on row expand * Remove table description * Fix table margin * Remove wazuh-registry * Add go to edit file in rules and decoders, when it has been created correctly (#1943) * Adapt for 7.5.0 * Bump version to 7.5.0 * Adapt server 7.5.0 * Fix typo * Add fix to adapt 7.5.0 * Adapt server for Kibana 7.5.0 * Remove the table images from the reports * Fix the tables in the reports * Fix the hidden content in management>configuration (#1840) * Fix discover input styling * Fix most active agent * Change the revision number * Fix the undefined value of filters in the reports * Restore package.json dependency * Adapt 7.5.0 in 3.11 (#1960) * Adapt Kibana for 7.5.0 * Several fixes * Fix filters * Bump wazuh version to 3.11.0 * Revert "Adapt 7.5.0 in 3.11 (#1960)" This reverts commit8f9c9aa95a
. * Adapt 7.5.0 for 3.11 (#1961) * Adapt Kibana for 7.5.0 * Several fixes * Fix filters * Bump wazuh version to 3.11.0 * Prepare branch for release * Last fixes in the branch 3.11-7.5 (#1966) * Fixed broken link to the documentation * Update README * Change plugin-helpers reference in package.json * Fix the empty search in syscheck-table * Fix the dead visualizations on CIS-CAT * Update CHANGELOG.md file * Adapt for Kibana 7.5.1 * Adapt for Kibana 7.5.1 * Upadte package list * Fix ciscat panel * Adapt to 7.5.1 * Prevent reload when click in the sameTab * Revert "Prevent reload when click in the sameTab" This reverts commit7e1deb1f07
. * Update version files (#1973) * Update revision code * Update readme * Update Changelog * Update version number of kibana * Added xpack compatibility (#1971) * Update files (#1975) * Update readme file * Update changelog file * Bump Wazuh version to 3.11.1 * Add validator true to -- within a commentary (#1980) * Increased list filesize limit and fixed typo (#1993) As mentioned in #1947 the limit for uploading a list for the CDB-list capability is too low and the resulting error message contains a typo. This commit addresses that by increasing the limit to 5MB and fixing the typo. * Fix maps vis load * Bump version 3.11.2 * Bump for 7.5.2 * Fix Wazuh version in upgrade guide (#2023) The upgrade guide is using a previous version of Wazuh 3.11.1-7.5.2 when the latest version is 3.11.2-7.5.2. * Add WindowsUpdate table to report (#2028) * Bump for Wazuh 3.11.3 * Cancel listener on destroy kibana discover * Fix custom spaces infinite loop * Fix reporting in syscollector * Adapt for 7.6.0 * Update routes kibana * Modified upgrade guide * Bump for 3.11.4 * Update kibana-discover.js * Update package.json * Update CHANGELOG.md * Delete wazuh-registry.json * update changelog master * Adapt for 7.6.1 * Fix reporting syscheck negative values in atrributes * Adapt discover * Fix visualizations report on chrome * Restructure optimize/wazuh folder (#2116) * Restructure optimize/wazuh folder * Update protocol of initial config example * Replace path with a constant * Remove wazuh.yml file * Update README upgrade guide * Fix plugin helper error Co-authored-by: Pablo Torres <pablotr9@correo.ugr.es> * hide manager alerts * Add rule group win_auth_failure to metrics (#2099) * Add PCI 11.2.1 y 11.2.3 rules. (#2062) * Discover in monitoring * Close 3.12-7.6 * Update changelog * Update package.json * Update package.json * merge discover * merge 7.6 * merge 7.6 * Update CHANGELOG.md * Update package.json * Fix merge * Close 6.8.7 * Allow disabling known fields health check (#2037) * Add https to initial wazuh configuration * Add https to Wazuh config example * update changelog * Fix reports path error * Add checks.fields to initial default config * Update initial-wazuh-config.js Co-authored-by: Adri Valle <adri9valle@gmail.com> Co-authored-by: Jose Sanchez <josesanxez@gmail.com> Co-authored-by: Pablo <pablotr9@correo.ugr.es> Co-authored-by: Alberto Andújar <josealbertoandujar@gmail.com> Co-authored-by: Daniel Ruiz Capilla <daniel.ruiz@wazuh.com> Co-authored-by: Juan Carlos Tello <juancarlos.tello@wazuh.com> Co-authored-by: Victor Santaella <victorst79@gmail.com>
This commit is contained in:
parent
20966bbfa6
commit
8e9dff0737
@ -3,11 +3,10 @@
|
||||
"package.json",
|
||||
"LICENSE",
|
||||
"tsconfig.json",
|
||||
"wazuh.yml",
|
||||
"index.js",
|
||||
"init.js",
|
||||
"server/**/*",
|
||||
"public/**/*",
|
||||
"util/**/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
54
CHANGELOG.md
54
CHANGELOG.md
@ -2,19 +2,55 @@
|
||||
|
||||
All notable changes to the Wazuh app project will be documented in this file.
|
||||
|
||||
## Wazuh v3.11.4 - Kibana v6.8.7, v7.4.2, v7.6.1 - Revision 485
|
||||
## Wazuh v3.12.0 - Kibana v6.8.7, v7.4.2, v7.6.1 - Revision 490
|
||||
|
||||
### Added
|
||||
|
||||
- Support for Kibana v6.8.7
|
||||
- Support for Wazuh v3.12.0
|
||||
- Added a new setting to hide manager alerts from dashboards. [#2102](https://github.com/wazuh/wazuh-kibana-app/pull/2102)
|
||||
- Added a new setting to enable/disable the known fields health check [#2037](https://github.com/wazuh/wazuh-kibana-app/pull/2037)
|
||||
- Added suport for PCI 11.2.1 and 11.2.3 rules. [#2062](https://github.com/wazuh/wazuh-kibana-app/pull/2062)
|
||||
|
||||
## Wazuh v3.11.4 - Kibana v6.8.6, v7.4.2, v7.6.0 - Revision 484
|
||||
### Changed
|
||||
|
||||
- Restructuring of the optimize/wazuh directory. Now the Wazuh configuration file (wazuh.yml) is placed on /usr/share/kibana/optimize/wazuh/config. [#2116](https://github.com/wazuh/wazuh-kibana-app/pull/2116)
|
||||
- Improve performance of Dasboards reports generation. [1802344](https://github.com/wazuh/wazuh-kibana-app/commit/18023447c6279d385df84d7f4a5663ed2167fdb5)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Discover time range selector is now displayed on the Cluster section. [08901df](https://github.com/wazuh/wazuh-kibana-app/commit/08901dfcbe509f17e4fab26877c8b7dae8a66bff)
|
||||
- Added the win_auth_failure rule group to Authentication failure metrics. [#2099](https://github.com/wazuh/wazuh-kibana-app/pull/2099)
|
||||
- Negative values in Syscheck attributes now have their correct value in reports. [7c3e84e](https://github.com/wazuh/wazuh-kibana-app/commit/7c3e84ec8f00760b4f650cfc00a885d868123f99)
|
||||
|
||||
|
||||
## Wazuh v3.11.4 - Kibana v7.6.1 - Revision 858
|
||||
|
||||
### Added
|
||||
|
||||
- Support for Kibana v7.6.1
|
||||
|
||||
|
||||
## Wazuh v3.11.4 - Kibana v6.8.6, v7.4.2, v7.6.0 - Revision 857
|
||||
|
||||
### Added
|
||||
|
||||
- Support for Wazuh v3.11.4
|
||||
|
||||
## Wazuh v3.11.3 - Kibana v6.8.6, v7.3.2, v7.5.1 - Revision 483
|
||||
|
||||
## Wazuh v3.11.3 - Kibana v7.6.0 - Revision 856
|
||||
|
||||
### Added
|
||||
|
||||
- Support for Kibana v7.6.0
|
||||
|
||||
|
||||
## Wazuh v3.11.3 - Kibana v7.4.2 - Revision 855
|
||||
|
||||
### Added
|
||||
|
||||
- Support for Kibana v7.4.2
|
||||
|
||||
## Wazuh v3.11.3 - Kibana v7.5.2 - Revision 854
|
||||
|
||||
### Added
|
||||
|
||||
@ -25,7 +61,14 @@ All notable changes to the Wazuh app project will be documented in this file.
|
||||
- Windows Updates table is now displayed in the Inventory Data report [#2028](https://github.com/wazuh/wazuh-kibana-app/pull/2028)
|
||||
|
||||
|
||||
## Wazuh v3.11.2 - Kibana v6.8.6, v7.3.2, v7.5.1 - Revision 481
|
||||
## Wazuh v3.11.2 - Kibana v7.5.2 - Revision 853
|
||||
|
||||
### Added
|
||||
|
||||
- Support for Kibana v7.5.2
|
||||
|
||||
|
||||
## Wazuh v3.11.2 - Kibana v6.8.6, v7.3.2, v7.5.1 - Revision 852
|
||||
|
||||
### Added
|
||||
|
||||
@ -38,6 +81,7 @@ All notable changes to the Wazuh app project will be documented in this file.
|
||||
### Fixed
|
||||
|
||||
- The xml validator now correctly handles the `--` string within comments [#1980](https://github.com/wazuh/wazuh-kibana-app/pull/1980)
|
||||
- The AWS map visualization wasn't been loaded until the user interacts with it [dd31bd7](https://github.com/wazuh/wazuh-kibana-app/commit/dd31bd7a155354bc50fe0af22fca878607c8936a)
|
||||
|
||||
|
||||
## Wazuh v3.11.1 - Kibana v6.8.6, v7.3.2, v7.5.1 - Revision 581
|
||||
|
267
README.md
267
README.md
@ -30,8 +30,8 @@ Visualize and analyze Wazuh alerts stored in Elasticsearch using our Kibana app
|
||||
|
||||
## Requisites
|
||||
|
||||
- Wazuh HIDS 3.11.4
|
||||
- Wazuh RESTful API 3.11.4
|
||||
- Wazuh HIDS 3.12.0
|
||||
- Wazuh RESTful API 3.12.0
|
||||
- Kibana 6.8.7
|
||||
- Elasticsearch 6.8.7
|
||||
|
||||
@ -39,16 +39,9 @@ Visualize and analyze Wazuh alerts stored in Elasticsearch using our Kibana app
|
||||
|
||||
Install the app
|
||||
|
||||
- With sudo:
|
||||
|
||||
```
|
||||
sudo -u kibana /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.7.zip
|
||||
```
|
||||
|
||||
- Without sudo:
|
||||
|
||||
```
|
||||
su -c '/usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.7.zip' kibana
|
||||
cd /usr/share/kibana
|
||||
sudo -u kibana bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.12.0_6.8.7.zip
|
||||
```
|
||||
|
||||
Restart Kibana
|
||||
@ -67,6 +60,8 @@ service kibana restart
|
||||
|
||||
## Upgrade
|
||||
|
||||
Note: In Wazuh 3.12.0 (regardless of the Elastic Stack version) the location of the wazuh.yml has been moved from `/usr/share/kibana/plugins/wazuh/wazuh.yml` to `/usr/share/kibana/optimize/wazuh/config/wazuh.yml`.
|
||||
|
||||
Stop Kibana
|
||||
|
||||
- Systemd:
|
||||
@ -81,10 +76,18 @@ systemctl stop kibana
|
||||
service kibana stop
|
||||
```
|
||||
|
||||
Copy the wazuh.yml to its new location. (Only needed for upgrades from 3.11.x to 3.12.y)
|
||||
|
||||
```
|
||||
mkdir -p /usr/share/kibana/optimize/wazuh/config
|
||||
cp /usr/share/kibana/plugins/wazuh/wazuh.yml /usr/share/kibana/optimize/wazuh/config/wazuh.yml
|
||||
```
|
||||
|
||||
Remove the app using kibana-plugin tool
|
||||
|
||||
```
|
||||
/usr/share/kibana/bin/kibana-plugin remove wazuh
|
||||
cd /usr/share/kibana/
|
||||
sudo -u kibana bin/kibana-plugin remove wazuh
|
||||
```
|
||||
|
||||
Remove generated bundles
|
||||
@ -102,16 +105,16 @@ chown -R kibana:kibana /usr/share/kibana/plugins
|
||||
|
||||
Install the app
|
||||
|
||||
- With sudo:
|
||||
|
||||
```
|
||||
sudo -u kibana /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.7.zip
|
||||
cd /usr/share/kibana/
|
||||
sudo -u kibana bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.12.0_6.8.7.zip
|
||||
```
|
||||
|
||||
- Without sudo:
|
||||
Update configuration file permissions.
|
||||
|
||||
```
|
||||
su -c '/usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.7.zip' kibana
|
||||
sudo chown kibana:kibana /usr/share/kibana/optimize/wazuh/config/wazuh.yml
|
||||
sudo chmod 600 /usr/share/kibana/optimize/wazuh/config/wazuh.yml
|
||||
```
|
||||
|
||||
Restart Kibana
|
||||
@ -126,118 +129,124 @@ systemctl restart kibana
|
||||
|
||||
```
|
||||
service kibana restart
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
## Older packages
|
||||
## Wazuh - Kibana compatibility matrix
|
||||
|
||||
| Kibana version | Wazuh app version | Package |
|
||||
| :------------: | :---------------: | :-------------------------------------------------------------- |
|
||||
| 6.0.0 | 3.0.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.0.0_6.0.0.zip> |
|
||||
| 6.0.1 | 3.0.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.0.0_6.0.1.zip> |
|
||||
| 6.1.0 | 3.0.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.0.0_6.1.0.zip> |
|
||||
| 6.1.0 | 3.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.0.zip> |
|
||||
| 6.1.1 | 3.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.1.zip> |
|
||||
| 6.1.2 | 3.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.2.zip> |
|
||||
| 6.1.3 | 3.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.3.zip> |
|
||||
| 6.1.0 | 3.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.0.zip> |
|
||||
| 6.1.1 | 3.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.1.zip> |
|
||||
| 6.1.2 | 3.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.2.zip> |
|
||||
| 6.1.3 | 3.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.3.zip> |
|
||||
| 6.2.0 | 3.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.2.0.zip> |
|
||||
| 6.2.1 | 3.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.2.1.zip> |
|
||||
| 6.2.2 | 3.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.2.2.zip> |
|
||||
| 6.2.2 | 3.2.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.1_6.2.2.zip> |
|
||||
| 6.2.3 | 3.2.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.1_6.2.3.zip> |
|
||||
| 6.2.4 | 3.2.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.1_6.2.4.zip> |
|
||||
| 6.2.4 | 3.2.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.2_6.2.4.zip> |
|
||||
| 6.2.4 | 3.2.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.3_6.2.4.zip> |
|
||||
| 6.2.4 | 3.2.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.4_6.2.4.zip> |
|
||||
| 6.2.4 | 3.3.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.0_6.2.4.zip> |
|
||||
| 6.2.4 | 3.3.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.1_6.2.4.zip> |
|
||||
| 6.3.0 | 3.3.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.0_6.3.0.zip> |
|
||||
| 6.3.0 | 3.3.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.1_6.3.0.zip> |
|
||||
| 6.3.1 | 3.3.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.1_6.3.1.zip> |
|
||||
| 6.3.1 | 3.4.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.4.0_6.3.1.zip> |
|
||||
| 6.3.2 | 3.4.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.4.0_6.3.2.zip> |
|
||||
| 6.3.2 | 3.5.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.5.0_6.3.2.zip> |
|
||||
| 6.4.0 | 3.5.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.5.0_6.4.0.zip> |
|
||||
| 6.3.2 | 3.6.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.0_6.3.2.zip> |
|
||||
| 6.4.0 | 3.6.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.0_6.4.0.zip> |
|
||||
| 6.3.2 | 3.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.3.2.zip> |
|
||||
| 6.4.0 | 3.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.0.zip> |
|
||||
| 6.4.1 | 3.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.1.zip> |
|
||||
| 6.4.2 | 3.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.2.zip> |
|
||||
| 6.4.3 | 3.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.3.zip> |
|
||||
| 6.4.2 | 3.7.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.4.2.zip> |
|
||||
| 6.4.3 | 3.7.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.4.3.zip> |
|
||||
| 6.5.0 | 3.7.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.5.0.zip> |
|
||||
| 6.5.1 | 3.7.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.5.1.zip> |
|
||||
| 6.5.1 | 3.7.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.1_6.5.1.zip> |
|
||||
| 6.5.2 | 3.7.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.1_6.5.2.zip> |
|
||||
| 6.5.3 | 3.7.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.1_6.5.3.zip> |
|
||||
| 6.5.3 | 3.7.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.2_6.5.3.zip> |
|
||||
| 6.5.4 | 3.7.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.2_6.5.4.zip> |
|
||||
| 6.5.4 | 3.8.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.0_6.5.4.zip> |
|
||||
| 6.5.4 | 3.8.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.1_6.5.4.zip> |
|
||||
| 6.5.4 | 3.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.5.4.zip> |
|
||||
| 6.6.0 | 3.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.0.zip> |
|
||||
| 6.6.1 | 3.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.1.zip> |
|
||||
| 6.6.2 | 3.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.2.zip> |
|
||||
| 6.7.0 | 3.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.7.0.zip> |
|
||||
| 6.7.1 | 3.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.7.1.zip> |
|
||||
| 6.7.1 | 3.9.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.0_6.7.1.zip> |
|
||||
| 6.7.2 | 3.9.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.0_6.7.2.zip> |
|
||||
| 6.8.0 | 3.9.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.1_6.8.0.zip> |
|
||||
| 7.1.0 | 3.9.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.1_7.1.0.zip> |
|
||||
| 7.1.1 | 3.9.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.1_7.1.1.zip> |
|
||||
| 7.1.1 | 3.9.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.2_7.1.1.zip> |
|
||||
| 6.8.1 | 3.9.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_6.8.1.zip> |
|
||||
| 7.0.1 | 3.9.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_7.0.1.zip> |
|
||||
| 7.1.1 | 3.9.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_7.1.1.zip> |
|
||||
| 7.2.0 | 3.9.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_7.2.0.zip> |
|
||||
| 6.8.1 | 3.9.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_6.8.1.zip> |
|
||||
| 6.8.2 | 3.9.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_6.8.2.zip> |
|
||||
| 7.2.0 | 3.9.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_7.2.0.zip> |
|
||||
| 7.2.1 | 3.9.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_7.2.1.zip> |
|
||||
| 7.3.0 | 3.9.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_7.3.0.zip> |
|
||||
| 6.8.2 | 3.9.5 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.5_6.8.2.zip> |
|
||||
| 7.2.1 | 3.9.5 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.5_7.2.1.zip> |
|
||||
| 7.3.0 | 3.9.5 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.5_7.3.0.zip> |
|
||||
| 6.8.2 | 3.10.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.0_6.8.2.zip> |
|
||||
| 7.3.1 | 3.10.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.0_7.3.1.zip> |
|
||||
| 7.3.2 | 3.10.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.0_7.3.2.zip> |
|
||||
| 6.8.2 | 3.10.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.1_6.8.2.zip> |
|
||||
| 7.3.1 | 3.10.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.1_7.3.1.zip> |
|
||||
| 7.3.2 | 3.10.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.1_7.3.2.zip> |
|
||||
| 6.8.3 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.3.zip> |
|
||||
| 6.8.4 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.4.zip> |
|
||||
| 6.8.5 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.5.zip> |
|
||||
| 6.8.6 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.6.zip> |
|
||||
| 7.3.2 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.3.2.zip> |
|
||||
| 7.4.0 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.4.0.zip> |
|
||||
| 7.4.1 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.4.1.zip> |
|
||||
| 7.4.2 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.4.2.zip> |
|
||||
| 7.5.0 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.5.0.zip> |
|
||||
| 7.5.1 | 3.10.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.5.1.zip> |
|
||||
| 6.8.6 | 3.11.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.0_6.8.6.zip> |
|
||||
| 7.3.2 | 3.11.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.0_7.3.2.zip> |
|
||||
| 7.5.1 | 3.11.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.0_7.5.1.zip> |
|
||||
| 6.8.6 | 3.11.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.1_6.8.6.zip> |
|
||||
| 7.3.2 | 3.11.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.1_7.3.2.zip> |
|
||||
| 7.5.1 | 3.11.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.1_7.5.1.zip> |
|
||||
| 6.8.6 | 3.11.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.2_6.8.6.zip> |
|
||||
| 7.3.2 | 3.11.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.2_7.3.2.zip> |
|
||||
| 7.5.1 | 3.11.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.2_7.5.1.zip> |
|
||||
| 6.8.6 | 3.11.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_6.8.6.zip> |
|
||||
| 7.3.2 | 3.11.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.3.2.zip> |
|
||||
| 7.4.2 | 3.11.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.4.2.zip> |
|
||||
| 7.5.2 | 3.11.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.5.2.zip> |
|
||||
| 7.6.0 | 3.11.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.6.0.zip> |
|
||||
| 6.8.6 | 3.11.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.6.zip> |
|
||||
| 6.8.7 | 3.11.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.7.zip> |
|
||||
| 7.4.2 | 3.11.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_7.4.2.zip> |
|
||||
| 7.6.0 | 3.11.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_7.6.0.zip> |
|
||||
| 7.6.1 | 3.11.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_7.6.1.zip> |
|
||||
| Wazuh app version | Kibana version | Package |
|
||||
| :---------------: | :------------: | :-------------------------------------------------------------- |
|
||||
| 3.12.0 | 7.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.12.0_7.6.1.zip> |
|
||||
| 3.12.0 | 7.4.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.12.0_7.4.2.zip> |
|
||||
| 3.12.0 | 6.8.7 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.12.0_6.8.7.zip> |
|
||||
| 3.11.4 | 7.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_7.6.1.zip> |
|
||||
| 3.11.4 | 7.6.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_7.6.0.zip> |
|
||||
| 3.11.4 | 7.4.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_7.4.2.zip> |
|
||||
| 3.11.4 | 6.8.7 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.7.zip> |
|
||||
| 3.11.4 | 6.8.6 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.4_6.8.6.zip> |
|
||||
| 3.11.3 | 7.6.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.6.0.zip> |
|
||||
| 3.11.3 | 7.5.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.5.2.zip> |
|
||||
| 3.11.3 | 7.4.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.4.2.zip> |
|
||||
| 3.11.3 | 7.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_7.3.2.zip> |
|
||||
| 3.11.3 | 6.8.6 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.3_6.8.6.zip> |
|
||||
| 3.11.2 | 7.5.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.2_7.5.2.zip> |
|
||||
| 3.11.2 | 7.5.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.2_7.5.1.zip> |
|
||||
| 3.11.2 | 7.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.2_7.3.2.zip> |
|
||||
| 3.11.2 | 6.8.6 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.2_6.8.6.zip> |
|
||||
| 3.11.1 | 7.5.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.1_7.5.1.zip> |
|
||||
| 3.11.1 | 7.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.1_7.3.2.zip> |
|
||||
| 3.11.1 | 6.8.6 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.1_6.8.6.zip> |
|
||||
| 3.11.0 | 7.5.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.0_7.5.1.zip> |
|
||||
| 3.11.0 | 7.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.0_7.3.2.zip> |
|
||||
| 3.11.0 | 6.8.6 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.11.0_6.8.6.zip> |
|
||||
| 3.10.2 | 7.5.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.5.1.zip> |
|
||||
| 3.10.2 | 7.5.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.5.0.zip> |
|
||||
| 3.10.2 | 7.4.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.4.2.zip> |
|
||||
| 3.10.2 | 7.4.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.4.1.zip> |
|
||||
| 3.10.2 | 7.4.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.4.0.zip> |
|
||||
| 3.10.2 | 7.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_7.3.2.zip> |
|
||||
| 3.10.2 | 6.8.6 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.6.zip> |
|
||||
| 3.10.2 | 6.8.5 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.5.zip> |
|
||||
| 3.10.2 | 6.8.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.4.zip> |
|
||||
| 3.10.2 | 6.8.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.2_6.8.3.zip> |
|
||||
| 3.10.1 | 7.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.1_7.3.2.zip> |
|
||||
| 3.10.1 | 7.3.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.1_7.3.1.zip> |
|
||||
| 3.10.1 | 6.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.1_6.8.2.zip> |
|
||||
| 3.10.0 | 7.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.0_7.3.2.zip> |
|
||||
| 3.10.0 | 7.3.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.0_7.3.1.zip> |
|
||||
| 3.10.0 | 6.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.10.0_6.8.2.zip> |
|
||||
| 3.9.5 | 7.3.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.5_7.3.0.zip> |
|
||||
| 3.9.5 | 7.2.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.5_7.2.1.zip> |
|
||||
| 3.9.5 | 6.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.5_6.8.2.zip> |
|
||||
| 3.9.4 | 7.3.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_7.3.0.zip> |
|
||||
| 3.9.4 | 7.2.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_7.2.1.zip> |
|
||||
| 3.9.4 | 7.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_7.2.0.zip> |
|
||||
| 3.9.4 | 6.8.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_6.8.2.zip> |
|
||||
| 3.9.4 | 6.8.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.4_6.8.1.zip> |
|
||||
| 3.9.3 | 7.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_7.2.0.zip> |
|
||||
| 3.9.3 | 7.1.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_7.1.1.zip> |
|
||||
| 3.9.3 | 7.0.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_7.0.1.zip> |
|
||||
| 3.9.3 | 6.8.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.3_6.8.1.zip> |
|
||||
| 3.9.2 | 7.1.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.2_7.1.1.zip> |
|
||||
| 3.9.1 | 7.1.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.1_7.1.1.zip> |
|
||||
| 3.9.1 | 7.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.1_7.1.0.zip> |
|
||||
| 3.9.1 | 6.8.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.1_6.8.0.zip> |
|
||||
| 3.9.0 | 6.7.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.0_6.7.2.zip> |
|
||||
| 3.9.0 | 6.7.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.9.0_6.7.1.zip> |
|
||||
| 3.8.2 | 6.7.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.7.1.zip> |
|
||||
| 3.8.2 | 6.7.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.7.0.zip> |
|
||||
| 3.8.2 | 6.6.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.2.zip> |
|
||||
| 3.8.2 | 6.6.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.1.zip> |
|
||||
| 3.8.2 | 6.6.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.0.zip> |
|
||||
| 3.8.2 | 6.5.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.5.4.zip> |
|
||||
| 3.8.1 | 6.5.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.1_6.5.4.zip> |
|
||||
| 3.8.0 | 6.5.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.0_6.5.4.zip> |
|
||||
| 3.7.2 | 6.5.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.2_6.5.4.zip> |
|
||||
| 3.7.2 | 6.5.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.2_6.5.3.zip> |
|
||||
| 3.7.1 | 6.5.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.1_6.5.3.zip> |
|
||||
| 3.7.1 | 6.5.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.1_6.5.2.zip> |
|
||||
| 3.7.1 | 6.5.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.1_6.5.1.zip> |
|
||||
| 3.7.0 | 6.5.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.5.1.zip> |
|
||||
| 3.7.0 | 6.5.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.5.0.zip> |
|
||||
| 3.7.0 | 6.4.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.4.3.zip> |
|
||||
| 3.7.0 | 6.4.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.7.0_6.4.2.zip> |
|
||||
| 3.6.1 | 6.4.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.3.zip> |
|
||||
| 3.6.1 | 6.4.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.2.zip> |
|
||||
| 3.6.1 | 6.4.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.1.zip> |
|
||||
| 3.6.1 | 6.4.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.4.0.zip> |
|
||||
| 3.6.1 | 6.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.1_6.3.2.zip> |
|
||||
| 3.6.0 | 6.4.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.0_6.4.0.zip> |
|
||||
| 3.6.0 | 6.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.6.0_6.3.2.zip> |
|
||||
| 3.5.0 | 6.4.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.5.0_6.4.0.zip> |
|
||||
| 3.5.0 | 6.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.5.0_6.3.2.zip> |
|
||||
| 3.4.0 | 6.3.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.4.0_6.3.2.zip> |
|
||||
| 3.4.0 | 6.3.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.4.0_6.3.1.zip> |
|
||||
| 3.3.1 | 6.3.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.1_6.3.1.zip> |
|
||||
| 3.3.1 | 6.3.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.1_6.3.0.zip> |
|
||||
| 3.3.0 | 6.3.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.0_6.3.0.zip> |
|
||||
| 3.3.1 | 6.2.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.1_6.2.4.zip> |
|
||||
| 3.3.0 | 6.2.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.3.0_6.2.4.zip> |
|
||||
| 3.2.4 | 6.2.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.4_6.2.4.zip> |
|
||||
| 3.2.3 | 6.2.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.3_6.2.4.zip> |
|
||||
| 3.2.2 | 6.2.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.2_6.2.4.zip> |
|
||||
| 3.2.1 | 6.2.4 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.1_6.2.4.zip> |
|
||||
| 3.2.1 | 6.2.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.1_6.2.3.zip> |
|
||||
| 3.2.1 | 6.2.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.1_6.2.2.zip> |
|
||||
| 3.2.0 | 6.2.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.2.2.zip> |
|
||||
| 3.2.0 | 6.2.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.2.1.zip> |
|
||||
| 3.2.0 | 6.2.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.2.0.zip> |
|
||||
| 3.2.0 | 6.1.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.3.zip> |
|
||||
| 3.2.0 | 6.1.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.2.zip> |
|
||||
| 3.2.0 | 6.1.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.1.zip> |
|
||||
| 3.2.0 | 6.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.2.0_6.1.0.zip> |
|
||||
| 3.1.0 | 6.1.3 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.3.zip> |
|
||||
| 3.1.0 | 6.1.2 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.2.zip> |
|
||||
| 3.1.0 | 6.1.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.1.zip> |
|
||||
| 3.1.0 | 6.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.1.0_6.1.0.zip> |
|
||||
| 3.0.0 | 6.1.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.0.0_6.1.0.zip> |
|
||||
| 3.0.0 | 6.0.1 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.0.0_6.0.1.zip> |
|
||||
| 3.0.0 | 6.0.0 | <https://packages.wazuh.com/wazuhapp/wazuhapp-3.0.0_6.0.0.zip> |
|
||||
|
||||
|
||||
## Contribute
|
||||
|
||||
@ -253,8 +262,8 @@ If you want to contribute to our project please don't hesitate to send a pull re
|
||||
|
||||
## Copyright & License
|
||||
|
||||
Copyright © 2019 Wazuh, Inc.
|
||||
Copyright © 2020 Wazuh, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
Find more information about this on the [LICENSE](LICENSE) file.
|
||||
Find more information about this on the [LICENSE](LICENSE) file.
|
2
index.js
2
index.js
@ -40,4 +40,4 @@ export default kibana =>
|
||||
init(server, options) {
|
||||
return initApp(server, options);
|
||||
}
|
||||
});
|
||||
});
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "wazuh",
|
||||
"version": "3.11.4",
|
||||
"revision": "0485",
|
||||
"code": "0485-0",
|
||||
"version": "3.12.0",
|
||||
"revision": "0490",
|
||||
"code": "0490-0",
|
||||
"kibana": {
|
||||
"version": "6.8.7"
|
||||
},
|
||||
@ -38,7 +38,6 @@
|
||||
"angular-chart.js": "1.1.1",
|
||||
"angular-cookies": "1.6.5",
|
||||
"angular-material": "1.1.18",
|
||||
"dom-to-image": "^2.6.0",
|
||||
"install": "^0.10.1",
|
||||
"js2xmlparser": "^3.0.0",
|
||||
"json2csv": "^4.1.2",
|
||||
|
131
public/app.js
131
public/app.js
@ -27,6 +27,8 @@ import 'uiExports/autocompleteProviders';
|
||||
|
||||
// Require CSS
|
||||
import './less/loader';
|
||||
// Require lib to dashboards PDFs
|
||||
require ('./utils/dom-to-image.js');
|
||||
import { uiModules } from 'ui/modules';
|
||||
import chrome from 'ui/chrome';
|
||||
|
||||
@ -81,134 +83,11 @@ app.config([
|
||||
}
|
||||
]);
|
||||
|
||||
app.run(function($rootScope, $route, $location, appState, $window) {
|
||||
app.run(function() {
|
||||
chrome
|
||||
.setRootTemplate('<wz-menu></wz-menu><div ng-view></div>')
|
||||
.setRootController(() => require('./app'));
|
||||
appState.setNavigation({ status: false });
|
||||
appState.setNavigation({
|
||||
reloaded: false,
|
||||
discoverPrevious: false,
|
||||
discoverSections: ['/overview/', '/agents', '/wazuh-dev']
|
||||
});
|
||||
|
||||
$rootScope.$on('$routeChangeSuccess', () => {
|
||||
appState.setNavigation({ prevLocation: $location.path() });
|
||||
if (!appState.getNavigation().reloaded) {
|
||||
appState.setNavigation({ status: true });
|
||||
} else {
|
||||
appState.setNavigation({ reloaded: false });
|
||||
}
|
||||
});
|
||||
|
||||
$rootScope.$on('$locationChangeSuccess', () => {
|
||||
const navigation = appState.getNavigation();
|
||||
appState.setNavigation({ currLocation: $location.path() });
|
||||
if (navigation.currLocation !== navigation.prevLocation) {
|
||||
if (navigation.discoverSections.includes(navigation.currLocation)) {
|
||||
appState.setNavigation({ discoverPrevious: navigation.prevLocation });
|
||||
}
|
||||
} else {
|
||||
if (!navigation.status && navigation.prevLocation) {
|
||||
if (
|
||||
!navigation.discoverSections.includes(navigation.currLocation) &&
|
||||
$location.search().tabView !== 'cluster-monitoring'
|
||||
) {
|
||||
appState.setNavigation({ reloaded: true });
|
||||
$location.search('configSubTab', null);
|
||||
$location.search('editingFile', null);
|
||||
$route.reload();
|
||||
//discover sections
|
||||
} else if (
|
||||
navigation.discoverSections.includes(navigation.currLocation)
|
||||
) {
|
||||
if (navigation.currLocation === navigation.discoverSections[1]) {
|
||||
$window.history.pushState(
|
||||
{
|
||||
page: chrome.addBasePath(
|
||||
'wazuh#' + navigation.discoverPrevious + '/'
|
||||
)
|
||||
},
|
||||
'',
|
||||
chrome.addBasePath('wazuh#' + navigation.discoverPrevious + '/')
|
||||
);
|
||||
} else if (
|
||||
navigation.currLocation === navigation.discoverSections[2]
|
||||
) {
|
||||
if (
|
||||
$location.search().tab &&
|
||||
$location.search().tab !== 'welcome'
|
||||
) {
|
||||
$window.history.pushState(
|
||||
{
|
||||
page: chrome.addBasePath(
|
||||
'wazuh#' + navigation.discoverPrevious
|
||||
)
|
||||
},
|
||||
'',
|
||||
chrome.addBasePath('wazuh#' + navigation.discoverPrevious)
|
||||
);
|
||||
$window.history.pushState(
|
||||
{
|
||||
page: chrome.addBasePath(
|
||||
'wazuh#' +
|
||||
navigation.discoverPrevious +
|
||||
'?agent=' +
|
||||
$location.search().agent
|
||||
)
|
||||
},
|
||||
'',
|
||||
chrome.addBasePath(
|
||||
'wazuh#' +
|
||||
navigation.discoverPrevious +
|
||||
'?agent=' +
|
||||
$location.search().agent
|
||||
)
|
||||
);
|
||||
} else {
|
||||
$window.history.pushState(
|
||||
{
|
||||
page: chrome.addBasePath(
|
||||
'wazuh#' + navigation.discoverPrevious
|
||||
)
|
||||
},
|
||||
'',
|
||||
chrome.addBasePath('wazuh#' + navigation.discoverPrevious)
|
||||
);
|
||||
}
|
||||
} else if (
|
||||
navigation.currLocation === navigation.discoverSections[0] ||
|
||||
navigation.currLocation === navigation.discoverSections[3]
|
||||
) {
|
||||
$window.history.pushState(
|
||||
{
|
||||
page: chrome.addBasePath('wazuh#' + navigation.discoverPrevious)
|
||||
},
|
||||
'',
|
||||
chrome.addBasePath('wazuh#' + navigation.discoverPrevious)
|
||||
);
|
||||
}
|
||||
$window.history.pushState(
|
||||
{ page: chrome.addBasePath('wazuh#' + $location.$$url) },
|
||||
'',
|
||||
chrome.addBasePath('wazuh#' + $location.$$url)
|
||||
);
|
||||
} else if ($location.search().tabView === 'cluster-monitoring') {
|
||||
$window.history.pushState(
|
||||
{ page: chrome.addBasePath('wazuh#/manager/') },
|
||||
'',
|
||||
chrome.addBasePath('wazuh#/manager/')
|
||||
);
|
||||
$window.history.pushState(
|
||||
{ page: 'wazuh#' + $location.$$url },
|
||||
'',
|
||||
chrome.addBasePath('wazuh#' + $location.$$url)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
appState.setNavigation({ status: false });
|
||||
});
|
||||
.setRootController(() => require('./app'))
|
||||
|
||||
});
|
||||
|
||||
// Added due to Kibana 6.3.0. Do not modify.
|
||||
|
@ -170,7 +170,7 @@ export class RegisterAgent extends Component {
|
||||
} && sudo installer -pkg ./wazuh-agent.pkg -target /`,
|
||||
winText: `Invoke-WebRequest -Uri https://packages.wazuh.com/3.x/windows/wazuh-agent-${
|
||||
this.state.wazuhVersion
|
||||
}-1.msi -OutFile wazuh-agent.msi; wazuh-agent.msi /q ADDRESS='${
|
||||
}-1.msi -OutFile wazuh-agent.msi; ./wazuh-agent.msi /q ADDRESS='${
|
||||
this.state.serverAddress
|
||||
}' AUTHD_SERVER='${this.state.serverAddress}'${
|
||||
this.state.needsPassword
|
||||
|
@ -120,7 +120,7 @@ export class WelcomeScreen extends Component {
|
||||
<EuiSpacer size="l" />
|
||||
<EuiFlexGrid columns={2}>
|
||||
{this.buildTabCard('general', 'dashboardApp')}
|
||||
{this.buildTabCard('fim', 'loggingApp')}
|
||||
{this.buildTabCard('fim', 'filebeatApp')}
|
||||
{this.buildTabCard('configuration', 'gear')}
|
||||
{this.buildTabCard('syscollector', 'notebookApp')}
|
||||
</EuiFlexGrid>
|
||||
|
@ -224,6 +224,7 @@ export class HealthCheck {
|
||||
this.checks.template = configuration['checks.template'];
|
||||
this.checks.api = configuration['checks.api'];
|
||||
this.checks.setup = configuration['checks.setup'];
|
||||
this.checks.fields = configuration['checks.fields'];
|
||||
|
||||
this.results.push(
|
||||
{
|
||||
@ -249,7 +250,7 @@ export class HealthCheck {
|
||||
{
|
||||
id: 4,
|
||||
description: 'Check index pattern known fields',
|
||||
status: 'Checking...'
|
||||
status: this.checks.fields ? 'Checking...' : 'disabled'
|
||||
}
|
||||
);
|
||||
|
||||
@ -261,12 +262,14 @@ export class HealthCheck {
|
||||
|
||||
this.checksDone = true;
|
||||
|
||||
try {
|
||||
await this.genericReq.request('GET', '/elastic/known-fields/all', {});
|
||||
this.results[this.results.length - 1].status = 'Ready';
|
||||
} catch (error) {
|
||||
this.results[this.results.length - 1].status = 'Error';
|
||||
this.handleError(error);
|
||||
if(this.checks.fields){
|
||||
try {
|
||||
await this.genericReq.request('GET', '/elastic/known-fields/all', {});
|
||||
this.results[this.results.length - 1].status = 'Ready';
|
||||
} catch (error) {
|
||||
this.results[this.results.length - 1].status = 'Error';
|
||||
this.handleError(error);
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.errors || !this.errors.length) {
|
||||
|
@ -126,7 +126,7 @@ export class WelcomeScreen extends Component {
|
||||
</EuiFlexGroup>
|
||||
<EuiFlexGrid columns={2}>
|
||||
{this.buildTabCard('general', 'dashboardApp')}
|
||||
{this.buildTabCard('fim', 'loggingApp')}
|
||||
{this.buildTabCard('fim', 'filebeatApp')}
|
||||
{this.props.extensions.aws &&
|
||||
this.buildTabCard('aws', 'logoAWSMono')}
|
||||
</EuiFlexGrid>
|
||||
|
@ -137,7 +137,7 @@ export class AddApi extends Component {
|
||||
const editConfigChildren = (
|
||||
<div>
|
||||
<EuiText>
|
||||
Modify <EuiCode>kibana/plugins/wazuh/wazuh.yml</EuiCode> to set the
|
||||
Modify <EuiCode>/usr/share/kibana/optimize/wazuh/config/wazuh.yml</EuiCode> to set the
|
||||
connection information.
|
||||
</EuiText>
|
||||
<EuiSpacer />
|
||||
|
@ -107,7 +107,7 @@ export class ApiIsDown extends Component {
|
||||
const apiExample = `# Example Wazuh API configuration
|
||||
hosts:
|
||||
- production:
|
||||
url: http://172.16.1.2
|
||||
url: https://172.16.1.2
|
||||
port: 55000
|
||||
user: foo
|
||||
password: bar
|
||||
@ -223,7 +223,7 @@ hosts:
|
||||
<div>
|
||||
<EuiText>
|
||||
Review the settings in the{' '}
|
||||
<EuiCode>kibana/plugins/wazuh/wazuh.yml</EuiCode> file.
|
||||
<EuiCode>/usr/share/kibana/optimize/wazuh/config/wazuh.yml</EuiCode> file.
|
||||
</EuiText>
|
||||
<EuiSpacer />
|
||||
<EuiCodeBlock language="yaml">{apiExample}</EuiCodeBlock>
|
||||
|
@ -183,19 +183,19 @@ export class ApiTable extends Component {
|
||||
</EuiToolTip>
|
||||
</span>
|
||||
) : (
|
||||
<span>
|
||||
<EuiHealth color="danger">Offline</EuiHealth>
|
||||
<EuiToolTip position="top" content={item.downReason}>
|
||||
<EuiButtonIcon
|
||||
color="primary"
|
||||
style={{ marginTop: '-12px' }}
|
||||
iconType="questionInCircle"
|
||||
aria-label="Info about the error"
|
||||
onClick={() => this.props.copyToClipBoard(item.downReason)}
|
||||
/>
|
||||
</EuiToolTip>
|
||||
</span>
|
||||
);
|
||||
<span>
|
||||
<EuiHealth color="danger">Offline</EuiHealth>
|
||||
<EuiToolTip position="top" content={item.downReason}>
|
||||
<EuiButtonIcon
|
||||
color="primary"
|
||||
style={{ marginTop: '-12px' }}
|
||||
iconType="questionInCircle"
|
||||
aria-label="Info about the error"
|
||||
onClick={() => this.props.copyToClipBoard(item.downReason)}
|
||||
/>
|
||||
</EuiToolTip>
|
||||
</span>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<span>
|
||||
@ -257,7 +257,7 @@ export class ApiTable extends Component {
|
||||
<EuiFlexGroup>
|
||||
<EuiFlexItem>
|
||||
<EuiTitle>
|
||||
<h2>Wazuh hosts</h2>
|
||||
<h2>Wazuh API configuration</h2>
|
||||
</EuiTitle>
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
@ -282,8 +282,7 @@ export class ApiTable extends Component {
|
||||
<EuiFlexGroup>
|
||||
<EuiFlexItem>
|
||||
<EuiText color="subdued" style={{ paddingBottom: '15px' }}>
|
||||
From here you can see how to set up your Wazuh host, establish as
|
||||
default, and check their connection and status.
|
||||
From here you can manage and configure the API entries. You can also check their connection and status.
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
|
@ -17,7 +17,7 @@
|
||||
<md-button class="wz-menu-button" ng-href="#/manager" ng-click="setMenuNavItem('manager')"
|
||||
ng-class="{'wz-menu-active': menuNavItem === 'manager' }" aria-label="Cluster tab">
|
||||
<react-component name="EuiIcon" class="kbnGlobalNavLink__euiIcon"
|
||||
props="{type:'infraApp', color:'ghost'}" /> Management
|
||||
props="{type:'managementApp', color:'ghost'}" /> Management
|
||||
</md-button>
|
||||
|
||||
<md-button class="wz-menu-button" ng-href="#/agents-preview" ng-click="setMenuNavItem('agents-preview')"
|
||||
|
@ -87,9 +87,9 @@ class WzMenu {
|
||||
$scope.currentSelectedPattern = appState.getCurrentPattern();
|
||||
}
|
||||
if (!$scope.menuNavItem) {
|
||||
$scope.menuNavItem = appState
|
||||
$scope.menuNavItem = (appState
|
||||
.getNavigation()
|
||||
.currLocation.replace(/\//g, '');
|
||||
.currLocation || '').replace(/\//g, '');
|
||||
}
|
||||
|
||||
if (appState.getCurrentAPI()) {
|
||||
@ -111,7 +111,7 @@ class WzMenu {
|
||||
let height = false;
|
||||
try {
|
||||
height = $('#navDrawerMenu > ul:nth-child(2)')[0].clientHeight;
|
||||
} catch (error) {} // eslint-disable-line
|
||||
} catch (error) { } // eslint-disable-line
|
||||
const barHeight = (height || 51) + 2;
|
||||
$scope.settedMenuHeight = true;
|
||||
$('.md-toolbar-tools, md-toolbar')
|
||||
@ -119,7 +119,7 @@ class WzMenu {
|
||||
.css('max-height', barHeight, 'important');
|
||||
};
|
||||
|
||||
$($window).on('resize', function() {
|
||||
$($window).on('resize', function () {
|
||||
calcHeight();
|
||||
});
|
||||
|
||||
@ -183,4 +183,4 @@ class WzMenu {
|
||||
}
|
||||
}
|
||||
|
||||
app.directive('wzMenu', () => new WzMenu());
|
||||
app.directive('wzMenu', () => new WzMenu());
|
@ -284,7 +284,6 @@ import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services';
|
||||
aria-label="Filter monitored files..."
|
||||
/>
|
||||
</EuiFlexGroup>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -392,7 +391,6 @@ import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services';
|
||||
name: "Field",
|
||||
align: "left",
|
||||
width: "120px",
|
||||
|
||||
},
|
||||
{
|
||||
field: 'value',
|
||||
@ -420,7 +418,6 @@ import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services';
|
||||
return (
|
||||
<EuiFlexGroup>
|
||||
<EuiFlexItem>
|
||||
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
);
|
||||
|
@ -18,7 +18,7 @@ export class Tabs extends Component {
|
||||
super(props);
|
||||
|
||||
this.tabs = [];
|
||||
this.props.tabs.forEach(tab => {
|
||||
(this.props.tabs || []).forEach(tab => {
|
||||
this.tabs.push({
|
||||
id: tab.id,
|
||||
name: tab.name
|
||||
|
@ -124,4 +124,4 @@ export class VisHandlers {
|
||||
removeAll() {
|
||||
this.list = [];
|
||||
}
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@
|
||||
* Find more information about this on the LICENSE file.
|
||||
*/
|
||||
|
||||
import domtoimage from 'dom-to-image';
|
||||
import domtoimage from '../utils/dom-to-image';
|
||||
|
||||
export class Vis2PNG {
|
||||
/**
|
||||
@ -38,13 +38,14 @@ export class Vis2PNG {
|
||||
const tmpNode = this.htmlObject[currentValue];
|
||||
try {
|
||||
const tmpResult = await domtoimage.toPng(tmpNode[0]);
|
||||
if (tmpResult === 'data:,') return;
|
||||
this.rawArray.push({
|
||||
element: tmpResult,
|
||||
width: tmpNode.width(),
|
||||
height: tmpNode.height(),
|
||||
id: currentValue
|
||||
});
|
||||
} catch (error) {} // eslint-disable-line
|
||||
} catch (error) { } // eslint-disable-line
|
||||
currentCompleted++;
|
||||
this.$rootScope.reportStatus = `Generating report...${Math.round(
|
||||
(currentCompleted / len) * 100
|
||||
|
@ -1070,4 +1070,4 @@ function discoverController(
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
init();
|
||||
}
|
||||
}
|
@ -275,4 +275,4 @@ app.directive('kbnVis', function() {
|
||||
let loader = null;
|
||||
}
|
||||
};
|
||||
});
|
||||
});
|
@ -1,20 +1,20 @@
|
||||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
export * from './visualize_loader';
|
||||
export * from './visualize_loader';
|
@ -162,4 +162,4 @@ export class SavedObjectLoader {
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -951,6 +951,10 @@ wz-xml-file-editor {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.fullscreen .visWrapper {
|
||||
padding: 26px 0;
|
||||
}
|
||||
|
||||
.wz-md-card:not(.fullscreen) .sca-vis.sca-gauges .visLib__chart {
|
||||
height: 130%;
|
||||
overflow: hidden;
|
||||
@ -1103,8 +1107,8 @@ md-toolbar.md-default-theme:not(.md-menu-toolbar), md-toolbar:not(.md-menu-toolb
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.monitoring-discover form{
|
||||
display: none;
|
||||
.monitoring-discover{
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.euiBadge, .euiBadge__childButton{
|
||||
@ -1279,4 +1283,8 @@ md-chips.md-default-theme .md-chips, md-chips .md-chips{
|
||||
|
||||
.table-vis-container{
|
||||
overflow: auto !important;
|
||||
}
|
||||
|
||||
.hide-close-button{
|
||||
display: none;
|
||||
}
|
4094
public/less/dark_theme/bootstrap_light.css
vendored
4094
public/less/dark_theme/bootstrap_light.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,350 +0,0 @@
|
||||
body.md-default-theme,
|
||||
body,
|
||||
html.md-default-theme,
|
||||
html {
|
||||
color: #dfe5ef !important;
|
||||
background-color: #1a1b20!important;
|
||||
}
|
||||
|
||||
#kibana-body {
|
||||
background-color: #1a1b20!important;
|
||||
}
|
||||
|
||||
.euiHeaderSectionItem__button,
|
||||
.euiListGroupItem__icon {
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
.euiToolTipAnchor {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.app-wrapper-panel {
|
||||
background-color: #1a1b20;
|
||||
}
|
||||
|
||||
.wz-md-card:not(.wz-metric-color) {
|
||||
box-shadow: 0 2px 2px -1px rgba(0, 0, 0, 0.3), 0 1px 5px -2px rgba(0, 0, 0, 0.3);
|
||||
background-color: #1D1E24;
|
||||
border: 1px solid #343741;
|
||||
}
|
||||
|
||||
.wz-card-actions-vis {
|
||||
color: white;
|
||||
border-bottom: 1px solid #343741;
|
||||
}
|
||||
|
||||
.wz-card-actions.wz-card-actions-top, .columns-bar-active {
|
||||
border-bottom: 1px solid #343741!important;
|
||||
background: #16171c;
|
||||
color: #dfe5ef;
|
||||
border-top: none!important;
|
||||
}
|
||||
|
||||
.kuiButton--secondary:enabled:hover {
|
||||
background: rgba(27, 169, 245, 0.1)!important;
|
||||
color: #45b9f6!important;
|
||||
border-color: #1BA9F5!important;
|
||||
}
|
||||
|
||||
.kuiButton--secondary {
|
||||
color: #45b9f6!important;
|
||||
border-color: #1BA9F5;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.btn-info:hover {
|
||||
background: #ebebeb17 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
#wz-search-filter-bar-input {
|
||||
background: transparent;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.registerAgent {
|
||||
background: #1a1b20!important;
|
||||
}
|
||||
|
||||
.json-beautifier {
|
||||
background: black;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.wz-configuration-value {
|
||||
background: transparent;
|
||||
border-color: #343741;
|
||||
}
|
||||
|
||||
.kuiSelect{
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
md-card md-card-content {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.ui-select-choices-row-inner {
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
md-content.md-default-theme,
|
||||
md-content {
|
||||
background-color: #1a1b20;
|
||||
color: #c8dad9;
|
||||
}
|
||||
|
||||
.wz-metric-color {
|
||||
background-color: #343741 !important;
|
||||
border: 1px solid #131417;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.visLegend__toggle {
|
||||
color: white!important;
|
||||
}
|
||||
|
||||
discover-app-w .container-fluid {
|
||||
background-color: #1D1E24;
|
||||
}
|
||||
|
||||
.euiBreadcrumbs--truncate
|
||||
.euiBreadcrumb:not(.euiBreadcrumb--collapsed).euiBreadcrumb--last,
|
||||
.euiNavDrawerGroup__item .euiListGroupItem__label,
|
||||
.euiNavDrawer .euiNavDrawer__expandButton .euiListGroupItem__button {
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
.percentage {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.wz-nav-item button.md-primary {
|
||||
color: #0079a5 !important;
|
||||
background-color: #232635!important;
|
||||
border-bottom: 2px solid #006BB4;
|
||||
}
|
||||
|
||||
md-nav-bar.md-default-theme .md-nav-bar, md-nav-bar .md-nav-bar {
|
||||
border-color: rgb(52, 55, 65);
|
||||
}
|
||||
|
||||
.wz-nav-item button.md-unselected {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.sidebar-container .index-pattern {
|
||||
background-color: #1ba9f5!important;
|
||||
color: white!important;
|
||||
}
|
||||
|
||||
.wz-menu-content {
|
||||
background-color: #1a1b20;
|
||||
border-bottom: 1px solid #343741;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.wz-menu-button.wz-menu-active {
|
||||
background-color: #16171c !important;
|
||||
}
|
||||
|
||||
.wz-menu-button:not([disabled]):hover {
|
||||
background: #16171c;
|
||||
}
|
||||
|
||||
.wzXmlEditor {
|
||||
background: #1d1e24;
|
||||
border: 1px solid #343741;
|
||||
color: #c8dad9;
|
||||
}
|
||||
|
||||
.CodeMirror {
|
||||
border-top: 1px solid #5c606f;
|
||||
}
|
||||
|
||||
.wz-select-input {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.euiCard {
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
.md-subheader.md-default-theme, .md-subheader {
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
.euiCard__top.wz-card-actions-top {
|
||||
background: #272931;
|
||||
}
|
||||
|
||||
table thead > tr {
|
||||
background-color: #1a1b20 !important;
|
||||
}
|
||||
|
||||
.table-hover > tbody > tr:hover {
|
||||
background-color: rgba(27, 169, 245, 0.05) !important;
|
||||
}
|
||||
|
||||
.table-striped > tbody > tr:nth-of-type(odd):hover {
|
||||
background-color: rgba(27, 169, 245, 0.05) !important;
|
||||
}
|
||||
|
||||
#wz-search-filter-bar {
|
||||
background: #16171c;
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
#wz-search-filter-bar-input{
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.kuiLocalSearchInput, .kuiLocalSearchInput:focus {
|
||||
border: 1px solid #343741 !important;
|
||||
background: #16171c;
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
.wzMultipleSelector .panel-primary {
|
||||
border: 1px solid #343741!important;
|
||||
-webkit-box-shadow: 0 2px 2px -1px rgba(0, 0, 0, 0.1) !important;
|
||||
box-shadow: 0 2px 2px -1px rgba(0, 0, 0, 0.1) !important;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.wzMultipleSelector .panel-primary > .panel-heading {
|
||||
color: #fff;
|
||||
border-color: #343741;
|
||||
}
|
||||
|
||||
.wzMultipleSelector select {
|
||||
border-color: #343741;
|
||||
}
|
||||
|
||||
.btn-info {
|
||||
border: 1px solid #343741 !important;
|
||||
}
|
||||
|
||||
.table-resizable > thead th:not(:first-child) {
|
||||
border-left: 1px dashed #343741;
|
||||
}
|
||||
|
||||
md-dialog.md-default-theme.md-content-overflow .md-actions,
|
||||
md-dialog.md-content-overflow .md-actions,
|
||||
md-dialog.md-default-theme.md-content-overflow md-dialog-actions,
|
||||
md-dialog.md-content-overflow md-dialog-actions,
|
||||
md-divider.md-default-theme, md-divider {
|
||||
border-top-color: rgb(52, 55, 65);
|
||||
}
|
||||
|
||||
.wz-item-detail {
|
||||
border: 1px solid #343741;
|
||||
}
|
||||
|
||||
.wz-item-list {
|
||||
background-color: #16171c;
|
||||
border: 1px solid #343741;
|
||||
}
|
||||
|
||||
.euiFlexGroup .euiFlexGroup:hover {
|
||||
background: #1D1E24;
|
||||
}
|
||||
|
||||
.wz-dev-box .CodeMirror {
|
||||
border: 1px solid #343741 !important;
|
||||
}
|
||||
|
||||
.wz-dev-column-separator {
|
||||
background: #1d1e24;
|
||||
}
|
||||
|
||||
.CodeMirror-styled-background {
|
||||
background-color: #343741;
|
||||
}
|
||||
|
||||
.wz-dev-column-separator:hover {
|
||||
background-color: #0b4462;
|
||||
}
|
||||
|
||||
.CodeMirror-hints{
|
||||
background-color: #16171c !important;
|
||||
border-color: #000;
|
||||
color: #dfe5ef!important;
|
||||
}
|
||||
|
||||
.CodeMirror-hint{
|
||||
color: #dfe5ef!important;
|
||||
}
|
||||
|
||||
.CodeMirror-hint:hover{
|
||||
background-color: #25262E;
|
||||
}
|
||||
|
||||
.wz-input-text {
|
||||
background-color: #16171c;
|
||||
border: 1px solid #343741;
|
||||
color: #dfe5ef;
|
||||
}
|
||||
|
||||
.wz-menu-content {
|
||||
box-shadow: 0 2px 2px -1px rgba(0, 0, 0, 0.3)!important;
|
||||
}
|
||||
|
||||
.wz-menu-select {
|
||||
background-color: #16171c !important;
|
||||
border: 1px solid #343741 !important;
|
||||
color: #dfe5ef !important;
|
||||
}
|
||||
|
||||
.wz-menu-select-option {
|
||||
background-color: #16171c !important;
|
||||
border: 1px solid #343741 !important;
|
||||
color: #dfe5ef !important;
|
||||
}
|
||||
|
||||
.extraHeader {
|
||||
border-bottom: 1px solid #2e2f34!important;
|
||||
}
|
||||
|
||||
.wzMultipleSelectorAdding{
|
||||
background-color: #037200!important;
|
||||
}
|
||||
|
||||
.wzMultipleSelectorRemoving{
|
||||
background-color: #990000!important;
|
||||
|
||||
}
|
||||
|
||||
.wz-button, .wz-button-groups, .refresh-agents-btn {
|
||||
background-color: #1BA9F5 !important;
|
||||
border-color: #1BA9F5 !important;
|
||||
color: #000 !important;
|
||||
}
|
||||
|
||||
.wz-button-groups.active, .wz-button-groups:not([disabled]):hover, .wz-button.active, .wz-button:not([disabled]):hover, .wz-button-flat:not([disabled]):hover, .refresh-agents-btn:hover {
|
||||
background-color: #0a9dec !important;
|
||||
border-color: #0a9dec !important;
|
||||
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.15), 0 2px 2px -1px rgba(0, 0, 0, 0.3) !important;
|
||||
color: #000 !important;
|
||||
}
|
||||
|
||||
.kuiButton--hollow:hover {
|
||||
color: #006E8A !important;
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
discover-app-w > main.container-fluid {
|
||||
background: #1a1b20 !important;
|
||||
}
|
||||
|
||||
.wz-menu-select {
|
||||
filter: invert(0) !important;
|
||||
}
|
||||
|
||||
.logtest{
|
||||
border-left: 1px solid #343741!important;
|
||||
box-shadow: -2px 0px 2px -1px rgba(0, 0, 0, 0.3)!important;
|
||||
background: #1a1b20;
|
||||
z-index: 10;
|
||||
}
|
@ -21,6 +21,11 @@ html {
|
||||
#kibana-body{
|
||||
min-height: calc(~'100vh - 1px') !important;
|
||||
}
|
||||
|
||||
:focus:not(.wz-button):not(.input-filter-box):not(.kuiLocalSearchInput):not(.euiTextArea) {
|
||||
-webkit-animation: none!important;
|
||||
}
|
||||
|
||||
/* Margins */
|
||||
|
||||
.wz-margin-right-8 {
|
||||
@ -60,7 +65,7 @@ html {
|
||||
}
|
||||
|
||||
.wz-margin-top-4 {
|
||||
margin-top: 4px;
|
||||
margin-top: 4px!important;
|
||||
}
|
||||
|
||||
.wz-margin-top-8 {
|
||||
|
@ -23,7 +23,7 @@ input,
|
||||
select,
|
||||
.wz-chip {
|
||||
font-family: 'Open Sans', Helvetica, Arial, sans-serif !important;
|
||||
font-size: 14px;
|
||||
font-size: 14px!important;
|
||||
}
|
||||
|
||||
.wz-headline-title {
|
||||
|
@ -166,7 +166,7 @@
|
||||
* at least make them look like they're not focused.
|
||||
*/
|
||||
.kuiButton {
|
||||
display: inline-block;
|
||||
display: inline-block!important;
|
||||
/* 1 */
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
|
@ -395,4 +395,4 @@ export class CommonData {
|
||||
});
|
||||
return tabs;
|
||||
}
|
||||
}
|
||||
}
|
@ -160,4 +160,4 @@ export class ReportingService {
|
||||
this.$rootScope.$applyAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -18,6 +18,7 @@ export async function getWzConfig($q, genericReq, wazuhConfig) {
|
||||
'checks.template': true,
|
||||
'checks.api': true,
|
||||
'checks.setup': true,
|
||||
'checks.fields': true,
|
||||
'extensions.pci': true,
|
||||
'extensions.gdpr': true,
|
||||
'extensions.hipaa': true,
|
||||
@ -42,6 +43,7 @@ export async function getWzConfig($q, genericReq, wazuhConfig) {
|
||||
'wazuh.monitoring.creation': 'd',
|
||||
'wazuh.monitoring.pattern': 'wazuh-monitoring-3.x-*',
|
||||
admin: true,
|
||||
'hideManagerAlerts': false,
|
||||
'logs.level': 'info'
|
||||
};
|
||||
|
||||
|
@ -12,17 +12,11 @@
|
||||
// Manage leaving the app to another Kibana tab
|
||||
export function goToKibana($location, $window) {
|
||||
const url = $location.$$absUrl.substring(0, $location.$$absUrl.indexOf('#'));
|
||||
|
||||
const lastSubUrl = $window.sessionStorage.getItem(`lastSubUrl:${url}`) || '';
|
||||
if (
|
||||
$window.sessionStorage
|
||||
.getItem(`lastSubUrl:${url}`)
|
||||
.includes('/wazuh#/visualize') ||
|
||||
$window.sessionStorage
|
||||
.getItem(`lastSubUrl:${url}`)
|
||||
.includes('/wazuh#/doc') ||
|
||||
$window.sessionStorage
|
||||
.getItem(`lastSubUrl:${url}`)
|
||||
.includes('/wazuh#/context')
|
||||
lastSubUrl.includes('/wazuh#/visualize') ||
|
||||
lastSubUrl.includes('/wazuh#/doc') ||
|
||||
lastSubUrl.includes('/wazuh#/context')
|
||||
) {
|
||||
$window.sessionStorage.setItem(`lastSubUrl:${url}`, url);
|
||||
}
|
||||
|
@ -127,10 +127,12 @@ function wzConfig($q, genericReq, wazuhConfig, $rootScope, $location) {
|
||||
|
||||
function wzKibana($location, $window, $rootScope) {
|
||||
assignPreviousLocation($rootScope, $location);
|
||||
// Sets ?_a=(columns:!(_source),filters:!())
|
||||
$location.search('_a', '(columns:!(_source),filters:!())');
|
||||
// Removes ?_g
|
||||
$location.search('_g', null);
|
||||
if ($location.$$path !== "/visualize/create") {
|
||||
// Sets ?_a=(columns:!(_source),filters:!())
|
||||
$location.search('_a', '(columns:!(_source),filters:!())');
|
||||
// Removes ?_g
|
||||
$location.search('_g', null);
|
||||
}
|
||||
return goToKibana($location, $window);
|
||||
}
|
||||
|
||||
@ -185,7 +187,7 @@ routes
|
||||
})
|
||||
.when('/wazuh-dev', {
|
||||
template: devToolsTemplate,
|
||||
resolve: { enableWzMenu, nestedResolve }
|
||||
resolve: { enableWzMenu, nestedResolve, ip, savedSearch }
|
||||
})
|
||||
.when('/blank-screen', {
|
||||
template: blankScreenTemplate,
|
||||
@ -199,4 +201,4 @@ routes
|
||||
})
|
||||
.otherwise({
|
||||
redirectTo: '/overview'
|
||||
});
|
||||
});
|
@ -2,8 +2,7 @@
|
||||
<div layout="row" layout-align="start stretch" class="wz-timelions wz-margin-top-0" ng-show="showConfig">
|
||||
|
||||
<!-- Overview visualization card -->
|
||||
<md-card class="wz-md-card"
|
||||
ng-class="{'no-opacity-overview-monitoring': resultState !== 'ready' || !rendered,'flex-30': resultState === 'ready' && rendered}">
|
||||
<md-card class="wz-md-card" style="height: 400px; width: 400px">
|
||||
<md-card-content class="wazuh-column">
|
||||
<span class="wz-headline-title">Top 5 nodes</span>
|
||||
<md-divider class="wz-margin-top-10"></md-divider>
|
||||
|
@ -1,123 +0,0 @@
|
||||
<div layout="column" ng-controller="clusterController" ng-if="mctrl.tab === 'monitoring'">
|
||||
<div flex layout="column" ng-show="!isClusterEnabled || !isClusterRunning">
|
||||
|
||||
<!-- Cluster disabled breadcrumbs -->
|
||||
<div layout="row" layout-align="start center">
|
||||
<div layout="row" layout-padding>
|
||||
<div>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span>{{ mctrl.tabNames[tab] }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- End cluster disabled breadcrumbs -->
|
||||
|
||||
<!-- Status and reports navigation bar -->
|
||||
<div ng-show="mctrl.tab !== 'welcome'" class="md-padding-h">
|
||||
<react-component name="Tabs" props="mctrl.managementTabsProps" />
|
||||
</div>
|
||||
<!-- End status and reports navigation bar -->
|
||||
|
||||
<!-- Cluster disabled section -->
|
||||
<div flex layout="row" layout-align="start start" ng-if="!isClusterEnabled">
|
||||
<md-card flex class="wz-md-card" flex>
|
||||
<md-card-content class="wz-text-center">
|
||||
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i> <span class="wz-headline-title">Cluster
|
||||
disabled</span>
|
||||
<md-divider class="wz-margin-top-10"></md-divider>
|
||||
<div layout="column" class="wz-padding-top-10">
|
||||
<p>The cluster is disabled. Visit the documentation on <a target="_blank"
|
||||
href="https://documentation.wazuh.com/current/user-manual/configuring-cluster/index.html">this
|
||||
link</a> to learn about how to enable it.
|
||||
</p>
|
||||
</div>
|
||||
</md-card-content>
|
||||
</md-card>
|
||||
</div>
|
||||
<!-- End cluster disabled section -->
|
||||
|
||||
<!-- Cluster not running section -->
|
||||
<div flex layout="row" layout-align="start start" ng-if="!isClusterRunning">
|
||||
<md-card flex class="wz-md-card" flex>
|
||||
<md-card-content class="wz-text-center">
|
||||
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i> <span class="wz-headline-title">Cluster
|
||||
not running</span>
|
||||
<md-divider class="wz-margin-top-10"></md-divider>
|
||||
<div layout="column" class="wz-padding-top-10">
|
||||
<p>
|
||||
The cluster is enabled but it's not running.
|
||||
</p>
|
||||
</div>
|
||||
</md-card-content>
|
||||
</md-card>
|
||||
</div>
|
||||
<!-- End cluster not running section -->
|
||||
</div>
|
||||
|
||||
<div flex="auto" layout="column" ng-show="isClusterEnabled && isClusterRunning">
|
||||
|
||||
<div class="md-padding md-padding-top-16" ng-show="loading">
|
||||
<react-component name="EuiProgress" props="{size: 'xs', color: 'primary'}" />
|
||||
</div>
|
||||
|
||||
<!-- Navigation section -->
|
||||
<div layout="row" layout-align="start center" ng-if="!loading">
|
||||
<div layout="row" layout-padding>
|
||||
<div ng-if="!showConfig && !showNodes">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span>{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span>{{ currentAPI }}</span>
|
||||
</div>
|
||||
<div ng-if="showConfig">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ currentAPI }}</span>
|
||||
<span> / Overview</span>
|
||||
</div>
|
||||
<div ng-if="showNodes && !currentNode">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ currentAPI }}</span>
|
||||
<span> / </span>
|
||||
<span>Nodes</span>
|
||||
</div>
|
||||
<div ng-if="currentNode">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ currentAPI }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goNodes()">Nodes</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-bold">{{ currentNode.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- End navigation section -->
|
||||
|
||||
<!-- Status and reports navigation bar -->
|
||||
<div ng-if="!loading" ng-show="mctrl.tab !== 'welcome'" class="md-padding-h">
|
||||
<react-component name="Tabs" props="mctrl.managementTabsProps" />
|
||||
</div>
|
||||
<!-- End status and reports navigation bar -->
|
||||
|
||||
<!-- Discover search bar section -->
|
||||
<kbn-dis ng-show="!loading && (!showNodes || currentNode)" class="wz-margin-top-10 monitoring-discover"></kbn-dis>
|
||||
<!-- End Discover search bar section -->
|
||||
|
||||
<!-- Loading status section -->
|
||||
<div layout="column" layout-align="center center" class="wz-margin-bottom-40"
|
||||
ng-show="!loading && !rendered && resultState === 'ready' && (!showNodes || (showNodes && currentNode))">
|
||||
<div class="percentage"><i class="fa fa-fw fa-spin fa-spinner" aria-hidden="true"></i></div>
|
||||
<div class="percentage">{{loadingStatus}}</div>
|
||||
</div>
|
||||
<!-- End loading status section -->
|
||||
</div>
|
123
public/templates/management/monitoring/monitoring.html
Normal file
123
public/templates/management/monitoring/monitoring.html
Normal file
@ -0,0 +1,123 @@
|
||||
<div layout="column" ng-controller="clusterController" ng-if="mctrl.tab === 'monitoring'">
|
||||
<div flex layout="column" ng-show="!isClusterEnabled || !isClusterRunning">
|
||||
|
||||
<!-- Cluster disabled breadcrumbs -->
|
||||
<div layout="row" layout-align="start center">
|
||||
<div layout="row" layout-padding>
|
||||
<div>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span>{{ mctrl.tabNames[tab] }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- End cluster disabled breadcrumbs -->
|
||||
|
||||
<!-- Status and reports navigation bar -->
|
||||
<div ng-show="mctrl.tab !== 'welcome'" class="md-padding-h">
|
||||
<react-component name="Tabs" props="mctrl.managementTabsProps" />
|
||||
</div>
|
||||
<!-- End status and reports navigation bar -->
|
||||
|
||||
<!-- Cluster disabled section -->
|
||||
<div flex layout="row" layout-align="start start" ng-if="!isClusterEnabled">
|
||||
<md-card flex class="wz-md-card" flex>
|
||||
<md-card-content class="wz-text-center">
|
||||
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i> <span class="wz-headline-title">Cluster
|
||||
disabled</span>
|
||||
<md-divider class="wz-margin-top-10"></md-divider>
|
||||
<div layout="column" class="wz-padding-top-10">
|
||||
<p>The cluster is disabled. Visit the documentation on <a target="_blank"
|
||||
href="https://documentation.wazuh.com/current/user-manual/configuring-cluster/index.html">this
|
||||
link</a> to learn about how to enable it.
|
||||
</p>
|
||||
</div>
|
||||
</md-card-content>
|
||||
</md-card>
|
||||
</div>
|
||||
<!-- End cluster disabled section -->
|
||||
|
||||
<!-- Cluster not running section -->
|
||||
<div flex layout="row" layout-align="start start" ng-if="!isClusterRunning">
|
||||
<md-card flex class="wz-md-card" flex>
|
||||
<md-card-content class="wz-text-center">
|
||||
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i> <span class="wz-headline-title">Cluster
|
||||
not running</span>
|
||||
<md-divider class="wz-margin-top-10"></md-divider>
|
||||
<div layout="column" class="wz-padding-top-10">
|
||||
<p>
|
||||
The cluster is enabled but it's not running.
|
||||
</p>
|
||||
</div>
|
||||
</md-card-content>
|
||||
</md-card>
|
||||
</div>
|
||||
<!-- End cluster not running section -->
|
||||
</div>
|
||||
|
||||
<div flex="auto" layout="column" ng-show="isClusterEnabled && isClusterRunning">
|
||||
|
||||
<div class="md-padding md-padding-top-16" ng-show="loading">
|
||||
<react-component name="EuiProgress" props="{size: 'xs', color: 'primary'}" />
|
||||
</div>
|
||||
|
||||
<!-- Navigation section -->
|
||||
<div layout="row" layout-align="start center" ng-if="!loading">
|
||||
<div layout="row" layout-padding>
|
||||
<div ng-if="!showConfig && !showNodes">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span>{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span>{{ currentAPI }}</span>
|
||||
</div>
|
||||
<div ng-if="showConfig">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ currentAPI }}</span>
|
||||
<span> / Overview</span>
|
||||
</div>
|
||||
<div ng-if="showNodes && !currentNode">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ currentAPI }}</span>
|
||||
<span> / </span>
|
||||
<span>Nodes</span>
|
||||
</div>
|
||||
<div ng-if="currentNode">
|
||||
<span class="wz-text-link cursor-pointer" ng-click="mctrl.switchTab('welcome')">Management</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ mctrl.tabNames[mctrl.tab] }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goBack()">{{ currentAPI }}</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-link cursor-pointer" ng-click="goNodes()">Nodes</span>
|
||||
<span> / </span>
|
||||
<span class="wz-text-bold">{{ currentNode.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- End navigation section -->
|
||||
|
||||
<!-- Status and reports navigation bar -->
|
||||
<div ng-if="!loading" ng-show="mctrl.tab !== 'welcome'" class="md-padding-h">
|
||||
<react-component name="Tabs" props="mctrl.managementTabsProps" />
|
||||
</div>
|
||||
<!-- End status and reports navigation bar -->
|
||||
|
||||
<!-- Discover search bar section -->
|
||||
<kbn-dis ng-show="!loading && (!showNodes || currentNode)" class="wz-margin-top-10 monitoring-discover"></kbn-dis>
|
||||
<!-- End Discover search bar section -->
|
||||
|
||||
<!-- Loading status section -->
|
||||
<div layout="column" layout-align="center center" class="wz-margin-bottom-40"
|
||||
ng-show="!loading && !rendered && resultState === 'ready' && (!showNodes || (showNodes && currentNode))">
|
||||
<div class="percentage"><i class="fa fa-fw fa-spin fa-spinner" aria-hidden="true"></i></div>
|
||||
<div class="percentage">{{loadingStatus}}</div>
|
||||
</div>
|
||||
<!-- End loading status section -->
|
||||
</div>
|
@ -1,4 +1,4 @@
|
||||
include ./monitoring.head
|
||||
include ./monitoring.html
|
||||
include ./main.html
|
||||
include ./main-timelions.html
|
||||
include ./configuration.html
|
||||
|
@ -1,6 +1,6 @@
|
||||
<div layout="column" ng-if="showNodes && !currentNode" class="wz-margin-top-10">
|
||||
<!-- Back button -->
|
||||
<div layout="row" class="md-padding-h">
|
||||
<div layout="row" class="md-padding">
|
||||
<md-button class="md-icon-button md-icon-button-back wz-padding-right-16 btn btn-info" aria-label="Back"
|
||||
tooltip="Go back" tooltip-placement="bottom" ng-click="goBack()"><i class="fa fa-fw fa-arrow-left"
|
||||
aria-hidden="true"></i></md-button>
|
||||
|
@ -6,7 +6,7 @@
|
||||
configuration settings
|
||||
</span>
|
||||
<span class="md-subheader">Configuration file located at <span
|
||||
class="wz-text-monospace">/usr/share/kibana/plugins/wazuh/wazuh.yml</span></span>
|
||||
class="wz-text-monospace">/usr/share/kibana/optimize/wazuh/config/wazuh.yml</span></span>
|
||||
</div>
|
||||
<!-- End headline -->
|
||||
<div layout="row" layout-align="start center" ng-if="!ctrl.load">
|
||||
|
@ -5,7 +5,7 @@
|
||||
<react-component name="EuiIcon" props="{type:'visTable'}" /> Wazuh Kibana plugin log
|
||||
messages</span>
|
||||
<span class="md-subheader">Log file located at <span
|
||||
class="wz-text-monospace">/usr/share/kibana/optimize/wazuh-logs/wazuhapp.log</span></span>
|
||||
class="wz-text-monospace">/usr/share/kibana/optimize/wazuh/logs/wazuhapp.log</span></span>
|
||||
</div>
|
||||
|
||||
<div ng-if="ctrl.loadingLogs" class="md-padding wz-margin-top-16">
|
||||
|
@ -7,6 +7,8 @@ export const configEquivalences = {
|
||||
'checks.api': 'Enable or disable the API health check when opening the app.',
|
||||
'checks.setup':
|
||||
'Enable or disable the setup health check when opening the app.',
|
||||
'checks.fields':
|
||||
'Enable or disable the known fields health check when opening the app.',
|
||||
'extensions.pci': 'Enable or disable the PCI DSS tab on Overview and Agents.',
|
||||
'extensions.gdpr': 'Enable or disable the GDPR tab on Overview and Agents.',
|
||||
'extensions.audit': 'Enable or disable the Audit tab on Overview and Agents.',
|
||||
@ -46,6 +48,8 @@ export const configEquivalences = {
|
||||
'Default index pattern to use on the app for Wazuh monitoring.',
|
||||
admin:
|
||||
'Enable or disable administrator requests to the Wazuh API when using the app.',
|
||||
hideManagerAlerts:
|
||||
'Hide the alerts of the manager in all dashboards and discover',
|
||||
'logs.level':
|
||||
'Set the app logging level, allowed values are info and debug. Default is info.'
|
||||
};
|
||||
|
770
public/utils/dom-to-image.js
Normal file
770
public/utils/dom-to-image.js
Normal file
@ -0,0 +1,770 @@
|
||||
(function (global) {
|
||||
'use strict';
|
||||
|
||||
var util = newUtil();
|
||||
var inliner = newInliner();
|
||||
var fontFaces = newFontFaces();
|
||||
var images = newImages();
|
||||
|
||||
// Default impl options
|
||||
var defaultOptions = {
|
||||
// Default is to fail on error, no placeholder
|
||||
imagePlaceholder: undefined,
|
||||
// Default cache bust is false, it will use the cache
|
||||
cacheBust: false
|
||||
};
|
||||
|
||||
var domtoimage = {
|
||||
toSvg: toSvg,
|
||||
toPng: toPng,
|
||||
toJpeg: toJpeg,
|
||||
toBlob: toBlob,
|
||||
toPixelData: toPixelData,
|
||||
impl: {
|
||||
fontFaces: fontFaces,
|
||||
images: images,
|
||||
util: util,
|
||||
inliner: inliner,
|
||||
options: {}
|
||||
}
|
||||
};
|
||||
|
||||
if (typeof module !== 'undefined')
|
||||
module.exports = domtoimage;
|
||||
else
|
||||
global.domtoimage = domtoimage;
|
||||
|
||||
|
||||
/**
|
||||
* @param {Node} node - The DOM Node object to render
|
||||
* @param {Object} options - Rendering options
|
||||
* @param {Function} options.filter - Should return true if passed node should be included in the output
|
||||
* (excluding node means excluding it's children as well). Not called on the root node.
|
||||
* @param {String} options.bgcolor - color for the background, any valid CSS color value.
|
||||
* @param {Number} options.width - width to be applied to node before rendering.
|
||||
* @param {Number} options.height - height to be applied to node before rendering.
|
||||
* @param {Object} options.style - an object whose properties to be copied to node's style before rendering.
|
||||
* @param {Number} options.quality - a Number between 0 and 1 indicating image quality (applicable to JPEG only),
|
||||
defaults to 1.0.
|
||||
* @param {String} options.imagePlaceholder - dataURL to use as a placeholder for failed images, default behaviour is to fail fast on images we can't fetch
|
||||
* @param {Boolean} options.cacheBust - set to true to cache bust by appending the time to the request url
|
||||
* @return {Promise} - A promise that is fulfilled with a SVG image data URL
|
||||
* */
|
||||
function toSvg(node, options) {
|
||||
options = options || {};
|
||||
copyOptions(options);
|
||||
return Promise.resolve(node)
|
||||
.then(function (node) {
|
||||
return cloneNode(node, options.filter, true);
|
||||
})
|
||||
// WAZUH NOT DOWNLOAD FONTS
|
||||
//.then(embedFonts)
|
||||
.then(inlineImages)
|
||||
.then(applyOptions)
|
||||
.then(function (clone) {
|
||||
return makeSvgDataUri(clone,
|
||||
options.width || util.width(node),
|
||||
options.height || util.height(node)
|
||||
);
|
||||
});
|
||||
|
||||
function applyOptions(clone) {
|
||||
if (options.bgcolor) clone.style.backgroundColor = options.bgcolor;
|
||||
|
||||
if (options.width) clone.style.width = options.width + 'px';
|
||||
if (options.height) clone.style.height = options.height + 'px';
|
||||
|
||||
if (options.style)
|
||||
Object.keys(options.style).forEach(function (property) {
|
||||
clone.style[property] = options.style[property];
|
||||
});
|
||||
|
||||
return clone;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Node} node - The DOM Node object to render
|
||||
* @param {Object} options - Rendering options, @see {@link toSvg}
|
||||
* @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data.
|
||||
* */
|
||||
function toPixelData(node, options) {
|
||||
return draw(node, options || {})
|
||||
.then(function (canvas) {
|
||||
return canvas.getContext('2d').getImageData(
|
||||
0,
|
||||
0,
|
||||
util.width(node),
|
||||
util.height(node)
|
||||
).data;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Node} node - The DOM Node object to render
|
||||
* @param {Object} options - Rendering options, @see {@link toSvg}
|
||||
* @return {Promise} - A promise that is fulfilled with a PNG image data URL
|
||||
* */
|
||||
function toPng(node, options) {
|
||||
return draw(node, options || {})
|
||||
.then(function (canvas) {
|
||||
return canvas.toDataURL();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Node} node - The DOM Node object to render
|
||||
* @param {Object} options - Rendering options, @see {@link toSvg}
|
||||
* @return {Promise} - A promise that is fulfilled with a JPEG image data URL
|
||||
* */
|
||||
function toJpeg(node, options) {
|
||||
options = options || {};
|
||||
return draw(node, options)
|
||||
.then(function (canvas) {
|
||||
return canvas.toDataURL('image/jpeg', options.quality || 1.0);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Node} node - The DOM Node object to render
|
||||
* @param {Object} options - Rendering options, @see {@link toSvg}
|
||||
* @return {Promise} - A promise that is fulfilled with a PNG image blob
|
||||
* */
|
||||
function toBlob(node, options) {
|
||||
return draw(node, options || {})
|
||||
.then(util.canvasToBlob);
|
||||
}
|
||||
|
||||
function copyOptions(options) {
|
||||
// Copy options to impl options for use in impl
|
||||
if (typeof (options.imagePlaceholder) === 'undefined') {
|
||||
domtoimage.impl.options.imagePlaceholder = defaultOptions.imagePlaceholder;
|
||||
} else {
|
||||
domtoimage.impl.options.imagePlaceholder = options.imagePlaceholder;
|
||||
}
|
||||
|
||||
if (typeof (options.cacheBust) === 'undefined') {
|
||||
domtoimage.impl.options.cacheBust = defaultOptions.cacheBust;
|
||||
} else {
|
||||
domtoimage.impl.options.cacheBust = options.cacheBust;
|
||||
}
|
||||
}
|
||||
|
||||
function draw(domNode, options) {
|
||||
return toSvg(domNode, options)
|
||||
.then(util.makeImage)
|
||||
.then(util.delay(100))
|
||||
.then(function (image) {
|
||||
var canvas = newCanvas(domNode);
|
||||
canvas.getContext('2d').drawImage(image, 0, 0);
|
||||
return canvas;
|
||||
});
|
||||
|
||||
function newCanvas(domNode) {
|
||||
var canvas = document.createElement('canvas');
|
||||
canvas.width = options.width || util.width(domNode);
|
||||
canvas.height = options.height || util.height(domNode);
|
||||
|
||||
if (options.bgcolor) {
|
||||
var ctx = canvas.getContext('2d');
|
||||
ctx.fillStyle = options.bgcolor;
|
||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||
}
|
||||
|
||||
return canvas;
|
||||
}
|
||||
}
|
||||
|
||||
function cloneNode(node, filter, root) {
|
||||
if (!root && filter && !filter(node)) return Promise.resolve();
|
||||
|
||||
return Promise.resolve(node)
|
||||
.then(makeNodeCopy)
|
||||
.then(function (clone) {
|
||||
return cloneChildren(node, clone, filter);
|
||||
})
|
||||
.then(function (clone) {
|
||||
return processClone(node, clone);
|
||||
});
|
||||
|
||||
function makeNodeCopy(node) {
|
||||
if (node instanceof HTMLCanvasElement) return util.makeImage(node.toDataURL());
|
||||
return node.cloneNode(false);
|
||||
}
|
||||
|
||||
function cloneChildren(original, clone, filter) {
|
||||
var children = original.childNodes;
|
||||
if (children.length === 0) return Promise.resolve(clone);
|
||||
|
||||
return cloneChildrenInOrder(clone, util.asArray(children), filter)
|
||||
.then(function () {
|
||||
return clone;
|
||||
});
|
||||
|
||||
function cloneChildrenInOrder(parent, children, filter) {
|
||||
var done = Promise.resolve();
|
||||
children.forEach(function (child) {
|
||||
done = done
|
||||
.then(function () {
|
||||
return cloneNode(child, filter);
|
||||
})
|
||||
.then(function (childClone) {
|
||||
if (childClone) parent.appendChild(childClone);
|
||||
});
|
||||
});
|
||||
return done;
|
||||
}
|
||||
}
|
||||
|
||||
function processClone(original, clone) {
|
||||
if (!(clone instanceof Element)) return clone;
|
||||
|
||||
return Promise.resolve()
|
||||
.then(cloneStyle)
|
||||
.then(clonePseudoElements)
|
||||
.then(copyUserInput)
|
||||
.then(fixSvg)
|
||||
.then(function () {
|
||||
return clone;
|
||||
});
|
||||
|
||||
function cloneStyle() {
|
||||
copyStyle(window.getComputedStyle(original), clone.style);
|
||||
|
||||
function copyStyle(source, target) {
|
||||
if (source.cssText) target.cssText = source.cssText;
|
||||
else copyProperties(source, target);
|
||||
|
||||
function copyProperties(source, target) {
|
||||
util.asArray(source).forEach(function (name) {
|
||||
target.setProperty(
|
||||
name,
|
||||
source.getPropertyValue(name),
|
||||
source.getPropertyPriority(name)
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function clonePseudoElements() {
|
||||
[':before', ':after'].forEach(function (element) {
|
||||
clonePseudoElement(element);
|
||||
});
|
||||
|
||||
function clonePseudoElement(element) {
|
||||
var style = window.getComputedStyle(original, element);
|
||||
var content = style.getPropertyValue('content');
|
||||
|
||||
if (content === '' || content === 'none') return;
|
||||
|
||||
var className = util.uid();
|
||||
clone.className = clone.className + ' ' + className;
|
||||
var styleElement = document.createElement('style');
|
||||
styleElement.appendChild(formatPseudoElementStyle(className, element, style));
|
||||
clone.appendChild(styleElement);
|
||||
|
||||
function formatPseudoElementStyle(className, element, style) {
|
||||
var selector = '.' + className + ':' + element;
|
||||
var cssText = style.cssText ? formatCssText(style) : formatCssProperties(style);
|
||||
return document.createTextNode(selector + '{' + cssText + '}');
|
||||
|
||||
function formatCssText(style) {
|
||||
var content = style.getPropertyValue('content');
|
||||
return style.cssText + ' content: ' + content + ';';
|
||||
}
|
||||
|
||||
function formatCssProperties(style) {
|
||||
|
||||
return util.asArray(style)
|
||||
.map(formatProperty)
|
||||
.join('; ') + ';';
|
||||
|
||||
function formatProperty(name) {
|
||||
return name + ': ' +
|
||||
style.getPropertyValue(name) +
|
||||
(style.getPropertyPriority(name) ? ' !important' : '');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function copyUserInput() {
|
||||
if (original instanceof HTMLTextAreaElement) clone.innerHTML = original.value;
|
||||
if (original instanceof HTMLInputElement) clone.setAttribute("value", original.value);
|
||||
}
|
||||
|
||||
function fixSvg() {
|
||||
if (!(clone instanceof SVGElement)) return;
|
||||
clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
|
||||
|
||||
if (!(clone instanceof SVGRectElement)) return;
|
||||
['width', 'height'].forEach(function (attribute) {
|
||||
var value = clone.getAttribute(attribute);
|
||||
if (!value) return;
|
||||
|
||||
clone.style.setProperty(attribute, value);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function embedFonts(node) {
|
||||
return fontFaces.resolveAll()
|
||||
.then(function (cssText) {
|
||||
var styleNode = document.createElement('style');
|
||||
node.appendChild(styleNode);
|
||||
styleNode.appendChild(document.createTextNode(cssText));
|
||||
return node;
|
||||
});
|
||||
}
|
||||
|
||||
function inlineImages(node) {
|
||||
return images.inlineAll(node)
|
||||
.then(function () {
|
||||
return node;
|
||||
});
|
||||
}
|
||||
|
||||
function makeSvgDataUri(node, width, height) {
|
||||
return Promise.resolve(node)
|
||||
.then(function (node) {
|
||||
node.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
|
||||
return new XMLSerializer().serializeToString(node);
|
||||
})
|
||||
.then(util.escapeXhtml)
|
||||
.then(function (xhtml) {
|
||||
return '<foreignObject x="0" y="0" width="100%" height="100%">' + xhtml + '</foreignObject>';
|
||||
})
|
||||
.then(function (foreignObject) {
|
||||
return '<svg xmlns="http://www.w3.org/2000/svg" width="' + width + '" height="' + height + '">' +
|
||||
foreignObject + '</svg>';
|
||||
})
|
||||
.then(function (svg) {
|
||||
return 'data:image/svg+xml;charset=utf-8,' + svg;
|
||||
});
|
||||
}
|
||||
|
||||
function newUtil() {
|
||||
return {
|
||||
escape: escape,
|
||||
parseExtension: parseExtension,
|
||||
mimeType: mimeType,
|
||||
dataAsUrl: dataAsUrl,
|
||||
isDataUrl: isDataUrl,
|
||||
canvasToBlob: canvasToBlob,
|
||||
resolveUrl: resolveUrl,
|
||||
getAndEncode: getAndEncode,
|
||||
uid: uid(),
|
||||
delay: delay,
|
||||
asArray: asArray,
|
||||
escapeXhtml: escapeXhtml,
|
||||
makeImage: makeImage,
|
||||
width: width,
|
||||
height: height
|
||||
};
|
||||
|
||||
function mimes() {
|
||||
/*
|
||||
* Only WOFF and EOT mime types for fonts are 'real'
|
||||
* see http://www.iana.org/assignments/media-types/media-types.xhtml
|
||||
*/
|
||||
var WOFF = 'application/font-woff';
|
||||
var JPEG = 'image/jpeg';
|
||||
|
||||
return {
|
||||
'woff': WOFF,
|
||||
'woff2': WOFF,
|
||||
'ttf': 'application/font-truetype',
|
||||
'eot': 'application/vnd.ms-fontobject',
|
||||
'png': 'image/png',
|
||||
'jpg': JPEG,
|
||||
'jpeg': JPEG,
|
||||
'gif': 'image/gif',
|
||||
'tiff': 'image/tiff',
|
||||
'svg': 'image/svg+xml'
|
||||
};
|
||||
}
|
||||
|
||||
function parseExtension(url) {
|
||||
var match = /\.([^\.\/]*?)$/g.exec(url);
|
||||
if (match) return match[1];
|
||||
else return '';
|
||||
}
|
||||
|
||||
function mimeType(url) {
|
||||
var extension = parseExtension(url).toLowerCase();
|
||||
return mimes()[extension] || '';
|
||||
}
|
||||
|
||||
function isDataUrl(url) {
|
||||
return url.search(/^(data:)/) !== -1;
|
||||
}
|
||||
|
||||
function toBlob(canvas) {
|
||||
return new Promise(function (resolve) {
|
||||
var binaryString = window.atob(canvas.toDataURL().split(',')[1]);
|
||||
var length = binaryString.length;
|
||||
var binaryArray = new Uint8Array(length);
|
||||
|
||||
for (var i = 0; i < length; i++)
|
||||
binaryArray[i] = binaryString.charCodeAt(i);
|
||||
|
||||
resolve(new Blob([binaryArray], {
|
||||
type: 'image/png'
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
function canvasToBlob(canvas) {
|
||||
if (canvas.toBlob)
|
||||
return new Promise(function (resolve) {
|
||||
canvas.toBlob(resolve);
|
||||
});
|
||||
|
||||
return toBlob(canvas);
|
||||
}
|
||||
|
||||
function resolveUrl(url, baseUrl) {
|
||||
var doc = document.implementation.createHTMLDocument();
|
||||
var base = doc.createElement('base');
|
||||
doc.head.appendChild(base);
|
||||
var a = doc.createElement('a');
|
||||
doc.body.appendChild(a);
|
||||
base.href = baseUrl;
|
||||
a.href = url;
|
||||
return a.href;
|
||||
}
|
||||
|
||||
function uid() {
|
||||
var index = 0;
|
||||
|
||||
return function () {
|
||||
return 'u' + fourRandomChars() + index++;
|
||||
|
||||
function fourRandomChars() {
|
||||
/* see http://stackoverflow.com/a/6248722/2519373 */
|
||||
return ('0000' + (Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function makeImage(uri) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
var image = new Image();
|
||||
image.onload = function () {
|
||||
resolve(image);
|
||||
};
|
||||
image.onerror = reject;
|
||||
image.src = uri;
|
||||
});
|
||||
}
|
||||
|
||||
function getAndEncode(url) {
|
||||
var TIMEOUT = 30000;
|
||||
if (domtoimage.impl.options.cacheBust) {
|
||||
// Cache bypass so we dont have CORS issues with cached images
|
||||
// Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache
|
||||
url += ((/\?/).test(url) ? "&" : "?") + (new Date()).getTime();
|
||||
}
|
||||
|
||||
return new Promise(function (resolve) {
|
||||
var request = new XMLHttpRequest();
|
||||
|
||||
request.onreadystatechange = done;
|
||||
request.ontimeout = timeout;
|
||||
request.responseType = 'blob';
|
||||
request.timeout = TIMEOUT;
|
||||
request.open('GET', url, true);
|
||||
request.send();
|
||||
|
||||
var placeholder;
|
||||
if (domtoimage.impl.options.imagePlaceholder) {
|
||||
var split = domtoimage.impl.options.imagePlaceholder.split(/,/);
|
||||
if (split && split[1]) {
|
||||
placeholder = split[1];
|
||||
}
|
||||
}
|
||||
|
||||
function done() {
|
||||
if (request.readyState !== 4) return;
|
||||
|
||||
if (request.status !== 200) {
|
||||
if (placeholder) {
|
||||
resolve(placeholder);
|
||||
} else {
|
||||
fail('cannot fetch resource: ' + url + ', status: ' + request.status);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var encoder = new FileReader();
|
||||
encoder.onloadend = function () {
|
||||
var content = encoder.result.split(/,/)[1];
|
||||
resolve(content);
|
||||
};
|
||||
encoder.readAsDataURL(request.response);
|
||||
}
|
||||
|
||||
function timeout() {
|
||||
if (placeholder) {
|
||||
resolve(placeholder);
|
||||
} else {
|
||||
fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url);
|
||||
}
|
||||
}
|
||||
|
||||
function fail(message) {
|
||||
console.error(message);
|
||||
resolve('');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function dataAsUrl(content, type) {
|
||||
return 'data:' + type + ';base64,' + content;
|
||||
}
|
||||
|
||||
function escape(string) {
|
||||
return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1');
|
||||
}
|
||||
|
||||
function delay(ms) {
|
||||
return function (arg) {
|
||||
return new Promise(function (resolve) {
|
||||
setTimeout(function () {
|
||||
resolve(arg);
|
||||
}, ms);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
function asArray(arrayLike) {
|
||||
var array = [];
|
||||
var length = arrayLike.length;
|
||||
for (var i = 0; i < length; i++) array.push(arrayLike[i]);
|
||||
return array;
|
||||
}
|
||||
|
||||
function escapeXhtml(string) {
|
||||
return string.replace(/#/g, '%23').replace(/\n/g, '%0A');
|
||||
}
|
||||
|
||||
function width(node) {
|
||||
var leftBorder = px(node, 'border-left-width');
|
||||
var rightBorder = px(node, 'border-right-width');
|
||||
return node.scrollWidth + leftBorder + rightBorder;
|
||||
}
|
||||
|
||||
function height(node) {
|
||||
var topBorder = px(node, 'border-top-width');
|
||||
var bottomBorder = px(node, 'border-bottom-width');
|
||||
return node.scrollHeight + topBorder + bottomBorder;
|
||||
}
|
||||
|
||||
function px(node, styleProperty) {
|
||||
var value = window.getComputedStyle(node).getPropertyValue(styleProperty);
|
||||
return parseFloat(value.replace('px', ''));
|
||||
}
|
||||
}
|
||||
|
||||
function newInliner() {
|
||||
var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g;
|
||||
|
||||
return {
|
||||
inlineAll: inlineAll,
|
||||
shouldProcess: shouldProcess,
|
||||
impl: {
|
||||
readUrls: readUrls,
|
||||
inline: inline
|
||||
}
|
||||
};
|
||||
|
||||
function shouldProcess(string) {
|
||||
return string.search(URL_REGEX) !== -1;
|
||||
}
|
||||
|
||||
function readUrls(string) {
|
||||
var result = [];
|
||||
var match;
|
||||
while ((match = URL_REGEX.exec(string)) !== null) {
|
||||
result.push(match[1]);
|
||||
}
|
||||
return result.filter(function (url) {
|
||||
return !util.isDataUrl(url);
|
||||
});
|
||||
}
|
||||
|
||||
function inline(string, url, baseUrl, get) {
|
||||
return Promise.resolve(url)
|
||||
.then(function (url) {
|
||||
return baseUrl ? util.resolveUrl(url, baseUrl) : url;
|
||||
})
|
||||
.then(get || util.getAndEncode)
|
||||
.then(function (data) {
|
||||
return util.dataAsUrl(data, util.mimeType(url));
|
||||
})
|
||||
.then(function (dataUrl) {
|
||||
return string.replace(urlAsRegex(url), '$1' + dataUrl + '$3');
|
||||
});
|
||||
|
||||
function urlAsRegex(url) {
|
||||
return new RegExp('(url\\([\'"]?)(' + util.escape(url) + ')([\'"]?\\))', 'g');
|
||||
}
|
||||
}
|
||||
|
||||
function inlineAll(string, baseUrl, get) {
|
||||
if (nothingToInline()) return Promise.resolve(string);
|
||||
|
||||
return Promise.resolve(string)
|
||||
.then(readUrls)
|
||||
.then(function (urls) {
|
||||
var done = Promise.resolve(string);
|
||||
urls.forEach(function (url) {
|
||||
done = done.then(function (string) {
|
||||
return inline(string, url, baseUrl, get);
|
||||
});
|
||||
});
|
||||
return done;
|
||||
});
|
||||
|
||||
function nothingToInline() {
|
||||
return !shouldProcess(string);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function newFontFaces() {
|
||||
return {
|
||||
resolveAll: resolveAll,
|
||||
impl: {
|
||||
readAll: readAll
|
||||
}
|
||||
};
|
||||
|
||||
function resolveAll() {
|
||||
return readAll(document)
|
||||
.then(function (webFonts) {
|
||||
return Promise.all(
|
||||
webFonts.map(function (webFont) {
|
||||
return webFont.resolve();
|
||||
})
|
||||
);
|
||||
})
|
||||
.then(function (cssStrings) {
|
||||
return cssStrings.join('\n');
|
||||
});
|
||||
}
|
||||
|
||||
function readAll() {
|
||||
return Promise.resolve(util.asArray(document.styleSheets))
|
||||
.then(getCssRules)
|
||||
.then(selectWebFontRules)
|
||||
.then(function (rules) {
|
||||
return rules.map(newWebFont);
|
||||
});
|
||||
|
||||
function selectWebFontRules(cssRules) {
|
||||
return cssRules
|
||||
.filter(function (rule) {
|
||||
return rule.type === CSSRule.FONT_FACE_RULE;
|
||||
})
|
||||
.filter(function (rule) {
|
||||
return inliner.shouldProcess(rule.style.getPropertyValue('src'));
|
||||
});
|
||||
}
|
||||
|
||||
function getCssRules(styleSheets) {
|
||||
var cssRules = [];
|
||||
styleSheets.forEach(function (sheet) {
|
||||
try {
|
||||
util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules));
|
||||
} catch (e) {
|
||||
console.log('Error while reading CSS rules from ' + sheet.href, e.toString());
|
||||
}
|
||||
});
|
||||
return cssRules;
|
||||
}
|
||||
|
||||
function newWebFont(webFontRule) {
|
||||
return {
|
||||
resolve: function resolve() {
|
||||
var baseUrl = (webFontRule.parentStyleSheet || {}).href;
|
||||
return inliner.inlineAll(webFontRule.cssText, baseUrl);
|
||||
},
|
||||
src: function () {
|
||||
return webFontRule.style.getPropertyValue('src');
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function newImages() {
|
||||
return {
|
||||
inlineAll: inlineAll,
|
||||
impl: {
|
||||
newImage: newImage
|
||||
}
|
||||
};
|
||||
|
||||
function newImage(element) {
|
||||
return {
|
||||
inline: inline
|
||||
};
|
||||
|
||||
function inline(get) {
|
||||
if (util.isDataUrl(element.src)) return Promise.resolve();
|
||||
|
||||
return Promise.resolve(element.src)
|
||||
.then(get || util.getAndEncode)
|
||||
.then(function (data) {
|
||||
return util.dataAsUrl(data, util.mimeType(element.src));
|
||||
})
|
||||
.then(function (dataUrl) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
element.onload = resolve;
|
||||
element.onerror = reject;
|
||||
element.src = dataUrl;
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function inlineAll(node) {
|
||||
if (!(node instanceof Element)) return Promise.resolve(node);
|
||||
|
||||
return inlineBackground(node)
|
||||
.then(function () {
|
||||
if (node instanceof HTMLImageElement)
|
||||
return newImage(node).inline();
|
||||
else
|
||||
return Promise.all(
|
||||
util.asArray(node.childNodes).map(function (child) {
|
||||
return inlineAll(child);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
function inlineBackground(node) {
|
||||
var background = node.style.getPropertyValue('background');
|
||||
|
||||
if (!background) return Promise.resolve(node);
|
||||
|
||||
return inliner.inlineAll(background)
|
||||
.then(function (inlined) {
|
||||
node.style.setProperty(
|
||||
'background',
|
||||
inlined,
|
||||
node.style.getPropertyPriority('background')
|
||||
);
|
||||
})
|
||||
.then(function () {
|
||||
return node;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
})(this);
|
@ -40,7 +40,8 @@ import {
|
||||
|
||||
import { log } from '../logger';
|
||||
|
||||
const REPORTING_PATH = '../../../../optimize/wazuh-reporting';
|
||||
const BASE_OPTIMIZE_PATH = '../../../../optimize';
|
||||
const REPORTING_PATH = `${BASE_OPTIMIZE_PATH}/wazuh/downloads/reports`;
|
||||
|
||||
export class WazuhReportingCtrl {
|
||||
/**
|
||||
@ -139,7 +140,7 @@ export class WazuhReportingCtrl {
|
||||
return {
|
||||
columns: [
|
||||
{
|
||||
text: 'Copyright © 2019 Wazuh, Inc.',
|
||||
text: 'Copyright © 2020 Wazuh, Inc.',
|
||||
color: '#1EA5C8',
|
||||
margin: [40, 40, 0, 0]
|
||||
},
|
||||
@ -185,11 +186,7 @@ export class WazuhReportingCtrl {
|
||||
log('reporting:renderTables', `isVis: ${isVis}`, 'debug');
|
||||
for (const table of tables) {
|
||||
let rowsparsed = [];
|
||||
if (isVis) {
|
||||
rowsparsed = rawParser(table.rawResponse, table.columns);
|
||||
} else {
|
||||
rowsparsed = table.rows;
|
||||
}
|
||||
rowsparsed = table.rows;
|
||||
if (Array.isArray(rowsparsed) && rowsparsed.length) {
|
||||
const rows =
|
||||
rowsparsed.length > 100 ? rowsparsed.slice(0, 99) : rowsparsed;
|
||||
@ -204,8 +201,8 @@ export class WazuhReportingCtrl {
|
||||
parseInt(a[a.length - 1]) < parseInt(b[b.length - 1])
|
||||
? 1
|
||||
: parseInt(a[a.length - 1]) > parseInt(b[b.length - 1])
|
||||
? -1
|
||||
: 0;
|
||||
? -1
|
||||
: 0;
|
||||
|
||||
TimSort.sort(rows, sortFunction);
|
||||
|
||||
@ -360,9 +357,9 @@ export class WazuhReportingCtrl {
|
||||
const seconds = date.getSeconds();
|
||||
const str = `${year}-${month < 10 ? '0' + month : month}-${
|
||||
day < 10 ? '0' + day : day
|
||||
}T${hours < 10 ? '0' + hours : hours}:${
|
||||
}T${hours < 10 ? '0' + hours : hours}:${
|
||||
minutes < 10 ? '0' + minutes : minutes
|
||||
}:${seconds < 10 ? '0' + seconds : seconds}`;
|
||||
}:${seconds < 10 ? '0' + seconds : seconds}`;
|
||||
log('reporting:formatDate', `str: ${str}`, 'debug');
|
||||
return str;
|
||||
}
|
||||
@ -463,19 +460,15 @@ export class WazuhReportingCtrl {
|
||||
|
||||
const len = filters.length;
|
||||
for (let i = 0; i < len; i++) {
|
||||
const filter = filters[i];
|
||||
|
||||
str +=
|
||||
i === len - 1
|
||||
? (filter.meta.negate ? 'NOT ' : '') +
|
||||
filter.meta.key +
|
||||
': ' +
|
||||
filter.meta.value
|
||||
: (filter.meta.negate ? 'NOT ' : '') +
|
||||
filter.meta.key +
|
||||
': ' +
|
||||
filter.meta.value +
|
||||
' AND ';
|
||||
const { negate, key, value, params, type } = filters[i].meta;
|
||||
str += `${negate ? 'NOT ' : ''}`;
|
||||
str += `${key}: `;
|
||||
str += `${type === 'range'
|
||||
? `${params.gte}-${params.lt}`
|
||||
: !!value
|
||||
? value
|
||||
: (params || {}).query}`;
|
||||
str += `${i === len - 1 ? '' : ' AND ' }`;
|
||||
}
|
||||
|
||||
if (searchBar) {
|
||||
@ -596,7 +589,7 @@ export class WazuhReportingCtrl {
|
||||
log(
|
||||
'reporting:checkTitle',
|
||||
`Item ID ${item.id}, from ${
|
||||
isAgents ? 'agents' : 'overview'
|
||||
isAgents ? 'agents' : 'overview'
|
||||
} and tab ${tab}`,
|
||||
'info'
|
||||
);
|
||||
@ -1558,7 +1551,7 @@ export class WazuhReportingCtrl {
|
||||
if (hardware.data.ram && hardware.data.ram.total)
|
||||
ulcustom.push(
|
||||
Number(hardware.data.ram.total / 1024 / 1024).toFixed(2) +
|
||||
'GB RAM'
|
||||
'GB RAM'
|
||||
);
|
||||
ulcustom &&
|
||||
ulcustom.length &&
|
||||
@ -1743,8 +1736,8 @@ export class WazuhReportingCtrl {
|
||||
plainData[key] =
|
||||
Array.isArray(data[key]) && typeof data[key][0] !== 'object'
|
||||
? data[key].map(x => {
|
||||
return typeof x === 'object' ? JSON.stringify(x) : x + '\n';
|
||||
})
|
||||
return typeof x === 'object' ? JSON.stringify(x) : x + '\n';
|
||||
})
|
||||
: data[key];
|
||||
} else if (
|
||||
Array.isArray(data[key]) &&
|
||||
@ -1764,7 +1757,7 @@ export class WazuhReportingCtrl {
|
||||
title: (section.options || {}).hideHeader
|
||||
? ''
|
||||
: (section.tabs || [])[tab] ||
|
||||
(section.isGroupConfig ? ((section.labels || [])[0] || [])[tab] : ''),
|
||||
(section.isGroupConfig ? ((section.labels || [])[0] || [])[tab] : ''),
|
||||
columns: ['', ''],
|
||||
type: 'config',
|
||||
rows: this.getConfigRows(plainData, (section.labels || [])[0])
|
||||
@ -1782,10 +1775,10 @@ export class WazuhReportingCtrl {
|
||||
typeof x[key] !== 'object'
|
||||
? x[key]
|
||||
: Array.isArray(x[key])
|
||||
? x[key].map(x => {
|
||||
? x[key].map(x => {
|
||||
return x + '\n';
|
||||
})
|
||||
: JSON.stringify(x[key])
|
||||
: JSON.stringify(x[key])
|
||||
);
|
||||
}
|
||||
while (row.length < columns.length) {
|
||||
@ -1820,6 +1813,12 @@ export class WazuhReportingCtrl {
|
||||
// Init
|
||||
this.printer = new PdfPrinter(this.fonts);
|
||||
this.dd.content = [];
|
||||
if (!fs.existsSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh`))) {
|
||||
fs.mkdirSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh`));
|
||||
}
|
||||
if (!fs.existsSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh/downloads`))) {
|
||||
fs.mkdirSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh/downloads`));
|
||||
}
|
||||
if (!fs.existsSync(path.join(__dirname, REPORTING_PATH))) {
|
||||
fs.mkdirSync(path.join(__dirname, REPORTING_PATH));
|
||||
}
|
||||
@ -1977,10 +1976,10 @@ export class WazuhReportingCtrl {
|
||||
typeof x[key] !== 'object'
|
||||
? x[key]
|
||||
: Array.isArray(x[key])
|
||||
? x[key].map(x => {
|
||||
? x[key].map(x => {
|
||||
return x + '\n';
|
||||
})
|
||||
: JSON.stringify(x[key])
|
||||
: JSON.stringify(x[key])
|
||||
);
|
||||
});
|
||||
return row;
|
||||
@ -2047,7 +2046,7 @@ export class WazuhReportingCtrl {
|
||||
columns.forEach(y => {
|
||||
if (y !== '') {
|
||||
y = y !== "check_whodata" ? y : 'whodata';
|
||||
row.push(x[y] ? 'yes' : 'no');
|
||||
row.push(x[y] ? x[y] : 'no');
|
||||
}
|
||||
});
|
||||
row.push(x.recursion_level);
|
||||
@ -2166,7 +2165,7 @@ export class WazuhReportingCtrl {
|
||||
data &&
|
||||
data.data &&
|
||||
Object.keys(data.data[Object.keys(data.data)[0]]).length >
|
||||
0
|
||||
0
|
||||
) {
|
||||
if (!titleOfSection) {
|
||||
this.dd.content.push({
|
||||
@ -2218,10 +2217,10 @@ export class WazuhReportingCtrl {
|
||||
typeof x[key] !== 'object'
|
||||
? x[key]
|
||||
: Array.isArray(x[key])
|
||||
? x[key].map(x => {
|
||||
? x[key].map(x => {
|
||||
return x + '\n';
|
||||
})
|
||||
: JSON.stringify(x[key])
|
||||
: JSON.stringify(x[key])
|
||||
);
|
||||
});
|
||||
return row;
|
||||
@ -2403,22 +2402,22 @@ export class WazuhReportingCtrl {
|
||||
agentOs === 'windows'
|
||||
? ['Name', 'Architecture', 'Version', 'Vendor']
|
||||
: [
|
||||
'Name',
|
||||
'Architecture',
|
||||
'Version',
|
||||
'Vendor',
|
||||
'Description'
|
||||
],
|
||||
'Name',
|
||||
'Architecture',
|
||||
'Version',
|
||||
'Vendor',
|
||||
'Description'
|
||||
],
|
||||
rows: packages.data.items.map(x => {
|
||||
return agentOs === 'windows'
|
||||
? [x['name'], x['architecture'], x['version'], x['vendor']]
|
||||
: [
|
||||
x['name'],
|
||||
x['architecture'],
|
||||
x['version'],
|
||||
x['vendor'],
|
||||
x['description']
|
||||
];
|
||||
x['name'],
|
||||
x['architecture'],
|
||||
x['version'],
|
||||
x['vendor'],
|
||||
x['description']
|
||||
];
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -2448,11 +2447,11 @@ export class WazuhReportingCtrl {
|
||||
return agentOs === 'windows'
|
||||
? [x['name'], x['cmd'], x['priority'], x['nlwp']]
|
||||
: [
|
||||
x['name'],
|
||||
x['euser'],
|
||||
x['nice'],
|
||||
ProcessEquivalence[x.state]
|
||||
];
|
||||
x['name'],
|
||||
x['euser'],
|
||||
x['nice'],
|
||||
ProcessEquivalence[x.state]
|
||||
];
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -2482,18 +2481,18 @@ export class WazuhReportingCtrl {
|
||||
rows: ports.data.items.map(x => {
|
||||
return agentOs === 'windows'
|
||||
? [
|
||||
x['local']['ip'],
|
||||
x['local']['port'],
|
||||
x['process'],
|
||||
x['state'],
|
||||
x['protocol']
|
||||
]
|
||||
x['local']['ip'],
|
||||
x['local']['port'],
|
||||
x['process'],
|
||||
x['state'],
|
||||
x['protocol']
|
||||
]
|
||||
: [
|
||||
x['local']['ip'],
|
||||
x['local']['port'],
|
||||
x['state'],
|
||||
x['protocol']
|
||||
];
|
||||
x['local']['ip'],
|
||||
x['local']['port'],
|
||||
x['state'],
|
||||
x['protocol']
|
||||
];
|
||||
})
|
||||
});
|
||||
}
|
||||
@ -2665,6 +2664,13 @@ export class WazuhReportingCtrl {
|
||||
async getReports(req, reply) {
|
||||
try {
|
||||
log('reporting:report', `Fetching created reports`, 'info');
|
||||
|
||||
if (!fs.existsSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh`))) {
|
||||
fs.mkdirSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh`));
|
||||
}
|
||||
if (!fs.existsSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh/downloads`))) {
|
||||
fs.mkdirSync(path.join(__dirname, `${BASE_OPTIMIZE_PATH}/wazuh/downloads`));
|
||||
}
|
||||
if (!fs.existsSync(path.join(__dirname, REPORTING_PATH))) {
|
||||
fs.mkdirSync(path.join(__dirname, REPORTING_PATH));
|
||||
}
|
||||
|
@ -72,8 +72,8 @@ export class WazuhUtilsCtrl {
|
||||
async getAppLogs(req, reply) {
|
||||
try {
|
||||
const lastLogs = await simpleTail(
|
||||
path.join(__dirname, '../../../../optimize/wazuh-logs/wazuhapp.log'),
|
||||
20
|
||||
path.join(__dirname, '../../../../optimize/wazuh/logs/wazuhapp.log'),
|
||||
50
|
||||
);
|
||||
return lastLogs && Array.isArray(lastLogs)
|
||||
? {
|
||||
|
@ -382,4 +382,4 @@ export function Initialize(server) {
|
||||
|
||||
// Check Kibana index and if it is prepared, start the initialization of Wazuh App.
|
||||
checkStatus();
|
||||
}
|
||||
}
|
@ -79,5 +79,9 @@ export const pciRequirementsFile = {
|
||||
'11.4':
|
||||
'Use intrusion detection and/or intrusion prevention techniques to detect and/or prevent intrusions into the network.Monitor all traffic at the perimeter of the cardholder data environment as well as at critical points in the cardholder data environment, and alert personnel to suspected compromises. Keep all intrusion detection and prevention engines, baselines, and signatures up to date.',
|
||||
'11.5':
|
||||
'Deploy a change detection mechanism (for example, file integrity monitoring tools) to alert personnel to unauthorized modification of critical system files, configuration files, or content files; and configure the software to perform critical file comparisons at least weekly.'
|
||||
'Deploy a change detection mechanism (for example, file integrity monitoring tools) to alert personnel to unauthorized modification of critical system files, configuration files, or content files; and configure the software to perform critical file comparisons at least weekly.',
|
||||
'11.2.1':
|
||||
'Perform quarterly internal vulnerability scans. Address vulnerabilities and perform rescans to verify all “high risk” vulnerabilities are resolved in accordance with the entity’s vulnerability ranking. Scans must be performed by qualified personnel.',
|
||||
'11.2.3':
|
||||
'Perform internal and external scans, and rescans as needed, after any significant change. Scans must be performed by qualified personnel.',
|
||||
};
|
||||
|
@ -104,10 +104,11 @@ export default [
|
||||
"index": "wazuh-alerts",
|
||||
"type": "phrases",
|
||||
"key": "rule.groups",
|
||||
"value": "authentication_failed, authentication_failures",
|
||||
"value": "win_authentication_failed, authentication_failed, authentication_failures",
|
||||
"params": [
|
||||
"win_authentication_failed",
|
||||
"authentication_failed",
|
||||
"win_authentication_failed"
|
||||
"authentication_failures"
|
||||
],
|
||||
"negate": false,
|
||||
"disabled": false,
|
||||
@ -116,6 +117,11 @@ export default [
|
||||
"query": {
|
||||
"bool": {
|
||||
"should": [
|
||||
{
|
||||
"match_phrase": {
|
||||
"rule.groups": "win_authentication_failed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"match_phrase": {
|
||||
"rule.groups": "authentication_failed"
|
||||
@ -123,7 +129,7 @@ export default [
|
||||
},
|
||||
{
|
||||
"match_phrase": {
|
||||
"rule.groups": "win_authentication_failed"
|
||||
"rule.groups": "authentication_failures"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
@ -33,9 +33,9 @@ export default [
|
||||
_source: {
|
||||
title: 'Geolocation map',
|
||||
visState:
|
||||
'{"title":"Geolocation map","type":"tile_map","params":{"colorSchema":"Green to Red","mapType":"Scaled Circle Markers","isDesaturated":true,"addTooltip":true,"heatClusterSize":1.5,"legendPosition":"bottomright","mapZoom":2,"mapCenter":[0,0],"wms":{"enabled":false,"options":{"format":"image/png","transparent":true},"selectedTmsLayer":{"origin":"self_hosted","id":"road_map","minZoom":0,"maxZoom":10,"attribution":"<p>© <a href=\\"http://www.openstreetmap.org/copyright\\">OpenStreetMap</a> contributors | <a href=\\"https://openmaptiles.org/\\">OpenMapTiles</a> | <a href=\\"https://www.maptiler.com/\\">MapTiler</a> | <a href=\\"https://www.elastic.co/elastic-maps-service\\">Elastic Maps Service</a></p> "}}},"aggs":[{"id":"1","enabled":true,"type":"count","schema":"metric","params":{}},{"id":"2","enabled":true,"type":"geohash_grid","schema":"segment","params":{"field":"GeoLocation.location","autoPrecision":true,"isFilteredByCollar":true,"useGeocentroid":true,"mapZoom":4,"mapCenter":{"lon":-47.83150001429022,"lat":40.315046945235984},"mapBounds":{"bottom_right":{"lat":2.8991526985043135,"lon":11.513671875000002},"top_left":{"lat":64.58618480339979,"lon":-107.138671875}},"precision":2}}]}',
|
||||
'{"title":"Geolocation map","type":"tile_map","params":{"colorSchema":"Green to Red","mapType":"Scaled Circle Markers","isDesaturated":false,"addTooltip":true,"heatClusterSize":1.5,"legendPosition":"bottomright","mapZoom":1,"mapCenter":[0,0],"wms":{"enabled":false,"options":{"format":"image/png","transparent":true}},"dimensions":{"metric":{"accessor":1,"format":{"id":"number"},"params":{},"aggType":"count"},"geohash":{"accessor":0,"format":{"id":"string"},"params":{"precision":2,"useGeocentroid":true},"aggType":"geohash_grid"},"geocentroid":{"accessor":2,"format":{"id":"string"},"params":{},"aggType":"geo_centroid"}}},"aggs":[{"id":"1","enabled":true,"type":"count","schema":"metric","params":{}},{"id":"2","enabled":true,"type":"geohash_grid","schema":"segment","params":{"field":"GeoLocation.location","autoPrecision":true,"precision":2,"useGeocentroid":true,"isFilteredByCollar":true,"mapZoom":1,"mapCenter":[0,0]}}]}',
|
||||
uiStateJSON:
|
||||
'{"mapZoom":3,"mapCenter":[38.685509760012025,-31.816406250000004]}',
|
||||
'{"mapZoom":1,"mapCenter":[38.685509760012025,-31.816406250000004]}',
|
||||
description: '',
|
||||
version: 1,
|
||||
kibanaSavedObjectMeta: {
|
||||
|
@ -105,8 +105,9 @@ export default [
|
||||
"index": "wazuh-alerts",
|
||||
"type": "phrases",
|
||||
"key": "rule.groups",
|
||||
"value": "authentication_failed, authentication_failures",
|
||||
"value": "win_authentication_failed, authentication_failed, authentication_failures",
|
||||
"params": [
|
||||
"win_authentication_failed",
|
||||
"authentication_failed",
|
||||
"authentication_failures"
|
||||
],
|
||||
@ -117,6 +118,11 @@ export default [
|
||||
"query": {
|
||||
"bool": {
|
||||
"should": [
|
||||
{
|
||||
"match_phrase": {
|
||||
"rule.groups": "win_authentication_failed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"match_phrase": {
|
||||
"rule.groups": "authentication_failed"
|
||||
@ -243,7 +249,7 @@ export default [
|
||||
title: 'Top 5 rule groups',
|
||||
visState:
|
||||
'{"title":"Top 5 rule groups","type":"pie","params":{"type":"pie","addTooltip":true,"addLegend":true,"legendPosition":"right","isDonut":true,"labels":{"show":false,"values":true,"last_level":true,"truncate":100}},"aggs":[{"id":"1","enabled":true,"type":"count","schema":"metric","params":{}},{"id":"2","enabled":true,"type":"terms","schema":"segment","params":{"field":"rule.groups","size":5,"order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","missingBucket":false,"missingBucketLabel":"Missing"}}]}',
|
||||
uiStateJSON: '{"vis":{"legendOpen":false}}',
|
||||
uiStateJSON: '{"vis":{"legendOpen":true}}',
|
||||
description: '',
|
||||
version: 1,
|
||||
kibanaSavedObjectMeta: {
|
||||
|
@ -944,4 +944,4 @@ export class ElasticWrapper {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -14,12 +14,12 @@ import yml from 'js-yaml';
|
||||
import path from 'path';
|
||||
let cachedConfiguration = null;
|
||||
let lastAssign = new Date().getTime();
|
||||
export function getConfiguration() {
|
||||
export function getConfiguration(isUpdating = false) {
|
||||
try {
|
||||
const now = new Date().getTime();
|
||||
const dateDiffer = now - lastAssign;
|
||||
if (!cachedConfiguration || dateDiffer >= 10000) {
|
||||
const customPath = path.join(__dirname, '../../wazuh.yml');
|
||||
if (!cachedConfiguration || dateDiffer >= 10000 || isUpdating) {
|
||||
const customPath = path.join(__dirname, '../../../../optimize/wazuh/config/wazuh.yml');
|
||||
const raw = fs.readFileSync(customPath, { encoding: 'utf-8' });
|
||||
const file = yml.load(raw);
|
||||
cachedConfiguration = { ...file };
|
||||
@ -29,4 +29,4 @@ export function getConfiguration() {
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,16 @@
|
||||
---
|
||||
/*
|
||||
* Wazuh app - Initial basic configuration file
|
||||
* Copyright (C) 2015-2019 Wazuh, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Find more information about this on the LICENSE file.
|
||||
*/
|
||||
|
||||
export const initialWazuhConfig = `---
|
||||
#
|
||||
# Wazuh app - App configuration file
|
||||
# Copyright (C) 2015-2019 Wazuh, Inc.
|
||||
@ -31,6 +43,7 @@
|
||||
#checks.template: true
|
||||
#checks.api : true
|
||||
#checks.setup : true
|
||||
#checks.fields : true
|
||||
#
|
||||
# --------------------------------- Extensions ---------------------------------
|
||||
#
|
||||
@ -108,6 +121,10 @@
|
||||
# ------------------------------- App privileges --------------------------------
|
||||
#admin: true
|
||||
#
|
||||
# ---------------------------- Hide manager alerts ------------------------------
|
||||
# Hide the alerts of the manager in all dashboards and discover
|
||||
#hideManagerAlerts: false
|
||||
#
|
||||
# ------------------------------- App logging level -----------------------------
|
||||
# Set the logging level for the Wazuh App log files.
|
||||
# Default value: info
|
||||
@ -126,7 +143,9 @@
|
||||
|
||||
hosts:
|
||||
- default:
|
||||
url: http://localhost
|
||||
url: https://localhost
|
||||
port: 55000
|
||||
user: foo
|
||||
password: bar
|
||||
password: bar
|
||||
|
||||
`
|
@ -14,12 +14,16 @@ import yml from 'js-yaml';
|
||||
import path from 'path';
|
||||
import { log } from '../logger';
|
||||
import { UpdateRegistry } from './update-registry';
|
||||
import { initialWazuhConfig } from './initial-wazuh-config'
|
||||
|
||||
const BASE_LOGS_PATH = '../../../../optimize/wazuh';
|
||||
|
||||
export class ManageHosts {
|
||||
constructor() {
|
||||
this.busy = false;
|
||||
this.file = path.join(__dirname, '../../wazuh.yml');
|
||||
this.file = path.join(__dirname, `${BASE_LOGS_PATH}/config/wazuh.yml`);
|
||||
this.updateRegistry = new UpdateRegistry();
|
||||
this.initialConfig = initialWazuhConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -64,6 +68,15 @@ export class ManageHosts {
|
||||
try {
|
||||
this.checkBusy();
|
||||
this.busy = true;
|
||||
if (!fs.existsSync(path.join(__dirname, BASE_LOGS_PATH))) {
|
||||
fs.mkdirSync(path.join(__dirname, BASE_LOGS_PATH));
|
||||
}
|
||||
if (!fs.existsSync(path.join(__dirname, `${BASE_LOGS_PATH}/config`))) {
|
||||
fs.mkdirSync(path.join(__dirname, `${BASE_LOGS_PATH}/config`));
|
||||
}
|
||||
if (!fs.existsSync(path.join(__dirname, '../../../../optimize/wazuh/config/wazuh.yml'))) {
|
||||
await fs.writeFileSync(this.file, this.initialConfig, 'utf8');
|
||||
}
|
||||
const raw = fs.readFileSync(this.file, { encoding: 'utf-8' });
|
||||
this.busy = false;
|
||||
const content = yml.load(raw);
|
||||
|
@ -29,7 +29,7 @@ const needRestartFields = [
|
||||
export class UpdateConfigurationFile {
|
||||
constructor() {
|
||||
this.busy = false;
|
||||
this.file = path.join(__dirname, '../../wazuh.yml');
|
||||
this.file = path.join(__dirname, '../../../../optimize/wazuh/config/wazuh.yml');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -64,7 +64,7 @@ export class UpdateConfigurationFile {
|
||||
throw new Error('Another process is updating the configuration file');
|
||||
}
|
||||
this.busy = true;
|
||||
const configuration = getConfiguration() || {};
|
||||
const configuration = getConfiguration(true) || {};
|
||||
const adminUndefined = !Object.keys(configuration).includes('admin');
|
||||
const adminIsTrue = configuration.admin;
|
||||
|
||||
|
@ -17,6 +17,9 @@ import { getConfiguration } from './lib/get-configuration';
|
||||
let allowed = false;
|
||||
let wazuhlogger = undefined;
|
||||
let wazuhPlainLogger = undefined;
|
||||
const logsBasePath = '../../../optimize/wazuh/logs'
|
||||
const plainLogFilePath = `${logsBasePath}/wazuhapp-plain.log`
|
||||
const rawLogFilePath = `${logsBasePath}/wazuhapp.log`
|
||||
|
||||
/**
|
||||
* Here we create the loggers
|
||||
@ -37,7 +40,7 @@ const initLogger = () => {
|
||||
new winston.transports.File({
|
||||
filename: path.join(
|
||||
__dirname,
|
||||
'../../../optimize/wazuh-logs/wazuhapp.log'
|
||||
rawLogFilePath
|
||||
)
|
||||
})
|
||||
]
|
||||
@ -54,7 +57,7 @@ const initLogger = () => {
|
||||
new winston.transports.File({
|
||||
filename: path.join(
|
||||
__dirname,
|
||||
'../../../optimize/wazuh-logs/wazuhapp-plain.log'
|
||||
plainLogFilePath
|
||||
)
|
||||
})
|
||||
]
|
||||
@ -65,12 +68,16 @@ const initLogger = () => {
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks if wazuh-logs exists. If it doesn't exist, it will be created.
|
||||
* Checks if wazuh/logs exists. If it doesn't exist, it will be created.
|
||||
*/
|
||||
const initDirectory = async () => {
|
||||
try {
|
||||
if (!fs.existsSync(path.join(__dirname, '../../../optimize/wazuh-logs'))) {
|
||||
fs.mkdirSync(path.join(__dirname, '../../../optimize/wazuh-logs'));
|
||||
|
||||
if (!fs.existsSync(path.join(__dirname, '../../../optimize/wazuh'))) {
|
||||
fs.mkdirSync(path.join(__dirname, '../../../optimize/wazuh'));
|
||||
}
|
||||
if (!fs.existsSync(path.join(__dirname, logsBasePath))) {
|
||||
fs.mkdirSync(path.join(__dirname, logsBasePath));
|
||||
}
|
||||
if (
|
||||
typeof wazuhlogger === 'undefined' ||
|
||||
@ -109,18 +116,18 @@ const checkFiles = () => {
|
||||
if (allowed) {
|
||||
if (
|
||||
getFilesizeInMegaBytes(
|
||||
path.join(__dirname, '../../../optimize/wazuh-logs/wazuhapp.log')
|
||||
path.join(__dirname, rawLogFilePath)
|
||||
) >= 100
|
||||
) {
|
||||
fs.renameSync(
|
||||
path.join(__dirname, '../../../optimize/wazuh-logs/wazuhapp.log'),
|
||||
path.join(__dirname, rawLogFilePath),
|
||||
path.join(
|
||||
__dirname,
|
||||
`../../../optimize/wazuh-logs/wazuhapp.${new Date().getTime()}.log`
|
||||
`${logsBasePath}/wazuhapp.${new Date().getTime()}.log`
|
||||
)
|
||||
);
|
||||
fs.writeFileSync(
|
||||
path.join(__dirname, '../../../optimize/wazuh-logs/wazuhapp.log'),
|
||||
path.join(__dirname, rawLogFilePath),
|
||||
JSON.stringify({
|
||||
date: new Date(),
|
||||
level: 'info',
|
||||
@ -131,14 +138,14 @@ const checkFiles = () => {
|
||||
}
|
||||
if (
|
||||
getFilesizeInMegaBytes(
|
||||
path.join(__dirname, '../../../optimize/wazuh-logs/wazuhapp-plain.log')
|
||||
path.join(__dirname, plainLogFilePath)
|
||||
) >= 100
|
||||
) {
|
||||
fs.renameSync(
|
||||
path.join(__dirname, '../../../optimize/wazuh-logs/wazuhapp-plain.log'),
|
||||
path.join(__dirname, plainLogFilePath),
|
||||
path.join(
|
||||
__dirname,
|
||||
`../../../optimize/wazuh-logs/wazuhapp-plain.${new Date().getTime()}.log`
|
||||
`${plainLogFilePath}.${new Date().getTime()}.log`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -65,9 +65,9 @@ export class VulnerabilityRequest {
|
||||
base,
|
||||
this.namespace
|
||||
);
|
||||
const aggArray = response.aggregations['2'].buckets;
|
||||
const { buckets } = (response.aggregations || {})['2'] || {};
|
||||
|
||||
return aggArray.map(item => item.key);
|
||||
return (buckets || []).map(item => item.key);
|
||||
} catch (error) {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
@ -102,9 +102,9 @@ export class VulnerabilityRequest {
|
||||
base,
|
||||
this.namespace
|
||||
);
|
||||
const aggArray = response.aggregations['2'].buckets;
|
||||
const { buckets } = (response.aggregations || {})['2'] || {};
|
||||
|
||||
return aggArray.map(item => item.key);
|
||||
return (buckets || []).map(item => item.key);
|
||||
} catch (error) {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
@ -199,9 +199,9 @@ export class VulnerabilityRequest {
|
||||
base,
|
||||
this.namespace
|
||||
);
|
||||
const { buckets } = response.aggregations['2'];
|
||||
const { buckets } = (response.aggregations || {})['2'] || {};
|
||||
|
||||
return buckets.map(item => ({ package: item.key, severity: severity }));
|
||||
return (buckets || []).map(item => ({ package: item.key, severity: severity }));
|
||||
} catch (error) {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
@ -254,9 +254,9 @@ export class VulnerabilityRequest {
|
||||
base,
|
||||
this.namespace
|
||||
);
|
||||
const { buckets } = response.aggregations['2'];
|
||||
const { buckets } = (response.aggregations || {})['2'] || {};
|
||||
|
||||
return buckets.map(item => ({
|
||||
return (buckets || []).map(item => ({
|
||||
package: item.key,
|
||||
references: item['3'].buckets.map(ref => ref.key)
|
||||
}));
|
||||
|
Loading…
Reference in New Issue
Block a user