- Excluded known cloud service and VPN IPs (GitHub, AWS, GCP, VPN) from the
number_of_requesterscount reported in per-dataset, archive, and total summaries. (#291) - Strengthened encryption key derivation. The
S3_LOG_EXTRACTION_PASSWORDvalue now passes through PBKDF2-HMAC-SHA256 instead of a single SHA-256 pass, which resists brute-force attacks. Weak passwords are also rejected before any encryption runs. A publicvalidate_password_strengthhelper was added. (#283) - Added the
s3logextraction statsCLI command and theget_log_bucket_statsAPI helper for summarizing S3 inventory. (#224) - Extended the
s3logextraction statscommand and added aget_ip_statsAPI helper to report IP address classification statistics from the IP cache. Every cached IP is binned into one of seven categories (determined, missing, unknown, bogon, VPN, cloud service, GitHub) with counts and percentages. The command also gains--cacheand--encryptionflags. (#274)
- Narrowed
is_cloud_service_or_vpn_labelto only match genuine cloud/VPN service labels ("GitHub","VPN","AWS/…","GCP/…"). It previously also matched unresolved-location labels ("unknown","undetermined","missing","bogon"), which caused real requesters whose IPs could not be geolocated to be silently dropped fromnumber_of_requesters. (#291) - Fixed the IPInfo quota-exceeded fallback so daily remote tests return
undeterminedinstead of crashing on Python 3.14 when a warning is emitted. (#273)
- Rewrote this changelog to use the AGENTS.md section layout. (#246)
- Added
s3logextraction update ip refreshCLI command andrefresh_ip_to_region_codesAPI. Re-checks a partition of the existingip_to_regioncache against IPInfo each run, recording any changes in a log file under[cache_directory]/logs/. The partition size isceil(cache_size / 90), selected deterministically by today's date so that the entire cache is refreshed over a 90-day cycle.
- Added
s3logextraction completionandget_extraction_completionfor inventory-based extraction progress, including support for any end-record filename that ends withprocessing-end.txt. Also removed byte-size reporting from completion API and CLI output. (#231)
- Swapped all runtime type checking from
pydantictobeartype. (#228)
-
Added
number_of_requestersfield tototals.json(per dandiset) andarchive_totals.json(archive-wide). This reports the number of unique requester IP addresses per dandiset and for the entire archive. To protect privacy, the count is rounded to the nearest 10 and a"<10"sentinel is used for counts below 10. The unique requester count is intentionally not coupled to region information and is not reported at the per-asset level. (#220) -
Added a new
DownloadsLogicPreValidatorthat detects aberrant raw S3 log lines wherebytes_sentis a valid number and is less than the object size (total_bytes), yet the HTTP status code is exactly200. A200status indicates a complete download, sobytes_sentshould equal the object size. Any deviation is considered aberrant and causes the validator to raise aRuntimeError. The new protocol is also exposed through the CLI ass3logextraction validate downloads_logic <directory>. (#203) -
Added
number_of_downloadscolumn toby_day.tsv,by_asset.tsv, andby_region.tsvsummaries. This counts the number of complete downloads (HTTP status200) per grouping. Also addedtotal_number_of_downloadstototals.jsonandarchive_totals.json. (#213)
- Added Docker images built and published to GHCR (GitHub Container Registry). Available tags are
ghcr.io/dandi/s3-log-extraction:latest-minimalfor the minimal install from the latest PyPI release,ghcr.io/dandi/s3-log-extraction:latestfor the full install from the latest PyPI release, andghcr.io/dandi/s3-log-extraction:devfor the full install built from themainbranch. (#202)
- Added
number_of_requestscolumn toby_day.tsv,by_asset.tsv, andby_region.tsvsummaries. This counts the number of S3 log lines per grouping. Also addedtotal_number_of_requeststototals.jsonandarchive_totals.json. (#201)
- Added a new
downloadfield to the GAWK extraction step. The field is stored as plain text (download.txt) alongside the other extraction files. Its value is1when the raw log line has exactly a200HTTP status code and0otherwise. (#198)
- Added
inventory_s3_pathparameter toRemoteS3LogAccessExtractor.extract_s3_bucketand a new--inventoryCLI option. When an S3 inventory path is provided, unprocessed log files are discovered from the weekly inventory snapshot instead of performing lives5cmd lscalls against the bucket. The inventory file must be a plain-text file stored in S3 containing one full S3 URL per line. (#195)
-
Added functionality and tests for generating generic summaries. A big thanks to @rwblair for contributing this. (#103)
-
Exposed the flag
--batch-limittoupdate_index_to_region_codesand increased the timeout to the IP Info API. (#150) -
Removed all DANDI-specific functionality. This has been split into the extension package https://github.com/dandi/dandi-s3-log-extraction. (#154)
- Added a logo to the project. (#158)
- Added tests for the CLI. (#170)
- Support for child instances of DANDI has been added by way of an
--api-urlflag on the CLI fors3logextraction update summariesand anapi_urlparameter for the corresponding API methods. (#143)
- Moved some exposed imports to local levels to allow successful import of the package under minimal installation conditions. (#143)
- Upgraded the CLI to use
rich_clickfor better formatting. (#143)
-
Added
s3_log_extraction.extractors.RemoteS3LogAccessExtractorfor running extraction remotely rather than on local files. Also addeds3_log_extraction.extractors.DandiRemoteS3LogAccessExtractorfor DANDI-specific options. (#106, #108) -
Added a parallelization option for UNIX systems, with all but one CPU requested by default. (#105)
-
Now tracks
unassociatedaccess activity for DANDI summaries, which includes all extracted log data for blobs that do not match to any currently known Dandiset. (#124) -
Added
s3_log_extraction.dataase.bundle_databasefor creating a hive-partitioned Parquet-based database of the extraction cache for easier sharing. (#126) -
Added
bogonlabeling for IP addresses that are not routable on the public internet, such as private IPs and reserved ranges. This improves the update iteration ofs3logextraction update ip regions. (#109)
-
Fixed an issue related to duplication of access activity for assets that are duplicated, with multiple associated asset paths, within a Dandiset. Summary reports for DANDI prior to 7/27/2025 overcount due to this issue. (#120)
-
Fixed
s3logextraction update summaries --mode dandiwhen running withoutskiporpickoptions. (#109)
- First official release of the revamped
s3-log-extractiontool. (#102)
- Please see the README for usage instructions. (#89)