PinkSky / server /file_manager.py
FreshPixels's picture
Rename file_manager.py to server/file_manager.py
30238d6 verified
Raw
History Blame Contribute Delete
4.02 kB
"""Работа с файлами"""
import os
import fnmatch
import logging
from typing import Dict, List, Tuple, Any
class FileManager:
SUPPORTED_EXTENSIONS = {
'.txt': 'text', '.py': 'python', '.js': 'javascript', '.html': 'html',
'.css': 'css', '.json': 'json', '.yaml': 'yaml', '.yml': 'yaml',
'.md': 'markdown', '.csv': 'csv', '.xml': 'xml', '.log': 'log',
'.sql': 'sql', '.sh': 'bash', '.bat': 'batch', '.ps1': 'powershell',
'.ipynb': 'jupyter'
}
def __init__(self, base_dir: str = "projects"):
self.base_dir = os.path.abspath(base_dir)
self.logger = logging.getLogger(__name__)
os.makedirs(self.base_dir, exist_ok=True)
self.logger.info(f"FileManager initialized with base_dir: {self.base_dir}")
def read_file(self, file_path: str, max_size: int = 100000) -> Tuple[str, str]:
full_path = os.path.join(self.base_dir, file_path)
try:
real_path = os.path.realpath(full_path)
if not real_path.startswith(os.path.realpath(self.base_dir)):
self.logger.warning(f"Path traversal attempt: {file_path}")
return ("", "▸ ✗ ᴀᴄᴄᴇss ᴅᴇɴɪᴇᴅ\nPath traversal detected ‼️")
except Exception as e:
self.logger.error(f"Path resolution failed: {e}")
return ("", "▸ ⚠️ ᴇʀʀᴏʀ\nPath resolution failed")
if not os.path.exists(full_path):
return ("", f"▸ ✗ ғɪʟᴇ ɴᴏᴛ Ғᴏᴜɴᴅ\n`{file_path}`")
try:
size = os.path.getsize(full_path)
if size > max_size:
return ("", f"▸ ⚠️ ᴛᴏᴏ ʟᴀʀɢᴇ\n{size} bytes > {max_size} limit")
with open(full_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
ext = os.path.splitext(file_path)[1].lower()
lang = self.SUPPORTED_EXTENSIONS.get(ext, 'text')
return (
content,
f"╭───────────────────╮\n"
f" │ 📖 {lang.upper()} ᴍᴏᴅᴇ │\n"
"├───────────────────┤\n"
f" │ `{file_path}` │\n"
f" │ {len(content)} chars read │\n"
"╰───────────────────╯"
)
except Exception as e:
self.logger.error(f"Read error for {file_path}: {e}")
return ("", f"▸ ⚠️ ʀᴇᴀᴅ ᴇʀʀᴏʀ\n{str(e)[:100]}")
def save_file(self, file_path: str, content: str) -> str:
full_path = os.path.join(self.base_dir, file_path)
try:
real_path = os.path.realpath(full_path)
if not real_path.startswith(os.path.realpath(self.base_dir)):
return "▸ ✗ ᴀᴄᴄᴇss ᴅᴇɴɪᴇᴅ\nPath traversal detected ‼️"
except Exception as e:
return f"▸ ⚠️ ᴘᴀᴛʜ ᴇʀʀᴏʀ\n{str(e)[:100]}"
try:
os.makedirs(os.path.dirname(full_path), exist_ok=True)
with open(full_path, 'w', encoding='utf-8') as f:
f.write(content)
return (
"╭───────────────────╮\n"
" │ 💾 Fɪʟᴇ ʀᴇᴄᴇɪᴠᴇᴅ │\n"
f" │ `{file_path}` │\n"
"├───────────────────┤\n"
f" │ {len(content)} chars saved │\n"
"╰───────────────────╯\n\n"
"Send a command to process it:\n"
"`/build Analyze this file`"
)
except Exception as e:
self.logger.error(f"Save error for {file_path}: {e}")
return f"▸ ⚠️ ᴡʀɪᴛᴇ ᴇʀʀᴏʀ\n{str(e)[:100]}"
FILE_MANAGER = FileManager()