From a17e828aea267fa3165e162649205b65a97e7dbf Mon Sep 17 00:00:00 2001 From: david grossman Date: Tue, 31 Mar 2026 10:22:13 -0400 Subject: [PATCH] chore: add v4 examples --- README.md | 156 ++++++++++++++++++++++++++++++++++ tests/advisory.py | 25 ++++++ tests/advisory_aio.py | 32 +++++++ tests/backupv4.py | 31 +++++++ tests/backupv4_aio.py | 47 ++++++++++ tests/readme_examples_test.py | 4 + 6 files changed, 295 insertions(+) create mode 100644 tests/advisory.py create mode 100644 tests/advisory_aio.py create mode 100644 tests/backupv4.py create mode 100644 tests/backupv4_aio.py diff --git a/README.md b/README.md index 1d30bb6b..d31dd4ea 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ Bring the VulnCheck API to your Python applications. - [PURL](#purl) - [CPE](#cpe) - [Backup](#backup) + - [Advisory](#advisory) + - [Backup v4](#backup-v4) - [Indices](#indices) - [Index](#index) - [Pagination](#pagination) @@ -392,6 +394,160 @@ if __name__ == "__main__": ``` + + +### Advisory + +List all advisory feeds and query advisories filtered by feed + +```python +import vulncheck_sdk +from vulncheck_sdk.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue +from vulncheck_sdk.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue +import os + +TOKEN = os.environ["VULNCHECK_API_TOKEN"] + +configuration = vulncheck_sdk.Configuration() +configuration.api_key["Bearer"] = TOKEN + +with vulncheck_sdk.ApiClient(configuration) as api_client: + advisory_client = vulncheck_sdk.AdvisoryApi(api_client) + + # List all available advisory feeds (/v4/advisory) + feeds: SearchV4ListFeedReturnValue = advisory_client.v4_list_advisory_feeds() + print(f"Available feeds: {feeds.data}") + + # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi) + advisories: SearchV4AdvisoryReturnValue = advisory_client.v4_query_advisories(name="wolfi") + print(f"Wolfi advisories (page 1): {len(advisories.data)} results") + for advisory in advisories.data: + print(f" - {advisory.id}") +``` + + +
Click to View Async Implementation + +```python +import asyncio +import os +import vulncheck_sdk.aio as vcaio +from vulncheck_sdk.aio.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue +from vulncheck_sdk.aio.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue + +TOKEN = os.environ.get("VULNCHECK_API_TOKEN") + +configuration = vcaio.Configuration() +configuration.api_key["Bearer"] = TOKEN + + +async def main(): + async with vcaio.ApiClient(configuration) as api_client: + advisory_client = vcaio.AdvisoryApi(api_client) + + # List all available advisory feeds (/v4/advisory) + feeds: SearchV4ListFeedReturnValue = await advisory_client.v4_list_advisory_feeds() + print(f"Available feeds: {feeds.data}") + + # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi) + advisories: SearchV4AdvisoryReturnValue = await advisory_client.v4_query_advisories(name="wolfi") + print(f"Wolfi advisories (page 1): {len(advisories.data)} results") + for advisory in advisories.data: + print(f" - {advisory.id}") + + +if __name__ == "__main__": + asyncio.run(main()) +``` + + +
+ +### Backup v4 + +List available v4 backups and download a backup by feed name + +```python +import urllib.request +import vulncheck_sdk +from vulncheck_sdk.models.backup_list_backups_response import BackupListBackupsResponse +from vulncheck_sdk.models.backup_feed_item import BackupFeedItem +import os + +TOKEN = os.environ["VULNCHECK_API_TOKEN"] + +configuration = vulncheck_sdk.Configuration() +configuration.api_key["Bearer"] = TOKEN + +with vulncheck_sdk.ApiClient(configuration) as api_client: + backup_client = vulncheck_sdk.BackupApi(api_client) + + # List available backups (/v4/backup) + available: BackupListBackupsResponse = backup_client.v4_list_backups() + for potential in available.data: + print(f"found: {potential.name}") + + # Get backup for the wolfi feed (/v4/backup/wolfi) + feed = "wolfi" + response = backup_client.v4_get_backup_by_name(feed) + + file_path = f"{feed}.zip" + with urllib.request.urlopen(response.url) as r: + with open(file_path, "wb") as f: + f.write(r.read()) + + print(f"Successfully saved to {file_path}") +``` + + +
Click to View Async Implementation + +```python +import asyncio +import os +import urllib.request +import vulncheck_sdk.aio as vcaio +from vulncheck_sdk.aio.models.backup_list_backups_response import BackupListBackupsResponse +from vulncheck_sdk.aio.models.backup_backup_response import BackupBackupResponse + +TOKEN = os.environ.get("VULNCHECK_API_TOKEN") + +configuration = vcaio.Configuration() +configuration.api_key["Bearer"] = TOKEN + + +def download_sync(url, file_path): + with urllib.request.urlopen(url) as response: + with open(file_path, "wb") as file: + file.write(response.read()) + + +async def main(): + async with vcaio.ApiClient(configuration) as api_client: + backup_client = vcaio.BackupApi(api_client) + + # List available backups (/v4/backup) + available: BackupListBackupsResponse = await backup_client.v4_list_backups() + for potential in available.data: + print(f"Found backup: {potential.name}") + + # Get backup for the wolfi feed (/v4/backup/wolfi) + feed = "wolfi" + response: BackupBackupResponse = await backup_client.v4_get_backup_by_name(feed) + + file_path = f"{feed}.zip" + print(f"Downloading {feed} backup via urllib (offloaded to thread)...") + + await asyncio.to_thread(download_sync, response.url, file_path) + + print(f"Successfully saved to {file_path}") + + +if __name__ == "__main__": + asyncio.run(main()) +``` + +
### Indices diff --git a/tests/advisory.py b/tests/advisory.py new file mode 100644 index 00000000..cb5c74ed --- /dev/null +++ b/tests/advisory.py @@ -0,0 +1,25 @@ +import vulncheck_sdk +from vulncheck_sdk.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue +from vulncheck_sdk.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue +import os + +TOKEN = os.environ["VULNCHECK_API_TOKEN"] + +configuration = vulncheck_sdk.Configuration() +configuration.api_key["Bearer"] = TOKEN + +with vulncheck_sdk.ApiClient(configuration) as api_client: + advisory_client = vulncheck_sdk.AdvisoryApi(api_client) + + # List all available advisory feeds (/v4/advisory) + feeds: SearchV4ListFeedReturnValue = advisory_client.v4_list_advisory_feeds() + print("Available feeds:") + for feed in feeds.data: + print(f"name: {feed.name}") + + feed = "wolfi" + # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi) + advisories: SearchV4AdvisoryReturnValue = advisory_client.v4_query_advisories(name=feed) + print(f"{feed.capitalize()} advisories (page 1): {len(advisories.data)} results") + for advisory in advisories.data: + print(f"cve: {advisory.cve_metadata.cve_id}") diff --git a/tests/advisory_aio.py b/tests/advisory_aio.py new file mode 100644 index 00000000..f9964216 --- /dev/null +++ b/tests/advisory_aio.py @@ -0,0 +1,32 @@ +import asyncio +import os +import vulncheck_sdk.aio as vcaio +from vulncheck_sdk.aio.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue +from vulncheck_sdk.aio.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue + +TOKEN = os.environ.get("VULNCHECK_API_TOKEN") + +configuration = vcaio.Configuration() +configuration.api_key["Bearer"] = TOKEN + + +async def main(): + async with vcaio.ApiClient(configuration) as api_client: + advisory_client = vcaio.AdvisoryApi(api_client) + + # List all available advisory feeds (/v4/advisory) + feeds: SearchV4ListFeedReturnValue = await advisory_client.v4_list_advisory_feeds() + print("Available feeds:") + for feed in feeds.data: + print(f"name: {feed.name}") + + feed = "wolfi" + # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi) + advisories: SearchV4AdvisoryReturnValue = await advisory_client.v4_query_advisories(name=feed) + print(f"{feed.capitalize()} advisories (page 1): {len(advisories.data)} results") + for advisory in advisories.data: + print(f"cve: {advisory.cve_metadata.cve_id}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/tests/backupv4.py b/tests/backupv4.py new file mode 100644 index 00000000..d1e5d232 --- /dev/null +++ b/tests/backupv4.py @@ -0,0 +1,31 @@ +import urllib.request +import vulncheck_sdk +from vulncheck_sdk.models.backup_list_backups_response import BackupListBackupsResponse +from vulncheck_sdk.models.backup_feed_item import BackupFeedItem +import os + +TOKEN = os.environ["VULNCHECK_API_TOKEN"] + +configuration = vulncheck_sdk.Configuration() +configuration.api_key["Bearer"] = TOKEN + +with vulncheck_sdk.ApiClient(configuration) as api_client: + backup_client = vulncheck_sdk.BackupApi(api_client) + + # List available backups (/v4/backup) + available: BackupListBackupsResponse = backup_client.v4_list_backups() + + for potential_backup in available.data: + print(f"Found backup: {potential_backup.name}") + + # Get backup for the wolfi feed (/v4/backup/wolfi) + feed = "wolfi" + response: BackupListBackupsResponse = backup_client.v4_get_backup_by_name(feed) + + print(f"Downloading {feed} backup") + file_path = f"{feed}.zip" + with urllib.request.urlopen(response.url) as r: + with open(file_path, "wb") as f: + f.write(r.read()) + + print(f"Successfully saved to {file_path}") diff --git a/tests/backupv4_aio.py b/tests/backupv4_aio.py new file mode 100644 index 00000000..d7ac0747 --- /dev/null +++ b/tests/backupv4_aio.py @@ -0,0 +1,47 @@ +import asyncio +import os +import urllib.request +import vulncheck_sdk.aio as vcaio +from vulncheck_sdk.aio.models.backup_list_backups_response import BackupListBackupsResponse +from vulncheck_sdk.aio.models.backup_backup_response import BackupBackupResponse + +TOKEN = os.environ.get("VULNCHECK_API_TOKEN") + +configuration = vcaio.Configuration() +configuration.api_key["Bearer"] = TOKEN + + +def download_sync(url, file_path): + """ + Standard synchronous download using urllib.request. + This runs in a separate thread to avoid blocking the event loop. + """ + with urllib.request.urlopen(url) as response: + with open(file_path, "wb") as file: + file.write(response.read()) + + +async def main(): + async with vcaio.ApiClient(configuration) as api_client: + backup_client = vcaio.BackupApi(api_client) + + # List available backups (/v4/backup) + available: BackupListBackupsResponse = await backup_client.v4_list_backups() + for potential_backup in available.data: + print(f"Found backup: {potential_backup.name}") + + # Get backup for the wolfi feed (/v4/backup/wolfi) + feed = "wolfi" + response: BackupBackupResponse = await backup_client.v4_get_backup_by_name(feed) + + + file_path = f"{feed}.zip" + print(f"Downloading {feed} backup via urllib (offloaded to thread)...") + + await asyncio.to_thread(download_sync, response.url, file_path) + + print(f"Successfully saved to {file_path}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/tests/readme_examples_test.py b/tests/readme_examples_test.py index 7552201e..06d528e0 100644 --- a/tests/readme_examples_test.py +++ b/tests/readme_examples_test.py @@ -13,8 +13,12 @@ # List of python programs to test PROGRAMS = [ + "./tests/advisory.py", + "./tests/advisory_aio.py", "./tests/backup.py", + "./tests/backupv4.py", "./tests/backup_aio.py", + "./tests/backupv4_aio.py", "./tests/cpe.py", "./tests/cpe_aio.py", "./tests/index.py",