assemblyline 4.7.4.dev7__tar.gz → 4.7.4.dev8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {assemblyline-4.7.4.dev7/assemblyline.egg-info → assemblyline-4.7.4.dev8}/PKG-INFO +1 -1
- assemblyline-4.7.4.dev8/assemblyline/VERSION +1 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/forge.py +2 -1
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/collection.py +1 -1
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/__init__.py +39 -8
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/azure.py +19 -12
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/base.py +2 -1
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/ftp.py +12 -8
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/http.py +8 -3
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/local.py +8 -4
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/s3.py +11 -7
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/sftp.py +8 -4
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8/assemblyline.egg-info}/PKG-INFO +1 -1
- assemblyline-4.7.4.dev7/assemblyline/VERSION +0 -1
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/LICENCE.md +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/MANIFEST.in +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/README.md +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/cachestore/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/archiving.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/attack_map.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/backupmanager.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/banner.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/bundling.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/caching.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/chunk.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/classification.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/classification.yml +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/cleanup_filestore.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/codec.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/comms.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/constants.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/custom.magic +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/custom.yara +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/dict_utils.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/digests.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/dispatcher.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/entropy.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/exceptions.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/file.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/heuristics.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/hexdump.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/identify.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/identify_defaults.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/importing.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/iprange.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/isotime.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/log.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/logformat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/lucene.lark +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/memory_zip.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/metrics.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/net.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/net_static.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/null.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/path.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/postprocess.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/random_user.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/security.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/signaturing.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/str_utils.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/tag_safelist.yml +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/tagging.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/threading.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/uid.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/version.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datasource/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datasource/al.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datasource/alert.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datasource/common.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/bulk.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/exceptions.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/helper.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/store.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/support/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/support/build.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/support/schemas.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/base.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/common.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/alert.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/alerter_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/archive_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/changes.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/dispatcher_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/dispatching.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/elastic_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/expiry_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/ingest_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/metrics.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/retrohunt_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/scaler_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/scaler_status_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/service_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/service_timing_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/submission.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/task.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/vacuum_heartbeat.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/actions.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/alert.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/apikey.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/badlist.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/cached_file.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/config.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/emptyresult.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/error.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/file.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/filescore.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/heuristic.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/file.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/filetypes/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/filetypes/pe.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/ontology.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/antivirus.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/http.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/malware_config.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/network.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/process.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/sandbox.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/signature.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/replay.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/result.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/retrohunt.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/safelist.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/service.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/service_delta.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/signature.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/statistics.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/submission.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/submission_summary.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/submission_tree.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/tagging.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/user.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/user_favorites.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/user_settings.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/workflow.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/random_data/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/random_data/create_test_data.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/random_data/sample_rules.yar +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/random_data/sample_suricata.rules +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/randomizer.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/py.typed +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/cache.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/counters.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/daily_quota_tracker.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/events.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/exporting_counter.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/hash.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/lock.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/comms.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/multi.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/named.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/priority.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/set.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/user_quota_tracker.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/run/__init__.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/run/cli.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/run/pubsub_reader.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/run/suricata_importer.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/run/yara_importer.py +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline.egg-info/SOURCES.txt +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline.egg-info/dependency_links.txt +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline.egg-info/entry_points.txt +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline.egg-info/requires.txt +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline.egg-info/top_level.txt +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/pyproject.toml +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/setup.cfg +0 -0
- {assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.7.4.dev8
|
|
@@ -9,10 +9,11 @@ from typing import TYPE_CHECKING, Optional
|
|
|
9
9
|
|
|
10
10
|
import elasticapm
|
|
11
11
|
import yaml
|
|
12
|
+
from hauntedhouse import Client
|
|
13
|
+
|
|
12
14
|
from assemblyline.common.constants import service_queue_name
|
|
13
15
|
from assemblyline.common.dict_utils import recursive_update
|
|
14
16
|
from assemblyline.common.importing import load_module_by_path
|
|
15
|
-
from hauntedhouse import Client
|
|
16
17
|
|
|
17
18
|
if TYPE_CHECKING:
|
|
18
19
|
from assemblyline.odm.models.config import Config
|
|
@@ -1224,7 +1224,7 @@ class ESCollection(Generic[ModelType]):
|
|
|
1224
1224
|
"""
|
|
1225
1225
|
if self.model_class:
|
|
1226
1226
|
fields = self.model_class.flat_fields(show_compound=True)
|
|
1227
|
-
if 'classification in fields
|
|
1227
|
+
if 'classification' in fields:
|
|
1228
1228
|
fields.update({"__access_lvl__": Integer(),
|
|
1229
1229
|
"__access_req__": List(Keyword()),
|
|
1230
1230
|
"__access_grp1__": List(Keyword()),
|
|
@@ -2,10 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
+
import time
|
|
5
6
|
from typing import TYPE_CHECKING, AnyStr, Optional, Tuple
|
|
6
7
|
from urllib.parse import parse_qs, unquote, urlparse
|
|
7
8
|
|
|
8
9
|
import elasticapm
|
|
10
|
+
|
|
9
11
|
from assemblyline.common.exceptions import get_stacktrace_info
|
|
10
12
|
from assemblyline.filestore.transport.azure import TransportAzure
|
|
11
13
|
from assemblyline.filestore.transport.base import TransportException
|
|
@@ -77,7 +79,7 @@ def create_transport(url, connection_attempts=None):
|
|
|
77
79
|
sftp: private_key (string), private_key_pass (string), validate_host (bool)
|
|
78
80
|
s3: aws_region (string), s3_bucket (string), use_ssl (bool), verify (bool)
|
|
79
81
|
file: normalize (bool)
|
|
80
|
-
azure: access_key (string), tenant_id (string), client_id (string), client_secret (string),
|
|
82
|
+
azure: access_key (string), tenant_id (string), client_id (string), client_secret (string),
|
|
81
83
|
allow_directory_access (bool), use_default_credentials (bool), initalize_container (bool)
|
|
82
84
|
|
|
83
85
|
"""
|
|
@@ -97,7 +99,7 @@ def create_transport(url, connection_attempts=None):
|
|
|
97
99
|
|
|
98
100
|
scheme = parsed.scheme.lower()
|
|
99
101
|
if scheme == 'ftp' or scheme == 'ftps':
|
|
100
|
-
valid_bool_keys = ['use_tls']
|
|
102
|
+
valid_bool_keys = ['use_tls', 'read_only']
|
|
101
103
|
extras = _get_extras(parse_qs(parsed.query), valid_bool_keys=valid_bool_keys)
|
|
102
104
|
if scheme == 'ftps':
|
|
103
105
|
extras['use_tls'] = True
|
|
@@ -106,27 +108,27 @@ def create_transport(url, connection_attempts=None):
|
|
|
106
108
|
|
|
107
109
|
elif scheme == "sftp":
|
|
108
110
|
valid_str_keys = ['private_key', 'private_key_pass']
|
|
109
|
-
valid_bool_keys = ['validate_host']
|
|
111
|
+
valid_bool_keys = ['validate_host', 'read_only']
|
|
110
112
|
extras = _get_extras(parse_qs(parsed.query), valid_str_keys=valid_str_keys, valid_bool_keys=valid_bool_keys)
|
|
111
113
|
|
|
112
114
|
t = TransportSFTP(base=base, host=host, password=password, user=user, port=port, **extras)
|
|
113
115
|
|
|
114
116
|
elif scheme == 'http' or scheme == 'https':
|
|
115
117
|
valid_str_keys = ['pki']
|
|
116
|
-
valid_bool_keys = ['verify']
|
|
118
|
+
valid_bool_keys = ['verify', 'read_only']
|
|
117
119
|
extras = _get_extras(parse_qs(parsed.query), valid_str_keys=valid_str_keys, valid_bool_keys=valid_bool_keys)
|
|
118
120
|
|
|
119
121
|
t = TransportHTTP(scheme=scheme, base=base, host=host, password=password, user=user, port=port, **extras)
|
|
120
122
|
|
|
121
123
|
elif scheme == 'file':
|
|
122
|
-
valid_bool_keys = ['normalize']
|
|
124
|
+
valid_bool_keys = ['normalize', 'read_only']
|
|
123
125
|
extras = _get_extras(parse_qs(parsed.query), valid_bool_keys=valid_bool_keys)
|
|
124
126
|
|
|
125
127
|
t = TransportLocal(base=base, **extras)
|
|
126
128
|
|
|
127
129
|
elif scheme == 's3':
|
|
128
130
|
valid_str_keys = ['aws_region', 's3_bucket']
|
|
129
|
-
valid_bool_keys = ['use_ssl', 'verify', 'boto_defaults']
|
|
131
|
+
valid_bool_keys = ['use_ssl', 'verify', 'boto_defaults', 'read_only']
|
|
130
132
|
extras = _get_extras(parse_qs(parsed.query), valid_str_keys=valid_str_keys, valid_bool_keys=valid_bool_keys)
|
|
131
133
|
|
|
132
134
|
# If user/password not specified, access might be dictated by IAM roles
|
|
@@ -138,7 +140,7 @@ def create_transport(url, connection_attempts=None):
|
|
|
138
140
|
|
|
139
141
|
elif scheme == 'azure':
|
|
140
142
|
valid_str_keys = ['access_key', 'tenant_id', 'client_id', 'client_secret']
|
|
141
|
-
valid_bool_keys = ['allow_directory_access', 'use_default_credentials', 'initalize_container']
|
|
143
|
+
valid_bool_keys = ['allow_directory_access', 'use_default_credentials', 'initalize_container', 'read_only']
|
|
142
144
|
extras = _get_extras(parse_qs(parsed.query), valid_str_keys=valid_str_keys, valid_bool_keys=valid_bool_keys)
|
|
143
145
|
|
|
144
146
|
t = TransportAzure(base=base, host=host, connection_attempts=connection_attempts, **extras)
|
|
@@ -150,6 +152,8 @@ def create_transport(url, connection_attempts=None):
|
|
|
150
152
|
|
|
151
153
|
|
|
152
154
|
class FileStore(object):
|
|
155
|
+
SLOW_OP_THRESHOLD = 5.0 # Log warning when a single filestore operation exceeds this (seconds)
|
|
156
|
+
|
|
153
157
|
def __init__(self, *transport_urls, connection_attempts=None):
|
|
154
158
|
self.log = logging.getLogger('assemblyline.transport')
|
|
155
159
|
self.transport_urls = transport_urls
|
|
@@ -168,7 +172,11 @@ class FileStore(object):
|
|
|
168
172
|
self.close()
|
|
169
173
|
|
|
170
174
|
def __str__(self):
|
|
171
|
-
|
|
175
|
+
out = ', '.join(str(t) for t in self.transports)
|
|
176
|
+
read_only_transports = [str(t) for t in self.transports if t.read_only]
|
|
177
|
+
if read_only_transports:
|
|
178
|
+
out += " | read-only: {}".format(', '.join(read_only_transports))
|
|
179
|
+
return out
|
|
172
180
|
|
|
173
181
|
def close(self):
|
|
174
182
|
for t in self.transports:
|
|
@@ -182,6 +190,10 @@ class FileStore(object):
|
|
|
182
190
|
def delete(self, path: str, location='all'):
|
|
183
191
|
with elasticapm.capture_span(name='delete', span_type='filestore', labels={'path': path}):
|
|
184
192
|
for t in self.slice(location):
|
|
193
|
+
if t.read_only:
|
|
194
|
+
# Don't attempt to delete from read only transports
|
|
195
|
+
continue
|
|
196
|
+
|
|
185
197
|
try:
|
|
186
198
|
t.delete(path)
|
|
187
199
|
except Exception as ex:
|
|
@@ -193,6 +205,7 @@ class FileStore(object):
|
|
|
193
205
|
successful = False
|
|
194
206
|
transports = []
|
|
195
207
|
download_errors = []
|
|
208
|
+
start = time.monotonic()
|
|
196
209
|
for t in self.slice(location):
|
|
197
210
|
try:
|
|
198
211
|
t.download(src_path, dest_path)
|
|
@@ -202,6 +215,11 @@ class FileStore(object):
|
|
|
202
215
|
except Exception as ex:
|
|
203
216
|
download_errors.append((str(t), str(ex)))
|
|
204
217
|
|
|
218
|
+
elapsed = time.monotonic() - start
|
|
219
|
+
if elapsed > self.SLOW_OP_THRESHOLD:
|
|
220
|
+
self.log.warning("Slow filestore download: %s took %.2fs (transports tried: %d)",
|
|
221
|
+
src_path, elapsed, len(download_errors) + len(transports))
|
|
222
|
+
|
|
205
223
|
if not successful:
|
|
206
224
|
raise FileStoreException('No transport succeeded => %s' % json.dumps(download_errors))
|
|
207
225
|
return transports
|
|
@@ -240,6 +258,10 @@ class FileStore(object):
|
|
|
240
258
|
def put(self, dst_path: str, content: AnyStr, location='all', force=False) -> list[Transport]:
|
|
241
259
|
transports = []
|
|
242
260
|
for t in self.slice(location):
|
|
261
|
+
if t.read_only:
|
|
262
|
+
# Skip saving files to read-only transports
|
|
263
|
+
continue
|
|
264
|
+
|
|
243
265
|
if force or not t.exists(dst_path):
|
|
244
266
|
transports.append(t)
|
|
245
267
|
t.put(dst_path, content)
|
|
@@ -263,13 +285,22 @@ class FileStore(object):
|
|
|
263
285
|
@elasticapm.capture_span(span_type='filestore')
|
|
264
286
|
def upload(self, src_path: str, dst_path: str, location='all', force=False, verify=False) -> list[Transport]:
|
|
265
287
|
transports = []
|
|
288
|
+
start = time.monotonic()
|
|
266
289
|
for t in self.slice(location):
|
|
290
|
+
if t.read_only:
|
|
291
|
+
# Skip saving files to read-only transports
|
|
292
|
+
continue
|
|
293
|
+
|
|
267
294
|
if force or not t.exists(dst_path):
|
|
268
295
|
transports.append(t)
|
|
269
296
|
t.upload(src_path, dst_path)
|
|
270
297
|
if verify and not t.exists(dst_path):
|
|
271
298
|
raise FileStoreException('File transfer failed. Remote file does not '
|
|
272
299
|
'exist for %s on %s (%s)' % (dst_path, location, t))
|
|
300
|
+
elapsed = time.monotonic() - start
|
|
301
|
+
if elapsed > self.SLOW_OP_THRESHOLD:
|
|
302
|
+
self.log.warning("Slow filestore upload: %s took %.2fs across %d transport(s)",
|
|
303
|
+
dst_path, elapsed, len(transports))
|
|
273
304
|
return transports
|
|
274
305
|
|
|
275
306
|
@elasticapm.capture_span(span_type='filestore')
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/azure.py
RENAMED
|
@@ -4,8 +4,6 @@ import time
|
|
|
4
4
|
from io import BytesIO
|
|
5
5
|
from typing import Iterable, Optional
|
|
6
6
|
|
|
7
|
-
from assemblyline.common.exceptions import ChainAll
|
|
8
|
-
from assemblyline.filestore.transport.base import Transport, TransportException
|
|
9
7
|
from azure.core.exceptions import (
|
|
10
8
|
ClientAuthenticationError,
|
|
11
9
|
DecodeError,
|
|
@@ -17,9 +15,16 @@ from azure.core.exceptions import (
|
|
|
17
15
|
ServiceRequestError,
|
|
18
16
|
TooManyRedirectsError,
|
|
19
17
|
)
|
|
20
|
-
from azure.identity import
|
|
18
|
+
from azure.identity import (
|
|
19
|
+
ClientSecretCredential,
|
|
20
|
+
DefaultAzureCredential,
|
|
21
|
+
WorkloadIdentityCredential,
|
|
22
|
+
)
|
|
21
23
|
from azure.storage.blob import BlobServiceClient
|
|
22
24
|
|
|
25
|
+
from assemblyline.common.exceptions import ChainAll
|
|
26
|
+
from assemblyline.filestore.transport.base import Transport, TransportException
|
|
27
|
+
|
|
23
28
|
"""
|
|
24
29
|
This class assumes a flat file structure in the Azure storage blob.
|
|
25
30
|
"""
|
|
@@ -30,7 +35,7 @@ class TransportAzure(Transport):
|
|
|
30
35
|
|
|
31
36
|
def __init__(self, base=None, access_key=None, tenant_id=None, client_id=None, client_secret=None,
|
|
32
37
|
host=None, connection_attempts=None, allow_directory_access=False, use_default_credentials=False,
|
|
33
|
-
initalize_container=True):
|
|
38
|
+
initalize_container=True, read_only=False):
|
|
34
39
|
self.log = logging.getLogger('assemblyline.transport.azure')
|
|
35
40
|
self.read_only = False
|
|
36
41
|
self.connection_attempts: Optional[int] = connection_attempts
|
|
@@ -76,13 +81,15 @@ class TransportAzure(Transport):
|
|
|
76
81
|
except TransportException as e:
|
|
77
82
|
if not isinstance(e.cause, ResourceNotFoundError):
|
|
78
83
|
raise
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
if not read_only:
|
|
85
|
+
# Attempt to initialize the container if it doesn't exist if the transport is writable
|
|
86
|
+
try:
|
|
87
|
+
self.with_retries(self.container_client.create_container)
|
|
88
|
+
except TransportException as error:
|
|
89
|
+
if not isinstance(error.cause, ResourceNotFoundError):
|
|
90
|
+
raise
|
|
91
|
+
self.log.info('Failed to create container, we\'re most likely in read only mode')
|
|
92
|
+
read_only = True
|
|
86
93
|
|
|
87
94
|
def azure_normalize(path):
|
|
88
95
|
# flatten path to just the basename
|
|
@@ -94,7 +101,7 @@ class TransportAzure(Transport):
|
|
|
94
101
|
else:
|
|
95
102
|
return path
|
|
96
103
|
|
|
97
|
-
super(TransportAzure, self).__init__(normalize=azure_normalize)
|
|
104
|
+
super(TransportAzure, self).__init__(normalize=azure_normalize, read_only=read_only)
|
|
98
105
|
|
|
99
106
|
def __str__(self):
|
|
100
107
|
return f"azure://{self.host}/{self.blob_container}/"
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/base.py
RENAMED
|
@@ -33,8 +33,9 @@ class Transport(object):
|
|
|
33
33
|
TransportExceptions.
|
|
34
34
|
"""
|
|
35
35
|
|
|
36
|
-
def __init__(self, normalize=normalize_srl_path):
|
|
36
|
+
def __init__(self, normalize=normalize_srl_path, read_only=False):
|
|
37
37
|
self.normalize = normalize
|
|
38
|
+
self.read_only = read_only
|
|
38
39
|
|
|
39
40
|
def close(self):
|
|
40
41
|
pass
|
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import errno
|
|
2
4
|
import ftplib
|
|
3
5
|
import logging
|
|
4
6
|
import os
|
|
5
7
|
import os.path
|
|
6
8
|
import posixpath
|
|
7
|
-
import
|
|
9
|
+
import re
|
|
8
10
|
import socket
|
|
11
|
+
import threading
|
|
9
12
|
import time
|
|
10
|
-
import errno
|
|
11
13
|
import weakref
|
|
12
|
-
import re
|
|
13
|
-
|
|
14
14
|
from io import BytesIO
|
|
15
|
-
from typing import
|
|
15
|
+
from typing import AnyStr, Iterable, Optional, Union
|
|
16
16
|
|
|
17
17
|
from assemblyline.common.exceptions import ChainAll
|
|
18
18
|
from assemblyline.common.path import splitpath
|
|
19
19
|
from assemblyline.common.uid import get_random_id
|
|
20
|
-
from assemblyline.filestore.transport.base import
|
|
20
|
+
from assemblyline.filestore.transport.base import (
|
|
21
|
+
Transport,
|
|
22
|
+
TransportException,
|
|
23
|
+
normalize_srl_path,
|
|
24
|
+
)
|
|
21
25
|
|
|
22
26
|
NORMALIZED = re.compile('[a-z0-9]/[a-z0-9]/[a-z0-9]/[a-z0-9]/[a-z0-9]{64}')
|
|
23
27
|
|
|
@@ -105,7 +109,7 @@ class TransportFTP(Transport):
|
|
|
105
109
|
FTP Transport class.
|
|
106
110
|
"""
|
|
107
111
|
|
|
108
|
-
def __init__(self, base=None, host=None, password=None, user=None, port=None, use_tls=None):
|
|
112
|
+
def __init__(self, base=None, host=None, password=None, user=None, port=None, use_tls=None, read_only=False):
|
|
109
113
|
self.log: logging.Logger = logging.getLogger('assemblyline.transport.ftp')
|
|
110
114
|
self.base: str = base
|
|
111
115
|
self.ftp_objects: weakref.WeakKeyDictionary[threading.Thread, ftplib.FTP] = weakref.WeakKeyDictionary()
|
|
@@ -127,7 +131,7 @@ class TransportFTP(Transport):
|
|
|
127
131
|
self.log.debug('ftp normalized: %s -> %s', path, s)
|
|
128
132
|
return s
|
|
129
133
|
|
|
130
|
-
super(TransportFTP, self).__init__(normalize=ftp_normalize)
|
|
134
|
+
super(TransportFTP, self).__init__(normalize=ftp_normalize, read_only=read_only)
|
|
131
135
|
|
|
132
136
|
@property
|
|
133
137
|
def ftp(self) -> Union[ftplib.FTP, ftplib.FTP_TLS]:
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/http.py
RENAMED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
3
|
import posixpath
|
|
4
|
+
|
|
4
5
|
import requests
|
|
5
6
|
|
|
6
7
|
from assemblyline.common.exceptions import ChainAll
|
|
7
|
-
from assemblyline.filestore.transport.base import
|
|
8
|
+
from assemblyline.filestore.transport.base import (
|
|
9
|
+
Transport,
|
|
10
|
+
TransportException,
|
|
11
|
+
normalize_srl_path,
|
|
12
|
+
)
|
|
8
13
|
|
|
9
14
|
|
|
10
15
|
@ChainAll(TransportException)
|
|
@@ -13,7 +18,7 @@ class TransportHTTP(Transport):
|
|
|
13
18
|
HTTP Transport class.
|
|
14
19
|
"""
|
|
15
20
|
|
|
16
|
-
def __init__(self, scheme='http', base=None, host=None, password=None, user=None, pki=None, port=None, verify=None):
|
|
21
|
+
def __init__(self, scheme='http', base=None, host=None, password=None, user=None, pki=None, port=None, verify=None, read_only=False):
|
|
17
22
|
self.log = logging.getLogger('assemblyline.transport.http')
|
|
18
23
|
self.base = base
|
|
19
24
|
self.host = host
|
|
@@ -45,7 +50,7 @@ class TransportHTTP(Transport):
|
|
|
45
50
|
|
|
46
51
|
self._session = None
|
|
47
52
|
|
|
48
|
-
super(TransportHTTP, self).__init__(normalize=http_normalize)
|
|
53
|
+
super(TransportHTTP, self).__init__(normalize=http_normalize, read_only=read_only)
|
|
49
54
|
|
|
50
55
|
@property
|
|
51
56
|
def session(self):
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/local.py
RENAMED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
-
import shutil
|
|
4
3
|
import re
|
|
4
|
+
import shutil
|
|
5
5
|
from typing import AnyStr, Iterable, Optional
|
|
6
6
|
|
|
7
7
|
from assemblyline.common.exceptions import ChainAll
|
|
8
8
|
from assemblyline.common.path import strip_path_inclusion
|
|
9
9
|
from assemblyline.common.uid import get_random_id
|
|
10
|
-
from assemblyline.filestore.transport.base import
|
|
10
|
+
from assemblyline.filestore.transport.base import (
|
|
11
|
+
Transport,
|
|
12
|
+
TransportException,
|
|
13
|
+
normalize_srl_path,
|
|
14
|
+
)
|
|
11
15
|
|
|
12
16
|
NORMALIZED = re.compile('[a-z0-9]/[a-z0-9]/[a-z0-9]/[a-z0-9]/[a-z0-9]{64}')
|
|
13
17
|
|
|
@@ -18,7 +22,7 @@ class TransportLocal(Transport):
|
|
|
18
22
|
Local file system Transport class.
|
|
19
23
|
"""
|
|
20
24
|
|
|
21
|
-
def __init__(self, base=None, normalize=None):
|
|
25
|
+
def __init__(self, base=None, normalize=None, read_only=False):
|
|
22
26
|
self.log = logging.getLogger('assemblyline.transport.local')
|
|
23
27
|
self.base = base
|
|
24
28
|
self.host = "localhost"
|
|
@@ -38,7 +42,7 @@ class TransportLocal(Transport):
|
|
|
38
42
|
if not normalize:
|
|
39
43
|
normalize = local_normalize
|
|
40
44
|
|
|
41
|
-
super(TransportLocal, self).__init__(normalize=normalize)
|
|
45
|
+
super(TransportLocal, self).__init__(normalize=normalize, read_only=read_only)
|
|
42
46
|
|
|
43
47
|
def delete(self, path):
|
|
44
48
|
normal_path = self.normalize(path)
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import boto3
|
|
2
1
|
import logging
|
|
3
2
|
import os
|
|
4
3
|
import tempfile
|
|
5
4
|
import threading
|
|
6
|
-
|
|
5
|
+
from io import BytesIO
|
|
7
6
|
from typing import Iterable, Optional
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
from
|
|
8
|
+
import boto3
|
|
9
|
+
from botocore.exceptions import (
|
|
10
|
+
ClientError,
|
|
11
|
+
ConnectionClosedError,
|
|
12
|
+
EndpointConnectionError,
|
|
13
|
+
)
|
|
11
14
|
|
|
12
15
|
from assemblyline.common.exceptions import ChainAll
|
|
13
16
|
from assemblyline.filestore.transport.base import Transport, TransportException
|
|
@@ -32,7 +35,7 @@ class TransportS3(Transport):
|
|
|
32
35
|
DEFAULT_HOST = "s3.amazonaws.com"
|
|
33
36
|
|
|
34
37
|
def __init__(self, base=None, accesskey=None, secretkey=None, aws_region=None, s3_bucket="al-storage",
|
|
35
|
-
host=None, port=None, use_ssl=None, verify=True, connection_attempts=None, boto_defaults=False):
|
|
38
|
+
host=None, port=None, use_ssl=None, verify=True, connection_attempts=None, boto_defaults=False, read_only=False):
|
|
36
39
|
self.log = logging.getLogger('assemblyline.transport.s3')
|
|
37
40
|
self.base = base
|
|
38
41
|
self.bucket = s3_bucket
|
|
@@ -88,7 +91,8 @@ class TransportS3(Transport):
|
|
|
88
91
|
else:
|
|
89
92
|
raise
|
|
90
93
|
|
|
91
|
-
if not bucket_exist:
|
|
94
|
+
if not bucket_exist and not read_only:
|
|
95
|
+
# Only initialize the bucket if the transport has been deemed writable.
|
|
92
96
|
try:
|
|
93
97
|
self.with_retries(self.client.create_bucket, Bucket=self.bucket)
|
|
94
98
|
except TransportException as e:
|
|
@@ -102,7 +106,7 @@ class TransportS3(Transport):
|
|
|
102
106
|
# flatten path to just the basename
|
|
103
107
|
return os.path.basename(path)
|
|
104
108
|
|
|
105
|
-
super(TransportS3, self).__init__(normalize=s3_normalize)
|
|
109
|
+
super(TransportS3, self).__init__(normalize=s3_normalize, read_only=read_only)
|
|
106
110
|
|
|
107
111
|
def __str__(self):
|
|
108
112
|
out = "s3://"
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/sftp.py
RENAMED
|
@@ -4,7 +4,6 @@ import posixpath
|
|
|
4
4
|
import tempfile
|
|
5
5
|
import warnings
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
# Stop Blowfish deprecation warning
|
|
9
8
|
with warnings.catch_warnings():
|
|
10
9
|
warnings.simplefilter("ignore")
|
|
@@ -12,11 +11,16 @@ with warnings.catch_warnings():
|
|
|
12
11
|
import pysftp
|
|
13
12
|
|
|
14
13
|
from io import BytesIO
|
|
14
|
+
|
|
15
15
|
from paramiko import SSHException
|
|
16
16
|
|
|
17
17
|
from assemblyline.common.exceptions import ChainAll
|
|
18
18
|
from assemblyline.common.uid import get_random_id
|
|
19
|
-
from assemblyline.filestore.transport.base import
|
|
19
|
+
from assemblyline.filestore.transport.base import (
|
|
20
|
+
Transport,
|
|
21
|
+
TransportException,
|
|
22
|
+
normalize_srl_path,
|
|
23
|
+
)
|
|
20
24
|
|
|
21
25
|
|
|
22
26
|
def reconnect_retry_on_fail(func):
|
|
@@ -63,7 +67,7 @@ class TransportSFTP(Transport):
|
|
|
63
67
|
"""
|
|
64
68
|
|
|
65
69
|
def __init__(self, base=None, host=None, password=None, user=None, port=None, private_key=None,
|
|
66
|
-
private_key_pass=None, validate_host=False):
|
|
70
|
+
private_key_pass=None, validate_host=False, read_only=False):
|
|
67
71
|
self.log = logging.getLogger('assemblyline.transport.sftp')
|
|
68
72
|
if base == "/":
|
|
69
73
|
self.base = "./"
|
|
@@ -102,7 +106,7 @@ class TransportSFTP(Transport):
|
|
|
102
106
|
self.log.debug('sftp normalized: %s -> %s', path, s)
|
|
103
107
|
return s
|
|
104
108
|
|
|
105
|
-
super(TransportSFTP, self).__init__(normalize=sftp_normalize)
|
|
109
|
+
super(TransportSFTP, self).__init__(normalize=sftp_normalize, read_only=read_only)
|
|
106
110
|
|
|
107
111
|
def __str__(self):
|
|
108
112
|
return 'sftp://{}@{}{}'.format(self.user, self.host, self.base)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
4.7.4.dev7
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/cleanup_filestore.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/common/identify_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/support/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/datastore/support/schemas.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/filestore/transport/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/alerter_heartbeat.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/archive_heartbeat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/dispatching.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/elastic_heartbeat.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/expiry_heartbeat.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/ingest_heartbeat.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/retrohunt_heartbeat.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/scaler_heartbeat.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/service_heartbeat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/messages/vacuum_heartbeat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/__init__.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/file.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/filetypes/pe.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/ontology.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/ontology/results/http.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/service_delta.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/submission_summary.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/submission_tree.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/user_favorites.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/models/user_settings.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/random_data/__init__.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/random_data/create_test_data.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/odm/random_data/sample_rules.yar
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/counters.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline-4.7.4.dev7 → assemblyline-4.7.4.dev8}/assemblyline.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|