mirror of https://git.48k.eu/ogclient
Compare commits
10 Commits
Author | SHA1 | Date |
---|---|---|
|
cf9577a40e | |
|
6503d0ffe7 | |
|
0ca16bc46c | |
|
bd190f8d44 | |
|
e0ba9cc98c | |
|
ccdcb7bfc7 | |
|
72406a7d89 | |
|
0f519ecfeb | |
|
c260534534 | |
|
f67f3c598a |
|
@ -82,8 +82,10 @@ class OgLiveOperations:
|
||||||
code = int(pa.parttype, base=16)
|
code = int(pa.parttype, base=16)
|
||||||
|
|
||||||
if mount_mkdir(pa.padev, target):
|
if mount_mkdir(pa.padev, target):
|
||||||
probe_result = os_probe(target)
|
part_setup['os'] = ''
|
||||||
part_setup['os'] = probe_result
|
if part_setup['disk'] == '1':
|
||||||
|
probe_result = os_probe(target)
|
||||||
|
part_setup['os'] = probe_result
|
||||||
|
|
||||||
total, used, free = shutil.disk_usage(target)
|
total, used, free = shutil.disk_usage(target)
|
||||||
part_setup['used_size'] = used
|
part_setup['used_size'] = used
|
||||||
|
@ -526,7 +528,12 @@ class OgLiveOperations:
|
||||||
raise OgError(f'Invalid disk number {disk}, {len(get_disks())} disks available.')
|
raise OgError(f'Invalid disk number {disk}, {len(get_disks())} disks available.')
|
||||||
|
|
||||||
diskname = get_disks()[disk-1]
|
diskname = get_disks()[disk-1]
|
||||||
self._partition(diskname, table_type, partlist)
|
try:
|
||||||
|
self._partition(diskname, table_type, partlist)
|
||||||
|
except Exception as e:
|
||||||
|
ret = subprocess.run(['wipefs', '-af', f'/dev/{diskname}'])
|
||||||
|
logging.warning(f'wipefs on /dev/{diskname} after failure for consistency, reports {ret.returncode}')
|
||||||
|
raise
|
||||||
|
|
||||||
ret = subprocess.run(['partprobe', f'/dev/{diskname}'])
|
ret = subprocess.run(['partprobe', f'/dev/{diskname}'])
|
||||||
logging.info(f'first partprobe /dev/{diskname} reports {ret.returncode}')
|
logging.info(f'first partprobe /dev/{diskname} reports {ret.returncode}')
|
||||||
|
@ -594,19 +601,14 @@ class OgLiveOperations:
|
||||||
|
|
||||||
extend_filesystem(disk, partition)
|
extend_filesystem(disk, partition)
|
||||||
|
|
||||||
configure_os(disk, partition)
|
if disk == 1:
|
||||||
|
configure_os(disk, partition)
|
||||||
|
|
||||||
self.refresh(ogRest)
|
result = self.refresh(ogRest)
|
||||||
|
|
||||||
logging.info('Image restore command OK')
|
logging.info('Image restore command OK')
|
||||||
|
|
||||||
json_dict = {
|
return result
|
||||||
'disk': request.getDisk(),
|
|
||||||
'partition': request.getPartition(),
|
|
||||||
'image_id': request.getId(),
|
|
||||||
'cache': self._get_cache_contents(),
|
|
||||||
}
|
|
||||||
return json_dict
|
|
||||||
|
|
||||||
def image_create(self, request, ogRest):
|
def image_create(self, request, ogRest):
|
||||||
disk = int(request.getDisk())
|
disk = int(request.getDisk())
|
||||||
|
@ -667,7 +669,7 @@ class OgLiveOperations:
|
||||||
if os.access(f'/opt/opengnsys/images', os.R_OK | os.W_OK) == False:
|
if os.access(f'/opt/opengnsys/images', os.R_OK | os.W_OK) == False:
|
||||||
raise OgError('Cannot access /opt/opengnsys/images in read and write mode, check permissions')
|
raise OgError('Cannot access /opt/opengnsys/images in read and write mode, check permissions')
|
||||||
|
|
||||||
if os.access(f'{image_path}', os.R_OK) == True:
|
if os.access(image_path, os.R_OK) == True:
|
||||||
logging.info(f'image file {image_path} already exists, updating.')
|
logging.info(f'image file {image_path} already exists, updating.')
|
||||||
|
|
||||||
if is_windows and is_uefi_supported():
|
if is_windows and is_uefi_supported():
|
||||||
|
@ -744,7 +746,6 @@ class OgLiveOperations:
|
||||||
|
|
||||||
def cache_delete(self, request, ogRest):
|
def cache_delete(self, request, ogRest):
|
||||||
images = request.getImages()
|
images = request.getImages()
|
||||||
deleted_images = []
|
|
||||||
|
|
||||||
logging.info(f'Request to remove files from cache')
|
logging.info(f'Request to remove files from cache')
|
||||||
|
|
||||||
|
|
|
@ -343,7 +343,7 @@ class ogRest():
|
||||||
self.process_imagerestore(client, request)
|
self.process_imagerestore(client, request)
|
||||||
elif ("stop" in URI):
|
elif ("stop" in URI):
|
||||||
self.process_stop(client)
|
self.process_stop(client)
|
||||||
elif ("image/create" in URI):
|
elif ("image/create" in URI or "image/update" in URI):
|
||||||
self.process_imagecreate(client, request)
|
self.process_imagecreate(client, request)
|
||||||
elif ("cache/delete" in URI):
|
elif ("cache/delete" in URI):
|
||||||
self.process_cache_delete(client, request)
|
self.process_cache_delete(client, request)
|
||||||
|
|
|
@ -153,13 +153,19 @@ def mkfs(fs, disk, partition, label=None):
|
||||||
if fs not in fsdict:
|
if fs not in fsdict:
|
||||||
raise OgError(f'mkfs failed, unsupported target filesystem {fs}')
|
raise OgError(f'mkfs failed, unsupported target filesystem {fs}')
|
||||||
|
|
||||||
try:
|
partdev = get_partition_device(disk, partition)
|
||||||
partdev = get_partition_device(disk, partition)
|
|
||||||
except ValueError as e:
|
|
||||||
raise OgError(f'mkfs aborted: {e}') from e
|
|
||||||
|
|
||||||
return fsdict[fs](partdev, label)
|
ret = subprocess.run(['wipefs', '-af', f'{partdev}'])
|
||||||
|
if ret.returncode != 0:
|
||||||
|
logging.warning(f'wipefs on {partdev}, fails with {ret.returncode}')
|
||||||
|
|
||||||
|
err = fsdict[fs](partdev, label)
|
||||||
|
if err != 0:
|
||||||
|
ret = subprocess.run(['wipefs', '-af', f'{partdev}'])
|
||||||
|
if ret.returncode != 0:
|
||||||
|
logging.warning(f'wipefs on {partdev} for consistency, fails with {ret.returncode}')
|
||||||
|
|
||||||
|
return err
|
||||||
|
|
||||||
def mkfs_ext4(partdev, label=None):
|
def mkfs_ext4(partdev, label=None):
|
||||||
err = -1
|
err = -1
|
||||||
|
|
|
@ -334,6 +334,7 @@ def get_disk_part_type(disk_num):
|
||||||
def _update_nvram(esp_disk, esp_part_number):
|
def _update_nvram(esp_disk, esp_part_number):
|
||||||
loader_path = '/EFI/grub/Boot/shimx64.efi'
|
loader_path = '/EFI/grub/Boot/shimx64.efi'
|
||||||
bootlabel = 'grub'
|
bootlabel = 'grub'
|
||||||
|
egibootmgr_reorder_disabled_entries()
|
||||||
efibootmgr_delete_bootentry(bootlabel)
|
efibootmgr_delete_bootentry(bootlabel)
|
||||||
efibootmgr_create_bootentry(esp_disk, esp_part_number, loader_path, bootlabel, add_to_bootorder=False)
|
efibootmgr_create_bootentry(esp_disk, esp_part_number, loader_path, bootlabel, add_to_bootorder=False)
|
||||||
efibootmgr_set_entry_order(bootlabel, 1)
|
efibootmgr_set_entry_order(bootlabel, 1)
|
||||||
|
|
|
@ -25,7 +25,7 @@ def _find_bootentry(entries, label):
|
||||||
if entry['description'] == label:
|
if entry['description'] == label:
|
||||||
return entry
|
return entry
|
||||||
else:
|
else:
|
||||||
raise OgError('Boot entry {label} not found')
|
raise OgError(f'Boot entry {label} not found')
|
||||||
|
|
||||||
|
|
||||||
def _strip_boot_prefix(entry):
|
def _strip_boot_prefix(entry):
|
||||||
|
@ -95,8 +95,13 @@ def efibootmgr_bootnext(description):
|
||||||
entry = _find_bootentry(boot_entries, description)
|
entry = _find_bootentry(boot_entries, description)
|
||||||
num = _strip_boot_prefix(entry) # efibootmgr output uses BootXXXX for each entry, remove the "Boot" prefix.
|
num = _strip_boot_prefix(entry) # efibootmgr output uses BootXXXX for each entry, remove the "Boot" prefix.
|
||||||
bootnext_cmd = bootnext_cmd.format(bootnum=num, efibootmgr=EFIBOOTMGR_BIN)
|
bootnext_cmd = bootnext_cmd.format(bootnum=num, efibootmgr=EFIBOOTMGR_BIN)
|
||||||
subprocess.run(shlex.split(bootnext_cmd), check=True,
|
try:
|
||||||
stdout=subprocess.DEVNULL)
|
subprocess.run(shlex.split(bootnext_cmd), check=True,
|
||||||
|
stdout=subprocess.DEVNULL)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
logging.warning("Failed to update BootNext. UEFI firmware might be buggy")
|
||||||
|
except OSError as e:
|
||||||
|
raise OgError(f"Unexpected error updating BootNext: {e}") from e
|
||||||
|
|
||||||
|
|
||||||
def efibootmgr_delete_bootentry(label):
|
def efibootmgr_delete_bootentry(label):
|
||||||
|
@ -107,7 +112,12 @@ def efibootmgr_delete_bootentry(label):
|
||||||
if entry['description'] == label:
|
if entry['description'] == label:
|
||||||
num = entry['name'][4:] # Remove "Boot" prefix to extract num
|
num = entry['name'][4:] # Remove "Boot" prefix to extract num
|
||||||
efibootmgr_cmd = efibootmgr_cmd.format(bootnum=num, efibootmgr=EFIBOOTMGR_BIN)
|
efibootmgr_cmd = efibootmgr_cmd.format(bootnum=num, efibootmgr=EFIBOOTMGR_BIN)
|
||||||
subprocess.run(shlex.split(efibootmgr_cmd), check=True)
|
try:
|
||||||
|
subprocess.run(shlex.split(efibootmgr_cmd), check=True)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
logging.warning(f"Failed to delete boot entry {label}. UEFI firmware might be buggy")
|
||||||
|
except OSError as e:
|
||||||
|
raise OgError(f"Unexpected error deleting boot entry {label}: {e}") from e
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
logging.info(f'Cannot delete boot entry {label} because it was not found.')
|
logging.info(f'Cannot delete boot entry {label} because it was not found.')
|
||||||
|
@ -121,8 +131,10 @@ def efibootmgr_create_bootentry(disk, part, loader, label, add_to_bootorder=True
|
||||||
logging.info(f'{EFIBOOTMGR_BIN} command creating boot entry: {efibootmgr_cmd}')
|
logging.info(f'{EFIBOOTMGR_BIN} command creating boot entry: {efibootmgr_cmd}')
|
||||||
try:
|
try:
|
||||||
proc = subprocess.run(shlex.split(efibootmgr_cmd), check=True, text=True)
|
proc = subprocess.run(shlex.split(efibootmgr_cmd), check=True, text=True)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
logging.warning(f"Failed to add boot entry {label} to NVRAM. UEFI firmware might be buggy")
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
raise OgError(f'Unexpected error adding boot entry to nvram. UEFI firmware might be buggy') from e
|
raise OgError(f"Unexpected error adding boot entry {label}: {e}") from e
|
||||||
|
|
||||||
def efibootmgr_set_entry_order(label, position):
|
def efibootmgr_set_entry_order(label, position):
|
||||||
logging.info(f'Setting {label} entry to position {position} of boot order')
|
logging.info(f'Setting {label} entry to position {position} of boot order')
|
||||||
|
@ -140,8 +152,29 @@ def efibootmgr_set_entry_order(label, position):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
proc = subprocess.run([EFIBOOTMGR_BIN, "-o", ",".join(boot_order)], check=True, text=True)
|
proc = subprocess.run([EFIBOOTMGR_BIN, "-o", ",".join(boot_order)], check=True, text=True)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
logging.warning("Failed to set boot order to NVRAM. UEFI firmware might be buggy")
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
raise OgError(f'Unexpected error setting boot order to NVRAM. UEFI firmware might be buggy') from e
|
raise OgError(f"Unexpected error updating boot order: {e}") from e
|
||||||
|
|
||||||
|
def egibootmgr_reorder_disabled_entries():
|
||||||
|
logging.info(f'Setting disabled entries at the end of boot order')
|
||||||
|
boot_info = run_efibootmgr_json(validate=False)
|
||||||
|
boot_entries = boot_info.get('vars', [])
|
||||||
|
boot_order = boot_info.get('BootOrder', [])
|
||||||
|
|
||||||
|
for entry in boot_entries:
|
||||||
|
entry_number = _strip_boot_prefix(entry)
|
||||||
|
if not entry['active'] and entry_number in boot_order:
|
||||||
|
boot_order.remove(entry_number)
|
||||||
|
boot_order.append(entry_number)
|
||||||
|
|
||||||
|
try:
|
||||||
|
proc = subprocess.run([EFIBOOTMGR_BIN, "-o", ",".join(boot_order)], check=True, text=True)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
logging.warning("Failed to update boot order. UEFI firmware might be buggy")
|
||||||
|
except OSError as e:
|
||||||
|
raise OgError(f"Unexpected error updating boot order: {e}") from e
|
||||||
|
|
||||||
def _find_efi_loader(loader_paths):
|
def _find_efi_loader(loader_paths):
|
||||||
for efi_app in loader_paths:
|
for efi_app in loader_paths:
|
||||||
|
|
Loading…
Reference in New Issue