deepdata: core product code (backend, frontend, runtime, deepflow module)
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
"""
|
||||
Tar File Parser
|
||||
TAR 文件解析器
|
||||
"""
|
||||
import tarfile
|
||||
import os
|
||||
from typing import Optional
|
||||
|
||||
from app.module.operator.parsers.abstract_parser import AbstractParser
|
||||
from app.module.operator.schema import OperatorDto
|
||||
|
||||
|
||||
class TarParser(AbstractParser):
|
||||
"""TAR 压缩包解析器"""
|
||||
|
||||
def parse_yaml_from_archive(
|
||||
self,
|
||||
archive_path: str,
|
||||
entry_path: str,
|
||||
file_name: Optional[str] = None,
|
||||
file_size: Optional[int] = None
|
||||
) -> OperatorDto:
|
||||
"""从 TAR 文件中解析 YAML"""
|
||||
try:
|
||||
with tarfile.open(archive_path, 'r:*') as tar:
|
||||
for member in tar.getmembers():
|
||||
if member.name == entry_path or member.name.endswith(f"/{entry_path}"):
|
||||
file = tar.extractfile(member)
|
||||
if file:
|
||||
content = file.read().decode('utf-8')
|
||||
return self.parse_yaml(content, file_name, file_size)
|
||||
raise FileNotFoundError(f"File '{entry_path}' not found in archive")
|
||||
except (tarfile.TarError, EOFError) as e:
|
||||
raise ValueError(f"Failed to parse TAR file: {e}")
|
||||
|
||||
def extract_to(self, archive_path: str, target_dir: str) -> None:
|
||||
"""解压 TAR 文件到目标目录"""
|
||||
try:
|
||||
os.makedirs(target_dir, exist_ok=True)
|
||||
with tarfile.open(archive_path, 'r:*') as tar:
|
||||
# Safety check: prevent path traversal
|
||||
for member in tar.getmembers():
|
||||
if os.path.isabs(member.name) or ".." in member.name.split("/"):
|
||||
raise ValueError(f"Unsafe path in archive: {member.name}")
|
||||
tar.extractall(target_dir)
|
||||
except (tarfile.TarError, EOFError) as e:
|
||||
raise ValueError(f"Failed to extract TAR file: {e}")
|
||||
Reference in New Issue
Block a user