From 7ec84df1a98ebf6c3176f4ba3112abd4e52f86a6 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:44:39 -0400 Subject: [PATCH 001/107] Create gvm-feed-sync-docs The first version of a comprehensive feed synchronization documentation. --- gvm-feed-sync-docs | 185 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 gvm-feed-sync-docs diff --git a/gvm-feed-sync-docs b/gvm-feed-sync-docs new file mode 100644 index 00000000..a3929f69 --- /dev/null +++ b/gvm-feed-sync-docs @@ -0,0 +1,185 @@ + +# Greenbone Feed Sync Update Guide + +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. + +If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. + +## A Note About Deprecated Sync Scripts +The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: +``` +$ which +``` +- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. +- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. +- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. +- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. + +### Deprecated Sync Scripts Removal +**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + +## Introduction Of The New Python Feed Sync Script +A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. + +The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). + +### Installation +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. + +#### Install using pipx +You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) +``` +$ python3 -m pipx install pontos +``` + +#### Install using pip +NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. + +You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) +``` +$ python3 -m pip install greenbone-feed-sync +``` + +## Instructions For Updating the Greenbone Feeds + +### Determine Which Command Is In Use +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. + +For example: +``` +$ which greenbone-feed-sync +/usr/local/bin/greenbone-feed-sync +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. + +For example: +``` +# If the new Python-based feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/usr/bin/python3 +``` +``` +# If the legacy bash feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/bin/sh +``` + +### Updating Feeds With New Python Script +By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. +``` +# Update all feeds with single command +$ sudo greenbone-feed-sync +``` +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. +``` +# Include the feed type as an argument to update only a specific feed type +$ greenbone-feed-sync --type +``` +The available feed types are: + +* `all`: same as using the command without specifying a type +* `nvt`: Fetches any newly available vulnerability tests +* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `scap`: Synchronizes SCAP data feed +* `cert`: Synchronizes CERT data feed +* `notus`: [???] +* `nasl`: [???] +* `report-format` or `report-formats`: Fetches any newly available scan report formats +* `scan-config` or `scan-configs`: Fetches any newly available scan configurations +* `port-list` or `port-lists`: Fetches any newly available port lists + +For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). + +### Updating Feeds With Legacy Bash Script + +To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. +``` +# Update feeds with legacy bash script +$ sudo -u gvm greenbone-feed-sync --type +``` +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + +Other arguments that can be passed to the legacy command incldue: + +* `--version`: Displays the version of the script +* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not +* `--describe`: Displays a description of the script and the feed it synchronizes +* `--feedversion`: Displays the version of the feed +* `--selftest`: Performs a self-test to check if all required utilities are available +* `--feedcurrent`: Checks if the feed is already up to date + +### Updating Feeds For Kali Linux Native Installation +Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +``` +┌──(dev㉿kali)-[~] +└─$ sudo gvm-feed-update +``` +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. + +### Verifying Successfull Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. + +## Automating Feed Sync Updates +The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. + +1. [MORE] + +2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: +``` +┌──(dev㉿kali)-[~] +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +_gvm +``` +``` +$ awk -F: '{ print $1}' /etc/passwd | grep gvm +gvm +``` + +## Troubleshooting A Connection To The Greenbone Feeds +To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. +``` +$ rsync rsync://feed.community.greenbone.net/community +``` +You should see output such as the following: +``` +Greenbone community feed server - http://feed.community.greenbone.net/ +This service is hosted by Greenbone Networks - http://www.greenbone.net/ + +All transactions are logged. + +If you have any questions, please use the Greenbone community portal. +See https://community.greenbone.net for details. + +By using this service you agree to our terms and conditions. + +Only one sync per time, otherwise the source ip will be temporarily blocked. + +data-objects Greenbone community data objects, see https://community.greenbone.net/ +nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ +scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ +cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ +community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ +community Greenbone community feed, see https://community.greenbone.net/ +``` +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: + +### Use nping + +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +``` +$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net +``` +### Use traceroute/tracert +If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. +``` +# For Linux/Unix systems +$ traceroute feed.community.greenbone.net +``` +``` +# For Windows systems +$ tracert feed.community.greenbone.net +``` From a03f3a0666394e4bf3925ff0bd0832bc3751b49d Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:45:25 -0400 Subject: [PATCH 002/107] Delete gvm-feed-sync-docs --- gvm-feed-sync-docs | 185 --------------------------------------------- 1 file changed, 185 deletions(-) delete mode 100644 gvm-feed-sync-docs diff --git a/gvm-feed-sync-docs b/gvm-feed-sync-docs deleted file mode 100644 index a3929f69..00000000 --- a/gvm-feed-sync-docs +++ /dev/null @@ -1,185 +0,0 @@ - -# Greenbone Feed Sync Update Guide - -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. - -If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. - -## A Note About Deprecated Sync Scripts -The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: -``` -$ which -``` -- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. -- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. -- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. -- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. - -### Deprecated Sync Scripts Removal -**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - -## Introduction Of The New Python Feed Sync Script -A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. - -The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). - -### Installation -Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. - -#### Install using pipx -You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) -``` -$ python3 -m pipx install pontos -``` - -#### Install using pip -NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. - -You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) -``` -$ python3 -m pip install greenbone-feed-sync -``` - -## Instructions For Updating the Greenbone Feeds - -### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. - -For example: -``` -$ which greenbone-feed-sync -/usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. - -For example: -``` -# If the new Python-based feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync -#!/usr/bin/python3 -``` -``` -# If the legacy bash feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync -#!/bin/sh -``` - -### Updating Feeds With New Python Script -By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. -``` -# Update all feeds with single command -$ sudo greenbone-feed-sync -``` -To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. -``` -# Include the feed type as an argument to update only a specific feed type -$ greenbone-feed-sync --type -``` -The available feed types are: - -* `all`: same as using the command without specifying a type -* `nvt`: Fetches any newly available vulnerability tests -* `gvmd-data`: Synchronizes GVM data feed which includes [???] -* `scap`: Synchronizes SCAP data feed -* `cert`: Synchronizes CERT data feed -* `notus`: [???] -* `nasl`: [???] -* `report-format` or `report-formats`: Fetches any newly available scan report formats -* `scan-config` or `scan-configs`: Fetches any newly available scan configurations -* `port-list` or `port-lists`: Fetches any newly available port lists - -For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). - -### Updating Feeds With Legacy Bash Script - -To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -``` -# Update feeds with legacy bash script -$ sudo -u gvm greenbone-feed-sync --type -``` -Using one of the following values to replace **\**: - -* `CERT`: Synchronizes CERT data feed -* `SCAP`: Synchronizes SCAP data feed -* `GVMD_DATA`: Synchronizes gvmd data feed - -Other arguments that can be passed to the legacy command incldue: - -* `--version`: Displays the version of the script -* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not -* `--describe`: Displays a description of the script and the feed it synchronizes -* `--feedversion`: Displays the version of the feed -* `--selftest`: Performs a self-test to check if all required utilities are available -* `--feedcurrent`: Checks if the feed is already up to date - -### Updating Feeds For Kali Linux Native Installation -Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows -``` -┌──(dev㉿kali)-[~] -└─$ sudo gvm-feed-update -``` -Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. - -### Verifying Successfull Feed Sync Update -After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. - -## Automating Feed Sync Updates -The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. - -1. [MORE] - -2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: -``` -┌──(dev㉿kali)-[~] -└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm -_gvm -``` -``` -$ awk -F: '{ print $1}' /etc/passwd | grep gvm -gvm -``` - -## Troubleshooting A Connection To The Greenbone Feeds -To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -``` -$ rsync rsync://feed.community.greenbone.net/community -``` -You should see output such as the following: -``` -Greenbone community feed server - http://feed.community.greenbone.net/ -This service is hosted by Greenbone Networks - http://www.greenbone.net/ - -All transactions are logged. - -If you have any questions, please use the Greenbone community portal. -See https://community.greenbone.net for details. - -By using this service you agree to our terms and conditions. - -Only one sync per time, otherwise the source ip will be temporarily blocked. - -data-objects Greenbone community data objects, see https://community.greenbone.net/ -nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ -scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ -cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ -community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ -community Greenbone community feed, see https://community.greenbone.net/ -``` -If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: - -### Use nping - -The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. -``` -$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net -``` -### Use traceroute/tracert -If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. -``` -# For Linux/Unix systems -$ traceroute feed.community.greenbone.net -``` -``` -# For Windows systems -$ tracert feed.community.greenbone.net -``` From 4448f26d55acf258c45b468607d07bef317932df Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:46:14 -0400 Subject: [PATCH 003/107] Create greenbone-feed-sync-docs.md The first draft of a comprehensive Greenbone feed sync instruction manual --- greenbone-feed-sync-docs.md | 185 ++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 greenbone-feed-sync-docs.md diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md new file mode 100644 index 00000000..a3929f69 --- /dev/null +++ b/greenbone-feed-sync-docs.md @@ -0,0 +1,185 @@ + +# Greenbone Feed Sync Update Guide + +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. + +If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. + +## A Note About Deprecated Sync Scripts +The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: +``` +$ which +``` +- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. +- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. +- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. +- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. + +### Deprecated Sync Scripts Removal +**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + +## Introduction Of The New Python Feed Sync Script +A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. + +The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). + +### Installation +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. + +#### Install using pipx +You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) +``` +$ python3 -m pipx install pontos +``` + +#### Install using pip +NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. + +You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) +``` +$ python3 -m pip install greenbone-feed-sync +``` + +## Instructions For Updating the Greenbone Feeds + +### Determine Which Command Is In Use +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. + +For example: +``` +$ which greenbone-feed-sync +/usr/local/bin/greenbone-feed-sync +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. + +For example: +``` +# If the new Python-based feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/usr/bin/python3 +``` +``` +# If the legacy bash feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/bin/sh +``` + +### Updating Feeds With New Python Script +By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. +``` +# Update all feeds with single command +$ sudo greenbone-feed-sync +``` +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. +``` +# Include the feed type as an argument to update only a specific feed type +$ greenbone-feed-sync --type +``` +The available feed types are: + +* `all`: same as using the command without specifying a type +* `nvt`: Fetches any newly available vulnerability tests +* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `scap`: Synchronizes SCAP data feed +* `cert`: Synchronizes CERT data feed +* `notus`: [???] +* `nasl`: [???] +* `report-format` or `report-formats`: Fetches any newly available scan report formats +* `scan-config` or `scan-configs`: Fetches any newly available scan configurations +* `port-list` or `port-lists`: Fetches any newly available port lists + +For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). + +### Updating Feeds With Legacy Bash Script + +To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. +``` +# Update feeds with legacy bash script +$ sudo -u gvm greenbone-feed-sync --type +``` +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + +Other arguments that can be passed to the legacy command incldue: + +* `--version`: Displays the version of the script +* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not +* `--describe`: Displays a description of the script and the feed it synchronizes +* `--feedversion`: Displays the version of the feed +* `--selftest`: Performs a self-test to check if all required utilities are available +* `--feedcurrent`: Checks if the feed is already up to date + +### Updating Feeds For Kali Linux Native Installation +Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +``` +┌──(dev㉿kali)-[~] +└─$ sudo gvm-feed-update +``` +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. + +### Verifying Successfull Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. + +## Automating Feed Sync Updates +The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. + +1. [MORE] + +2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: +``` +┌──(dev㉿kali)-[~] +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +_gvm +``` +``` +$ awk -F: '{ print $1}' /etc/passwd | grep gvm +gvm +``` + +## Troubleshooting A Connection To The Greenbone Feeds +To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. +``` +$ rsync rsync://feed.community.greenbone.net/community +``` +You should see output such as the following: +``` +Greenbone community feed server - http://feed.community.greenbone.net/ +This service is hosted by Greenbone Networks - http://www.greenbone.net/ + +All transactions are logged. + +If you have any questions, please use the Greenbone community portal. +See https://community.greenbone.net for details. + +By using this service you agree to our terms and conditions. + +Only one sync per time, otherwise the source ip will be temporarily blocked. + +data-objects Greenbone community data objects, see https://community.greenbone.net/ +nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ +scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ +cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ +community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ +community Greenbone community feed, see https://community.greenbone.net/ +``` +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: + +### Use nping + +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +``` +$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net +``` +### Use traceroute/tracert +If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. +``` +# For Linux/Unix systems +$ traceroute feed.community.greenbone.net +``` +``` +# For Windows systems +$ tracert feed.community.greenbone.net +``` From b112f6d5cc0b93eca609ebf42d35a8c9d8173c97 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:53:21 -0400 Subject: [PATCH 004/107] Update greenbone-feed-sync-docs.md updates for clarity --- greenbone-feed-sync-docs.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index a3929f69..ac037815 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,7 +1,7 @@ # Greenbone Feed Sync Update Guide -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. @@ -17,7 +17,7 @@ $ which ### Deprecated Sync Scripts Removal **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -43,14 +43,14 @@ $ python3 -m pip install greenbone-feed-sync ## Instructions For Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: ``` $ which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: ``` @@ -72,7 +72,7 @@ $ sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. ``` -# Include the feed type as an argument to update only a specific feed type +# Include the feed type as an argument to update only a specific feed type $ greenbone-feed-sync --type ``` The available feed types are: @@ -82,7 +82,7 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: [???] +* `notus`: [???] * `nasl`: [???] * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations @@ -124,7 +124,9 @@ Please note that the `gvm-feed-update` command mentioned above is not maintained After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. ## Automating Feed Sync Updates -The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. +The Greenbone feeds are not automatically synced in the case of a Greenbone Community source code installation, for the Greenbone Community Docker containers, or the Greenbone native Kali Linux installation. The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the appropriate commands. + +If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. 1. [MORE] @@ -167,13 +169,13 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. ``` $ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. ``` # For Linux/Unix systems From 46d936a7aeb7c6abc4bdda5da6d6f8d466dbfa5f Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:57:13 -0400 Subject: [PATCH 005/107] Update greenbone-feed-sync-docs.md Added logo --- greenbone-feed-sync-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index ac037815..3a1ff86c 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,4 +1,4 @@ - +![Greenbone Logo](https://www.greenbone.net/wp-content/uploads/gb_new-logo_horizontal_rgb_small.png) # Greenbone Feed Sync Update Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. From 9936598c3528e3eb50d8986b9af9a9a1c70e628f Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 13 Jul 2023 11:12:05 -0400 Subject: [PATCH 006/107] Update greenbone-feed-sync-docs.md Small additions --- greenbone-feed-sync-docs.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index 3a1ff86c..b59ecc5b 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,4 +1,4 @@ -![Greenbone Logo](https://www.greenbone.net/wp-content/uploads/gb_new-logo_horizontal_rgb_small.png) + # Greenbone Feed Sync Update Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. @@ -17,7 +17,7 @@ $ which ### Deprecated Sync Scripts Removal **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -29,7 +29,7 @@ Python 3.9 and later is supported. Also note that sycing feeds requires the `rsy #### Install using pipx You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) ``` -$ python3 -m pipx install pontos +$ python3 -m pipx install greenbone-feed-sync ``` #### Install using pip @@ -43,14 +43,14 @@ $ python3 -m pip install greenbone-feed-sync ## Instructions For Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: ``` $ which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: ``` @@ -72,7 +72,7 @@ $ sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. ``` -# Include the feed type as an argument to update only a specific feed type +# Include the feed type as an argument to update only a specific feed type $ greenbone-feed-sync --type ``` The available feed types are: @@ -82,8 +82,8 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: [???] -* `nasl`: [???] +* `notus`: Fetch any newly available NOTUS vulnerability tests +* `nasl`: Fetch any newly available NASL vulnerability tests * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations * `port-list` or `port-lists`: Fetches any newly available port lists @@ -103,7 +103,7 @@ Using one of the following values to replace **\**: * `SCAP`: Synchronizes SCAP data feed * `GVMD_DATA`: Synchronizes gvmd data feed -Other arguments that can be passed to the legacy command incldue: +Other arguments that can be passed to the legacy command include: * `--version`: Displays the version of the script * `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not @@ -169,13 +169,13 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. ``` $ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. ``` # For Linux/Unix systems From a03379ff38adb01a4d4476cf8cffb37437edb6ee Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 14 Sep 2023 11:11:01 -0400 Subject: [PATCH 007/107] created feed-sync docs --- .../feed-sync.md | 86 +++++++++---------- src/index.md | 1 + 2 files changed, 44 insertions(+), 43 deletions(-) rename greenbone-feed-sync-docs.md => src/feed-sync.md (84%) diff --git a/greenbone-feed-sync-docs.md b/src/feed-sync.md similarity index 84% rename from greenbone-feed-sync-docs.md rename to src/feed-sync.md index b59ecc5b..5f20f45f 100644 --- a/greenbone-feed-sync-docs.md +++ b/src/feed-sync.md @@ -1,23 +1,23 @@ -# Greenbone Feed Sync Update Guide +# Feed Sync Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. -If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. +If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. ## A Note About Deprecated Sync Scripts The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: -``` -$ which +```sh +which ``` - `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. - `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. - `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. - `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. -### Deprecated Sync Scripts Removal -**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - +### Deprecated Sync Script Removal +If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -28,52 +28,52 @@ Python 3.9 and later is supported. Also note that sycing feeds requires the `rsy #### Install using pipx You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) -``` -$ python3 -m pipx install greenbone-feed-sync +```sh +python3 -m pipx install greenbone-feed-sync ``` #### Install using pip NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) -``` -$ python3 -m pip install greenbone-feed-sync +```sh +python3 -m pip install greenbone-feed-sync ``` -## Instructions For Updating the Greenbone Feeds +## Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: -``` -$ which greenbone-feed-sync +```sh +which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: -``` +```sh # If the new Python-based feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync +head -1 /usr/local/bin/greenbone-feed-sync #!/usr/bin/python3 ``` -``` +```sh # If the legacy bash feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync +head -1 /usr/local/bin/greenbone-feed-sync #!/bin/sh ``` ### Updating Feeds With New Python Script By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. -``` +```sh # Update all feeds with single command -$ sudo greenbone-feed-sync +sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. -``` -# Include the feed type as an argument to update only a specific feed type -$ greenbone-feed-sync --type +```sh +# Include the feed type as an argument to update only a specific feed type +greenbone-feed-sync --type ``` The available feed types are: @@ -82,7 +82,7 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: Fetch any newly available NOTUS vulnerability tests +* `notus`: Fetch any newly available NOTUS vulnerability tests * `nasl`: Fetch any newly available NASL vulnerability tests * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations @@ -93,9 +93,9 @@ For other options, see the [full documentation here](https://github.com/greenbon ### Updating Feeds With Legacy Bash Script To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -``` +```sh # Update feeds with legacy bash script -$ sudo -u gvm greenbone-feed-sync --type +sudo -u gvm greenbone-feed-sync --type ``` Using one of the following values to replace **\**: @@ -113,7 +113,7 @@ Other arguments that can be passed to the legacy command include: * `--feedcurrent`: Checks if the feed is already up to date ### Updating Feeds For Kali Linux Native Installation -Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +Kali Linux includes its own command for feed synchronization. To update all feeds issue the command as follows ``` ┌──(dev㉿kali)-[~] └─$ sudo gvm-feed-update @@ -133,21 +133,21 @@ If using the new Python-based command, the crontab should be run under the root 2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: ``` ┌──(dev㉿kali)-[~] -└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm _gvm ``` ``` -$ awk -F: '{ print $1}' /etc/passwd | grep gvm +$ awk -F: '{ print $1}' /etc/passwd | grep gvm gvm ``` ## Troubleshooting A Connection To The Greenbone Feeds To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -``` -$ rsync rsync://feed.community.greenbone.net/community +```sh +rsync rsync://feed.community.greenbone.net/community ``` You should see output such as the following: -``` +```sh Greenbone community feed server - http://feed.community.greenbone.net/ This service is hosted by Greenbone Networks - http://www.greenbone.net/ @@ -169,19 +169,19 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +```sh +sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net -``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. -``` +```sh # For Linux/Unix systems -$ traceroute feed.community.greenbone.net -``` +traceroute feed.community.greenbone.net ``` +```sh # For Windows systems -$ tracert feed.community.greenbone.net +tracert feed.community.greenbone.net ``` diff --git a/src/index.md b/src/index.md index 61885730..00c96aa8 100644 --- a/src/index.md +++ b/src/index.md @@ -36,5 +36,6 @@ faq troubleshooting glossary changelog +feed-sync api ``` From 693ad85b9f3d6709f1abb1182cedf40d34a09d52 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Mon, 30 Oct 2023 00:30:49 -0400 Subject: [PATCH 008/107] feed-sync changes --- src/index.md | 1 + src/web-interface/index.md | 270 +++++++++++++++++++++++++++++++++++++ 2 files changed, 271 insertions(+) create mode 100644 src/web-interface/index.md diff --git a/src/index.md b/src/index.md index 00c96aa8..d024d231 100644 --- a/src/index.md +++ b/src/index.md @@ -37,5 +37,6 @@ troubleshooting glossary changelog feed-sync +web-interface/index api ``` diff --git a/src/web-interface/index.md b/src/web-interface/index.md new file mode 100644 index 00000000..4b13592a --- /dev/null +++ b/src/web-interface/index.md @@ -0,0 +1,270 @@ +# JUST A PLACEHODLER FOR Web Interface + +```{include} /web-interface/8.md +``` + +```{highlight} shell-session +``` + +```{include} /22.4/source-build/hardware.md +``` + +```{include} /22.4/source-build/prerequisites.md +``` + +### Setting the Version + +To make the downloading easier, an environment variable for the desired release +version will be set. Using a variable allows adjusting the version easily after +a new release. + +```{code-block} +:caption: Setting a GVM version as environment variable + +export GVM_VERSION=22.4.1 +``` + +## Building and Installing the Components + +```{note} +The components should be build and installed in the listed order. +``` + +### gvm-libs + +```{include} /22.4/source-build/gvm-libs/description.md +``` + +```{code-block} +:caption: Setting the gvm-libs version to use + +export GVM_LIBS_VERSION=22.4.4 +``` + +```{include} /22.4/source-build/gvm-libs/dependencies.md +``` + +```{include} /22.4/source-build/gvm-libs/download.md +``` + +Afterwards, gvm-libs can be build and installed. + +```{include} /22.4/source-build/gvm-libs/build.md +``` + +### gvmd + +```{include} /22.4/source-build/gvmd/description.md +``` + +```{code-block} +:caption: Setting the gvmd version to use + +export GVMD_VERSION=22.4.2 +``` + +```{include} /22.4/source-build/gvmd/dependencies.md +``` + +Details about the optional dependencies can be found at + + +```{include} /22.4/source-build/gvmd/download.md +``` + +```{include} /22.4/source-build/gvmd/build.md +``` + +### pg-gvm + +```{include} /22.4/source-build/pg-gvm/description.md +``` + +```{code-block} +:caption: Setting the pg-gvm version to use + +export PG_GVM_VERSION=22.4.0 +``` + +```{include} /22.4/source-build/pg-gvm/dependencies.md +``` + +```{include} /22.4/source-build/pg-gvm/download.md +``` + +Afterwards, pg-gvm can be build and installed. + +```{include} /22.4/source-build/pg-gvm/build.md +``` + +### Greenbone Security Assistant + +The Greenbone Security Assistant (GSA) sources consist of two parts: + +- Web server *gsad* +- Web application *GSA* + +#### GSA + +```{include} /22.4/source-build/gsa/description.md +``` + +```{include} /22.4/source-build/gsa/version.md +``` + +```{include} /22.4/source-build/gsa/dependencies.md +``` + +```{include} /22.4/source-build/gsa/download.md +``` + +```{include} /22.4/source-build/gsa/build.md +``` + +#### gsad + +```{include} /22.4/source-build/gsad/description.md +``` + +```{include} /22.4/source-build/gsad/version.md +``` + +```{include} /22.4/source-build/gsad/dependencies.md +``` + +```{include} /22.4/source-build/gsad/download.md +``` + +```{include} /22.4/source-build/gsad/build.md +``` + +### openvas-smb + +```{include} /22.4/source-build/openvas-smb.md +``` + +### openvas-scanner + +```{include} /22.4/source-build/openvas-scanner/description.md +``` + +```{include} /22.4/source-build/openvas-scanner/version.md +``` + +```{include} /22.4/source-build/openvas-scanner/dependencies.md +``` + +```{include} /22.4/source-build/openvas-scanner/download.md +``` + +```{include} /22.4/source-build/openvas-scanner/build.md +``` + +### ospd-openvas + +```{include} /22.4/source-build/ospd-openvas/description.md +``` + +```{code-block} +:caption: Setting the ospd and ospd-openvas versions to use + +export OSPD_OPENVAS_VERSION=22.4.6 +``` + +```{include} /22.4/source-build/ospd-openvas/dependencies.md +``` + +```{include} /22.4/source-build/ospd-openvas/download.md +``` + +```{include} /22.4/source-build/ospd-openvas/build.md +``` + +### notus-scanner + +```{include} /22.4/source-build/notus-scanner/description.md +``` + +```{code-block} +:caption: Setting the notus version to use + +export NOTUS_VERSION=22.4.5 +``` + +```{include} /22.4/source-build/notus-scanner/dependencies.md +``` + +```{include} /22.4/source-build/notus-scanner/download.md +``` + +```{include} /22.4/source-build/notus-scanner/build.md +``` + +### greenbone-feed-sync + +```{include} /22.4/source-build/greenbone-feed-sync/description.md +``` + +```{include} /22.4/source-build/greenbone-feed-sync/dependencies.md +``` + +```{include} /22.4/source-build/greenbone-feed-sync/install.md +``` + +### gvm-tools + +```{include} /22.4/source-build/gvm-tools/description.md +``` + +```{include} /22.4/source-build/gvm-tools/dependencies.md +``` + +```{include} /22.4/source-build/gvm-tools/install.md +``` + +## Performing a System Setup + +```{include} /22.4/source-build/redis.md +``` + +```{include} /22.4/source-build/mqtt-broker.md +``` + +```{include} /22.4/source-build/directory-permissions.md +``` + +```{include} /22.4/source-build/gpg.md +``` + +```{include} /22.4/source-build/sudo-scanning.md +``` + +```{include} /22.4/source-build/postgres.md +``` + +```{include} /22.4/source-build/admin-user.md +``` + +```{include} /22.4/source-build/feed-import-owner.md +``` + +```{include} /22.4/source-build/systemd.md +``` + +```{include} /22.4/source-build/feed-sync.md +``` + +```{include} /22.4/source-build/start-services.md +``` + +```{include} /22.4/source-build/feed-loading.md +``` + +```{include} /22.4/source-build/finish.md +``` + +```{toctree} +:hidden: true + +troubleshooting +``` From 0688cc25eafa4abb952a232edddb8f4fc311b857 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 10 Jan 2024 18:52:06 +0800 Subject: [PATCH 009/107] Removed the file and refernces to web interface documentation to keep this branch only include feed-sync docs --- src/index.md | 1 - src/web-interface/index.md | 270 ------------------------------------- 2 files changed, 271 deletions(-) delete mode 100644 src/web-interface/index.md diff --git a/src/index.md b/src/index.md index d024d231..00c96aa8 100644 --- a/src/index.md +++ b/src/index.md @@ -37,6 +37,5 @@ troubleshooting glossary changelog feed-sync -web-interface/index api ``` diff --git a/src/web-interface/index.md b/src/web-interface/index.md deleted file mode 100644 index 4b13592a..00000000 --- a/src/web-interface/index.md +++ /dev/null @@ -1,270 +0,0 @@ -# JUST A PLACEHODLER FOR Web Interface - -```{include} /web-interface/8.md -``` - -```{highlight} shell-session -``` - -```{include} /22.4/source-build/hardware.md -``` - -```{include} /22.4/source-build/prerequisites.md -``` - -### Setting the Version - -To make the downloading easier, an environment variable for the desired release -version will be set. Using a variable allows adjusting the version easily after -a new release. - -```{code-block} -:caption: Setting a GVM version as environment variable - -export GVM_VERSION=22.4.1 -``` - -## Building and Installing the Components - -```{note} -The components should be build and installed in the listed order. -``` - -### gvm-libs - -```{include} /22.4/source-build/gvm-libs/description.md -``` - -```{code-block} -:caption: Setting the gvm-libs version to use - -export GVM_LIBS_VERSION=22.4.4 -``` - -```{include} /22.4/source-build/gvm-libs/dependencies.md -``` - -```{include} /22.4/source-build/gvm-libs/download.md -``` - -Afterwards, gvm-libs can be build and installed. - -```{include} /22.4/source-build/gvm-libs/build.md -``` - -### gvmd - -```{include} /22.4/source-build/gvmd/description.md -``` - -```{code-block} -:caption: Setting the gvmd version to use - -export GVMD_VERSION=22.4.2 -``` - -```{include} /22.4/source-build/gvmd/dependencies.md -``` - -Details about the optional dependencies can be found at - - -```{include} /22.4/source-build/gvmd/download.md -``` - -```{include} /22.4/source-build/gvmd/build.md -``` - -### pg-gvm - -```{include} /22.4/source-build/pg-gvm/description.md -``` - -```{code-block} -:caption: Setting the pg-gvm version to use - -export PG_GVM_VERSION=22.4.0 -``` - -```{include} /22.4/source-build/pg-gvm/dependencies.md -``` - -```{include} /22.4/source-build/pg-gvm/download.md -``` - -Afterwards, pg-gvm can be build and installed. - -```{include} /22.4/source-build/pg-gvm/build.md -``` - -### Greenbone Security Assistant - -The Greenbone Security Assistant (GSA) sources consist of two parts: - -- Web server *gsad* -- Web application *GSA* - -#### GSA - -```{include} /22.4/source-build/gsa/description.md -``` - -```{include} /22.4/source-build/gsa/version.md -``` - -```{include} /22.4/source-build/gsa/dependencies.md -``` - -```{include} /22.4/source-build/gsa/download.md -``` - -```{include} /22.4/source-build/gsa/build.md -``` - -#### gsad - -```{include} /22.4/source-build/gsad/description.md -``` - -```{include} /22.4/source-build/gsad/version.md -``` - -```{include} /22.4/source-build/gsad/dependencies.md -``` - -```{include} /22.4/source-build/gsad/download.md -``` - -```{include} /22.4/source-build/gsad/build.md -``` - -### openvas-smb - -```{include} /22.4/source-build/openvas-smb.md -``` - -### openvas-scanner - -```{include} /22.4/source-build/openvas-scanner/description.md -``` - -```{include} /22.4/source-build/openvas-scanner/version.md -``` - -```{include} /22.4/source-build/openvas-scanner/dependencies.md -``` - -```{include} /22.4/source-build/openvas-scanner/download.md -``` - -```{include} /22.4/source-build/openvas-scanner/build.md -``` - -### ospd-openvas - -```{include} /22.4/source-build/ospd-openvas/description.md -``` - -```{code-block} -:caption: Setting the ospd and ospd-openvas versions to use - -export OSPD_OPENVAS_VERSION=22.4.6 -``` - -```{include} /22.4/source-build/ospd-openvas/dependencies.md -``` - -```{include} /22.4/source-build/ospd-openvas/download.md -``` - -```{include} /22.4/source-build/ospd-openvas/build.md -``` - -### notus-scanner - -```{include} /22.4/source-build/notus-scanner/description.md -``` - -```{code-block} -:caption: Setting the notus version to use - -export NOTUS_VERSION=22.4.5 -``` - -```{include} /22.4/source-build/notus-scanner/dependencies.md -``` - -```{include} /22.4/source-build/notus-scanner/download.md -``` - -```{include} /22.4/source-build/notus-scanner/build.md -``` - -### greenbone-feed-sync - -```{include} /22.4/source-build/greenbone-feed-sync/description.md -``` - -```{include} /22.4/source-build/greenbone-feed-sync/dependencies.md -``` - -```{include} /22.4/source-build/greenbone-feed-sync/install.md -``` - -### gvm-tools - -```{include} /22.4/source-build/gvm-tools/description.md -``` - -```{include} /22.4/source-build/gvm-tools/dependencies.md -``` - -```{include} /22.4/source-build/gvm-tools/install.md -``` - -## Performing a System Setup - -```{include} /22.4/source-build/redis.md -``` - -```{include} /22.4/source-build/mqtt-broker.md -``` - -```{include} /22.4/source-build/directory-permissions.md -``` - -```{include} /22.4/source-build/gpg.md -``` - -```{include} /22.4/source-build/sudo-scanning.md -``` - -```{include} /22.4/source-build/postgres.md -``` - -```{include} /22.4/source-build/admin-user.md -``` - -```{include} /22.4/source-build/feed-import-owner.md -``` - -```{include} /22.4/source-build/systemd.md -``` - -```{include} /22.4/source-build/feed-sync.md -``` - -```{include} /22.4/source-build/start-services.md -``` - -```{include} /22.4/source-build/feed-loading.md -``` - -```{include} /22.4/source-build/finish.md -``` - -```{toctree} -:hidden: true - -troubleshooting -``` From 9da852ac822a1ec87b9d781c247ca0065ec9ecf4 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 11 Jan 2024 16:01:59 +0800 Subject: [PATCH 010/107] just temporarily stashing changes on hold --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 5f20f45f..a785a9be 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -79,7 +79,7 @@ The available feed types are: * `all`: same as using the command without specifying a type * `nvt`: Fetches any newly available vulnerability tests -* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `gvmd-data`: Synchronizes GVM data feed which includes port lists, scan configs and report formats * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed * `notus`: Fetch any newly available NOTUS vulnerability tests From 894013fbb647d6fdc8de445ae1b428d010cc6b19 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 6 Mar 2024 23:16:30 +0700 Subject: [PATCH 011/107] complete first-draft of Greenbone community feed sync documentation --- src/changelog.md | 1 + src/feed-sync.md | 202 ++++++++++++++++++++++++++++------------------- 2 files changed, 122 insertions(+), 81 deletions(-) diff --git a/src/changelog.md b/src/changelog.md index 47dbba57..d9e5af75 100644 --- a/src/changelog.md +++ b/src/changelog.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Calendar Versioning](https://calver.org). ## Latest +* Add a comprehensive feed sync guide * Add instructions for Kali Linux installation * Add instructions to enable SSL/TLS * Quote passwords when creating an admin user via `gvmd` diff --git a/src/feed-sync.md b/src/feed-sync.md index a785a9be..d1fce4c7 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,83 +1,113 @@ # Feed Sync Guide +This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. - -If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. +If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. ## A Note About Deprecated Sync Scripts -The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: -```sh -which +Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based script with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. + +Usually, legacy feed sync scripts can be identified by their location. The depreciated bash scripts are usually found in the `/usr/local/sbin` or `/usr/sbin` directories, while the newer Python-based scripts are typically located in the `/usr/local/bin` or `$HOME/.local/bin` directories, depending on your installation method. + +If you want to check which scripts you have installed you can use the `which` command to identify the active script's path: +```{code-block} +:caption: Verify the path of the active feed command executable +which +``` +Once you have identified the active feed sync executable path, you can verify whether it is a legacy bash feed sync script, or the newer Python-based script by checking the file header. The first line of the legacy scripts will be `#!/bin/sh` while the newer versions will be `#!/usr/bin/python3`. +```{code-block} +:caption: Check the shebang to determine the script type +head -1 /path/to/ ``` -- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. -- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. -- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. -- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. ### Deprecated Sync Script Removal -If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. +If you have any of the deprecated bash scripts installed, it is recommended to delete them. This ensures a clean transition to the new sync script. + +### Legacy Feed Sync Filenames +These are the legacy feed sync files and a description of their functionality: + +* `greenbone-feed-sync`: This is the base script. The `--type ` argument is required to specify which data to synchronize (CERT, SCAP, or GVMD_DATA). +* `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type CERT`. +* `greenbone-scapdata-sync`: This script is equivalent to `greenbone-feed-sync --type SCAP`. +* `greenbone-nvt-sync`: This script is equivalent to `greenbone-feed-sync --type GVMD_DATA`. -## Introduction Of The New Python Feed Sync Script -A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. +## The New Python Feed Sync Scripts +A set of new Python-based scripts have now replaced the deprecated feed sync scripts mentioned above. The new scripts are supported by **Greenbone version 22.4 and later**. However, older versions are not supported. The new Python-based scripts are now installed by default as of **Greenbone Community Edition version 22.5.0**. For backwards compatibility the new Python scripts have identical names to the original bash scripts. -The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). +* `greenbone-feed-sync`: This is the base script. if no `--type` argument is set, all feed types will be updated. The `--type ` argument can be used to specify which data to synchronize. A list of available feed types can be [found here](#available-feed-types). +* `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type cert` and is provided for backwards compatibility only. +* `greenbone-scapdata-sync`: This script is equivalent to `greenbone-feed-sync --type scap` and is provided for backwards compatibility only. +* `greenbone-nvt-sync`: This script is equivalent to `greenbone-feed-sync --type gvmd-data` and is provided for backwards compatibility only. + +More information about executing the scripts can be [found here](#updating-feeds-with-new-python-script). ### Installation -Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the operating system **PATH**, which is normally configured as part of Greenbone Community Edition's source code and Docker container installation methods. #### Install using pipx -You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) -```sh +You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/). +```{code-block} +:caption: Installing the package via pipx python3 -m pipx install greenbone-feed-sync ``` #### Install using pip -NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. +NOTE: The pip install command no longer works out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. -You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) -```sh +You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pip](https://pip.pypa.io/). +```{code-block} +:caption: Installing the package via python-pip python3 -m pip install greenbone-feed-sync ``` ## Updating the Greenbone Feeds +### Updating Feeds For Greenbone Docker Containers +Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). + +### Determining The Script Version In Use +If you are unsure of which version of the feed sync script is active, you should check before you execute the `greenbone-feed-sync` command.One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. -### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +To check the file header, use the `which` command to determine the path of the command that is executed. For example: -```sh +```{code-block} +:caption: Check the path of the active feed sync script which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync ``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at run-time. For example: -```sh -# If the new Python-based feed update script is active you will see +```{code-block} +:caption: If the new Python-based feed update script is active you will see head -1 /usr/local/bin/greenbone-feed-sync #!/usr/bin/python3 ``` -```sh -# If the legacy bash feed update script is active you will see -head -1 /usr/local/bin/greenbone-feed-sync +```{code-block} +:caption: If the legacy bash feed update script is active you will see +head -1 /usr/local/sbin/greenbone-feed-sync #!/bin/sh ``` ### Updating Feeds With New Python Script -By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. -```sh -# Update all feeds with single command +By default, when no arguments are passed, the new Python `greenbone-feed-sync` will updated all feed types. For standard installations that follow the [official Greenbone source code install instructions](https://greenbone.github.io/docs/latest/22.4/source-build/index.html), or the [Kali Linux native package installation](https://greenbone.github.io/docs/latest/22.4/kali/index.html), the new Python script should be run with `root`/`sudo` permissions, as it will change its execution context appropriately to the `gvm` or `_gvm` user. + +However, for non-standard installations that use a different username and group to execute the Greenbone components, the configured username and group context must be changed via the `greenbone-feed-sync.toml` configuration file. A basic example of how to configure a non-standard user via the `.toml` file can be [found here](https://github.com/greenbone/greenbone-feed-sync/blob/main/README.md#usage-on-kali-linux). + +```{code-block} +:caption: Update all feeds with single command sudo greenbone-feed-sync ``` -To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. -```sh -# Include the feed type as an argument to update only a specific feed type -greenbone-feed-sync --type +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type. +```{code-block} +:caption: Include the feed type as an argument to update only a specific feed type +sudo greenbone-feed-sync --type ``` + +#### Available Feed Types The available feed types are: -* `all`: same as using the command without specifying a type +* `all`: Same as using the command without specifying a type * `nvt`: Fetches any newly available vulnerability tests * `gvmd-data`: Synchronizes GVM data feed which includes port lists, scan configs and report formats * `scap`: Synchronizes SCAP data feed @@ -88,23 +118,19 @@ The available feed types are: * `scan-config` or `scan-configs`: Fetches any newly available scan configurations * `port-list` or `port-lists`: Fetches any newly available port lists -For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). +#### Other Command Line Arguments +All other settings that can be configured via command line arguments can also be configured from a [`.toml`](https://toml.io/en/) file located at `/etc/gvm/greenbone-feed-sync.toml` or via system environment variables. The configuration settings are checked and loaded in that respective order: -### Updating Feeds With Legacy Bash Script +1. The `/etc/gvm/greenbone-feed-sync.toml` configuration file +2. System environment variables +3. Command line arguments at runtime -To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -```sh -# Update feeds with legacy bash script -sudo -u gvm greenbone-feed-sync --type -``` -Using one of the following values to replace **\**: +A complete list of settings are [available here](https://github.com/greenbone/greenbone-feed-sync/blob/main/README.md#settings) and full documentation for the new Python-based feed update script can be [found here](https://github.com/greenbone/greenbone-feed-sync/). -* `CERT`: Synchronizes CERT data feed -* `SCAP`: Synchronizes SCAP data feed -* `GVMD_DATA`: Synchronizes gvmd data feed - -Other arguments that can be passed to the legacy command include: +The most basic arguments are: +* `--help`: Displays list of all available command line arguments +* `--verbose`: Sets verbose output. `-vvv` provides maximum verbosity. * `--version`: Displays the version of the script * `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not * `--describe`: Displays a description of the script and the feed it synchronizes @@ -112,42 +138,54 @@ Other arguments that can be passed to the legacy command include: * `--selftest`: Performs a self-test to check if all required utilities are available * `--feedcurrent`: Checks if the feed is already up to date +### Updating Feeds With Legacy Bash Scripts (Not Recommended) +If you absolutely cannot update to the new Python-based feed sync scripts because you are using a version of Greenbone prior to 22.4, or another reason, it's important to note that the legacy bash scripts can be run as the `sudo`/`root` user or the `gvm` user standard installations (`_gvm` on legacy versions of Kali). However, for non-standard installations that use a different username for the Greenbone components, the feed sync script should be run from the appropriate user context. Also, to update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. + +For example: + +```{code-block} +:caption: Update feeds with legacy bash script +sudo -u gvm greenbone-feed-sync --type +``` + +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + ### Updating Feeds For Kali Linux Native Installation -Kali Linux includes its own command for feed synchronization. To update all feeds issue the command as follows +Some older versions of Kali Linux include the `gvm-feed-update` command for feed synchronization. However, the wrapper script has been depreciated in newer versions of Kali and Greenbone's official `greenbone-feed-sync` command must be used instead. + +To update all feeds for versions of Kali Linux that include the `gvm-feed-update` script issue the following command can be used: + ``` ┌──(dev㉿kali)-[~] └─$ sudo gvm-feed-update ``` -Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. -### Verifying Successfull Feed Sync Update -After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. -## Automating Feed Sync Updates -The Greenbone feeds are not automatically synced in the case of a Greenbone Community source code installation, for the Greenbone Community Docker containers, or the Greenbone native Kali Linux installation. The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the appropriate commands. +### Configuring The Feed Sync User For Non-Standard Installations +The Python-based feed sync scripts will automatically change context to the `gvm` user in order to process the feeds. Since the Kali native installation uses the `_gvm` user, it comes preconfigured with a `.toml` file which specifies the appropriate user context. The `greenbone-feed-sync` script will look for this configuration file at the locations `~/.config/greenbone-feed-sync.toml` and `/etc/gvm/greenbone-feed-sync.toml`. If you have configured a Greenbone source code installation with a non-standard username and group such as `_gvm` you must add the user and group context to the `/etc/gvm/greenbone-feed-sync.toml` file, configure the appropriate environment variable, or supply the user context via the `--user` and `--group` command line arguments. -If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. +### Verifying Successful Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data by visiting the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed and the **Version** column will indicate the date/time of the feed's release. -1. [MORE] +## Automating Feed Sync Updates +The Greenbone feeds are not automatically synced for the Greenbone Community source code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. -2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: -``` -┌──(dev㉿kali)-[~] -└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm -_gvm -``` -``` -$ awk -F: '{ print $1}' /etc/passwd | grep gvm -gvm -``` +Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via `crontab`. ## Troubleshooting A Connection To The Greenbone Feeds To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -```sh +```{code-block} +:caption: Verify an rsync connection to the Greenbone feeds rsync rsync://feed.community.greenbone.net/community ``` You should see output such as the following: -```sh +```{code-block} +:caption: Expected output when verifying an rsync connection to the Greenbone feeds Greenbone community feed server - http://feed.community.greenbone.net/ This service is hosted by Greenbone Networks - http://www.greenbone.net/ @@ -167,21 +205,23 @@ cert-data Greenbone community CERT data feed, see https://community.greenbone.n community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ community Greenbone community feed, see https://community.greenbone.net/ ``` -If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: ### Use nping - -The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. -```sh +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +```{code-block} +:caption: MORE sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert -If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. -```sh -# For Linux/Unix systems -traceroute feed.community.greenbone.net + +### Use tcptraceroute +If you cannot install `nmap` on your host, you can try `tcptraceroute` on Linux/Unix based systems. + +```{code-block} +:caption: For Linux/Unix systems +tcptraceroute -p 873 feed.community.greenbone.net ``` -```sh -# For Windows systems +```{code-block} +:caption: For Windows systems tracert feed.community.greenbone.net ``` From 9bfbac88457a5ef1883d158c893496cecf427fe0 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 7 Mar 2024 12:08:52 +0700 Subject: [PATCH 012/107] Added some changes to the Troubleshooting a connection section --- src/feed-sync.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index d1fce4c7..7a90c4df 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -208,20 +208,15 @@ community Greenbone community feed, see https://community.greenbone.net/ If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: ### Use nping -The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +The `nping` command is part of the `nmap` tool and is availble for Linux and Windows systems. It can be used to track a TCP connection on a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules that maybe blocking the `rsync` port `873`. Please note `nping --tcp` command requires `sudo` or root permissions. You can find more information at the [nping reference guide](https://nmap.org/book/nping-man.html). ```{code-block} -:caption: MORE +:caption: Using nping to test the connectivity of port 873 sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` ### Use tcptraceroute -If you cannot install `nmap` on your host, you can try `tcptraceroute` on Linux/Unix based systems. - +If you cannot install `nmap` on your host, you can use `tcptraceroute` on Linux/Unix based systems. ```{code-block} -:caption: For Linux/Unix systems +:caption: Using tcptraceroute to test the connectivity of port 873 tcptraceroute -p 873 feed.community.greenbone.net ``` -```{code-block} -:caption: For Windows systems -tracert feed.community.greenbone.net -``` From 0a5976c7c60c9024b0493163253ef62d813057af Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Tue, 19 Mar 2024 14:34:16 +0700 Subject: [PATCH 013/107] Added warning label to all notices about Docker containers feed sync --- src/feed-sync.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 7a90c4df..6f872c5c 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,6 +1,9 @@ # Feed Sync Guide -This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. + +```{warning} Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +``` If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. @@ -62,7 +65,8 @@ python3 -m pip install greenbone-feed-sync ## Updating the Greenbone Feeds ### Updating Feeds For Greenbone Docker Containers -Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +``` ### Determining The Script Version In Use If you are unsure of which version of the feed sync script is active, you should check before you execute the `greenbone-feed-sync` command.One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. @@ -175,7 +179,8 @@ After the sync operation completes, you can verify the successful update of the ## Automating Feed Sync Updates The Greenbone feeds are not automatically synced for the Greenbone Community source code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. -Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via `crontab`. +```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via **crontab**. +``` ## Troubleshooting A Connection To The Greenbone Feeds To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. From bb7343a3d57e3f60415d518217d6b71fea2b8963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Fri, 15 Mar 2024 16:03:50 +0100 Subject: [PATCH 014/107] Fix: Fix compose command for downloading gvmd data manually The greenbone-feed-sync application must be run within a greenbone-feed-sync container. Otherwise it wont be available. --- src/22.4/container/manual-feed-sync.md | 2 +- src/changelog.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/22.4/container/manual-feed-sync.md b/src/22.4/container/manual-feed-sync.md index 2cc7e5bd..03a8edd0 100644 --- a/src/22.4/container/manual-feed-sync.md +++ b/src/22.4/container/manual-feed-sync.md @@ -90,5 +90,5 @@ policies, port lists and report formats. caption: Downloading data objects processed by gvmd --- docker compose -f $DOWNLOAD_DIR/docker-compose.yml -p greenbone-community-edition \ - run --rm gvmd greenbone-feed-sync --type gvmd-data + run --rm greenbone-feed-sync greenbone-feed-sync --type gvmd-data ``` diff --git a/src/changelog.md b/src/changelog.md index 47dbba57..0069fb6b 100644 --- a/src/changelog.md +++ b/src/changelog.md @@ -15,6 +15,8 @@ and this project adheres to [Calendar Versioning](https://calver.org). * Add section about getting the log messages for the Community Containers * Extend history about current release changes and semver usage * Improved troubleshooting for *Failed to find port_list* +* Fix command for downloading gvmd-data manual manually when using the + containers * Update gvm-libs to 22.8.0 * Update gvmd to 23.2.0 * Update pg-gvm to 22.6.4 From 9a29da68b679e0a24c5749d177addedf7c1120a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 04:59:59 +0000 Subject: [PATCH 015/107] Bump the python-packages group with 3 updates Bumps the python-packages group with 3 updates: [importlib-metadata](https://github.com/python/importlib_metadata), [packaging](https://github.com/pypa/packaging) and [zipp](https://github.com/jaraco/zipp). Updates `importlib-metadata` from 7.0.1 to 7.1.0 - [Release notes](https://github.com/python/importlib_metadata/releases) - [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst) - [Commits](https://github.com/python/importlib_metadata/compare/v7.0.1...v7.1.0) Updates `packaging` from 23.2 to 24.0 - [Release notes](https://github.com/pypa/packaging/releases) - [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pypa/packaging/compare/23.2...24.0) Updates `zipp` from 3.17.0 to 3.18.1 - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.17.0...v3.18.1) --- updated-dependencies: - dependency-name: importlib-metadata dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: packaging dependency-type: indirect update-type: version-update:semver-major dependency-group: python-packages - dependency-name: zipp dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/poetry.lock b/poetry.lock index d5062b46..1cfb17a8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "alabaster" @@ -219,22 +219,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "jinja2" @@ -419,13 +419,13 @@ testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4, [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -813,18 +813,18 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" From 2ff3c961d5ab603d9f163a9fa878a6dc65e5cc9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 04:02:42 +0000 Subject: [PATCH 016/107] Bump idna from 3.6 to 3.7 Bumps [idna](https://github.com/kjd/idna) from 3.6 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.6...v3.7) --- updated-dependencies: - dependency-name: idna dependency-type: indirect ... Signed-off-by: dependabot[bot] --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1cfb17a8..de7ec989 100644 --- a/poetry.lock +++ b/poetry.lock @@ -197,13 +197,13 @@ sphinx-basic-ng = "*" [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] From 598ae51a8a739539afddb8bc5035ac4e1bd50f6f Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Thu, 11 Apr 2024 06:24:21 +0200 Subject: [PATCH 017/107] Add: openvas logs To be able to see openvas logs more easily a new service `openvas` is added. This service tails over `/var/log/openvas/openvas.log`. Additionally an configuration step `configure-openvas` is added. This sets the openvas log level to 128 and changes to log output to `/var/log/openvas/openvas.log` instead of `/var/log/gvm/openvas.log`. To change the log level you can replace the `128` to the desired log level. --- src/_static/docker-compose-22.4.yml | 40 ++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index 85742836..630cd863 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -94,7 +94,39 @@ services: - gvmd_socket_vol:/run/gvmd depends_on: - gvmd - + # Sets log level of openvas to the set LOG_LEVEL within the env + # and changes log output to /var/log/openvas instead /var/log/gvm + # to reduce likelyhood of unwanted log interferences + configure-openvas: + image: greenbone/openvas-scanner:stable + volumes: + - openvas_data_vol:/mnt + environment: + LOG_LEVEL: 128 + command: + - /bin/sh + - -c + - | + cp /etc/openvas/openvas.conf /mnt/ + sed "s/127/128/" /etc/openvas/openvas_log.conf | sed 's/gvm/openvas/' > /mnt/openvas_log.conf + chmod 644 /mnt/openvas.conf + chmod 644 /mnt/openvas_log.conf + # shows logs of openvas + openvas: + image: greenbone/openvas-scanner:stable + restart: on-failure + volumes: + - openvas_data_vol:/etc/openvas + - openvas_log_data_vol:/var/log/openvas + command: + - /bin/sh + - -c + - | + cat /etc/openvas/openvas.conf + tail -f /var/log/openvas/openvas.log + depends_on: + configure-openvas: + condition: service_completed_successfully ospd-openvas: image: greenbone/ospd-openvas:stable restart: on-failure @@ -124,6 +156,8 @@ services: - notus_data_vol:/var/lib/notus - ospd_openvas_socket_vol:/run/ospd - redis_socket_vol:/run/redis/ + - openvas_data_vol:/etc/openvas + - openvas_log_data_vol:/var/log/openvas depends_on: redis-server: condition: service_started @@ -131,6 +165,8 @@ services: condition: service_completed_successfully vulnerability-tests: condition: service_completed_successfully + configure-openvas: + condition: service_completed_successfully mqtt-broker: restart: on-failure @@ -177,3 +213,5 @@ volumes: gvmd_socket_vol: ospd_openvas_socket_vol: redis_socket_vol: + openvas_data_vol: + openvas_log_data_vol: From 217ffdc39f6bc8b6c7fb739d064d00643f461cf7 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Thu, 11 Apr 2024 12:09:57 +0200 Subject: [PATCH 018/107] Add: openvasd Remove: notus With https://github.com/greenbone/openvas-scanner/pull/1519 notus is deprecated in favour of openvasd/notus endpoint. For more details see: https://greenbone.github.io/scanner-api/ for a general overview of the API implemented by openvasd. This removes the dependencies of a mqtt broker as well as notus service. --- src/_static/docker-compose-22.4.yml | 59 +++++++++++++++-------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index 630cd863..f6d8c00a 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -101,13 +101,11 @@ services: image: greenbone/openvas-scanner:stable volumes: - openvas_data_vol:/mnt - environment: - LOG_LEVEL: 128 command: - /bin/sh - -c - | - cp /etc/openvas/openvas.conf /mnt/ + printf "table_driven_lsc = yes\nopenvasd_server = http://openvasd:80\n" > /mnt/openvas.conf sed "s/127/128/" /etc/openvas/openvas_log.conf | sed 's/gvm/openvas/' > /mnt/openvas_log.conf chmod 644 /mnt/openvas.conf chmod 644 /mnt/openvas_log.conf @@ -127,6 +125,36 @@ services: depends_on: configure-openvas: condition: service_completed_successfully + + openvasd: + image: greenbone/openvas-scanner:stable + restart: on-failure + environment: + # `service_notus` is set to disable everything but notus, + # if you want to utilize openvasd directly removed `OPENVAS_MOD` + OPENVASD_MOD: service_notus + GNUPGHOME: /etc/openvas/gnupg + LISTENING: 0.0.0.0:80 + volumes: + - openvas_data_vol:/etc/openvas + - openvas_log_data_vol:/var/log/openvas + - gpg_data_vol:/etc/openvas/gnupg + - notus_data_vol:/var/lib/notus + # enable port forwarding when you want to use the http api from your host machine + # ports: + # - 127.0.0.1:3000:80 + depends_on: + vulnerability-tests: + condition: service_completed_successfully + configure-openvas: + condition: service_completed_successfully + gpg-data: + condition: service_completed_successfully + networks: + default: + aliases: + - openvasd + ospd-openvas: image: greenbone/ospd-openvas:stable restart: on-failure @@ -143,8 +171,6 @@ services: "-f", "--config", "/etc/gvm/ospd-openvas.conf", - "--mqtt-broker-address", - "mqtt-broker", "--notus-feed-dir", "/var/lib/notus/advisories", "-m", @@ -168,29 +194,6 @@ services: configure-openvas: condition: service_completed_successfully - mqtt-broker: - restart: on-failure - image: greenbone/mqtt-broker - networks: - default: - aliases: - - mqtt-broker - - broker - - notus-scanner: - restart: on-failure - image: greenbone/notus-scanner:stable - volumes: - - notus_data_vol:/var/lib/notus - - gpg_data_vol:/etc/openvas/gnupg - environment: - NOTUS_SCANNER_MQTT_BROKER_ADDRESS: mqtt-broker - NOTUS_SCANNER_PRODUCTS_DIRECTORY: /var/lib/notus/products - depends_on: - - mqtt-broker - - gpg-data - - vulnerability-tests - gvm-tools: image: greenbone/gvm-tools volumes: From 881f3a44cc1776870f194e699183ab0ed0a690c7 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Thu, 11 Apr 2024 13:19:53 +0200 Subject: [PATCH 019/107] Doc: remove notus-scanner and explain openvasd installation --- src/22.4/source-build/index.md | 19 ++++------ src/22.4/source-build/mqtt-broker.md | 30 --------------- src/22.4/source-build/notus-scanner/build.md | 26 ------------- .../notus-scanner/dependencies.md | 37 ------------------- .../source-build/notus-scanner/description.md | 4 -- .../source-build/notus-scanner/download.md | 23 ------------ src/22.4/source-build/openvasd/build.md | 23 ++++++++++++ .../source-build/openvasd/dependencies.md | 29 +++++++++++++++ src/22.4/source-build/openvasd/description.md | 7 ++++ src/22.4/source-build/openvasd/download.md | 23 ++++++++++++ 10 files changed, 90 insertions(+), 131 deletions(-) delete mode 100644 src/22.4/source-build/mqtt-broker.md delete mode 100644 src/22.4/source-build/notus-scanner/build.md delete mode 100644 src/22.4/source-build/notus-scanner/dependencies.md delete mode 100644 src/22.4/source-build/notus-scanner/description.md delete mode 100644 src/22.4/source-build/notus-scanner/download.md create mode 100644 src/22.4/source-build/openvasd/build.md create mode 100644 src/22.4/source-build/openvasd/dependencies.md create mode 100644 src/22.4/source-build/openvasd/description.md create mode 100644 src/22.4/source-build/openvasd/download.md diff --git a/src/22.4/source-build/index.md b/src/22.4/source-build/index.md index 7ae3625e..e8c6feac 100644 --- a/src/22.4/source-build/index.md +++ b/src/22.4/source-build/index.md @@ -142,7 +142,7 @@ export GSAD_VERSION=22.9.0 ```{code-block} :caption: Setting the openvas-scanner version to use -export OPENVAS_SCANNER_VERSION=22.7.9 +export OPENVAS_SCANNER_VERSION=23.0.1 ``` ```{include} /22.4/source-build/openvas-scanner/dependencies.md @@ -174,24 +174,24 @@ export OSPD_OPENVAS_VERSION=22.6.2 ```{include} /22.4/source-build/ospd-openvas/build.md ``` -### notus-scanner +### openvasd -```{include} /22.4/source-build/notus-scanner/description.md +```{include} /22.4/source-build/openvasd/description.md ``` ```{code-block} -:caption: Setting the notus version to use +:caption: Setting the openvas versions to use -export NOTUS_VERSION=22.6.2 +export OPENVAS_DAEMON=23.0.1 ``` -```{include} /22.4/source-build/notus-scanner/dependencies.md +```{include} /22.4/source-build/openvasd/dependencies.md ``` -```{include} /22.4/source-build/notus-scanner/download.md +```{include} /22.4/source-build/openvasd/download.md ``` -```{include} /22.4/source-build/notus-scanner/build.md +```{include} /22.4/source-build/openvasd/build.md ``` ### greenbone-feed-sync @@ -221,9 +221,6 @@ export NOTUS_VERSION=22.6.2 ```{include} /22.4/source-build/redis.md ``` -```{include} /22.4/source-build/mqtt-broker.md -``` - ```{include} /22.4/source-build/directory-permissions.md ``` diff --git a/src/22.4/source-build/mqtt-broker.md b/src/22.4/source-build/mqtt-broker.md deleted file mode 100644 index f738f4ec..00000000 --- a/src/22.4/source-build/mqtt-broker.md +++ /dev/null @@ -1,30 +0,0 @@ -### Setting up the Mosquitto MQTT Broker - -The Mosquitto MQTT broker is used for communication between -*ospd-openvas*, *openvas-scanner* and *notus-scanner*. - -```{eval-rst} -.. tabs:: - .. tab:: Debian/Ubuntu - .. code-block:: - :caption: Installing the Mosquitto broker - - sudo apt install -y mosquitto - - .. tab:: Fedora/CentOS - .. code-block:: - :caption: Installing the Mosquitto broker - - sudo dnf install -y mosquitto -``` - -After installing the Mosquitto broker package, the broker must be started -and the server uri must be added to the *openvas-scanner* configuration. - -```{code-block} -:caption: Starting the broker and adding the server uri to the openvas-scanner configuration - -sudo systemctl start mosquitto.service -sudo systemctl enable mosquitto.service -echo -e "mqtt_server_uri = localhost:1883\ntable_driven_lsc = yes" | sudo tee -a /etc/openvas/openvas.conf -``` diff --git a/src/22.4/source-build/notus-scanner/build.md b/src/22.4/source-build/notus-scanner/build.md deleted file mode 100644 index bbefd1f3..00000000 --- a/src/22.4/source-build/notus-scanner/build.md +++ /dev/null @@ -1,26 +0,0 @@ -```{eval-rst} -.. tabs:: - .. tab:: Debian/Ubuntu - .. code-block:: - :caption: Installing notus-scanner - - cd $SOURCE_DIR/notus-scanner-$NOTUS_VERSION - - mkdir -p $INSTALL_DIR/notus-scanner - - python3 -m pip install --root=$INSTALL_DIR/notus-scanner --no-warn-script-location . - - sudo cp -rv $INSTALL_DIR/notus-scanner/* / - - .. tab:: Fedora/CentOS - .. code-block:: - :caption: Installing notus-scanner - - cd $SOURCE_DIR/notus-scanner-$NOTUS_VERSION - - mkdir -p $INSTALL_DIR/notus-scanner - - python3 -m pip install --prefix=$INSTALL_PREFIX --root=$INSTALL_DIR/notus-scanner --no-warn-script-location . - - sudo cp -rv $INSTALL_DIR/notus-scanner/* / -``` diff --git a/src/22.4/source-build/notus-scanner/dependencies.md b/src/22.4/source-build/notus-scanner/dependencies.md deleted file mode 100644 index 71b97901..00000000 --- a/src/22.4/source-build/notus-scanner/dependencies.md +++ /dev/null @@ -1,37 +0,0 @@ -```{eval-rst} -.. tabs:: - .. tab:: Debian/Ubuntu - .. code-block:: - :caption: Required dependencies for notus-scanner - - sudo apt install -y \ - python3 \ - python3-pip \ - python3-setuptools \ - python3-paho-mqtt \ - python3-psutil \ - python3-gnupg - - .. tab:: Fedora - .. code-block:: - :caption: Required dependencies for notus-scanner - - sudo dnf install -y \ - python3 \ - python3-pip \ - python3-setuptools \ - python3-paho-mqtt \ - python3-psutil \ - python3-gnupg - - .. tab:: CentOS - .. code-block:: - :caption: Required dependencies for notus-scanner - - sudo dnf install -y \ - python3 \ - python3-pip \ - python3-setuptools \ - python3-wheel \ - python3-psutil -``` diff --git a/src/22.4/source-build/notus-scanner/description.md b/src/22.4/source-build/notus-scanner/description.md deleted file mode 100644 index 3f61db3e..00000000 --- a/src/22.4/source-build/notus-scanner/description.md +++ /dev/null @@ -1,4 +0,0 @@ -*notus-scanner* is used for detecting vulnerable products by evaluating -internal system information gathered by *openvas-scanner*. -It communicates with *openvas-scanner* and *ospd-openvas* via -[MQTT](https://en.wikipedia.org/wiki/MQTT). It is running as a daemon. diff --git a/src/22.4/source-build/notus-scanner/download.md b/src/22.4/source-build/notus-scanner/download.md deleted file mode 100644 index fd0ce122..00000000 --- a/src/22.4/source-build/notus-scanner/download.md +++ /dev/null @@ -1,23 +0,0 @@ -```{code-block} -:caption: Downloading the notus-scanner sources - -curl -f -L https://github.com/greenbone/notus-scanner/archive/refs/tags/v$NOTUS_VERSION.tar.gz -o $SOURCE_DIR/notus-scanner-$NOTUS_VERSION.tar.gz -curl -f -L https://github.com/greenbone/notus-scanner/releases/download/v$NOTUS_VERSION/notus-scanner-v$NOTUS_VERSION.tar.gz.asc -o $SOURCE_DIR/notus-scanner-$NOTUS_VERSION.tar.gz.asc -``` - -```{code-block} -:caption: Verifying the source files - -gpg --verify $SOURCE_DIR/notus-scanner-$NOTUS_VERSION.tar.gz.asc $SOURCE_DIR/notus-scanner-$NOTUS_VERSION.tar.gz -``` - -The output of the last command should be similar to: - -```{include} /22.4/source-build/verify.md -``` - -If the signatures are valid, the tarballs can be extracted. - -``` -tar -C $SOURCE_DIR -xvzf $SOURCE_DIR/notus-scanner-$NOTUS_VERSION.tar.gz -``` diff --git a/src/22.4/source-build/openvasd/build.md b/src/22.4/source-build/openvasd/build.md new file mode 100644 index 00000000..5387e73f --- /dev/null +++ b/src/22.4/source-build/openvasd/build.md @@ -0,0 +1,23 @@ +```{eval-rst} +.. tabs:: + .. tab:: Debian/Ubuntu + .. code-block:: + :caption: Installing openvas-scanner + + cd $SOURCE_DIR/openvas-scanner-$NOTUS_VERSION/rust/openvasd + + cargo build --release + + sudo cp -v ../target/release/openvasd /usr/local/bin/ + + .. tab:: Fedora/CentOS + .. code-block:: + :caption: Installing openvas-scanner + + + cd $SOURCE_DIR/openvas-scanner-$NOTUS_VERSION/rust/openvasd + + cargo build --release + + sudo cp -v ../target/release/openvasd /usr/local/bin/ +``` diff --git a/src/22.4/source-build/openvasd/dependencies.md b/src/22.4/source-build/openvasd/dependencies.md new file mode 100644 index 00000000..0722fd4b --- /dev/null +++ b/src/22.4/source-build/openvasd/dependencies.md @@ -0,0 +1,29 @@ +```{eval-rst} +.. tabs:: + .. tab:: Debian/Ubuntu + .. code-block:: + :caption: Required dependencies for openvasd + + sudo apt install -y \ + cargo \ + pkg-config \ + libssl-dev + + .. tab:: Fedora + .. code-block:: + :caption: Required dependencies for openvasd + + sudo dnf install -y \ + cargo \ + pkg-config \ + openssl-devel + + .. tab:: CentOS + .. code-block:: + :caption: Required dependencies for openvasd + + sudo dnf install -y \ + cargo \ + pkg-config \ + openssl-devel +``` diff --git a/src/22.4/source-build/openvasd/description.md b/src/22.4/source-build/openvasd/description.md new file mode 100644 index 00000000..0a378c5c --- /dev/null +++ b/src/22.4/source-build/openvasd/description.md @@ -0,0 +1,7 @@ +*OpenVASD* is used for detecting vulnerable products. + +It controls `openvas-scanner` for scanning and is used to get the results. + +For more information see: +- https://greenbone.github.io/scanner-api/ +- https://github.com/greenbone/openvas-scanner/tree/main/rust/openvasd diff --git a/src/22.4/source-build/openvasd/download.md b/src/22.4/source-build/openvasd/download.md new file mode 100644 index 00000000..27cb228a --- /dev/null +++ b/src/22.4/source-build/openvasd/download.md @@ -0,0 +1,23 @@ +```{code-block} +:caption: Downloading the openvas-scanner sources + +curl -f -L https://github.com/greenbone/openvas-scanner/archive/refs/tags/v$OPENVAS_DAEMON.tar.gz -o $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON.tar.gz +curl -f -L https://github.com/greenbone/openvas-scanner/releases/download/v$OPENVAS_DAEMON/openvas-scanner-v$OPENVAS_DAEMON.tar.gz.asc -o $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON.tar.gz.asc +``` + +```{code-block} +:caption: Verifying the source file + +gpg --verify $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON.tar.gz.asc $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON.tar.gz +``` + +The output of the last command should be similar to: + +```{include} /22.4/source-build/verify.md +``` + +If the signature is valid, the tarball can be extracted. + +``` +tar -C $SOURCE_DIR -xvzf $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON.tar.gz +``` From fbd998639735a83dbb2bf5a29704f300ec492600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Mon, 15 Apr 2024 10:08:01 +0200 Subject: [PATCH 020/107] Update changelog.md --- src/changelog.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/changelog.md b/src/changelog.md index 0069fb6b..2f55fea8 100644 --- a/src/changelog.md +++ b/src/changelog.md @@ -22,9 +22,8 @@ and this project adheres to [Calendar Versioning](https://calver.org). * Update pg-gvm to 22.6.4 * Update gsad to 22.9.0 * Update GSA to 23.0.0 -* Update OpenVAS Scanner to 22.7.9 -* Update notus-scanner to 22.6.2 -* Update ospd-openvas to 22.6.2 +* Update OpenVAS Scanner to 23.0.1 +* Drop notus-scanner in favor of the new OpenVAS Daemon (openvasd). This made the Mosquitto MQTT broker obsolete too. ## 23.11.0 * Add workflow page for source builds From e0b4711ee4e0ec091370228a3d7be80426ddfcc3 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 17 Apr 2024 14:03:20 +0200 Subject: [PATCH 021/107] Fix: can not open or create log file When executing docker-compose on some systems: ``` Can not open or create log file or directory. Please check permissions of log files listed in /etc/openvas/openvas_log.conf ``` occurs. To fix that we create a openvas.log upfront with the persmissions `666`. --- src/_static/docker-compose-22.4.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index f6d8c00a..f842b6af 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -101,6 +101,7 @@ services: image: greenbone/openvas-scanner:stable volumes: - openvas_data_vol:/mnt + - openvas_log_data_vol:/var/log/openvas command: - /bin/sh - -c @@ -109,6 +110,8 @@ services: sed "s/127/128/" /etc/openvas/openvas_log.conf | sed 's/gvm/openvas/' > /mnt/openvas_log.conf chmod 644 /mnt/openvas.conf chmod 644 /mnt/openvas_log.conf + touch /var/log/openvas/openvas.log + chmod 666 /var/log/openvas/openvas.log # shows logs of openvas openvas: image: greenbone/openvas-scanner:stable @@ -182,7 +185,7 @@ services: - notus_data_vol:/var/lib/notus - ospd_openvas_socket_vol:/run/ospd - redis_socket_vol:/run/redis/ - - openvas_data_vol:/etc/openvas + - openvas_data_vol:/etc/openvas/ - openvas_log_data_vol:/var/log/openvas depends_on: redis-server: From ef15a28786fb160de9db50bc7b517df62af3dccd Mon Sep 17 00:00:00 2001 From: Toys0125 Date: Wed, 17 Apr 2024 13:38:53 -0500 Subject: [PATCH 022/107] OpenVasd Build Documation Fixed export variable for the path name for OpenVasd. --- src/22.4/source-build/openvasd/build.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/22.4/source-build/openvasd/build.md b/src/22.4/source-build/openvasd/build.md index 5387e73f..a3a19b8e 100644 --- a/src/22.4/source-build/openvasd/build.md +++ b/src/22.4/source-build/openvasd/build.md @@ -4,7 +4,7 @@ .. code-block:: :caption: Installing openvas-scanner - cd $SOURCE_DIR/openvas-scanner-$NOTUS_VERSION/rust/openvasd + cd $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON/rust/openvasd cargo build --release @@ -15,7 +15,7 @@ :caption: Installing openvas-scanner - cd $SOURCE_DIR/openvas-scanner-$NOTUS_VERSION/rust/openvasd + cd $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON/rust/openvasd cargo build --release From 046bcae1f77b5ec07863b7dc95c3ce4111aba8c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 04:07:38 +0000 Subject: [PATCH 023/107] Bump the python-packages group with 2 updates Bumps the python-packages group with 2 updates: [sphinx](https://github.com/sphinx-doc/sphinx) and [sphinx-autobuild](https://github.com/sphinx-doc/sphinx-autobuild). Updates `sphinx` from 7.2.6 to 7.3.7 - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v7.2.6...v7.3.7) Updates `sphinx-autobuild` from 2024.2.4 to 2024.4.16 - [Release notes](https://github.com/sphinx-doc/sphinx-autobuild/releases) - [Changelog](https://github.com/sphinx-doc/sphinx-autobuild/blob/main/NEWS.rst) - [Commits](https://github.com/sphinx-doc/sphinx-autobuild/compare/2024.02.04...2024.04.16) --- updated-dependencies: - dependency-name: sphinx dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: sphinx-autobuild dependency-type: direct:development update-type: version-update:semver-minor dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 355 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 306 insertions(+), 49 deletions(-) diff --git a/poetry.lock b/poetry.lock index de7ec989..f19e6306 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,28 @@ files = [ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] +[[package]] +name = "anyio" +version = "4.3.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + [[package]] name = "babel" version = "2.14.0" @@ -156,6 +178,20 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -178,6 +214,20 @@ files = [ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] +[[package]] +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "furo" version = "2024.1.29" @@ -195,6 +245,17 @@ pygments = ">=2.7" sphinx = ">=6.0,<8.0" sphinx-basic-ng = "*" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "idna" version = "3.7" @@ -253,21 +314,6 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "livereload" -version = "2.6.3" -description = "Python LiveReload is an awesome tool for web developers" -optional = false -python-versions = "*" -files = [ - {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, - {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, -] - -[package.dependencies] -six = "*" -tornado = {version = "*", markers = "python_version > \"2.7\""} - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -525,14 +571,14 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -559,20 +605,20 @@ files = [ [[package]] name = "sphinx" -version = "7.2.6" +version = "7.3.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, - {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, + {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, + {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" +alabaster = ">=0.7.14,<0.8.0" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.21" +docutils = ">=0.18.1,<0.22" imagesize = ">=1.3" importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" @@ -586,30 +632,34 @@ sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] -test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] +lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] [[package]] name = "sphinx-autobuild" -version = "2024.2.4" -description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." +version = "2024.4.16" +description = "Rebuild Sphinx documentation on changes, with hot reloading in the browser." optional = false python-versions = ">=3.9" files = [ - {file = "sphinx_autobuild-2024.2.4-py3-none-any.whl", hash = "sha256:63fd87ab7505872a89aef468ce6503f65e794a195f4ae62269db3b85b72d4854"}, - {file = "sphinx_autobuild-2024.2.4.tar.gz", hash = "sha256:cb9d2121a176d62d45471624872afc5fad7755ad662738abe400ecf4a7954303"}, + {file = "sphinx_autobuild-2024.4.16-py3-none-any.whl", hash = "sha256:f2522779d30fcbf0253e09714f274ce8c608cb6ebcd67922b1c54de59faba702"}, + {file = "sphinx_autobuild-2024.4.16.tar.gz", hash = "sha256:1c0ed37a1970eed197f9c5a66d65759e7c4e4cba7b5a5d77940752bf1a59f2c7"}, ] [package.dependencies] colorama = "*" -livereload = "*" sphinx = "*" +starlette = ">=0.35" +uvicorn = ">=0.25" +watchfiles = ">=0.20" +websockets = ">=11" [package.extras] -test = ["pytest (>=6.0)", "pytest-cov"] +test = ["pytest (>=6)"] [[package]] name = "sphinx-basic-ng" @@ -775,23 +825,43 @@ files = [ sphinx = ">=4.0" [[package]] -name = "tornado" -version = "6.4" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] @@ -811,6 +881,193 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.29.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "watchfiles" +version = "0.21.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, + {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, + {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, + {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, + {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, + {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, + {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, + {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, + {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, + {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, + {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, + {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, + {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, + {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + [[package]] name = "zipp" version = "3.18.1" From cd4ff0a0afff1d5ca0b73b9c80393b8e2398da58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Fri, 19 Apr 2024 11:21:27 +0200 Subject: [PATCH 024/107] Change: Update docs for replacing notus-scanner with openvasd --- src/22.4/container/index.md | 5 +-- src/22.4/container/manual-feed-sync.md | 12 ++------ src/22.4/source-build/start-services.md | 3 -- src/22.4/source-build/systemd.md | 41 +++---------------------- src/22.4/source-build/workflows.md | 12 ++++---- src/_static/docker-compose-22.4.yml | 5 +-- src/glossary.md | 16 ++++++---- 7 files changed, 29 insertions(+), 65 deletions(-) diff --git a/src/22.4/container/index.md b/src/22.4/container/index.md index faf9d73f..ffc29dca 100644 --- a/src/22.4/container/index.md +++ b/src/22.4/container/index.md @@ -48,8 +48,6 @@ and their services in detail. | gvmd | gvmd | A container for {term}`gvmd` that uses unix sockets in volumes to communicate with the PostgreSQL database and ospd-openvas scanner. The downloaded feed data is stored in the `gvmd_data_vol` volume. To verify the feed data, the GPG keyring from the `gpg_data_vol` is used. | | gsa | gsad | A container running the {term}`gsad` web server for providing the web application {term}`GSA`. The web interface is available at localhost on port 9392. For communication with gvmd, a unix socket in a volume is used. | | ospd-openvas | ospd-openvas | A container providing the vulnerability scanner. The VT data from the feed is stored in the `vt_data_vol` volume. To verify the feed data, the GPG keyring from the `gpg_data_vol` is used. The connection to the redis server is established via a unix socket in a volume. | -| mqtt-broker | [Mosquitto MQTT Broker](https://mosquitto.org/) | An MQTT Broker used for communication between notus-scanner, openvas-scanner and ospd-openvas. | -| notus-scanner | notus-scanner | A container running the {term}`notus-scanner` used for local security checks. To verify the feed data, the GPG keyring from the `gpg_data_vol` is used. The feed data for notus-scanner itself is stored in the `notus_data_vol`. | | gvm-tools | | A container providing the [gvm-tools](https://github.com/greenbone/gvm-tools/) CLI to query and control gvmd and ospd-openvas. | | gpg-data | | A container that copies a GPG keyring with Greenbone's public signing keys into the `gpg_data_vol` volume on startup. It exits afterwards. | | vulnerability-tests | | A container that copies vulnerability tests (VTs) into the `vt_data_vol` volume on startup. Shows the license and exits afterwards. | @@ -59,6 +57,9 @@ and their services in detail. | dfn-cert-data | | A container that copies DFN-CERT data into the `cert_data_vol` volume on startup. Shows the license and exits afterwards. | | data-objects | | A container that copies scan configs, compliance policies and port lists into the `data_objects_vol` volume on startup. Shows the license and exits afterwards. | | report-formats | | A container that copies report formats into the `data_objects_vol` volume on startup. Shows the license and exits afterwards. | +| configure-openvas | | A container for setting up the configuration for OpenVAS Scanner | +| openvas | | A container that shows the logs of OpenVAS Scanner | +| openvasd | ? | ? | ```{include} /22.4/container/starting.md ``` diff --git a/src/22.4/container/manual-feed-sync.md b/src/22.4/container/manual-feed-sync.md index 03a8edd0..129bc593 100644 --- a/src/22.4/container/manual-feed-sync.md +++ b/src/22.4/container/manual-feed-sync.md @@ -34,13 +34,7 @@ caption: Extending the docker compose file for performing a manual feed sync usi ### Syncing Vulnerability Tests VT data contains {file}`.nasl` and {file}`.notus` files for creating results -during a vulnerability scan. The `.nasl` files are processed by the OpenVAS -Scanner and the `.notus` files by the {term}`Notus Scanner `. - -```{hint} -{file}`.notus` files and the {term}`Notus Scanner ` are only -available for 22.4. -``` +during a vulnerability scan. ```{code-block} shell --- @@ -53,8 +47,8 @@ docker compose -f $DOWNLOAD_DIR/docker-compose.yml -p greenbone-community-editio ```{code-block} shell --- -caption: Downloading {term}`notus` {term}`VTs` processed by - the Notus Scanner, this will take a while. +caption: Downloading `notus` {term}`VTs` processed for local security checks, + this will take a while. --- docker compose -f $DOWNLOAD_DIR/docker-compose.yml -p greenbone-community-edition \ run --rm greenbone-feed-sync greenbone-feed-sync --type notus diff --git a/src/22.4/source-build/start-services.md b/src/22.4/source-build/start-services.md index dcfaf6cd..fd2349a6 100644 --- a/src/22.4/source-build/start-services.md +++ b/src/22.4/source-build/start-services.md @@ -19,7 +19,6 @@ or even hours! ```{code-block} :caption: Finally starting the services -sudo systemctl start notus-scanner sudo systemctl start ospd-openvas sudo systemctl start gvmd sudo systemctl start gsad @@ -28,7 +27,6 @@ sudo systemctl start gsad ```{code-block} :caption: Ensuring services are run at every system startup -sudo systemctl enable notus-scanner sudo systemctl enable ospd-openvas sudo systemctl enable gvmd sudo systemctl enable gsad @@ -37,7 +35,6 @@ sudo systemctl enable gsad ```{code-block} :caption: Checking the status of the services -sudo systemctl status notus-scanner sudo systemctl status ospd-openvas sudo systemctl status gvmd sudo systemctl status gsad diff --git a/src/22.4/source-build/systemd.md b/src/22.4/source-build/systemd.md index 570a49cb..17430c66 100644 --- a/src/22.4/source-build/systemd.md +++ b/src/22.4/source-build/systemd.md @@ -1,7 +1,7 @@ ### Setting up Services for *Systemd* [Systemd](https://systemd.io/) is used to start the daemons *ospd-openvas*, -*notus-scanner*, *gvmd* and *gsad*. Therefore, service files are required. +*gvmd* and *gsad*. Therefore, service files are required. ```{code-block} :caption: Systemd service file for ospd-openvas @@ -10,8 +10,8 @@ cat << EOF > $BUILD_DIR/ospd-openvas.service [Unit] Description=OSPd Wrapper for the OpenVAS Scanner (ospd-openvas) Documentation=man:ospd-openvas(8) man:openvas(8) -After=network.target networking.service redis-server@openvas.service mosquitto.service -Wants=redis-server@openvas.service mosquitto.service notus-scanner.service +After=network.target networking.service redis-server@openvas.service +Wants=redis-server@openvas.service ConditionKernelCommandLine=!recovery [Service] @@ -21,7 +21,7 @@ Group=gvm RuntimeDirectory=ospd RuntimeDirectoryMode=2775 PIDFile=/run/ospd/ospd-openvas.pid -ExecStart=/usr/local/bin/ospd-openvas --foreground --unix-socket /run/ospd/ospd-openvas.sock --pid-file /run/ospd/ospd-openvas.pid --log-file /var/log/gvm/ospd-openvas.log --lock-file-dir /var/lib/openvas --socket-mode 0o770 --mqtt-broker-address localhost --mqtt-broker-port 1883 --notus-feed-dir /var/lib/notus/advisories +ExecStart=/usr/local/bin/ospd-openvas --foreground --unix-socket /run/ospd/ospd-openvas.sock --pid-file /run/ospd/ospd-openvas.pid --log-file /var/log/gvm/ospd-openvas.log --lock-file-dir /var/lib/openvas --socket-mode 0o770 --notus-feed-dir /var/lib/notus/advisories SuccessExitStatus=SIGKILL Restart=always RestartSec=60 @@ -37,39 +37,6 @@ EOF sudo cp -v $BUILD_DIR/ospd-openvas.service /etc/systemd/system/ ``` -```{code-block} -:caption: Systemd service file for notus-scanner - -cat << EOF > $BUILD_DIR/notus-scanner.service -[Unit] -Description=Notus Scanner -Documentation=https://github.com/greenbone/notus-scanner -After=mosquitto.service -Wants=mosquitto.service -ConditionKernelCommandLine=!recovery - -[Service] -Type=exec -User=gvm -RuntimeDirectory=notus-scanner -RuntimeDirectoryMode=2775 -PIDFile=/run/notus-scanner/notus-scanner.pid -ExecStart=/usr/local/bin/notus-scanner --foreground --products-directory /var/lib/notus/products --log-file /var/log/gvm/notus-scanner.log -SuccessExitStatus=SIGKILL -Restart=always -RestartSec=60 - -[Install] -WantedBy=multi-user.target -EOF -``` - -```{code-block} -:caption: Install systemd service file for notus-scanner - -sudo cp -v $BUILD_DIR/notus-scanner.service /etc/systemd/system/ -``` - ```{code-block} :caption: Systemd service file for gvmd diff --git a/src/22.4/source-build/workflows.md b/src/22.4/source-build/workflows.md index 73417eca..e76db044 100644 --- a/src/22.4/source-build/workflows.md +++ b/src/22.4/source-build/workflows.md @@ -13,7 +13,7 @@ First, the services should be stopped to be able to replace them later on. --- caption: Stopping all services --- -sudo systemctl stop gsad gvmd notus-scanner ospd-openvas +sudo systemctl stop gsad gvmd ospd-openvas ``` Afterwards, you must verify that all [prerequisites](./index.md#prerequisites) are met. @@ -21,14 +21,14 @@ In particular, make sure that the [install prefix](./index.md#choosing-an-instal [PATH](./index.md#setting-the-path) and the [required environment variables](./index.md#creating-a-source-build-and-install-directory) are set. -For being able to update `ospd-openvas`, `notus-scanner`, `greenbone-feed-sync` -and `gvm-tools` they must be uninstalled first. +For being able to update `ospd-openvas`, `greenbone-feed-sync` and `gvm-tools` +they must be uninstalled first. ```{code-block} shell --- -caption: Uninstall ospd-openvas, notus-scanner, greenbone-feed-sync and gvm-tools +caption: Uninstall ospd-openvas, greenbone-feed-sync and gvm-tools --- -sudo python3 -m pip uninstall --break-system-packages ospd-openvas notus-scanner greenbone-feed-sync gvm-tools +sudo python3 -m pip uninstall --break-system-packages ospd-openvas greenbone-feed-sync gvm-tools ``` The `--break-system-packages` argument is required because of [PEP 668](https://peps.python.org/pep-0668/). @@ -56,7 +56,7 @@ been updated, the last step is to restart the services. --- caption: Restarting all services --- -sudo systemctl start gsad gvmd notus-scanner ospd-openvas +sudo systemctl start gsad gvmd ospd-openvas ``` ## Accessing the Web Interface Remotely diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index f842b6af..10cd4b02 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -102,7 +102,7 @@ services: volumes: - openvas_data_vol:/mnt - openvas_log_data_vol:/var/log/openvas - command: + command: - /bin/sh - -c - | @@ -112,6 +112,7 @@ services: chmod 644 /mnt/openvas_log.conf touch /var/log/openvas/openvas.log chmod 666 /var/log/openvas/openvas.log + # shows logs of openvas openvas: image: greenbone/openvas-scanner:stable @@ -177,7 +178,7 @@ services: "--notus-feed-dir", "/var/lib/notus/advisories", "-m", - "666" + "666", ] volumes: - gpg_data_vol:/etc/openvas/gnupg diff --git a/src/glossary.md b/src/glossary.md index 320f095e..60c90ee7 100644 --- a/src/glossary.md +++ b/src/glossary.md @@ -21,6 +21,10 @@ openvas and to store scan results into a Redis database. Used in GVM 11 and later. It has originated from the {term}`openvassd`. +openvasd + + A new ? introduced with the OpenVAS Scanner release 23.0. Describe me further! + OSPd A [framework](https://github.com/greenbone/ospd) for several scanner @@ -143,12 +147,12 @@ CVE notus-scanner - A new scanner that got introduced in the 22.4 release to improve the so-called - local security checks. Local security checks are comparisons of - vulnerable and installed versions of a software. Before notus-scanner, all - checks have been implemented in {term}`NASL` scripts and each {term}`NASL` - script ran in an own openvas-scanner process. With notus-scanner, checks are - run in one go per host. + A scanner to improve the so-called local security checks. Local security + checks are comparisons of vulnerable and installed versions of a software. + Before notus-scanner, all checks have been implemented in {term}`NASL` scripts + and each {term}`NASL` script ran in an own openvas-scanner process. + With notus-scanner, checks are run in one go per host. With the + OpenVAS Scanner release 23.0 it got replaced by {term}`openvasd`. Feed From de40eee3a73ab42bf5add773cff93e4cabcf4293 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Fri, 19 Apr 2024 15:06:09 +0200 Subject: [PATCH 025/107] Add: openvasd container description --- src/22.4/container/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/22.4/container/index.md b/src/22.4/container/index.md index ffc29dca..45ee8fa8 100644 --- a/src/22.4/container/index.md +++ b/src/22.4/container/index.md @@ -59,7 +59,7 @@ and their services in detail. | report-formats | | A container that copies report formats into the `data_objects_vol` volume on startup. Shows the license and exits afterwards. | | configure-openvas | | A container for setting up the configuration for OpenVAS Scanner | | openvas | | A container that shows the logs of OpenVAS Scanner | -| openvasd | ? | ? | +| openvasd | openvasd | A container for [openvasd](https://github.com/greenbone/openvas-scanner/tree/main/rust/openvasd). It is providing notus, a static vulnerability engine, functionality. | ```{include} /22.4/container/starting.md ``` From 86f60e04af26ce86fdd6c2ac018acdb26582654e Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Fri, 19 Apr 2024 15:25:58 +0200 Subject: [PATCH 026/107] Add: service description for openvasd --- src/22.4/source-build/start-services.md | 3 +++ src/22.4/source-build/systemd.md | 28 ++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/22.4/source-build/start-services.md b/src/22.4/source-build/start-services.md index fd2349a6..98c2e780 100644 --- a/src/22.4/source-build/start-services.md +++ b/src/22.4/source-build/start-services.md @@ -22,6 +22,7 @@ or even hours! sudo systemctl start ospd-openvas sudo systemctl start gvmd sudo systemctl start gsad +sudo systemctl start openvasd ``` ```{code-block} @@ -30,6 +31,7 @@ sudo systemctl start gsad sudo systemctl enable ospd-openvas sudo systemctl enable gvmd sudo systemctl enable gsad +sudo systemctl enable openvasd ``` ```{code-block} @@ -38,4 +40,5 @@ sudo systemctl enable gsad sudo systemctl status ospd-openvas sudo systemctl status gvmd sudo systemctl status gsad +sudo systemctl status openvasd ``` diff --git a/src/22.4/source-build/systemd.md b/src/22.4/source-build/systemd.md index 17430c66..44ab2783 100644 --- a/src/22.4/source-build/systemd.md +++ b/src/22.4/source-build/systemd.md @@ -1,7 +1,7 @@ ### Setting up Services for *Systemd* [Systemd](https://systemd.io/) is used to start the daemons *ospd-openvas*, -*gvmd* and *gsad*. Therefore, service files are required. +*openvasd*, *gvmd* and *gsad*. Therefore, service files are required. ```{code-block} :caption: Systemd service file for ospd-openvas @@ -110,3 +110,29 @@ Afterwards, the services need to be activated and started. sudo systemctl daemon-reload ``` + +```{code-block} +:caption: Systemd service file for openvasd +cat << EOF > $BUILD_DIR/openvasd.service +[Unit] +Description=OpenVASD +Documentation=https://github.com/greenbone/openvas-scanner/tree/main/rust/openvasd +ConditionKernelCommandLine=!recovery +[Service] +Type=exec +User=gvm +RuntimeDirectory=openvasd +RuntimeDirectoryMode=2775 +ExecStart=/usr/local/bin/openvasd --mode service_notus --products /var/lib/notus/products --advisories /var/lib/notus/advisories --listening 127.0.0.1:3000 +SuccessExitStatus=SIGKILL +Restart=always +RestartSec=60 +[Install] +WantedBy=multi-user.target +EOF +``` + +```{code-block} +:caption: Install systemd service file for openvasd +sudo cp -v $BUILD_DIR/notus-scanner.service /etc/systemd/system/ +``` From a5432d6f642d696b832433b7355ae07aabe00214 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Fri, 19 Apr 2024 15:51:29 +0200 Subject: [PATCH 027/107] Add: description of openvasd and it's goals --- src/22.4/source-build/openvasd/description.md | 6 +++++- src/glossary.md | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/22.4/source-build/openvasd/description.md b/src/22.4/source-build/openvasd/description.md index 0a378c5c..7492d20d 100644 --- a/src/22.4/source-build/openvasd/description.md +++ b/src/22.4/source-build/openvasd/description.md @@ -1,7 +1,11 @@ *OpenVASD* is used for detecting vulnerable products. -It controls `openvas-scanner` for scanning and is used to get the results. +Currently only the [notus](https://greenbone.github.io/scanner-api/#/notus/notus_run) is integrated into gvmd. +That means that `openvas` is using `openvasd` for static version checks if a scan with ssh credentials is started and packages got found. + +If you want to enable the full functionality you either need to adapt the `openvasd.service` file and remove the `--mode service_notus` flag and create a [configuration file](https://github.com/greenbone/openvas-scanner/blob/main/rust/examples/openvasd/config.example.toml) within `/etc/openvasd/openvasd.toml` or adapt the [arguments](https://github.com/greenbone/openvas-scanner/tree/main/rust/openvasd#options) within `openvasd.service` if you don't want to create a configuration file. For more information see: - https://greenbone.github.io/scanner-api/ - https://github.com/greenbone/openvas-scanner/tree/main/rust/openvasd +- https://github.com/greenbone/openvas-scanner/blob/main/rust/examples/openvasd/config.example.toml diff --git a/src/glossary.md b/src/glossary.md index 60c90ee7..1e9eb7b7 100644 --- a/src/glossary.md +++ b/src/glossary.md @@ -23,7 +23,10 @@ openvas openvasd - A new ? introduced with the OpenVAS Scanner release 23.0. Describe me further! + A new service introduced with the OpenVAS Scanner release 23.0 to execute nasl scripts and provide static version comparisons. + It has a http based [API](https://greenbone.github.io/scanner-api/) to control scans and get results. + The adaptation will be done in various downwards compatible ways. As of 23.0.1 `openvas` is using the `/notus` endpoint for version checks, additionally `OpenVASD` is setting up redis and controls `openvas` for scanning. + In the next phases it will gradually take over `openvas` functionality with the end goal of replacing `ospd-openvas` and `openvas` completely. OSPd From 844bee7f6edea129bdb1a92c5121966212cb8507 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Fri, 19 Apr 2024 16:02:02 +0200 Subject: [PATCH 028/107] Add: openvasd configuration --- src/22.4/source-build/openvas-scanner/build.md | 7 +++++++ src/22.4/source-build/systemd.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/22.4/source-build/openvas-scanner/build.md b/src/22.4/source-build/openvas-scanner/build.md index edd1aac4..33c58b1e 100644 --- a/src/22.4/source-build/openvas-scanner/build.md +++ b/src/22.4/source-build/openvas-scanner/build.md @@ -24,3 +24,10 @@ make DESTDIR=$INSTALL_DIR/openvas-scanner install sudo cp -rv $INSTALL_DIR/openvas-scanner/* / ``` + +As of version 23.0 the `openvasd_server` configuration needs to be set to a running `OpenVASD` instance. + +```{code-block} +printf "table_driven_lsc = yes\n" | sudo tee /etc/openvas/openvas.conf +sudo printf "openvasd_server = http://127.0.0.1:3000\n" | sudo tee -a /etc/openvas/openvas.conf +``` diff --git a/src/22.4/source-build/systemd.md b/src/22.4/source-build/systemd.md index 44ab2783..ca4b9cb2 100644 --- a/src/22.4/source-build/systemd.md +++ b/src/22.4/source-build/systemd.md @@ -134,5 +134,5 @@ EOF ```{code-block} :caption: Install systemd service file for openvasd -sudo cp -v $BUILD_DIR/notus-scanner.service /etc/systemd/system/ +sudo cp -v $BUILD_DIR/openvasd.service /etc/systemd/system/ ``` From 56f7bb363ac349a830d6091f98cff6b425fbf3e9 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 24 Apr 2024 14:51:47 +0200 Subject: [PATCH 029/107] Add: libcurl dependency to openvas-scanner --- src/22.4/source-build/openvas-scanner/dependencies.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/22.4/source-build/openvas-scanner/dependencies.md b/src/22.4/source-build/openvas-scanner/dependencies.md index c65e2d45..d3f3c11c 100644 --- a/src/22.4/source-build/openvas-scanner/dependencies.md +++ b/src/22.4/source-build/openvas-scanner/dependencies.md @@ -15,6 +15,7 @@ rsync \ nmap \ libjson-glib-dev \ + libcurl4-gnutls-dev \ libbsd-dev .. code-block:: @@ -39,6 +40,7 @@ rsync \ nmap \ json-glib-devel \ + libcurl-devel \ libbsd-devel .. code-block:: @@ -62,5 +64,6 @@ rsync \ nmap \ json-glib-devel \ + libcurl-devel \ libbsd-devel ``` From 77aafe5c295cf66fa5c23dbc35098a701b995362 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 24 Apr 2024 14:58:05 +0200 Subject: [PATCH 030/107] Add: remove cargo from Debian and Centos Never touch a running system means in those cases that cargo and rustc are too old to compile `OpenVASD`, therefore the instructions cannot rely on the paketmanager and it needs to be installed via rustup.rs --- src/22.4/source-build/openvasd/dependencies.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/22.4/source-build/openvasd/dependencies.md b/src/22.4/source-build/openvasd/dependencies.md index 0722fd4b..534ff901 100644 --- a/src/22.4/source-build/openvasd/dependencies.md +++ b/src/22.4/source-build/openvasd/dependencies.md @@ -1,6 +1,18 @@ +```{note} +For debian and centos systems you have to follow [rustup](https://rustup.rs) instructions because the default Rust version is too dated for `OpenVASD` +``` ```{eval-rst} .. tabs:: - .. tab:: Debian/Ubuntu + .. tab:: Debian + .. code-block:: + :caption: Required dependencies for openvasd + # Follow instuctions of https://rustup.rs + + sudo apt install -y \ + pkg-config \ + libssl-dev + + .. tab:: Ubuntu .. code-block:: :caption: Required dependencies for openvasd @@ -21,9 +33,9 @@ .. tab:: CentOS .. code-block:: :caption: Required dependencies for openvasd + # Follow instuctions of https://rustup.rs sudo dnf install -y \ - cargo \ pkg-config \ openssl-devel ``` From 21d6ee9c95f57ea8add6db3972117d2daf8ee096 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 24 Apr 2024 15:07:23 +0200 Subject: [PATCH 031/107] Add: scnnaerctl to openvasd, respect $INSTALL_DIR Adds a description for scannerctl as well and respects $INSTALL_DIR mentions within openvasd build. --- src/22.4/source-build/openvasd/build.md | 29 ++++++++----------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/22.4/source-build/openvasd/build.md b/src/22.4/source-build/openvasd/build.md index a3a19b8e..c6ebbeab 100644 --- a/src/22.4/source-build/openvasd/build.md +++ b/src/22.4/source-build/openvasd/build.md @@ -1,23 +1,12 @@ -```{eval-rst} -.. tabs:: - .. tab:: Debian/Ubuntu - .. code-block:: - :caption: Installing openvas-scanner - - cd $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON/rust/openvasd - - cargo build --release - - sudo cp -v ../target/release/openvasd /usr/local/bin/ - - .. tab:: Fedora/CentOS - .. code-block:: - :caption: Installing openvas-scanner - - - cd $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON/rust/openvasd +``` +mkdir -p $INSTALL_DIR/openvasd/usr/local/bin +cd $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON/rust/openvasd +cargo build --release - cargo build --release +cd $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON/rust/scannerctl +cargo build --release - sudo cp -v ../target/release/openvasd /usr/local/bin/ +sudo cp -v ../target/release/openvasd $INSTALL_DIR/usr/local/bin/ +sudo cp -v ../target/release/scannerctl $INSTALL_DIR/usr/local/bin/ +sudo cp -rv $INSTALL_DIR/openvasd/* / ``` From b4041ad286ad61814bdf1f7c2303a3a9c7237d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Wed, 24 Apr 2024 15:36:15 +0200 Subject: [PATCH 032/107] Stop and start openvasd via sytemctl too --- src/22.4/source-build/workflows.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/22.4/source-build/workflows.md b/src/22.4/source-build/workflows.md index e76db044..a688b454 100644 --- a/src/22.4/source-build/workflows.md +++ b/src/22.4/source-build/workflows.md @@ -13,7 +13,7 @@ First, the services should be stopped to be able to replace them later on. --- caption: Stopping all services --- -sudo systemctl stop gsad gvmd ospd-openvas +sudo systemctl stop gsad gvmd ospd-openvas openvasd ``` Afterwards, you must verify that all [prerequisites](./index.md#prerequisites) are met. @@ -56,7 +56,7 @@ been updated, the last step is to restart the services. --- caption: Restarting all services --- -sudo systemctl start gsad gvmd ospd-openvas +sudo systemctl start gsad gvmd ospd-openvas openvasd ``` ## Accessing the Web Interface Remotely From 646fb163983ed0054881aefd39588bfb4a8b4e2a Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 24 Apr 2024 15:45:32 +0200 Subject: [PATCH 033/107] Fix: source-build: adds ospd-openvasd systemd dependency to openvasd. --- src/22.4/source-build/systemd.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/22.4/source-build/systemd.md b/src/22.4/source-build/systemd.md index ca4b9cb2..ccb9c32e 100644 --- a/src/22.4/source-build/systemd.md +++ b/src/22.4/source-build/systemd.md @@ -10,8 +10,8 @@ cat << EOF > $BUILD_DIR/ospd-openvas.service [Unit] Description=OSPd Wrapper for the OpenVAS Scanner (ospd-openvas) Documentation=man:ospd-openvas(8) man:openvas(8) -After=network.target networking.service redis-server@openvas.service -Wants=redis-server@openvas.service +After=network.target networking.service redis-server@openvas.service openvasd.service +Wants=redis-server@openvas.service openvasd.service ConditionKernelCommandLine=!recovery [Service] From 6cc0bc9503256e84ee04a2e06cf56a22d87b9444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Wed, 24 Apr 2024 16:20:42 +0200 Subject: [PATCH 034/107] Fix captions for code block --- src/22.4/source-build/openvasd/dependencies.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/22.4/source-build/openvasd/dependencies.md b/src/22.4/source-build/openvasd/dependencies.md index 534ff901..28405e10 100644 --- a/src/22.4/source-build/openvasd/dependencies.md +++ b/src/22.4/source-build/openvasd/dependencies.md @@ -6,6 +6,7 @@ For debian and centos systems you have to follow [rustup](https://rustup.rs) ins .. tab:: Debian .. code-block:: :caption: Required dependencies for openvasd + # Follow instuctions of https://rustup.rs sudo apt install -y \ @@ -33,6 +34,7 @@ For debian and centos systems you have to follow [rustup](https://rustup.rs) ins .. tab:: CentOS .. code-block:: :caption: Required dependencies for openvasd + # Follow instuctions of https://rustup.rs sudo dnf install -y \ From 7debfad548f6e68dacd85260e60bbd74e9b3fc49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 04:52:10 +0000 Subject: [PATCH 035/107] Bump the python-packages group with 3 updates Bumps the python-packages group with 3 updates: [myst-parser](https://github.com/executablebooks/MyST-Parser), [furo](https://github.com/pradyunsg/furo) and [docutils](https://docutils.sourceforge.io). Updates `myst-parser` from 2.0.0 to 3.0.1 - [Release notes](https://github.com/executablebooks/MyST-Parser/releases) - [Changelog](https://github.com/executablebooks/MyST-Parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/executablebooks/MyST-Parser/compare/v2.0.0...v3.0.1) Updates `furo` from 2024.1.29 to 2024.4.27 - [Release notes](https://github.com/pradyunsg/furo/releases) - [Changelog](https://github.com/pradyunsg/furo/blob/main/docs/changelog.md) - [Commits](https://github.com/pradyunsg/furo/compare/2024.01.29...2024.04.27) Updates `docutils` from 0.20.1 to 0.21.2 --- updated-dependencies: - dependency-name: myst-parser dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-packages - dependency-name: furo dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: docutils dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/poetry.lock b/poetry.lock index f19e6306..6d92522f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -205,13 +205,13 @@ files = [ [[package]] name = "docutils" -version = "0.20.1" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] @@ -230,13 +230,13 @@ test = ["pytest (>=6)"] [[package]] name = "furo" -version = "2024.1.29" +version = "2024.4.27" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" files = [ - {file = "furo-2024.1.29-py3-none-any.whl", hash = "sha256:3548be2cef45a32f8cdc0272d415fcb3e5fa6a0eb4ddfe21df3ecf1fe45a13cf"}, - {file = "furo-2024.1.29.tar.gz", hash = "sha256:4d6b2fe3f10a6e36eb9cc24c1e7beb38d7a23fc7b3c382867503b7fcac8a1e02"}, + {file = "furo-2024.4.27-py3-none-any.whl", hash = "sha256:f7eb1b2c2204fd9cbd4af42e027289a67f17a98a4e14f4f9e2f17b96d61bb020"}, + {file = "furo-2024.4.27.tar.gz", hash = "sha256:15a9b65269038def2cefafb86c71c6616e3969b8f07ba231f588c10c4aee6d88"}, ] [package.dependencies] @@ -439,17 +439,17 @@ files = [ [[package]] name = "myst-parser" -version = "2.0.0" +version = "3.0.1" description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," optional = false python-versions = ">=3.8" files = [ - {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, - {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, + {file = "myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1"}, + {file = "myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"}, ] [package.dependencies] -docutils = ">=0.16,<0.21" +docutils = ">=0.18,<0.22" jinja2 = "*" markdown-it-py = ">=3.0,<4.0" mdit-py-plugins = ">=0.4,<1.0" @@ -459,9 +459,9 @@ sphinx = ">=6,<8" [package.extras] code-style = ["pre-commit (>=3.0,<4.0)"] linkify = ["linkify-it-py (>=2.0,<3.0)"] -rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] -testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] -testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] +rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] [[package]] name = "packaging" From a9738aee3ef291b2a24629299ea87212ffbd75b9 Mon Sep 17 00:00:00 2001 From: Nicolaj <55325031+Nicolaj-H@users.noreply.github.com> Date: Thu, 2 May 2024 09:22:38 +0200 Subject: [PATCH 036/107] Update workflows.md Added TLS_MTA_CERTCHECK to the documentation --- src/22.4/container/workflows.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/22.4/container/workflows.md b/src/22.4/container/workflows.md index fc705b1a..194b9df1 100644 --- a/src/22.4/container/workflows.md +++ b/src/22.4/container/workflows.md @@ -344,6 +344,7 @@ to [msmtp documentation](https://marlam.de/msmtp/msmtp.html), note that not all - `MTA_TLS`: Enable or disable TLS (_on|off'_). - `MTA_STARTTLS`: TLS variant: start TLS from within the session (_‘on’, default_), or tunnel the session through TLS (_‘off’_). + - `MTA_TLS_CERTCHECK`: Enable or disable checks of the server certificate. (WARNING: When the checks are disabled, TLS sessions will not be secure!) (_'on'|'off'_). - `MTA_AUTH`: Enable or disable authentication and optionally choose a method to use (_'on'|'off'|'method'_). - `MTA_USER`: Username for authentication. From 23327f78fe0a08b20250614e3a16a051902a79cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 04:04:23 +0000 Subject: [PATCH 037/107] Bump the python-packages group with 3 updates Bumps the python-packages group with 3 updates: [babel](https://github.com/python-babel/babel), [jinja2](https://github.com/pallets/jinja) and [pygments](https://github.com/pygments/pygments). Updates `babel` from 2.14.0 to 2.15.0 - [Release notes](https://github.com/python-babel/babel/releases) - [Changelog](https://github.com/python-babel/babel/blob/master/CHANGES.rst) - [Commits](https://github.com/python-babel/babel/compare/v2.14.0...v2.15.0) Updates `jinja2` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.3...3.1.4) Updates `pygments` from 2.17.2 to 2.18.0 - [Release notes](https://github.com/pygments/pygments/releases) - [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES) - [Commits](https://github.com/pygments/pygments/compare/2.17.2...2.18.0) --- updated-dependencies: - dependency-name: babel dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: jinja2 dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages - dependency-name: pygments dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6d92522f..43c939f9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -35,13 +35,13 @@ trio = ["trio (>=0.23)"] [[package]] name = "babel" -version = "2.14.0" +version = "2.15.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] [package.extras] @@ -299,13 +299,13 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -476,17 +476,16 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] From 46e3164ef87e478e015d3bc35f267af6deab7efa Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Mon, 6 May 2024 13:14:58 +0700 Subject: [PATCH 038/107] Small change to configuring gsad.service for remote access A small change to fix a typo in the path of gsad.service file and include the additional steps to restart the gsad.service after changes. --- src/22.4/kali/optional-configs.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/22.4/kali/optional-configs.md b/src/22.4/kali/optional-configs.md index 2957253f..7df96f29 100644 --- a/src/22.4/kali/optional-configs.md +++ b/src/22.4/kali/optional-configs.md @@ -4,14 +4,14 @@ The Greenbone Community Edition on Kali Linux installation relies on the same su ### Configure Remote Access To The Web Interface -By default Greenbone Community Edition is installed with only `localhost` access to the {term}`GSA` web interface. This means Greenbone Community Edition can only be accessed via the IP address `127.0.0.1`. To enable remote access to the web interface, the {term}`gsad` systemd service file must be modified. +By default Greenbone Community Edition is installed with only `localhost` access to the {term}`GSA` web interface. This means Greenbone Community Edition can only be accessed via the IP address `127.0.0.1`. To enable remote access to the web interface, the {term}`gsad` systemd service file must be modified and the gsad service must be restarted. Edit the contents of the `gsad.service` systemd service file: ```{code-block} :caption: Use nano to edit the gsad.sevice file -nano /usr/lib/systemd/service/gsad.service +nano /usr/lib/systemd/system/gsad.service ``` Change the value of the `--listen` argument to `0.0.0.0` and optionally change the value of `--port` to the standard SSL/TLS port 443: @@ -20,6 +20,11 @@ Change the value of the `--listen` argument to `0.0.0.0` and optionally change t -ExecStart=/usr/local/sbin/gsad --foreground --listen=127.0.0.1 --port=9392 +ExecStart=/usr/local/sbin/gsad --foreground --listen=0.0.0.0 --port=443 ``` +Restart the `gsad` service: +```{code-block} +sudo systemctl daemon-reload +sudo systemctl restart gsad +``` ### Setting A Password Policy From a2b589d7410605435fc10a1a549646da3dc4bc50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 04:06:16 +0000 Subject: [PATCH 039/107] Bump the python-packages group with 2 updates Bumps the python-packages group with 2 updates: [furo](https://github.com/pradyunsg/furo) and [mdit-py-plugins](https://github.com/executablebooks/mdit-py-plugins). Updates `furo` from 2024.4.27 to 2024.5.6 - [Release notes](https://github.com/pradyunsg/furo/releases) - [Changelog](https://github.com/pradyunsg/furo/blob/main/docs/changelog.md) - [Commits](https://github.com/pradyunsg/furo/compare/2024.04.27...2024.05.06) Updates `mdit-py-plugins` from 0.4.0 to 0.4.1 - [Release notes](https://github.com/executablebooks/mdit-py-plugins/releases) - [Changelog](https://github.com/executablebooks/mdit-py-plugins/blob/master/CHANGELOG.md) - [Commits](https://github.com/executablebooks/mdit-py-plugins/compare/v0.4.0...v0.4.1) --- updated-dependencies: - dependency-name: furo dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: mdit-py-plugins dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 43c939f9..994e99b5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -230,20 +230,20 @@ test = ["pytest (>=6)"] [[package]] name = "furo" -version = "2024.4.27" +version = "2024.5.6" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" files = [ - {file = "furo-2024.4.27-py3-none-any.whl", hash = "sha256:f7eb1b2c2204fd9cbd4af42e027289a67f17a98a4e14f4f9e2f17b96d61bb020"}, - {file = "furo-2024.4.27.tar.gz", hash = "sha256:15a9b65269038def2cefafb86c71c6616e3969b8f07ba231f588c10c4aee6d88"}, + {file = "furo-2024.5.6-py3-none-any.whl", hash = "sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de"}, + {file = "furo-2024.5.6.tar.gz", hash = "sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b"}, ] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" sphinx = ">=6.0,<8.0" -sphinx-basic-ng = "*" +sphinx-basic-ng = ">=1.0.0.beta2" [[package]] name = "h11" @@ -409,13 +409,13 @@ files = [ [[package]] name = "mdit-py-plugins" -version = "0.4.0" +version = "0.4.1" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, - {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, + {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, + {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, ] [package.dependencies] From f6aa8b0e6ca63514fe4f99243d2a06b47f553566 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:44:39 -0400 Subject: [PATCH 040/107] Create gvm-feed-sync-docs The first version of a comprehensive feed synchronization documentation. --- gvm-feed-sync-docs | 185 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 gvm-feed-sync-docs diff --git a/gvm-feed-sync-docs b/gvm-feed-sync-docs new file mode 100644 index 00000000..a3929f69 --- /dev/null +++ b/gvm-feed-sync-docs @@ -0,0 +1,185 @@ + +# Greenbone Feed Sync Update Guide + +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. + +If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. + +## A Note About Deprecated Sync Scripts +The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: +``` +$ which +``` +- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. +- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. +- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. +- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. + +### Deprecated Sync Scripts Removal +**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + +## Introduction Of The New Python Feed Sync Script +A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. + +The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). + +### Installation +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. + +#### Install using pipx +You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) +``` +$ python3 -m pipx install pontos +``` + +#### Install using pip +NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. + +You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) +``` +$ python3 -m pip install greenbone-feed-sync +``` + +## Instructions For Updating the Greenbone Feeds + +### Determine Which Command Is In Use +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. + +For example: +``` +$ which greenbone-feed-sync +/usr/local/bin/greenbone-feed-sync +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. + +For example: +``` +# If the new Python-based feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/usr/bin/python3 +``` +``` +# If the legacy bash feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/bin/sh +``` + +### Updating Feeds With New Python Script +By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. +``` +# Update all feeds with single command +$ sudo greenbone-feed-sync +``` +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. +``` +# Include the feed type as an argument to update only a specific feed type +$ greenbone-feed-sync --type +``` +The available feed types are: + +* `all`: same as using the command without specifying a type +* `nvt`: Fetches any newly available vulnerability tests +* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `scap`: Synchronizes SCAP data feed +* `cert`: Synchronizes CERT data feed +* `notus`: [???] +* `nasl`: [???] +* `report-format` or `report-formats`: Fetches any newly available scan report formats +* `scan-config` or `scan-configs`: Fetches any newly available scan configurations +* `port-list` or `port-lists`: Fetches any newly available port lists + +For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). + +### Updating Feeds With Legacy Bash Script + +To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. +``` +# Update feeds with legacy bash script +$ sudo -u gvm greenbone-feed-sync --type +``` +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + +Other arguments that can be passed to the legacy command incldue: + +* `--version`: Displays the version of the script +* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not +* `--describe`: Displays a description of the script and the feed it synchronizes +* `--feedversion`: Displays the version of the feed +* `--selftest`: Performs a self-test to check if all required utilities are available +* `--feedcurrent`: Checks if the feed is already up to date + +### Updating Feeds For Kali Linux Native Installation +Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +``` +┌──(dev㉿kali)-[~] +└─$ sudo gvm-feed-update +``` +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. + +### Verifying Successfull Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. + +## Automating Feed Sync Updates +The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. + +1. [MORE] + +2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: +``` +┌──(dev㉿kali)-[~] +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +_gvm +``` +``` +$ awk -F: '{ print $1}' /etc/passwd | grep gvm +gvm +``` + +## Troubleshooting A Connection To The Greenbone Feeds +To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. +``` +$ rsync rsync://feed.community.greenbone.net/community +``` +You should see output such as the following: +``` +Greenbone community feed server - http://feed.community.greenbone.net/ +This service is hosted by Greenbone Networks - http://www.greenbone.net/ + +All transactions are logged. + +If you have any questions, please use the Greenbone community portal. +See https://community.greenbone.net for details. + +By using this service you agree to our terms and conditions. + +Only one sync per time, otherwise the source ip will be temporarily blocked. + +data-objects Greenbone community data objects, see https://community.greenbone.net/ +nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ +scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ +cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ +community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ +community Greenbone community feed, see https://community.greenbone.net/ +``` +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: + +### Use nping + +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +``` +$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net +``` +### Use traceroute/tracert +If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. +``` +# For Linux/Unix systems +$ traceroute feed.community.greenbone.net +``` +``` +# For Windows systems +$ tracert feed.community.greenbone.net +``` From c9c382c3974d5fd9dc91f9d9e0ff5ca4418c2379 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:45:25 -0400 Subject: [PATCH 041/107] Delete gvm-feed-sync-docs --- gvm-feed-sync-docs | 185 --------------------------------------------- 1 file changed, 185 deletions(-) delete mode 100644 gvm-feed-sync-docs diff --git a/gvm-feed-sync-docs b/gvm-feed-sync-docs deleted file mode 100644 index a3929f69..00000000 --- a/gvm-feed-sync-docs +++ /dev/null @@ -1,185 +0,0 @@ - -# Greenbone Feed Sync Update Guide - -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. - -If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. - -## A Note About Deprecated Sync Scripts -The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: -``` -$ which -``` -- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. -- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. -- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. -- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. - -### Deprecated Sync Scripts Removal -**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - -## Introduction Of The New Python Feed Sync Script -A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. - -The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). - -### Installation -Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. - -#### Install using pipx -You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) -``` -$ python3 -m pipx install pontos -``` - -#### Install using pip -NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. - -You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) -``` -$ python3 -m pip install greenbone-feed-sync -``` - -## Instructions For Updating the Greenbone Feeds - -### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. - -For example: -``` -$ which greenbone-feed-sync -/usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. - -For example: -``` -# If the new Python-based feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync -#!/usr/bin/python3 -``` -``` -# If the legacy bash feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync -#!/bin/sh -``` - -### Updating Feeds With New Python Script -By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. -``` -# Update all feeds with single command -$ sudo greenbone-feed-sync -``` -To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. -``` -# Include the feed type as an argument to update only a specific feed type -$ greenbone-feed-sync --type -``` -The available feed types are: - -* `all`: same as using the command without specifying a type -* `nvt`: Fetches any newly available vulnerability tests -* `gvmd-data`: Synchronizes GVM data feed which includes [???] -* `scap`: Synchronizes SCAP data feed -* `cert`: Synchronizes CERT data feed -* `notus`: [???] -* `nasl`: [???] -* `report-format` or `report-formats`: Fetches any newly available scan report formats -* `scan-config` or `scan-configs`: Fetches any newly available scan configurations -* `port-list` or `port-lists`: Fetches any newly available port lists - -For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). - -### Updating Feeds With Legacy Bash Script - -To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -``` -# Update feeds with legacy bash script -$ sudo -u gvm greenbone-feed-sync --type -``` -Using one of the following values to replace **\**: - -* `CERT`: Synchronizes CERT data feed -* `SCAP`: Synchronizes SCAP data feed -* `GVMD_DATA`: Synchronizes gvmd data feed - -Other arguments that can be passed to the legacy command incldue: - -* `--version`: Displays the version of the script -* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not -* `--describe`: Displays a description of the script and the feed it synchronizes -* `--feedversion`: Displays the version of the feed -* `--selftest`: Performs a self-test to check if all required utilities are available -* `--feedcurrent`: Checks if the feed is already up to date - -### Updating Feeds For Kali Linux Native Installation -Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows -``` -┌──(dev㉿kali)-[~] -└─$ sudo gvm-feed-update -``` -Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. - -### Verifying Successfull Feed Sync Update -After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. - -## Automating Feed Sync Updates -The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. - -1. [MORE] - -2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: -``` -┌──(dev㉿kali)-[~] -└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm -_gvm -``` -``` -$ awk -F: '{ print $1}' /etc/passwd | grep gvm -gvm -``` - -## Troubleshooting A Connection To The Greenbone Feeds -To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -``` -$ rsync rsync://feed.community.greenbone.net/community -``` -You should see output such as the following: -``` -Greenbone community feed server - http://feed.community.greenbone.net/ -This service is hosted by Greenbone Networks - http://www.greenbone.net/ - -All transactions are logged. - -If you have any questions, please use the Greenbone community portal. -See https://community.greenbone.net for details. - -By using this service you agree to our terms and conditions. - -Only one sync per time, otherwise the source ip will be temporarily blocked. - -data-objects Greenbone community data objects, see https://community.greenbone.net/ -nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ -scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ -cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ -community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ -community Greenbone community feed, see https://community.greenbone.net/ -``` -If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: - -### Use nping - -The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. -``` -$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net -``` -### Use traceroute/tracert -If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. -``` -# For Linux/Unix systems -$ traceroute feed.community.greenbone.net -``` -``` -# For Windows systems -$ tracert feed.community.greenbone.net -``` From cfaa5847dec86181b57854510acc969efe8bb567 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:46:14 -0400 Subject: [PATCH 042/107] Create greenbone-feed-sync-docs.md The first draft of a comprehensive Greenbone feed sync instruction manual --- greenbone-feed-sync-docs.md | 185 ++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 greenbone-feed-sync-docs.md diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md new file mode 100644 index 00000000..a3929f69 --- /dev/null +++ b/greenbone-feed-sync-docs.md @@ -0,0 +1,185 @@ + +# Greenbone Feed Sync Update Guide + +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. + +If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. + +## A Note About Deprecated Sync Scripts +The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: +``` +$ which +``` +- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. +- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. +- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. +- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. + +### Deprecated Sync Scripts Removal +**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + +## Introduction Of The New Python Feed Sync Script +A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. + +The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). + +### Installation +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. + +#### Install using pipx +You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) +``` +$ python3 -m pipx install pontos +``` + +#### Install using pip +NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. + +You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) +``` +$ python3 -m pip install greenbone-feed-sync +``` + +## Instructions For Updating the Greenbone Feeds + +### Determine Which Command Is In Use +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. + +For example: +``` +$ which greenbone-feed-sync +/usr/local/bin/greenbone-feed-sync +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. + +For example: +``` +# If the new Python-based feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/usr/bin/python3 +``` +``` +# If the legacy bash feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/bin/sh +``` + +### Updating Feeds With New Python Script +By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. +``` +# Update all feeds with single command +$ sudo greenbone-feed-sync +``` +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. +``` +# Include the feed type as an argument to update only a specific feed type +$ greenbone-feed-sync --type +``` +The available feed types are: + +* `all`: same as using the command without specifying a type +* `nvt`: Fetches any newly available vulnerability tests +* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `scap`: Synchronizes SCAP data feed +* `cert`: Synchronizes CERT data feed +* `notus`: [???] +* `nasl`: [???] +* `report-format` or `report-formats`: Fetches any newly available scan report formats +* `scan-config` or `scan-configs`: Fetches any newly available scan configurations +* `port-list` or `port-lists`: Fetches any newly available port lists + +For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). + +### Updating Feeds With Legacy Bash Script + +To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. +``` +# Update feeds with legacy bash script +$ sudo -u gvm greenbone-feed-sync --type +``` +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + +Other arguments that can be passed to the legacy command incldue: + +* `--version`: Displays the version of the script +* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not +* `--describe`: Displays a description of the script and the feed it synchronizes +* `--feedversion`: Displays the version of the feed +* `--selftest`: Performs a self-test to check if all required utilities are available +* `--feedcurrent`: Checks if the feed is already up to date + +### Updating Feeds For Kali Linux Native Installation +Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +``` +┌──(dev㉿kali)-[~] +└─$ sudo gvm-feed-update +``` +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. + +### Verifying Successfull Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. + +## Automating Feed Sync Updates +The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. + +1. [MORE] + +2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: +``` +┌──(dev㉿kali)-[~] +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +_gvm +``` +``` +$ awk -F: '{ print $1}' /etc/passwd | grep gvm +gvm +``` + +## Troubleshooting A Connection To The Greenbone Feeds +To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. +``` +$ rsync rsync://feed.community.greenbone.net/community +``` +You should see output such as the following: +``` +Greenbone community feed server - http://feed.community.greenbone.net/ +This service is hosted by Greenbone Networks - http://www.greenbone.net/ + +All transactions are logged. + +If you have any questions, please use the Greenbone community portal. +See https://community.greenbone.net for details. + +By using this service you agree to our terms and conditions. + +Only one sync per time, otherwise the source ip will be temporarily blocked. + +data-objects Greenbone community data objects, see https://community.greenbone.net/ +nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ +scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ +cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ +community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ +community Greenbone community feed, see https://community.greenbone.net/ +``` +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: + +### Use nping + +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +``` +$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net +``` +### Use traceroute/tracert +If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. +``` +# For Linux/Unix systems +$ traceroute feed.community.greenbone.net +``` +``` +# For Windows systems +$ tracert feed.community.greenbone.net +``` From 950d860cbf80ab635b163a4bb22ab49a1696baea Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:53:21 -0400 Subject: [PATCH 043/107] Update greenbone-feed-sync-docs.md updates for clarity --- greenbone-feed-sync-docs.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index a3929f69..ac037815 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,7 +1,7 @@ # Greenbone Feed Sync Update Guide -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. @@ -17,7 +17,7 @@ $ which ### Deprecated Sync Scripts Removal **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -43,14 +43,14 @@ $ python3 -m pip install greenbone-feed-sync ## Instructions For Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: ``` $ which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: ``` @@ -72,7 +72,7 @@ $ sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. ``` -# Include the feed type as an argument to update only a specific feed type +# Include the feed type as an argument to update only a specific feed type $ greenbone-feed-sync --type ``` The available feed types are: @@ -82,7 +82,7 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: [???] +* `notus`: [???] * `nasl`: [???] * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations @@ -124,7 +124,9 @@ Please note that the `gvm-feed-update` command mentioned above is not maintained After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. ## Automating Feed Sync Updates -The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. +The Greenbone feeds are not automatically synced in the case of a Greenbone Community source code installation, for the Greenbone Community Docker containers, or the Greenbone native Kali Linux installation. The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the appropriate commands. + +If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. 1. [MORE] @@ -167,13 +169,13 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. ``` $ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. ``` # For Linux/Unix systems From 3f210d08077ba980fec08ac6a70418704102a8d1 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:57:13 -0400 Subject: [PATCH 044/107] Update greenbone-feed-sync-docs.md Added logo --- greenbone-feed-sync-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index ac037815..3a1ff86c 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,4 +1,4 @@ - +![Greenbone Logo](https://www.greenbone.net/wp-content/uploads/gb_new-logo_horizontal_rgb_small.png) # Greenbone Feed Sync Update Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. From 8e03c40c4d3afcba0ba3d0a04f5c3ccfcaf8c53d Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 13 Jul 2023 11:12:05 -0400 Subject: [PATCH 045/107] Update greenbone-feed-sync-docs.md Small additions --- greenbone-feed-sync-docs.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index 3a1ff86c..b59ecc5b 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,4 +1,4 @@ -![Greenbone Logo](https://www.greenbone.net/wp-content/uploads/gb_new-logo_horizontal_rgb_small.png) + # Greenbone Feed Sync Update Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. @@ -17,7 +17,7 @@ $ which ### Deprecated Sync Scripts Removal **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -29,7 +29,7 @@ Python 3.9 and later is supported. Also note that sycing feeds requires the `rsy #### Install using pipx You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) ``` -$ python3 -m pipx install pontos +$ python3 -m pipx install greenbone-feed-sync ``` #### Install using pip @@ -43,14 +43,14 @@ $ python3 -m pip install greenbone-feed-sync ## Instructions For Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: ``` $ which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: ``` @@ -72,7 +72,7 @@ $ sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. ``` -# Include the feed type as an argument to update only a specific feed type +# Include the feed type as an argument to update only a specific feed type $ greenbone-feed-sync --type ``` The available feed types are: @@ -82,8 +82,8 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: [???] -* `nasl`: [???] +* `notus`: Fetch any newly available NOTUS vulnerability tests +* `nasl`: Fetch any newly available NASL vulnerability tests * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations * `port-list` or `port-lists`: Fetches any newly available port lists @@ -103,7 +103,7 @@ Using one of the following values to replace **\**: * `SCAP`: Synchronizes SCAP data feed * `GVMD_DATA`: Synchronizes gvmd data feed -Other arguments that can be passed to the legacy command incldue: +Other arguments that can be passed to the legacy command include: * `--version`: Displays the version of the script * `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not @@ -169,13 +169,13 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. ``` $ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. ``` # For Linux/Unix systems From 6baca0d0bd1e756d7caa0a84309742bff66e6fe5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 05:27:37 +0000 Subject: [PATCH 046/107] --- updated-dependencies: - dependency-name: requests dependency-type: indirect ... Signed-off-by: dependabot[bot] --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 994e99b5..4f5c6829 100644 --- a/poetry.lock +++ b/poetry.lock @@ -550,13 +550,13 @@ files = [ [[package]] name = "requests" -version = "2.31.0" +version = "2.32.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"}, + {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"}, ] [package.dependencies] From 529a765833083f1dcddcba217fa4a5c06ef40f2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 05:42:26 +0000 Subject: [PATCH 047/107] --- updated-dependencies: - dependency-name: requests dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages - dependency-name: zipp dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4f5c6829..d1bcb7b6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -550,13 +550,13 @@ files = [ [[package]] name = "requests" -version = "2.32.0" +version = "2.32.1" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ - {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"}, - {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"}, + {file = "requests-2.32.1-py3-none-any.whl", hash = "sha256:21ac9465cdf8c1650fe1ecde8a71669a93d4e6f147550483a2967d08396a56a5"}, + {file = "requests-2.32.1.tar.gz", hash = "sha256:eb97e87e64c79e64e5b8ac75cee9dd1f97f49e289b083ee6be96268930725685"}, ] [package.dependencies] @@ -1069,18 +1069,18 @@ files = [ [[package]] name = "zipp" -version = "3.18.1" +version = "3.18.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, + {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" From f7de60c2b69ffdba75b5da4a99cb1151eef798fe Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Tue, 21 May 2024 12:45:19 +0700 Subject: [PATCH 048/107] corrected the path for moving the openvasd build --- src/22.4/source-build/openvasd/build.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/22.4/source-build/openvasd/build.md b/src/22.4/source-build/openvasd/build.md index c6ebbeab..89597008 100644 --- a/src/22.4/source-build/openvasd/build.md +++ b/src/22.4/source-build/openvasd/build.md @@ -6,7 +6,7 @@ cargo build --release cd $SOURCE_DIR/openvas-scanner-$OPENVAS_DAEMON/rust/scannerctl cargo build --release -sudo cp -v ../target/release/openvasd $INSTALL_DIR/usr/local/bin/ -sudo cp -v ../target/release/scannerctl $INSTALL_DIR/usr/local/bin/ +sudo cp -v ../target/release/openvasd $INSTALL_DIR/openvasd/usr/local/bin/ +sudo cp -v ../target/release/scannerctl $INSTALL_DIR/openvasd/usr/local/bin/ sudo cp -rv $INSTALL_DIR/openvasd/* / ``` From a21dc396df5b573c1f3437bdb9accc2869a22b74 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Tue, 21 May 2024 12:52:19 +0700 Subject: [PATCH 049/107] Adjusted changelog.md --- src/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/changelog.md b/src/changelog.md index 2f55fea8..749cd2ee 100644 --- a/src/changelog.md +++ b/src/changelog.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Calendar Versioning](https://calver.org). ## Latest +* Corrected the path for moving the openvasd built files * Add instructions for Kali Linux installation * Add instructions to enable SSL/TLS * Quote passwords when creating an admin user via `gvmd` From 53e44496ec2b4af0e695e41f09134671767372b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 04:13:04 +0000 Subject: [PATCH 050/107] Bump the python-packages group with 4 updates Bumps the python-packages group with 4 updates: [anyio](https://github.com/agronholm/anyio), [requests](https://github.com/psf/requests), [typing-extensions](https://github.com/python/typing_extensions) and [zipp](https://github.com/jaraco/zipp). Updates `anyio` from 4.3.0 to 4.4.0 - [Release notes](https://github.com/agronholm/anyio/releases) - [Changelog](https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst) - [Commits](https://github.com/agronholm/anyio/compare/4.3.0...4.4.0) Updates `requests` from 2.32.1 to 2.32.2 - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.1...v2.32.2) Updates `typing-extensions` from 4.11.0 to 4.12.0 - [Release notes](https://github.com/python/typing_extensions/releases) - [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md) - [Commits](https://github.com/python/typing_extensions/compare/4.11.0...4.12.0) Updates `zipp` from 3.18.2 to 3.19.0 - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.18.2...v3.19.0) --- updated-dependencies: - dependency-name: anyio dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: requests dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages - dependency-name: typing-extensions dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: zipp dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/poetry.lock b/poetry.lock index d1bcb7b6..91d49524 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "anyio" -version = "4.3.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] @@ -550,13 +550,13 @@ files = [ [[package]] name = "requests" -version = "2.32.1" +version = "2.32.2" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ - {file = "requests-2.32.1-py3-none-any.whl", hash = "sha256:21ac9465cdf8c1650fe1ecde8a71669a93d4e6f147550483a2967d08396a56a5"}, - {file = "requests-2.32.1.tar.gz", hash = "sha256:eb97e87e64c79e64e5b8ac75cee9dd1f97f49e289b083ee6be96268930725685"}, + {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, + {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, ] [package.dependencies] @@ -854,13 +854,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, + {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, ] [[package]] @@ -1069,13 +1069,13 @@ files = [ [[package]] name = "zipp" -version = "3.18.2" +version = "3.19.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, - {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, + {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, + {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, ] [package.extras] From e6d89ed1bd5db5c2d931808815ff7bb606f9e2d6 Mon Sep 17 00:00:00 2001 From: Nicolas Thumann Date: Fri, 31 May 2024 12:49:01 +0200 Subject: [PATCH 051/107] Fix: Typo in environment variable --- src/_static/docker-compose-22.4.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index 10cd4b02..35c9e3f1 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -136,7 +136,7 @@ services: environment: # `service_notus` is set to disable everything but notus, # if you want to utilize openvasd directly removed `OPENVAS_MOD` - OPENVASD_MOD: service_notus + OPENVASD_MODE: service_notus GNUPGHOME: /etc/openvas/gnupg LISTENING: 0.0.0.0:80 volumes: @@ -178,7 +178,7 @@ services: "--notus-feed-dir", "/var/lib/notus/advisories", "-m", - "666", + "666" ] volumes: - gpg_data_vol:/etc/openvas/gnupg From b5f322334df3fad96a3a7f13533a645a1e9fa42a Mon Sep 17 00:00:00 2001 From: Nicolas Thumann Date: Fri, 31 May 2024 12:49:13 +0200 Subject: [PATCH 052/107] Fix: Typo in comment --- src/_static/docker-compose-22.4.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index 35c9e3f1..8329712c 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -135,7 +135,7 @@ services: restart: on-failure environment: # `service_notus` is set to disable everything but notus, - # if you want to utilize openvasd directly removed `OPENVAS_MOD` + # if you want to utilize openvasd directly removed `OPENVASD_MODE` OPENVASD_MODE: service_notus GNUPGHOME: /etc/openvas/gnupg LISTENING: 0.0.0.0:80 From b7f10b7a5a17a85d6cf8b2b17e71e2e2f27bfeab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 04:55:54 +0000 Subject: [PATCH 053/107] Bump the python-packages group with 6 updates Bumps the python-packages group with 6 updates: | Package | From | To | | --- | --- | --- | | [certifi](https://github.com/certifi/python-certifi) | `2024.2.2` | `2024.6.2` | | [requests](https://github.com/psf/requests) | `2.32.2` | `2.32.3` | | [typing-extensions](https://github.com/python/typing_extensions) | `4.12.0` | `4.12.1` | | [uvicorn](https://github.com/encode/uvicorn) | `0.29.0` | `0.30.1` | | [watchfiles](https://github.com/samuelcolvin/watchfiles) | `0.21.0` | `0.22.0` | | [zipp](https://github.com/jaraco/zipp) | `3.19.0` | `3.19.1` | Updates `certifi` from 2024.2.2 to 2024.6.2 - [Commits](https://github.com/certifi/python-certifi/compare/2024.02.02...2024.06.02) Updates `requests` from 2.32.2 to 2.32.3 - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.2...v2.32.3) Updates `typing-extensions` from 4.12.0 to 4.12.1 - [Release notes](https://github.com/python/typing_extensions/releases) - [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md) - [Commits](https://github.com/python/typing_extensions/compare/4.12.0...4.12.1) Updates `uvicorn` from 0.29.0 to 0.30.1 - [Release notes](https://github.com/encode/uvicorn/releases) - [Changelog](https://github.com/encode/uvicorn/blob/master/CHANGELOG.md) - [Commits](https://github.com/encode/uvicorn/compare/0.29.0...0.30.1) Updates `watchfiles` from 0.21.0 to 0.22.0 - [Release notes](https://github.com/samuelcolvin/watchfiles/releases) - [Commits](https://github.com/samuelcolvin/watchfiles/compare/v0.21.0...v0.22.0) Updates `zipp` from 3.19.0 to 3.19.1 - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.19.0...v3.19.1) --- updated-dependencies: - dependency-name: certifi dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: requests dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages - dependency-name: typing-extensions dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages - dependency-name: uvicorn dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: watchfiles dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: zipp dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 186 ++++++++++++++++++++++++++-------------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/poetry.lock b/poetry.lock index 91d49524..da680a96 100644 --- a/poetry.lock +++ b/poetry.lock @@ -70,13 +70,13 @@ lxml = ["lxml"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -550,13 +550,13 @@ files = [ [[package]] name = "requests" -version = "2.32.2" +version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ - {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, - {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -854,13 +854,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.1" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.1-py3-none-any.whl", hash = "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a"}, + {file = "typing_extensions-4.12.1.tar.gz", hash = "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"}, ] [[package]] @@ -882,13 +882,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.29.0" +version = "0.30.1" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, - {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, + {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, + {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, ] [package.dependencies] @@ -901,86 +901,86 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "watchfiles" -version = "0.21.0" +version = "0.22.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.8" files = [ - {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, - {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, - {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, - {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, - {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, - {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, - {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, - {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, - {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, - {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, - {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, - {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, - {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, - {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, - {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, - {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, - {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, - {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, - {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, - {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, - {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, - {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, - {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, - {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, - {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, - {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, - {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, - {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, - {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, - {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, - {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, - {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, - {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, + {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, + {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, + {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, + {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, + {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, + {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, + {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, + {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, + {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, + {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, + {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, + {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, + {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, ] [package.dependencies] @@ -1069,18 +1069,18 @@ files = [ [[package]] name = "zipp" -version = "3.19.0" +version = "3.19.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, - {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, + {file = "zipp-3.19.1-py3-none-any.whl", hash = "sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091"}, + {file = "zipp-3.19.1.tar.gz", hash = "sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" From 2e6a1af6945274eb43f2f02b3d9195db514b7d62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 04:43:33 +0000 Subject: [PATCH 054/107] Bump the python-packages group with 3 updates Bumps the python-packages group with 3 updates: [packaging](https://github.com/pypa/packaging), [typing-extensions](https://github.com/python/typing_extensions) and [zipp](https://github.com/jaraco/zipp). Updates `packaging` from 24.0 to 24.1 - [Release notes](https://github.com/pypa/packaging/releases) - [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pypa/packaging/compare/24.0...24.1) Updates `typing-extensions` from 4.12.1 to 4.12.2 - [Release notes](https://github.com/python/typing_extensions/releases) - [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md) - [Commits](https://github.com/python/typing_extensions/compare/4.12.1...4.12.2) Updates `zipp` from 3.19.1 to 3.19.2 - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.19.1...v3.19.2) --- updated-dependencies: - dependency-name: packaging dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: typing-extensions dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages - dependency-name: zipp dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index da680a96..278102c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -465,13 +465,13 @@ testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0, [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -854,13 +854,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.12.1" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.1-py3-none-any.whl", hash = "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a"}, - {file = "typing_extensions-4.12.1.tar.gz", hash = "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -1069,18 +1069,18 @@ files = [ [[package]] name = "zipp" -version = "3.19.1" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.1-py3-none-any.whl", hash = "sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091"}, - {file = "zipp-3.19.1.tar.gz", hash = "sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" From 4a4c8316b1d490174d52c4494a07f9374ec5a18f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 22:53:25 +0000 Subject: [PATCH 055/107] Bump urllib3 from 2.2.1 to 2.2.2 Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.2.1 to 2.2.2. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.2.1...2.2.2) --- updated-dependencies: - dependency-name: urllib3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 278102c6..00e263b9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -865,13 +865,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] From 9c5f0a8abb891a73c81348d3bd481e8309cf3a2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 04:56:00 +0000 Subject: [PATCH 056/107] Bump the python-packages group across 1 directory with 2 updates Bumps the python-packages group with 2 updates in the / directory: [certifi](https://github.com/certifi/python-certifi) and [importlib-metadata](https://github.com/python/importlib_metadata). Updates `certifi` from 2024.6.2 to 2024.7.4 - [Commits](https://github.com/certifi/python-certifi/compare/2024.06.02...2024.07.04) Updates `importlib-metadata` from 7.1.0 to 8.0.0 - [Release notes](https://github.com/python/importlib_metadata/releases) - [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst) - [Commits](https://github.com/python/importlib_metadata/compare/v7.1.0...v8.0.0) --- updated-dependencies: - dependency-name: certifi dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: importlib-metadata dependency-type: indirect update-type: version-update:semver-major dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 00e263b9..e40bb73d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" @@ -70,13 +70,13 @@ lxml = ["lxml"] [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -280,22 +280,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "jinja2" From f9487858b9fbf649e716009921b9aa2a0f7e797a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 04:20:12 +0000 Subject: [PATCH 057/107] Bump exceptiongroup from 1.2.1 to 1.2.2 in the python-packages group Bumps the python-packages group with 1 update: [exceptiongroup](https://github.com/agronholm/exceptiongroup). Updates `exceptiongroup` from 1.2.1 to 1.2.2 - [Release notes](https://github.com/agronholm/exceptiongroup/releases) - [Changelog](https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst) - [Commits](https://github.com/agronholm/exceptiongroup/compare/1.2.1...1.2.2) --- updated-dependencies: - dependency-name: exceptiongroup dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index e40bb73d..7f821dd8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -216,13 +216,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] From 9d92ac483f42efa40c593356573135fe09d37f45 Mon Sep 17 00:00:00 2001 From: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:11:55 +0200 Subject: [PATCH 058/107] Fix color of "view this page" icon in dark mode (#489) --- .gitignore | 1 + src/_static/custom.css | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a9c0832c..ccc01848 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST +.DS_Store # PyInstaller # Usually these files are written by a python script from a template diff --git a/src/_static/custom.css b/src/_static/custom.css index e388682c..754e3880 100644 --- a/src/_static/custom.css +++ b/src/_static/custom.css @@ -191,12 +191,12 @@ div.sphinxsidebarwrapper img { } -div.edit-this-page > a.muted-link, svg.icon-tabler-shadow, svg.theme-icon-when-dark, svg.theme-icon-when-light, .toctree-checkbox ~ label .icon svg { +div.edit-this-page > a.muted-link, div.view-this-page > a.muted-link, svg.icon-tabler-shadow, svg.theme-icon-when-dark, svg.theme-icon-when-light, .toctree-checkbox ~ label .icon svg { color:var(--color-content-foreground); } -div.edit-this-page > a.muted-link:hover, svg.icon.icon-tabler.icon-tabler-copy:hover, svg.icon-tabler-shadow:hover, svg.theme-icon-when-dark:hover, svg.theme-icon-when-light:hover, .toctree-checkbox ~ label .icon svg:hover { +div.edit-this-page > a.muted-link:hover, div.view-this-page > a.muted-link:hover, svg.icon.icon-tabler.icon-tabler-copy:hover, svg.icon-tabler-shadow:hover, svg.theme-icon-when-dark:hover, svg.theme-icon-when-light:hover, .toctree-checkbox ~ label .icon svg:hover { color:#11AB51; } From 97071b1373d8264471d7099135425d1d2698c403 Mon Sep 17 00:00:00 2001 From: Kristin Schlosser Date: Fri, 19 Jul 2024 16:23:28 +0200 Subject: [PATCH 059/107] Change color of visited links --- src/_static/custom.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/_static/custom.css b/src/_static/custom.css index 754e3880..05bc173f 100644 --- a/src/_static/custom.css +++ b/src/_static/custom.css @@ -40,6 +40,16 @@ a { } a:hover { + color: #11AB51 !important; + border-bottom: 1px solid var(--color-content-foreground); +} + +a:visited { + color: var(--color-content-foreground); + border-bottom: 1px solid var(--color-content-foreground); +} + +a:active { color: #11AB51; border-bottom: 1px solid var(--color-content-foreground); } From f3cbf902f076c4cdefa8d6fd5fe119844495f481 Mon Sep 17 00:00:00 2001 From: Kristin Schlosser Date: Thu, 25 Jul 2024 09:00:12 +0200 Subject: [PATCH 060/107] Remove MQTT broker from architecture image --- .../greenbone-community-22.4-architecture.png | Bin 164415 -> 140077 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/images/greenbone-community-22.4-architecture.png b/src/images/greenbone-community-22.4-architecture.png index 57f042f806be91099d73309db3c84402a68c1b64..7bc63ca6b91fc8b5603a1cab084d9260ee353e5e 100644 GIT binary patch literal 140077 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

8GIfWc)6WK~sECP3vbBoYJCX+0 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�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 literal 164415 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

MP_;*JY_@Su*^2Yi1V#n}#a z2#mlJ9K)|1{I|{;|Asbs?FY@DhevD}q3_|9NK-TrX`*^<5!m;P)Zlc|pMeKfbs#(m2R|gbpyF}->b8=*b9GY7i(Zz)i{w{6 zpQ{FZ?1l1k$ri+3{hzL{Gpq#{r4jzDq)d20=JfwhkNW=){r?R7Z)f0)wa$kP5BF{* QOHI(q;vhcrmtW8R2X*e=u>b%7 From d3b38d8dcb493279c81a97915e30b5577e590add Mon Sep 17 00:00:00 2001 From: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> Date: Fri, 26 Jul 2024 10:33:43 +0200 Subject: [PATCH 061/107] Update version of ospd-openvas (#494) * Update version of ospd-openvas * Bump version of openvas-scanner to 23.8.0 --- src/22.4/source-build/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/22.4/source-build/index.md b/src/22.4/source-build/index.md index e8c6feac..d32469c4 100644 --- a/src/22.4/source-build/index.md +++ b/src/22.4/source-build/index.md @@ -142,7 +142,7 @@ export GSAD_VERSION=22.9.0 ```{code-block} :caption: Setting the openvas-scanner version to use -export OPENVAS_SCANNER_VERSION=23.0.1 +export OPENVAS_SCANNER_VERSION=23.8.0 ``` ```{include} /22.4/source-build/openvas-scanner/dependencies.md @@ -162,7 +162,7 @@ export OPENVAS_SCANNER_VERSION=23.0.1 ```{code-block} :caption: Setting the ospd and ospd-openvas versions to use -export OSPD_OPENVAS_VERSION=22.6.2 +export OSPD_OPENVAS_VERSION=22.7.1 ``` ```{include} /22.4/source-build/ospd-openvas/dependencies.md From 11cf5759bab85c6ca650c645fae7ee35e6e876bc Mon Sep 17 00:00:00 2001 From: Kristin Schlosser Date: Fri, 26 Jul 2024 09:45:59 +0200 Subject: [PATCH 062/107] Remove arrow between Notus scanner and target systems in architecture image --- .../greenbone-community-22.4-architecture.png | Bin 140077 -> 139764 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/images/greenbone-community-22.4-architecture.png b/src/images/greenbone-community-22.4-architecture.png index 7bc63ca6b91fc8b5603a1cab084d9260ee353e5e..16d3aecf998c2e1e065cdd810764b466b1b7b1f2 100644 GIT binary patch delta 105152 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 delta 105624 zcmb69by!v1^9GC`8UaCRC8Zmr8ziMukOl!M=>}ng2uMhGcXxM4cXvv6hxEJQdHg)z z-|zkF-PfhpIh?iEnwd3o&por&SsP+uCt?UGG?scOIWb_PUyJ4appT^uZSxWJQ>5ea z`VEhh@|W}RiY`Sdiw zLXKK`Gj0U+PGIEwAd&adtuM0H`&)uTOQKmba@e(O&PKpGkxSk5_Bf4E&G}(hqiV-& zV#Bp64bVbwg5zoyxc}2&y}em5KMcfiO-||D@16qmyrHZY8fWLWgL#_=v07&_&+OgJ zcgzDW8H@0wQ*-n6OlGj%(S;*!7XB0|pBoezW)pmsn@XV6>JqKibnM!{;ao8A8?jtP z2Al-kYUC#6zn-#C0SZe8f6&!GriOJmj}dwSIsx@#>^uXBh0LcmnmYtuT#F}NOB-@a zRzZMzD_2L@cs*tFBJDJtaO{{R11Z8m!?!pKkENz&fV$Wdg+f$~eiU)f$p^Q`jrd)S zAF5`|9-dfDnKsM|k}O%eP6eo-f)OkR9*qXZ!I#~V-?*hzhftW86;A?0uW^MaI3~)#d^VxV=d@yz@(psr3ve;cl|BKPJ}yYqSrIlgxmi&zs9YNnwhU@1(^6C; z5z02ynNcb(&)FuGZRsl~Ra{T$A#u6uD(dEi=Yt7}p*)8Nn!`6oq=B4aubd+k#PQq| z`B?^8PwC1B*>6s0>5lZ*Kd5M#pYOA0R;^nBQg|hYl8+VILr#w!7ui2T?}Qp$_K`Wz2mer}_s$FS##0|lE#5xFaix#n>20_V%*m-~q@_BuT-c?4Glf}j z)Z})6sI&Z(WhE}LPcy4Z;QR3s!(I{i?Wb00G7Uol=b&V?LT_IGRn~U3-H!DoAJG}l z=SJHXyXf9OeI}7h*`_x7)9w3`t4a}}t;IMK@7~JhE)bp|@N!#X;smruGyx&6(~@3hh=A3 zic!m7#e@Kx*WcqbuM=qbM&d46_g|;a6@>m6Nn(|?kix;iZk)lGD=DZ=D*e(;o9%1^ zzr0EzqL*#8Q#8RU9$p!R{ztT59Y8ypp>vDulp8XPN@G)qkyul>HrV3bn4e&L!F)0# zYe_>sLheO19sAyAZiM9pj+*+HbL9#{jm~dD36vUyp^h<5l}h2szJ>jtFH{~vW^z8K ziS=nJoAajbw^6vr&AHMn1qn56XLKL*dI%byj|-(1eNEi>9!^o-7GSpxfdxz#dgjpE z3M$YG(%D@3sMSN(aXBkElAvleBsj7$xvD-mJQp!bCEb|B;b7I#(fm3_jEb`KS&93? zR27@`ybL{FuqCBjG{PvJaeA&odVAqFY#FL8S8a)igM*DryN3lyX;=J{`F z*BUyvm4*~*Zki|*phmq=CrtPir+hFG3cn6cvvHL}ebB;f2`Gm`&<$~Hz97$(KZqMD zFPFOs`*8K~du@J+1$t*}lEP9~;L;{NOJFseK;HzDW9b&@r0WIAZHj!R=s^G$vGNOH z<$+?+!<7{5Khxod$KNCXzQ(q2ZP<^cmk{6t zyd1nza<wk z(L_8DG~neC0vwnyJONXg_eVGQ@)$>@p)b09x*gpoX=7HoK8jfC29C@Kmyx!^XuSEPj=?H#yE=>1Rk}U z3PwTt{+Cj><&WF?N-S<(Ez|nn?uC$HJ-Cfiba%YODRlYKa0!XeM3v^!l;5nqq{`4}Ya<54Kw_1c~Zx|ffu&+8(z2@bk* zfoJ9CiltU3AVEo1f4t&j^EvZ*kD!d*hqA0am{)CvTcw@a6aJf%ag1Lq;Y)S4oKhfZ zlp)V4@~~p^`7B_OdQlBp1IW~y-o*ZbLt&+0O!O>$=SX;8*-w&!VrTOU5n|^Cy`_(~ z{k|Ja`3Fw3C=+kKXn8yMJ5Hy)@)zYRsdA3UAFRns1;nl7h4tUnm8O8;Yk`)4j3|-1 zO_0m=oxA10uVu6>G)!Tgm%?9JID_&E?<*PBu7`;mgCN2$HfcXNlT>=9eEoy=%$ zCgLAw=@=ER7L?s$J&mpwU03*^SI>W%av47}o=*cTYU(Ol+|f?)dYyYOo+G|?T^@}p z5=Ph`eNVNAJQv!xT2!7c9g_VvG>Qr;iM|70&ipeRtot_|f-D-+%M;>O=y$igZZXI1 z0Zz0-R-=RtSc0CYXTw0+TdTEJi!tToVN2iR<8S#iv43KIy0~s})o0_6Xe#?va#cwn ze=j`-7Gm$)m22TIDUZYKu=lWypknj40mftwMZyc>ZbyuW|F$sJx zInzCBky~Qe^Eu;i)HjhQLfB0?GkBL~hL3%#ibb0w)PJ!PwPlHwel2>D=);AwmcNoH z9zM1>pC=~rO4b9J#Vz4rai)b`cavhNaFnk(01^L+J|~VwR2#;?n5mCDO|r8_g2KJ% z`-M~&n(~Dn4O&$U8r?f#xzs9}QpMji*}*=WA9`Zl@>(!>e&_5AcpNrVFHj_}4n2wOC&4s++T;cdWbIzH|Pww!3N~Wg_+Y#FHP=O!zNsR%cgiDY*4LU z1f6dfw&-)`)J|$u^?T@4A`?Z&&yY9Is(mQraKb_{4f8MU$wy79``HkwzEjEeM5<%O zV89sev*QoLie?3WHIeg09BzX*Z3S!~Nt}g=+_SKaE>@GOEhkIu8AqQS864|;sorkA z^+1iS!;n6L<Z_qdTRr`iR7cn>J*vlokGG;o>L-TPCRQJz zZ!EM7#(EsDcZeq5#jsaGt+dM3hcJo%l+iXS^jyc=X3+Fk#(0*^OAxoD$b$$#!@)oI zZ2vZEhaiifWeqVXVCrD|7KC0l*R(3Cs9P!YGTBDtKsrb7TxgqPCTrd?VW^Sf1l3!( z7?a96Iq&if+Bi?d&rLBF-8<`|pWogfl0r=sCH?M}RQsbPa_rHnn;SU_y-(>j27yat zyi(gufR|<9eIqO}wY*}lt{Myjc>O?mzS28yDi|!B;L#@HjU^g0GSyjIhqy(bF5K~M zLb1*HcLQzaT*epbg2>WO%W!@vtR&B-UNVSDjHXoQ+V%z3Y-0wLj>9Q>Ao_4^r7beX zo97ij=zJvWO-&8p9=JA68+oQ3{SAW%=E2p`PD%X)mI`ov`^H?$nk<2+7P!~tExUtR z*J~>y5_I*wik^fPE1Kut98tHF448Nm$MKq9%J3%_`Kllt#E2F1nQT%j3rU?JLFg*6 z2^>KwlslW3>kqi)Y?Lq+KAyrH3`jD*-B(^NDg->^q6-_LRN2I@SmDE?^6o`N{&>u=%h{szD;pA30vjXu zZYzp&6jk!Y*z%Pvg`vVFN3K9#!KXnyZf2dg{!K`MFrgCpN_Pg4?mw*V_kx~PIuA?0 z`oU~t9bv#66~HmsNs-5it|JE`OgF#h}-gr>Wm0lV{jJTO%BfN&0<;!Ky(MLiM zZeh0C5{t~9w>;?S-1%LU?#J^h`Doe?*XTQK#`u^o%@cljTF6VAjse@KcrC=#6zj`W zY*pf-pWZ(IhU+o$l4K`Sw|Hm1siQDU9}UVQR12!#6W4{VzXsQX&Y$02)nDaPEPP%r z86v;SmsruObYCRRcgt=HJ%zvhj|!QCaW&^wR8^*d(>k492ga- zUn4;V*pWzGC=7vRPJr9HEd-n4v1O4BlWY=QZUvpU=;E z==rh5qv9BKL~M}k<0QZ#o$8RX4W-ANs=xOTO5omDNa>~3^4|q$!!+#J`$fxtc@Z;< zJQtbC@Y*PXuc{luPSGJS*>ZS(D>h0=CzSndJ2$T{Cq&RUvE9YYuC5;A_&F@xJ3%aB zp*N-(&rlOO3W{7`=n_JA_QTb|Pn)GxC}rK#`eScWv(g*G=GS8=B~u#{zW7YQg4~}P zWndrgTa|(<4cAu(G;pBkrGH`R;8yqraS?MdlHi9#PQ9F#*%O?&v32%~Xv1&s*_r$u zlCE7EeVjg|x0Uo=^M()tJM;9Pk1w)cdhd`+ z%)`Dio~8C`q~eQn-I6`snuZ$pIXL{5sG-Yj5Maej*y?YS$PE=>WAlT37-?I4V8R}Y zCFRt)P=F5`qcLjKXn&KMr16o9gAtQQt^*PqVdCRoc>7v%B zFP}eqNt$1MK$KD@pP9Nf8Q>*Cvm1XoPCcPSpzV7MTYCl|PRAMpzn;$qJ)NWa+Q>0D&P z_suQ>bt!Uy=K5S+a@6Pj=ng*dg=V#CXZo*FFRGg7b^qj37hE|<2&nayW1bF8ozQjM zu2y1-914kS>BBBk7^9SH3g%HquuA;Nu7>1AZ>BQxZ0p);$A!M)_<}~#+`X* z&sH~h+iKeM^W>cSab-=T`vdg@1OfNVre~dvSAO9S|&jdgu3Wer)+1_D6E2T;4s7^~CQ)_JB?r2n5Q@L|9l}LRgsC%Et1u z$rnQa0&z-k3*~#?CWzmmqm)TPkLvKkx_g*=MpP8v49j2s%{WpacZ}vWoXqPmOdRpn z%H`#*PZO;jYN`mT?_S(OtR1Wr?LyHXqA}Imovh}A9WMzT4wXmH&kM|pH`lYvjs`ZT|{EVeUnnV$l8z*}uw5T6> zifvRlshj9}g5wi#-OD^>67=S$DBZhnh;Yx96}*1J7IIT#msKR690%9A`)MN8=IO3| z1Oy3Q8%&|yBQ)1nN-BkGD{{h}HFFM%<0I}v?`N%kCE}62fkotpQFWQpv4kp5&fut5 z-$TTmg=Z+Lk1IpaJb;kO`F!au!pxwKkZiem<)#FM+XM$c)v(BY!|4XG8UL^W&&dhf z*%#4xaC+dmxOmSuwta|TdSjD*?6oTdfq|e(mM3BRLz6Kx>FcqxaOu&reP;he&&tZm zLeIs?sYlPm#P-&JMW3D7kew}D`c()DCo?ApGZ!=STXrU{@U2(=NUX|l*|=HRxS6@a zzrH5>KVQr9UavrvTM_6Y!t#_yY=@7NGb7?YrzcRaW0NdLrKooTfCsmMtC0RR$TPB7 zEB_y4gz8u_B?0I1ttxpASO8y*lj?#)eL&UdeO)8H*~n6r0ABUZLQ%aj&ZI?s3auh9 zq_8SNXeG5W&2JPDi3}ed(I8BknI$%M_uh*codt&MJ5x_XQm`+YQPY%TQSFAUR@?Xf z_#qDLtoM+|2lT#>R*RwrN#`Q`$Qw#y3(@nEA%q~&E>uWMPDqi4coUyEL%tWZ-gxYC z?^M$8yADOW{b>S=vHk=bf7qufAdog=>j504ps9#Njx9GWmVL#>o62mtxv$F~VR;~s zSB#j*`HjW2>s2I|}6Ii;P&ea{~T1s3qrP%CQyW8=1Vt*rmcm!6LbJzpbsPTG{ zO9z>PxRsqer;6}AE*J^~Tf54kZE~Uis;B!MAFnASW1;m4N{*AJkeXjz{ALjt+b3t3tk|yZlrV+f4=`Aa{;aahPO(*Lkr}E-SZm zc2^OcYw6B&l>qJ)AGc+xispkHceQaG+4g=Ffy>HI9aJYx@fx1>O#iTJcC=zn5@ zM=|p4Y)Xs-p_^Z}Z%b@XN929Ut`fQOX!1hr3}Pd7GwPRCZ3vPgZsre|1fPo=f1j|#TvaZgqPA0s>|f1r;X$)nwS0_irdkcY zNvuNSbXE(}MSu|N18m}`G;eHMYTlS6w26B%eGYV7&qQ&k5cS&e6JIOkrbhpFiiEVC zmfG}_8Y66(H}j$EAN}DVA*C1Jl^BIX54$4=K7kIza0|il0zCA zf8VK!t#S2zC2~NXDOqjXL=mf-7_QO^i`eW1LYHFOp7q+;?Li<08Q)EI1X*Kj=A5FF zq4lKSq6n{Q^6ww=@#<=5u;!FEkYhgkcV<}y(5b1r`ff$9$19}5E>+oXB@Js=KXAFn zCH)y=L^#Kfj?_tciUYpm&etD;lB24Wx(8T_M|*vAB*G4~A3~zsPiRlLfJT>`gXZy< z{G;nv7r{D1elV?|Z9jA4@2bp8qu_EFbX#635(jc!1r81pU|Q~eL`FP41I@S~$Xkb4m<-R(E;J_f4Y@(uN-3c}#TlD1v? z{T*8V#LI(8AkDt=t}0oBRi+xaEl=Pq!9<1-vs7koPyQ}<{qqe^U$JO_UKpl$zb1D0 z_eTym=zk30F}9bq!?<-XcW-W^7G?7QOJ8)A#z5P=oN;M=(@t?bpKnK@@ZvssdoDu5YyR{ z7ovrt;NKjaXG_BMBam@Z|rbwjVsk(8HWk zweMR2ocJYggCa+04jQgw2<%?|NtbHGKW|wfk7K!8G4NR1x(H?%IoYk;4eP7M-v!sW z-fnw{n!niRX&yXbpbTM{4rMs{n}{Ht?0Dp0AcY+`?Su#w4aisrDY#u3nhIFSpW|_u zol4=^pWixnB{mm32S?FeSH-;s>ZfG`ArNASgvdMPYVxkQ*VVbX*74fzzg1n%Hv85t zYS?N&>5A8~x^%j>zPz2<(OWj~FnS zUi_Vuz=@K?Xd!TEc&9rPe3ppNoDHa1uQ?|<+hFx|pI)E)eIqaWHq6Kpg6N78=?}U^wmpwx4)nzM%x8*n@$D*@MmM| zn!Di=LY*5=uds|`4F52FoXP&t#!4xB%l*+e_E0_82dsUlnaKQq9l@hC;1O=qGc^1= z3^Vn`X*li%z;tf@5jahAZ*w>z(92P2fodfDh&2MVyP_6;n>}SmXzlO^E2y!M;Esk$? z3&=;QJU9=HWZSWns?Vn#z8D4SM;nG_I4*wWad!Qr)*~UXflq#3CNzEu-$0$ZHl?4UWi@#=4`~H;u?6QDuvE?fCJ(O*A@2d#@2@x4Yz4yHrLu5v@aEqU+HXA5JQfcQbGp zKDTH&n;M<`FyXQ3rhAP3Xy~ej25K(sgF7n#ZWRfXVVX{5hCUZBf20!TUlBa^gi2r_ zA;8cJ{a6l&47~|ym#8i&^>Su63 z>d?{^$K8ew)9z|mhHunY9T4Rb_8N|R%!;GPCM@R@=7-FaYen}FP%m7+y6br!6l&2( zTo0-qj#MAs))Bg;s7$HqkV-s;7#nc<&6dlgE7XE3$}Z9TuX$Rg4bovD9?~Q6KeF&0 zLGrRmR>NoEcGvV!2*&)JhdCH>E=PXi6~AY2&Q6e<6+ys!6pU8jj@s?w6j&(M@Fjcv zP*`!F>HQ@zK3kwVNuZMofQ?=g+wA~)a zd!dSW!E_p3_eGjr$`czz^6?=|jM`eYIDI%E8#szmAO@903Ang$Fkh%UZv&cvfrQ*= z7!>lj5QywMC8cn6b@i~z&Hh-@{0T`thyh>ml$pGDsvb2qoqf1|>GV=emUFd9oO9THc%DIW3_5jJ zAv~0<0g+jpt~k&yEsy{Ay)s0Qd>D-*Gd5Vg<0WjS#SWm4AoF58Dp#+Qh27@Hf#}DQ z4LZ2{-4qD;Ao~# zNp2T2y!8wBGa@9`$$%bicrGG8&F4;~AdP1Z#K>v}C_8TdvJ42MlL8EO*?RlkNtvLI zPk?^h#zL0K#z-nmE||iHlP5k&oNB-MFWs?&pO-6~e|zIF{ODSB?D$mb9mX0X*kwD! zcR4ra_SLfC7@pGPhbBYxyv1e70gGunKt9!CP5X}6fI2`Cf#;F2|MLhsfK%yC7ycj3 z1iTOMqmvI-_qMi{4GcqS+CpgXVLA(aB3FoMGc~^b03-U}XU6;f0^&1KXTM8<=X3ma zj8#C4jfrZTS&$<0UDSO@6vgyQ4h+nv;g9(rOiU#(EhTXrmWzYCMfC?wPQ3gxtOIjo z`)M?suf*aG^JKgX5XzJ^bC)pL>!$y%67m5g!7V1%ZO=LE-mAYc=>WBKY&3~;#PfN( zX+Q)l*iXI6zQGkvec|Vcf-ciuQMEq-wR#NOCriweS%2}&;c=oT{t==DD!yD%e^9qO z*`F-%U=z@B@>b$OLNvsmZy?bF{21$XIhMZLO&41mW=t&1t4@C(90-)`k3i2CF(5qXDb2Z=WR7| zqhvHN^&MI7(=1z@G(S(e>E4wdu$f;CP=HCFMq>1=_f?(U;1{=(*?czpYgUFRx)*X7 z#$_1)`Croa1iDXupQ%7a8`pjLC7jo_8d8o9>e`1?TkIZ_&+J=qI zVl4dOT4~`T7SK5Bs++3$SSDDfi$DNY%l|yx3}EGK@EzO@i`Cn!Q^x9{4;Mz9ye#p5K4G1OeqpLE0yUb18rB!R7wTTzO zW5N6HV}KF$2`WTkV<5g-X;cWH2`wa&%susa#^TEDfX_Xh)Zhl@*Pgj6Z@9Yk3r2Eb zqUV5%6o_{{`-fl5hvSk33ZI*4N04dR-c^DKD!2P9PVMgEVT4>ekFi-=)qO+hE=elv zk$Z-nO^@|e-Yrn@Rqv>QDl46@M{iFSyQ#4Z6~7*xPY3gUqBihP-sGz7@2^a*FIqC= zc4!8HPkR}v5}1YZGa|N!C_HirGu5I=VW}p@?e{5d(VJsna>;WCRzFu( z6O7YW112qRZ?~Er@Bpz5*Nxf;``T)U+((7Mc{~c9a`W4H6{Fr`E8Z|R zwr)nc;ZboQQeqZiek-3hv;fozhMgT~{1lG6IXP_(BU`9A z0?0S(_$;&@yyM9vwAW1#b)dBB#rZeM*=(S%~nq4h8ssk%}4;0Boooy zjChnj4yA9N$uLUNv{&p}v8k84u90J{uFh5keL-r}BU7KBduad4O6O`7sr=+_7$e~S zl_xv`L(S|n@zJ_&%E|~I2{E|N+4)UVA;{M>{AcyTne$i45xl< zR|qe%9%B480TcU65Q_{@k{9A_8aN0;P2!kQ^!ull!Ez}q++i3byIo1~@Xyj`oy_h{gMt%yG?ZT-CR^6NT zgi=|%GPaGIqlN!@rtl*IDBM=rY4N0~9bXq~Sb33cr;;yCMMZOvx1oX)sn^@s+i17e z2uX~JmNSMvGQ!6iIC}mbMB1~*N)=?&CZE*&G%XyP0dw)ot3I9Ep&w06@s>9YWZR_( zL=%s5buEFc_Hf}Yajn#_-ip`0D@Zdxe&w&`A%;&KAO)L327;a4*GzI><;L8f?7XDr)gUp z&iPMo9jV$StHbTX80(o2(UifY6T9`glU?D(^zrANiaLi}?EeSJ@xTkM5N7|O0|~B0 zya0oaU9g~0w>$iF*XN(SHQ9V)(`=qxZ|`|;*dceeUf(=wc?*KI%ii|-^?V_6nEsR| zPzXG7(#LwzW^eb>O#{pwX=^rAkH0+P!z0y~n7y|c`_a(!h&~G%^~&IH=FL+VAhz50 z?dz<_5K||7rp9hwkh1=3n{H;YDx8#>n&~xWh@zRfIl&kp_Fd@B;=?Or%e9al)Mg&t zd85lMe1Hq?7Z4N8gyGW2XWzZixnin@Vp9vwg3JH^p}+DxkBRjw3k2*k)J~2|$=F?< z_p@k1@Ph0zWfL22GIH>)|mah2+W?0MXET{m2*R8TgD=Yl{Cd z(H9`O5EKJDaH6t6uQ`E9(-C}Un63`hx>G4>@PA(5{RsWcvZ18*CFv{!IEyVGL1wjc zAhi(t`D@%I++T~}&iyk^A#M;>%dOEr{u$Eux3pSLJ?4Nl)zn6o;NO9N`#NT}eI}*Z z^OHR`bhvHbOo|RaQTF{0@InfoW*dbya__Z{(r^7Z`AWvkEqnLV-zb4}@;}w6%4*lpt1iVb5HCsGE4mvbL$=OQ4pw6J0m`l6a^VO_L_^D z)J^?e*JDrcX`EyN9CcT{KA?BrPJ)T3FXl={#nMqTQ34XFe}{U|i9e0(oN=?!z^AUR z6yKWlEL|0hGyDi$bX@lOwg&#+k%H{2@z7vL7-W6nd>z!)1c7$FtTO)J6^c2q6{xUf zYt6&ze?b4G)*a{m~X&{=%UQ9Rsl7IS1ArGBsFMSj6vr zdWHR0{YT}QkRob3dqUpo&PU_|7w;*-v5`f)(y48f#RHkT$lYfl@wqTP}89b4#Sokcd{cKC~|Uoz#ya0$hSmel-`_+mmlwL$klS zqKf{nsFHX*6-xJ+C^2=B1=M=Y7fQA5FV5x33>xkleIwqF6{a&gqW|smLLhfw)dmTq zF{-7^+Mg}Wu1K$bYJBk8r_Ud_VKoLQ= z?oH5CA*t_w2Gb>eGT0`aoF7miwi8^UmCBCvJrGl-eH6S%d3cmR94htq@CVWYc@j6M z?URx>rTtWpJY9j;Z(>oQ&KUwzrC-t+^A17Pf&cRZkBCR-63g6PL|2PwG83nJnf<;S zSIdphG}ta{UPX6EA(SPUx?^JeT z(Uf1}p>_N+MRv@YPL#8@7TY^83C|t>op$$#Kd?Brw$hC5dtsI&d%zW zCMUBN7Z;&UC8ea+tvIR39^E?u>T5g**tq=3a=@{Z=EA~)m;0B7_9UBz+D#9nME)5% z6{NtI6R)0c%V&VchF{}V!?i@8{F1cOv@)-;Q7bVqu`AK>X!#uh?{xESLf`u6T2DAN z$CDZ^;oJtE zvssIcqK>y_qG06r+0 z+P&n{IHQY;!kGANAb>YcRf@l5u@}b;?#Pw8HBzDiS1|al3`9$M{}an0uO8(ctkJ4> z$So?8ML;9m(w z6&8j*F+QG?muK2ib$k023mcozaS3Y?UB(VOW8r>t5L_J!c&L}0zSl#AZtBhto-xmPnXr79OGkS&3&F-t0ST~S{bic zK6igE?^!)Y`S@_PS1xBE5ukRz4W24cS9kQ+EIvO_p?kUcUAG(5Y+}5Ya{t0+%1Oo= z=O0rgG&D3+5TI)@Og(Em1DA$)gg&xorZlj{r>vt>JUKae4-mb_4jAO#rPH$MAwRkL zdRHZr$o)ZOH`I`>x36#g*hzM$b`LxM^JX$>Kw!iisUQDcZMoXBv9)&H;a|r&Rrc(C z$~(K1Q#+I1_ee+};qeHJETR>6cCH0a^#van4SDl~St3S8+1hUBAK2K~s0k03$o1!I ztn-SB02SgF@2~oV>lcc8!YL^q1aSG|H*0i?9J_waE>?J79yBJ2a*(yZM_Heq2Tw0S z2?jou<`fi2^Em9i4+5isf`{TM4w!`}FO}&S7&elPiMqbQAy?RKD*{({_ksL_x=cB< zv+8{Je^wJJ^u}jrxw9Su5xs>P9^}d!T`x^4MXVaKUK z>0Pc5cb8`8I}_g%UR(Q9OFYs-62GU&T-w zR1tKi3eyQ1E$8*fyuw16psDfkN72?qph*kB@Amfg)WQVh`+}X%uOLrd zJQ3+Icu~|iJ2f^a;Y|im>rtG6h(YiJc5IN^9((88eD0GIrH9S!tB8tv+t}DpJ@H%v zkhE-3g8C=99!Mo{P%aJ)bSu?AC@7>#G1Q9i>wIP~St;c{R|T#j z%U*2@AYEP(j)GSC&QqqWLz30G%wXU3%VcwHrXeoTF^KLv_v6}+Pm2lIn!4*x;^T3? z@fEn$>*WGT1e(BYNs{x%D|($K&B(~eSGKoZgr}v&a4kosmX@k+ZjBE6vuwm?OcwK; zS}xm}G>nWxe^BAw>s6DffSj;_lB`5qs@Y5d$4aUID& z$jhl4-}ZZ$YcnDJ*RNj+=W$@^QI~eaYtB8MVwJ|Yo}kN`;mGY^;=|Yy{YQ-$6M1)G z*`i}WWR?r=Leq_;S<%63_b6(~X`f@`^s2(?cqQT##rf4gCuyN3O`Lhc-sAyf=3peP3hxXKOopRM9OBO}0D<9vPep8SLSia{I3 z^XJdKW-X13jAq@MPX~Fxn=ie+@NSxr(cP`B;r!yJJOUmE6h!;AjSbVu0=2xH9NbDU zP?zoY^gBxk5#fUvoR;(a*PfzwIP5*tsimn;mI91Zq-)dJagmq6EU_|EnY3 z+U*GnfSa3FP!K@|MpY)tCpyr-4)2aJ#kx|8S0HX<;FY_p9d5N&rjR z^oPH92@vd_J%jh6j`rtrXx@$rgR-(o8_9`_iyNPuWIt+a`>X`Uwxpya&^d1ApuShv zu&imm?IeznmPoxB6ZV*5z+KL*#kl$gpnx6EYg?m$U&mY4n~AIRN`?nyNPkOTh!|!o z>Y44A68(euT52zX-KpZKN8*r|m$wSfJi5KNr>v#5kV0r%cDgy3ICoeH!L7T#zJ?;; zCNo)S_sauvazYj?h~kL?L3j$)$yMdPFK7%EHrXWbcc8Z8>>s5|*L2NLI&|DuTH(~< zCfgR$@y>Gcr+%dRPY1yh8IrR%fc@ap9 z#M`n)$kY9vcfb(;O+j9MKDh+wLv{OAbMOn1`WbN0P#{?F)?xxuAUs&q{Dzm^pf>$K zt*Wk4>s2vwbicJbIro!r=D@w1=|3seA1oc3ifdvy4;pyuRl{v5x=ku=j}2;ynh5u| zX0zX?9oC%AWBZz(3@J46`KJ97gt{Kata`U`L#u!mX)t=q<#t_#`&!6l_XuGYho4Nzz=v6(KhR8kQ@ask-tCus7pzeeKih%+ zUl0uebHBXx@o>~(rUn84(Pi42e%BQg0UiitulGfx;Vw0~)qiVEAqnk%#mApLmYbHA z79sFw-hN6;z0wqm(i(TTl(gP_wnC!xBc1buKW$O>j!S!g&Han7a`eA1Fb3^4664}n z-f=l_;3)cVzStf7uKhfY2jlzIOGO}&lO^`}{m{Z% zP{(TN<8WTJEthym#6dia7o799MoP4ZH_|o0fXz6>KI^QL#HHD_xlX^4GGVur`$M>6 z5O`S+3B3RED2YdSSbThbLj$k9on6A2{?;VO$mzZjyzkpQ?b#*Z)3K0A;#C7V2v`av zsD#gp(v)oGHLYsdClS*PV;>Bs8b@b21$iO!r_1 zma~r)pvPN1qb~maZBr%H3~|2FA3`I9=NEt|<_pSa9Y4|Wv8nu| zrjok!#+`j08v)#B5@9w3gwA^mwfhX~obxBMTH*(D2`Ak1C%5ZOQ@^984(|K*N%gr< zgDEyJ^U^#R!B(NZD)9@>ZC&4?&G4neY-5PWyEoIG5n$p@5hrxcSo#Q(tJ&FEGJrr0 zXhwe%kg>4Q=CuAD^Q{b?|8Mj zo-d|;W~)4$ytw$>=$NAh@Ss*x;Rm43o!W`Ij$`d}Wx9cPMPzztN7Ue;5(h?)IBz`gMk41Y8$7@l)&t9le9Te{Dudbodb(RdgOqKs}`C$F!(VwS% zbpmy)JFqaxy$?PX-@lkI@^VY0WLq+~&l^|DfzA#_`>lrwa{eXPk6;6Uz%e#KU&dZ; z`0Adz%s3B4Hx`Xkiv^dnj%JQV`RJcNjW;)q&L4B<6Q}t9 z^2ox8GIRM&27JJb$Q>SN{tOQZBm`>`m&3-(AfB#myS%I{F`rgTcqjwP;;B9&4`GoK zFWoK(2nb;ywv$PKWJ|rqD)n2dZYR+ts2r=~fu@8a6Yluq9gQAdQCOZbyw;%B87%&k z!q!W7oL7#+9>7$byq3({JtQI=;CdG@K3^l5q7FRPK0E1S%r7Vi1S)7f zUUKxXX_F5^oA2KW^0;cqaSDWOjooP7jE}krVl;Zw*sS*mwXbG~4#Zsepza8AI?ZQV z1sO()erS@&JBpAu0VOtw@Zuwwt+KLzAe%JP{Ho<;WDi*XVBvfFd+|q0~Mfmu=Y_ZxC?)KJ4!oA9!DU$?y zI)*Ock1v}cjFVYH+gFmma#R6CDo@WSf6gv9)`ajGR?CncmJZeirf#Klh(*3sm z2d5&EksJ2oOI*gzrRPgRidqfq z+t}-q!`IP?-Hwa5Z%v;9Dw6T*hI?sKlU_vyir6JOG7{kA$!f|E;3oeZbgE<0)f?Jd z3-hi}EcVTElP?B$v_%m9VvCJd=;;HJ)g#qH43G0rD9D zZ9@Fw;vZ+$l`S6}%sgMu_FfX*uSV|3v{B^nASoNxF9}SP^J{F;4@a+#QLN(mU}maF zqMx$k$~l@-Ag&N+q;r)~mdviT7-;VK*OQYBx0ID+T0KeEdPMg5B@6q^SNBKY(2(gb z1_J%}uk7XDq%M^+h86Sdis*LO)YCk7txE0J$1F#c-=D+`~S3%4C&kJmNmK>n5Z z?j2|Q^726oHXZCg7 z#m5%`k|5itT=w}lwSQz51c8_X&{@4%Co(`k)ZXpDRKa-){A!6Ftjs&6|2}dAx&DdR zU)33B>fN2kTm394>bw-1ycFY~)IaWqsrcem9%YFh&3~z(NYl`bcg;T-aEyBSv6kmU zQ`j`TKOxV3Mg(kG`povKEI^JO5q^b*GE$KL7ZbZ5}f$jN2dQ=SNB=c ze}am02UYH9F&Z|B-RbTe$i2UpJ^vUcp-g~@3X&;{hk8|J-{Xzz9a2H0#qz;HNwXMq z<^ufdW&N3_y}w=M+inasUsIEJ&wRb&uScjheu$G__{E26`2lA!y`tE7IXuh0H)^9N zG-v!_Yf00$T$LL^h{j}~NQBpytuWtQ@16XZs}}aSKWUS=t24+zt|M22b3Ix`Ha_MQ z7DwJVQ1^QvDd8}5IP^oP@4A!#Ju_3U3Y3YZ^;9v;{%Z_tlE-j?#}%Q%?T~u!67r&v zZ>l7;Z=^EvZlD(zMn+O(510(qL`6987aZK&MQkv-Gz(E;R547izqN=7nzZVTCyr3* z8hcJf&~}d(KJ(nn_AXkO{?}u!-+cZ0^dg`Q=@?*3ummR{1@_QXgOEDoK;_VK9Uw^1 zE%G}gM~9lGhyP*!m8-V_wY&ZcckuUomb<~8yFQh>-fj(9@j(T(FwwpKf~cN?d#sla z;+_!4ov~BJ=eQ@V4LAx2c4k(x=UAw?{u=6v=SNsMy_>+N<$ymJH>-QNmnU&E4}{k; z-OR$6!k>pta6qCJNfRvH&Z6$i0|~k5DuXe7AM9jp1i1wWlNqqsDWnK*2k?cgH@C1i zM<a40KIG3a^u3p!`>SuG?NNUsWIl7?2rLNP;}g=lZZ8 zfuX#6a;{dwX=$pIhqTlr3PCPlcXN4iGyOq~10TXH0f8Qoe%H(oXnfSE7zgsP-biYO z*VJ>dX8oCC#0OIt5*0rd=Zk=C*NKNOTBJ^FCoEPC+UQv|&RW$PSPPfekn7BG(Z(6# zMgv%8VPh0%bKN~3nQ^)5)=S8DvNhl%LPCDz&cS*eQ{^i-r&SI}Vt@s>5w!{^CgazL z&dqhjiNVyl-Xf)NkohTebuuh43aE4rQ5`@@)876G2kt;@>jp%t-|v>MZQ6tTGq=V0 zN$__EoKeL_xU@7K>*U1buIh#T^sodHJ%wBicJDRy+1C{7`99(yMU>p-C$SHl#-P?} z9nXg@*_kL+hE_g%nsIU@@hUY2HD$LpT`7K-R$+11#RHkpR)V|pm|);xtE1=6#mrF= z_Z9&QK%e@yH#F$f*VoG} zEf>T~mc4Un6ZOpO^I@m^E2U)%&C4yE^kTYuFq4;jvO*~d>$ z$uU3Q-CkWui~>6=eEt#A$v*NxWSa5fM~X+cfJ&@;F~_gEPxtS7^XoE=6;IoR8!%Ek zM87N%CZMjb?6o~EnN2LVu+8Zc4FIO63V38t^XgKz1K?z;yRv*TuKOY5@rOsz>(zs+ z_0LSgal~ZeWFlEpen%=T2J*{kl)6|oQ<3-{pVUV~F5?xOkO4O((tX6>dH*~3en3+d zD9{EXnBL;n%6aD&6<|4(Rd-;`Sr2j@isRxh?Kb10dD?ttTVi9Z|Ao6_1)NJC8|>6U zHPn-CJTHUadyb^BHxH~ai^%cw^*=yV;eq@Q#_Az-11)PwG*F;tp%>a&?hOau#6EDZFK zb;c1LUEKh(NLxiE7NB$O=g)jw@Ynx`VF&A19#( zNt~pRJT&N0k^oh41Y#fiC`|C2jYh|ts~qGYvWHc&hY=ucje1)>aeM6?Eobua8Bim% zK5BF?=k~2o1vLkEvPY`;U^F95ZE$5oXbU>}G2yWFLM%|tiqGmii~m}coF<5bM#)Bm zMSv`Ej$ERGK3?25Zolad`XUsxV!Pqt!!8bffGgF1r!%oS+tC**yj0TM+>GQQ`J-a( zrRM}$=_YwJrk9oQYidg^BP`EeKjJtAVj;^Y7KUecr2noNDQ*VFey$Rqo1Fmiq-d$^U1#xYUmyj+#>>^*W{} z9wa4NlC}ql9S`S}49ArWk3_tD8$^__^XK;vZEj_y(chUPF)SbOGhn6oyJU}VOJO4! zz`roNNS#b-6+e8Tp{rXAI4-N1IE2@ktFg|4!Sn|?qK{sf4EFI*fc;O9kPZA|aQN%k z586Gkom`@%I=y+vZ|$=S)=ED>m7F92g@uVDCpY_6e(1T!mz$%PBdX(LfPItN%+e-P*Q|Fy3 z$tP-D1jyH<4tfn_jX!LC~bURxfuu$XAXpk{T%~ zDb=oy|Al}|2ei1UFxdEfi+3g9+@H`RK3ewo@0)+|RnL)Fn9!v8`eQ5Quc@AXuef?m zAX#e52=m6T{3DExPujSWZ}^Xlx*HD8@b;#!Q_p_yPzJp;NJB!D&l0FHz33bTg@svN zfbcqaO+ZBp_~h-qy{T6y7;FHJ!{pzPF3snwaka}y1?_E_Uw%FZLSO!eYH2k_`r>#| z;(g@K@3@G*)MTadY_xnZH_*4W?uIJ0k9*Qjat%!r*pm?m5k~glHMIyMC>bU-HolmX zm4VT9gY^G92-0uC`%1i58fz zOi4-MrGvv!h7X~&ej?Mxy1I_d<4)&B0baz%1mB0Q5e&~YVR{HZloz4dIz1JHB^ka- zaeBjh(a&gC)L!2c~*UO)%dE%AkiAG()y)u84VJ57P1oARhvJfHntoZqnoxYBpij18Ky|l`g!YFiHY;Ue^F$~F`kh@c< zj3B5J;_U+~(GxlCM|C#&Q*TI#>Nu-s>{oKhp>RI)dI%3;u<&}g@ajSJvaQhDc|r;0 zMCWQ`?yHzNuCkqayBlm-Q;Co8|ws6O#El$ zze`S@IypV;i=)O)j+E$)jEIORfu^8yio=fW;_BA?@+(Rr82^KTIUUSQEb0$y%#7F( zRGf8O*mXttlSOoJ@e|beqW7dy#)qgm%b%&B>(LfINk>$$wUa~0WB74_9Byk(#pntW ztQs2?a!fRP$5%uVVd|SM`|d_<5f{D%)!V-r*R~!Avj!)ib$-) zG$lQ~d*`HU>t%jP2_`68etG-iaDxXDJv_;DG6O^XV#XT*oN8^*CwmG&67ty$lc6K# z5OMkKD2jjK^DZB1e%`*5B4&g#nr0fBnJh-(5n&Q4yaA12Xd&(A*z6b7`1p@!tIMRf zsCQx~kFI|o3-flsA-F_|=z4Fn<-CSh0LIrcue|(HcXi1)3R6ahfY{lWtGgal&b26} zT&?)&#A;on*sSKVBZ`=qk{4j$m|)=4#S@Y9F74C^)(`MAyr2cc#L=+EqW9jy%Lx@& z@YY1}nZAXBzCL-b9Yek<2+f|p^8<;D^h5k8PvGGB@IVf#c(ds%sQXwf-P_-=%lx(A za9=3iHi0Z=1Q#|ujNBj)=Agy4F=59i6c;X;5%1aGuu|%1%h0`Q791I&`5oU*X6tZ| z?c+jZ&DU&^g#e2Isb6X8oN2l#%p7k&6N_=Pb9GwxCLg}(!q!LE4 z`eh}c!gFxDDx@n;QS$V@&Kr3AwSLKqNdIfHpZ?7V<#}Kdf$h;RO{nb7%s`*xov(xwnYzqY z<>_*U;1l55u&QQBi_;vqD_dJL6Nw=VtYoyc9-LXwlhUVO zp0S}16d0)+%6@l134Uwfp9ajP?euG4)7_Dw+h(uu5r-o~zFO(Au;t*AkY3GM;BJ{% zPjFU<@M?bxIMa*Wln@dulZ5q?)WNg!zEDm#jZRebhzL7;GYgEsnkw(_?uE5U*X=iZ zE~8J8m3jeWe#87M4F+>=zwrVG=FIL%EbaAAjJ+RKf8|#(3C7gNo>QhxyzZm}X+lDF z_P1b!gVLzP>SbuU`|{bx`mAMfK4A)GpF!Q#)-l^NP@(K+&8T7P>@wYq_J@Z#H=7TvxdZwR=CQ&$M{eDr zoPWMW-o=fPcau{wBRq@`D-+HdH)JvAWxA`H8q-Nk6I`Ub#%f&O2gEKSa%Ig z&2fk^eq&SW&bP&Z`gn8HwjK|h5m2IJpqln3w&Hh${WF0Yj<;p5Q(a=s>67LObYb)K z@veNOA(!!7GTg4xG%Lu;r4WvxUx3&rJy(oJ+WS_@k!*YLRShn&CYojFxRK3w+wlD2 ztJGTeS8C<$-!lE;Lgy0-JS#P}cNoy!MWxu`a2j*Tu`nX~peX;C`7<;$w6=Z6PHNVw zk|1}1X=-{JZ|e-ReR;I~j=S8j5wCidRpM1;>(NtmYs~pNdm^A%**_$OOau6Ky~I!y z5P?r(yYMLWe0d5|`Fs+EE^Wn;;Qj)i&`|d~EFZ~13m^D_(wyiA_)VMRE^D@?=RAt9 zXLi7*2MtZC>wG49cKWGP>`E$Bc-2<@G9$Rd`bqMi*ht+~&P|m!i+1Mf5hV&h9Y<4A zc)gVMD`S?A_W?1nIRxZ1u8*@La}nB~3@J!boJLJ^-WTl7e7&jY-hRu${@5d)t>8%N ztyu6bC@e%XY;;y}Pz?%_WKqo;`1#KU#bd(d&bOji|D3)WpA@!uB+XGJ!?r7~jFL{G zm6!7urA_hc{JHGP8=qgCXN)sxgTaJj37TWtk?CI{-IXbcj~LFqm`HX>!T9+VENx7| z6U*4r$;_CCgQI!&!DUDsu;(E~4#h!XYR(gqp99}tZl9N)|LWm9%(ZOmAmt$N#3mAJ zu175tX7R$I0-CIIU{IMQ3rKa(4-hlbDc2jbrc4E*IfO^fkPLim#I3u!nWv6vQ!5G` zN+gRVb@#;m?E~*>#~JR)nHknb6na$dmRbrv&m{|%^ z^5pc0O5*&j@K^l4rOLDqr4;y3q+E2*s|dgCJCQn9Dhn7>P>k!wS{%Euh2P+Fb*mt5 zMfjklg~C}{NgWvAtKJRwl|k0r9-$c{k7=jk`R0GaCWx6Oi|uNLb#??m0P+UVKVOV% zFq6gpf^YRhyfMSO^#H5sfZ@(4Z#JC4hr@u_x55{lP+Z~p$y;B{eyws7GyH^m)c7Qf zAxa@}B$3LLm;mp#u9WGCZL3im z$4TsLOaky9R*^`Bo!9-a`abA>1#{LB%dJz-=AVU=`&|~=WNHi)fASr0D);qci-p_6 zqKdw@UG>(WnhU^m7(>6!>b$Wm;bL~f#f0afGXzVaKcouzT`&Reu_0g140ssy_kuFP zWpougD`F&&tiLBNg|9j!k{ad5->nI^IqUS5w~n7)O>FJH%$nH&RRT_^3WO#u)3)pK z`OJkx3Kp*qz=}UK0xelybMxcF8&D%~)3Lz#=ag~eACfskR|FsuYCJs_f@yvt)=YcT z`GH=}F;*JfzwYjsHo6|)KeX(F%3YfcY!GRX7T0_wt}vrg3yDvU>@UFku>N^eYixQI*ikm`!ix>+kQrtXn}>MCK3bw!p;bY z17N}69EoI)z#T~{XQGdejyy(e-4%{9W)qhH=SC1KPqZvh&G?14Is|cS{N(5;x*F5P zBjU@v3LB6@UY4Ciy#fPPi0;YLsYhO!G=OSjzOnUu6uzPHJyk|ejzEv;dyfHKoeOa- zwBam8w4W`>StGeMQ-n{!@?1^n=|9Qh!sp9;&l#oRdsC)ov;{n!G0`qvDJw+e{tSHu%;L=y4jfiRc{xs=I@_THk=Qu+Dq>J2#X=Z{ZfmPo)h)NKkOO5EB|UM~ z$vs@pVuM=2;_0`A9f`5JF4q$B)(?17;FFbc4Ou-4D$!LwqYm)Zv84-Uk-VE^Pq?0&BQC;^s9^$ls^U|g@ zrv1h-r=7B2oHaT3MG9TKyNuOaa>b{d2xR&LEo0-u=A&=}x0|6eiRK$hFUTr2=Nu~d z1K0c!Z$e61s79FhIBuf7bBnA5R;M1>vfmz5z5CM-Jt@L(@l~JY`SvrZ{+NyU0{ZXc zAugf8uIvf&O?2_!f(II;$$Shx>P}NZ^s2o-uzUm1;c>*gCr0H$c6wEo?A$l~PI`4$ zUp~wTF)&zIU=&uzC5c5vMUj#HXOU>C_Gcd%-5q@a+mMvQS@Y1TLYK)T@|nGAT|Gn6 zJt`%&*iyHEyNWrVpiTF_#0bAPQWRa4Gb7!p*g>yB8gjZ2hKtNF>L(8oW3l+2ZjDo^_^I`5FE1sNuwf;Bwvs#hcPpg&GU7p#^?>CTs8h)lWxwUG7-G*d zgioR1<#H%9+yK%Vb(&<7``RE4Zk7L>jqRJs}L&-q&KT z^S13#S3GyzFXZ>H2ne!|B}5ld64KNA{nX&uK%YuIen1e^o(tU>vvG3Du|0Si0Bxk| z^0V1n0ZmT{sNMuXy~MgzF6;<*wpC+xCDsH%CtB>^QbF9oBMMQR#Ck~f#;=uFJ^4;? zZJyL5r2lq}n`WLsqfuM%`O4CBHH)>#qn!DYDH!_@viYWDN3dylzMEYvz1>6lzuLm7 zRF3F0&8ryamlqRcX8D3Od|hI|@6Xos?t*%Pxa_0mQYLt_SlI7k>j zByx8oTyL)M>>9ixAELFyk7Q$hWrtZiBN5F>a$Ta3^jHu#_{*Mz3eAdzX1|$!cntrC z0LpbYa(sP~_ZUBZO<}xs>mOfUbL3eLk1FCo&x|M`Qr@LQ1RvVE!zgaV(;tV=oK^IO zIOZq?<#W-+zLc4b!C^?ufz||`I6vFxWw{&Mcl4k6nK*7s4rh4!^)}4%yb-#^S93Cn z$)GrxZV-fZ6?X7W<9;5%GUwy%2ub9U`C2bak&eVZnx@&cQtTwI5ywe-O?EeX%Chzh zK8eKQg^yTf@X}~3muN=w=6;q(7%cNz@GF}6FD2@HE6lahbv)>as^32FZifpEjo`uK z)|~(ljBeV#|7tjM6Dz8m(BDi?Jd2b({1flZi6S9>=C6i(G@qxPb3J3q_=f%NTtKF` z+(CIN&;f_rf~@7=CnBJQ|2L$7v)J(W4i4@_D(;4w;fbtX5t{TknuhKQ_okd_eD3U9 zzqCUsGEDiZ7mP9i2eIJ@%7`FRp{0>88MSm4>+|q3W_{jMk zc!}n!4kkughhKzg`x=t35SxndET4jIKRMT%j0s9N5f4}j&_VoMu%=(di$ARRq-plT z*s5f9`Xo)YV^?$?XWzbw!2CZ;%3R9+yB9awCVzT4Wm0@au>Lt|g3s&l5>_mFx{Y}{ z_j09g*!>0P(~fu12qR2n`-YaE2j58r4fK~`!{`H+MhRhaNSVd&$FtY@8=23o-nL9- zK^rd}Nmv*OH4NH|`BDG7k{@(I+>VVt=yy|7(L4^FK(%i|k>xE7DQQ%kBZ*j8PZDc2 zmuma`o3!Lmh(8!^?*P!T(dVCW`}HP#ium1o2@0R-9-xFg&D}+LimaJ~dqgH|rgBs7 zmS0bEcd+4)nAy0uX)Zk-1N5JhDPiG2b@ydmX17!-X#xI@AirY-MtFh*j(K9Hkztwv zM1*+UpU?mtI*qrYi+&p!n^ph=ApwTu1D~^^>Kmj&Rjgzj-%xDLL=@g4FF*dGzPW!M zBZYX(zpsC>V8Euvi;^Fy3-D+pO?rsa6aR#neH0y-htQ__F;>7%{oNBb5_4GOxRvqU z+*c{j%9ALi*WzDsfo$QC`9vXg8!}bhWxT`|bs^C_}zX)c@N3WZ`B* zdn~kPl(xVWf@&X1B#Uru5WcK5$4i)voaXT~&Eo6j0Nz|ACW`!kL|9w(Z&JXh6g*fq zfc%M5)9E>KNl4>8yU=~dhh5`l#M9woakig)u5a8aNDgW=h9@iG%V$v8LE4wFK zjipVR|5Q+e-zX^}YgVK1GM_b`$5*&mJn2P8Pq2#sw8u&_DHQgQ^$cLYWE}fC$|Nmw z-qOu!4zN*m*j-Ml_HB?9MNe!rlo?=+m{gd;%zsUAk{)7;Ff_SSad#p|r6U%jSLXVr zDu|D%|5|$&8E4Q~AKI+xSKlhNhDC-&AQ-1#7cC%A`ZydgJA2FzdVe~YS0J1gOibYNmYp=>IGq;NRerd9*w?5~_96%t8tr?y^jCmmnca=goP# zuefTJ2?prB9Dtdp7Yded-D{GnBi*!#k~I*Qz4aALGY@5)m$GA;b8>zswHwvG4x6_) zP5LDw)>>NMSOU=6&Bq*&$AF0nc23-v@%DB&e@9G;k?pr7vnh zsO<*F!szjK_=esuC_h0LCUv0!gK9cI3@S0hBVT=JGpvl^Ur%(7P!UoaU4h-72-lQ6%Umbk13&$(~f2=>Lr-b?x_>_>ezzR zB(;@(>G16mQrnYOyeENgKP5Z_T#o57$GiyQmcw(-_bj?!*1mMVbM4O0^tqsn@33wV$N=f?Vfj7qC_3VZ za1GMK_uLDwFC#EyJb#`@#M!&~SOoc4+-i9@Q^0-->Loh5)9bo1&a7Kl-v_=YA4zsX z@cK`-g2tNTq|~5uXo{sZ7#_ijHbf`OXBT_PjgHyZg&<93hl5SMBL#Zhz5SxL__^!BHJbu;6(!$7g?eZRzHJo8=>HQbX!u2rAP3(^*|{$x6lq zHVTJojE>2@{5vuq9odA?t=WXz^~+wOjI${WGVy$*-IG8^t!LZ#c8*_GdHEs)|4ef| z2?KEAB!e`fC;6?Ri8p3r>n&yL^*05xg!4>B0$h`SP!L5&z5!Kgo*xzNWFGsE$5ynq z&xYgEGH5Z7rxGB#gi0&3P-fEZ;mm{%lTV1_AGor%{pI{796R|fBe5tQ(|#oZuDmR! z;v2k@aKqrHwxd%QTDIQk7M;~!*p)W0Nc8vh3XMNUtmB!bGzgs>o2Lfo#ygA~0n*rr z5QY+`zl`**f4o;Jh!5x!*!K_OquaE~v)$7_tE@*cOGMzJ4UTRuRtIegU9k z1?@doSspn-m-fnU1+f65r2c^UP!C*B6(hFaRG@osu-Y5V=eey7leV{KcWynDZ)1zJ zlNKd#=ovGkRtl*`K9vd;R&MJgmNGi zt8jP23ZOskQ}N59pu;8qgS-zPp!M=xQexsfP;>!Rt^Vh_#=X)68V2?e4Xb+ZNm4ug zdfuP@ZcyohJ$cm0MF|RL?*~{iLXm2iI_azwWtpaKnacX`!_l9E$!Wt^2~gJvLf14v z`7U&Ij7AAL(%y{{OzE;d2n zAr8$LKHUrXh!+BN=z)8Z-G^+>fot@wSJ|Jd-j(Cfjlou)m9{jL2TEBJ>a$}I8G z(AS^aZ@9dKF6mEZbAv9o;F_QTs;@}pU6o}&UJRu$-b9f~NIn}IJ9{T+m2};yXgunb zh07TzN3Xe7k%V8fuEd8of00PG3huT8^lBLRRV7KWRRa>slv8Zv-#>{Iuk7AGS^JJ3 z^@c!mK1srWQKqgBIl{4&x#E0{e)r_LMP(&nraT7JHy>W0KDZi<01hSZXn6c-D9gOI za$UFYK@1d+;SI!qnn68DZIJrmPUy|;k8^kZqmo=aKgg@gFy4jh60Ox7awl?t%T_ zLB4?fg#`oAEod;p5wIOmjuES6{t8+yUn8_o10y5OGc?wqg(gGXmp@CDwbg{jYj-wL zk?Z2+d^%7XkvA@SQ36Fg#uE+DU+o4u;=$pebe#FrTdrU03Iupw=NU)G$70tPnNyER zxQ%A_Z*xC?0aCmL@8v+Biw!6psgC(o4B4SlWPfpP5QXr9D+=sA7^=p~+Hk-3V^yHK zc~<9LT3WjGCn%e|z(ZnRP0ALVl)EPsi-^~LoQW+884yvzOFk$=X%D+4&K5kTM@IvO z{q{Ye(*I_prYN339D|ehoi!3&*Tk1OWITky00$$0)s+o$B^-0sZr~ka5y2r5QF$by zqLb0nF*=9S(`^@vz7l&rMuAONR&;y5S3|xzht1cOgdN!;gz!>I^M(+rF1PajtQN(F z1vW`Oy<&8!`u#?j+YN2Hc;F(>pOfQaJ|Fna2LRg7`m&~TDzTn5ny-y8jP5~v7v)JeC-z- zc3_tSe9tK9{Z6725c%mJ#M1%LGPUY-_mQthQ0VYv>nxxk!8`?r7n59`zT0&>SHt0I znTdRbSMMkI^JtdLDxW6bo+7CENNrH%Yb~JA>>>z@%MMHWzcg=N+w6&7_y3NbOL|j6 zi<(cr&~$zar6fK6fGmchC}(?9^A6z5JerC2Ap7sGSM%{^hbrye%-uX7sk2l6nRrh3 z=cE#nNEB2zFo-J7@w=C98YGIS#IZ%a27Sk#BBP*q4VdUoGkmbxwKm@zW{|D7#tZ*k z1R!dxeBj*F{u<5TW7Mcvec6%%+RZJuC!tdH2Wa54UBL6cnX9#Je5NW=d-O!X1aPhJ z=Lvvpr4n(4fllrYaGN5p?MPPbFCYgLaJyqs&PX`F*vfs=Z9beON+e)2thf*!6?Jd; ztq?XE8ru0cmmn0dafqr%!11?%(b0n%*{GcUo2?!^m|l$)R)C}_L#CVt^Z<+=-0HA9 zTa5y03M#9Trl1i&a=CC*vK@33UIPMmUA!80T1TVc*+ejy7R5Itzn-x;ps~RFRF20U z5fjoD2P9H|uf)Gmr*)9AY$E2%o>J~|c+g@HZ{f1z7Sn*+?KAJ1!OUpt1BZWszd<+U z!gLYGbPrCcI~tyF6yTy)35#g( zlk6LXW!Gbzr~$gx)__bTpI&)327k`R4)@aF&Gf~)!>g0KE|Q=NDTdzTB9{maJ}Qq>g7(Q zf`$gcgC|>m*6+Tia?U@W@&Tk&2`4_;?){iGld*=@_+P$knv+N9H=a;Y;6&j z3b0G$keUV%obd{johugu5j7fc$K_+N?4XhKJ_P&cB)VOV zWQ!q+i=2nG$*gKDNj&oLG_k-$cA8yECHGa{J*saR1u9+a;06b(;zqagKjz|xJwz}` zd##Co4q?L&MeNgyGIiQRCLuKv!kP!H?!(TrxWDS6GQXLHeand_I1Q+S2b5qpyl37H z&+&`mD-roA_39o33CZiZyS076e>68t%0QqY+*>E|HeV7TaCLxjMYlu3Zg(6=)w?l6 zyG6*IozFbNU&zD_z7h98uZhKDQ$Awc*0%f}a>p5{dKaptdqgz$owcUo`!ye3N#)zs z+WDm}DD|3^V878i}V@H~NZKn@{+x?@PsH{s3fi#+e5*1}RcLuW z>scPp?L-L6dlStb%IhET&WT1ngbX4gl6b!piYDnph9NRkcny2~0%IX19``G<@4M*T zg)adq;1{{-M#5#+(z+u^swuH*@nzX8M&PG zM{=>H-?u}WHw94*{_HWgceN~MVkZw<$}>=O9Jt|hb_iScK{(=+F4fr z*rfG&Bi7E_uhpZV9oTN?z2f$7MaR~MgO+mOOU8{@juhUjuJ6$`9*(ePjsN&X zb(Glt!=G<$$;25bW)EDz+Iioc%&?ZhhqJ{&r5vl+nJL%=DY)v|!>xm>HG987oLpKSXT*5Ix;E_N?T1g{Qs-jg^t50FpMihc&VF?dG8+%&KP>I;(2_|p>EWd` zQ`@hdMiWc3nCs+6kB>m-GI8d^%$k$627M|JyGwCV5jp@Su;6#j&80(S)S!slIa#WO z1OrNnG5tm!lU9)p9eUtX-54~if7IFU?f0MV&ASafYa#CUqkS zZmWR3UkvoW+H2$kx0C=UJH*r8x=iD(;I}GCq;ZGc(>=RdD(&>)$&60{6XR$W6dCXg z-KrC1M_b<-Z7ur^=0}aJKf>?ncSSc9C~-A-bc9|Y!k2O#Dc>zTr2%+GZS);Caqajj zioLlIWu>qu{4$9u06q>Rq3SCFSW=Tfmwi~zg{7E)Kd~BN&!MgIL|KbqW>tMktqrfg z0JFCMv!7AI9TKtw?zC?Zauu+m&yya6SA!Hd1*c8KZs1+x1}>F@WS)Pk;P6Pz9^77; z!p6mMFn>+FMtHYhj`o^b&FDr8J+6fG+HUJW9lvft!kYz=c&rN)(Wv(?SyguwW#Zk@upf&*fIJ zhOu$1BluN4<<%e^=$UCd6%xr-MFcnC0rYBZaA7||&$TpYmu_JSFHneQ*&p4Cq5vP= z{S&l{fF@F)lRF$ywg1@}!p6qdk>2*Vx8E0ZN&c%PDC`jddNSvw=?X(20D_JNJ6Fk_ z^k5w}waiKUs>_W4O3^biu9Z9O&sHiwXUzv*I2g9|ERDDY{dX z(Gw%aWkC+7{*wvs!VzB`>Rw#R0TEK4ztck7EHQ?c@`~l*gChMd6bLCqf^!O5t8_#1$J;?v%Gfj^V46KHw8h(}L zfU35Q>l@5!7F8wnB{ua$lgo7tgxTkA1nK&bWO9z zy=+EvV!^U8mzgZMcH-sPr z>amQMfWq?g89+TBk5)@gu3LXf$z~)Af%aKByaJkWhrpHE;nCd9nE!F;K$ZMs(Zs|g zM-lbnPxpN{aLnX19st`|12@m~EPVDz4q8}D9S&s4f7MHSKd;=EN4&a2wErtUTg@iJ z%x)Nr=&@h42LJonwCI)T7gT36c@X!cCt51VAWpvdYgmo+JsGLyRcw9zCL*k;grq;n zl$ZmV74RnPF8y4TD}q0MKAQU}_~WvEI}z{^4DW&kByA^P=N3plU6MZeNaq&jbc67C z@Qrz9xOfUJZ2XmJEp0-YgY3Hk?jxOsZ;Wiut|^*J&@2H?hCZDTa$9@pv;+EHWC2qIa_8WNGE!_(uYmdy z;N|}enchN#8yg#uhcI;wjaQ&C9u+jpD70MZ85q1R;dcLZu4V|(N|AErYasi35BAdd zNfJoaQ_|8_5tjm0-3$QONMza$(hFOsGw@$8&dya`JT|_jHi2fFAF+X;{7Sgiwc?u3 zFV7#}(vtKUAQsmwOd*Ts-H(iwsP&^Dlw^T^y3wr84{?$V*jNR-7i@0vq0e9(!yvvBVti>cXU>|Q5J zs3=E;g?C2D8gg^H#`mP`x{)1lz;l>UZ01rX8|t)nx}z>1&VFybUvWrhsxAoqu8?X& z0es%nop7q-8{R*bj0}%Gdyjcr_7D9j<5p?smn?op_yx1Bcb_c<=;;>D_AI|>`}2H|4h;cr`C0AD`_jNl(^TWVLBN202bcZ)dgszdq$Z98 zL$rz3DUnBj3kDLiv!U3qurMzt{St4WI{a6#S9z$vZv@mvvU%#OS0GmN?^)(Ma5Oa1 zbgoE$6YV#!B9fmwUg0&ku-LZs%p(C-oP8{ZudjGs?ja~|Fe?W{ER9tZy(Xs2aj1^T zm$37{{^n_`@VM32i+1FiZjmK?li}he_v`7(<&$$D)Av>u`2}RoD4b;9e-g#^yIy!S z0v)ydGHNZ3J<~h};aG88q*|Tq@%G0{O96wb+lF?=(UIwN_~M~y<+rDw(4q}rWx*Lp zG#-y3Yn1f2HusAWQ%)~j>OK&02c#{HRqdS5`%F*+R}ui+$bA--x1oj4(({{}DO8Jz zW=tS|r`6MM?=Wo8R}qBGAagpMm>4Cj%6f=IG86tqImyR!DKns&?yJFR7v;`nlra|J zy*<$Z+xb)^#+hCDqSX#JQ|j&R9M%3_A!1s84s}Xrb4L;eiWF^?UdcPG-7{b--xJO2 z80S~z!v-a-ba|4kI$Rw|!VGJFMuUtI0x9F{M=>3MX8;6I2Ohv`(=LNKt)ZyXa-`_V zW%6T~V)w4{HeG&gggB+3DeCv?m%uSz`|Syw&+7&ab`TW)rZrqv<}U4Kld+%_${(5G z`$zx^02MN(Pvl)@;}6<}C|&Mmh_181VePxpYsR3<=I~N}_Xrn+vk>sxS9kxMg0$Hv z=wbuqsBLC4;0Q?@5P=nqOFzs%l5Fdj17*`Aryr=fqv_|8*_>Y5=#+n|H|bV4&;N2v ztam8-OU5jW(N+bF(cxV=;KziwP}!z`JI}ugXo|U(4vjz$f9opH;CG+iHSVlYU=D|5 zJ;QiFCkv&f{;BDASREWP(4hSbQnHYxY&jIB6cGiB7@^$AEWw|?vXTM6GF=!SOn9eC z@DmUCwvMMqJSK6$Ll(N6*ZXvSnw*g(mGg@6>G*zgchj#oE%;iV4O$O^0Uw|D$G{|? zJ03|0cUyx8KWZ!II2q^(r_-G+|3vsjfo)Y69h7~iKkejWDH+G=7DoM1iIs_xZ#6`ONo%;KqtPjpW}W?L1!H5J0f;;;qe^LiwZeQmsduz13p zbRSz~P?13g96g)-{q)OOrJNd!=*071!mG=IC@C0B+VJhA{V&&aPgp$%kTvm$3?oZC zlIC$TPH4|=w+hn91oN3L7=Xm!TlimA&-WGic*&0=US3yVB9(r}Q@kAIl&bgT14?Gw zKM^H&%iZG=ur2NC5Vn8zbNq{i0z5Xq&R+N}WO>Wo|1b1Yw@S05eIZUDh1ZZHVvBXF zktQB6A{w?a0JwdPJoEND)YA(N&ql&QK~Z(9p;!8k_=1fi?A^36C^RTvgq78XDO8JM zBxe`AuadyVt+UKg#81BU5Bgu>amP~$D}rfs|x^fTgR zGtg!OZ9wTQmKV`F0|tsh%CNyS#VdoUGXH>24^b%F?zqb31pu$10*vvo4nkORnF2!Q zRIJ!&=47IyR{@jdgXG8P?CFDHO8XjBlw8JfVj#^7OAA!@%n@N`*mm+*3#>?L{z%&DH`MOqzBYtIk*Mmw6VLRIDx0|K4TZ+IV`g{Cq=C++OCO^A z2_|g%Pi5*iPDM4Hj_`i46wS89;RCWwvN(;?fV4J>bx65}fM~II^Tjt!kl5KD?|=CE zo{-=~keC7-8gt|0eeRjk3HJx2lJ7*(EveDeGrlJZ>MOF<`~vCDn!4T4E18$ZUXn$< z)!+QdKz_qeQu`23!{wfQw~x&bVPFUv9j+xd3B$PB`YcR;nc(o<)%1$G7IBFDhi*09 zTlUgJNHdRG_E)hMoV~)@_mTA2vdQj&;c`!B(Npxeh)djm6oabvQI}QCZWvt-brXCf zbD>J)1&O6qJsSz45h2pm4@oygv0GX>S|nF{e-s%Tw@CusW3&`W*A=dqtBAVCNHtyv zTC#w=Wt}CNGU3$=?{u73D`{K-EFL)S-}WJoIG30P5RSbj!wkv9w{=IIAj+jG)8(Hy z0-+i<-y;<7+)}uJxTCqx;XAMG1Os~PZz>aR(>MQcVFT6DdU{XN*f#2wF+ut6yZ?rX za_m}8Dr5tee)%5}CZ@Dg6B=S=iabpcJFV-$5lpJk4P$E@jKf|mFoTjFLqUcXL9NS8 zL`Wu)D)7LP$CIJnl#O{CR1dqX=*?3s$yk~dsy3eTB)ka)o2L9STdYmvVc7Vu#o0Zv zk!h|;9)?4gKb&Xh59~XQ7`te;uf3Ugqe< zIdbIuXw8se-0mr$z12GVfvXQx6j>goDG`4Y7i=(#Z=)H5zMPT+`WRs#w>MEhU6TLO zOGGau-r&?*w5TKLO?4bH4R0}4fmH_@Ipa@3FB2V+5AugWYpQ}z0ue)w0%!M((tB0? zr&T(%rksSdDH@H)+(XPL-?TBP?$Ii{$G`5L^(4OxDu6FAt?%1CDcx*ai{Ah(&Pg6OklF~28Hr)fI@=Qe%koo;Kb$)cfFX?x)%J>Hlz z1qjl9TpnIK_~d5OB@uzfkFtA0W*;}zp>#`tW;CpZ%&W$oF_gM|M;NT$Qf0@1%3aE% z)B->kbb!7A-~6D~nJVgUn~F3;f}*_amVyf`lp)hjm@0If2WqbLaM8o8@uVn9h&2&(MhcS=vv)A26xQGK=%4oUqarX*`tUI6no zZbb*RWm>^K*#zd($dYhDc&pw-9TCC9>0S!7n7U2NEDsT@224u)qi>l_9YVs5ke2*!t_JD!-_E6hAa5Eh60@BGMq;5)#q^0us_CARP}S9J)g~ zrCYkYLFo{X66sL7?mnOQ{r-OU-f{nMIL3ivfy2a#;=Jve0nCGUXeKft z7*NZQt7D@{DvR_Nk&<1gZ#lV$Fai<|Fg{5d=7~`Ep0z0V2Tn1IS}c5qlbL`qeWx6h zQdwREQE)2le+s7~Rb8W+H=Q6o#cTfI4?tYM?gZI)zbv?_`KJjSAmF)}#*tyJ}MlXJ@!+X>car z6a4L77do1`bH=71I3-0m166g8`=zvJHK0g-K~YPy_z#HPW%P|hJDy`C&5twEU)lb= zS4w-O1>=}axsQ;*IiE{A>hy(Ywo8f&W`mN8-XAKg62JT;43+=}6aNyD&okwV4g2SB zjhu#&EK>TiRHK0H9=iI&xU`;6p|wkslR&77yH= z?_#jv6m^CSJGNcMsCuCX#|Rh9|L!oe%+&vO7(u9PWu3#@g3WzK+Ep)ePS)x!!yh`; zkDvC<1v`6qntXd~I_l{j8wroqS``b4$UxDLBsCiE1^6*QSn-`48xT&8PEG89KR1_x z#KrxH*!YD=P6XQ6N6F`(P%E>q>_#`Ys@rNpSjxE=dp`z9$Kmh1}QV$L|MxzNgY&Ab@0yx$?tFaE1=RowHG@Sb zL=4Exg7HgdB&G_ib-$8+*I8wQiu;bh=_|zh1QF}{9ldaEg9Fn>#hB4fGDo@(#|5}V5x*G`U>pPCKC zj}F>yA6RR&J?sDr^rQ4t^YsEY5*Rqsgidq-Y%U(2*}UWeW=~LF$y5J~a3<=Qf0d9l znt^iEFNIA^ke<&n(6g^_%bwmY0#lHLd6+^6O$1mUk z?X7`xo?oe{59B|rKdZte=yMEudw^}9tor5{U-XP(@86kC?`I&apogjnH9SHFa%Q@L zALXP*Jnx~2r8k{bf#_OiU*c{0a=Dz0-Y+tw8XIG%GKfS+j(aMs+6mLJG3%= zjT~6{_x3Z~BU1(YJ8N~@dF9d}mti~~pc%wAknDuKGzfreRyi=h1QSN|1$dfp-Rzqjij8bbW& zUONHi`a0Fc)x$YM;#+GH3FDW}*C>FAR=WO3G)>*YFP6l?CQ4Tae%VEg*Uk}-*&dxk zA%){|Y~D{hU8X6!{A8HA)jck*XX*h^|0`SkLR`Kmjbf@a{5|snuj?d4hd@gL)x#EQ zPE_E2o0+q-!h;0B%N9LZsRwoy^CQuPlJ|KjRxe|9-sgM-%&?|5; zeflw`5D-+I*a|P?L=O|pZ~p8j@Be|5!%%w4JP=|qoIWb$e7$o|fWp{RCOfZ3kD!e$Rqt}A1bb^x`;&t=A;;I#- zCe-NaPoMrt$rX*ij^vh;w*2jTj|%KqLap9uHTbx>34X8DWd?n*%8f~+`(L;rZ^>!r zL;tik%X+^)Y6eqh#}q}Nx-$9BA&c`*=e4YuS%<}d8t-G!g#aMe&^JJyP;8adKXiO$ zSM`wHmsq;qmX;p;kG0~EVxUZ0L|zKEj53gNE^vlRjcU1w2!X{$0NC|r4S~i8ib&ii>$?&TTeB|#soEDqeQQrxzOut*mz5e)SQ!36bg_j!<+iQiDI5x_CRHs!nJ>1x7BI(OEYxJ_2dQV zM^anLbI>nNoK5BpC$6e0YB5q z#U?_6y^gY%O>ftk)m}9wC#KsGiyb@9N+#JE}kFEY3@g@BT@^XUE1Ejs}0F`7aT3=3WZjmKWHNhtQ zfnPg*e?Q-R{)c%;7`i#!Q7)KF_mm`*lk=s)%8J1xL;Y-+Q=P?3Qy%XBTqrkuS2elw z)J0FiHL^Z|vgZ&xw`BMR-`r3O3kCVnV+KrAI%ArjgmMjmF!=$I?YznDgB9xR=la_$ zYUvR9Qu_HW#h7JNhQ?blef>9@VwqQ7Y&mMQ&HkBL5{?7k&xEu?1VdiRJVVb-u_dM` z6hUiV8jGa6+3#`PA+tio?7Z9KpldQhZKcM~vdg)$@7Ia^>^1)WVVml`w?pm-3c*sA z!;3j;l`lAlho1#3Y0BQzy7O0MYO!Smdac)X48l;#f7M9k%k=)nQyffC>SR2mBF)#IMun3SK zI|>xXc}wXjYZ8R}*Pv|R6IR3w@w};2L_n7MK(hE0b=PeGK~7vn)H|D|a9xE*LLmde zbNengh4?m@u&N-rUK8Y)fOf55)lP@d;i#7xvSGCel)S#C=?f8BB~8`Btlg5*86D{+ zKi)@iT4P*BLTQ7a2Pbk4Jh|ZWf^ewCOz$C{ib!+Qb`P5iNY2R60Sk$lwW_LHa|^i9 z|KSl4$*4U*AC5_eoqzoSDi-R-r8}Wz9NjFmjl-LJaPqK2Wu3-_u!wMt8m=vsw^z;A zjB|;@xR-}yb8VU6dUs`=g=HAcO|azVuZ0p=`21n*`ae+@lFRVX0+$l&Lg;Z8mJtV2 z%xt(dS++=n)aRuwyxii($aER$R)0Tmv}L0JH~3nimfU7vT*6_*T)*qR^IFz z1%v36re5<94j&-bw=L`c{QLF1>FS*X<|*EXr!oB`R`9^gtOR|RygOD_zUN?ihV^ZV z{HMz)Yz8I_H`pZbKdOIZ<$2(q=~FC}+b|w;cy;MWo3c2vb4HtJ1kuvHA^d}9F^$%E z@M6>)ikZD`vS44(FxY)KG9$6!J!^fZD_)^F&9^&s4%Ye3V{C-{RiW|S&EPJN3^@p` zuQFgD*Me6U`(b#Z{tQ^NmXnMwgfUM_YIs(+u8ikRI|b?K{&ns#>=3tV1viLa5{i!2 zX{A}Pnm)zh@Kk`J3au^v1^nvI^nwpKVfw>RONJM!4!a0kNZealYfZI3v8Kyx)S9FY z*=Pi_rAzC0GlH@62!9Lue{47xzlbQbDofJm>%m8A)#_KKi{fUcA(AP((dREn9Wq?k zpOrQkw5j>!6?TKigN(|64*E-|Mq%T^#eKEzFuHTTazQ-bcx&R&qg$V7Ece=NTyhY& zQ%P)AS&qA#?a>^%OlySQvM3bzk=DUmT=ksj7suW{b*<`#7xw?pb}6Xb&e{7bC=sS@ z!XN|}p27T#We~O$>NNTo3=_LaosPd@^UWQG4fdBXqju0fzl#*+HoQEqsUT z00ABzC@6qQ4V3Wcyi=J`V{B$+`-uMyIhgN6PeKp{Y}pS<=~hjc0IHPfPUv3DXrl^D8h@;hqO#BRfJ#CtvF`wk(63-d11k@6}Oe8Gi1M8!CJL6 z7pd7etTEi#r@^Ib-|%m0!5XlqTGU7+eO}z;`zXPD-bi|iKJ6BG>??9Uz5S;3o#r+5 z5H4NR%Q>1%&At!3>#?BWuJp#Mv3iXz+)Llmo~+LA9COhgKPo#cdcAktpmleb@32ZR z;m$Y_f|&jtxb$@6dDRqQJ0?^y1^V<;27Ohb#+tTE&(_7IGvq(g?<&s}9sc)MZ}MXR zgvykZ;g~C(Y_b?5cM15(7|=?ai)X#}-K$oQcrq^`ZO{d#UvbiO-jv|VFz^DSI866mbRBQ@Pd#W@ z`9xK$aAXDv2_M_*O7I@Hbpm8^UXpv_QM#w2;0u9Ga)?90g~WG z&?NeQ%mgn)hH&X~>`V+ne(U}jEc?p2vg+X=RM4z?pqcFg6-kPydPI-wZEjK7=XB|f zPVg+9#nEKKTG<-ts`jLLc+ltnuq)>nS!h6ZUsI@&G%tV#6Rffm8x{qb+mCnVXOG=y z-SjYf) z;R=*^J^+n}5^*8n|A+wB1F%HN-$`&dD(19_%05EHRvlP?R81|#O|2<~1~K-ZgB?dp zq7(EPE}XgG$lCbi;dir|>h1ySy|(}0C>ouGDLjuK|Fja zqB&J-OUZy*9hZ4SDF!jtlZiMEoE(&m8W%l_a^EF8^QQ#vS+T#Lhmz(6alOMhjq42h z*!!zPJpuxYRP<|kKEc!Jug>P+vTWmio)hruO(vZFr&Qe~3sm zYFEE5S>t6W8!sA8DQ%!s@Pkg{DRo+pBdc^q!O#ROPRXZBm<`-zBYkW2QJf#*d7vXS z_VR6IfY-qC!^<5qbgp;7Pjv-+IB}KlF_X6Jh)`%An3wfNdM@|*uYTF1A*-B9G`W=6 z=ZyY?z6c#N@2SMNtNZSBFwvcGvD9o)HXu-Rhblt?un5^^t0LK&GEEnqJkdb#Fzj43 zM9zs!Nn2s$Y_x+U!`Lush-xFPNbl?t7J*AULi6g@o3r8v-D~R5lSHyv@7hKR6aTe& zc~QFi*D=K|$S6X>%44n1V+i@WHZPgInREVS%i&Om#B^4<)%e z814PaK;o400-X|7!Z4WNl7?0V!&85D{?R#?MGU+tgcJeZxe0ZUUV^u%wz;ptFm=V? z^{YR~wAXQwT81;Yba=+KiytMjd9*cP+;Tr62p;3JTzkb$hnJL{?$J;?G&O1HOVN)< zhzx?ENknzlNZI{ZxkIGGB$%Mws)FKU)Z!+H|^eMq_tN+b?RicQYaTJy@f&59qLIF`=qpSk+}NT)n0GiMcW#^Fdtz=Shm+WuyDGA zEdqZjg9MvN{IGroXUGeT5HBhsT(4s%UNlwG_p8e8#&>@4t93#zIPHXY`*@a`>?a{R|DI7lg*3X2G=9E zDzV)cOgDN?=+uwx`pO-@il3wUx63H;5);kF8!a4Rf!Wsv$YvOP6?5e?}qdU=lLNrtvc!|*&^=N5Bs_P~oi-4!nc?jJwn9}rj35gxt z=qbUH_~?w5#_nAhLV-rC3mIEn~GGK@{G&uR(5HOJ7dUHs%?(-16a5O9f7Lqv8$wQ!+{!wEoqI zcr+676q-e`>?ZLRufHbM6{_}}tE2woy<6!hiWHKcWb$NJLcv5G*(^iB*at_bEZjH= zQ+glX$H*=o%8(LE;LjOJiz;&L7``Q#JMO;BoY#@w;4`><1R$k)!Is%N5pR!VA`2N5fv=!4+q!EgVWO zg$mo4C35u?Ne>Y8J%g}`BWZAIM*Rac3lRHvr0y(MxH zm1rvCaptV`r(`jkl)bYZUP17}EAV>N6gF&xOc0BdvuN#%AHz95g(XJafhb=Y$?7lR zSL4nj#ooI=H&ihAF2(|iY+8VzpuKv$DABMwv7_uM%pV#unf=0o?hLxifcOFfaQOsO))rTrJ>C^8NFJ@7w;W{tU0O3Ll z9Bc#K{!Wg1?p%9k?^cA~OM|_G9He^>YY|Y<} zu{A<%q&y4X=3FPL-wtaw_-v5tH27QMB^30lLQ}IPCz(`epquiASZ+D(a3%hwa6~(? zmKc)7u1BDdu4=ey4AveGof;Hw^aO;Jr^P(O1ub}|FD1LN>`o+TePl4BGiln2RgnFG zO4B{mqbsM{Hd(T=$2U@)6}& zCu90bh116%p|8>fa(DNe@h=e&2i4alA> z&$Ug)OCU)ouVC^TNy%0psvDa#M7i*HD)<&;JMrP(J zG$$i%w>FOo=sQI|7c1?ZA3lGTk|?VjISi@%x&g;!>Kku$0Q~C9pp{Hq?JE}@W`zLv z@PBzi(HWmG+Lo$K#Loki*9%Bm9A0JT;k(xv*Sa2UyN^c}T(0enMOu@j69}A_f3loR zH!Kl(jJCG!W9PTXT-?+ViX2GY>YU1Ems*PPA8YFh{0C!N^aF=xUv#4sCaV)ne z>-{LjBQ!8f^fsy3dLW#V${akTo3S(#AUo(VzzaGWgJ;7!9|YhK02mM5-)yUYz3UA? zNe+t~38oz@i~%4IDzvi|2h=52GAMMOBV+L0rpt9k3PEa6n&;b`rdlKuso)S&exNV$ zrLEw==6s&vDa3ApR>vUB4U9yoPPmbVNJuf{Ti$JroY~p;zf8h2GUx&aqdoqWty!a5 z+;TE8NMP5=-`kP8YQ1SdSNl?);mR9VphiANd%<1VO$mYNA?jy0SG`gJtSE*|l#o8a zyLN#PEY zot*kW3z@;w?bqUZE0a#dYc-mXq`Yd?n*+Spo0Kf?cHMkwcFZ3?Fx8d>S($MBL|c)D z8eBMaL0(ar$o(tnN_&w1LJj4Xn;^YfmkbS~O&~*I?vzHz+rMJ!t;;VTipu6so~pf` z!$idU_(}rfXqh()=YjKP1ha=XRP_cUz2(q}mxE_pOQozHv3nUNBCkPvnZ|DMg!Zy{cC^c(L?)-CXfFOrk75gmS}FxnyLnvjcZL;ckh`OFNnI3mnml9s{i^2QrIO5V?KT;VD8TBn3{gxr`kJa;Po;9gTix_dY0Gi&r4<-GakHsl6* z@c!>#+-6h=wlBdR35%W;b9?BzB7}pUiv&J+U~D0X_pqYRKGOr2+{Lah`hq`mo*nrX z8=t0Q`B_KNsGU??Et=l~jEWh4C6No&qS?BXtR+itgnaWym+(R7spD;CEwQwgCJBgb zkpTmun3z~j{$Q5r)u2hM&Qaq#%e8*n_oc<@&7F8w3*+-OUHhi#^{$$$Uk&z?c58R7 zC=bp=mc;LLJ8br==eLU=!m+{)p_qOZ?*eaFfzeb7m1pxs!-U=zm(M=nAP@pE*0MNZ zzL?(dhCP5Oz1S+&3e^st(u817Wld>3Bdq`-uw(AKk+DnBYbQ#_p(y6a1giyeknH^X z^9~6n@K_dsLwJ2l&+bOIgSc)^f1Zb~=jAFU)2qwpH{!leqU@;drf&YGpHYp^Z88~+ zPlD4bg8|mVL#4+M+wS{}Y86&U3q-kvHJcmb3lWmX6tkPwr4;QX=eShtXXdTFftl80 zzjC`q?a=aYEd&wL%W^-5Dv0sS5n7kj;6hk0doH1;o=<$wN{QQbjvpW<8HP_q>KFWb zyf^OtOaa!hGIRIpCN(z4xQbzLbAk(jOUL)*qTv3kQKs3DG&A*@ys6>m<2QZzWq&=a zi;Iuvi^W3j-`_UleQf-;&K7?(fT@@%@^``Wqf*QsMMDgqbM^4a-smC>HoWZdSlrWv zuyKTX`fW*1|G5Yc3OYDDa(mgn!@TOax0Nee`ySIjtD*h5w-_kS^A0G6qlj0I!OA!) z*`Qoy3IV2PA*Vy!?Va`ST=ZN=9OCyK!|Bt9!vtpPO}m-)78_-4?*FBI4qg9}`{|2G zt9|>opC-eJOLEx{{A6EW^SFO~9-+BI24p3IOJvA-OKUS?WKJR@zd={O4_Bh!lBCuc zCx&vC)_KcxQ8=#t0ocNQfKPC)U(bG6goFvjUa5_t!MKdoRQavT6b37Su<@Hw@f8p{ zJg1h8Z2oYtzD{GiOa=8Fx69xCL<;@FqQX+utsr86A4I;HNPNBE9a~2P;*z1p$24s< zrHUU$8XqZ^<#c{cw5^lT;m% z@dxA2xO;sY>dF{r1oocWYKS>QzJa6bVS?@M(L_Zeob)B^SBW$E@hap)V;LtZ^2paq zfLN9^QGW73#&|+*uo@c9H(ld<(`cVULgQ$$(z$z<;A9xmy-@MeaDSHk+9wHhPrd{V67oLF?e4^b;XbI= zjvoA+0C1#k)7$4OZWt9J&Df32=b^RiDI%=cTOcChXC zCpWUUdd!^jo%Yh0>44~aQvN$gE7EjBM`OjZ!kp%-?pP=4C2#MNL6lx%@8+|Iy@n6} zf7xTacJ*^a5aj4uI>QC?Gxbh!pol*d5hI)ZWP&fdzYZSKkx@Rd8mB8*E7Z0^hnYb* z=?v&p-d>A!#OVmeLBH6^ zIZeSI*_PI?w`_i3<{bFXWvigkE$h1{ulnDt4no)Yb1vOuqjF8|-xL;i%U-&k8w~PA zWqu02xR7q+`O`x{#3f)7I@|=c5O;8TpD6~)%D|E6gxc@=^7r>$m82&|_nkFY+*Tjk z%vZ`2{)$QFAqN(6i7ex_G+k4M|@(eozU};MH7h z{wLv8ZA$$_qm);~d;j)fuOhXpsq*8eV?INpDBm;6x*dW~e}2Aat)nEQ4%Uepjrrz$ zcC`MNVb_^iRFgrJj|7LU0z*7j=fjZqq~1)cvx(OA=e1hj$f~0KO>;pABNDdH_;y+M zmW@fNnH($xqfPQdL!aL^Ehi)Pl>qEAy0=Pk0EqdL2Nwnty#Y>DSdGP1(xZ(jaKEoHKF&(7F%^rHnsFc<$~=V zjlBSR(a0Rq3wj`aViaQUS#bRIfD0?Q#|^D8Y73UFcF&)gn!dm+&3Zr_Q61c(1>eH^h%k|*l@#LK_V5LD|GsiT0vIE@hor%!7IBge;!it;pI;i1cMsorAv1)sfZCs`X z&Qa%t;cMKDy+={!=@As^45Gk)TP)%BA@D*EU?>8;qc1yd;nbYiVBb2dNO5bl+x-qW zr*}PHjyx{?rbrWeW8 zyh1y9cz~vnME?EAhm!6Di3LT7OegfSaQK3^+R?h(lKPmb4q-qLG=Q$bUvl`#B-}~- z70|^%{fLR6t;9GAs#`AplO=2Z>2h`O#sa%ZH6wnl52osu_6X{)Q2qInPZ=1xqtwS0zrgR`9gah<5aDHCecZ^&u5LWRM73$L z>Bja(3@FW&%Z9m zhm`BzbMH?c%75XkO-U8kMH(;b2P0pGRmbPx38>Y}sLSm0}>8*ZEZvNF*{i+fGlaz&R`7|9l($Dnl~( zS*NYv&c_}Z_v2E>q|-F(EyM(I+G)2eRuHW6Ty72&{#fLqZlDH3LMwI%abWw&I1t+3 zx2r2;VaYx$_9n`kpqJLh^fHH#_GY{v)We0k!){_ zrKU$epDTao(fz~YQ#rTrq5Wy64>}dNsYE3}Q}p|H4&Q2L7=FNcF^k^rtqWV`rf^#; z0CcyrO-ANt!U2;{A3#;VZ>KM;mSpsrRDxW^E?XBD38+ZfMC~l?4ytbvNkOASr~d0L z<=5AI?!O!g5yJz%X$-rH!146lkVCkzO^en$D)@S>RZ>bxPgcZYm;Fxdsg_^@0g#c5 zf1dTWF0`GGZwYZVCjPH-b1ahu;x=O^8?9jO1=P@%YU%~*QSx`x$D4Ww(IN~MsB_cd z_N=_Xf#SIU(wV9Acod-QX4tnkr4f{_3Q4=oDvng* zvM!O@1;!TjZW*N`4nW7!}xp179`9t)B?|;xW#D0G9dEy%xt}qt*=5a_ArQeek zyLmtR`aN-ZRn9JYdJZE;vfuYsv@hKL|gJ3Ks`K6iJ-*@|AuB ztw;Tt?McVqH7#W#f*-IPO|Taqz2A_46cdT(G!^F;&^UI#lDF|Ut9w!8aMNuqCva^w z9o#E76y&VCR{g(KqyG=lNYcyBtn?e}@scWKJ9&mZ%i#=PsaU-_AyF)^^XJ_y?#ssq zd3Kd0lq;+)%Jg&zVn~$;LybDbti<=no2Sy`H+>E4TS3!3Ad|g=Yju*ixD$1n-FZ zx`YE;+b#GS;c8j`clV6&#hbfD_89elxx?-EcYmp2-^~Ahw3#gJhknCgT5ZR;XZt_t z(Q|lGQ>sj*WNjxgsg;H+{z;)d-GpBm2^;s}!a78_4^h5TMOUp(j`yw~h0ymO)z^aC zON6f{9vW-q$H_*myRx_Wy%D{D3X6(~XV>+}Mg*?WVF+YLe7HcHP_>{yA9t3B6cG#v z2DNi-UyF6QAmZ4`wqpE1jg>wu&I$qCV_ZWzGC2)pkC)o~kuh5;)Ie@`><4OyLuGMp zo(a%W(mdTn907+%2vi?ubQQxXUa;9$)fF4qOYG|$--9%O2F%_-N)s}WmU^DJwuZW6 zsrMSwCPHt2A zfXhMd#m@RVazAnYt~efDwUYCqxVs*QIzVc!TqQgRC|p)Dr0g?#UDEptFL=Ag{Pj?l z@D+Qzc;_2gl}|TB#3KAFrj${lrw_3mhW36?#&Lh8adq{qi_A-v4a?V{cpVzryBT-T z_|64fh^O8Ye=l|*1V?0?05&=rxfv0#(sH)PHQ(-evf{IS;?XAgbl~v(MV%HED?Dv# zrf#K`2qGq)vEH?zGF*>|?a7PLKAR~)$P%F@W8G2XPNYtVn7SuF$!WQ;R9M`?lDO@N zi|oMU8lDN{jDw*xmb?4a{w<@eI(zWI@d}>(7ZS=Qa4k#hs!FGpz#T`FG*&t~>MTJ` zk*95i4U^8p1zwE-deG|1#O>X?#rC=VvwX;(7@si2O^upK^Najjn0Cd3Dx7UvyP(*Nzeb~taH)ay$- z7rVuu*IDf0EGRKKL$FY+xQR;0*(8x)##HoUJA+{lr!s#Zx2*5rzjk!%Fr5T8$ zvfC8<$B?Lf)w_8C1Ig2(RdGQj?5%x=RbqAt%t^& zS?jS~to|ENAsm^nk<_aLMfmcRT@N02sSN>?q$X>hMC0rOeg|j`^})l3G11Y!7Z+|9 zm#1U#a&fOrzi7Ouv38aP8AYYADXm%GS6W&QvMX!S?VT4)Y4$Ar**kQsLN`_Kc7Oh_ z4k*8%rbxjfLt#R>dy~n%$hcnIyzjZzx=wx^wt5c#@{(oL`J!phci7VlERCU*5{6sj zI-QT%MaU2&a^AWjob&Q}`Iu~xeX~fgBHP6uy%_n4CiNRQyg$Kj8HtmV)8znN`UG?g zxV|B&vR$mxD4A}O#t$q=%gh8#z%tui)YTug-_Ii2avif-zy<~e{`{T&sdY@BVp>h` zlPm)>AS%(s;VqDslile-4(bBOYo1UG_#06UIjaVf<~YdyVRpg)!D~LA(K}y5`OMLi zzJtD?36@ZH$~OKq82c5da0#_ODZN|5K+LT0$%cvB>gkht+SU=P`c)Opn7!&o&Nz$@ z(Q5An9M({cO-wv_t?^+aH^x{#ZE91dLPlv5Z) zz4hB`<*jq^jS;)rZY_-^(`G}6J~ZP#lv2iSzScTv<30cbPsZ4o4jCEQJQk55=%em_O*J_KGmBqkqPJQrolga2}no=s2Tq=sQd|jy}D;bbTkRDNt|&Pd*U>mK(Hg zZc`LKJICUEgF!_?J9%s}I#FdD>Uq;^;Oo7(I4Fz^ce|w|;RY2Ahk4)yip|13VVfN$ zo_vCuK#D__T%6(IzIPxm?iTkdiCqDS81jkx-%wCDZ}S{gf@F;9*d|xz6q14Ehw$WM z+0kXTovF)}&h+tINf-ZP=rEy4M5m{wkVTEK;V>k(`CjFDwUMm;?p+vYRmQ-;V0iSa zQ{?sOvZ0;YrNsHIgJt*SlCdEMOff>)0c!zNULUImqjY2!OCAu}4LlPIg#Z2Zg^i;mAA=l3 zXg0va#1uC+&ROjIf@7tCa!lxN@k{OU)*d0Z6!joXPEMdLA<6R0%o)2&vv<*w9iB-L zZmdcDqS4zz!GRDShz$OX?D94PlzD%yUv%;@Gs~sf?7vP`%gPS&3)*-<^YByFzm zlnCDnx-7Fh*wE4SL-cjt9(()Mi$0zoxWu#_qhw$yl#X4JsTHP{*g@uI-WSA?mV4dC4!jpQ+eV02R zcAI02m>Y4BG~GxDfUk1`#SNmC)S4KVI9Vq4_4OGn$%Lg_9!|?Cl7*zvL3b*m_{{s) zr%E{dUI)M&^d}`Tkyvw|jGWwItp^L-f%(Z@)*w}_50`_#w!Y=)D(t^KP2er}j6>@g zJ4_9i8 z?uSbKs$>j0nFGqVOz8DcJOhl9#gfBA{m;0nV00(^GB zJ1qep!-VkzPtbnS2}4CaK;1-!ais4CT^r5MgOBBIhywqFuhqQ(I$e0O#$Xe`Q+`#~ zyCzc>Afj&kY$gPjk)HO;raf39<(;<8x*b-+7-Y(IVjbGM?+WZn*&fSGz!~CD)cD{L zy=+)TW{Y#ooSo%~UQ0}M*7}9lAH3qBKfpo;O7jUX`m1@|%e8}ge<(*Ti0iyhjV-DG^UYQY_w3Sgxxr%kVbot2K}0iIl(n#pUjA-hhr=m6{A{24KwS{TSYr*`XX=1(eVFcob17Qaz_ z*h-$kNM+L55`VDw2e)}C@(vm)H=e}mV1|;mzLW)^vy^pBzfTgvKLCto!EofV|zT(q=*>n7*O)}J%` z2gJne4{L7PhT#_t6(B+aIh>F=YxYkxAs=#k=20mFjWJ?mAz(fFZk^W~42rcz@+TBM zq;!ki?>`Y1KkNb4rPwV|`FAYOWdCzRfVv|;D9-m9hW7`X%hk~WGz1bk!Jc`v_ifuz z?|izkp(GF|9tN3*c9L&%QpR26e|@bfK^ZyjE@MLmmH;T0XcKC1ik!I|JIJq_&UZu} zoI#d_Y~MGXoc~$2_A(qK9h8gFGd%|6yJ7ELq)*)BlK0-2go)l=UlksP#Vz9^D16h2 zTxoq!(x=5L{&Qema(nj^6Udi`c$>AFm~|IUAG3YPo7dOZ2_8S*ocP)}T54ws>I^)F zmfy$<8?OKo5)}0!wy@^xQ29@@`bEgzWbmZgE3c!LcXUCwu~@8_o4z<~+sk2!hATtLf#f5BXfP>uEdoS(ZD8n+BZmSPaxbsGN; z2MI`3K~4u_bmwI&KQK$ldwGG_imN9QGIbPVY!={V60h(vAiyA33ZyU^^?Yz0LW*A|cq;Q(_3BaCLS66FU z)-KHZ)0DzE!bPO?Rhxul4HrDgvWT8W^CC-1Ndd?FZ1SiXu>8VkXlP*cGT|Mdhx&)4 zMIs-!XMGC5~?05G+yLWpB4}oJA<_r89VdMYD+=WCmmd`{bpG?=>D#W(A zTC)ZjzIAV7(9YuCB77bqak4%Xso?HreBTUPK*75^AA3TO!z~F4O?Q=+t%P$`CBoFe zBn9jX)h1#!b+79dV~kKBSf9Riy`kGzhGZiUs*B&(lr}y9`=*CHHyUB0S{C@erJ_k2 z?sLK@5p3g8y6Anid>o;zIcG4`FTgFE45`%59#WJ}HEzhQme#WA$a+*q>DyDg`0N9w zQgwB<1(QRGyxOUiMeh&29{G9E+{-szhBNyjVamF6C(;rLA~V~~YMY(rMS-CfQ&boM zll%|g{F7_y!iR?M31V1)6(C0xG^I?_g+b^?Tc8K@Sl!~j0-A)}+v{`Cl6dEDW?E`W z%GK#maakEoL_`GDZKJ>}F7Fq`N?oDYUNj7h=5MZBw>*4&p}Y1rHi5myF|78FOAB8$ z?q0I*c1%LPt!Hs>W-N~IIzX>(aJp-jf5*`E)o4@=3>+P6^Is=$CoiFail1u>H2#v` zS_T~j0i|;I(vB3tqQoR=*F-HJLuOdXKSgX#dlLGOggjRmncnDk-M&J zp+$#nS*XXZy{kA60=_0G9GTBaAC@;PT9S08-S# z@zE4sYi{4s|G3D!jRMlmu&?m1tIMJ$j(H3m^PTN?phm0%Oj@>G>{Uoirx+$e(^jc`E4Zr!PX> zZbycIS<3kr3vurtYoNJ&yVw0G=0^#TZUo+n0u;rj^y6&yUNXAgeh{~FK@^{cN;CvN z0MalLt|TRC_>BRxLw{`d?U3A$CkR~HiZc((Tp2nJbC`r``(c&!C&`PupK#9{;!Pab zx~uPgj_snm{L{)j`*fRq=eM@*5hkzctMKNm>cH_sUL!%p5;bZ`lZ(vqw4yhH@3N78 zYw7|%{;78>P^7JN9x-BgR)mi_P%dE^;JRhqovp3c<$tuBID1J+s06ybjp zQD{-D>eThU;&8T+Vpyru0pWISC>0{5Zu#uw{xHk?qF(wrvgwtV zO`Q(HF@11&uiPmLm~@TUX6$vu@FDcXDplB7?F^viOmpZW~2smyuyX2X;-Cr$Byl13R~mj*@bsG zi@TxCiM+=4o175%Oc2w$Cw@3FR-nN^DD++~5YdP9t>Z4VZNJOfADFy!ygwsyNqF?$ zqfCqkyE@;1EVcO&jE%I!nWf*#K+-J`_-`Ceb@__??0}INdm{Mt>r~ZD{rDm)vnj+e zfvHt?LFrFYBLBWi{V#+m*DUUXTuaWp!VLnQ{m?-mKRe9II}QLu%L(`YqU){0s@$IU z;Z2C5bc1vwA>F0Y4N52}h;(;8AOf34K)Sn2Dd`rF?v@ag4(WQ=_I!TV_pkT5&iTW0 zwtGL%TC-;Ex#ylW)@$$hF`KL;QpP@#w?2|`Tqp`&BxGM_!YJiuZL6U6K+lt;m#}|c z+8QY@hR*#+L)WY^V;^}B1QV_XjPD6=i_D7%=evYHM}cf>cYK$v^r$O# zt$zl6c4YRJ)13};_H>AHH@k>kmNTCPL`O%DSeeH7u$%Nk2wggdcW$n?CO`sATSIF= z!D5j1*{WB}&ct}#9M)!oE8xPasA*>>3qH`NOMG(0k5IjY;S~VZs&^?82;6!C0`7;~ z`2(OO^#rlvq8;FxKv$H+T9e+$6&o8H))_j1beZuxiOZ{JC}BU2wPu8(KpTZ7jmdq8 zX&s*X;ll@Tnen;7l|PZ%khu}cICCs<1l^ArhZh)>q9njrA3S`xHR_41xm3fn;MYgH z=}3vCV5*bK^9Ug-7eUTJf&n4ymGk3_KHb2p;Dtz_2KJ1=GF&)$0+NeSV;kvG8oZnj zYeuy-h91s*7rUv02=q#E))WB|S+UYy2QVPvDIlTq7>`Fg?JEFqWdsx@T<4&n;X7LA z-;Yk2a!p(h5p3?{hNpaV2Vj=^T&H!F#L|C0DQ;zcU7&XwzqB)6?re5*zdW6Q$3qZ$ z52Ug5Dcv~&XH}0IAXbOly(J-Y44_exlwbQLo`Rv7Qbh-M<9!JU^lo%@NonSdERdDl zh`E)zPPhM|Y6#zrG%*K&yWVMp1R*t_e(w%g-K%?kI6~!?d^gme_Ij8&d5DKxE$sX2F@qhB!IIT zUVnKn)}4Of2O+J>pt>@@qa}eC?f*~b2>T=NhLA;yikZ=f>z**h5fD0Ul2co|mUNtb z#CMb$0(Xph@&VHF8a40mdp{OaMP_1I0O`o(N3D`>I4&J0n0gaVAyV7>i~@#Js+~~P zX}f>dN84b8niq0iI_9%#0(6HVpK`dk9C;zo1GL4SFTOaWS->9>J0Cf%64j#Vy1Mmk zn`Pl65QVJXQEbbjKc*?CidG>L;+bay!c+vUh?|E^n6d211>leGlD%);yA+^*>|sx< zc0!PTxq~2-i}~trhErK0YkAHU_#7trys9S!1#eKn9^UcHd+ljO)%fWOs>9p#d08<^ z1G0*~cSclt*M*inBFRM}U;@Vc_A?5WAdk+ueGU)R&2imiv=y=(xDR2gARc zFz2<@VOF+9LjQkCNbl>f5>X-pFryk4<^IFJ5rq|h2v9JSssftcVW>aES|=IX?g=Li z`1{v6oP-P6*SDG2yXdl4-|CJkf&7;a{bt2O{0qQ-AcWL?9})1SNwbpDCH~(^2c{f! zwYY&dd36L`MxvK6oi^uOa?JkSkEbcfHlgjZ{*sw_%698$n=r#DEGho|0C1!XH=3aF zXD-GXsI!Vy#Z%5A?c$o2=cZ&5TnSZ@#HycCY#nZMfTf=ikUk;SyjS`+SM_R@XC82` zX2;@P?Zq!wrQQRP9O#Nrvn<{@{^yt+mms!tazld|I`p=!fw5;F`c0CyxHYA2BwaE; zfmKIjQs;u8BPphiqXUGOXdw4&a%)<1D*`8+wfE_1|L|5)lO{>^A1;j9zcZKv!j4{2 zG20%wFVUiItBdXNgYJBgXj@X}nKo%Bn)fA8h(qK~JdP#z{Sp&NZiN+dGohxYg@Pzt zFd_Q-*06UpN7mtFOY`uKl$6xxHd$!0S8evqre_wuFa`|@z2il}jR&I24aTb8{bXP8 z+2mlaHM0?Vh>Mf}JWfVt&}BQ3(7XDLM{r(m z@5tNRh}Res7jz~-?h*0t$ty(mkGv~0fM6uT?7oM;fRlK42A0pHsR+&717&*X0pkgR zFW;J0O(lO8tZHt|KJXrae-*t8` zeFgs@LDshyi!O@mZ!4ABXHzX6VdM`#lO(>lYHC0xz|n`1MgnBZf{vz>EK1x;;){)k zobw-bqV@{Hy>ogm0#MtZqc>p1dluE};H1z0qu3L^wi+a1=9z**7+ZYQ8{L?QdAb-t zFg&+jYZ3*!2Appdy+@=q^na`liaBqq zbJ`AUteacgP|5dRoh)M*Y3ur>Vv!w1#g`k6^mU$QgF6o8^e~}AHyW0Ag@SvZlb(G2GIIav435P}tX{%o1|FyFry4gVIXvem% zZ91eA)2%fH^YXDu*u7m2hkEHuc-+@|(eyZLF^{&~=N!{;}I5~YQ z%UkBSK0!eE(bc>12{-YsB+%HXw<;q_0a*mdB!dPGuc?4E08p+OV))}`5`I7`LBD-x z0a2dr&e6R`N#fnLeJAeTx?TeVP8I@1)8sqdFdn8bM2QE8x;j8XX0312H>7IK_K%is zFeqcU4OO&00}2ZuI^*3_YJCI*h72C6L)$mD+Y$$p-y+;^0_yZ?C$(#yEZ8hAzFCvX zO@CIB;Im|HW4alwZO_3+JzK{|{-Q}by45b%jcK?FFn4>P65{A~01fk*&2UWv(a!2@ z?&}dNXTjGH68m(|HQuvIvM0g+QRn@V{aOP($W}c`}>?g{6%z#8LnltQ~MOIC;k!j-v{i?liK}q+0_EQ zy6|{1!_-9<2+b8p`l~w@qHT-oV@?f+P-#ven7*FyA@I*3pJiUqC;f9@zJI@YS2UwntC1;?r6 z{UqOh1F9CF8v!9gOZa8-0t#-}p##w1;Ak*v1)QdYNIL|KX-1HDQtMnFz8>+Z>Z1LY zngep&gi>;=)+HG1K@OnL7Ij_f)OSXfNB(tBYWtZ=DN85xPPYfDx5MgmUq(5Vl<8B!hG} zkkNa?c3)@LLN$cjx96mOr$5_gRYjjXuGiLh6~12wvDUhv;s|rAxfq-we*c}BP3Mr! zGW?nU5K{1viQcBQrozDb2NEVTrFKvx#;I#x>H1`1e2|%AV>#z8dVMaMP`i}-dS!v- zdz1u;XP9JK|6w{qwp19t)V+4r(1gse<0 z-$h7WkhYLT=B)jucp$}9AI(b?A_kTFBa~g0fUr3DtIXq2_)U&0w(DR0Bobg9(2z>U zWsV@ufQ9M^dzO>9|Km41T0opC)_rWRd#(&RHG$8nG++N~fWD)KKXLd%8p#jLIFyAw z2f!5)s(a*8rVLu`m~QDz{RKHdK?D~?um=jl!k=~mbq~#XUI2s7&*hZ4Ko<-9sUg7Z z2q{~&G|&yd!q_SV0?6%Zl)}11P9ABh3{?Hj;D}G#AkCWZj$?R=x2g zHz$O&5!7$Bs#j?yWv4FA)bQ+G({=tY6t>H6(>*BGRb zks@pPlDOgfA!r*y5S_Rl;naa)6&pwdGY&u^{K@&)oPa_iP{6?b-WST00Fk|9W)&@n zfiWWPYXuNvFx8|3Ss|C;+C00+K_l^UTfe|kd)!q%O`8!;fG|Q<>SkJND4DN1++{V) z(Fv4bjY?ZcZE*Dv_q%ayphxltD&@osp~oi}`Q={%xk6I5+-h41No)zM{OP{h(C3`N3^Yzqf@dAAWZ z%s8|C1YxgzO;sz`wmT5`JOGD>7eIF{e<|>Ux^#`Ke6NYb=;id>M`^nG0DJOTJp_4Z z!}`XOAxS9m$IgQvz-G_B`ST1RaShG#x}wU2<+=9+F~Yaquy&X&nene|0V}$*4P>Q4 zLt;$^-f1kOEF5c=z-l3}1OM|Tr;VsWKTgezlwK}fXp%xPd_^=9?;q6&nt0p8DgGz5 z6~7+Fj&Ag-pzrKi4`)dPO)v5X-9S#){cDI+0B9kCbhdJH4={jS@rBB06i3D8g9Dgf zaxqy#TO`8Wi3`w+Vk!c!hD-&FN(rjM8U|*jP7U)NfW55)B2yP=uhb z0oC>Tayi3|g=K9UuwiVq{0Wo)oJB9#9FMK& z)e#j`c}OC2)MmNINF)mdSK*9&Mjmjr!1h@LBQ z5pOBH83$@JDwxrf$*#l`0}gil0O3?cHzDLV!gigYf#jYaFXz}NrSsa=GuH%Q$q1bD6`>>%3T_BJy58pBzxwE$g&DA|VjIwV1v(~>{RSu&)8>ViX(+^*9ou|}lL`C9P_GWL z__A*^33(q(pk?;WtqL>FzQN5sZ0S4fY>)^|;v$EhQAm0*7GAV^YLHv`&Sh-kd2`)q zt158I-T-6lMKovuJdgzp3|ItE8(~U%;lP~^x2TGi7>sR12 z-PDm4Q#M^dO#J{>e-b$lM0^h&u;d(?GOCK|;A;hXIH0FIajS&F?UnGYxGy9nEBp&+ zy4<}66%vz^am1NBym~+JN75~E=={?E;|in`w1!3|Jy=I7bREW%eAYFd*Io{&b%>%c zC~J@qi)&zr+Q(@Lz0v)k|LY>Aln@c)^7P^ak)>hv@3h_XUxq}>;^qJS?E@M;ny09S znTCn3j1c!g^syYvY(joS3<#JX6(xAD2JAh!!|p9$@wn;_fZfSOkp_cCACT9)@5+A* ziin_H#}9N1Aad<)Sk%d;>niY+#-vsMBNIS18h4LpHUnI_hb{H_b^#zOJ<7rpk{8?O)^ zfm}6pSrwRJuoKj!+Tfv&#wE9fd@D6?JKy9v=0SQZ${)JtltCFKR6vwdobH^4dY1P$`OpfamLu> zgXx>!Z8x9pzDhg3%J~yp?yPxMr1DgAa(URrVYKKt_08U!bm5bQ&6Yab#)qs^6*8|i z@5PtD{#3&bDs@kKGwFr+l>A^NLtO%H@s(t}>7UE1AUgqEbw+&S>ipPbK8PPr8MiEi zLV?$7V>`>07-p|JK4>|B8Qd5I>{eN=JjfaoLZF&Tbdf z=r|Pmu~_|Nc&{VYs`cZqz!UUoE{O^ZH-TNLz%rd?Z0*~9ZTq{idAvP37(q(vjAkQY z#85F8#A>(Waf9oO=2_Wntp9wH2u!7kURo0lWa_tQIzOd5t zF-=?eEKhF??<`A(FpDXH$2Ks~0@dgv*O<$pYb6AGxFct}9+it$8_9u1#_Ex3*c;|*ozOJ(UCbw$3? zw1Jzi3jNhejlc*`jWQk$-;EMW_Jizgm9n|y<>^xE7dKZi<#x+5B+n+aZZa&5@#&0hD*A?NO&>Q(Bwh3 zZ&7S#PDXKopu!AG-k_|r&ywP`X|29VcQrG<2%Pzfg{*}1M=ddzPMo^sSB~%R&ATJb z_!q*!A|YXLv}Cl}LxuxuGwM|a`ngn=N!(2~y#cc6r0Rid-ng$di2v?ed=q+my?04r zPi6!2lW?x1CV6D0^*OTB@9FBki-C&{_{$i!Jfr8(!mR-s&D2M@iz4TFdNA@~@=xSTI&8_iT?glk-HtqM!%y}X2f2}IoV=z{ z?5&lOVr!QphD#)$W*mGU#V3Umiom%|#1$Ch@^;&U@Q`8$iD4YfMJOanzuiyrB#c!| zljfeA(%LM1BgKZUuFelzMWLXQ^2RqdyL=Nt_u8)5f1t(k_+EBYOq_B_9(7@bO@6Sl zUGPWzyH?g~zhlp8a6SmFO(xvJE1+9j0s_KFbBb6(CwS^LpD=!l?5`MwO*Z(42d_!# z9A0Q;$~inhi??IUW+NJ{J?Bd><9iu2x)3TIlg0cH_1X8rtJaEbC^~sY-P+OE?FP%` zEfttOVNYhg)fybbF^8gWIo1{#dP0XM0v7bKgbgHLwl|9VTMM5q`FN92?`|)MV(V-I z>}cks+rt-sCOhpO!+r>_#r14^sTbWYu8RBL7TT>l3|$?% zflK_Z=gWPbNAy7y6=HECjGIMa`zq(Qt@~qFlUHZ2dVLo>ewjXHT+exa zV^llyLcDy%$K8^K(DSR9EKBvy&4kgWM#A3ct27!Lf@&bSd(DSb}l69mEni+Eb&Aa88-V@jP&>K zPX8LhV0V{GPUp8rsz|UWrQPO@r|3;woHNN)qpt&vWAPs=Cj2}_!CnRS;lB45sU~lr z2a4&Qar<-gJL=M2{Z{nkQY1jky=t3!LuZI0N)SV<$zzgEa8DxO&D9Qi#pwvXYYC*S z6LvVS*y4W+*Di}g!eDg3P~ACDc&2QlvuEh3`+R55%0txRaf*c9jeqjrYL_8LQTug^ zrtMv|SeDx?3nt)M?pF|WZDrrv-1F+%Vzp0*|6xPA2+g#eke#5G}YpIXcyG0b-=VdJ(msGnq1)DnWep4U6HGp2bi`81Rda zV1+fqD)kb?G0x?`JOA68-6hUqMT#sL4A9uCp8+a}aeBVmIj4~^zqQnk5bEnTvpyA~R;L7$scJ=wU z__{9|z$E)h$4b3-v7}JspFZW>IE+X$-PlO5A}f$G0r%&dvX^DN<-2go#82vyNis9= z@40x>|HG9n<7T__H^ynTlVDv>&Sc zHo3F7QiOkxx!l(b#ME&%aETPFkci;~UMDzz+rU7r;1>L?Cl(s_VNF8z9DTlp$$f51 z7Y)hv2>+_RtF`dDRbTlO{vD6f)<>%uV&B7u!D1ovwv*3~?agjnYmj?KoD#N9gN<)@ z`m`q@JGR&1BHMK);BTG?Svq9M$(fTXtdo9=0&mc1@pYxjr1j-~qdae6Mc6|thv(#0 zyI+`2JO&=%g4s{mA-#w@|NEIQ(7eV5ZZsZ*X0Knb)#nyH$#S%$vyhXf^Q*T$HW z{gI}47!jE}&v<#iyC~UE+-qMS=C=t!C*-wdv!TGU?bqUM+;6pqvj8O7yAEDwe-#u( z1%yzk+It$k6H|kl_?Q`YlTP&x1N?j;_Jx@Je;z6A=p6cfE~beXR7Ss}OmE_j6Ro!y z)Ve-5qw$c6(FvI4zXaHcyz6Y-CmX8e>Po?QK{EeB0a9N9s0Hj2_eSEhhHP9 z!_?l{9{^+f%0YnsNiaZ~)WYn92;qNbUNc$?bxh zPV-X(7C5li%Cqxh{M(tcx0Pghz9VVv72v;8_x%sK=W3 zRj}q5X9(It>tB9EIIW{{$GQ53&9G3HqZyxFt7FHh3ybJvVMtS%M*GX!noYH3xRYxUv^*x=S}C+iob zsbl^!CtW37z9)VF1~H3uC}B%lSQK?6AgMd*>+1{Mkm5c-J-?;u&Uz6%GC%LNm-+5^ zf*rEG{ zrA9BpaOah&p0CA7)0N-3Z*yJmJKg0(Ldvc;ofTfdq>Hs~V19QOCw7xk(LQAmsl&|+ z8x6!U372z5MPs!Uy*VG2U6@{$xDvTO>XqmOU%0}$+@eZx2N1%~U&Lo6nvzr2Z=yCn zE6R4!>84_0XD%-DtsWWY;6Hvubf}zW>U(>-@36VQN9C0{3DYOUcl+x39_nnil(<@< zt^TOBFJJRiOh0k)M8tl&1G|%+4D5=pa+t#G&-DD1Nmpc;+Q9_YPWiHbV~Q)Xq>9*7 z5pBlF3sQKv(B4Z{@sAa@=Yl9Qq?;lYqLKT}ml-CJ_(#e(X0xP~Y+t^3hRwP5u-;R@ zF%%&sAdAI|p|11jCD&eIhPwS#Z{bKeq`mLIpoe#y1H1&F01H=@$@`R{u1JZ7sGslZ z-MW66PSM8chMljgsd&vVVnNpLCL>LUJPNDgxFw}t7BX#hx7>behP!-#o8CL7dC+jB zY4LUaQNLap81fVLPE(`FYbz50Y^k8 zHA!L4hQp?(wc=Kk9L;K|oBOr#eV8bK@o!FVt=LuRQ{|O&!ra{b+GcijZaucm9M-Z2 zNICljRhy5I#gFIrBgIDE`<2IpB+mZzXa)HIk>F6;yV{B?oZ9`?g!U}1zI4vGaeuB} zo5H3C5?3PvB%DyPL*fjVuXXoxDJjwd!C-}D{5+SR1>fbtOv(5Wrev(ZAW^uyM}tpC;=}3W9ug!8ZLe{?B5ML?IxE#Jwgl~pqd5bK ztl%l{5*T#)u!10!Yf{x#?7(l%z{sr=tL4F1QtQ`RV;0Eh1Fb3JpbbF>7aD6A@8)oK zaR(Y-Q4Z5;J9gxCs6UO3ldg_#N!J{5?OU4czyHBmmEwEW83Z3ozhmJ1VlxcQ#fmkT zOke7N;VPfB$53Yqc7G6z#bg-=b3ne!lL>93;$8%af`|Q;WX)XtjWw=!$yyWar!Jkr_HJgmqDa8IGt<(mHnUQ>Lmrk?H?_B$qrh zj7^(;_Jovmnch2L}-Kx9JwU*eTm1tU%xTG^-_|AAiclsa>_bwx_w}|`(;v#9l%R^ z>*d$Y_XH-bpOyLWhbj-9Z3a+-Os2l#*J17>@y2bppLCN6nPXbWV8x{3N4CVE5Xfg= zNObh{gYe#93FWiE8WI@7zXBB3BYkoFlT!!x6T@}UnZEThRN?7!e2g}HuoL2bkn$4h zNS~%6b(oJTUx?6@el)SI>|z*PS1>#6^Pu;}?4Z4Ra?3rF-eDebhTLFw(y z_-TTS^|IbvxL2~ROj?d!1k~H^Zvx9?{3z%VhpfB!C9#5CVK3?;7?+4&xH+3P!apWy)`ML_&L zThCt^B&cM|3yiFOJ)sm~3NuG>@UhNNPzsIv6y*C(BqPd9?j@F@CX%0x4m@AAxa&y; zft1qFBF`SkIE)Rq4J#{7o)(s^MJdl3QLid`3e8u(6BsPJpIvGxpzb?+82r&B1{f9$ zgVEgE><_q6a|VjGFJ0x-8C@@KkKJwwAIuv>pFa8BzgXXB!L+gYxk&y2t0CiUZtd=}ti-$R*Q%wR68kHOSb!DD-H-vEt{QE4}kznnm5Jqj~=b~DK{Dtxq zFDM0%oIBjst`e5=Z<`x^gTFyi@iB}wi04MHTjSKJDsg4?1?eZRSPR(9p0tyBd}A^2 z<BqxWhYZlsePc_3W&dm~P_cfdz^^>ypn{TtG)L>4y6G`BjK9yd((qn={I>L?q zVDiY<|4z0>@z~i73lTfKT3;!$Gb5W&k&E~jJU>FwF5nr72T>DprogJHA2S`Q$y?N* z&ta71UEhmUXRU2pYFp-kYQiB%dlcr^;1R%3EurBPl1y(8%)u*4A_@QuI$G>ocRM`H z^XF@rTfQPCb@cQ|&S;QVC2)_z0b*O{i^yI()uWS&kQ0&FjsTGAfauWsp|g z@SM!!;XR2F>seVkaV>bac4}gQ^86@=APb-mUYDtKuG}O2)^}x zaz9w}FNv=NOQ5;Zc%{dM(oW`&+Wc(!dGEn4tZY(y`}|#>mZnnN_syRUX|umpsxaZ= zn&z$&5I+2H_@LvE`G>IYVcxn zDV1d-Fjfb^N+LYU$L;IgKPZ;y=fI>7ZhmEG)ZHBXwwpKv9-(ZhcEDV_S1(TD=^qzF zNCU==5o_+(Y1Ey=>b8c!feW?T4_DV9=(7BcjmdJ}S&2Mt_r@rGHwTAMU1btmm5IwJ z^2t5|?g7}f)f%PO>?SqYv#HveuXO~xlh#v1UN(zgHMdi_XTNmq?v!lGxJ6ZPUy~gl zE{;1pJ--^RXlc+^J}33n?;}4>)4JoJ(qa#cc}Y80j5%o1jn!{&)nCKl3Q^}vM)uH< z%|-??YxmKhzae{D&SKbQ1ZEWit^y9{ju|%!kXA}>8tvuDWx1c{sh^PYh?G3rLd%9l z-qS;nQu#H5zj^WZ&<{&;fVL!?XG3Ein6xaNY1d*K-+Wd0^ukGi4R<9<%#OkOar)np zREg?E&654N%d-nYsURkQ2&2_z^GaS1xMq5K1`GxlSQ`j7_)ipG&BzSdQL;pjJkOKZ zQoKxzA@yzC)LtQ362AxYwO`k!+n6}UwCm+=VjoiTN_u6Z6LhLfRIpbm@@tKib0flC z1=uwD@U!Agk=bKD(b*skA6JVK{#>EH2y?Q{ZEvUa+V;}9XK~OMg4g~y6Z~~$PZ0C( z@}dBCg)^IIz6o`px3}#2CH5A(zf>B;Sq%Beb|wb9PK~!4R%zzn2uUd_x0D|A(9zYp z1TPj=IUT0v5Bsgl>dChh8rpEY^{dv4u)+!#M#(tHwVH~MyeZO zv2`B0JVqY|R3Q!=iPdwfs6I|-D7D8)(=%wU1w%m8-`G9yQwZmq)!u`vU!Omq_YvlJ zu#4u8|35Lo^n8}q?u^=4Zfy^ej9n);Wgi|_j3#APNY?j0f@cPg6MC&#MA^NVKM$OwSHe4v&lI;BisoGj{ zr@MNOZeC5@0v8YKnvybR!gfYgyvV5^M@f5cLBL9Cfrp?u4K0hF9dRV_&={ddFg$EHlvdeU6JJ;s%Ut)`@=02+k-C;n8F<%MP!Me&4u#JYSxA~z;tCLhdIsicwJp}#EXG5l7WsE}v@sANtv2 zRFaVJMx>%W29fIN4`Dh4GR#FX;&k{4d~V@gEeX4boU#u(~v+5!MI`SYWAxx`6J31gw2 zkQu|NzNf@xjyUl1s>)J_3hf_z1#oXi7PGaUvhX+dxU|N2^o~aYx(Gd?S%~ezID2vW zNYHiCHn7tuP@ebavNi-!f}aUSHla+`mTiZ0XbR(d#y)CZFbY)xU=? z!t7Q0#PH*C^V!zSzP}oV(X?jv0$wPlFBMe)%pW9dytdbQ!Qg-->)SnRX-{|7r7Ce% z!;+f}%8Oz68^S$gZ6c2Gf#Xl@%XR}ac>XK9nSjF7rU|q?MeFTTywpMYGWv$aByX%4Z7 z6EnIho^{*Urx^f9v&r=kz$W;2s;ZvvwgBQmY@aG;a?UJj<~D$?Rilon(Xa^A-9CMU zEU91z02MRx1p%BQvD#qeI2m3~wfQ*x_i;jt7FY*0USBOz7qrriRbo@z!LS-^sSjFkVq-J*F@5Q>co9j zmmS&7%3|CXQHS{nts#It7h|criY%aLGx{8JtULIRkAVOo1MP{FGRgrgR(k zKk3CyvlmNP_m82hs1f}%a>Ouu?9(D+_W81&k+rA6fjW2hi>2o5^WV}GYtpY@IMHe- zO{M;nlA3+yV09(thaM*7O!F~`(r;``gFll&A*-Z>wLpRn*&nuimm}!>8^_aYIL)WY z<9GwIXneZjPSE=2LUGK7@ANgZyv9ZX^W&yXk+iSI!OCVGpSuT0sk4=?Z*j2K+{7T| zH*agc?{qEDn=#`ne_ev#@AWo|vDIBkje4Tx(=T+l|9jxPtD;r>R1yhi`yn+PIY4II z7!YYS_XYt23+flM`mHFz3%&SwJp2j#YkiQ5p_cBVciFFyQl(Im?W%F1Diai(?4!iB zmZn=fhu&gr9-}zEchWM8*yXa446k8y%^-`B4wSubxkCynpqectFfE}h_IXdQJz0>Yb z($${`fdgv?0jAJUxo)wPDLLXq9+l6!2^8p-%` z0-w=kJK#hAC;_xQ8RAq=t1+8`mwywP`d@JgMeZF)j@dZbd@&+;{VIYv7E^OqE}v;f z=2aw@94`ylpdzC!OA5{RwMKoW+q~%w9QPT}!ty5pc06obDF8V;C=ws6&pkzgA^3qk z_g$K=^{Q>G_l5`4aIrzo($RbOcd@i|3aV=Ky>lt(i?+_P^KS z&Mf`f;3;H{X7i{nw5QvMwtwA&9j&Xz#e2EsCmvcjoa2EuCa^QBiTQqqwsGOrBS|)l z3WATFMyAostbqTcXV2w;6@H25l9YO#*{&6NO0OwGfT6WsRGYvp$Gd`-?fY>R>Kk@8 zFsd-Bi6nP(n3O(Wu`+o|@+gZ0pi=6i6Up&Se>&A1fz@_mGP^cA)jR3t>yTRF1F88( zLT5T|gNvaBB6sksHX=C^KxYRwBJ*TbHx&j56v!m?DE z@1PYxnlN2%+y?*s;h)chs$~Kj9@t&XD&U2q=XDB;Vg6F8&B)WNvJ&|c~4l+jI>u^VEfQPY-x zH^Ih|lcbagF!%grj3@gAjS%n5T-68n0G0O*Tf#bd$PGD@Ec?ef@{e zh49}UT!@HP9jY>tS2{QP_^{gYzUkNU%EvLO*K9TSP9LJdnIExNYd@1bN}t)iwe4CL z43Hw;slQ_*pucN}s&axRh2KY?5Dw0v1+A%NUtiN?{{V@>&+%GVZA*0$c>B8MXKS+; z524KSb6p~Jj$x~5J_F>mLNFoz_lLu2D!|hTJC%K*$xrOixlHH&Oy4^~x&xx=_urEK z?L*YKrdguR_b^Y_ZQ_g-M1NhS%awpwAkLELtm{vMJsFROW`XuvedIyB` zMyzgPBwiv09qqm^$t+j;yd_wZ<+F3p5*69-B~vy=^7OU(;PG7Tr7{KyuJQv$#Q6Cs zu29b(H4IOM_M!q2PoZI!`M8>vX;I6L)yxlGtrJj2&Y#Berxua*Ws8pL7(0^h-j?Ui zqrzBIk4bY$Wu9(Teru8+*8$(A&NzCR^eSFEoNSsLE!?rAHYj2a4UHbsnxpNn^{}BX zwOFwB!qtl7<2I7wrAY)m08+1u+O@EJLaWy(zyiMpzYjNjn8mcJ{H<&xI(RnU8!d!6 z><=pL0C^Gd%<^&CN|V%@;|~a}ia_4qrIvgB4?D&fhI4ll-yE6(_j+cRAMWVam&V*U za0@c8Um#qO{0e_e20a}Y)!KW+Wh6DrT@h$3sW#u_s=vm7SOb!OYoH;l|NiWTCj^b{ zt2Vt_4?hnD4mvQR4sO+1wQ&K`%UF%W^>{DCFwvu><5g=vp2di-<@-o); z3tWbGj+G>r)Ka%o<~QHzZ>bDxk4eCX_HtW%-QZ<@1=jP*tU{_M3_-z7T+fDG>V1EQN z-{b!DT3LKmzU&&aLF@|izg^K{suazNeO!IG@RJyA_Y zYFuv3EEUIEQ7)_&#}I3Q&=0vDJLZ)hl5(`IteODF}6|P@#c{A!Q|%2 z$ETTqSb-XR%1UT{S%tkPN-OM)>{0xRi6y6&D;OXn^-@KhfSJ-pGk~MWAn18X*t48e z=d0@NO#H9x-OM+*%nwUkaZG6&482w-Z3b#P3)iY1<0`ZLcW}S_4%bQ4PIA^&3Rx3d zwxA>!kBeC+0rk+lg_Z@O4B$N90$!J|JP3-L_v)nlTa`_a#sr*a7qiVe(HyI~xihC) z?zgN%jX{$dj#4~aW%_Qad%U%u&qw~*>+3Jap_M-VJs*E0{;<@QN)jySCNu&^xOC8{ zz4z(2WMEk6|5d=zk4wM29Z!m}Jyv*@igm^#$IEx$GxUSjK1-Lz*EfYV(9nl*Ba=+H zqu!@c|NN%nxcR7yp|+=0Ke#bt)&;S=glXt5R<)}}{Snbd8lC9#kM8Ra3O38C^^#Ij z;||ujhhKWL1y({mtVlTfE!@h#sb6^&Jnh1dgLB)cI0eHZ^fm1a92s_GSiy?oM}kyM zD(*3UGPQBu7s}_MyG#&@n4V+~i-YjQeTePCYOt6mtIuGN8g~%KWr~~NahiM`i<&#aWI-c0JzH@n&6rAXn1}kUIJ1^uEkE| zy@a+>0dDiS@eRT_6UD)Y5y!QnI)_0(qNehafY}EDEKwocI`;YYOx)4je>2K|g+Di; zBtje>Uy$l>CEave9G&Me|@(j|P7m9rK{`zx|JSqds3j z9*%hGGJ_TlyJg+)XCIOB(k2u9JLIVvW@!O21ZJ|bzetvj)80p$Yk(m4rnx}F)~>%K zXu!xU6aJng*1U~O`$hk540&hck_sc`kYs4~PhfEFc}D$QVMoPkz>sv}G(JrRDo+l4 zZQc;Yjdx+nE=t+tWpsTds8Cf6S<|4%@N{e)N$Y3`8;Dkdh#7FNL1$tcOUaOzq+XAf!hfW1?bmbo7< z0vr@&q^!ftJo@WTq@|>}>?47(8#tG~w0=WxMJ+c1nPw@9amWnL#>yx<)l<>gOEwSz|f6U-7v&5Z)7g_26 zhX?8WDFw4kfffCkyTts?^QH!q@~4{-ZL)W@?p4wtAm5WVLL00&1q@A&Y?;w!I~!8W zzcD+IDrl=6pD&i!z5{MZ^G12s~S;!L);bUgfjifnVk!hnS zW&8Wn(*CF$B(3p`l6{yt=@s)?#1UHfqei8I=BZ)(lz08D{w*@2i`tuVo0&ojK+ow+ zrNJ3LVoH|Z0wlyT*RAn0rxw`fY^hZhS zaF;}a^DqCO!1MK^T}@`rnONJ{b&{nMXKIdKQf9KccAg#8`~?F$R$1uNXuBltCrbwd zzG5~8mb%6~*wUdhb^d_@Bg-SEw_A&8urUSLKF{c-6d0<<_o&osJ7_mT1 zCYoaWL81}v*cVLpR647>$i`mJe_;SDQZdU434xo`@wsY6lRx5ldJV$>rgUQxde&yC zjq;a;NcQ<5GZy5f`uzQ@7g?~JUdLP2`|AX)Z#Ew9=$Kc$%Y>VM{1xeuXxgvZAcpg3 z%|=xuyOixS56FGg_lwl$D`uP-t(kRD0}4&rm~B}5$<+U(=Gkxpr#$*@(9Pks(*RTK zke}6-0H--G9T4BNe7&{%x<5h{g!gt;VDweY@OceHoB@r)+4)#Wz_D}w@7TScOsZTE zlKABcv3<;Gd8wAT@XR85T@bN$@!9$x3~;J?CSjjU|AsK5Kf|e_?6R($nUYtY<+aoV3aI3WhpPHIdt70-ca0 zCyzO=$>N0bJtCrM%Z$cxop+4ckLVgZC3U>GCvSA!5Z2D{-|?$h(EE7rG&F90QC;F+ z6tfVifBBC5)R~%AQNHdGZ0Z|PTQLupj#S*Gq!LaQM=LHv&jdpv;1%r}=W*eIKng+l z5)B`zS!3&H7Q`Rrz%WS2ZscC0$00BhD{G|9sOKS-miKX$$r(6a{F#pDWt40y(5`$Z zHfa5U`saLtkIWTT7Rfv8s7G){Nc?4{vy~n6wdBI`$J0WipKx=9e<{`bkAbHOuad)F z+U{dDIxtQQOOF1&@Afa|psp2pS(iIb=5(zaSHjJeJfA_qCl?WkCQsyq81uUhYa1z= z-(sW0n<7_nzClw7Pfi4b53BO*(RYN?tCWa`j5$~Kwe$)+L=n6Ek&^Yqs$#0jq@8hM zefaH&d5^AeBft(#udc32MIK1M?|z*vpEm6IK~iu2>c`vam2wv<1ZwF2?AN-x;R1GqDN#ILr3qB<>VdF-WlP5*5-51{mQ zQd(gbK@*1c0AI^s4~OO-WA6~$1J59%d|mWqs9kg(d>g!nPlDZP=tWMmm*NND8AlR^eqK6SsXf|U0d^VhD;hS~i={_VVrbkYj{fOx- z5Gg_vwY+G#&5}Z@li-d1dB+@YOxk6K8m-a~`sBEaop8hBnS0WcGqcVN2y_&Rh~>OF zzfp0CH=mN%tY0|Xk=B}KIo)>&4X0a*{T-64a?Zj-n9Wj=+zx(V%)Fvaqjy2Q_v0$= z*ZO%*oI@@nQbuwpD%Sa!jgn()ObG_779AW?9HC`cchtZl!vadB~>N+(6aE@qN zR>{`WDHX3N@3?1l!qA?9C;JBRD@)3Zp;aDS3va^)a9*y?R`+dg*uX4bge@K>(9_Z; zJA`LbK7N#Jgonw}>x}yC{&1~n-xVo4WA9;kfyu-vE7UE+q}8zH!6_?+pFJh~$Vv|r zC;IaLW9u!Tq71(G@ufpjKtQ@vN<_LtIs^lxTckT*BqW4IkPxK1k?v5Wr8`AJy1W0g ze!lfP=g(R8DB{k{og2@6?wxlY%e^qGx>U<(|Bcq)ziq8`BG+U^E(m}}!W0nOs z#e~j%jbj-pQfN);ovGu6*Z8dXnd}VxsD626)qGFIBo5O7h}t*27?Ru=y%k$=E_z)O z$Qn1ks(Rjb?Kg?JD&haxRPq5`{nSs_ZZZxf zq3S&ZDj$w`Vb$IK_eTd$)JS{>2ipFrqzEIFXvsH#>cww*APkdE=*`<|70B>}yl4Fyf4ee@|qE??NXo&yfsJ4cDW0 zA7t#!7p;1Iy;gBSl2^x|L4RGUEIY#n07Kd7TPpXGE3!a&{tr$HSi5grvrefPA@W{w z2^0nXg?dg}Bx~)|LYD!hqE$M=VOc~umayLgubJfQy#!iyOGP1OvZ%#JXISS=>VVi^igAbxSFu$II*u-JRJV54^T^6>{Q5XA)o;G_RNLSu za0d^4-*%j^_Hj&z8XU;e;eUI=pxF@n1?M7`yTrG}dpc$4;2a*BO9+n3goeUixiY`e zsv`rPx4pcYLLX|yb_6MQE!&(_K!&j?7DjYisS!ISq4q*g2}DmAq`CN#l|D%~u;g`8 z*E=9$z^=-mbRqHq|C~e?X=p6!=@oqWorlq{P+eE%cWkdBbhkLs;komcFXmu@`Q<-e z0aVr>Oh^Cl>-}(~-O#@WhHu;-2g+whE872*p{cX^74D0**Ha3MeHQVZVdOGZlenA3 zH)%EusZCY&cDQ8mkRU=3?!pQV0SAvW<1He|3 zg~I*fH$f{Oz_v03sOXWQxz?$Ci%S8)uXdB4T5zzEV+*5*2~I(jzzKg@Lki`PLlhRqYc~2?$0~ah|lM-#7g2BZ9EWf2oyh zJKz{5)}Cheih4~eM-fZj)2lRV-u*^l?>PgWd}ROn+sNw>1bY?{$|qf&L;Nxp;*^QY zG5b{x8owQXlQ#`RIQqtC`8r`%Q=&Aui;vtXKnnQhW2D&R8pU>9aX$G+swYGDIQx|o zS08iO`>WYhm)9ZZuym&rYAW?gl7(7H^cbIQM)6q5F7Ho|(|qq0ikxx(WXAfgNS^;x z^ued}W9vJy$?V6A5;gNEl?&aA5FmyAY5MTR=PX*I;3B+}nnTU5@+ZotBQsudLH+<9 zZv5uRYI zX%Lrt0L9#w@lL;oD1yQz@#zoNBchA}fD{n*mqB3}+7t>i63w)3RdVJnWi|K!G{1#_ zZF#=>)ReX6?VTD!+Ck+He8R|d7c|)G*;iQu{#UiT7DJ(2l3^tJ|h^}!*2VV4IdAp<@Cr!>3bnE1ni}MC>NZAnLzTSJ)<^4c!26;`O}r4 z7lQ%%BblD?05Guyr!=z46Q%lkf&@|n)P(PyZG@UHtiHu9_b!>U3J5=mjOuYr#ya`4 z*yh-@YA5496)9*jLSGty)Ds1$hU@AwlAT+wAbw_-DHn@(oUel7N`=43q8R$bLL{8% zM7OPvtdG&~yE5t+fVWQhDinC1xa>4&Xue1yK*+P$=b1|eSLxf%oxU>VH5;xKJnq;p zzZMB`A)90@7~PJ}MlThU$71*(h*z^S00=0c-?!uU1dh&$({$qNG16^d=vnz}{)DW^jtUb3ikmKAyXpC7-(EF?y}NWsFbaT#bdMDN0wXh!)V?=!XnmkaD*dq(6F3Zm&^F1$z0MpHP zDNFglW=gDEyywo(b`SGKeGe1UyKm+MuK87Q>D?=4i@AsCxO{4t-VV&7>DE4RIjG81 z&WS-XvO)zco8Mr$QSu%{_sux;nAhFuzIPEhK;O6W@pV4%|LK3s_}b- z4u1wOREDghvYt-qd{?Bt)L15(;o0{A2^3aj9X*!!~p%PQa3!(TN`)6l*`3%?dsD_TPFcW%pPOJV+a^dPuo{m}Xe z3~Uz?R}yd9u~BdzbN)UVmsk74yyCm@w;$sDad6P+*Q5p8eFmdu!z3r2P@gM(oCS)S zaeqx(tgLjatE<27xG_jb&~PQ(!wWH$eqc^t&MI)dF5u!Z@OJh)t8}reqg1HXhj1wE z7+Ks_$FCUuF+gOzu~XO}=qMhpl2ZSO!nNIdxQYi; zSo>ADra7Bb#(P^9*2iR#^2cXqS*@)!u=LT5MHgXi!QuAor_hpj!d~Y|>yU@Mul9!# zng9)})z8xWqwq>lj!~q7?dP~c?b&#lif+Gi^$wKQ=&DX#vkz9quvg!~e!Sy)F^ZGe z8gPH*^9Bsf{1$n7Jg%}>8X4#6I-Zu)C_U5FuZwEtI z^s-VgVx&x3$+pEijJpSPG9QXrHPXRxwr-7d*1)@-FHL3dDkHeG^^`U3ELNF&MNv>t zJeDJ$YT1#>5ppHi%!N_cieKT1&R$~J2BJw8J4*8$K-aXHwf{vK!8b`p7g z^VN#|n@QLC|Mf|Rvhfbx-pD(DsQa&8xyt`4e~{4@i}8N6!om@hSNCBJ(l?*XAlrM< zUQ!550+_M)-LHrUnL(NH1N=hY3){POtBUMfcs&-lH6@aaM8nT~@{DoTdAoFjOe#MsVq^iHNDbp^h{{by zjp3waPCL}X^3kt%jncBQ*KHa@86$5ZKp@Xl!kH(0+CXpTq9BI(6Ka2bGX;Q6hdhRo zD&QmPjYbbb-u1@p#pfRDp7m6SX1Xf-`H4Sxq>HLatPsInPO=DSjCS9vTh%R6Ue>%D zg5K%UP}a#F-;AmlVK=Up7@&X8i!<^csvDd|oevGRqAE_@`soay(|$yjWzj=@Zl}pe z?$r2nCmSBc*^mq&)b&Z7lkESfE7!gea$A@NscsVsZI0%Q0ZVB2)4v&0+p?+Od&3_3 zp#tz=U+$v+Z9~NPA7Z899alZOyG=>^oN7J(RUP%^~EP3Pc;LEs=rM$dctN}>n)b~QwrFi`FA z0tG1r-%t*xnMuue4(W7d$e=yN&_`DG^H2JR#=H+Tofa%@wZm|ky`LcgDV&?o$(mvD zGT|wPF_dpt5xf8v=^4jat1cUhW}-x?DU{3X0}BlM>7yV4O zq=8rTy=fDPU=>fIij|d>q_Odz^MwQ_%9nR5&Vn8_I#+6LC@v)L+!bOuR#G9_*o9Aj z4=T5VJvQw9x*u@LlCO*o`cky|oI#@t>JCY?ziOli>fXps%N!`sr5)4t)3>r#lPtQ6 zv_`!?l}3-YN<#SE1JcLz^h!#^a_Gh}v5DB47VNU_V}b3rYQV`@@6g1Vu19(eQ&4St zgChYB4@nwVgi1lTogZ`yIP>vr-B7}wMt^=hLV{gwc(E*`2Eb{j@L<{7Mw4( z$>zaBONXbY3vR!Xh%iU7Joq`>#^&_|{Pic> zmrEw04-RjnU%_c1;?D$d1;TJSg7_>VryJ1m#;%O@clNKDZS{S6&;&vq!^ot%7}{a7 zeAnV;fE?0q5eQz>$zO^e0#CMCRK|R#W>%hFUQVc%=lp|u>t5GgK+51;%7nN{BvC-( z8ff|DU}BaL-&HF@>yvm_hX%DSd7($Kq6C|2zPp@&XCgawLA_VXeLyNrsHq~<-{M35LUDYafZin zK%oO@a_;Mw%ddz}ANtfqicLsJs9N`mGnd)n+(-PxUNNTA7erOWcE7C#2KgTx!`XRdO?f>`Ga{mb@#uSh z1?N}Ar;n`%wfSg+-AsZVc)TfT;??#wrN1xu;pHNk614J+3|PIai)w!Cj^M+JWQ5>Oxm*tM_SQwqm7<^jUKbk}fvd z3~`Qmf&VMK3hj6XyDlm;$3Gr#qNpF>Fa05mqNYZpku6%KmE+K5rHw&G&cO_xkhcDs zU8R_ioyb%6zioz$hGyJN_f{q$*Ya2^mD?_)6 zR7$eHJ#E>qE7)b`4*Us!*r|3;Q+akJxRWclwq6VLm!-;qADb8!%Ow=INa>yKtV36w z@f&1)_l;1wKE#`fRBYiZmbXMn9XE(x_ITS5d0TL1ern^9?t;&03c}Dn8Y%2yy5Xo} ziRAbe2s~lYt>X54Re%e&)Y5g;zI7qbRz>I8i^Mb$CZ1nH(b?OV zExy)^MS0MxG@;e|;TRD-(PkBP09?-VM2J8+&^< zca~u9k?EW(Y5!rHc%@Fr@B#*F6Y*a7++!v~kwPVCQvPLTcGlTolq^eXB7A;(~qLZYj?wlSEJ<1pQrazGSCAR(LOfNE1!`;Z&Cyge2!KfeT0;uY<9AMZF zzQY#?x5*MIg~HA6zg6xUj}LRdR_Pdvw|?1}LK!=2WJc_Ap}mclKSi>BzJXQPz5254 zu;MceCRz4wcK5+zsCUvM_w3#H87uJsmW`>`Ni9bzJ~TuiqWxPmbZCQrza^{KB6yxvCcI2m-7 zR~kn>%hm5uQL<*qiv0{}&h)U_f+bB`=a_Tsn8iB2t2gU0tzQ*LkoQviBR)6_(|1&Uv#Ylmo%3sp5!W@Z9{9FZ=b-xT8OJ*hDGA$UR(kc*< zrVg^g23SLhCjA5Vm+daAL4!pY^cvW=i>@X9w?7AoS`^C_5-WQnsqW~&kb%0j2hcCNeIk>p} zAq#~m@Q}s!$r%}aOMdEHF7C8+bv#N+?XyNQQ|xK+ zz4AQxNpw8@oGZt_jn!opYpsxzN1o>HCQ@lOv4xvJxo=@%gg1$)d;Q7Eg%e!g5aAYt;A$XRD z=z^&~)b8j6h3_0)cx|^y`I~w?n z)qE9jYr1u~z}H^l&J1m1eNnq5=ez&j{=|Atcd`{6K_mP`f)^T<^l8+WH9iJ71#>3| z_h9g7U{cl6Pq)*7230;>gY_r(J2)$)e}EkHEz2EM1WX89&(c53*+t0`v5%`Hi~C;9 z^T?Fo@+MS4dH+|1`W!Fx%M!jC?9F~asx4MDHRD|PfQ)`*UpG${Jrm&1%T zK^1XQ_yZ&644`Uen9}?*vQd?kl*Dg0Cm4e-gqT zE!A%vo0`g(`}jZ;2bgun03o{qI`E9I43O}mx<;AWhRK&48WSDGbe~YZ9jQO_Q@b*G z0f3j_byfd9HrxZ6!9#B43knsLJsjZ_eulb%Z98Aw60SyLoX=-z# z9G{%zh<=t|U;jETE{+%t=1*AI+}zv+Q(*pl^>lg8&Rw8Q^Ua%NTqlA>R#BqPpz6yQ zijxIHgFFb~E7I(#m3jpT6HTREc46qD&8>SGczv%Lu721PY{Ia=^wqiCEOEGAt`MCJ zW3-O0?OVJ6?qute_DZx4Rm{OqLCK;JeEVj{>9iwO-2z;zn)IA|l+>myw$GszS>uZb z32wU4aCw%y%Qma1_v!X9M_CiSBKxC9;{j;*AXaP`to@BT65NVE=_Ll70fjPU{;71v zrzQh#GzHQ@e!B^#){Ag0w+4HP2cBk;-0|fedf4mg^$~{A*)%D4<~O6sk6CG9iX*ok zMdHn;4{kiyI-4dOBh2E^%-E4d|B|xiJ!12=*H)VLEO`$6`kn9Z){U`)C&VOVXzNqa zkVwl56c~)rHNtoU+;Exsj1gR}L640BYvcL!jIjYtkUshu*x-b|I9xk|MM*9-D#I)h z?(;(Ns=u?oHnY@W*sj4*jkh( z3bnQz{Tz&~ao#$&pzN8ZNf=G~RDccjJZyLV72x?s$-)dMugON!q%Ib zqiO7WoZ$SA{5T&ydNfm4zV(#1u&C&X`|g`?FjHD3=Fej2f`{Z8Ca+(Bc#t-z@O_xu z?_wnFIM`KU{py4GONF|2Q%zY~1^7;Psr_e@0&#oqajdnC_)17ZnGlI`{G)g6Mi#!G z0&Ymsq2aH+cvqEYor7nQ3P+|fqr{(mzlrVP)6B;!Kjo~~O?z|hM=surDo-NpwsKG# zeIGzI1{u+m)7|+Z^2ZkYCHgQJx+Htt=KZ;K9OvxOdZ?&>)rpM^$L$^>>&Av7xn3Of zRRhFUEADC!{T5I$GuyL@d*T@pk??v$(ol$8@3d4#%lmgbwANod-f!vqfgX8%ys0qJ z>pD+z#Q!5gesMgD-sa zj|wfc^k9O>QOPhEah-=~>EFM9?eaw6Ss>?EO%qRn=#gNbvRs5yaP7c-gKQ5Y*+CSG zQ(A3eM#95UnB;EJYMf0vDN2|;IY{`qi|MZNupL8Gl18u~Vml=yTl=?y)1xGZCcnc4 z3NswTc+~w<=>`AYhW)L}Rb^=8CCyFr%xF*YB%i#No|c=Q7V~;^!Eqnzh4gT!FQ?LM z#aS1W9f(zs=4IMyc}agWS#LN*W*CZ$(x$f`P7d=&o*Wt)+VXs!s}kMU@st$_wyr9i zGT`=GumVLv9K`(!pr7I4;g}9aQ`5?gG)I12xuBI@c65+%OxL7_&^ z;B8qHyK$9g<;;<{NlNOgXZLZ^19tiMa2ZOl>B;uItW|)DLuw^HpLwZqGFe(GVb__( zVVH+wc|?%)L~Q#yPM3uFQN-}I)M@?Jy>v{GsEofvZqp>_L)ZA0Ih-#;0=EO#py_uy zbL!PZWJXADxahjNy7rpE7aH6rieD%37$bKe!z8tsKW{h&De)y>O9@V<-SV)(1iccZId&BZXI?JYfA?4+|eHQ>gjPMNdef6O!jB!qk@9iR7@Z&_ zJCy`HL@dNc55z`Au4?bfHxa23zw6qwIpNrHzS1wi>v^bb`Eao$*-FdJS5IwcSN*F) z({A(nEVkGAJo1o4Ok%9x_1w+n_t91@(UkSp;Q4r!V8h(8LCAUK&*3?da*s8a-v;Gavv7CZD3h{CTIr z(F_CbgF>m`wz$6iL&_f|_y=FSoy3_J0zutfpFH(lSePb?OQ|pq4kRWL{Piy>>am{v z2Unnfc*PzKWnID`L18l4E0L>2Ncp$VHB@D>MRZf?FcV+N!raKl_0m(4{h-H#6I;BS zvI~U#3jCir9=V2-soGj46oc2X@v8dIGLX{oJruAczh{~%?5$7nUhd2{zWn;s-cKQc zO2n;LP4qxE934hh&X=fCv(*`m1V256PMaon*xEo+gyjGWx!DfJI2l*C6RC~-h{zK9 z>dt+ok({$tp34e<(pz*`bzED&TJuTmVuGRUZhS~M&Iy6?Z86+V?v{`eitneXl&d=t z9g=lpP_e|sjK+K-Qv5qcS2#Jpe!AhDS2C9Oz<@JKZi;|a+hx0(3K9Y^7Sa%L-}UKA z5cAkir;iQ=*2GE)GkR5Nt2b<=UH+2ds?NqQ}6ry^4`bNp_7kg*`HwO9o9tf zNz<2i&m_G6xHqi!KzDi1*cYIWU5_i4d4;@9Dgvkz@0am+vX~xB8?}lq{M2&NC33=J zV)8a>xp%RUsC=CASfZd%gB%URpYk9d<3Euh)g=MzzaLEC0w^h6UEM0jU5es$u-&A^U=u?Mpw5&X_FXmLp3@ioUq(=Dc`lQw6{R_F?RQ|qgA>&o^Qsn9gZaC zmz~(C-!c4(uEE&$vWQ4Y*Gqs5@*>JI)?tjp#tA#f@9vGJx#w8|js`%GGm!vT&?Cpz)=W<6~%iLYMc1 zE@vC587d?yv{-+Bk9!!cGQOKHXa(sS<@^6l_9G0!WTk;K6S5WYJTyau40>ePWy-Q( zI0BT)TZRJt=mQvj=I_x3aL3Xa1W0&Bp-qkswOj@_<~w$?3A4!5ABQ=~nxle2(6|&} zi=GWhqf?hG;<_zWqlVl$J5YIwx5Kt4)l*vyTRjdkZmEVxh!_&n6|lX`0_+m~_1K5( zsDTe>NsS>=RXjNM4-sOt-iZBtT=1N0I4102*jiF`h+eQ2Q@ zN&osQ_f~ZvZv71vVb*INY#N#)%4V$xtiv}63&qnUpV^rGjf)La}xtFztt>1E{vE^~1<7%lgKM^oQj$8P~K*xvBW(Bgp`S2 za#3^JPy@7&8|i(Z#g9At<^YMF?kLvSqXF zQ?$s|mRFi_(yEEAST*D0lR2K>Dbz?5cN+=5T=QHjnxa_2!-WL~y=+Fz-QPXiIp{wr z9)LQ3sTMJf(F3OeK_!KUOxd=x4ApKGk7grE2mY%XJ6H;LlVPg3KjwX zw+OUKwMqO1=ac~I-7A=Usrhr#x6@<6GgWJQmwT3bqk+&}-{NmfJuSXb!gGyHnuPQo zBzlPIJ)xcxWzUqF!mD;S;nKmH)u|XqO14qQR3V>+l#1VO5xp8g!f)C0HcVOc^ZVWo z{Dt3x$@shXBBl+~ud1zeN96O1-DXaA^5wHTyA!?)#MnK{2O19P{`C?6kZCp1+Qw%a z`-%4+HffVQG26|W8yeCRymEZv^3Y@BbElD-WHC)4TY$&*8=Eh8E7Ug*mlK|Az_L28 zH(y`&0K~2L+!5UAMAUE>*QNdP?y1m2ywNHuwvBv-=!2-XE35n927tE*cl@5z$}L%&*VJ~ipY>^@inOrZ!=Zq0qwF{(nWm)O`)hVNb%4mk z-pWs-Dq$OGvmc@!zh92uLg{)m+4AZm_0*x|{M}}jm+|0lwgK7#%=k@Tus?ELT;qy> z0i=cTsO)2tNb+Y-o|UKSzU+ z;R>Tr{wMII;ZbrWa8S$$^0oarx?mObPc~1Eu$y-%^V>fzyl%L0*b_Fd1ym6cSvUJq{s<6SDt+=eBS6@!~ch?q*w??W9q&VqNv1@4x*^ZrLZHH-t&5wRlqAmfL#G!IOPC(Ql$VzM`uLr zh7NGa{wQssCgjS7uUvv3s0$h(>`mTTzaMEZn!mW0&Cv2c>9qgWu04_y8{dyPT@(3hOLo*CD$F|@ZJPQ3 zE)q`*RD-@s7)j$BS;vTod^t|()#;dKP*z=CL%eUNIEsAa08D}Z;m-ZVXUw1LTl1mE zxq2AD$HC;YZpt6{9=qQ~pIODXLt^HgUgqopsG^@pyJ}Xq?Gv2S#rDcU2r2T3@$>uh zlt0IXvIET@=^IOhVHwrCp)HJu$7eT<$CvNXo88h4B5nH_{@!V99x4xbLFlc+xn><*oPK(~u0}+j~Nql~* z*;{?D9izY+ns?gX!b0n{quo|NzI?NYRUJC6z)I2-&;-kP+c_169nx9BfRqj++=ju9 zub1BAgR+c=UZRRT@DF{Malj%^Pfweu15w^fy8UAg$#4$Oar`IQ_!FP5UgIet;8zq66OR1maO;8ty^^;Vr} z#j&1b|9r*W6TFi+c(0zF6CapBBSaf)lB`Y%MBL=8jDYxf!s&z)U&(prG@1pZbpL?hupU;3=0 z*oI;sU2eYjkp|D@cra#MZuRnXBx(ydz~_cAvQFj%Z5t=WC&9p2*r5MJ28S=Uv*8^k z05bpu*n@@q-rIYy2!J@MAdFW1Uf1CG^2<9}1g3J`dVaPd zE{1;uiKsFCcOLV<#5~LhR{tnLyn5e6-(_3tX6uq>BV$rvr8ze`TShTQ?{h_`hxrdF za%5_>4#iogq~!{|S@YyuJ$Jto&YMZ^($V6>9%6DZR+|X4qYM%d7%buiAl^6H2*YHF zLHZokwJKN-DJ`E}K_vfN#8?grM%FKw(YiKBO)WWEa!>3*5{Ax36M zT^5|iqfGfnB)a>zuN{Ff@gJZF_5vD6ZqT3*KYV_(xM8@VFu0Hxo3fkMmDG-e@5z~X z->^%f!6O2XT)|CQTFs_0w)^<%kVeq1zU6cm-=-MCsYXcl6VZP*Q9jl~G!Zhusks#Pga2Nx}x zl4DC`3RcXXyqAZzbDPFqnT6LQ7#V9!}SPBr`}mZD)nb zHV!;0GH`((r7;ae2gB^4;yz zDi_hHCSRj<{l)h-(g4@{!%^4_x5R02u60;Ts@9VQrr_DKicy@F;Hx z5tSQuF0KJ;w?6bp9PX zZtnLSh)GBY7r~ycS7CK+JWZI(SM|Ov-ID-|Yr09iZH=j7u!P?s4>~V8?dcJAMjQ%k*cvXfCtEO5OWXzpQBXKU6Xfgz#kqAv$q5C1(jqN1L z&M0vBZe@=A<4MO%k;}Ud;!{wSfcZ!LIAvf5FFWFEE zu1DvK6n>Xm_S7Gk3MUg2pNx~pt@QwTgWd2dh+NTzfR2X2WCH%76b&PQmjtSYCnliW ze;H)%e<3F}Vr&E{Lfz*#VX~E&NtZ0W(_x?P}=YOx2tN)Cw91U z8BTtT_&&BUOY^I|AiTL;4LOnT+m-UusLiQ*#1h{tuS{8BdK)^)wCrjgNORc02JR{fZg#=@Ex_c-c zMR%ULbs4YiU-Y^JX`vTQD;j$0Q>Q%M(bjjHo7NRLF?-#)H1N-Cr|7_Qvp_&0sIj$F z$djcf>@eX4#Z;#IVab#HovZ|yW`PtbbZ|*pT2mZ33|Kk_!txQ{cP-mQ)0&Uex4n!# z=AS80Nquz5?Sm8*8m&m<855Y6D^|!{UGDV=^3^LYH}_gGOVZ6b0lG z^&h$XG6Qm%jARgTAXo%$#KUtdKYsk{qz#Y)I;5=(RWeQ2B#%j0WJi3kyr+}F*9`6Q z>AU`@Ptp>Gi|`;miSWN9EX$V&{SV;@_)gq^C?iOk4lPg$xN;ayx@kDOOMgMa2BL6w z)Mz+f*pF}1A1{HwlmDQ5?eOizFr_N-E4@qI z7%@hK)xWAR`uEfwT(5)Zyz12g((yXi5XOSj7-#;oW3(hsC)KFg?V0NagA#A4tvv$< z#fK8!;eXRyli+#{8mr(U=;qQIl#sb_Ar zxMG#Ije3auZiJf(kY^eKh-88UI~daexGr!jb*&n?Vb=4`$@K=ggd(w&u_ODI!Ulcr z%^vU_ET$J%^O%?&Uta#nA8SO}>`@}W`bXx}bb59FABa_u>HGsjINu=KLEDLx$+@we zY3RwW|C&s+x*L-wnE3EY2y+mfhn!He*mnUl%+ zvV6Nq=JD}6NR@kcnt8UIZEW_7zWD2EB6W?OY|p|JenX}f0y%`D^AsXbHjGTt7DKl( z1OB+oAftmctz@aP zHI>!)hb!ud%f`udeD~s!5c_6>4s)jY(xW&QL#Ug2p~Cp{>7LzYb-Th2)0$OB^-J?8 zmSrq4*E)|PF+WBR)zZNPn)t^x975PPq;T%b9bCph<#Fkiz#CYk)cE^(lb3s1RpF5@(++k zgaad(oZd`D$Xbf4u0ZG?+;eT`OXP6_C-~-zvQe8s+W~Zu+ltMonCv5oX03bilNPny zTpYtAMO@u*=jrR8N5VTl%=Js{C;v`Xo44m~PsM|7v5~$gvDv&*iUoi5y_O}P=K5wS z3K}o1vTO6@e0(?1JqDVW=%MJ)nVFeOP}TXzc7hTw!tl}+=%NfQ)%5cp=W)d{R_A^8 zy7`wCjoE-S52Sdu5>x3QU)t2*6E3{nL#kCD?SxNOl`lVOe%A!DrLn4!gCrf^*K|>7 zB8a5eKS2K98b58@ztcLY!qQjMbDDNaX)q}eh5X7Gtp`uhpV-aQDGJ+d{IIj}KoM6J zGLA>++rra_jVX6;^%ZL27nUix1xIVoVg$qvs~+gP#5W-srrFu2vkJ1G$%s-9x-EcQ zCB$}Z;dJgF6^aPpu$8{O)52V*BtW0Jir5<#Gf|v->`3~a?w3x8DNSz}U)({wd`a3` zu7Yj6QjdFCtS+apl0X|tC+W+Ic7*aR{sRfX5p7x%RV~gj&72Q?zPw1VAH7I3C;-#3 z(&~3n+!UZUKdVWZZdag4t5}*TYKTzVh>c*Wy4`&e6Wa_wsLacE+``+LyVgx>wEM|W zPN;tc(nFv;fVqVLb-R3kXvz5?IA@m%O78yObqG0i5SkRjZ~7(57_h!C`5)?lm!95Npi93XTAy_pNCL{APzjD#C&hk_5VvfzWR`!^=-5_W}~7U(sr^@*R0lO)8s%$C}n2#=Q-OfDzg8_>^88YRW~C`?Vh_+M#l?d&{c ziUFEb+NnrE6}))BjutVz|DX4WNY_SNkSZWGe&9tKJkDfj<#nAD;Y+Tqss|yUaN=pAXNQ*=a}zQpF1_8kombUW(oy?F>o% z1y>?}>g<$Y8#R|ZI*Kn^*lf>V_;&OBoyPKNS89LiU3-*oW!LOs?`Q5~vhDol70Qyj z(?Y2-Re)~+v!adx3gcclh_2z?i2n==^M?q-{;d_}wR@&+bu({+&~n|2>L_;+2@T?H zr>5;Mz3)OI6KK3&04H+IwTAGFm4A5=d+@R4IAh!TE4AmPt$klS?$;`tqpc+E$G#di zL(lygK*vCe+FDbt`RjT4eAGaxiyOaPm;WACGx$HF3PUxgvL&tFkpkk!+3-XGDa1Ab z*RD8HvnEgkHcwH@x=tl#1^3+LviHntywL7YQ}v`N}V8feMmHD{rzwT>FVzE!R9wk<@b{5%KlmT`Jpg` zDe%Pfm{qy&8AMV%g_|Iz+QuUZT)Mxe#cm7{2szBQKI@7pknGD42HW4~h1u}*wqKuZ zSZ8SS5hgUsygvUj`3_#2=;;(`k@_Z!WYWNOtdBS$ZXJrpJ!{(071Or^ardObO+12E zUl@_@f;5Dk0JEE{oeD6#Mr1bc-f7Fo1j2>>lBG5xJoA4~Aos66%f_wVF4%Pdx!$T7 z4y|4TA9dnh7R}f%vBj^rdHVkDzmQd7^GY(()gn#SWEe{-YuaF*5fAhXbZNrm$!2SG z3=PX<=`#>b1QiuAng13^@Sn|i{^kX^m5*x}*x;CQl*H_#sdDEdo9XsS(*C{+uhVz- zLmz?sal?MS7BxH?6t|UB@G&wY6LI5|1D`^c0Xp_#pD{8jo}8Tg!;WA%2o>{Cp!Pk6 zhNbFLM@B}Zt|UA~sYyskB73()z{Vf~jTqc?gR-5^^1w$&{p+XE%SM6LQX0SQuhXsp zOmc`{Kxo#c;j~%;0!bJJ&D7We23}eDBOaA-Hm_-?1{q=zWYUO1+m)1+`_c^zot=;N z&!YxUPPUvLtC#jrLw;L=@dJ1i&I!q1jxM9-PW%}+eigm6x@djFsVKZL$JB6?^c4XM z)%45x*M=~`2l{7ti^VJDG$g+O5=%;Y2s*96mrSS;#s_WC3R1o-Xv#>U%wEIEu_&na zlgzoBY;b&rJ_nX=--MJl(Bu`2Fo-g-S|NyHd#d{4WZV4hf~(fRR_)Fn=3;D6 zUqxQOXuUi~>j9QxOxK<{3t|KY6<=T9+EGORqw`-C&t}oCf7l`e;3t&Kii(OE$7G>+ z^L|H4%Nkw_IB)I`$7B;lFck{Z1vhFb9i2Eva1{Q5smj-Efi6cpMXyn^qrzoKP!D8x z5Be$$Z0+pe8WOj%fCvR$bKuznp6PcHR3a~8V%74-Cnn;>{P+vBm27Qo1N}rmsbl)J z0y5lIRXH7% zHjVHSo+Iu2qNSK)|9Uwsg4d~0WViE=gGX)lOGexOudXivhq8PB*S=7i5S67+k#$Ol zP#H9YP?oHjkjR>SdAx0w7&X=qm8~cevKv`uDr$;^Y$02=?AsXs`$6yb`~6+l|6G^1 zmwDza_qoq~f9}t@&w1RqZSGqcWuNo59_uL6nPLCpk(!zcDTS%K0(VRW#j5>~nO%&7 zng2T1qW29@J>u@*uZjMirj{5j$b(QSOTQ}um;}?hP@AD-tyXfbKA~pPts`BWz`~4n zx>8C?YRbDKQdsYoOOen@=+3h47SBKgWbM0uF2RQ+3@`Y>0MJy$bGaiOJG|>BN=^nm1w&OPcliM!MUvtvC`QVA&o!C7QGtm)uH}B8ErP~3HydRqe{;Z) zPiD8cKe^PJ=x3y>R+tQC_LBAxSJi~0jsHbb-bhQ#-deP=&|P6+VQ+4fG}R9O$k*th zhSQ4nuf(4RAY=H8rj?adzLgQ*gPV_1^wb)bM_!#_#Rogd($!ku8Wfpibz&x%B!67g zj(>9Ue!m@3drz~)iJG^G+E+H3;kaZ-`o+8%1^;+m{*FWia$y2i5t^(x2Wu&tU?`Vg zP++&rSju?*{K+-=JCo%5t?s8uQr2~`$H<*zU7jn%hC>`5nmHiH z{M>86IuU|mvL3;Qo9dqYLA$Z_3mnhDbw4iKq-$=jy~1NL-D7%3T(7UMFHPxnF|`jh z61IJWrCj=XXq$TRH!fFOS#Cu^+pr$l%((b?zUatq-VGKh8D34W-ydBfh({)Aa<9z4 zo4hX7=U~g2t}Ncsa+(SXcf#XC@a5N~(%CvIq|9d8=g0D$<5sM^r=GukD-DoR5AY-y zHylfi=xIppJ#snP?RJXBb4sf#ce+Zw>DwEKV`sUaqwd46fJEdjuB)o?^Z6}Q3CX^u zwTgr!SZ5YYd3kxrwH`{C-;cE7;>)i6pHn^2N*6@gw?EW=kKvKueh#Gfh}h#>!{xfC z(X&4kn@Y-ZD>6yS%E(wi-rneJYipzLi(1F@%MyTF8NE682fWw^#UiAeeT^bF?MH$E z5S7(hHMO~GzZLlS^(CEhBoBatG~~%`$-qkE1=-uXEm2IjDY&!!bGN2QgDQa8Ye$|K!CR1Wx!C^0Q z*2|Zt9+F@XmH^(}CTq;mpxsKDhlGYB3tiOm7fPKa?x(W~09>_ueL^%hyhRmEHF0Lf z{e+Cntd~61*=743R1QooYE+_5siTO9NOqp+P%WwN0+B%o%@H)cZuC91%V|!V*h5zX zkHU6wGt-xNh1UHy`%lQ=e-C`gnd{EI1Wt1;Sb&idPz06sIjP~5tD1R1JfrffMUeg zHvS{^Zp%SvX;W583hvOML+x6fB_5737SwMq^h!3NCkB|9Zr?YsNJ!D%lcdeOIB4CJ<-IZ+8z^W$og<@=4kPFLRGPW-sX4*iWI60n{mgW|@k?DY2sNCR1#qxfKy^cKL z^+}}hjq<1`K}!H+#8bB#7#VpLWBWiN_8D0F^H>U9n0u$v11%&y`=ry)(+Y<`hm%)= zrO`xAlld_1(i>bUBd0TYm*#J`^Z-OuJM*_ft}|QRLodLZYox>)hhby%!n!_ixjv=# zoJ@c7WLB3?i@EylOz%@m09{ppaA8Nm16l$wcc4e?I|G%hLXjdB-Jt6% zK4)s*Fa)@FA{XnGWKNuD)Y;8++8pIS^i6y&nc4XQj=!WRejfX8AFhb1OS(ixMTKn( ztRkPFv>iOlBM^eMj!RK8xO8bLQ&3rj>B(y_vJVtW$vH2mwe~<1eQ$FQhac^ZCXd>C zJ~!cK>M=6CYyfe?LwK)NbMElp9x|yOfHPq@n85Yn)X6v4zOxzFV|xiEBHHjShs+!o0!Lt!~~M6d#vQD3DUnFqP4+`Ck=tLB*$K zxf#!_jI=f4&LJmM@1~NZ4K7|xI3vvT#3=zt5kXsU3JVR(ZRxN;NGT{+I9Xj z?YN4~^w6|8I7RRt8l*(}bW$^BRjlBcBpuWxeWRkIqrJ;I%=Z&MKi!wCb=S&h2v)G8 zy@LbeUJA>hbpc;rfoJm@p2;5gY==11LsX3he#NGJbnWbKDRG1CTG_^B;``~InNgi{ zclL;8k4zWS7QWnFftwKiwl#2G>-%tGc-P-{RkzByv*>j>6@DL@Er?|Me6+WN2j65(_Ax5No}u@$?Zw9THg8HKv2C><+I!Dr67OU6AF@ zaw%y?PEbUj?ei2N)J>yS{o${)egCQNLM)uMeE9L>$48{Zv+#BUL=X{5r zoWU~-Z*s8;oxdr|U7o1^_W?-OzH*=$dk!3z|CP{_f$9g$5lZaX-Ks8;=Ntd?P^drD za|XU?RKMl<#)YpmFx@U6|MNLh^8RHL!{S<<|rzkVt$O_K40lmOWHw zhpmBCwJ-jAT;dz$7mNT8wQ@~vI{MGMo1VXDNJf=Fz~3IjzsVcl5&flLD)1zK>6nJT4@Ok8VhZE^#U|F3YO=$=-%>H6OF1@ z3YQfe_=Jdh;yV6_-ZmB)N~{EEmL}A^a2-wGED@)(WB~W)3uVi2AA8N;>9L4B z(EPBZBouq^n8n6eSoQO6ADMoRd~0g5QS-iOnMeH-1yqV%QFJ`bVrRUmq^-VB!>*x(hH9OiuinJ*;(WrDNv)Ti zZwHtiJ%yZU+uB{avTQz>-wHoQfxYYojBl5_1hsktsO*BV~8AB|7?B<1a zOkAIbvdO&JWX8giB}WOLu^;&&>gt;r1y}H-YKR{1fU|YFg$TKG7eSEUCcHTWPZCT| zv-P&Ywejz;5K{j1{j1H;_gBu}jcj%-ScxCeR!jQe_8Dq61 z6LC&>`S&ekpNg69cug}IS(YcZlzQbp0oU;zy7w$E?Fx%$33GL{5VR!DQf_TP- z?d*d#vymhc=@5yj!(nk|#QA5%KOWq!${IL7l+A0ED zp7&rD-KuFPC+m(ACVqXW1Wl9uhh3g{+6(cTcf*rR4r~j#L=q&Mo0<9F6AVy<{Pdvy zB!po~?R6;{7#-cyEcB(lou|lT^fe_eA9yzpT^$|Fqw{@1iN{IDP}HKPmeX^t@~H59 zDZ7wMx(cq0D?m}A^iO5UXOQA#-=~LZFTQ9!lhS0hdrMTzE?>9~i$D*y5)l?*JV~}c z!F8t(own3QtC<>XfaC+185nSyZ9|$VH^xBY*0bgMm`Hj-knE-16>!18N-ZGv;^N|s z9=qKY$E>!nN&Y@>t-;zdO^_Ov}jM~rGnd%IXg#FK&o88e@ee2jue zZM4|>jc|k|FqgabWPbu1+u`%O_JIAXz&nL(?P$NVjjeo_x@71?&4o&=Er~FE10vCR71d7hC07tuqb&zhY*_ZlH@Z(-9@Qhv?ypUv4o zc>w~i$+K?3mIXa^0Rr`^{h$!{8F8GmAE~M4nt58j)GN@Ic?E z`2H}f06lF5Hys@Pg&uQKs&c{l26-4mQYww0`J$w81?Vq{Pk}=|b$5Jf#s&2}D$51k3h%C;X`QnAJ z{j6AHeMbjxZHz=X5ap@{22BC366WQnAD;v zVa_|*PYVwUA|gcM!5Cws0tZvb>Im}8Z2M}^-JENq9T^?Hhw?cVE5Lux{Kp~wXOJqn zN7Qf^CQzLR0z4gHdww;;iP3ACjrIa!61>;<6%{KqVkqudnvLhoS z&fp(+dYW9ibmCVtqX-xm_7KS`Q>u;9VvAw^^-Bm22V$U-4r$!uj;ZbKe%tDB|NHmv z&lsiYwhK}A(j`|*{b;ZP;}>kVY`F11tINB^XBDHV-KbB&`+F&zh3T(^DBMQnVWb>f z5mZ~t+$uq)Pdp&>eSWYv)&fCWat$ah))8b+|s59`?Y}^UE&27fG>U^Zh z%(yu#J3IXRVKyKKojw7es&Ct`|lU&jE|lr{UxKtBH(8A zJ=+YJKJ>bb&(je9icoexl`y;PGHLx+mrp!lsz=^FSR5lOUB7-Ebz~JJQB0t9(?I-q z@{1QQB;~0WaxHP(N7G7|kkX~>u6hj#F>Z61!!GYd+HPF~15Qm%%?+P@#>!?@0bjw) z7Ns~252h!XdHS1=_l{HfBureZpYGOx;4T4S%&ROjj^JI+K!jrihwCL4{>C(t-a_sy zU{8y4ocNYvxCgTxUqmq$V&wRrNiM1!jtFkdG(cFr7!BG=eiil{;3KQVla5(^j9eFP zjx0?dr0yt)R7aE;5B7(&UC-R?aBVtCXt2>~LUoV)MJtfh+c;`E(o~9%mePxBro6TR{>YlbX3Y zFfyW$(XT}RQ{~)xqads|9C@6yS~(!~`+Ma#FP_UW{o_GiY=7VDg271w*cS#IeI_Bu(_zOPpNx!JbW%e ziQdIZV9@6=80X1PGE~|!okm3k6JzFWYvNqPfx(PNB+&&g8yhDlCkwy{e1V7$)iLE$ zsj>1N4#Ukk0;u%_{WOpl3CX1?%8M8MB2_X1`TS-1`4hc= zzo=Z2k&&TpU_G_VCc#;?&8cd~-5gehsV^9^1L$Mh%?3@loo*laL-01d;io3f;czB? z(~UY1-N8KoITr73VPRQZJx1P#nO(rI4O>!9$h}lEE)DP&d%K&2;p+q6vrG|VAw$@l zVlhe^7#NU!IoS@D%lX|VPWI0Ru#APYa4aU@Q^2+Zd7b?7r6}y8G2eZl2zXra_hP() z&&-qFt8f7jp)upq-Nmtifgr#mLLwsf;WCUJ#bXcaOm<^(>|5R#zPXAA`wG5)-_22m zMi)CU-~NZ#0i~|SU#dGaa;EfjbaWmGe(pYwsXM6nk@m)VqrC@MM;LnI)G=pTN2=BXV?kB%`b>nnbG9VxQEE6wW_Q^=icxe?F z&XuC5a=XHD%Kj~(nORwi;!UsZk(M`wJw*9uFmFyf{F>aFOg(Bw3OW_7%Qw`>5_YVL zuEH=n=%*OK?a2tic^|xFA}odD9wR^U?M}4~b(Hz&jmfg)U8%a)oI_CS8gDc(=c$p6 zh?=ciwa*m;$875b$)&spkGoGrqz!J;wJ5EQQ z6-l`S{#ykpw%-4|s6EJ@08bv^A06_(xV7gC)!O6`fD(&~Sb~}oo-}t`x_k@XlCqNU z4hB=_Y)+3R_`3-HXC}KtJ#6ES%B~rM(A^vD{6EDf&}rt2qb>26xD4tL>bLk z$#wdAz4{j&4tc{He`88$H1Up(|-$WFze{) zv4I%@YskC^O!sypVs2&Nvo$`sLg-2Jcr?DocO0G^|K#X@{5oQ12YUVTH90R&3Y>*y zO$djMx%rqWFXfF@?X%omxV;ecd((f3wu>Eu1LBoqX?SDO!nbsAFH-#ca`N&7fbU@4 z?7qJQH4g!IhPJV070L#cpTBs4sf;HHVhL*$O@)vJg{X{#EQB`$V3Me-hr0szg4aY> zFI+u(23BQtnr1wI_m^QF@_an`QI8Pw-1oWQMe`$!>FXIr33In#k zuLP62W@ZQF)d1=Nu-fU_4n|Sc)U^He;vyu~a}vvz6g$eVsxSM&IodGz450vyx>rVH zz+Ow?@*7d`{a+g!IXdZmGR%a68?Dj<5ND5+|0U$PchnG-L%dsp!Q-dAUV1MO&LYQX zCWLdml_>mqtJ2-aXYom@F)(wMU!SQ|Meoik><%e}IFLE_HoE>_y$XZOuYlcm9aPBaBD*|4zh=X>8s8;A{$ln@^S>f)6JdX(I&|-GOV~I4O!U$7hy{h12AHI zszIC8D;x#$K|v67@7S@UhW?Pp@*EA84mD*<*du>#^NH5A_}1Pir?W$(3JZoEe zU$bZkLcojKV3icR$(d_~6W`IFfgebz-+SzsJCFteUkBMS?4|oK4fn?@9mz{Gu`-Tk zfLkc=o`B@CGKIGe?fWp8TfTf&)T)^R05E?974CZTF8#n8zKc^F%DSMr( zcF3@QUi_lW8dmHx0`4cr=U|6>oc1izUUz$^ybF-=48nlTklQ+6Qpa=^8s0SS)# zGBFhlt)zdbXw~j3|8XhrLU|m8e=A*;Fn;^;wJ2;1UqT_%jT<8Yy3}@$P99WGF{tsX z)D;0_l5_3rvsfj>|4JWfuOUv_=Qcb4c+5BbHR#TwWgUQowiiW5Mb&`o z?kS!8EW$lT=GLf=HM)0bV!qV!zs)7Mp@r+<3w)M<%($OK|8-=%h~_7bDlDXVz%tn! zY?I_CT|W7EjNSUtfS#!-58xr^uPU4>0M%DlKZ>eg5hhP48oav9fy9`)8<_ywhLCO# zFgl4oqeX^fe?QU7c>}RzGdnxGHV6Zp8#HB9Y;A2JdTxgO=m0G2t=t3yjjOKc#$!wR z;_MhSV~3*NH#v+lbFzOKpFj1>Bb!9wJJ_F52AgM!-`cnAuA!5|d)_gY7ViT4@qT&v zgJ03WTo=MN{!3{|Ncz;wRUFQDj*Tyjm9Zc}oyry29JW+&!mj5-zETKhV*5T$GcTjk z*(FYj#HS=qHf{MSK4!NY9lYjcy(L zG7ac%M4fasQBYQwhld9pD#R)9HZx&sggm~Vi~-d1Scdb-R#PBx&H`tm3NRz@T2?;t z)Ut55N>xAJJV-n7!_S^_Ns$hwn)`g56kh4dojP#BJp4b;frFwTfr?X4EA5Xg zGscz`tw(PF8`EI{%Y>^Z(Wm>-*%v*`vwnxtl1wp+v%Qv|+B-w0S+nl*A!85c2Kcy- z-lo@vAfc#u_!!k{J->||Lxa<;Ec=P}zKh|}HPGD}iEoY7HTf~Dvdg~)^?GI*-DK)7 zTRqDkM!oAnv$&9h0B#Q9Clc6Yci-of5V!AlDJtww^r6(1!9HS^cEeN@KSNPFEJ(vo z9hR?!C-h@`YXmJ}HwMF|U5jgX?A*m^qQmp3LHmA?a<1E{9~1C;=)wsC`LdzA)j|u$ z_|tGR9=qrcw)jL(>kIHsI6j8M`9x`zFEB_od=Ap1Iq&OFz~h4t$l8Pcfg4(j$CLB( z-Rjy}o62YM%|}N^JLJE2R)OxNDSqG%Gc9r72E7rw+;2wjsB{tTWLUbEI*u;(3{Q5l z9sewEQ}ISvg4}G}Tt3;v$?BEmmt8J>ElC#!T#@q>q#p*-FYQ+t+nb3Le3$1{=W!A> zd^pp55 zT6V<6XSOCAq0j8VdMy~I&J6i4%P?!?K&4KWhCV5s8W zdsEwQ6FqKpm^CX-_aBCU%~ksp+Yq0>RI#*U_=kqH>Uq9W*{mh9;-1O<{zv%v%a^Ac z0hEmlPgJ@VDCF9HDGC$`Lz}P%{2Cz`tb|-UKKf_{YlhH3FSggFocc4}I8HyVB*Hxe zJ!W)`I)cjIH89)LK+A$RG4aqG!WxkYgYk+9pDmHcVGtY?RqnXPm>7L4dABr|y~ArXyTgV0#I?zv z-n9KLx&clUt0DeFKNIh)y*io(Fd^LywfhN6RpAuvrX{tfPn^4=VrqOkkt=j)0Xv>| z{tCSsX*f1M*c&$PX!o5$V-S>A^>^;i5ygF+rqc}B+3wk$avq({JHi$A9`COUVMYe) z=YD1{zgbZx=g8H#sOd0%;(;I+t+=EFmO&G>s%*5qL}r=@7)LT;v6z>mQg$k5uK}vF z#M}6Y!-GdcF9dJxAf*i=$+mHQhu+CDcG86?_!n!S{|OgNPeVh)Bp7?`bGOEi;z|0# zFi5n7@b(&z@NPo(`+c^;tJ#q4_dNZt%-?C0W6lZ zf`UReWO*rKFb3y({5#h|3?}w`yg8?Xlb2kB~r($O} z6yPciBq;@LQyW>(b9}#5X;$}d=SNe~Cu^h!5-(INOIt%^Zk`e)Wxlc6}ia-}zc|B0!7ELKNMGpB$#q|FM@|%!XX5 zmBMAJj+0DzE2TMUDeL}!nL(U*47@}YqJ9p_cVKm`2LUys5j^@&kn$!J83hFaA@23G z8eq32pzj=)-jBc>AsllL7oBm#oNF^*F8kg3oMZ)Fua1F#?5$OJ+E3C|M znx8-I{G;6{;nOwlWc9H8(B%b*#(IO_7PzG8sh{s|BS+R)zksi5IRsCH4}FNfLd1lG2F0h2kDB?<_X1k-ZgNKB z4*>K#eM$k_yk7cK#Y%;lI^5PHnnXj4x3Bd$Sq~P{!(L(HKcHG9*9-ae5ZvX$@66sD-kND+|I1Mbh;7$t~PtN{eW04`IZihaavY&!Am+iHVej zy|%VCyf;)ziv1%m2>dq1*-*3!-GwLA{RLF~{N3|5{(Hh-8SO_K?_?xfjep1%4F<=v z6=wfQkYPw~`+U_b_6v}TfF_8*O@WS!4UdhCguw<3rPOP3`yvpOdpz2l)j(*~iHL&F z_C=W+KiECm-3-uegS&o7%k+K}@VgYX1xz{{ntis;T{cD&Q6$|T`;7Y#7$of#e+2OB z#CN4ahl=r~MVA~#ml|REaVOVn-`YtU{iS4|kNILN8e>%Upzi9cQ}3&<`CdL(I>BS= zaW%oO<1!lMmdJ-a5PA>6sYnqu7<0hoMdbgCWmy zE-QRq{#i4gygV)OwXFB9XI?M7LUP3&Aybbyu(N%31QaTvpXXQ)D%>TcYoAPZ`n+Fp za(phTv;67vj@j@}g&za?{^LI$q#Ev|HSu?6T3U!g246*z2D+*!frH0Iwzrzb7f?ed zKL__G%^N)p7{9w%zPo{@DAm{H*ul9>e>JAk`a7_j&T7U@Mm!r%U@&(rsaE8L`_A+E zfgf2>gqKQeW%To*z)=lXjY7x}312Z3OgPWGxr!}=S~#(@%kNb7@R&6Rr{Is}{~WoQ zP`yE-Y^q+n20Fsj(^SMs_NW-<@e_YMdw-nPxnOpskLYo1Jg@FS|A2@m4maFB9b$=~ zm`vxwuur19u*n#mHJJW9U&(uy5Av1J576cf+cwk}k@MCp5O z`4FDKMTw%t*=4W85%Xtp35R!t7{#Rxy=fUH<5AV66rifnH|n?og;5ZL!XgyK8F+it z%#zC&kk_=yY-Dz6j?rX5tvi|9eUIjQ>Trx^SWpnEHfJIBm)#5_MQ=HFhqO|<6-h8D zYIBXKW`j}`+C-=XgaU@miOwA-A^wUEL-F||SL+%v4{;)3ad_1W#Jg4E?tqBILd)jw zCml_Yhpk>Frk{qwn0H-BZU3Z4x~=!=-RwCw-rnB4>?;eL4<@0T+UWyt%5|8lqcSg= zw-kx+^IMy`oO$}~s|>?w#BV+dVr^aO!vy#OoR@2M-U$0l=I2RQ?+Oa(&-*g8P{2?z zheEmgCp-`lGf#KBx`g8*;$#PhE<^K2grSE0gnoo*kHeKt)Q@`FfBJEd<^~W+rMjYC zb@}XjbfL&H9II9u5U>%B7Kp6v9ZisR?jD0+o?SVo-8hDvV77mg8+XRugo>>LHvhZl@slj%T1n^j(5zObM5E#IR+>gIf6oAMFy43 z7h~>o$;7|C&2af=@!Zhz1j6cr(hsUyC%d+yT(dDr5RupxazPK5VhMi_7++au)aAL^ z9u()n0@^^-Oq4$4P?V{tNDmI*GvkNGlQjQD+V=1gX-5fr6j?eq-U=_BrVr`~@LPf< zL8^Bo&3l4eGXKOSEzKlxSkE<&w@Et!&s(8$4(Igi=+UDc`!UNv%)h9A!j)oMd@}x1 zA|J-fw$utvScHf}PgsV^v()ZN?nDEmh%mpm;2DgsKDi0Jio{>AA*2|>Bk&CcfQm`WrGi|&E|3ypDEgO) z>P~5PW(RH2$5n?PdUq{~)=#FxCf<#hHG2BAv+l60I#jQ|J+z+IcOS4Da`dl%?oMrX zj)WzmhZ&b4Ar^V~hAFa2wIUuyf);j(8Y1Cmev{ea*|@aqbGN<%yQt>l?OiVNZv~)i zETt14MapdB7zTLB%iO0t|9Jdm?Jv+FvE^Z6VxkYfWxk+n3ov_Qqisd5w^1jHmXIV% zD)t+U_CrwfQDmFev#}Wnpb&IU(ZaPKzW>V4Hm-vmv#9b8|2n^lqZCTdIr3iEAG^RZCa61n#%{`KPig+?S2k=M5zT5 zek!Fj3lNQ4Jpg&fAcpfbMeRIV2;r7g=Ltx^7*q88^OFu)Gv{viT(gTyD+v0FuI)j< zMEB9QmPA^=qh^Ct)Mo1CxU>=&tQyRVS=8E0RW!p)B}~uEfH&9HxJ4Mw_f=fZgz2CK zuU}~jVX_#8s@B1L$ka?Bj9G#g;_AK-Cn{pusY zKP0isYh~STZ*M1aU_L$jdBX*A!9ej{!-du!p@2T>JSizDQPgaprQ61--wM#B?K<{AHN*dpEufRy>!TF;(n^WV}L zngVi(1N_!`c7j1%nj@~7r^S9oq+WI$j+n-yoC#Wp?WA(TT+@z9GL9; z2;uziy8cP>^KWZURyaY^MbPx8py$CsV)b0|pcd~S;Y6pswY9|TZx%3%T2AuTn;sq> zkbR?3FIA?!uLjh312|5Qf}OedV5-9IwHkjuHmpi}4;$Qce?Z{cxT`5TCa`L-Nwno+ zBScO${Qonv{1Kn5myhyahiA|4Q|WayLzdh$vRB8$1g|)?44Eqvk&rOIsH^)%ivMUe zRu0(7DNswq0}?w&>bd;tRv2IS#*uq4?$4n-H6kN}gGR6c>6pNW`D7c%%Z_{y@^-Di zX`q;7p76=KGy7jLoU^SC#lRLGc^78c5odBRECOf*DLly$u1=n1Ml;yLajG)M*OERf zg0E1B582wde3Zm!E)$0CsdGaAe)O~%>k@6b*SH>x5(mcF3@k@g&;ZAWZR2(C5a@30 zo0ZdB&`)l=eOQ7aq*Z~gDn$r>AO#7GlVfDZ`LrOv}Qtf;d zCU{m5KRP@*%1D%=Z2n8S%VI$jw48b_dU?$wc+xL6JgL-t-xwf|Er9OtouxJ>|3|)- z)c4yQ5+KjN@IA1-knWxtxnjQ&Ml38Urky0lagm;KLmJ- ztak&IYR4n^iFgdwue2SBOWQBdJw_6oZ-qrBridXV{bivOxWF$Rk-g_~9fXvvQZ0sY zCg2jJ^&Metj|$@T`DC4bj-h68^c9~uy1$Kj{GUg_oY`X`SrNkkZT!3Cbi1oG1&E=W5$dmO}2K2|s18H>7EbXp*jehLk9A$b3mteHfZ*^*uqnG%Tqd(8c}0<|N$@O7IBk`d?kT)l(R!=(lhe5(o<= z`Ne~RCW2xU1o5`G^TeRz^-^MCLG?1T+QguS2B~&7Otv6?LLFCHKU+AKB#57Z%6af4 zdyrGbJ&2|cztF1>z4L#>Ytg3ruZAh-5PqrS3eNDYk6$10`tS~}1fgZ60CSBDBgH%V P=os-TTDYvU7PtN%C@3H; From d10212d0a2974d3825ff70950b275af4a6beb992 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 04:44:29 +0000 Subject: [PATCH 063/107] Bump the python-packages group across 1 directory with 10 updates Bumps the python-packages group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [sphinx](https://github.com/sphinx-doc/sphinx) | `7.3.7` | `7.4.7` | | [furo](https://github.com/pradyunsg/furo) | `2024.5.6` | `2024.7.18` | | [importlib-metadata](https://github.com/python/importlib_metadata) | `8.0.0` | `8.2.0` | | [sphinxcontrib-applehelp](https://github.com/sphinx-doc/sphinxcontrib-applehelp) | `1.0.8` | `2.0.0` | | [sphinxcontrib-devhelp](https://github.com/sphinx-doc/sphinxcontrib-devhelp) | `1.0.6` | `2.0.0` | | [sphinxcontrib-htmlhelp](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp) | `2.0.5` | `2.1.0` | | [sphinxcontrib-qthelp](https://github.com/sphinx-doc/sphinxcontrib-qthelp) | `1.0.7` | `2.0.0` | | [sphinxcontrib-serializinghtml](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml) | `1.1.10` | `2.0.0` | | [starlette](https://github.com/encode/starlette) | `0.37.2` | `0.38.2` | | [uvicorn](https://github.com/encode/uvicorn) | `0.30.1` | `0.30.3` | Updates `sphinx` from 7.3.7 to 7.4.7 - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v7.3.7...v7.4.7) Updates `furo` from 2024.5.6 to 2024.7.18 - [Release notes](https://github.com/pradyunsg/furo/releases) - [Changelog](https://github.com/pradyunsg/furo/blob/main/docs/changelog.md) - [Commits](https://github.com/pradyunsg/furo/compare/2024.05.06...2024.07.18) Updates `importlib-metadata` from 8.0.0 to 8.2.0 - [Release notes](https://github.com/python/importlib_metadata/releases) - [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst) - [Commits](https://github.com/python/importlib_metadata/compare/v8.0.0...v8.2.0) Updates `sphinxcontrib-applehelp` from 1.0.8 to 2.0.0 - [Release notes](https://github.com/sphinx-doc/sphinxcontrib-applehelp/releases) - [Changelog](https://github.com/sphinx-doc/sphinxcontrib-applehelp/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinxcontrib-applehelp/compare/1.0.8...2.0.0) Updates `sphinxcontrib-devhelp` from 1.0.6 to 2.0.0 - [Release notes](https://github.com/sphinx-doc/sphinxcontrib-devhelp/releases) - [Changelog](https://github.com/sphinx-doc/sphinxcontrib-devhelp/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinxcontrib-devhelp/compare/1.0.6...2.0.0) Updates `sphinxcontrib-htmlhelp` from 2.0.5 to 2.1.0 - [Release notes](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/releases) - [Changelog](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/compare/2.0.5...2.1.0) Updates `sphinxcontrib-qthelp` from 1.0.7 to 2.0.0 - [Release notes](https://github.com/sphinx-doc/sphinxcontrib-qthelp/releases) - [Changelog](https://github.com/sphinx-doc/sphinxcontrib-qthelp/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinxcontrib-qthelp/compare/1.0.7...2.0.0) Updates `sphinxcontrib-serializinghtml` from 1.1.10 to 2.0.0 - [Release notes](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/releases) - [Changelog](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/blob/master/CHANGES.rst) - [Commits](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/compare/1.1.10...2.0.0) Updates `starlette` from 0.37.2 to 0.38.2 - [Release notes](https://github.com/encode/starlette/releases) - [Changelog](https://github.com/encode/starlette/blob/master/docs/release-notes.md) - [Commits](https://github.com/encode/starlette/compare/0.37.2...0.38.2) Updates `uvicorn` from 0.30.1 to 0.30.3 - [Release notes](https://github.com/encode/uvicorn/releases) - [Changelog](https://github.com/encode/uvicorn/blob/master/CHANGELOG.md) - [Commits](https://github.com/encode/uvicorn/compare/0.30.1...0.30.3) --- updated-dependencies: - dependency-name: sphinx dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: furo dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: importlib-metadata dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: sphinxcontrib-applehelp dependency-type: indirect update-type: version-update:semver-major dependency-group: python-packages - dependency-name: sphinxcontrib-devhelp dependency-type: indirect update-type: version-update:semver-major dependency-group: python-packages - dependency-name: sphinxcontrib-htmlhelp dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: sphinxcontrib-qthelp dependency-type: indirect update-type: version-update:semver-major dependency-group: python-packages - dependency-name: sphinxcontrib-serializinghtml dependency-type: indirect update-type: version-update:semver-major dependency-group: python-packages - dependency-name: starlette dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: uvicorn dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 94 ++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7f821dd8..49a41df5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -230,13 +230,13 @@ test = ["pytest (>=6)"] [[package]] name = "furo" -version = "2024.5.6" +version = "2024.7.18" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" files = [ - {file = "furo-2024.5.6-py3-none-any.whl", hash = "sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de"}, - {file = "furo-2024.5.6.tar.gz", hash = "sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b"}, + {file = "furo-2024.7.18-py3-none-any.whl", hash = "sha256:b192c7c1f59805494c8ed606d9375fdac6e6ba8178e747e72bc116745fb7e13f"}, + {file = "furo-2024.7.18.tar.gz", hash = "sha256:37b08c5fccc95d46d8712c8be97acd46043963895edde05b0f4f135d58325c83"}, ] [package.dependencies] @@ -280,13 +280,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.2.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, + {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, ] [package.dependencies] @@ -604,27 +604,27 @@ files = [ [[package]] name = "sphinx" -version = "7.3.7" +version = "7.4.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, - {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, ] [package.dependencies] alabaster = ">=0.7.14,<0.8.0" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.22" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.14" -requests = ">=2.25.0" -snowballstemmer = ">=2.0" +importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" @@ -635,8 +635,8 @@ tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] -test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinx-autobuild" @@ -717,49 +717,49 @@ testing = ["bs4", "coverage", "pygments", "pytest (>=7.1,<8)", "pytest-cov", "py [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.8" +version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, - {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.6" +version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, - {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.5" +version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, - {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] @@ -779,33 +779,33 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.7" +version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, - {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] -test = ["pytest"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.10" +version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, - {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] @@ -825,13 +825,13 @@ sphinx = ">=4.0" [[package]] name = "starlette" -version = "0.37.2" +version = "0.38.2" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, - {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, + {file = "starlette-0.38.2-py3-none-any.whl", hash = "sha256:4ec6a59df6bbafdab5f567754481657f7ed90dc9d69b0c9ff017907dd54faeff"}, + {file = "starlette-0.38.2.tar.gz", hash = "sha256:c7c0441065252160993a1a37cf2a73bb64d271b17303e0b0c1eb7191cfb12d75"}, ] [package.dependencies] @@ -882,13 +882,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.30.1" +version = "0.30.3" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, - {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, + {file = "uvicorn-0.30.3-py3-none-any.whl", hash = "sha256:94a3608da0e530cea8f69683aa4126364ac18e3826b6630d1a65f4638aade503"}, + {file = "uvicorn-0.30.3.tar.gz", hash = "sha256:0d114d0831ff1adbf231d358cbf42f17333413042552a624ea6a9b4c33dcfd81"}, ] [package.dependencies] From 80f745ff78fa0224ae7566546e412a49ed61567a Mon Sep 17 00:00:00 2001 From: Kristin Schlosser Date: Thu, 1 Aug 2024 14:24:21 +0200 Subject: [PATCH 064/107] Update versions of source-build components --- src/22.4/source-build/index.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/22.4/source-build/index.md b/src/22.4/source-build/index.md index d32469c4..c68271da 100644 --- a/src/22.4/source-build/index.md +++ b/src/22.4/source-build/index.md @@ -26,7 +26,7 @@ The components should be build and installed in the listed order. ```{code-block} :caption: Setting the gvm-libs version to use -export GVM_LIBS_VERSION=22.8.0 +export GVM_LIBS_VERSION=22.10.0 ``` ```{include} /22.4/source-build/gvm-libs/dependencies.md @@ -48,14 +48,14 @@ Afterwards, gvm-libs can be build and installed. ```{code-block} :caption: Setting the gvmd version to use -export GVMD_VERSION=23.2.0 +export GVMD_VERSION=23.8.1 ``` ```{include} /22.4/source-build/gvmd/dependencies.md ``` Details about the optional dependencies can be found at - +. ```{include} /22.4/source-build/gvmd/download.md ``` @@ -71,7 +71,7 @@ Details about the optional dependencies can be found at ```{code-block} :caption: Setting the pg-gvm version to use -export PG_GVM_VERSION=22.6.4 +export PG_GVM_VERSION=22.6.5 ``` ```{include} /22.4/source-build/pg-gvm/dependencies.md @@ -100,7 +100,7 @@ The Greenbone Security Assistant (GSA) sources consist of two parts: ```{code-block} :caption: Setting the GSA version to use -export GSA_VERSION=23.0.0 +export GSA_VERSION=23.2.1 ``` ```{include} /22.4/source-build/gsa/download.md @@ -117,7 +117,7 @@ export GSA_VERSION=23.0.0 ```{code-block} :caption: Setting the GSAd version to use -export GSAD_VERSION=22.9.0 +export GSAD_VERSION=22.11.0 ``` ```{include} /22.4/source-build/gsad/dependencies.md @@ -142,7 +142,7 @@ export GSAD_VERSION=22.9.0 ```{code-block} :caption: Setting the openvas-scanner version to use -export OPENVAS_SCANNER_VERSION=23.8.0 +export OPENVAS_SCANNER_VERSION=23.8.2 ``` ```{include} /22.4/source-build/openvas-scanner/dependencies.md @@ -182,7 +182,7 @@ export OSPD_OPENVAS_VERSION=22.7.1 ```{code-block} :caption: Setting the openvas versions to use -export OPENVAS_DAEMON=23.0.1 +export OPENVAS_DAEMON=23.8.2 ``` ```{include} /22.4/source-build/openvasd/dependencies.md From 4f96cd7f71af555ea1248ca51277f19d3fc72cdd Mon Sep 17 00:00:00 2001 From: Gabriel Schowe Date: Mon, 5 Aug 2024 09:00:09 +0200 Subject: [PATCH 065/107] Updated line 62 and 202 with ne registry --- src/_static/docker-compose-22.4.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index 8329712c..a93e84a2 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -59,7 +59,7 @@ services: - psql_socket_vol:/var/run/postgresql gvmd: - image: greenbone/gvmd:stable + image: registry.community.greenbone.net/community/gvmd:stable restart: on-failure volumes: - gvmd_data_vol:/var/lib/gvm @@ -199,7 +199,7 @@ services: condition: service_completed_successfully gvm-tools: - image: greenbone/gvm-tools + image: registry.community.greenbone.net/community/gvm-tools volumes: - gvmd_socket_vol:/run/gvmd - ospd_openvas_socket_vol:/run/ospd From eaa415ee18533a4e1a27ae7fe37a7469bba5401a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 04:38:26 +0000 Subject: [PATCH 066/107] Bump uvicorn from 0.30.3 to 0.30.5 in the python-packages group Bumps the python-packages group with 1 update: [uvicorn](https://github.com/encode/uvicorn). Updates `uvicorn` from 0.30.3 to 0.30.5 - [Release notes](https://github.com/encode/uvicorn/releases) - [Changelog](https://github.com/encode/uvicorn/blob/master/CHANGELOG.md) - [Commits](https://github.com/encode/uvicorn/compare/0.30.3...0.30.5) --- updated-dependencies: - dependency-name: uvicorn dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 49a41df5..f2aa9fbd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -882,13 +882,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.30.3" +version = "0.30.5" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.30.3-py3-none-any.whl", hash = "sha256:94a3608da0e530cea8f69683aa4126364ac18e3826b6630d1a65f4638aade503"}, - {file = "uvicorn-0.30.3.tar.gz", hash = "sha256:0d114d0831ff1adbf231d358cbf42f17333413042552a624ea6a9b4c33dcfd81"}, + {file = "uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835"}, + {file = "uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee"}, ] [package.dependencies] From 35b5954b6ab266416dccb2db20da06d0828fb4dd Mon Sep 17 00:00:00 2001 From: Jaspar Stach Date: Tue, 6 Aug 2024 12:13:46 +0200 Subject: [PATCH 067/107] Revert "Updated line 62 and 202 with ne registry" This reverts commit 4f96cd7f71af555ea1248ca51277f19d3fc72cdd. --- src/_static/docker-compose-22.4.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_static/docker-compose-22.4.yml b/src/_static/docker-compose-22.4.yml index a93e84a2..8329712c 100644 --- a/src/_static/docker-compose-22.4.yml +++ b/src/_static/docker-compose-22.4.yml @@ -59,7 +59,7 @@ services: - psql_socket_vol:/var/run/postgresql gvmd: - image: registry.community.greenbone.net/community/gvmd:stable + image: greenbone/gvmd:stable restart: on-failure volumes: - gvmd_data_vol:/var/lib/gvm @@ -199,7 +199,7 @@ services: condition: service_completed_successfully gvm-tools: - image: registry.community.greenbone.net/community/gvm-tools + image: greenbone/gvm-tools volumes: - gvmd_socket_vol:/run/gvmd - ospd_openvas_socket_vol:/run/ospd From 4e757fc1b9fd1adf23b4668e698bada54ee16405 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 04:18:09 +0000 Subject: [PATCH 068/107] Bump the python-packages group with 5 updates Bumps the python-packages group with 5 updates: | Package | From | To | | --- | --- | --- | | [furo](https://github.com/pradyunsg/furo) | `2024.7.18` | `2024.8.6` | | [babel](https://github.com/python-babel/babel) | `2.15.0` | `2.16.0` | | [pyyaml](https://github.com/yaml/pyyaml) | `6.0.1` | `6.0.2` | | [watchfiles](https://github.com/samuelcolvin/watchfiles) | `0.22.0` | `0.23.0` | | [zipp](https://github.com/jaraco/zipp) | `3.19.2` | `3.20.0` | Updates `furo` from 2024.7.18 to 2024.8.6 - [Release notes](https://github.com/pradyunsg/furo/releases) - [Changelog](https://github.com/pradyunsg/furo/blob/main/docs/changelog.md) - [Commits](https://github.com/pradyunsg/furo/compare/2024.07.18...2024.08.06) Updates `babel` from 2.15.0 to 2.16.0 - [Release notes](https://github.com/python-babel/babel/releases) - [Changelog](https://github.com/python-babel/babel/blob/master/CHANGES.rst) - [Commits](https://github.com/python-babel/babel/compare/v2.15.0...v2.16.0) Updates `pyyaml` from 6.0.1 to 6.0.2 - [Release notes](https://github.com/yaml/pyyaml/releases) - [Changelog](https://github.com/yaml/pyyaml/blob/main/CHANGES) - [Commits](https://github.com/yaml/pyyaml/compare/6.0.1...6.0.2) Updates `watchfiles` from 0.22.0 to 0.23.0 - [Release notes](https://github.com/samuelcolvin/watchfiles/releases) - [Commits](https://github.com/samuelcolvin/watchfiles/compare/v0.22.0...v0.23.0) Updates `zipp` from 3.19.2 to 3.20.0 - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.19.2...v3.20.0) --- updated-dependencies: - dependency-name: furo dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: babel dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: pyyaml dependency-type: indirect update-type: version-update:semver-patch dependency-group: python-packages - dependency-name: watchfiles dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: zipp dependency-type: indirect update-type: version-update:semver-minor dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- poetry.lock | 292 +++++++++++++++++++++++++++------------------------- 1 file changed, 153 insertions(+), 139 deletions(-) diff --git a/poetry.lock b/poetry.lock index f2aa9fbd..7601bfcd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -35,13 +35,13 @@ trio = ["trio (>=0.23)"] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] @@ -230,19 +230,19 @@ test = ["pytest (>=6)"] [[package]] name = "furo" -version = "2024.7.18" +version = "2024.8.6" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" files = [ - {file = "furo-2024.7.18-py3-none-any.whl", hash = "sha256:b192c7c1f59805494c8ed606d9375fdac6e6ba8178e747e72bc116745fb7e13f"}, - {file = "furo-2024.7.18.tar.gz", hash = "sha256:37b08c5fccc95d46d8712c8be97acd46043963895edde05b0f4f135d58325c83"}, + {file = "furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c"}, + {file = "furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01"}, ] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" -sphinx = ">=6.0,<8.0" +sphinx = ">=6.0,<9.0" sphinx-basic-ng = ">=1.0.0.beta2" [[package]] @@ -490,62 +490,64 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -901,86 +903,98 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "watchfiles" -version = "0.22.0" +version = "0.23.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.8" files = [ - {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, - {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, - {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, - {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, - {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, - {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, - {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, - {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, - {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, - {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, - {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, - {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, - {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, - {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, - {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, - {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, - {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, - {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, - {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, - {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, - {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, - {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, - {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, - {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, - {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, - {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, - {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, - {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, - {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, - {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, - {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, + {file = "watchfiles-0.23.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bee8ce357a05c20db04f46c22be2d1a2c6a8ed365b325d08af94358e0688eeb4"}, + {file = "watchfiles-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ccd3011cc7ee2f789af9ebe04745436371d36afe610028921cab9f24bb2987b"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb02d41c33be667e6135e6686f1bb76104c88a312a18faa0ef0262b5bf7f1a0f"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf12ac34c444362f3261fb3ff548f0037ddd4c5bb85f66c4be30d2936beb3c5"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0b2c25040a3c0ce0e66c7779cc045fdfbbb8d59e5aabfe033000b42fe44b53e"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf2be4b9eece4f3da8ba5f244b9e51932ebc441c0867bd6af46a3d97eb068d6"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40cb8fa00028908211eb9f8d47744dca21a4be6766672e1ff3280bee320436f1"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f48c917ffd36ff9a5212614c2d0d585fa8b064ca7e66206fb5c095015bc8207"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9d183e3888ada88185ab17064079c0db8c17e32023f5c278d7bf8014713b1b5b"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9837edf328b2805346f91209b7e660f65fb0e9ca18b7459d075d58db082bf981"}, + {file = "watchfiles-0.23.0-cp310-none-win32.whl", hash = "sha256:296e0b29ab0276ca59d82d2da22cbbdb39a23eed94cca69aed274595fb3dfe42"}, + {file = "watchfiles-0.23.0-cp310-none-win_amd64.whl", hash = "sha256:4ea756e425ab2dfc8ef2a0cb87af8aa7ef7dfc6fc46c6f89bcf382121d4fff75"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:e397b64f7aaf26915bf2ad0f1190f75c855d11eb111cc00f12f97430153c2eab"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4ac73b02ca1824ec0a7351588241fd3953748d3774694aa7ddb5e8e46aef3e3"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130a896d53b48a1cecccfa903f37a1d87dbb74295305f865a3e816452f6e49e4"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c5e7803a65eb2d563c73230e9d693c6539e3c975ccfe62526cadde69f3fda0cf"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1aa4cc85202956d1a65c88d18c7b687b8319dbe6b1aec8969784ef7a10e7d1a"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87f889f6e58849ddb7c5d2cb19e2e074917ed1c6e3ceca50405775166492cca8"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37fd826dac84c6441615aa3f04077adcc5cac7194a021c9f0d69af20fb9fa788"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7db6e36e7a2c15923072e41ea24d9a0cf39658cb0637ecc9307b09d28827e1"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2368c5371c17fdcb5a2ea71c5c9d49f9b128821bfee69503cc38eae00feb3220"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:857af85d445b9ba9178db95658c219dbd77b71b8264e66836a6eba4fbf49c320"}, + {file = "watchfiles-0.23.0-cp311-none-win32.whl", hash = "sha256:1d636c8aeb28cdd04a4aa89030c4b48f8b2954d8483e5f989774fa441c0ed57b"}, + {file = "watchfiles-0.23.0-cp311-none-win_amd64.whl", hash = "sha256:46f1d8069a95885ca529645cdbb05aea5837d799965676e1b2b1f95a4206313e"}, + {file = "watchfiles-0.23.0-cp311-none-win_arm64.whl", hash = "sha256:e495ed2a7943503766c5d1ff05ae9212dc2ce1c0e30a80d4f0d84889298fa304"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1db691bad0243aed27c8354b12d60e8e266b75216ae99d33e927ff5238d270b5"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62d2b18cb1edaba311fbbfe83fb5e53a858ba37cacb01e69bc20553bb70911b8"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e087e8fdf1270d000913c12e6eca44edd02aad3559b3e6b8ef00f0ce76e0636f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd41d5c72417b87c00b1b635738f3c283e737d75c5fa5c3e1c60cd03eac3af77"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e5f3ca0ff47940ce0a389457b35d6df601c317c1e1a9615981c474452f98de1"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6991e3a78f642368b8b1b669327eb6751439f9f7eaaa625fae67dd6070ecfa0b"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f7252f52a09f8fa5435dc82b6af79483118ce6bd51eb74e6269f05ee22a7b9f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e01bcb8d767c58865207a6c2f2792ad763a0fe1119fb0a430f444f5b02a5ea0"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e56fbcdd27fce061854ddec99e015dd779cae186eb36b14471fc9ae713b118c"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bd3e2d64500a6cad28bcd710ee6269fbeb2e5320525acd0cfab5f269ade68581"}, + {file = "watchfiles-0.23.0-cp312-none-win32.whl", hash = "sha256:eb99c954291b2fad0eff98b490aa641e128fbc4a03b11c8a0086de8b7077fb75"}, + {file = "watchfiles-0.23.0-cp312-none-win_amd64.whl", hash = "sha256:dccc858372a56080332ea89b78cfb18efb945da858fabeb67f5a44fa0bcb4ebb"}, + {file = "watchfiles-0.23.0-cp312-none-win_arm64.whl", hash = "sha256:6c21a5467f35c61eafb4e394303720893066897fca937bade5b4f5877d350ff8"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ba31c32f6b4dceeb2be04f717811565159617e28d61a60bb616b6442027fd4b9"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85042ab91814fca99cec4678fc063fb46df4cbb57b4835a1cc2cb7a51e10250e"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24655e8c1c9c114005c3868a3d432c8aa595a786b8493500071e6a52f3d09217"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b1a950ab299a4a78fd6369a97b8763732bfb154fdb433356ec55a5bce9515c1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8d3c5cd327dd6ce0edfc94374fb5883d254fe78a5e9d9dfc237a1897dc73cd1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ff785af8bacdf0be863ec0c428e3288b817e82f3d0c1d652cd9c6d509020dd0"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02b7ba9d4557149410747353e7325010d48edcfe9d609a85cb450f17fd50dc3d"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a1b05c0afb2cd2f48c1ed2ae5487b116e34b93b13074ed3c22ad5c743109f0"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:109a61763e7318d9f821b878589e71229f97366fa6a5c7720687d367f3ab9eef"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9f8e6bb5ac007d4a4027b25f09827ed78cbbd5b9700fd6c54429278dacce05d1"}, + {file = "watchfiles-0.23.0-cp313-none-win32.whl", hash = "sha256:f46c6f0aec8d02a52d97a583782d9af38c19a29900747eb048af358a9c1d8e5b"}, + {file = "watchfiles-0.23.0-cp313-none-win_amd64.whl", hash = "sha256:f449afbb971df5c6faeb0a27bca0427d7b600dd8f4a068492faec18023f0dcff"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:2dddc2487d33e92f8b6222b5fb74ae2cfde5e8e6c44e0248d24ec23befdc5366"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e75695cc952e825fa3e0684a7f4a302f9128721f13eedd8dbd3af2ba450932b8"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2537ef60596511df79b91613a5bb499b63f46f01a11a81b0a2b0dedf645d0a9c"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20b423b58f5fdde704a226b598a2d78165fe29eb5621358fe57ea63f16f165c4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b98732ec893975455708d6fc9a6daab527fc8bbe65be354a3861f8c450a632a4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee1f5fcbf5bc33acc0be9dd31130bcba35d6d2302e4eceafafd7d9018c7755ab"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f195338a5a7b50a058522b39517c50238358d9ad8284fd92943643144c0c03"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524fcb8d59b0dbee2c9b32207084b67b2420f6431ed02c18bd191e6c575f5c48"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0eff099a4df36afaa0eea7a913aa64dcf2cbd4e7a4f319a73012210af4d23810"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a8323daae27ea290ba3350c70c836c0d2b0fb47897fa3b0ca6a5375b952b90d3"}, + {file = "watchfiles-0.23.0-cp38-none-win32.whl", hash = "sha256:aafea64a3ae698695975251f4254df2225e2624185a69534e7fe70581066bc1b"}, + {file = "watchfiles-0.23.0-cp38-none-win_amd64.whl", hash = "sha256:c846884b2e690ba62a51048a097acb6b5cd263d8bd91062cd6137e2880578472"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a753993635eccf1ecb185dedcc69d220dab41804272f45e4aef0a67e790c3eb3"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6bb91fa4d0b392f0f7e27c40981e46dda9eb0fbc84162c7fb478fe115944f491"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1f67312efa3902a8e8496bfa9824d3bec096ff83c4669ea555c6bdd213aa516"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ca6b71dcc50d320c88fb2d88ecd63924934a8abc1673683a242a7ca7d39e781"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aec5c29915caf08771d2507da3ac08e8de24a50f746eb1ed295584ba1820330"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1733b9bc2c8098c6bdb0ff7a3d7cb211753fecb7bd99bdd6df995621ee1a574b"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02ff5d7bd066c6a7673b17c8879cd8ee903078d184802a7ee851449c43521bdd"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18e2de19801b0eaa4c5292a223effb7cfb43904cb742c5317a0ac686ed604765"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8ada449e22198c31fb013ae7e9add887e8d2bd2335401abd3cbc55f8c5083647"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3af1b05361e1cc497bf1be654a664750ae61f5739e4bb094a2be86ec8c6db9b6"}, + {file = "watchfiles-0.23.0-cp39-none-win32.whl", hash = "sha256:486bda18be5d25ab5d932699ceed918f68eb91f45d018b0343e3502e52866e5e"}, + {file = "watchfiles-0.23.0-cp39-none-win_amd64.whl", hash = "sha256:d2d42254b189a346249424fb9bb39182a19289a2409051ee432fb2926bad966a"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9265cf87a5b70147bfb2fec14770ed5b11a5bb83353f0eee1c25a81af5abfe"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f02a259fcbbb5fcfe7a0805b1097ead5ba7a043e318eef1db59f93067f0b49b"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebaebb53b34690da0936c256c1cdb0914f24fb0e03da76d185806df9328abed"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd257f98cff9c6cb39eee1a83c7c3183970d8a8d23e8cf4f47d9a21329285cee"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aba037c1310dd108411d27b3d5815998ef0e83573e47d4219f45753c710f969f"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a96ac14e184aa86dc43b8a22bb53854760a58b2966c2b41580de938e9bf26ed0"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11698bb2ea5e991d10f1f4f83a39a02f91e44e4bd05f01b5c1ec04c9342bf63c"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efadd40fca3a04063d40c4448c9303ce24dd6151dc162cfae4a2a060232ebdcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:556347b0abb4224c5ec688fc58214162e92a500323f50182f994f3ad33385dcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1cf7f486169986c4b9d34087f08ce56a35126600b6fef3028f19ca16d5889071"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f18de0f82c62c4197bea5ecf4389288ac755896aac734bd2cc44004c56e4ac47"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:532e1f2c491274d1333a814e4c5c2e8b92345d41b12dc806cf07aaff786beb66"}, + {file = "watchfiles-0.23.0.tar.gz", hash = "sha256:9338ade39ff24f8086bb005d16c29f8e9f19e55b18dcb04dfa26fcbc09da497b"}, ] [package.dependencies] @@ -1069,13 +1083,13 @@ files = [ [[package]] name = "zipp" -version = "3.19.2" +version = "3.20.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, + {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, ] [package.extras] From 2397d87d6b96fdd8f082548fb1cadcd5d94d6837 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:33:21 +0900 Subject: [PATCH 069/107] Update src/feed-sync.md Correct product name with capital letters. Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 6f872c5c..36a4850a 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -5,7 +5,7 @@ This documentation provides instructions on updating the various feeds for your ```{warning} Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). ``` -If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. +If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone Community Forum](https://forum.greenbone.net/). ## A Note About Deprecated Sync Scripts Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based script with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. From aec90f75cacde498c4749e3f83cf08cbdd276a2c Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:33:43 +0900 Subject: [PATCH 070/107] Update src/feed-sync.md make title more susinct Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 36a4850a..a45818bc 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -7,7 +7,7 @@ This documentation provides instructions on updating the various feeds for your If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone Community Forum](https://forum.greenbone.net/). -## A Note About Deprecated Sync Scripts +## About Deprecated Sync Scripts Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based script with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. Usually, legacy feed sync scripts can be identified by their location. The depreciated bash scripts are usually found in the `/usr/local/sbin` or `/usr/sbin` directories, while the newer Python-based scripts are typically located in the `/usr/local/bin` or `$HOME/.local/bin` directories, depending on your installation method. From c25d8d45e92ae3b074f331c413f013f4d0289a6d Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:34:22 +0900 Subject: [PATCH 071/107] Update src/feed-sync.md Correct the pluralization for number of Greenbone feed-sync scripts in the package. Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index a45818bc..47e38b61 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -8,7 +8,7 @@ This documentation provides instructions on updating the various feeds for your If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone Community Forum](https://forum.greenbone.net/). ## About Deprecated Sync Scripts -Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based script with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. +Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based scripts with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. Usually, legacy feed sync scripts can be identified by their location. The depreciated bash scripts are usually found in the `/usr/local/sbin` or `/usr/sbin` directories, while the newer Python-based scripts are typically located in the `/usr/local/bin` or `$HOME/.local/bin` directories, depending on your installation method. From ef915da84ed2bc0038129f6afce011da95c36365 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:35:10 +0900 Subject: [PATCH 072/107] Update src/feed-sync.md Add extra paragraph spacing Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/feed-sync.md b/src/feed-sync.md index 47e38b61..bc6267f4 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -13,6 +13,7 @@ Please note that there is currently a migration from the older set of bash scrip Usually, legacy feed sync scripts can be identified by their location. The depreciated bash scripts are usually found in the `/usr/local/sbin` or `/usr/sbin` directories, while the newer Python-based scripts are typically located in the `/usr/local/bin` or `$HOME/.local/bin` directories, depending on your installation method. If you want to check which scripts you have installed you can use the `which` command to identify the active script's path: + ```{code-block} :caption: Verify the path of the active feed command executable which From 55347bc8752b43108599fc356b3dd9791382ad12 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:35:39 +0900 Subject: [PATCH 073/107] Update src/feed-sync.md Correct grammar in section title Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index bc6267f4..e4f03329 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -213,7 +213,7 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: -### Use nping +### Using nping The `nping` command is part of the `nmap` tool and is availble for Linux and Windows systems. It can be used to track a TCP connection on a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules that maybe blocking the `rsync` port `873`. Please note `nping --tcp` command requires `sudo` or root permissions. You can find more information at the [nping reference guide](https://nmap.org/book/nping-man.html). ```{code-block} :caption: Using nping to test the connectivity of port 873 From 558ffc42f6bf8a81dc42b61e4f1737c87353a941 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:36:17 +0900 Subject: [PATCH 074/107] Update src/feed-sync.md Correct grammatical mistakes and improved style Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index e4f03329..206803ff 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -214,7 +214,7 @@ community Greenbone community feed, see https://community.greenbone.net/ If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: ### Using nping -The `nping` command is part of the `nmap` tool and is availble for Linux and Windows systems. It can be used to track a TCP connection on a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules that maybe blocking the `rsync` port `873`. Please note `nping --tcp` command requires `sudo` or root permissions. You can find more information at the [nping reference guide](https://nmap.org/book/nping-man.html). +The `nping` command is part of the `nmap` tool and is availble for Linux and Windows systems. It can be used to track a TCP connection on a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules that may be blocking the `rsync` port `873`. Please note that the `nping --tcp` command requires `sudo` or root permissions. You can find more information in the [nping reference guide](https://nmap.org/book/nping-man.html). ```{code-block} :caption: Using nping to test the connectivity of port 873 sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net From 14e15a2e25db7e32caca85228580f4f295c520c6 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:36:37 +0900 Subject: [PATCH 075/107] Update src/feed-sync.md Correct title Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 206803ff..8e07b54a 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -220,7 +220,7 @@ The `nping` command is part of the `nmap` tool and is availble for Linux and Win sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use tcptraceroute +### Using tcptraceroute If you cannot install `nmap` on your host, you can use `tcptraceroute` on Linux/Unix based systems. ```{code-block} :caption: Using tcptraceroute to test the connectivity of port 873 From e0f351cef87e6447d12c477102444a2f1650f010 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:37:05 +0900 Subject: [PATCH 076/107] Update src/feed-sync.md Add paragraph spacing Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/feed-sync.md b/src/feed-sync.md index 8e07b54a..26529305 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -222,6 +222,7 @@ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ### Using tcptraceroute If you cannot install `nmap` on your host, you can use `tcptraceroute` on Linux/Unix based systems. + ```{code-block} :caption: Using tcptraceroute to test the connectivity of port 873 tcptraceroute -p 873 feed.community.greenbone.net From aac3c4271d3958d1100180657de13788093bdcd1 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:37:52 +0900 Subject: [PATCH 077/107] Update src/feed-sync.md Add hyphen for improved style Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 26529305..b8e906cd 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -178,7 +178,7 @@ The Python-based feed sync scripts will automatically change context to the `gvm After the sync operation completes, you can verify the successful update of the feed data by visiting the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed and the **Version** column will indicate the date/time of the feed's release. ## Automating Feed Sync Updates -The Greenbone feeds are not automatically synced for the Greenbone Community source code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. +The Greenbone feeds are not automatically synced for the Greenbone Community source-code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. ```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via **crontab**. ``` From fea2ceb306a75119bc47520bd025fa151b57d42e Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:47:43 +0900 Subject: [PATCH 078/107] Update src/feed-sync.md Co-authored-by: Jaspar Stach --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index b8e906cd..a4b41d34 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,6 +1,6 @@ # Feed Sync Guide -This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. +This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Community Containers. ```{warning} Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). ``` From 86708106a3af5df6f2fdd1fe00330344d6f32aef Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:47:59 +0900 Subject: [PATCH 079/107] Update src/feed-sync.md Co-authored-by: Jaspar Stach --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index a4b41d34..e2b18aa2 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -2,7 +2,7 @@ # Feed Sync Guide This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Community Containers. -```{warning} Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +```{warning} Feed sync information for Greenbone Community Containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). ``` If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone Community Forum](https://forum.greenbone.net/). From 4cddf2ffa8dfeb29ce7da512e42898714302200b Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:48:11 +0900 Subject: [PATCH 080/107] Update src/feed-sync.md Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index e2b18aa2..93010a9a 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -15,7 +15,7 @@ Usually, legacy feed sync scripts can be identified by their location. The depre If you want to check which scripts you have installed you can use the `which` command to identify the active script's path: ```{code-block} -:caption: Verify the path of the active feed command executable +:caption: Verifying the path of the active feed command executable which ``` Once you have identified the active feed sync executable path, you can verify whether it is a legacy bash feed sync script, or the newer Python-based script by checking the file header. The first line of the legacy scripts will be `#!/bin/sh` while the newer versions will be `#!/usr/bin/python3`. From 59cd4cbc2b0611e4f4b1979f4fd2ab14a4840a3b Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:48:21 +0900 Subject: [PATCH 081/107] Update src/feed-sync.md Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/feed-sync.md b/src/feed-sync.md index 93010a9a..e9e88e6f 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -18,7 +18,9 @@ If you want to check which scripts you have installed you can use the `which` co :caption: Verifying the path of the active feed command executable which ``` + Once you have identified the active feed sync executable path, you can verify whether it is a legacy bash feed sync script, or the newer Python-based script by checking the file header. The first line of the legacy scripts will be `#!/bin/sh` while the newer versions will be `#!/usr/bin/python3`. + ```{code-block} :caption: Check the shebang to determine the script type head -1 /path/to/ From c8b1bb488fce4b1276d041e344fa8867d2bce513 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:48:34 +0900 Subject: [PATCH 082/107] Update src/feed-sync.md Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index e9e88e6f..a23f6dd7 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -22,7 +22,7 @@ which Once you have identified the active feed sync executable path, you can verify whether it is a legacy bash feed sync script, or the newer Python-based script by checking the file header. The first line of the legacy scripts will be `#!/bin/sh` while the newer versions will be `#!/usr/bin/python3`. ```{code-block} -:caption: Check the shebang to determine the script type +:caption: Checking the shebang to determine the script type head -1 /path/to/ ``` From 8844977b5ebe1f4380bac9922213d4dcbfc0fe57 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:48:42 +0900 Subject: [PATCH 083/107] Update src/feed-sync.md Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index a23f6dd7..797eae1c 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -26,7 +26,7 @@ Once you have identified the active feed sync executable path, you can verify wh head -1 /path/to/ ``` -### Deprecated Sync Script Removal +### Removing Deprecated Sync Scripts If you have any of the deprecated bash scripts installed, it is recommended to delete them. This ensures a clean transition to the new sync script. ### Legacy Feed Sync Filenames From c4e12a1563f4d5087151c7cd376ac556c1a9eba9 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:48:56 +0900 Subject: [PATCH 084/107] Update src/feed-sync.md Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 797eae1c..d5d0518c 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -38,7 +38,7 @@ These are the legacy feed sync files and a description of their functionality: * `greenbone-nvt-sync`: This script is equivalent to `greenbone-feed-sync --type GVMD_DATA`. ## The New Python Feed Sync Scripts -A set of new Python-based scripts have now replaced the deprecated feed sync scripts mentioned above. The new scripts are supported by **Greenbone version 22.4 and later**. However, older versions are not supported. The new Python-based scripts are now installed by default as of **Greenbone Community Edition version 22.5.0**. For backwards compatibility the new Python scripts have identical names to the original bash scripts. +A set of new Python-based scripts has now replaced the deprecated feed sync scripts mentioned above. The new scripts are supported by **Greenbone version 22.4 and later**. However, older versions are not supported. The new Python-based scripts are now installed by default as of **Greenbone Community Edition version 22.5.0**. For backwards compatibility the new Python scripts have identical names to the original bash scripts. * `greenbone-feed-sync`: This is the base script. if no `--type` argument is set, all feed types will be updated. The `--type ` argument can be used to specify which data to synchronize. A list of available feed types can be [found here](#available-feed-types). * `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type cert` and is provided for backwards compatibility only. From 8aa92aec79f360459512b4c889cb51187a426898 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:49:05 +0900 Subject: [PATCH 085/107] Update src/feed-sync.md Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index d5d0518c..e294aa3c 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -48,7 +48,7 @@ A set of new Python-based scripts has now replaced the deprecated feed sync scri More information about executing the scripts can be [found here](#updating-feeds-with-new-python-script). ### Installation -Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the operating system **PATH**, which is normally configured as part of Greenbone Community Edition's source code and Docker container installation methods. +Python 3.9 and later is supported. Also note that syncing feeds requires the `rsync` tool being installed and available within the operating system **PATH**, which is normally configured as part of Greenbone Community Edition's source code and Docker container installation methods. #### Install using pipx You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/). From deb33789881b16f069ff328af8a3448951d956bb Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:49:17 +0900 Subject: [PATCH 086/107] Update src/feed-sync.md Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index e294aa3c..4c13bfdd 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -50,7 +50,7 @@ More information about executing the scripts can be [found here](#updating-feeds ### Installation Python 3.9 and later is supported. Also note that syncing feeds requires the `rsync` tool being installed and available within the operating system **PATH**, which is normally configured as part of Greenbone Community Edition's source code and Docker container installation methods. -#### Install using pipx +#### Installation Using pipx You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/). ```{code-block} :caption: Installing the package via pipx From f5216d8d906a3d3174524670518f96f9d6982f88 Mon Sep 17 00:00:00 2001 From: Joseph <141339740+syspect-sec@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:50:58 +0900 Subject: [PATCH 087/107] Apply suggestions from code review Batch commit for changes Co-authored-by: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> --- src/feed-sync.md | 58 +++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 4c13bfdd..8e90ca33 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -52,39 +52,45 @@ Python 3.9 and later is supported. Also note that syncing feeds requires the `rs #### Installation Using pipx You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/). + ```{code-block} :caption: Installing the package via pipx python3 -m pipx install greenbone-feed-sync ``` -#### Install using pip -NOTE: The pip install command no longer works out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. +#### Installation Using pip +:::{note} +The pip install command no longer works out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pip](https://pip.pypa.io/). + ```{code-block} :caption: Installing the package via python-pip python3 -m pip install greenbone-feed-sync ``` ## Updating the Greenbone Feeds -### Updating Feeds For Greenbone Docker Containers +### Updating Feeds for Greenbone Docker Containers ```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). ``` -### Determining The Script Version In Use -If you are unsure of which version of the feed sync script is active, you should check before you execute the `greenbone-feed-sync` command.One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. +### Determining the Script Version in Use +If you are unsure of which version of the feed sync script is active, you should check this before executing the `greenbone-feed-sync` command. One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. To check the file header, use the `which` command to determine the path of the command that is executed. For example: + ```{code-block} -:caption: Check the path of the active feed sync script +:caption: Checking the path of the active feed sync script which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync ``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at run-time. + +Once you determined the path of the executed command, you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at run-time. For example: + ```{code-block} :caption: If the new Python-based feed update script is active you will see head -1 /usr/local/bin/greenbone-feed-sync @@ -97,17 +103,19 @@ head -1 /usr/local/sbin/greenbone-feed-sync ``` ### Updating Feeds With New Python Script -By default, when no arguments are passed, the new Python `greenbone-feed-sync` will updated all feed types. For standard installations that follow the [official Greenbone source code install instructions](https://greenbone.github.io/docs/latest/22.4/source-build/index.html), or the [Kali Linux native package installation](https://greenbone.github.io/docs/latest/22.4/kali/index.html), the new Python script should be run with `root`/`sudo` permissions, as it will change its execution context appropriately to the `gvm` or `_gvm` user. +By default, when no arguments are passed, the new Python `greenbone-feed-sync` will update all feed types. For standard installations that follow the [official Greenbone source-code install instructions](https://greenbone.github.io/docs/latest/22.4/source-build/index.html), or the [Kali Linux native package installation](https://greenbone.github.io/docs/latest/22.4/kali/index.html), the new Python script should be run with `root`/`sudo` permissions, as it will change its execution context appropriately to the `gvm` or `_gvm` user. However, for non-standard installations that use a different username and group to execute the Greenbone components, the configured username and group context must be changed via the `greenbone-feed-sync.toml` configuration file. A basic example of how to configure a non-standard user via the `.toml` file can be [found here](https://github.com/greenbone/greenbone-feed-sync/blob/main/README.md#usage-on-kali-linux). ```{code-block} -:caption: Update all feeds with single command +:caption: Updating all feeds with single command sudo greenbone-feed-sync ``` + To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type. + ```{code-block} -:caption: Include the feed type as an argument to update only a specific feed type +:caption: Including the feed type as an argument to update only a specific feed type sudo greenbone-feed-sync --type ``` @@ -119,9 +127,9 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes port lists, scan configs and report formats * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: Fetch any newly available NOTUS vulnerability tests -* `nasl`: Fetch any newly available NASL vulnerability tests -* `report-format` or `report-formats`: Fetches any newly available scan report formats +* `notus`: Fetches any newly available Notus vulnerability tests +* `nasl`: Fetches any newly available NASL vulnerability tests +* `report-format` or `report-formats`: Fetches any newly available report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations * `port-list` or `port-lists`: Fetches any newly available port lists @@ -137,7 +145,7 @@ A complete list of settings are [available here](https://github.com/greenbone/gr The most basic arguments are: * `--help`: Displays list of all available command line arguments -* `--verbose`: Sets verbose output. `-vvv` provides maximum verbosity. +* `--verbose`: Sets verbose output (`-vvv` provides maximum verbosity) * `--version`: Displays the version of the script * `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not * `--describe`: Displays a description of the script and the feed it synchronizes @@ -146,22 +154,22 @@ The most basic arguments are: * `--feedcurrent`: Checks if the feed is already up to date ### Updating Feeds With Legacy Bash Scripts (Not Recommended) -If you absolutely cannot update to the new Python-based feed sync scripts because you are using a version of Greenbone prior to 22.4, or another reason, it's important to note that the legacy bash scripts can be run as the `sudo`/`root` user or the `gvm` user standard installations (`_gvm` on legacy versions of Kali). However, for non-standard installations that use a different username for the Greenbone components, the feed sync script should be run from the appropriate user context. Also, to update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. +If you absolutely cannot update to the new Python-based feed sync scripts because you are using a version of Greenbone prior to 22.4, or another reason, it is important to note that the legacy bash scripts can be run as the `sudo`/`root` user or the `gvm` user standard installations (`_gvm` on legacy versions of Kali). However, for non-standard installations that use a different username for the Greenbone components, the feed sync script should be run from the appropriate user context. Also, to update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. For example: ```{code-block} -:caption: Update feeds with legacy bash script +:caption: Updating feeds with legacy bash script sudo -u gvm greenbone-feed-sync --type ``` -Using one of the following values to replace **\**: +Use one of the following values to replace **\**: * `CERT`: Synchronizes CERT data feed * `SCAP`: Synchronizes SCAP data feed * `GVMD_DATA`: Synchronizes gvmd data feed -### Updating Feeds For Kali Linux Native Installation +### Updating Feeds for Kali Linux Native Installation Some older versions of Kali Linux include the `gvm-feed-update` command for feed synchronization. However, the wrapper script has been depreciated in newer versions of Kali and Greenbone's official `greenbone-feed-sync` command must be used instead. To update all feeds for versions of Kali Linux that include the `gvm-feed-update` script issue the following command can be used: @@ -173,11 +181,11 @@ To update all feeds for versions of Kali Linux that include the `gvm-feed-update Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. -### Configuring The Feed Sync User For Non-Standard Installations +### Configuring the Feed Sync User for Non-Standard Installations The Python-based feed sync scripts will automatically change context to the `gvm` user in order to process the feeds. Since the Kali native installation uses the `_gvm` user, it comes preconfigured with a `.toml` file which specifies the appropriate user context. The `greenbone-feed-sync` script will look for this configuration file at the locations `~/.config/greenbone-feed-sync.toml` and `/etc/gvm/greenbone-feed-sync.toml`. If you have configured a Greenbone source code installation with a non-standard username and group such as `_gvm` you must add the user and group context to the `/etc/gvm/greenbone-feed-sync.toml` file, configure the appropriate environment variable, or supply the user context via the `--user` and `--group` command line arguments. ### Verifying Successful Feed Sync Update -After the sync operation completes, you can verify the successful update of the feed data by visiting the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed and the **Version** column will indicate the date/time of the feed's release. +After the sync operation completes, you can verify the successful update of the feed data by visiting the *Feed Status* page which can be found under *Administration* in the menu bar of GSA. If a feed was successfully updated you will see **Current** beside the particular feed and the **Version** column will indicate the date/time of the feed's release. ## Automating Feed Sync Updates The Greenbone feeds are not automatically synced for the Greenbone Community source-code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. @@ -185,13 +193,16 @@ The Greenbone feeds are not automatically synced for the Greenbone Community sou ```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via **crontab**. ``` -## Troubleshooting A Connection To The Greenbone Feeds -To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. +## Troubleshooting a Connection to the Greenbone Feeds +To troubleshoot a connection to the Greenbone feeds, you can issue the following command from a terminal. + ```{code-block} -:caption: Verify an rsync connection to the Greenbone feeds +:caption: Verifying an rsync connection to the Greenbone feeds rsync rsync://feed.community.greenbone.net/community ``` + You should see output such as the following: + ```{code-block} :caption: Expected output when verifying an rsync connection to the Greenbone feeds Greenbone community feed server - http://feed.community.greenbone.net/ @@ -213,6 +224,7 @@ cert-data Greenbone community CERT data feed, see https://community.greenbone.n community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ community Greenbone community feed, see https://community.greenbone.net/ ``` + If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: ### Using nping From 654e7423c6677cf6fd9863ae48795650a328bb73 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:44:39 -0400 Subject: [PATCH 088/107] Create gvm-feed-sync-docs The first version of a comprehensive feed synchronization documentation. --- gvm-feed-sync-docs | 185 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 gvm-feed-sync-docs diff --git a/gvm-feed-sync-docs b/gvm-feed-sync-docs new file mode 100644 index 00000000..a3929f69 --- /dev/null +++ b/gvm-feed-sync-docs @@ -0,0 +1,185 @@ + +# Greenbone Feed Sync Update Guide + +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. + +If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. + +## A Note About Deprecated Sync Scripts +The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: +``` +$ which +``` +- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. +- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. +- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. +- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. + +### Deprecated Sync Scripts Removal +**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + +## Introduction Of The New Python Feed Sync Script +A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. + +The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). + +### Installation +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. + +#### Install using pipx +You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) +``` +$ python3 -m pipx install pontos +``` + +#### Install using pip +NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. + +You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) +``` +$ python3 -m pip install greenbone-feed-sync +``` + +## Instructions For Updating the Greenbone Feeds + +### Determine Which Command Is In Use +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. + +For example: +``` +$ which greenbone-feed-sync +/usr/local/bin/greenbone-feed-sync +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. + +For example: +``` +# If the new Python-based feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/usr/bin/python3 +``` +``` +# If the legacy bash feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/bin/sh +``` + +### Updating Feeds With New Python Script +By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. +``` +# Update all feeds with single command +$ sudo greenbone-feed-sync +``` +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. +``` +# Include the feed type as an argument to update only a specific feed type +$ greenbone-feed-sync --type +``` +The available feed types are: + +* `all`: same as using the command without specifying a type +* `nvt`: Fetches any newly available vulnerability tests +* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `scap`: Synchronizes SCAP data feed +* `cert`: Synchronizes CERT data feed +* `notus`: [???] +* `nasl`: [???] +* `report-format` or `report-formats`: Fetches any newly available scan report formats +* `scan-config` or `scan-configs`: Fetches any newly available scan configurations +* `port-list` or `port-lists`: Fetches any newly available port lists + +For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). + +### Updating Feeds With Legacy Bash Script + +To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. +``` +# Update feeds with legacy bash script +$ sudo -u gvm greenbone-feed-sync --type +``` +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + +Other arguments that can be passed to the legacy command incldue: + +* `--version`: Displays the version of the script +* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not +* `--describe`: Displays a description of the script and the feed it synchronizes +* `--feedversion`: Displays the version of the feed +* `--selftest`: Performs a self-test to check if all required utilities are available +* `--feedcurrent`: Checks if the feed is already up to date + +### Updating Feeds For Kali Linux Native Installation +Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +``` +┌──(dev㉿kali)-[~] +└─$ sudo gvm-feed-update +``` +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. + +### Verifying Successfull Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. + +## Automating Feed Sync Updates +The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. + +1. [MORE] + +2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: +``` +┌──(dev㉿kali)-[~] +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +_gvm +``` +``` +$ awk -F: '{ print $1}' /etc/passwd | grep gvm +gvm +``` + +## Troubleshooting A Connection To The Greenbone Feeds +To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. +``` +$ rsync rsync://feed.community.greenbone.net/community +``` +You should see output such as the following: +``` +Greenbone community feed server - http://feed.community.greenbone.net/ +This service is hosted by Greenbone Networks - http://www.greenbone.net/ + +All transactions are logged. + +If you have any questions, please use the Greenbone community portal. +See https://community.greenbone.net for details. + +By using this service you agree to our terms and conditions. + +Only one sync per time, otherwise the source ip will be temporarily blocked. + +data-objects Greenbone community data objects, see https://community.greenbone.net/ +nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ +scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ +cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ +community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ +community Greenbone community feed, see https://community.greenbone.net/ +``` +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: + +### Use nping + +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +``` +$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net +``` +### Use traceroute/tracert +If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. +``` +# For Linux/Unix systems +$ traceroute feed.community.greenbone.net +``` +``` +# For Windows systems +$ tracert feed.community.greenbone.net +``` From 0cc42abe657f6626d83c324ebc7d1434e0ec0c20 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:45:25 -0400 Subject: [PATCH 089/107] Delete gvm-feed-sync-docs --- gvm-feed-sync-docs | 185 --------------------------------------------- 1 file changed, 185 deletions(-) delete mode 100644 gvm-feed-sync-docs diff --git a/gvm-feed-sync-docs b/gvm-feed-sync-docs deleted file mode 100644 index a3929f69..00000000 --- a/gvm-feed-sync-docs +++ /dev/null @@ -1,185 +0,0 @@ - -# Greenbone Feed Sync Update Guide - -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. - -If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. - -## A Note About Deprecated Sync Scripts -The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: -``` -$ which -``` -- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. -- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. -- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. -- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. - -### Deprecated Sync Scripts Removal -**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - -## Introduction Of The New Python Feed Sync Script -A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. - -The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). - -### Installation -Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. - -#### Install using pipx -You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) -``` -$ python3 -m pipx install pontos -``` - -#### Install using pip -NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. - -You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) -``` -$ python3 -m pip install greenbone-feed-sync -``` - -## Instructions For Updating the Greenbone Feeds - -### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. - -For example: -``` -$ which greenbone-feed-sync -/usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. - -For example: -``` -# If the new Python-based feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync -#!/usr/bin/python3 -``` -``` -# If the legacy bash feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync -#!/bin/sh -``` - -### Updating Feeds With New Python Script -By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. -``` -# Update all feeds with single command -$ sudo greenbone-feed-sync -``` -To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. -``` -# Include the feed type as an argument to update only a specific feed type -$ greenbone-feed-sync --type -``` -The available feed types are: - -* `all`: same as using the command without specifying a type -* `nvt`: Fetches any newly available vulnerability tests -* `gvmd-data`: Synchronizes GVM data feed which includes [???] -* `scap`: Synchronizes SCAP data feed -* `cert`: Synchronizes CERT data feed -* `notus`: [???] -* `nasl`: [???] -* `report-format` or `report-formats`: Fetches any newly available scan report formats -* `scan-config` or `scan-configs`: Fetches any newly available scan configurations -* `port-list` or `port-lists`: Fetches any newly available port lists - -For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). - -### Updating Feeds With Legacy Bash Script - -To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -``` -# Update feeds with legacy bash script -$ sudo -u gvm greenbone-feed-sync --type -``` -Using one of the following values to replace **\**: - -* `CERT`: Synchronizes CERT data feed -* `SCAP`: Synchronizes SCAP data feed -* `GVMD_DATA`: Synchronizes gvmd data feed - -Other arguments that can be passed to the legacy command incldue: - -* `--version`: Displays the version of the script -* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not -* `--describe`: Displays a description of the script and the feed it synchronizes -* `--feedversion`: Displays the version of the feed -* `--selftest`: Performs a self-test to check if all required utilities are available -* `--feedcurrent`: Checks if the feed is already up to date - -### Updating Feeds For Kali Linux Native Installation -Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows -``` -┌──(dev㉿kali)-[~] -└─$ sudo gvm-feed-update -``` -Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. - -### Verifying Successfull Feed Sync Update -After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. - -## Automating Feed Sync Updates -The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. - -1. [MORE] - -2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: -``` -┌──(dev㉿kali)-[~] -└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm -_gvm -``` -``` -$ awk -F: '{ print $1}' /etc/passwd | grep gvm -gvm -``` - -## Troubleshooting A Connection To The Greenbone Feeds -To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -``` -$ rsync rsync://feed.community.greenbone.net/community -``` -You should see output such as the following: -``` -Greenbone community feed server - http://feed.community.greenbone.net/ -This service is hosted by Greenbone Networks - http://www.greenbone.net/ - -All transactions are logged. - -If you have any questions, please use the Greenbone community portal. -See https://community.greenbone.net for details. - -By using this service you agree to our terms and conditions. - -Only one sync per time, otherwise the source ip will be temporarily blocked. - -data-objects Greenbone community data objects, see https://community.greenbone.net/ -nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ -scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ -cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ -community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ -community Greenbone community feed, see https://community.greenbone.net/ -``` -If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: - -### Use nping - -The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. -``` -$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net -``` -### Use traceroute/tracert -If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. -``` -# For Linux/Unix systems -$ traceroute feed.community.greenbone.net -``` -``` -# For Windows systems -$ tracert feed.community.greenbone.net -``` From e1399ff1744e71232f72bb8f7e591fb0c2ef43d3 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:46:14 -0400 Subject: [PATCH 090/107] Create greenbone-feed-sync-docs.md The first draft of a comprehensive Greenbone feed sync instruction manual --- greenbone-feed-sync-docs.md | 185 ++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 greenbone-feed-sync-docs.md diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md new file mode 100644 index 00000000..a3929f69 --- /dev/null +++ b/greenbone-feed-sync-docs.md @@ -0,0 +1,185 @@ + +# Greenbone Feed Sync Update Guide + +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. + +If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. + +## A Note About Deprecated Sync Scripts +The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: +``` +$ which +``` +- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. +- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. +- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. +- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. + +### Deprecated Sync Scripts Removal +**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + +## Introduction Of The New Python Feed Sync Script +A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. + +The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). + +### Installation +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. + +#### Install using pipx +You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) +``` +$ python3 -m pipx install pontos +``` + +#### Install using pip +NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. + +You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) +``` +$ python3 -m pip install greenbone-feed-sync +``` + +## Instructions For Updating the Greenbone Feeds + +### Determine Which Command Is In Use +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. + +For example: +``` +$ which greenbone-feed-sync +/usr/local/bin/greenbone-feed-sync +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. + +For example: +``` +# If the new Python-based feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/usr/bin/python3 +``` +``` +# If the legacy bash feed update script is active you will see +$ head -1 /usr/local/bin/greenbone-feed-sync +#!/bin/sh +``` + +### Updating Feeds With New Python Script +By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. +``` +# Update all feeds with single command +$ sudo greenbone-feed-sync +``` +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. +``` +# Include the feed type as an argument to update only a specific feed type +$ greenbone-feed-sync --type +``` +The available feed types are: + +* `all`: same as using the command without specifying a type +* `nvt`: Fetches any newly available vulnerability tests +* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `scap`: Synchronizes SCAP data feed +* `cert`: Synchronizes CERT data feed +* `notus`: [???] +* `nasl`: [???] +* `report-format` or `report-formats`: Fetches any newly available scan report formats +* `scan-config` or `scan-configs`: Fetches any newly available scan configurations +* `port-list` or `port-lists`: Fetches any newly available port lists + +For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). + +### Updating Feeds With Legacy Bash Script + +To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. +``` +# Update feeds with legacy bash script +$ sudo -u gvm greenbone-feed-sync --type +``` +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + +Other arguments that can be passed to the legacy command incldue: + +* `--version`: Displays the version of the script +* `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not +* `--describe`: Displays a description of the script and the feed it synchronizes +* `--feedversion`: Displays the version of the feed +* `--selftest`: Performs a self-test to check if all required utilities are available +* `--feedcurrent`: Checks if the feed is already up to date + +### Updating Feeds For Kali Linux Native Installation +Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +``` +┌──(dev㉿kali)-[~] +└─$ sudo gvm-feed-update +``` +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. + +### Verifying Successfull Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. + +## Automating Feed Sync Updates +The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. + +1. [MORE] + +2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: +``` +┌──(dev㉿kali)-[~] +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +_gvm +``` +``` +$ awk -F: '{ print $1}' /etc/passwd | grep gvm +gvm +``` + +## Troubleshooting A Connection To The Greenbone Feeds +To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. +``` +$ rsync rsync://feed.community.greenbone.net/community +``` +You should see output such as the following: +``` +Greenbone community feed server - http://feed.community.greenbone.net/ +This service is hosted by Greenbone Networks - http://www.greenbone.net/ + +All transactions are logged. + +If you have any questions, please use the Greenbone community portal. +See https://community.greenbone.net for details. + +By using this service you agree to our terms and conditions. + +Only one sync per time, otherwise the source ip will be temporarily blocked. + +data-objects Greenbone community data objects, see https://community.greenbone.net/ +nvt-feed Greenbone community NVT feed, see https://community.greenbone.net/ +scap-data Greenbone community SCAP data feed, see https://community.greenbone.net/ +cert-data Greenbone community CERT data feed, see https://community.greenbone.net/ +community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ +community Greenbone community feed, see https://community.greenbone.net/ +``` +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: + +### Use nping + +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +``` +$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net +``` +### Use traceroute/tracert +If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. +``` +# For Linux/Unix systems +$ traceroute feed.community.greenbone.net +``` +``` +# For Windows systems +$ tracert feed.community.greenbone.net +``` From 944962270290c23d6b08c10c893ebfdf2cb738d4 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:53:21 -0400 Subject: [PATCH 091/107] Update greenbone-feed-sync-docs.md updates for clarity --- greenbone-feed-sync-docs.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index a3929f69..ac037815 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,7 +1,7 @@ # Greenbone Feed Sync Update Guide -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/sbin/greenbone-feed-sync` old bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. +This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. @@ -17,7 +17,7 @@ $ which ### Deprecated Sync Scripts Removal **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -43,14 +43,14 @@ $ python3 -m pip install greenbone-feed-sync ## Instructions For Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: ``` $ which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: ``` @@ -72,7 +72,7 @@ $ sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. ``` -# Include the feed type as an argument to update only a specific feed type +# Include the feed type as an argument to update only a specific feed type $ greenbone-feed-sync --type ``` The available feed types are: @@ -82,7 +82,7 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: [???] +* `notus`: [???] * `nasl`: [???] * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations @@ -124,7 +124,9 @@ Please note that the `gvm-feed-update` command mentioned above is not maintained After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. ## Automating Feed Sync Updates -The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the `greenbone-feed-sync` commands. If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. +The Greenbone feeds are not automatically synced in the case of a Greenbone Community source code installation, for the Greenbone Community Docker containers, or the Greenbone native Kali Linux installation. The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the appropriate commands. + +If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. 1. [MORE] @@ -167,13 +169,13 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. ``` $ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. ``` # For Linux/Unix systems From 2bdd6bb2ae6f5245b7255e9e23a54d73d849f279 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 12 Jul 2023 16:57:13 -0400 Subject: [PATCH 092/107] Update greenbone-feed-sync-docs.md Added logo --- greenbone-feed-sync-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index ac037815..3a1ff86c 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,4 +1,4 @@ - +![Greenbone Logo](https://www.greenbone.net/wp-content/uploads/gb_new-logo_horizontal_rgb_small.png) # Greenbone Feed Sync Update Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. From 973d54db3cb5443182ae1ad521da15bf70ee71ff Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 13 Jul 2023 11:12:05 -0400 Subject: [PATCH 093/107] Update greenbone-feed-sync-docs.md Small additions --- greenbone-feed-sync-docs.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index 3a1ff86c..b59ecc5b 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -1,4 +1,4 @@ -![Greenbone Logo](https://www.greenbone.net/wp-content/uploads/gb_new-logo_horizontal_rgb_small.png) + # Greenbone Feed Sync Update Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. @@ -17,7 +17,7 @@ $ which ### Deprecated Sync Scripts Removal **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -29,7 +29,7 @@ Python 3.9 and later is supported. Also note that sycing feeds requires the `rsy #### Install using pipx You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) ``` -$ python3 -m pipx install pontos +$ python3 -m pipx install greenbone-feed-sync ``` #### Install using pip @@ -43,14 +43,14 @@ $ python3 -m pip install greenbone-feed-sync ## Instructions For Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: ``` $ which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: ``` @@ -72,7 +72,7 @@ $ sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. ``` -# Include the feed type as an argument to update only a specific feed type +# Include the feed type as an argument to update only a specific feed type $ greenbone-feed-sync --type ``` The available feed types are: @@ -82,8 +82,8 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: [???] -* `nasl`: [???] +* `notus`: Fetch any newly available NOTUS vulnerability tests +* `nasl`: Fetch any newly available NASL vulnerability tests * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations * `port-list` or `port-lists`: Fetches any newly available port lists @@ -103,7 +103,7 @@ Using one of the following values to replace **\**: * `SCAP`: Synchronizes SCAP data feed * `GVMD_DATA`: Synchronizes gvmd data feed -Other arguments that can be passed to the legacy command incldue: +Other arguments that can be passed to the legacy command include: * `--version`: Displays the version of the script * `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not @@ -169,13 +169,13 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. ``` $ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. ``` # For Linux/Unix systems From e3b422b90791fc3691eec5bf5c4877cc6273b7f6 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 14 Sep 2023 11:11:01 -0400 Subject: [PATCH 094/107] created feed-sync docs --- .../feed-sync.md | 86 +++++++++---------- src/index.md | 1 + 2 files changed, 44 insertions(+), 43 deletions(-) rename greenbone-feed-sync-docs.md => src/feed-sync.md (84%) diff --git a/greenbone-feed-sync-docs.md b/src/feed-sync.md similarity index 84% rename from greenbone-feed-sync-docs.md rename to src/feed-sync.md index b59ecc5b..5f20f45f 100644 --- a/greenbone-feed-sync-docs.md +++ b/src/feed-sync.md @@ -1,23 +1,23 @@ -# Greenbone Feed Sync Update Guide +# Feed Sync Guide This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. -If you are unable to achieve feed syncronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. +If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. ## A Note About Deprecated Sync Scripts The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: -``` -$ which +```sh +which ``` - `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. - `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. - `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. - `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. -### Deprecated Sync Scripts Removal -**[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. - +### Deprecated Sync Script Removal +If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. + ## Introduction Of The New Python Feed Sync Script A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. @@ -28,52 +28,52 @@ Python 3.9 and later is supported. Also note that sycing feeds requires the `rsy #### Install using pipx You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) -``` -$ python3 -m pipx install greenbone-feed-sync +```sh +python3 -m pipx install greenbone-feed-sync ``` #### Install using pip NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) -``` -$ python3 -m pip install greenbone-feed-sync +```sh +python3 -m pip install greenbone-feed-sync ``` -## Instructions For Updating the Greenbone Feeds +## Updating the Greenbone Feeds ### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. For example: -``` -$ which greenbone-feed-sync +```sh +which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +``` +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. For example: -``` +```sh # If the new Python-based feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync +head -1 /usr/local/bin/greenbone-feed-sync #!/usr/bin/python3 ``` -``` +```sh # If the legacy bash feed update script is active you will see -$ head -1 /usr/local/bin/greenbone-feed-sync +head -1 /usr/local/bin/greenbone-feed-sync #!/bin/sh ``` ### Updating Feeds With New Python Script By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. -``` +```sh # Update all feeds with single command -$ sudo greenbone-feed-sync +sudo greenbone-feed-sync ``` To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. -``` -# Include the feed type as an argument to update only a specific feed type -$ greenbone-feed-sync --type +```sh +# Include the feed type as an argument to update only a specific feed type +greenbone-feed-sync --type ``` The available feed types are: @@ -82,7 +82,7 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes [???] * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -* `notus`: Fetch any newly available NOTUS vulnerability tests +* `notus`: Fetch any newly available NOTUS vulnerability tests * `nasl`: Fetch any newly available NASL vulnerability tests * `report-format` or `report-formats`: Fetches any newly available scan report formats * `scan-config` or `scan-configs`: Fetches any newly available scan configurations @@ -93,9 +93,9 @@ For other options, see the [full documentation here](https://github.com/greenbon ### Updating Feeds With Legacy Bash Script To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -``` +```sh # Update feeds with legacy bash script -$ sudo -u gvm greenbone-feed-sync --type +sudo -u gvm greenbone-feed-sync --type ``` Using one of the following values to replace **\**: @@ -113,7 +113,7 @@ Other arguments that can be passed to the legacy command include: * `--feedcurrent`: Checks if the feed is already up to date ### Updating Feeds For Kali Linux Native Installation -Kali Linux includes its own command for feed syncronization. To update all feeds issue the command as follows +Kali Linux includes its own command for feed synchronization. To update all feeds issue the command as follows ``` ┌──(dev㉿kali)-[~] └─$ sudo gvm-feed-update @@ -133,21 +133,21 @@ If using the new Python-based command, the crontab should be run under the root 2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: ``` ┌──(dev㉿kali)-[~] -└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm +└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm _gvm ``` ``` -$ awk -F: '{ print $1}' /etc/passwd | grep gvm +$ awk -F: '{ print $1}' /etc/passwd | grep gvm gvm ``` ## Troubleshooting A Connection To The Greenbone Feeds To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -``` -$ rsync rsync://feed.community.greenbone.net/community +```sh +rsync rsync://feed.community.greenbone.net/community ``` You should see output such as the following: -``` +```sh Greenbone community feed server - http://feed.community.greenbone.net/ This service is hosted by Greenbone Networks - http://www.greenbone.net/ @@ -169,19 +169,19 @@ community Greenbone community feed, see https://community.greenbone.net/ ``` If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: -### Use nping +### Use nping The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +```sh +sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -$ sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net -``` -### Use traceroute/tracert +### Use traceroute/tracert If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. -``` +```sh # For Linux/Unix systems -$ traceroute feed.community.greenbone.net -``` +traceroute feed.community.greenbone.net ``` +```sh # For Windows systems -$ tracert feed.community.greenbone.net +tracert feed.community.greenbone.net ``` diff --git a/src/index.md b/src/index.md index 61885730..00c96aa8 100644 --- a/src/index.md +++ b/src/index.md @@ -36,5 +36,6 @@ faq troubleshooting glossary changelog +feed-sync api ``` From f888b0148a2db7dc852f867a4518c541e4e721d4 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Mon, 30 Oct 2023 00:30:49 -0400 Subject: [PATCH 095/107] feed-sync changes --- src/index.md | 1 + src/web-interface/index.md | 270 +++++++++++++++++++++++++++++++++++++ 2 files changed, 271 insertions(+) create mode 100644 src/web-interface/index.md diff --git a/src/index.md b/src/index.md index 00c96aa8..d024d231 100644 --- a/src/index.md +++ b/src/index.md @@ -37,5 +37,6 @@ troubleshooting glossary changelog feed-sync +web-interface/index api ``` diff --git a/src/web-interface/index.md b/src/web-interface/index.md new file mode 100644 index 00000000..4b13592a --- /dev/null +++ b/src/web-interface/index.md @@ -0,0 +1,270 @@ +# JUST A PLACEHODLER FOR Web Interface + +```{include} /web-interface/8.md +``` + +```{highlight} shell-session +``` + +```{include} /22.4/source-build/hardware.md +``` + +```{include} /22.4/source-build/prerequisites.md +``` + +### Setting the Version + +To make the downloading easier, an environment variable for the desired release +version will be set. Using a variable allows adjusting the version easily after +a new release. + +```{code-block} +:caption: Setting a GVM version as environment variable + +export GVM_VERSION=22.4.1 +``` + +## Building and Installing the Components + +```{note} +The components should be build and installed in the listed order. +``` + +### gvm-libs + +```{include} /22.4/source-build/gvm-libs/description.md +``` + +```{code-block} +:caption: Setting the gvm-libs version to use + +export GVM_LIBS_VERSION=22.4.4 +``` + +```{include} /22.4/source-build/gvm-libs/dependencies.md +``` + +```{include} /22.4/source-build/gvm-libs/download.md +``` + +Afterwards, gvm-libs can be build and installed. + +```{include} /22.4/source-build/gvm-libs/build.md +``` + +### gvmd + +```{include} /22.4/source-build/gvmd/description.md +``` + +```{code-block} +:caption: Setting the gvmd version to use + +export GVMD_VERSION=22.4.2 +``` + +```{include} /22.4/source-build/gvmd/dependencies.md +``` + +Details about the optional dependencies can be found at + + +```{include} /22.4/source-build/gvmd/download.md +``` + +```{include} /22.4/source-build/gvmd/build.md +``` + +### pg-gvm + +```{include} /22.4/source-build/pg-gvm/description.md +``` + +```{code-block} +:caption: Setting the pg-gvm version to use + +export PG_GVM_VERSION=22.4.0 +``` + +```{include} /22.4/source-build/pg-gvm/dependencies.md +``` + +```{include} /22.4/source-build/pg-gvm/download.md +``` + +Afterwards, pg-gvm can be build and installed. + +```{include} /22.4/source-build/pg-gvm/build.md +``` + +### Greenbone Security Assistant + +The Greenbone Security Assistant (GSA) sources consist of two parts: + +- Web server *gsad* +- Web application *GSA* + +#### GSA + +```{include} /22.4/source-build/gsa/description.md +``` + +```{include} /22.4/source-build/gsa/version.md +``` + +```{include} /22.4/source-build/gsa/dependencies.md +``` + +```{include} /22.4/source-build/gsa/download.md +``` + +```{include} /22.4/source-build/gsa/build.md +``` + +#### gsad + +```{include} /22.4/source-build/gsad/description.md +``` + +```{include} /22.4/source-build/gsad/version.md +``` + +```{include} /22.4/source-build/gsad/dependencies.md +``` + +```{include} /22.4/source-build/gsad/download.md +``` + +```{include} /22.4/source-build/gsad/build.md +``` + +### openvas-smb + +```{include} /22.4/source-build/openvas-smb.md +``` + +### openvas-scanner + +```{include} /22.4/source-build/openvas-scanner/description.md +``` + +```{include} /22.4/source-build/openvas-scanner/version.md +``` + +```{include} /22.4/source-build/openvas-scanner/dependencies.md +``` + +```{include} /22.4/source-build/openvas-scanner/download.md +``` + +```{include} /22.4/source-build/openvas-scanner/build.md +``` + +### ospd-openvas + +```{include} /22.4/source-build/ospd-openvas/description.md +``` + +```{code-block} +:caption: Setting the ospd and ospd-openvas versions to use + +export OSPD_OPENVAS_VERSION=22.4.6 +``` + +```{include} /22.4/source-build/ospd-openvas/dependencies.md +``` + +```{include} /22.4/source-build/ospd-openvas/download.md +``` + +```{include} /22.4/source-build/ospd-openvas/build.md +``` + +### notus-scanner + +```{include} /22.4/source-build/notus-scanner/description.md +``` + +```{code-block} +:caption: Setting the notus version to use + +export NOTUS_VERSION=22.4.5 +``` + +```{include} /22.4/source-build/notus-scanner/dependencies.md +``` + +```{include} /22.4/source-build/notus-scanner/download.md +``` + +```{include} /22.4/source-build/notus-scanner/build.md +``` + +### greenbone-feed-sync + +```{include} /22.4/source-build/greenbone-feed-sync/description.md +``` + +```{include} /22.4/source-build/greenbone-feed-sync/dependencies.md +``` + +```{include} /22.4/source-build/greenbone-feed-sync/install.md +``` + +### gvm-tools + +```{include} /22.4/source-build/gvm-tools/description.md +``` + +```{include} /22.4/source-build/gvm-tools/dependencies.md +``` + +```{include} /22.4/source-build/gvm-tools/install.md +``` + +## Performing a System Setup + +```{include} /22.4/source-build/redis.md +``` + +```{include} /22.4/source-build/mqtt-broker.md +``` + +```{include} /22.4/source-build/directory-permissions.md +``` + +```{include} /22.4/source-build/gpg.md +``` + +```{include} /22.4/source-build/sudo-scanning.md +``` + +```{include} /22.4/source-build/postgres.md +``` + +```{include} /22.4/source-build/admin-user.md +``` + +```{include} /22.4/source-build/feed-import-owner.md +``` + +```{include} /22.4/source-build/systemd.md +``` + +```{include} /22.4/source-build/feed-sync.md +``` + +```{include} /22.4/source-build/start-services.md +``` + +```{include} /22.4/source-build/feed-loading.md +``` + +```{include} /22.4/source-build/finish.md +``` + +```{toctree} +:hidden: true + +troubleshooting +``` From 87138bd668c5806dc30b513fd61589b8d17b80b9 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 10 Jan 2024 18:52:06 +0800 Subject: [PATCH 096/107] Removed the file and refernces to web interface documentation to keep this branch only include feed-sync docs --- src/index.md | 1 - src/web-interface/index.md | 270 ------------------------------------- 2 files changed, 271 deletions(-) delete mode 100644 src/web-interface/index.md diff --git a/src/index.md b/src/index.md index d024d231..00c96aa8 100644 --- a/src/index.md +++ b/src/index.md @@ -37,6 +37,5 @@ troubleshooting glossary changelog feed-sync -web-interface/index api ``` diff --git a/src/web-interface/index.md b/src/web-interface/index.md deleted file mode 100644 index 4b13592a..00000000 --- a/src/web-interface/index.md +++ /dev/null @@ -1,270 +0,0 @@ -# JUST A PLACEHODLER FOR Web Interface - -```{include} /web-interface/8.md -``` - -```{highlight} shell-session -``` - -```{include} /22.4/source-build/hardware.md -``` - -```{include} /22.4/source-build/prerequisites.md -``` - -### Setting the Version - -To make the downloading easier, an environment variable for the desired release -version will be set. Using a variable allows adjusting the version easily after -a new release. - -```{code-block} -:caption: Setting a GVM version as environment variable - -export GVM_VERSION=22.4.1 -``` - -## Building and Installing the Components - -```{note} -The components should be build and installed in the listed order. -``` - -### gvm-libs - -```{include} /22.4/source-build/gvm-libs/description.md -``` - -```{code-block} -:caption: Setting the gvm-libs version to use - -export GVM_LIBS_VERSION=22.4.4 -``` - -```{include} /22.4/source-build/gvm-libs/dependencies.md -``` - -```{include} /22.4/source-build/gvm-libs/download.md -``` - -Afterwards, gvm-libs can be build and installed. - -```{include} /22.4/source-build/gvm-libs/build.md -``` - -### gvmd - -```{include} /22.4/source-build/gvmd/description.md -``` - -```{code-block} -:caption: Setting the gvmd version to use - -export GVMD_VERSION=22.4.2 -``` - -```{include} /22.4/source-build/gvmd/dependencies.md -``` - -Details about the optional dependencies can be found at - - -```{include} /22.4/source-build/gvmd/download.md -``` - -```{include} /22.4/source-build/gvmd/build.md -``` - -### pg-gvm - -```{include} /22.4/source-build/pg-gvm/description.md -``` - -```{code-block} -:caption: Setting the pg-gvm version to use - -export PG_GVM_VERSION=22.4.0 -``` - -```{include} /22.4/source-build/pg-gvm/dependencies.md -``` - -```{include} /22.4/source-build/pg-gvm/download.md -``` - -Afterwards, pg-gvm can be build and installed. - -```{include} /22.4/source-build/pg-gvm/build.md -``` - -### Greenbone Security Assistant - -The Greenbone Security Assistant (GSA) sources consist of two parts: - -- Web server *gsad* -- Web application *GSA* - -#### GSA - -```{include} /22.4/source-build/gsa/description.md -``` - -```{include} /22.4/source-build/gsa/version.md -``` - -```{include} /22.4/source-build/gsa/dependencies.md -``` - -```{include} /22.4/source-build/gsa/download.md -``` - -```{include} /22.4/source-build/gsa/build.md -``` - -#### gsad - -```{include} /22.4/source-build/gsad/description.md -``` - -```{include} /22.4/source-build/gsad/version.md -``` - -```{include} /22.4/source-build/gsad/dependencies.md -``` - -```{include} /22.4/source-build/gsad/download.md -``` - -```{include} /22.4/source-build/gsad/build.md -``` - -### openvas-smb - -```{include} /22.4/source-build/openvas-smb.md -``` - -### openvas-scanner - -```{include} /22.4/source-build/openvas-scanner/description.md -``` - -```{include} /22.4/source-build/openvas-scanner/version.md -``` - -```{include} /22.4/source-build/openvas-scanner/dependencies.md -``` - -```{include} /22.4/source-build/openvas-scanner/download.md -``` - -```{include} /22.4/source-build/openvas-scanner/build.md -``` - -### ospd-openvas - -```{include} /22.4/source-build/ospd-openvas/description.md -``` - -```{code-block} -:caption: Setting the ospd and ospd-openvas versions to use - -export OSPD_OPENVAS_VERSION=22.4.6 -``` - -```{include} /22.4/source-build/ospd-openvas/dependencies.md -``` - -```{include} /22.4/source-build/ospd-openvas/download.md -``` - -```{include} /22.4/source-build/ospd-openvas/build.md -``` - -### notus-scanner - -```{include} /22.4/source-build/notus-scanner/description.md -``` - -```{code-block} -:caption: Setting the notus version to use - -export NOTUS_VERSION=22.4.5 -``` - -```{include} /22.4/source-build/notus-scanner/dependencies.md -``` - -```{include} /22.4/source-build/notus-scanner/download.md -``` - -```{include} /22.4/source-build/notus-scanner/build.md -``` - -### greenbone-feed-sync - -```{include} /22.4/source-build/greenbone-feed-sync/description.md -``` - -```{include} /22.4/source-build/greenbone-feed-sync/dependencies.md -``` - -```{include} /22.4/source-build/greenbone-feed-sync/install.md -``` - -### gvm-tools - -```{include} /22.4/source-build/gvm-tools/description.md -``` - -```{include} /22.4/source-build/gvm-tools/dependencies.md -``` - -```{include} /22.4/source-build/gvm-tools/install.md -``` - -## Performing a System Setup - -```{include} /22.4/source-build/redis.md -``` - -```{include} /22.4/source-build/mqtt-broker.md -``` - -```{include} /22.4/source-build/directory-permissions.md -``` - -```{include} /22.4/source-build/gpg.md -``` - -```{include} /22.4/source-build/sudo-scanning.md -``` - -```{include} /22.4/source-build/postgres.md -``` - -```{include} /22.4/source-build/admin-user.md -``` - -```{include} /22.4/source-build/feed-import-owner.md -``` - -```{include} /22.4/source-build/systemd.md -``` - -```{include} /22.4/source-build/feed-sync.md -``` - -```{include} /22.4/source-build/start-services.md -``` - -```{include} /22.4/source-build/feed-loading.md -``` - -```{include} /22.4/source-build/finish.md -``` - -```{toctree} -:hidden: true - -troubleshooting -``` From 0f4122a5436f9288f0dabb99f54114df61b932be Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 11 Jan 2024 16:01:59 +0800 Subject: [PATCH 097/107] just temporarily stashing changes on hold --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 5f20f45f..a785a9be 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -79,7 +79,7 @@ The available feed types are: * `all`: same as using the command without specifying a type * `nvt`: Fetches any newly available vulnerability tests -* `gvmd-data`: Synchronizes GVM data feed which includes [???] +* `gvmd-data`: Synchronizes GVM data feed which includes port lists, scan configs and report formats * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed * `notus`: Fetch any newly available NOTUS vulnerability tests From a62b20a83528650e9fe6ed3b4e2b6e70977b685b Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Wed, 6 Mar 2024 23:16:30 +0700 Subject: [PATCH 098/107] complete first-draft of Greenbone community feed sync documentation --- src/changelog.md | 4 + src/feed-sync.md | 202 ++++++++++++++++++++++++++++------------------- 2 files changed, 125 insertions(+), 81 deletions(-) diff --git a/src/changelog.md b/src/changelog.md index 749cd2ee..493e4cc5 100644 --- a/src/changelog.md +++ b/src/changelog.md @@ -6,7 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Calendar Versioning](https://calver.org). ## Latest +<<<<<<< HEAD * Corrected the path for moving the openvasd built files +======= +* Add a comprehensive feed sync guide +>>>>>>> 894013f (complete first-draft of Greenbone community feed sync documentation) * Add instructions for Kali Linux installation * Add instructions to enable SSL/TLS * Quote passwords when creating an admin user via `gvmd` diff --git a/src/feed-sync.md b/src/feed-sync.md index a785a9be..d1fce4c7 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,83 +1,113 @@ # Feed Sync Guide +This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). -This documentation provides instructions on updating the feed sync for your specific Greenbone version and installation method. Please note that there is currently a migration from the `/usr/local/sbin/greenbone-feed-sync` bash script to a new Python-based script with the same name: `greenbone-feed-sync`. Also, please note that Kali Linux distribution comes with its own additional bash command script `gvm-feed-update`, yet we do recommend using the native Greenbone feed-sync commands. - -If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync update process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. +If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. ## A Note About Deprecated Sync Scripts -The following sync scripts listed below are deprecated and no longer installed by default since gvmd 22.5.0. If you want to check if you have these scripts installed you can try the following command: -```sh -which +Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based script with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. + +Usually, legacy feed sync scripts can be identified by their location. The depreciated bash scripts are usually found in the `/usr/local/sbin` or `/usr/sbin` directories, while the newer Python-based scripts are typically located in the `/usr/local/bin` or `$HOME/.local/bin` directories, depending on your installation method. + +If you want to check which scripts you have installed you can use the `which` command to identify the active script's path: +```{code-block} +:caption: Verify the path of the active feed command executable +which +``` +Once you have identified the active feed sync executable path, you can verify whether it is a legacy bash feed sync script, or the newer Python-based script by checking the file header. The first line of the legacy scripts will be `#!/bin/sh` while the newer versions will be `#!/usr/bin/python3`. +```{code-block} +:caption: Check the shebang to determine the script type +head -1 /path/to/ ``` -- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. -- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. -- `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. -- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. ### Deprecated Sync Script Removal -If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. +If you have any of the deprecated bash scripts installed, it is recommended to delete them. This ensures a clean transition to the new sync script. + +### Legacy Feed Sync Filenames +These are the legacy feed sync files and a description of their functionality: + +* `greenbone-feed-sync`: This is the base script. The `--type ` argument is required to specify which data to synchronize (CERT, SCAP, or GVMD_DATA). +* `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type CERT`. +* `greenbone-scapdata-sync`: This script is equivalent to `greenbone-feed-sync --type SCAP`. +* `greenbone-nvt-sync`: This script is equivalent to `greenbone-feed-sync --type GVMD_DATA`. -## Introduction Of The New Python Feed Sync Script -A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. +## The New Python Feed Sync Scripts +A set of new Python-based scripts have now replaced the deprecated feed sync scripts mentioned above. The new scripts are supported by **Greenbone version 22.4 and later**. However, older versions are not supported. The new Python-based scripts are now installed by default as of **Greenbone Community Edition version 22.5.0**. For backwards compatibility the new Python scripts have identical names to the original bash scripts. -The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/). +* `greenbone-feed-sync`: This is the base script. if no `--type` argument is set, all feed types will be updated. The `--type ` argument can be used to specify which data to synchronize. A list of available feed types can be [found here](#available-feed-types). +* `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type cert` and is provided for backwards compatibility only. +* `greenbone-scapdata-sync`: This script is equivalent to `greenbone-feed-sync --type scap` and is provided for backwards compatibility only. +* `greenbone-nvt-sync`: This script is equivalent to `greenbone-feed-sync --type gvmd-data` and is provided for backwards compatibility only. + +More information about executing the scripts can be [found here](#updating-feeds-with-new-python-script). ### Installation -Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the PATH, which is normally installed as part of Greenbone Community Edition's source code and docker container installation methods. +Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the operating system **PATH**, which is normally configured as part of Greenbone Community Edition's source code and Docker container installation methods. #### Install using pipx -You can install the latest stable release of pontos from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/) -```sh +You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/). +```{code-block} +:caption: Installing the package via pipx python3 -m pipx install greenbone-feed-sync ``` #### Install using pip -NOTE: The pip install command does no longer work out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. +NOTE: The pip install command no longer works out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. -You can install the latest stable release of greenbone-feed-sync from the Python Package Index (pypi) using [pip](https://pip.pypa.io/) -```sh +You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pip](https://pip.pypa.io/). +```{code-block} +:caption: Installing the package via python-pip python3 -m pip install greenbone-feed-sync ``` ## Updating the Greenbone Feeds +### Updating Feeds For Greenbone Docker Containers +Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). + +### Determining The Script Version In Use +If you are unsure of which version of the feed sync script is active, you should check before you execute the `greenbone-feed-sync` command.One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. -### Determine Which Command Is In Use -Before you can udpate the Greenbone feed sync, you should check which version of the commands are active when you execute the `greenbone-feed-sync` command. To do that, use the `which` command to determine the path of the command that is executed. +To check the file header, use the `which` command to determine the path of the command that is executed. For example: -```sh +```{code-block} +:caption: Check the path of the active feed sync script which greenbone-feed-sync /usr/local/bin/greenbone-feed-sync ``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at execution run-time. +Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at run-time. For example: -```sh -# If the new Python-based feed update script is active you will see +```{code-block} +:caption: If the new Python-based feed update script is active you will see head -1 /usr/local/bin/greenbone-feed-sync #!/usr/bin/python3 ``` -```sh -# If the legacy bash feed update script is active you will see -head -1 /usr/local/bin/greenbone-feed-sync +```{code-block} +:caption: If the legacy bash feed update script is active you will see +head -1 /usr/local/sbin/greenbone-feed-sync #!/bin/sh ``` ### Updating Feeds With New Python Script -By default, when no arguments are passed, it runs the sync operation for all types of feed data. To ensure proper execution and permissions, the new Python script must be run with root/sudo permissions, as it will need to change its execution context to the `gvm` or `_gvm` user. -```sh -# Update all feeds with single command +By default, when no arguments are passed, the new Python `greenbone-feed-sync` will updated all feed types. For standard installations that follow the [official Greenbone source code install instructions](https://greenbone.github.io/docs/latest/22.4/source-build/index.html), or the [Kali Linux native package installation](https://greenbone.github.io/docs/latest/22.4/kali/index.html), the new Python script should be run with `root`/`sudo` permissions, as it will change its execution context appropriately to the `gvm` or `_gvm` user. + +However, for non-standard installations that use a different username and group to execute the Greenbone components, the configured username and group context must be changed via the `greenbone-feed-sync.toml` configuration file. A basic example of how to configure a non-standard user via the `.toml` file can be [found here](https://github.com/greenbone/greenbone-feed-sync/blob/main/README.md#usage-on-kali-linux). + +```{code-block} +:caption: Update all feeds with single command sudo greenbone-feed-sync ``` -To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type, however, note that the new feed types use lowercase and more options are available. -```sh -# Include the feed type as an argument to update only a specific feed type -greenbone-feed-sync --type +To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type. +```{code-block} +:caption: Include the feed type as an argument to update only a specific feed type +sudo greenbone-feed-sync --type ``` + +#### Available Feed Types The available feed types are: -* `all`: same as using the command without specifying a type +* `all`: Same as using the command without specifying a type * `nvt`: Fetches any newly available vulnerability tests * `gvmd-data`: Synchronizes GVM data feed which includes port lists, scan configs and report formats * `scap`: Synchronizes SCAP data feed @@ -88,23 +118,19 @@ The available feed types are: * `scan-config` or `scan-configs`: Fetches any newly available scan configurations * `port-list` or `port-lists`: Fetches any newly available port lists -For other options, see the [full documentation here](https://github.com/greenbone/greenbone-feed-sync/). +#### Other Command Line Arguments +All other settings that can be configured via command line arguments can also be configured from a [`.toml`](https://toml.io/en/) file located at `/etc/gvm/greenbone-feed-sync.toml` or via system environment variables. The configuration settings are checked and loaded in that respective order: -### Updating Feeds With Legacy Bash Script +1. The `/etc/gvm/greenbone-feed-sync.toml` configuration file +2. System environment variables +3. Command line arguments at runtime -To update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -```sh -# Update feeds with legacy bash script -sudo -u gvm greenbone-feed-sync --type -``` -Using one of the following values to replace **\**: +A complete list of settings are [available here](https://github.com/greenbone/greenbone-feed-sync/blob/main/README.md#settings) and full documentation for the new Python-based feed update script can be [found here](https://github.com/greenbone/greenbone-feed-sync/). -* `CERT`: Synchronizes CERT data feed -* `SCAP`: Synchronizes SCAP data feed -* `GVMD_DATA`: Synchronizes gvmd data feed - -Other arguments that can be passed to the legacy command include: +The most basic arguments are: +* `--help`: Displays list of all available command line arguments +* `--verbose`: Sets verbose output. `-vvv` provides maximum verbosity. * `--version`: Displays the version of the script * `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not * `--describe`: Displays a description of the script and the feed it synchronizes @@ -112,42 +138,54 @@ Other arguments that can be passed to the legacy command include: * `--selftest`: Performs a self-test to check if all required utilities are available * `--feedcurrent`: Checks if the feed is already up to date +### Updating Feeds With Legacy Bash Scripts (Not Recommended) +If you absolutely cannot update to the new Python-based feed sync scripts because you are using a version of Greenbone prior to 22.4, or another reason, it's important to note that the legacy bash scripts can be run as the `sudo`/`root` user or the `gvm` user standard installations (`_gvm` on legacy versions of Kali). However, for non-standard installations that use a different username for the Greenbone components, the feed sync script should be run from the appropriate user context. Also, to update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. + +For example: + +```{code-block} +:caption: Update feeds with legacy bash script +sudo -u gvm greenbone-feed-sync --type +``` + +Using one of the following values to replace **\**: + +* `CERT`: Synchronizes CERT data feed +* `SCAP`: Synchronizes SCAP data feed +* `GVMD_DATA`: Synchronizes gvmd data feed + ### Updating Feeds For Kali Linux Native Installation -Kali Linux includes its own command for feed synchronization. To update all feeds issue the command as follows +Some older versions of Kali Linux include the `gvm-feed-update` command for feed synchronization. However, the wrapper script has been depreciated in newer versions of Kali and Greenbone's official `greenbone-feed-sync` command must be used instead. + +To update all feeds for versions of Kali Linux that include the `gvm-feed-update` script issue the following command can be used: + ``` ┌──(dev㉿kali)-[~] └─$ sudo gvm-feed-update ``` -Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. -### Verifying Successfull Feed Sync Update -After the sync operation completes, you can verify the successful update of the feed data. To confirm the updated feed status visit the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed. +Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. -## Automating Feed Sync Updates -The Greenbone feeds are not automatically synced in the case of a Greenbone Community source code installation, for the Greenbone Community Docker containers, or the Greenbone native Kali Linux installation. The sugested method for automating the Greenbone feed sync is to create a crontab file to schedule the schedule the appropriate commands. +### Configuring The Feed Sync User For Non-Standard Installations +The Python-based feed sync scripts will automatically change context to the `gvm` user in order to process the feeds. Since the Kali native installation uses the `_gvm` user, it comes preconfigured with a `.toml` file which specifies the appropriate user context. The `greenbone-feed-sync` script will look for this configuration file at the locations `~/.config/greenbone-feed-sync.toml` and `/etc/gvm/greenbone-feed-sync.toml`. If you have configured a Greenbone source code installation with a non-standard username and group such as `_gvm` you must add the user and group context to the `/etc/gvm/greenbone-feed-sync.toml` file, configure the appropriate environment variable, or supply the user context via the `--user` and `--group` command line arguments. -If using the new Python-based command, the crontab should be run under the root user context, however, if using the legacy feed sync bash script, the crontab should be created specifcally for the `gvm` or `_gvm` user. +### Verifying Successful Feed Sync Update +After the sync operation completes, you can verify the successful update of the feed data by visiting the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed and the **Version** column will indicate the date/time of the feed's release. -1. [MORE] +## Automating Feed Sync Updates +The Greenbone feeds are not automatically synced for the Greenbone Community source code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. -2. Determine whether your installation uses the `gvm` or `_gvm` user. The Kali linux installation is typically the only installation type that uses `_gvm`. Therefore, you should expect to see either of these output: -``` -┌──(dev㉿kali)-[~] -└─$ awk -F: '{ print $1}' /etc/passwd | grep gvm -_gvm -``` -``` -$ awk -F: '{ print $1}' /etc/passwd | grep gvm -gvm -``` +Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via `crontab`. ## Troubleshooting A Connection To The Greenbone Feeds To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -```sh +```{code-block} +:caption: Verify an rsync connection to the Greenbone feeds rsync rsync://feed.community.greenbone.net/community ``` You should see output such as the following: -```sh +```{code-block} +:caption: Expected output when verifying an rsync connection to the Greenbone feeds Greenbone community feed server - http://feed.community.greenbone.net/ This service is hosted by Greenbone Networks - http://www.greenbone.net/ @@ -167,21 +205,23 @@ cert-data Greenbone community CERT data feed, see https://community.greenbone.n community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ community Greenbone community feed, see https://community.greenbone.net/ ``` -If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any potential firewalls, content proxies, or network configurations. To do this you can try some of the following methods: +If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: ### Use nping - -The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` and `tcptraceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. -```sh +The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +```{code-block} +:caption: MORE sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -### Use traceroute/tracert -If you cannot install `nmap` on your host, you can try `traceroute` on Linux/Unix based systems or `tracert` for Windows which are both typically installed by default. -```sh -# For Linux/Unix systems -traceroute feed.community.greenbone.net + +### Use tcptraceroute +If you cannot install `nmap` on your host, you can try `tcptraceroute` on Linux/Unix based systems. + +```{code-block} +:caption: For Linux/Unix systems +tcptraceroute -p 873 feed.community.greenbone.net ``` -```sh -# For Windows systems +```{code-block} +:caption: For Windows systems tracert feed.community.greenbone.net ``` From 526a072d8510b409dddd4eaffc33f6c843424df5 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Thu, 7 Mar 2024 12:08:52 +0700 Subject: [PATCH 099/107] Added some changes to the Troubleshooting a connection section --- src/feed-sync.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index d1fce4c7..7a90c4df 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -208,20 +208,15 @@ community Greenbone community feed, see https://community.greenbone.net/ If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: ### Use nping -The `nping` command is part of the `nmap` tool. It can be used to directly traceroute a TCP connection to a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules. Note: `nping --tcp` command requires `sudo` or root permissions. +The `nping` command is part of the `nmap` tool and is availble for Linux and Windows systems. It can be used to track a TCP connection on a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules that maybe blocking the `rsync` port `873`. Please note `nping --tcp` command requires `sudo` or root permissions. You can find more information at the [nping reference guide](https://nmap.org/book/nping-man.html). ```{code-block} -:caption: MORE +:caption: Using nping to test the connectivity of port 873 sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` ### Use tcptraceroute -If you cannot install `nmap` on your host, you can try `tcptraceroute` on Linux/Unix based systems. - +If you cannot install `nmap` on your host, you can use `tcptraceroute` on Linux/Unix based systems. ```{code-block} -:caption: For Linux/Unix systems +:caption: Using tcptraceroute to test the connectivity of port 873 tcptraceroute -p 873 feed.community.greenbone.net ``` -```{code-block} -:caption: For Windows systems -tracert feed.community.greenbone.net -``` From b6fdd97f64b7124ef8db2ced97cc070d8ac27229 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Tue, 19 Mar 2024 14:34:16 +0700 Subject: [PATCH 100/107] Added warning label to all notices about Docker containers feed sync --- src/feed-sync.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 7a90c4df..6f872c5c 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,6 +1,9 @@ # Feed Sync Guide -This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. + +```{warning} Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +``` If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. @@ -62,7 +65,8 @@ python3 -m pip install greenbone-feed-sync ## Updating the Greenbone Feeds ### Updating Feeds For Greenbone Docker Containers -Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). +``` ### Determining The Script Version In Use If you are unsure of which version of the feed sync script is active, you should check before you execute the `greenbone-feed-sync` command.One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. @@ -175,7 +179,8 @@ After the sync operation completes, you can verify the successful update of the ## Automating Feed Sync Updates The Greenbone feeds are not automatically synced for the Greenbone Community source code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. -Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via `crontab`. +```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via **crontab**. +``` ## Troubleshooting A Connection To The Greenbone Feeds To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. From 9f8335d9f95b55a2ce72456fe6e283cb85578847 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Mon, 19 Aug 2024 15:00:13 +0900 Subject: [PATCH 101/107] Fixed introduction paragraph for clarify and malformed tags for a note object --- src/feed-sync.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index 8e90ca33..d801258d 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,6 +1,6 @@ # Feed Sync Guide -This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Community Containers. +This documentation provides instructions for updating the various feeds using the new Python-based [`greenbone-feed-sync`](https://github.com/greenbone/greenbone-feed-sync) tool, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Community Containers. ```{warning} Feed sync information for Greenbone Community Containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). ``` @@ -59,8 +59,9 @@ python3 -m pipx install greenbone-feed-sync ``` #### Installation Using pip -:::{note} +```{note} The pip install command no longer works out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. +``` You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pip](https://pip.pypa.io/). From f5238c28b454af7b1e4310cd91de85197f9554e5 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Mon, 19 Aug 2024 15:27:07 +0900 Subject: [PATCH 102/107] fixed problems with the src/feed-sync.md file. Some fragments of the conflicts were remaining in the file. --- src/feed-sync.md | 136 ----------------------------------------------- 1 file changed, 136 deletions(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index d8496a36..d801258d 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,16 +1,5 @@ # Feed Sync Guide -<<<<<<< HEAD -This documentation provides instructions on updating the various feeds for your specific Greenbone version and installation method, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Docker containers. - -```{warning} Feed sync information for Docker containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). -``` - -If you are unable to achieve feed synchronization after reading this guide, or require further assistance with the feed sync process, please consult the [Greenbone community forums](https://forum.greenbone.net/) or contact our support team for guidance. - -## A Note About Deprecated Sync Scripts -Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based script with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. -======= This documentation provides instructions for updating the various feeds using the new Python-based [`greenbone-feed-sync`](https://github.com/greenbone/greenbone-feed-sync) tool, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Community Containers. ```{warning} Feed sync information for Greenbone Community Containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). @@ -20,24 +9,10 @@ If you are unable to achieve feed synchronization after reading this guide, or r ## About Deprecated Sync Scripts Please note that there is currently a migration from the older set of bash scripts to a new set of Python-based scripts with the same names, but with added features. Also, please note that older versions of the Kali Linux distribution came with a wrapper script `gvm-feed-update`. However, this script has been depreciated in favor of using the official Greenbone Python scripts directly. ->>>>>>> main Usually, legacy feed sync scripts can be identified by their location. The depreciated bash scripts are usually found in the `/usr/local/sbin` or `/usr/sbin` directories, while the newer Python-based scripts are typically located in the `/usr/local/bin` or `$HOME/.local/bin` directories, depending on your installation method. If you want to check which scripts you have installed you can use the `which` command to identify the active script's path: -<<<<<<< HEAD -```{code-block} -:caption: Verify the path of the active feed command executable -which -``` -Once you have identified the active feed sync executable path, you can verify whether it is a legacy bash feed sync script, or the newer Python-based script by checking the file header. The first line of the legacy scripts will be `#!/bin/sh` while the newer versions will be `#!/usr/bin/python3`. -```{code-block} -:caption: Check the shebang to determine the script type -head -1 /path/to/ -``` - -### Deprecated Sync Script Removal -======= ```{code-block} :caption: Verifying the path of the active feed command executable @@ -52,7 +27,6 @@ head -1 /path/to/ ``` ### Removing Deprecated Sync Scripts ->>>>>>> main If you have any of the deprecated bash scripts installed, it is recommended to delete them. This ensures a clean transition to the new sync script. ### Legacy Feed Sync Filenames @@ -64,11 +38,7 @@ These are the legacy feed sync files and a description of their functionality: * `greenbone-nvt-sync`: This script is equivalent to `greenbone-feed-sync --type GVMD_DATA`. ## The New Python Feed Sync Scripts -<<<<<<< HEAD -A set of new Python-based scripts have now replaced the deprecated feed sync scripts mentioned above. The new scripts are supported by **Greenbone version 22.4 and later**. However, older versions are not supported. The new Python-based scripts are now installed by default as of **Greenbone Community Edition version 22.5.0**. For backwards compatibility the new Python scripts have identical names to the original bash scripts. -======= A set of new Python-based scripts has now replaced the deprecated feed sync scripts mentioned above. The new scripts are supported by **Greenbone version 22.4 and later**. However, older versions are not supported. The new Python-based scripts are now installed by default as of **Greenbone Community Edition version 22.5.0**. For backwards compatibility the new Python scripts have identical names to the original bash scripts. ->>>>>>> main * `greenbone-feed-sync`: This is the base script. if no `--type` argument is set, all feed types will be updated. The `--type ` argument can be used to specify which data to synchronize. A list of available feed types can be [found here](#available-feed-types). * `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type cert` and is provided for backwards compatibility only. @@ -78,29 +48,16 @@ A set of new Python-based scripts has now replaced the deprecated feed sync scri More information about executing the scripts can be [found here](#updating-feeds-with-new-python-script). ### Installation -<<<<<<< HEAD -Python 3.9 and later is supported. Also note that sycing feeds requires the `rsync` tool being installed and available within the operating system **PATH**, which is normally configured as part of Greenbone Community Edition's source code and Docker container installation methods. - -#### Install using pipx -You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/). -======= Python 3.9 and later is supported. Also note that syncing feeds requires the `rsync` tool being installed and available within the operating system **PATH**, which is normally configured as part of Greenbone Community Edition's source code and Docker container installation methods. #### Installation Using pipx You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pipx](https://pypa.github.io/pipx/). ->>>>>>> main ```{code-block} :caption: Installing the package via pipx python3 -m pipx install greenbone-feed-sync ``` -<<<<<<< HEAD -#### Install using pip -NOTE: The pip install command no longer works out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. - -You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pip](https://pip.pypa.io/). -======= #### Installation Using pip ```{note} The pip install command no longer works out-of-the-box in newer distributions like Ubuntu 23.04 because of [PEP 668](https://peps.python.org/pep-0668). Please use the [installation via pipx](https://github.com/greenbone/greenbone-feed-sync/tree/main#install-using-pipx) instead. @@ -108,42 +65,22 @@ The pip install command no longer works out-of-the-box in newer distributions li You can install the latest stable release of **greenbone-feed-sync** from the Python Package Index (pypi) using [pip](https://pip.pypa.io/). ->>>>>>> main ```{code-block} :caption: Installing the package via python-pip python3 -m pip install greenbone-feed-sync ``` ## Updating the Greenbone Feeds -<<<<<<< HEAD -### Updating Feeds For Greenbone Docker Containers -```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). -``` - -### Determining The Script Version In Use -If you are unsure of which version of the feed sync script is active, you should check before you execute the `greenbone-feed-sync` command.One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. -======= ### Updating Feeds for Greenbone Docker Containers ```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). ``` ### Determining the Script Version in Use If you are unsure of which version of the feed sync script is active, you should check this before executing the `greenbone-feed-sync` command. One way to check is by using the `--version` argument. The legacy bash scripts will output the GVMD version, while the new Python scripts will output the version of the `greenbone-feed-sync` package itself. Otherwise, the script header can help distinguish which file is in use with certainty. ->>>>>>> main To check the file header, use the `which` command to determine the path of the command that is executed. For example: -<<<<<<< HEAD -```{code-block} -:caption: Check the path of the active feed sync script -which greenbone-feed-sync -/usr/local/bin/greenbone-feed-sync -``` -Once you determine the path of the executed command you can identify whether it is the new Python-based feed sync command or the legacy bash version. To do that, use the `head` command to print the first line of the script. This will indicate the interpreter used at run-time. - -For example: -======= ```{code-block} :caption: Checking the path of the active feed sync script @@ -155,7 +92,6 @@ Once you determined the path of the executed command, you can identify whether i For example: ->>>>>>> main ```{code-block} :caption: If the new Python-based feed update script is active you will see head -1 /usr/local/bin/greenbone-feed-sync @@ -168,23 +104,11 @@ head -1 /usr/local/sbin/greenbone-feed-sync ``` ### Updating Feeds With New Python Script -<<<<<<< HEAD -By default, when no arguments are passed, the new Python `greenbone-feed-sync` will updated all feed types. For standard installations that follow the [official Greenbone source code install instructions](https://greenbone.github.io/docs/latest/22.4/source-build/index.html), or the [Kali Linux native package installation](https://greenbone.github.io/docs/latest/22.4/kali/index.html), the new Python script should be run with `root`/`sudo` permissions, as it will change its execution context appropriately to the `gvm` or `_gvm` user. -======= By default, when no arguments are passed, the new Python `greenbone-feed-sync` will update all feed types. For standard installations that follow the [official Greenbone source-code install instructions](https://greenbone.github.io/docs/latest/22.4/source-build/index.html), or the [Kali Linux native package installation](https://greenbone.github.io/docs/latest/22.4/kali/index.html), the new Python script should be run with `root`/`sudo` permissions, as it will change its execution context appropriately to the `gvm` or `_gvm` user. ->>>>>>> main However, for non-standard installations that use a different username and group to execute the Greenbone components, the configured username and group context must be changed via the `greenbone-feed-sync.toml` configuration file. A basic example of how to configure a non-standard user via the `.toml` file can be [found here](https://github.com/greenbone/greenbone-feed-sync/blob/main/README.md#usage-on-kali-linux). ```{code-block} -<<<<<<< HEAD -:caption: Update all feeds with single command -sudo greenbone-feed-sync -``` -To update only one feed at a time, the new Python-based command can be used similar to the previous `/usr/sbin/greenbone-feed-sync` bash script command by specifying a feed type. -```{code-block} -:caption: Include the feed type as an argument to update only a specific feed type -======= :caption: Updating all feeds with single command sudo greenbone-feed-sync ``` @@ -193,7 +117,6 @@ To update only one feed at a time, the new Python-based command can be used simi ```{code-block} :caption: Including the feed type as an argument to update only a specific feed type ->>>>>>> main sudo greenbone-feed-sync --type ``` @@ -205,15 +128,9 @@ The available feed types are: * `gvmd-data`: Synchronizes GVM data feed which includes port lists, scan configs and report formats * `scap`: Synchronizes SCAP data feed * `cert`: Synchronizes CERT data feed -<<<<<<< HEAD -* `notus`: Fetch any newly available NOTUS vulnerability tests -* `nasl`: Fetch any newly available NASL vulnerability tests -* `report-format` or `report-formats`: Fetches any newly available scan report formats -======= * `notus`: Fetches any newly available Notus vulnerability tests * `nasl`: Fetches any newly available NASL vulnerability tests * `report-format` or `report-formats`: Fetches any newly available report formats ->>>>>>> main * `scan-config` or `scan-configs`: Fetches any newly available scan configurations * `port-list` or `port-lists`: Fetches any newly available port lists @@ -229,11 +146,7 @@ A complete list of settings are [available here](https://github.com/greenbone/gr The most basic arguments are: * `--help`: Displays list of all available command line arguments -<<<<<<< HEAD -* `--verbose`: Sets verbose output. `-vvv` provides maximum verbosity. -======= * `--verbose`: Sets verbose output (`-vvv` provides maximum verbosity) ->>>>>>> main * `--version`: Displays the version of the script * `--identify`: Displays information about the script, including script ID, name, version, feed name, whether it is restricted or not * `--describe`: Displays a description of the script and the feed it synchronizes @@ -242,38 +155,22 @@ The most basic arguments are: * `--feedcurrent`: Checks if the feed is already up to date ### Updating Feeds With Legacy Bash Scripts (Not Recommended) -<<<<<<< HEAD -If you absolutely cannot update to the new Python-based feed sync scripts because you are using a version of Greenbone prior to 22.4, or another reason, it's important to note that the legacy bash scripts can be run as the `sudo`/`root` user or the `gvm` user standard installations (`_gvm` on legacy versions of Kali). However, for non-standard installations that use a different username for the Greenbone components, the feed sync script should be run from the appropriate user context. Also, to update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. -======= If you absolutely cannot update to the new Python-based feed sync scripts because you are using a version of Greenbone prior to 22.4, or another reason, it is important to note that the legacy bash scripts can be run as the `sudo`/`root` user or the `gvm` user standard installations (`_gvm` on legacy versions of Kali). However, for non-standard installations that use a different username for the Greenbone components, the feed sync script should be run from the appropriate user context. Also, to update the feed sync using the legacy `greenbone-feed-sync` command, the `--type` parameter is **required**. ->>>>>>> main For example: ```{code-block} -<<<<<<< HEAD -:caption: Update feeds with legacy bash script -sudo -u gvm greenbone-feed-sync --type -``` - -Using one of the following values to replace **\**: -======= :caption: Updating feeds with legacy bash script sudo -u gvm greenbone-feed-sync --type ``` Use one of the following values to replace **\**: ->>>>>>> main * `CERT`: Synchronizes CERT data feed * `SCAP`: Synchronizes SCAP data feed * `GVMD_DATA`: Synchronizes gvmd data feed -<<<<<<< HEAD -### Updating Feeds For Kali Linux Native Installation -======= ### Updating Feeds for Kali Linux Native Installation ->>>>>>> main Some older versions of Kali Linux include the `gvm-feed-update` command for feed synchronization. However, the wrapper script has been depreciated in newer versions of Kali and Greenbone's official `greenbone-feed-sync` command must be used instead. To update all feeds for versions of Kali Linux that include the `gvm-feed-update` script issue the following command can be used: @@ -285,16 +182,6 @@ To update all feeds for versions of Kali Linux that include the `gvm-feed-update Please note that the `gvm-feed-update` command mentioned above is not maintained by Greenbone. It is maintained by the Kali/Debian package managers. Under the hood, the `gvm-feed-update` is a bash script that essentially executes the standard `greenbone-feed-sync --type ` scripts provided by Greenbone. We recommend avoiding the use of `gvm-feed-update` for your feed sync operations. -<<<<<<< HEAD -### Configuring The Feed Sync User For Non-Standard Installations -The Python-based feed sync scripts will automatically change context to the `gvm` user in order to process the feeds. Since the Kali native installation uses the `_gvm` user, it comes preconfigured with a `.toml` file which specifies the appropriate user context. The `greenbone-feed-sync` script will look for this configuration file at the locations `~/.config/greenbone-feed-sync.toml` and `/etc/gvm/greenbone-feed-sync.toml`. If you have configured a Greenbone source code installation with a non-standard username and group such as `_gvm` you must add the user and group context to the `/etc/gvm/greenbone-feed-sync.toml` file, configure the appropriate environment variable, or supply the user context via the `--user` and `--group` command line arguments. - -### Verifying Successful Feed Sync Update -After the sync operation completes, you can verify the successful update of the feed data by visiting the `/feedstatus` page which can be found under the **Administration** item in the top menu bar of Greenbone's web-interface. If a feed has successfully updated you will see **Current** beside the particular feed and the **Version** column will indicate the date/time of the feed's release. - -## Automating Feed Sync Updates -The Greenbone feeds are not automatically synced for the Greenbone Community source code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. -======= ### Configuring the Feed Sync User for Non-Standard Installations The Python-based feed sync scripts will automatically change context to the `gvm` user in order to process the feeds. Since the Kali native installation uses the `_gvm` user, it comes preconfigured with a `.toml` file which specifies the appropriate user context. The `greenbone-feed-sync` script will look for this configuration file at the locations `~/.config/greenbone-feed-sync.toml` and `/etc/gvm/greenbone-feed-sync.toml`. If you have configured a Greenbone source code installation with a non-standard username and group such as `_gvm` you must add the user and group context to the `/etc/gvm/greenbone-feed-sync.toml` file, configure the appropriate environment variable, or supply the user context via the `--user` and `--group` command line arguments. @@ -303,20 +190,10 @@ After the sync operation completes, you can verify the successful update of the ## Automating Feed Sync Updates The Greenbone feeds are not automatically synced for the Greenbone Community source-code installations, Greenbone Community Docker containers, or Greenbone native Kali Linux installation. The suggested method for automating the Greenbone feed sync is to create a `crontab` file to schedule the feed sync command execution. For standard source-code installations, the `crontab` should be run under the `sudo` or `root` user context. ->>>>>>> main ```{warning} Please note that different methods are required for completing a feed sync when using the official **Greenbone Docker containers**, which can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). These commands can also be scheduled via **crontab**. ``` -<<<<<<< HEAD -## Troubleshooting A Connection To The Greenbone Feeds -To trouble shoot a connection to the Greenbone feeds, you can issue the following command from a terminal. -```{code-block} -:caption: Verify an rsync connection to the Greenbone feeds -rsync rsync://feed.community.greenbone.net/community -``` -You should see output such as the following: -======= ## Troubleshooting a Connection to the Greenbone Feeds To troubleshoot a connection to the Greenbone feeds, you can issue the following command from a terminal. @@ -327,7 +204,6 @@ rsync rsync://feed.community.greenbone.net/community You should see output such as the following: ->>>>>>> main ```{code-block} :caption: Expected output when verifying an rsync connection to the Greenbone feeds Greenbone community feed server - http://feed.community.greenbone.net/ @@ -349,31 +225,19 @@ cert-data Greenbone community CERT data feed, see https://community.greenbone.n community-legacy Greenbone community legacy feed, see https://community.greenbone.net/ community Greenbone community feed, see https://community.greenbone.net/ ``` -<<<<<<< HEAD -If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: - -### Use nping -The `nping` command is part of the `nmap` tool and is availble for Linux and Windows systems. It can be used to track a TCP connection on a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules that maybe blocking the `rsync` port `873`. Please note `nping --tcp` command requires `sudo` or root permissions. You can find more information at the [nping reference guide](https://nmap.org/book/nping-man.html). -======= If you are unable to connect to the Greenbone feeds using the `rsync` command, we suggest you troubleshoot your network connection to identify any firewalls, content proxies, or network configurations that could be blocking the connection. Here are some suggested methods: ### Using nping The `nping` command is part of the `nmap` tool and is availble for Linux and Windows systems. It can be used to track a TCP connection on a specific port while `traceroute` cannot be configured to test a specific port. This will help identify port-based firewall rules as well as host/IP-based firewall rules that may be blocking the `rsync` port `873`. Please note that the `nping --tcp` command requires `sudo` or root permissions. You can find more information in the [nping reference guide](https://nmap.org/book/nping-man.html). ->>>>>>> main ```{code-block} :caption: Using nping to test the connectivity of port 873 sudo nping --tcp --traceroute -c 13 -p 873 feed.community.greenbone.net ``` -<<<<<<< HEAD -### Use tcptraceroute -If you cannot install `nmap` on your host, you can use `tcptraceroute` on Linux/Unix based systems. -======= ### Using tcptraceroute If you cannot install `nmap` on your host, you can use `tcptraceroute` on Linux/Unix based systems. ->>>>>>> main ```{code-block} :caption: Using tcptraceroute to test the connectivity of port 873 tcptraceroute -p 873 feed.community.greenbone.net From c55e4a4133d16fbea49028959a64ee39b63b34b1 Mon Sep 17 00:00:00 2001 From: Joseph Lee Date: Mon, 19 Aug 2024 16:55:42 +0900 Subject: [PATCH 103/107] Changed the context of the introduction paragraph to refer to a single Greenbone Community Feed --- src/feed-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feed-sync.md b/src/feed-sync.md index d801258d..7b209eab 100644 --- a/src/feed-sync.md +++ b/src/feed-sync.md @@ -1,6 +1,6 @@ # Feed Sync Guide -This documentation provides instructions for updating the various feeds using the new Python-based [`greenbone-feed-sync`](https://github.com/greenbone/greenbone-feed-sync) tool, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Community Containers. +This documentation provides instructions for updating the Greenbone Community Feed using the new Python-based [`greenbone-feed-sync`](https://github.com/greenbone/greenbone-feed-sync) tool, as well as information about the legacy feed sync scripts, and some tips for troubleshooting a failed feed sync. Please note that different methods are required for completing a feed sync with the official Greenbone Community Containers. ```{warning} Feed sync information for Greenbone Community Containers can be [found here](https://greenbone.github.io/docs/latest/22.4/container/workflows.html#performing-a-feed-synchronization). ``` From c6ea3b79aebdfa50a42d3e541ca208f6ca6206a1 Mon Sep 17 00:00:00 2001 From: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:35:10 +0200 Subject: [PATCH 104/107] Update greenbone-feed-sync-docs.md Co-authored-by: Jaspar Stach --- greenbone-feed-sync-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index b59ecc5b..6f934b3a 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -10,7 +10,7 @@ The following sync scripts listed below are deprecated and no longer installed b ``` $ which ``` -- `greenbone-certdata-sync`: This script is equivalent to greenbone-feed-sync --type CERT, and it was primarily provided for backwards compatibility. +- `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type CERT`, and it was primarily provided for backwards compatibility. - `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. - `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. - `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. From 849c68030f645bcbad0b538496f8443dc7183d48 Mon Sep 17 00:00:00 2001 From: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:35:21 +0200 Subject: [PATCH 105/107] Update greenbone-feed-sync-docs.md Co-authored-by: Jaspar Stach --- greenbone-feed-sync-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index 6f934b3a..e8d36b2a 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -11,7 +11,7 @@ The following sync scripts listed below are deprecated and no longer installed b $ which ``` - `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type CERT`, and it was primarily provided for backwards compatibility. -- `greenbone-scapdata-sync`: This script is equivalent to greenbone-feed-sync --type SCAP 1, and it was primarily provided for backwards compatibility. +- `greenbone-scapdata-sync`: This script is equivalent to `greenbone-feed-sync --type SCAP 1`, and it was primarily provided for backwards compatibility. - `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. - `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. From 53fcdf8573d30aa2eea0d46a45afca8820f04ecb Mon Sep 17 00:00:00 2001 From: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:35:42 +0200 Subject: [PATCH 106/107] Update greenbone-feed-sync-docs.md Co-authored-by: Jaspar Stach --- greenbone-feed-sync-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index e8d36b2a..fe809b6a 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -13,7 +13,7 @@ $ which - `greenbone-certdata-sync`: This script is equivalent to `greenbone-feed-sync --type CERT`, and it was primarily provided for backwards compatibility. - `greenbone-scapdata-sync`: This script is equivalent to `greenbone-feed-sync --type SCAP 1`, and it was primarily provided for backwards compatibility. - `greenbone-nvt-sync`: This script, written in bash, was used to download vulnerability tests data (nasl and notus files). It is deprecated since openvas-scanner 22.6.0. -- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download CERT, SCAP, and GVMD_DATA. It is no longer installed by default since gvmd 22.5.0. +- `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`: This is the old sync script written in bash to download `CERT_DATA`, `SCAP_DATA`, and `GVMD_DATA`. It is no longer installed by default since [`gvmd 22.5.0`](https://github.com/greenbone/gvmd/releases/tag/v22.5.0). ### Deprecated Sync Scripts Removal **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. From 04e1309868ac753d877be14f9564a936c7146f13 Mon Sep 17 00:00:00 2001 From: Kristin Schlosser <57938820+k-schlosser@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:36:00 +0200 Subject: [PATCH 107/107] Update greenbone-feed-sync-docs.md Co-authored-by: Jaspar Stach --- greenbone-feed-sync-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/greenbone-feed-sync-docs.md b/greenbone-feed-sync-docs.md index fe809b6a..eecac1f8 100644 --- a/greenbone-feed-sync-docs.md +++ b/greenbone-feed-sync-docs.md @@ -19,7 +19,7 @@ $ which **[???]Should I include this** If you have any of the deprecated sync scripts (`greenbone-certdata-sync`, `greenbone-scapdata-sync`, `greenbone-nvt-sync`, `/usr/local/sbin/greenbone-feed-sync` or `/usr/sbin/greenbone-feed-sync`) installed, it is recommended to remove them. This step ensures a clean transition to the new sync script. ## Introduction Of The New Python Feed Sync Script -A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be run with can be run with **Greenbone version 22.4 and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of **Greenbone Community Edition version 22.5.0**. +A new Python-based `greenbone-feed-sync` command now replaces the deprecated feed sync scripts mentioned above. This new script can be used within Greenbone products with **`gvmd 22.4` and later**, however, older versions are not supported. This new feed sync method will now be installed by default as of Greenbone products with **gvmd 22.5**. The new script can handle various use cases, including the functionality provided by the `gvm-feed-update` which is provided by the Kali/Debian packagers. Full documentation for the new Python-based feed update script can be found [here](https://github.com/greenbone/greenbone-feed-sync/).