Object Storage Layer for PR #1037

This commit is contained in:
k1nd0ne
2023-11-18 15:05:11 +01:00
parent 581c493f4f
commit fa2b840b55
@@ -0,0 +1,56 @@
# This file is Copyright 2022 Volatility Foundation and licensed under the Volatility Software License 1.0
# which is available at https://www.volatilityfoundation.org/license/vsl-v1.0
#
import logging
import urllib.parse
from typing import Optional, Any, List
try:
import s3fs
HAS_S3FS = True
except ImportError:
HAS_S3FS = False
try:
import gcsfs
HAS_GCSFS = True
except ImportError:
HAS_GCSFS = False
from volatility3.framework import exceptions
from volatility3.framework.layers import resources
vollog = logging.getLogger(__file__)
class S3FileSystemHandler(resources.VolatilityHandler):
if HAS_S3FS:
@classmethod
def non_cached_schemes(cls) -> List[str]:
return ["s3"]
@staticmethod
def default_open(req: urllib.request.Request) -> Optional[Any]:
"""Handles the request if it's the s3 scheme."""
if req.type == "s3":
object_uri = "://".join(req.full_url.split("://")[1:])
return s3fs.S3FileSystem().open(object_uri)
else:
raise exceptions.LayerException("s3 requirement is missing.")
class GSFileSystemHandler(resources.VolatilityHandler):
if HAS_GCSFS:
@classmethod
def non_cached_schemes(cls) -> List[str]:
return ["gs"]
@staticmethod
def default_open(req: urllib.request.Request) -> Optional[Any]:
"""Handles the request if it's the gs scheme."""
if req.type == "gs":
object_uri = "://".join(req.full_url.split("://")[1:])
return gcsfs.GCSFileSystem().open(object_uri)
return None
else:
raise exceptions.LayerException("gcsfs requirement is missing.")