mirror of https://github.com/0Nera/BMOSP.git
Добавлен прототип менеджера модулей
This commit is contained in:
parent
39fb9c7f2e
commit
fc43b6746a
|
@ -28,7 +28,7 @@
|
|||
|
||||
### Доработка кодовой базы
|
||||
|
||||
Если вы владеете C/C++, ассемблерами GAS или FASM, то вы можете доработать ядро проекта или написать свой пользовательский модуль.
|
||||
Если вы владеете C/C++, ассемблером GAS, то вы можете доработать ядро проекта или написать свой пользовательский модуль.
|
||||
|
||||
Для добавления своего модуля используйте инструкцию `modules/README.md`.
|
||||
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
{
|
||||
"info": "Официальный репозиторий модулей",
|
||||
"git": "https://git.synapseos.ru/Aren/BMOSP_repo.git",
|
||||
"list": []
|
||||
"list": [
|
||||
"https://git.synapseos.ru/Aren/BMOSP_repo/raw/branch/master/list.json"
|
||||
]
|
||||
}
|
||||
]
|
|
@ -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()
|
|
@ -160,7 +160,7 @@ def create_iso(IMAGE_NAME):
|
|||
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/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")
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Reference in New Issue