1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-07-13 01:20:24 +02:00

add efibootmgr parser (#528)

* More nsd fixes (#523)

* Update nsd_control.py

support catz output

* Update nsd_control.py

fix parsing of catz zones

* add testdata

add corresponding catz testdata

* Revert "More nsd fixes" (#526)

* add efibootmgr parser

* add efibootmgr completions

* Multiple fixes on jc/parsers/efibootmgr.py

1. Update schema in comments.
1. Add an example.
1. Use clean and clear sub string finding sytax.
1. Wrap schema in an object.
1. Make variable scope as small as possible.

* add tests for efibootmgr

* Update jc/parsers/efibootmgr.py

Update example using `--pretty` for output.

Co-authored-by: Muescha <184316+muescha@users.noreply.github.com>

* jc/parsers/efibootmgr multiple changes

1. convert all keys to "snake_case"
2. add "mirrored_percentage_above_4g" and "mirror_memory_below_4gb"
3. move conversion (from string to other types) to "_process"

---------

Co-authored-by: pettai <pettai@sunet.se>
Co-authored-by: Kelly Brazil <kellyjonbrazil@gmail.com>
Co-authored-by: Muescha <184316+muescha@users.noreply.github.com>
This commit is contained in:
yaofei zheng
2024-02-05 04:44:23 +08:00
committed by Kelly Brazil
parent 5b849b0275
commit 5ee2eda83e
7 changed files with 310 additions and 0 deletions

View File

@ -29,6 +29,7 @@ _jc() {
'dmidecode:run "dmidecode" command with magic syntax.'
'dpkg:run "dpkg" command with magic syntax.'
'du:run "du" command with magic syntax.'
'efibootmgr:run "efibootmgr" command with magic syntax.'
'env:run "env" command with magic syntax.'
'file:run "file" command with magic syntax.'
'findmnt:run "findmnt" command with magic syntax.'
@ -148,6 +149,7 @@ _jc() {
'--dmidecode:`dmidecode` command parser'
'--dpkg-l:`dpkg -l` command parser'
'--du:`du` command parser'
'--efibootmgr:`efibootmgr` command parser'
'--email-address:Email Address string parser'
'--env:`env` command parser'
'--file:`file` command parser'

View File

@ -43,6 +43,7 @@ parsers: List[str] = [
'dmidecode',
'dpkg-l',
'du',
'efibootmgr',
'email-address',
'env',
'file',

160
jc/parsers/efibootmgr.py Normal file
View File

@ -0,0 +1,160 @@
"""jc - JSON Convert `efibootmgr` command output parser
Only `efibootmgr -v` option is supported with the default output.
Usage (cli):
$ sudo efibootmgr | jc --efibootmgr
$ sudo efibootmgr -v | jc --efibootmgr
or
$ sudo jc efibootmgr
Usage (module):
import jc
result = jc.parse('efibootmgr', efibootmgr_command_output)
Schema:
[
{
"boot_current": string,
"timeout_seconds": number,
"boot_order": [
string,
string,
string
],
mirrored_percentage_above_4g: number,
mirror_memory_below_4gb: bool,
"boot_options": [
{
"boot_option_reference": string,
"display_name": string,
"uefi_device_path": string,
"boot_option_enabled": bool
},
{
"boot_option_reference": string,
"display_name": string,
"uefi_device_path": string,
"boot_option_enabled": bool
},
{
"boot_option_reference": string,
"display_name": string,
"uefi_device_path": string,
"boot_option_enabled": bool
}
]
}
]
Examples:
$ sudo efibootmgr -v | jc --efibootmgr --pretty
[
{
"boot_current": "0002",
"timeout_seconds": 0,
"boot_order": [
"0002",
"0000",
"0001"
],
"mirrored_percentage_above_4g": 0.0,
"mirror_memory_below_4gb": false,
"boot_options": [
{
"boot_option_reference": "Boot0000",
"display_name": "WARNADO",
"uefi_device_path": "HD(1,GPT,05b9944c-1c60-492b-a510-7bbedccdc602,0x800,0xfa000)/File(EFI\\boot\\bootx64.efi)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0001",
"display_name": "Embedded NIC 1 Port 1 Partition 1",
"uefi_device_path": "VenHw(3a191845-5f86-4e78-8fce-c4cff59f9daa)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0002",
"display_name": "opensuse-secureboot",
"uefi_device_path": "HD(1,GPT,c5d4f69d-6fc2-48c7-acee-af3f30336dc5,0x800,0x19000)/File(\\EFI\\opensuse\\shim.efi)",
"boot_option_enabled": true
}
]
}
]
"""
import jc.utils
import jc.parsers.universal
class info():
"""Provides parser metadata (version, author, etc.)"""
version = '0.1'
description = '`efibootmgr -v` command parser'
author = 'Yaofei Zheng'
author_email = ['zyf26256@gmail.com','Yaofei.Zheng@dell.com']
compatible = ['linux']
magic_commands = ['efibootmgr']
tags = ['command']
__version__ = info.version
def _process(proc_data):
if 0 == len(proc_data):
return proc_data
proc_data[0]["timeout_seconds"] = int(proc_data[0]["timeout_seconds"].replace("seconds","").strip(), 10)
proc_data[0]["boot_order"] = proc_data[0]["boot_order"].split(',')
for boot_opt in proc_data[0]["boot_options"]:
boot_opt["boot_option_enabled"] = boot_opt["boot_option_enabled"] == '*'
proc_data[0]["mirrored_percentage_above_4g"] = float(proc_data[0]["mirrored_percentage_above_4g"])
proc_data[0]["mirror_memory_below_4gb"] = not ("false" == proc_data[0]["mirror_memory_below_4gb"])
return proc_data
def parse(data, raw=False, quiet=False):
jc.utils.compatibility(__name__, info.compatible, quiet)
jc.utils.input_type_check(data)
raw_output = []
if jc.utils.has_data(data):
boot_opt_list = []
efibootmgr_dict = {}
for line in filter(None, data.splitlines()):
if "BootCurrent" in line:
efibootmgr_dict["boot_current"] = line.split(':')[1].strip()
elif "Timeout" in line:
efibootmgr_dict["timeout_seconds"] = line.split(':')[1].strip()
elif "BootOrder" in line:
efibootmgr_dict["boot_order"] = line.split(':')[1].strip()
elif "Boot" in line:
tmp_dict = {}
boot_record = line.split("\t")
tmp_dict["boot_option_reference"] = boot_record[0][0:8]
tmp_dict["display_name"] = boot_record[0][10:].strip()
if len(boot_record) > 1:
tmp_dict["uefi_device_path"] = boot_record[1].strip()
tmp_dict["boot_option_enabled"] = boot_record[0][8]
boot_opt_list.append(tmp_dict)
elif "MirroredPercentageAbove4G" in line:
efibootmgr_dict["mirrored_percentage_above_4g"] = line.split(':')[1].strip()
elif "MirrorMemoryBelow4GB" in line:
efibootmgr_dict["mirror_memory_below_4gb"] = line.split(':')[1].strip()
else:
# print(line)
continue
efibootmgr_dict["boot_options"] = boot_opt_list
raw_output.append(efibootmgr_dict)
if raw:
return raw_output
else:
return _process(raw_output)

View File

@ -8,6 +8,7 @@ df -h > df-h.out
dig www.google.com AAAA > dig-aaaa.out
dig www.cnn.com www.google.com > dig.out
dig -x 1.1.1.1 > dig-x.out
sudo efibootmgr -v > efibootmgr.out
env > env.out
free > free.out
free -h > free-h.out

View File

@ -0,0 +1,96 @@
[
{
"boot_current": "0004",
"timeout_seconds": 0,
"boot_order": [
"0004",
"0001",
"0007",
"0002",
"0003",
"0009",
"0000",
"0005",
"0006",
"0008",
"000A",
"000B"
],
"mirrored_percentage_above_4g": 0.0,
"mirror_memory_below_4gb": false,
"boot_options": [
{
"boot_option_reference": "Boot0000",
"display_name": "debian",
"uefi_device_path": "HD(1,GPT,66b2a325-3129-45d3-84dd-c1a4e4bd846b,0x800,0x100000)/File(\\EFI\\debian\\shimx64.efi)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0001",
"display_name": "RecoveryBoot",
"uefi_device_path": "HD(3,GPT,a75ab570-de77-504c-be97-35faa629f1f3,0x5dc800,0x1f4000)/File(EFI\\boot\\bootx64.efi)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0002",
"display_name": "Embedded NIC 1 Port 1 Partition 1",
"uefi_device_path": "VenHw(3a191845-5f86-4e78-8fce-c4cff59f9daa)",
"boot_option_enabled": false
},
{
"boot_option_reference": "Boot0003",
"display_name": "Embedded NIC 2 Port 1 Partition 1",
"uefi_device_path": "VenHw(d227c733-f75f-4341-b749-4d1759ec8538)",
"boot_option_enabled": false
},
{
"boot_option_reference": "Boot0004",
"display_name": "PrimaryBoot",
"uefi_device_path": "HD(1,GPT,faf946be-a174-478f-82ea-d90aa476fb91,0x800,0xfa000)/File(EFI\\boot\\bootx64.efi)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0005",
"display_name": "EFI Fixed Disk Boot Device 3",
"uefi_device_path": "PciRoot(0x1)/Pci(0x4,0x0)/Pci(0x0,0x0)/NVMe(0x1,8C-E3-8E-E2-0A-D4-0F-01)/HD(1,GPT,c2336d30-9bde-4a0b-b9be-145d6958d5af,0x1000,0x80001)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0006",
"display_name": "EFI Fixed Disk Boot Device 4",
"uefi_device_path": "PciRoot(0x11)/Pci(0x1,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B8-C1)/HD(1,GPT,1fbfeaec-d78d-4d8c-93ae-77bba6c09d3f,0x1000,0x80001)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0007",
"display_name": "BackendBoot",
"uefi_device_path": "PciRoot(0x11)/Pci(0x3,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B5-B6)/HD(1,GPT,b95c4d58-849f-40fa-bf2b-4f0b8a0aa8bd,0x1000,0x80001)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0008",
"display_name": "EFI Fixed Disk Boot Device 6",
"uefi_device_path": "PciRoot(0x11)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,8C-E3-8E-E2-0A-D3-90-01)/HD(1,GPT,f543ab7b-9d55-4e57-8afe-bdb907428f15,0x1000,0x80001)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot0009",
"display_name": "EFI Fixed Disk Boot Device 7",
"uefi_device_path": "PciRoot(0x12)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B6-08)/HD(1,GPT,db9522dc-062b-4efa-84b5-6956cea7b5a6,0x1000,0x80001)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot000A",
"display_name": "EFI Fixed Disk Boot Device 8",
"uefi_device_path": "PciRoot(0x12)/Pci(0x8,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B6-0D)/HD(1,GPT,4a9e1d40-b853-44a0-8d26-a4df6f112dc9,0x1000,0x80001)",
"boot_option_enabled": true
},
{
"boot_option_reference": "Boot000B",
"display_name": "EFI Fixed Disk Boot Device 9",
"uefi_device_path": "PciRoot(0x13)/Pci(0x5,0x0)/Pci(0x0,0x0)/NVMe(0x1,8C-E3-8E-E2-0A-D3-8E-01)/HD(1,GPT,5a80e168-bac7-4967-9507-e23a432bae18,0x1000,0x80001)",
"boot_option_enabled": true
}
]
}
]

View File

@ -0,0 +1,17 @@
BootCurrent: 0004
Timeout: 0 seconds
BootOrder: 0004,0001,0007,0002,0003,0009,0000,0005,0006,0008,000A,000B
Boot0000* debian HD(1,GPT,66b2a325-3129-45d3-84dd-c1a4e4bd846b,0x800,0x100000)/File(\EFI\debian\shimx64.efi)
Boot0001* RecoveryBoot HD(3,GPT,a75ab570-de77-504c-be97-35faa629f1f3,0x5dc800,0x1f4000)/File(EFI\boot\bootx64.efi)
Boot0002 Embedded NIC 1 Port 1 Partition 1 VenHw(3a191845-5f86-4e78-8fce-c4cff59f9daa)
Boot0003 Embedded NIC 2 Port 1 Partition 1 VenHw(d227c733-f75f-4341-b749-4d1759ec8538)
Boot0004* PrimaryBoot HD(1,GPT,faf946be-a174-478f-82ea-d90aa476fb91,0x800,0xfa000)/File(EFI\boot\bootx64.efi)
Boot0005* EFI Fixed Disk Boot Device 3 PciRoot(0x1)/Pci(0x4,0x0)/Pci(0x0,0x0)/NVMe(0x1,8C-E3-8E-E2-0A-D4-0F-01)/HD(1,GPT,c2336d30-9bde-4a0b-b9be-145d6958d5af,0x1000,0x80001)
Boot0006* EFI Fixed Disk Boot Device 4 PciRoot(0x11)/Pci(0x1,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B8-C1)/HD(1,GPT,1fbfeaec-d78d-4d8c-93ae-77bba6c09d3f,0x1000,0x80001)
Boot0007* BackendBoot PciRoot(0x11)/Pci(0x3,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B5-B6)/HD(1,GPT,b95c4d58-849f-40fa-bf2b-4f0b8a0aa8bd,0x1000,0x80001)
Boot0008* EFI Fixed Disk Boot Device 6 PciRoot(0x11)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,8C-E3-8E-E2-0A-D3-90-01)/HD(1,GPT,f543ab7b-9d55-4e57-8afe-bdb907428f15,0x1000,0x80001)
Boot0009* EFI Fixed Disk Boot Device 7 PciRoot(0x12)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B6-08)/HD(1,GPT,db9522dc-062b-4efa-84b5-6956cea7b5a6,0x1000,0x80001)
Boot000A* EFI Fixed Disk Boot Device 8 PciRoot(0x12)/Pci(0x8,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-25-38-95-21-01-B6-0D)/HD(1,GPT,4a9e1d40-b853-44a0-8d26-a4df6f112dc9,0x1000,0x80001)
Boot000B* EFI Fixed Disk Boot Device 9 PciRoot(0x13)/Pci(0x5,0x0)/Pci(0x0,0x0)/NVMe(0x1,8C-E3-8E-E2-0A-D3-8E-01)/HD(1,GPT,5a80e168-bac7-4967-9507-e23a432bae18,0x1000,0x80001)
MirroredPercentageAbove4G: 0.00
MirrorMemoryBelow4GB: false

33
tests/test_efibootmgr.py Normal file
View File

@ -0,0 +1,33 @@
import os
import json
import unittest
import jc.parsers.efibootmgr
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
class MyTests(unittest.TestCase):
# input
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/opensuse-leap-15.5/efibootmgr.out'), 'r', encoding='utf-8') as f:
opensuse_leap_15_5_efibootmgr = f.read()
# output
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/opensuse-leap-15.5/efibootmgr.json'), 'r', encoding='utf-8') as f:
opensuse_leap_15_5_efibootmgr_json = json.loads(f.read())
def test_efibootmgr_nodata(self):
"""
Test 'efibootmgr' with no data
"""
self.assertEqual(jc.parsers.efibootmgr.parse('', quiet=True), [])
def test_efibootmgr_opensuse_leap_15_5(self):
"""
Test 'efibootmgr' on Opensuse Leap 15.5
"""
self.assertEqual(jc.parsers.efibootmgr.parse(self.opensuse_leap_15_5_efibootmgr, quiet=True), self.opensuse_leap_15_5_efibootmgr_json)
if __name__ == '__main__':
unittest.main()