File size: 3,373 Bytes
bb6217a
85fa921
bb6217a
 
 
 
 
 
 
 
85fa921
 
 
 
 
bb6217a
85fa921
bb6217a
85fa921
 
 
 
bb6217a
85fa921
 
 
 
 
 
 
 
 
 
bb6217a
85fa921
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bb6217a
85fa921
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""
Удосконалений патч для виправлення проблем з правами доступу в 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}")