* Добавлен начальный функционал clear_db

* Добавлена начальная возможность переключения уровня логирования
* Исправлены мелкие ошибки
This commit is contained in:
parent c8cff90b3b
commit 0a651d6fa2
6 changed files with 110 additions and 19 deletions

3
.gitignore vendored

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

72
modules/clear_db.py Normal file

@ -0,0 +1,72 @@
import os
import glob
import re
from .log import *
def main_clear_db():
base_dir = os.path.dirname(os.path.realpath(__file__))
portwine_db_path = os.path.join(base_dir, 'portwine_db')
os.makedirs(portwine_db_path, exist_ok=True)
for filename in glob.glob(os.path.join(portwine_db_path, '*')): # Установка разрешений на файлы
os.chmod(filename, 0o644)
duplicate_finder = {} #Поиск дубликатов в файлах
for filename in glob.glob(os.path.join(portwine_db_path, '*')):
with open(filename, 'r') as file:
lines = file.readlines()
for line in lines:
if '.exe' in line and '#' in line:
line = line.strip()
if line not in duplicate_finder:
duplicate_finder[line] = []
duplicate_finder[line].append(filename)
duplicates = {line: files for line, files in duplicate_finder.items() if len(files) > 1}
if duplicates:
log.warning("Обнаружены дубликаты в файлах:")
for line, files in duplicates.items():
for file in files:
log.info(f"{file.split('portwine_db/')[1]} содержит дубликат: {line}")
exit(1)
for ppdb in glob.glob(os.path.join(portwine_db_path, '*')): # Обработка каждого файла
log.debug(ppdb)
with open(ppdb, 'r') as file: # Удаление определённых строк
lines = file.readlines()
lines = [line for line in lines if not line.startswith(('##export', '##add_'))]
lines = [line for line in lines if not (
re.search(r'MANGOHUD|FPS_LIMIT|VKBASALT|_RAY_TRACING|_DLSS|PW_GUI_DISABLED_CS|PW_USE_GAMEMODE|'
r'PW_USE_SYSTEM_VK_LAYERS|PW_DISABLE_COMPOSITING|PW_USE_EAC_AND_BE|PW_USE_OBS_VKCAPTURE|'
r'GAMESCOPE|PW_GS', line)
)]
if any(re.search(r'PW_USE_DGVOODOO2="0"|PW_DGVOODOO2="0"', line) for line in lines):
lines = [line for line in lines if not re.search(r'PW_USE_DGVOODOO2|PW_DGV', line)]
lines = [re.sub(r'export PW_WINE_USE=.*', 'export PW_WINE_USE="WINE_LG"', line)
if 'PW_WINE_USE="WINE_LG' in line else line for line in lines]
lines = [re.sub(r'export PW_WINE_USE=.*', 'export PW_WINE_USE="PROTON_LG"', line)
if 'PW_WINE_USE="PROTON_LG' in line else line for line in lines]
with open(ppdb, 'w') as file: # Сохранение изменений
file.writelines(lines)
ppdb_base = os.path.basename(ppdb) # Переименование файлов
if ppdb_base.endswith('.exe.ppdb'):
new_name = f"{ppdb_base[:-9]}.ppdb"
os.rename(ppdb, os.path.join(portwine_db_path, new_name))
elif ppdb_base.endswith('.EXE.ppdb'):
new_name = f"{ppdb_base[:-9]}.ppdb"
os.rename(ppdb, os.path.join(portwine_db_path, new_name))
elif not ppdb_base.endswith('.ppdb'):
new_name = f"{ppdb_base}.ppdb"
os.rename(ppdb, os.path.join(portwine_db_path, new_name))
log.info("ГОТОВО!")
exit(0)

@ -6,7 +6,7 @@ from .files_worker import *
def try_download(url, save_path=None): def try_download(url, save_path=None):
""" """
Скачивает файл по указанному URL с отображением прогресса. Скачивает файл по-указанному URL с отображением прогресса.
:param url: URL файла для скачивания. :param url: URL файла для скачивания.
:param save_path: Путь для сохранения файла. Если None или директория, то используется имя файла из URL. :param save_path: Путь для сохранения файла. Если None или директория, то используется имя файла из URL.

@ -31,10 +31,10 @@ def try_force_link_file(source, link):
os.symlink(source, link) os.symlink(source, link)
except Exception as e: except Exception as e:
print(f"failed to create link for file: {e}") log.error(f"failed to create link for file: {e}")
def try_remove_file(path): def try_remove_file(file_path):
if os.path.exists(file_path) and os.path.isfile(file_path): if os.path.exists(file_path) and os.path.isfile(file_path):
try: try:
os.remove(file_path) os.remove(file_path)
@ -59,10 +59,10 @@ def try_force_link_dir(path, link):
os.symlink(path, link) os.symlink(path, link)
except Exception as e: except Exception as e:
print(f"failed to create link for file: {e}") log.error(f"failed to create link for file: {e}")
def try_remove_dir(path): def try_remove_dir(path):
if os.path.exist(path) and os.path.isdir(path): if os.path.exists(path) and os.path.isdir(path):
try: try:
shutil.rmtree(path) shutil.rmtree(path)
except Exception as e: except Exception as e:
@ -73,7 +73,7 @@ def unpack(archive_path, extract_to=None):
if extract_to is None: if extract_to is None:
# TODO: перенести распаковку по умолчанию в tmp # TODO: перенести распаковку по умолчанию в tmp
extract_to = os.path.dirname(archive_path) extract_to = os.path.dirname(archive_path)
elif not os.exists.isdir(extract_to): elif not os.path.isdir(extract_to):
create_new_dir(extract_to) create_new_dir(extract_to)
with tarfile.open(archive_path, mode="r:*") as tar: with tarfile.open(archive_path, mode="r:*") as tar:

@ -2,8 +2,7 @@ import logging
import sys import sys
class ColoredFormatter(logging.Formatter): class ColoredFormatter(logging.Formatter):
# ANSI escape sequences for colors COLORS = { # ANSI escape sequences for colors
COLORS = {
'DEBUG': '\033[35m', # Purple 'DEBUG': '\033[35m', # Purple
'INFO': '\033[36m', # Green 'INFO': '\033[36m', # Green
'WARNING': '\033[33m', # Yellow 'WARNING': '\033[33m', # Yellow
@ -21,19 +20,33 @@ class ColoredFormatter(logging.Formatter):
sys.exit(1) sys.exit(1)
return formatted_message return formatted_message
# Настраиваем логирование
log = logging.getLogger()
# TODO: добавить case с переменной для управление уровнем
log.setLevel(logging.DEBUG)
# Создаем консольный обработчик log = logging.getLogger() # Настраиваем логирование
handler = logging.StreamHandler() def set_logging_level(level_string):
levels = {
'DEBUG': logging.DEBUG,
'INFO': logging.INFO,
'WARNING': logging.WARNING,
'ERROR': logging.ERROR,
'CRITICAL': logging.CRITICAL
}
level = levels.get(level_string, logging.WARNING) # Уровень по умолчанию
if level == logging.WARNING:
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')) handler.setFormatter(ColoredFormatter('%(levelname)s: %(message)s'))
# Создаем файловый обработчик # TODO: добавить условие для управления переменой пути сохранения лога
# TODO: добавить условие для управления перемееной пути сохранения лога log_file_path = 'app.log' # Это может быть переменная, установленная пользователем
file_handler = logging.FileHandler('app.log') file_handler = logging.FileHandler(log_file_path) # Создаем файловый обработчик
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s: %(message)s')) file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s: %(message)s'))
log.addHandler(file_handler)
log.addHandler(file_handler)
log.addHandler(handler) log.addHandler(handler)

@ -6,5 +6,8 @@ from modules.files_worker import *
from modules.downloader import * from modules.downloader import *
if __name__ == "__main__": if __name__ == "__main__":
log.debug("Привет мир!")
log.info("Привет мир!") log.info("Привет мир!")
log.warning("Привет мир!")
log.error("Привет мир!")
log.critical("Привет мир!")