Добавлен прототип менеджера модулей

This commit is contained in:
Aren Elchinyan 2024-01-25 19:17:42 +03:00
parent 39fb9c7f2e
commit fc43b6746a
4 changed files with 115 additions and 3 deletions

View File

@ -28,7 +28,7 @@
### Доработка кодовой базы ### Доработка кодовой базы
Если вы владеете C/C++, ассемблерами GAS или FASM, то вы можете доработать ядро проекта или написать свой пользовательский модуль. Если вы владеете C/C++, ассемблером GAS, то вы можете доработать ядро проекта или написать свой пользовательский модуль.
Для добавления своего модуля используйте инструкцию `modules/README.md`. Для добавления своего модуля используйте инструкцию `modules/README.md`.

View File

@ -2,6 +2,8 @@
{ {
"info": "Официальный репозиторий модулей", "info": "Официальный репозиторий модулей",
"git": "https://git.synapseos.ru/Aren/BMOSP_repo.git", "git": "https://git.synapseos.ru/Aren/BMOSP_repo.git",
"list": [] "list": [
"https://git.synapseos.ru/Aren/BMOSP_repo/raw/branch/master/list.json"
]
} }
] ]

110
scripts/modmanager.py Normal file
View File

@ -0,0 +1,110 @@
import os
import json
import requests
import shutil
import zipfile
import argparse
module_path = "modules/modules.json"
loader_config_path = "configs/autorun.cfg"
def download_module(module_url, module_name):
response = requests.get(module_url)
file_path = os.path.join('modules', module_name)
with open(file_path, 'wb') as file:
file.write(response.content)
return file_path
def extract_module(module_path, destination_folder):
with zipfile.ZipFile(module_path, 'r') as zip_ref:
zip_ref.extractall(destination_folder)
return destination_folder
def install_module(module):
module_name = module['name']
module_url = module['url']
module_zip_path = download_module(module_url, module_name)
module_folder_path = os.path.join('modules', module_name)
extract_module(module_zip_path, module_folder_path)
with open(loader_config_path, 'a') as config_file:
config_file.write(f"\nMODULE_PATH=boot://mod/{module_name}.ko\n")
config_file.write(f"MODULE_CMDLINE=[MOD]{module_name}.ko\n")
os.remove(module_zip_path)
def remove_module(module):
module_name = module['name']
module_folder_path = os.path.join('modules', module_name)
shutil.rmtree(module_folder_path)
with open(loader_config_path, 'r') as config_file:
lines = config_file.readlines()
new_lines = []
for line in lines:
if not line.strip().startswith("MODULE_PATH=") and (f"[MOD]{module_name}.ko" not in line and f"{module_name}.ko" not in line):
new_lines.append(line)
with open(loader_config_path, 'w') as config_file:
config_file.writelines(new_lines)
def update_module_list(repo_url):
response = requests.get(repo_url)
response.raise_for_status()
module_list = response.json()
with open(module_path, 'w') as file:
json.dump(module_list, file)
def install_selected_module(module_list, module_index):
if 0 <= module_index < len(module_list):
install_module(module_list[module_index])
else:
print("Неправильный номер!")
def remove_selected_module(module_list, module_index):
if 0 <= module_index < len(module_list):
remove_module(module_list[module_index])
else:
print("Неправильный номер!")
def handle_module_actions(module_list):
while True:
print("1. Установить модуль")
print("2. Удалить модуль")
print("3. Выход")
choice = input("[MOD]: ")
if choice == "1":
print("Доступные модули:")
for i, module in enumerate(module_list, start=1):
print(f"{i}. {module['name']}")
module_index = int(input("Введите номер модуля: ")) - 1
install_selected_module(module_list, module_index)
elif choice == "2":
print("Установленные модули:")
for i, module in enumerate(module_list, start=1):
module_folder_path = os.path.join('modules', module['name'])
if os.path.exists(module_folder_path):
print(f"{i}. {module['name']}")
module_index = int(input("Введите номер модуля для удаления: ")) - 1
remove_selected_module(module_list, module_index)
elif choice == "3":
break
def parse_arguments():
parser = argparse.ArgumentParser(description="Менеджер модулей")
parser.add_argument("-r", "--refresh", action="store_true", help="Обновить список модулей")
return parser.parse_args()
def main():
args = parse_arguments()
if args.refresh:
with open(module_path) as file:
repositories = json.load(file)
for repo in repositories:
repo_list_url = repo['list']
update_module_list(repo_list_url[0])
with open(module_path) as file:
module_list = json.load(file)
handle_module_actions(module_list)
if __name__ == "__main__":
main()

View File

@ -160,7 +160,7 @@ def create_iso(IMAGE_NAME):
shutil.copytree("modules/bin", "iso_root/mod") shutil.copytree("modules/bin", "iso_root/mod")
os.system(f"cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/") os.system(f"cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
os.system(f"cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/") os.system(f"cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/")
os.system(f"xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {IMAGE_NAME}.iso") os.system(f"xorriso -as mkisofs -b limine/limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine/limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {IMAGE_NAME}.iso")
os.system(f"./limine/limine bios-install {IMAGE_NAME}.iso") os.system(f"./limine/limine bios-install {IMAGE_NAME}.iso")
if __name__ == "__main__": if __name__ == "__main__":