294 lines
7.3 KiB
Python
294 lines
7.3 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
import os
|
||
|
import yaml
|
||
|
|
||
|
|
||
|
"""
|
||
|
документ = набор диктов
|
||
|
|
||
|
набор диктов = текстовые элементы + список
|
||
|
|
||
|
список может содержать текстовые элементы или дикт
|
||
|
"""
|
||
|
|
||
|
def deep_deep(group: dict, all_elements: bool = True):
|
||
|
"""Рекурсивный обход структуры yaml
|
||
|
|
||
|
Args:
|
||
|
group (dict): _description_
|
||
|
all_elements (bool, optional): _description_. Defaults to True.
|
||
|
|
||
|
Returns:
|
||
|
_type_: _description_
|
||
|
"""
|
||
|
|
||
|
packages = []
|
||
|
packages_x86_64_new = []
|
||
|
|
||
|
if isinstance(group, dict):
|
||
|
|
||
|
for item in group:
|
||
|
|
||
|
if all_elements:
|
||
|
pass
|
||
|
|
||
|
else:
|
||
|
if 'selected' in group:
|
||
|
if group['selected'] == True:
|
||
|
pass
|
||
|
|
||
|
else:
|
||
|
continue
|
||
|
|
||
|
if isinstance(group[item], list):
|
||
|
if 'name' in group:
|
||
|
packages_x86_64_new.append(f"\n## {group['name']}")
|
||
|
|
||
|
if 'packages' in group:
|
||
|
for package in sorted(group['packages']):
|
||
|
package = package.replace("$LOCALE", LOCALE)
|
||
|
packages.append(package)
|
||
|
packages_x86_64_new.append(package)
|
||
|
|
||
|
for element in group[item]:
|
||
|
if isinstance(element, dict):
|
||
|
res = deep_deep(element, all_elements)
|
||
|
packages += res[0]
|
||
|
packages_x86_64_new += res[1]
|
||
|
|
||
|
return packages, packages_x86_64_new
|
||
|
|
||
|
|
||
|
def deep(doc: dict, all_elements: bool = True):
|
||
|
"""Функция проверки объекта что он словарь и запуск рекурсии для получения данных
|
||
|
|
||
|
Args:
|
||
|
doc (dict): _description_
|
||
|
all_elements (bool, optional): _description_. Defaults to True.
|
||
|
|
||
|
Returns:
|
||
|
_type_: _description_
|
||
|
"""
|
||
|
|
||
|
packages = []
|
||
|
packages_x86_64_new = []
|
||
|
|
||
|
for group in doc:
|
||
|
if isinstance(group, dict):
|
||
|
res = deep_deep(group, all_elements)
|
||
|
packages += res[0]
|
||
|
packages_x86_64_new += res[1]
|
||
|
|
||
|
return packages, packages_x86_64_new
|
||
|
|
||
|
|
||
|
def get_packages(filename):
|
||
|
"""Функция для packages.x86_64
|
||
|
|
||
|
Args:
|
||
|
filename (_type_): _description_
|
||
|
|
||
|
Returns:
|
||
|
_type_: _description_
|
||
|
"""
|
||
|
|
||
|
with open(filename, mode="rt") as f:
|
||
|
lines = f.readlines()
|
||
|
|
||
|
packages = []
|
||
|
|
||
|
for line in lines:
|
||
|
if line.startswith("#") or len(line) <= 1:
|
||
|
continue
|
||
|
else:
|
||
|
package = line.strip().replace("\n", "")
|
||
|
packages.append(package)
|
||
|
|
||
|
packages = set(packages)
|
||
|
|
||
|
packages = sorted(packages)
|
||
|
|
||
|
return packages
|
||
|
|
||
|
|
||
|
def get_packages_v2(filename):
|
||
|
"""Функция для _base_system.yaml
|
||
|
|
||
|
Args:
|
||
|
filename (_type_): _description_
|
||
|
|
||
|
Returns:
|
||
|
_type_: _description_
|
||
|
"""
|
||
|
with open(filename, "rt") as f:
|
||
|
doc = yaml.safe_load(f)
|
||
|
|
||
|
res = deep(doc, all_elements = False)
|
||
|
packages = res[0]
|
||
|
packages_x86_64_new = res[1]
|
||
|
|
||
|
packages = set(packages)
|
||
|
|
||
|
packages = sorted(packages)
|
||
|
|
||
|
packages_v2 = []
|
||
|
for package in packages:
|
||
|
packages_v2.append(package)
|
||
|
|
||
|
packages = packages_v2
|
||
|
|
||
|
return packages, packages_x86_64_new
|
||
|
|
||
|
|
||
|
def write_new_packages_x86_64(filename, packages_x86_64_new: list):
|
||
|
|
||
|
with open(filename, mode="wt+") as f:
|
||
|
|
||
|
if isinstance(packages_x86_64_new, list):
|
||
|
packages_x86_64_new[0] = packages_x86_64_new[0].replace("\n#", "")
|
||
|
for item in packages_x86_64_new:
|
||
|
if "## ARCHISO PACKAGES" in item:
|
||
|
item = f"\n{item}"
|
||
|
f.write(f"{item}\n")
|
||
|
|
||
|
|
||
|
def usort_packages(filename):
|
||
|
with open(filename3, "rt") as f:
|
||
|
lines = f.readlines()
|
||
|
|
||
|
packages = []
|
||
|
|
||
|
for line in lines:
|
||
|
if line.startswith("#") or len(line) <= 1:
|
||
|
continue
|
||
|
else:
|
||
|
package = line.strip().replace("\n", "")
|
||
|
packages.append(package)
|
||
|
|
||
|
packages = set(packages)
|
||
|
|
||
|
packages = sorted(packages)
|
||
|
|
||
|
return packages
|
||
|
|
||
|
|
||
|
def write_new_sorted_packages_x86_64(filename, packages_x86_64_new: list):
|
||
|
with open(filename, mode="wt+") as f:
|
||
|
|
||
|
if isinstance(packages_x86_64_new, list):
|
||
|
for item in packages_x86_64_new:
|
||
|
f.write(f"{item}\n")
|
||
|
|
||
|
|
||
|
#####################################################################################
|
||
|
|
||
|
LOCALE = os.environ.get('LANG')[0:2]
|
||
|
filename1='packages.x86_64'
|
||
|
filename2='_base_system.yaml'
|
||
|
filename3='packages.x86_64'
|
||
|
filename4='packages.x86_64_melawy_base_system'
|
||
|
|
||
|
|
||
|
list_of_packages = get_packages(filename1)
|
||
|
length_list_of_packages = len(list_of_packages)
|
||
|
|
||
|
result_netinstall = get_packages_v2(filename2)
|
||
|
|
||
|
list_of_packages_v2 = result_netinstall[0]
|
||
|
length_list_of_packages_v2 = len(list_of_packages_v2)
|
||
|
|
||
|
list_of_packages_v3 = result_netinstall[1]
|
||
|
|
||
|
|
||
|
packages_extend = """
|
||
|
## ARCHISO PACKAGES
|
||
|
archiso
|
||
|
clonezilla
|
||
|
ddrescue
|
||
|
edk2-shell
|
||
|
gpart
|
||
|
rsync
|
||
|
melawy-calamares
|
||
|
melawy-calamares-config
|
||
|
melawy-skel-liveuser
|
||
|
memtest86+
|
||
|
memtest86+-efi
|
||
|
mkinitcpio
|
||
|
mkinitcpio-archiso
|
||
|
mkinitcpio-firmware
|
||
|
mkinitcpio-nfs-utils
|
||
|
mkinitcpio-openswap
|
||
|
os-prober
|
||
|
partclone
|
||
|
parted
|
||
|
partimage
|
||
|
rate-mirrors
|
||
|
squashfs-tools
|
||
|
grub
|
||
|
refind
|
||
|
syslinux
|
||
|
"""
|
||
|
|
||
|
packages_extend = packages_extend.splitlines()
|
||
|
|
||
|
list_of_packages_v3.extend(packages_extend)
|
||
|
list_of_packages_v3_1 = []
|
||
|
|
||
|
for item in list_of_packages_v3:
|
||
|
if len(item) <= 1:
|
||
|
continue
|
||
|
else:
|
||
|
list_of_packages_v3_1.append(item)
|
||
|
|
||
|
list_of_packages_v3 = list_of_packages_v3_1
|
||
|
|
||
|
|
||
|
write_new_packages_x86_64(filename3, list_of_packages_v3)
|
||
|
|
||
|
usort_packs = usort_packages(filename3)
|
||
|
write_new_sorted_packages_x86_64(filename3, usort_packs)
|
||
|
write_new_sorted_packages_x86_64(filename4, usort_packs)
|
||
|
|
||
|
set_list_of_packages_v3 = set()
|
||
|
|
||
|
for item in list_of_packages_v3:
|
||
|
if item.startswith("\n#") or item.startswith("#") or len(item) <= 1:
|
||
|
continue
|
||
|
else:
|
||
|
set_list_of_packages_v3.add(item)
|
||
|
|
||
|
length_list_of_packages_v3 = len(set_list_of_packages_v3)
|
||
|
|
||
|
|
||
|
difference1 = sorted(list(set(list_of_packages_v2).difference(list_of_packages)))
|
||
|
|
||
|
difference2 = sorted(list(set(list_of_packages).difference(list_of_packages_v2)))
|
||
|
|
||
|
#####################################################################################
|
||
|
|
||
|
print('-------------------------------------------')
|
||
|
print("Разница в списках")
|
||
|
print('-------------------------------------------')
|
||
|
print(f"Количество пакетов в {filename1}: {length_list_of_packages}")
|
||
|
|
||
|
print(f"Количество пакетов в {filename2}: {length_list_of_packages_v2}")
|
||
|
|
||
|
print(f"Количество пакетов сгенерированных для {filename1}: {length_list_of_packages_v3}")
|
||
|
|
||
|
print('-------------------------------------------')
|
||
|
print(f"Пакеты, отсутствующие в {filename1}:")
|
||
|
print('-------------------------------------------')
|
||
|
|
||
|
for item in difference1:
|
||
|
print(item)
|
||
|
|
||
|
print('-------------------------------------------')
|
||
|
print(f"Пакеты, отсутствующие в {filename2}:")
|
||
|
print('-------------------------------------------')
|
||
|
|
||
|
for item in difference2:
|
||
|
print(item)
|
||
|
|
||
|
print('-------------------------------------------')
|