""" Удосконалений патч для виправлення проблем з правами доступу в Docker-контейнері HuggingFace Spaces. """ import os import sys import logging from pathlib import Path import shutil # Перевіряємо, чи в контейнері більш надійним способом def check_if_in_container(): # Метод 1: перевірка наявності файлу /.dockerenv if os.path.exists('/.dockerenv'): return True # Метод 2: перевірка cgroup try: with open('/proc/1/cgroup', 'r') as f: return 'docker' in f.read() or 'kubepods' in f.read() except: pass # Метод 3: перевірка прав запису в поточній директорії try: test_file = '.docker_test_write' with open(test_file, 'w') as f: f.write('test') os.remove(test_file) return False # Якщо можемо писати, то це не Docker або у нас є права except: # Не можемо писати - швидше за все, це контейнер return True return False IN_DOCKER = check_if_in_container() print(f"Docker-середовище виявлено: {IN_DOCKER}") # Завжди використовуємо патч для HuggingFace Spaces BASE_DIR = "/tmp/jira_assistant" # Створення директорій os.makedirs(BASE_DIR, exist_ok=True) for directory in ["data", "reports", "temp", "logs"]: os.makedirs(os.path.join(BASE_DIR, directory), exist_ok=True) print(f"Директорії створено в {BASE_DIR}") # Патчимо шляхи original_mkdir = Path.mkdir def patched_mkdir(self, mode=0o777, parents=False, exist_ok=False): path_str = str(self) if path_str in ['data', 'reports', 'temp', 'logs'] or path_str.startswith(('data/', 'reports/', 'temp/', 'logs/')): # Створюємо новий шлях в /tmp new_path = Path(os.path.join(BASE_DIR, path_str)) print(f"Перенаправлення mkdir: {path_str} -> {new_path}") return original_mkdir(new_path, mode, parents, exist_ok) # Спроба створити директорію безпосередньо try: return original_mkdir(self, mode, parents, exist_ok) except PermissionError: # Якщо немає прав, пробуємо створити в /tmp new_path = Path(os.path.join(BASE_DIR, path_str)) print(f"Перенаправлення mkdir після помилки: {path_str} -> {new_path}") return original_mkdir(new_path, mode, parents, exist_ok) # Заміняємо оригінальний метод на наш патч Path.mkdir = patched_mkdir # Налаштування логування try: log_path = os.path.join(BASE_DIR, "logs", "jira_assistant.log") log_handler = logging.FileHandler(log_path) print(f"Логування встановлено в: {log_path}") except Exception as e: print(f"Не вдалося створити файл логів: {e}") log_handler = logging.StreamHandler() print(f"Docker-патч активовано. Всі операції з файлами будуть перенаправлені в {BASE_DIR}")