Compare commits

...

9 Commits

10 changed files with 336 additions and 140 deletions

4
.gitignore vendored
View File

@ -1,5 +1,5 @@
*.log
*.logger
modules/__pycache__
*.idea
app.log
app.logger
.gigaide

View File

@ -1,5 +1,5 @@
import json
from .log import *
from .logger import *
from .env_var import *
def var(var_name):

View File

@ -1,7 +1,7 @@
import os
import requests
from tqdm import tqdm
from .log import *
from .logger import *
from .files_worker import *
def try_download(url, save_path=None):
@ -16,9 +16,13 @@ def try_download(url, save_path=None):
response = requests.get(url, stream=True)
response.raise_for_status() # Проверяем, что запрос успешен
# Определяем имя файла, если save_path не указан
# TODO: добавить проверку хэш-суммы из ссылки на файл
# TODO: резерв места
# TODO: проверка и докачка 3 попытки
# Определяем имя файла, если save_path не указан, или путь это директория
if save_path is None:
save_path = os.path.basename(url)
save_path = tmp_path + "/" + os.path.basename(url)
elif os.path.isdir(save_path):
save_path = save_path + "/" + os.path.basename(url)
@ -39,9 +43,12 @@ def try_download(url, save_path=None):
progress_bar.update(len(chunk)) # Обновляем прогресс-бар
log.info(f"Файл успешно скачан и сохранён как {save_path}.")
return True
except requests.exceptions.RequestException as e:
log.error(f"Ошибка при скачивании файла: {e}")
except Exception as e:
log.error(f"Неизвестная ошибка: {e}")
except KeyboardInterrupt as e:
log.error(f"Прервано пользователем: {e}")
return False

View File

@ -1,5 +1,5 @@
import os
from .log import *
from .logger import *
# функции обработки переменных LINUX окружения
def print_env_var(*var_name):
@ -20,6 +20,8 @@ def set_env_var_force(var_name, value):
def get_env_var(var_name):
if var_name in os.environ and os.environ[var_name]:
return os.environ[var_name]
elif var_name == "DEBUG":
...
else:
log.critical(f"Переменная {var_name} не определена")

View File

@ -3,8 +3,23 @@ import shutil
import filecmp
import tarfile
import hashlib
import tempfile
from .log import *
from .env_var import *
from .config_parser import *
from .logger import *
# константы:
tmp_path = tempfile.gettempdir() + "/portproton"
work_path = get_env_var("USER_WORK_PATH")
data_path = work_path + "/data"
dist_path = data_path + "/dist"
img_path = data_path + "/img"
vulkan_path = data_path + "/vulkan"
plugins_path = data_path + "/plugins_v" + var("plugins_ver")
libs_path = data_path + "/libs_v" + var("libs_ver")
log.info(f"рабочий каталог: {work_path}")
def try_copy_file(source, destination): # функция копирования если файлы различаются
if not os.path.exists(source):
@ -62,6 +77,21 @@ def try_force_link_dir(path, link):
except Exception as e:
log.error(f"failed to create link for file: {e}")
def try_move_dir(src, dst): # Перемещает каталог src в dst, заменяя существующие файлы.
for src_dir, dirs, files in os.walk(src):
dst_dir = src_dir.replace(src, dst, 1)
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
for file_ in files:
src_file = os.path.join(src_dir, file_)
dst_file = os.path.join(dst_dir, file_)
if os.path.exists(dst_file):
if os.path.samefile(src_file, dst_file):
continue
os.remove(dst_file)
shutil.move(src_file, dst_dir)
try_remove_dir(src)
def replace_file(file_path, file_name): # функция замены файла (сначала запись во временный файл, потом замена)
try:
if os.path.exists(file_name) and os.path.getsize(file_name) > 0:
@ -88,16 +118,15 @@ def try_remove_dir(path):
except Exception as e:
log.error(f"failed to remove directory: {e}")
def get_last_modified_time(file_path): # функция получения времени последнего изменения файла
def get_last_modified_time(file_path, fallback=None): # Добавьте fallback как необязательный параметр
try:
return os.path.getmtime(file_path)
except FileNotFoundError:
log.warning(f"Файл не найден: {file_path}")
return None
return fallback # Возврат значения по умолчанию
except Exception as e:
log.error(f"Ошибка при получении времени изменения файла {file_path}: {e}")
return None
return fallback # Возврат значения по умолчанию
def unpack(archive_path, extract_to=None):
# Проверяем, существует ли архив
@ -106,15 +135,17 @@ def unpack(archive_path, extract_to=None):
return False
try:
if extract_to is None:
# TODO: перенести распаковку по умолчанию в tmp
extract_to = os.path.dirname(archive_path)
extract_to = tmp_path + "/" + os.path.dirname(archive_path)
elif not os.path.isdir(extract_to):
create_new_dir(extract_to)
log.info(f"unpacking file: {archive_path}")
# TODO: резерв места
with tarfile.open(archive_path, mode="r:*") as tar:
tar.extractall(path=extract_to)
full_path = os.path.realpath(extract_to)
log.info(f"Архив {archive_path} успешно распакован в {full_path}")
except tarfile.TarError as e:
log.error(f"Ошибка при распаковке архива {archive_path}: {e}")
return False
@ -128,9 +159,7 @@ def unpack(archive_path, extract_to=None):
return True
def check_hash_sum(check_file, check_sum):
if check_sum and isinstance(check_sum, str):
true_hash = check_sum
elif os.path.isfile(check_sum):
if os.path.isfile(check_sum):
try:
with open(check_sum, "r", encoding="utf-8") as file:
first_line = file.readline().strip()
@ -143,6 +172,8 @@ def check_hash_sum(check_file, check_sum):
log.error(f"Файл {check_sum} не найден.")
except Exception as e:
log.error(f"Ошибка при чтении файла: {e}")
elif check_sum and isinstance(check_sum, str):
true_hash = check_sum
else:
log.error(f"Verification sha256sum was failed: {check_file}")

View File

@ -1,27 +1,43 @@
import os
import shutil
import subprocess
from .log import *
from .logger import *
from .env_var import *
from .files_worker import *
from .config_parser import *
from .downloader import *
def init_wine(dist_path):
used_wine_upper = var("used_wine").upper()
def init_wine(wine_version=None):
if wine_version is None:
used_wine = var("used_wine")
else:
used_wine = wine_version
# TODO: будем переименовывать все каталоги wine в верхний регистр?
if used_wine_upper != "SYSTEM":
if used_wine_upper == "WINE_LG":
if used_wine.upper() != "SYSTEM":
if used_wine.upper() == "WINE_LG":
used_wine = var("default_wine")
elif used_wine_upper == "PROTON_LG":
elif used_wine.upper() == "PROTON_LG":
used_wine = var("default_proton")
wine_path = dist_path + "/" + used_wine
if not os.path.exists(wine_path + "/bin/wine"):
# TODO: если нет wine то качаем и распаковываем
log.warning(f"{used_wine} not found. Try download...")
# TODO: использовать зеркало при необходимости
# url_github_lg="https://github.com/Castro-Fidel/wine_builds/releases/download/" + used_wine + "/" + used_wine
url_cloud_lg="https://cloud.linux-gaming.ru/portproton/" + used_wine
if try_download(url_cloud_lg + ".tar.xz") and try_download(url_cloud_lg + ".sha256sum"):
if check_hash_sum(tmp_path + "/" + used_wine + ".tar.xz", tmp_path + "/" + used_wine + ".sha256sum"):
unpack(tmp_path + "/" + used_wine + ".tar.xz", dist_path)
for f in [".tar.xz", ".sha256sum"]:
try_remove_file(tmp_path + "/" + used_wine + f)
if not os.path.exists(wine_path + "/bin/wine"):
log.critical(f"{used_wine} not found. Interrupt!")
@ -39,12 +55,24 @@ def init_wine(dist_path):
set_env_var_force("MEDIACONV_BLANK_VIDEO_FILE", wine_share + "/media/blank.mkv")
set_env_var_force("MEDIACONV_BLANK_AUDIO_FILE", wine_share + "/media/blank.ptna")
# TODO: mono, gecko
for wine_utils in ["mono", "gecko"]:
if not os.path.islink(wine_share + "/wine/" + wine_utils):
if os.path.isdir(wine_share + "/wine/" + wine_utils):
try_move_dir(wine_share + "/wine/" + wine_utils, data_path + "/" + wine_utils)
try_force_link_dir(data_path + "/" + wine_utils, wine_share + "/wine/" + wine_utils)
else:
# TODO: добавить проверку системного вайна
wine_path = "/usr"
try:
result = subprocess.run(['wine', '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
log.info(f"Используется системная версия WINE: {result.stdout.strip()}")
wine_path = "/usr"
else:
log.critical("Произошла ошибка во время получения версии системного WINE.")
except FileNotFoundError:
log.critical("Команда wine не найдена в системе.")
# общие переменные окружения для любой версии wine
set_env_var_force("WINE", wine_path + "/bin/wine")
set_env_var_force("WINELOADER", wine_path + "/bin/wine")

View File

@ -22,7 +22,7 @@ class ColoredFormatter(logging.Formatter):
log = logging.getLogger() # Настраиваем логирование
def set_logging_level(level_string):
def set_logging_level(level_string="INFO"):
levels = {
'DEBUG': logging.DEBUG,
'INFO': logging.INFO,
@ -36,15 +36,11 @@ def set_logging_level(level_string):
print(f"Неизвестный уровень логирования: {level_string}. Устанавливается уровень WARNING.")
return level
log_level_input = 'DEBUG' # Задаем уровень логирования через функцию
log.setLevel(set_logging_level(log_level_input))
handler = logging.StreamHandler() # Создаем консольный обработчик
handler.setFormatter(ColoredFormatter('%(levelname)s: %(message)s'))
# TODO: добавить условие для управления переменой пути сохранения лога
log_file_path = 'app.log' # Это может быть переменная, установленная пользователем
log_file_path = 'portproton.log' # Это может быть переменная, установленная пользователем
file_handler = logging.FileHandler(log_file_path) # Создаем файловый обработчик
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s: %(message)s'))

View File

@ -1,109 +1,133 @@
import re
import requests
import time
from modules.downloader import try_download
from modules.files_worker import *
count_wines = 25 # Количество элементов для записи в .tmp файл
repos = { # Список репозиториев для обработки и их короткие имена
"GloriousEggroll/proton-ge-custom": "proton-ge-custom",
"Kron4ek/Wine-Builds": "Kron4ek",
"GloriousEggroll/wine-ge-custom": "wine-ge-custom",
"Kron4ek/Wine-Builds": "Kron4ek",
"CachyOS/proton-cachyos": "proton-cachyos",
"Castro-Fidel/wine_builds": "LG"
}
def source_list_checker(tmp_path): # Проверка наличия и обновления файлов со списками исходников
mirrors = {
"https://cloud.linux-gaming.ru": "LG_mirror"
}
def source_list_checker():
for repo, short_name in repos.items():
output_file = os.path.join(tmp_path, f"{short_name}.tmp")
if not os.path.exists(output_file):
log.info(f"Файл {output_file} не существует. Получаем данные из репозитория.")
source_list_downloader(repo, tmp_path, short_name, output_file)
continue # Переходим к следующему репозиторию
if os.path.getsize(output_file) == 0: # Проверяем, является ли файл пустым
log.info(f"Файл {output_file} пуст. Обновляем данные.")
source_list_downloader(repo, tmp_path, short_name, output_file)
continue # Переходим к следующему репозиторию
last_modified_time = get_last_modified_time(output_file) # Получаем время последнего изменения файла
if last_modified_time is None: # Если время не удалось получить, пробуем обновить файл
log.info(f"Не удалось получить время последнего изменения для {output_file}. Попытаемся обновить.")
source_list_downloader(repo, tmp_path, short_name, output_file)
continue # Переходим к следующему репозиторию
current_time = time.time()
if current_time - last_modified_time >= 10800: # 10800 секунд = 3 часа, проверяем, устарел ли файл
log.info(f"Файл {output_file} устарел. Обновляем данные.")
source_list_downloader(repo, tmp_path, short_name, output_file)
if not os.path.exists(output_file) or os.path.getsize(output_file) == 0 or \
(time.time() - get_last_modified_time(output_file, fallback=0)) >= 10800:
source_list_downloader(repo, short_name, output_file)
else:
log.info(f"Файл {output_file} существует и был обновлён менее 3 часов назад. Используем кэшированные данные.")
def source_list_downloader(repo, tmp_path, short_name, output_file):
url = f"https://api.github.com/repos/{repo}/releases?per_page={count_wines}"
temp_file = os.path.join(tmp_path, f"{short_name}.tmp.new") # Временный файл
for mirror_url, short_name in mirrors.items():
output_file = os.path.join(tmp_path, f"{short_name}.tmp")
if not os.path.exists(output_file) or os.path.getsize(output_file) == 0 or \
(time.time() - get_last_modified_time(output_file, fallback=0)) >= 10800:
source_list_downloader(mirror_url, short_name, output_file, use_github=False)
else:
log.info(f"Файл {output_file} существует и был обновлён менее 3 часов назад. Используем кэшированные данные.")
def source_list_downloader(source, short_name, output_file, use_github=True):
if use_github:
url = f"https://api.github.com/repos/{source}/releases?per_page={count_wines}"
else:
url = f"{source}/"
temp_file = os.path.join(tmp_path, f"{short_name}.tmp.new")
try:
response = requests.get(url)
response.raise_for_status() # Возбудим исключение для ошибок HTTP
releases = response.json()
response.raise_for_status()
log.debug(f"Ответ API: {releases}")
tar_files = [] # Проверяем каждый релиз
for release in releases:
assets = release.get('assets', [])
for asset in assets:
asset_name = asset['name']
if (
(re.search(r'(wine|proton)', asset_name, re.IGNORECASE) or
re.search(r'^GE-Proton\d+-\d+\.tar\.gz$', asset_name) or
re.search(r'^GE-Proton\d+(-\d+)?\.tar\.xz$', asset_name)) and
(asset_name.endswith('.tar.gz') or asset_name.endswith('.tar.xz'))
):
tar_files.append(asset_name) # Собираем все подходящие файлы
log.debug(f"Найденный файл: {asset_name}")
tar_urls = [] # Список для хранения полных URL-адресов архивов
if not tar_files:
log.warning(f"Нет подходящих файлов в репозитории {repo}.")
return # Выходим из функции, если нет файлов
if use_github:
releases = response.json()
for release in releases:
assets = release.get('assets', [])
for asset in assets:
asset_name = asset['name']
asset_url = asset['browser_download_url']
if (
(re.search(r'(wine|proton)', asset_name, re.IGNORECASE) or
re.search(r'^GE-Proton\d+-\d+\.tar\.gz$', asset_name) or
re.search(r'^GE-Proton\d+(-\d+)?\.tar\.xz$', asset_name)) and
(asset_name.endswith('.tar.gz') or asset_name.endswith('.tar.xz'))
):
tar_urls.append(asset_url) # Добавляем полный URL в список
else: # Обработка страницы с зеркалом
content = response.text
log.debug(f"Содержимое зеркала: {content}") # Записываем содержимое страницы для отладки
relative_urls = re.findall(r'href=[\'"]?(portproton/[^\'" >]+\.tar\.(gz|xz))[\'"]?', content)
with open(temp_file, 'w') as file: # Записываем найденные файлы во временный файл
file.write("\n".join(tar_files))
base_url = "https://cloud.linux-gaming.ru/"
tar_urls = [base_url + url[0] for url in relative_urls] # Используем первый элемент кортежа для формирования полного URL
log.info(f"Данные успешно записаны в временный файл {temp_file}.")
if not tar_urls: # Проверка на наличие URL
log.warning(f"Нет подходящих файлов в {'GitHub' if use_github else 'зеркале'} {source}.")
return
if os.path.exists(temp_file): # Если запись прошла успешно, заменяем основной файл
os.replace(temp_file, output_file)
log.info(f"Файл {output_file} успешно обновлен.")
with open(temp_file, 'w') as file: # Запись найденных URL в файл
file.write("\n".join(tar_urls))
os.replace(temp_file, output_file)
log.info(f"Файл {output_file} успешно обновлен.")
except requests.exceptions.RequestException as e:
log.error(f"Ошибка при получении данных из {repo}: {str(e)}")
log.error(f"Ошибка при получении данных из {source}: {str(e)}")
def get_sources(args, tmp_path, dist_path):
def get_sources(args, mirror=True):
os.makedirs(tmp_path, exist_ok=True)
source_list_checker(tmp_path)
source_list_checker()
if not args:
log.critical("Аргументы не предоставлены. Завершение работы.")
return
for arg in args:
target_dir_path = os.path.join(dist_path, arg) # Формируем название искомого каталога
if os.path.isdir(target_dir_path): # Проверяем, существует ли запрашиваемый каталог
log.debug(f"Запрашиваемый каталог '{arg}' найден в '{dist_path}'.")
else:
log.debug(f"Запрашиваемый каталог '{arg}' не найден в '{dist_path}'.")
file_found = False
for repo, short_name in repos.items(): # Определяем, какой источник использовать в зависимости от флага mirror
if mirror and short_name == "LG":
short_name = "LG_mirror" # Меняем имя под зеркалом
if args:
for arg in args:
for repo, short_name in repos.items(): # определяем короткое имя репозитория
tmp_file_path = os.path.join(tmp_path, f"{short_name}.tmp")
if os.path.exists(tmp_file_path): # проверяем наличие файла
if os.path.exists(tmp_file_path):
with open(tmp_file_path, 'r') as file:
all_tar_gz_files = file.read().splitlines()
all_urls = file.read().splitlines()
log.debug(f"Получили ссылки {all_urls}")
for file_to_download in all_tar_gz_files: # Ищем совпадение в файле
if arg in file_to_download:
log.info(f"Найдено совпадение для '{arg}': {file_to_download} в файле {tmp_file_path}")
url = f"https://github.com/{repo}/releases/latest/download/{file_to_download}" # Получаем URL файла
tmp_file = os.path.join(tmp_path, file_to_download)
for url in all_urls: # Проверяем, есть ли URL соответствующий имени каталога
log.debug(f"Проверяем ссылку {url}")
if f"{arg}.tar." in os.path.basename(url):
log.info(f"Совпадение для '{arg}' найдено в файле {tmp_file_path}")
tmp_file = os.path.join(tmp_path, os.path.basename(url))
log.debug(f"Сформирован путь к файлу: {tmp_file}")
if not os.path.exists(tmp_file):
try:
try_download(url, tmp_path)
try_download(url, tmp_file)
unpack(tmp_file, dist_path)
try_remove_file(tmp_file)
except Exception as e:
log.error(f"Ошибка при загрузке или распаковке: {str(e)}")
file_found = True # Устанавливаем флаг, что файл найден
break # Прерываем цикл, если файл найден
if not file_found:
log.critical(f"{arg} не найден в файле {tmp_file_path}. Завершение! Проверьте корректность переданного имени wine/proton.")

120
portproton.log Normal file
View File

@ -0,0 +1,120 @@
2025-03-11 18:46:46,075 - INFO: рабочий каталог: /home/fidel/test-portproton
2025-03-11 18:46:46,130 - DEBUG: принятые аргументы: []
2025-03-11 18:48:56,575 - DEBUG: принятые аргументы: []
2025-03-11 18:49:17,066 - DEBUG: принятые аргументы: []
2025-03-11 18:50:16,535 - DEBUG: принятые аргументы: []
2025-03-11 18:51:10,495 - INFO: TEST
2025-03-11 18:51:22,134 - DEBUG: принятые аргументы: []
2025-03-11 18:51:22,134 - INFO: TEST
2025-03-11 18:52:18,243 - INFO: TEST
2025-03-11 18:52:26,297 - INFO: TEST
2025-03-11 18:54:41,762 - INFO: INFO
2025-03-11 18:54:48,185 - INFO: INFO
2025-03-11 18:54:48,185 - DEBUG: DEBUG
2025-03-11 19:02:21,518 - CRITICAL: Переменная DEBUG не определена
2025-03-11 19:04:35,945 - WARNING: Переменная DEBUG не определена
2025-03-11 19:04:35,945 - INFO: INFO
2025-03-11 19:04:54,288 - INFO: INFO
2025-03-11 19:06:01,603 - INFO: INFO
2025-03-11 19:06:22,400 - INFO: INFO
2025-03-11 19:06:32,043 - INFO: INFO
2025-03-11 19:06:42,873 - INFO: INFO
2025-03-11 19:07:11,379 - INFO: INFO
2025-03-11 19:07:30,165 - DEBUG: принятые аргументы: []
2025-03-11 19:07:30,165 - INFO: INFO
2025-03-11 19:07:43,147 - DEBUG: принятые аргументы: []
2025-03-11 19:07:43,147 - INFO: INFO
2025-03-11 19:07:55,624 - WARNING: Переменная DEBUG не определена
2025-03-11 19:07:55,624 - INFO: INFO
2025-03-11 19:10:07,740 - INFO: INFO
2025-03-11 19:10:55,273 - INFO: INFO
2025-03-11 19:11:33,201 - DEBUG: принятые аргументы: []
2025-03-11 19:11:33,201 - INFO: INFO
2025-03-11 19:14:20,323 - DEBUG: принятые аргументы: []
2025-03-11 19:14:20,324 - INFO: INFO
2025-03-11 19:14:22,387 - DEBUG: принятые аргументы: []
2025-03-11 19:14:22,387 - INFO: INFO
2025-03-11 19:14:55,020 - DEBUG: принятые аргументы: []
2025-03-11 19:14:55,021 - INFO: INFO
2025-03-11 19:15:45,706 - CRITICAL: Переменная DEBUG не определена
2025-03-11 19:16:14,883 - INFO: INFO
2025-03-11 19:16:18,910 - DEBUG: принятые аргументы: []
2025-03-11 19:16:18,911 - INFO: INFO
2025-03-11 19:16:29,755 - DEBUG: принятые аргументы: []
2025-03-11 19:16:29,755 - INFO: INFO
2025-03-11 19:16:33,178 - DEBUG: принятые аргументы: []
2025-03-11 19:16:33,178 - INFO: INFO
2025-03-11 19:16:36,677 - INFO: INFO
2025-03-11 19:16:41,800 - INFO: INFO
2025-03-11 19:16:50,838 - DEBUG: принятые аргументы: []
2025-03-11 19:16:50,838 - INFO: INFO
2025-03-11 19:17:58,653 - INFO: INFO
2025-03-11 19:18:01,917 - DEBUG: принятые аргументы: []
2025-03-11 19:18:01,917 - INFO: INFO
2025-03-11 19:18:07,632 - INFO: INFO
2025-03-11 19:18:11,506 - DEBUG: принятые аргументы: []
2025-03-11 19:18:11,506 - INFO: INFO
2025-03-11 19:18:42,258 - DEBUG: принятые аргументы: []
2025-03-11 19:18:42,258 - INFO: INFO
2025-03-11 19:18:42,258 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:42,258 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:42,258 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:42,258 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:42,258 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:42,258 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:42,258 - DEBUG: Запрашиваемый каталог 'proton-cachyos-9.0-20250126-slr-x86_64_v3' найден в '/home/fidel/test-portproton/data/dist'.
2025-03-11 19:18:53,047 - DEBUG: принятые аргументы: []
2025-03-11 19:18:53,048 - INFO: INFO
2025-03-11 19:18:53,048 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:53,048 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:53,048 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:53,048 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:53,048 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:53,048 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:18:53,048 - DEBUG: Запрашиваемый каталог 'proton-cachyos-9.0-20250126-slr-x86_64_v3' найден в '/home/fidel/test-portproton/data/dist'.
2025-03-11 19:20:16,112 - INFO: INFO
2025-03-11 19:20:16,112 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:16,112 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:16,112 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:16,112 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:16,112 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:16,112 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:23,556 - DEBUG: принятые аргументы: []
2025-03-11 19:20:23,557 - INFO: INFO
2025-03-11 19:20:23,557 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:23,557 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:23,557 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:23,557 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:23,557 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:23,557 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:20:23,557 - DEBUG: Запрашиваемый каталог 'proton-cachyos-9.0-20250126-slr-x86_64_v3' найден в '/home/fidel/test-portproton/data/dist'.
2025-03-11 19:20:51,540 - INFO: INFO
2025-03-11 19:21:05,584 - INFO: INFO
2025-03-11 19:21:05,584 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:05,584 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:05,584 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:05,584 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:05,584 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:05,584 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:52,075 - INFO: INFO
2025-03-11 19:21:52,075 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:52,075 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:52,075 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:52,075 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:52,075 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:52,075 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:21:52,076 - CRITICAL: WINE не найден в файле /tmp/.private/fidel/portproton/LG_mirror.tmp. Завершение! Проверьте корректность переданного имени wine/proton.
2025-03-11 19:22:23,176 - INFO: INFO
2025-03-11 19:22:23,176 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:22:23,176 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:22:23,176 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:22:23,176 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:22:23,176 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:22:23,177 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:30:31,377 - INFO: Файл /tmp/.private/fidel/portproton/proton-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:30:31,377 - INFO: Файл /tmp/.private/fidel/portproton/wine-ge-custom.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:30:31,377 - INFO: Файл /tmp/.private/fidel/portproton/Kron4ek.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:30:31,377 - INFO: Файл /tmp/.private/fidel/portproton/proton-cachyos.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:30:31,377 - INFO: Файл /tmp/.private/fidel/portproton/LG.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:30:31,377 - INFO: Файл /tmp/.private/fidel/portproton/LG_mirror.tmp существует и был обновлён менее 3 часов назад. Используем кэшированные данные.
2025-03-11 19:30:31,378 - CRITICAL: list не найден в файле /tmp/.private/fidel/portproton/LG_mirror.tmp. Завершение! Проверьте корректность переданного имени wine/proton.

View File

@ -1,54 +1,42 @@
#!/usr/bin/env python3
import sys
import tempfile
from modules.config_parser import *
from modules.log import *
from modules.env_var import *
from modules.logger import *
from modules.files_worker import *
from modules.downloader import *
from modules.init_wine import *
from modules.source_fetcher import *
tmp_path = tempfile.gettempdir() + "/portproton"
work_path = get_env_var("USER_WORK_PATH")
data_path = work_path + "/data"
dist_path = data_path + "/dist"
img_path = data_path + "/img"
vulkan_path = data_path + "/vulkan"
plugins_path = data_path + "/plugins_v" + var("plugins_ver")
libs_path = data_path + "/libs_v" + var("libs_ver")
create_new_dir(dist_path, tmp_path, img_path, vulkan_path)
log.info(f"рабочий каталог: {work_path}")
log.info(f"принятые аргументы: {sys.argv[1:]}")
from modules.env_var import *
if __name__ == "__main__":
# TODO: реализовать все функции get_* в модуль downloader.py:
if get_env_var("DEBUG") == "1":
log.setLevel(set_logging_level("DEBUG"))
else:
log.setLevel(set_logging_level("INFO"))
log.debug(f"принятые аргументы: {sys.argv[1:]}")
create_new_dir(dist_path, tmp_path, img_path, vulkan_path)
if len(sys.argv) > 1: # Проверяем, что есть хотя бы один аргумент (кроме имени скрипта)
match sys.argv[1]: # Игнорируем первый аргумент (имя скрипта)
case "--get-wine":
# без аргументов сохраняем список доступных в tmp_path/get_wine.tmp и выводим в терминал
# если есть аргумент (например WINE_LG_10-1) то обновляем и парсим tmp_path/get_wine.tmp с последующим скачиванием
get_sources(sys.argv[2:], tmp_path, dist_path)
if sys.argv[2] == "list":
get_sources("wine", "list")
else:
get_sources("wine", sys.argv[3:])
case "--get-dxvk":
# без аргументов сохраняем список доступных в tmp_path/get_dxvk.tmp и выводим в терминал
# если есть аргумент (например 2.5.3-31) то обновляем и парсим tmp_path/get_dxvk.tmp с последующим скачиванием
get_dxvk(sys.argv[2:])
if sys.argv[2] == "list":
get_sources("dxvk", "list")
else:
get_sources("dxvk", sys.argv[3:])
case "--get-vkd3d":
# без аргументов сохраняем список доступных в tmp_path/get_dxvk.tmp и выводим в терминал
# если есть аргумент (например 1.1-4367) то обновляем и парсим tmp_path/get_dxvk.tmp с последующим скачиванием
get_vkd3d(sys.argv[2:])
case "--get-plugins":
# версия плагинов будет захардкожена, парсить ничего не надо
get_plugins(plugins_ver)
case "--get-libs":
# версия контейнера будет захардкожена, парсить ничего не надо
get_libs(libs_ver)
if sys.argv[2] == "list":
get_sources("vkd3d", "list")
else:
get_sources("vkd3d", sys.argv[3:])
log.info("INFO")
init_wine(dist_path)
# init_wine("WINE_LG_9-2")
# get_sources(["proton-cachyos-9.0-20250126-slr-x86_64_v3"])
# get_sources([""])