import argparse import struct import os import sys # This script will create a PXE or HTTP boot entry specific for a linux nic using # convenience of the linux interface name. It can help produce precise network boot order # configuration more easily if that is useful # only tested with Lenovo system firmware on PCIe network adapters parser = argparse.ArgumentParser(description='Generate an efivars boot entry file') parser.add_argument('interface', help='Current linux interface name to boot from') parser.add_argument('outfile', help='The file to write, e.g. /sys/firmware/efi/efivars/Boot0007-8be4df61-93ca-11d2-aa0d-00e098032b8c') parser.add_argument('-u', help='The HTTP url to boot, "" for generic HTTP boot instead of PXE') args = parser.parse_args() with open('/sys/class/net/{0}/address'.format(sys.argv[1])) as macaddr: macaddr = macaddr.read() macaddr = macaddr.split(':') macaddr = [ int(x, 16) for x in macaddr ] macaddr = bytes(macaddr) olddir = os.getcwd() os.chdir('/sys/class/net/{0}'.format(sys.argv[1])) devdir = os.readlink('/sys/class/net/{0}/device'.format(sys.argv[1])) os.chdir(devdir) pcipath = os.getcwd() pcipath = pcipath.split('/') os.chdir('/'.join(pcipath[:4])) acpiid = os.readlink('firmware_node') os.chdir(acpiid) hid = '0A03' # do not adapt, always say pciroot, pcieroot doesn't work open('hid').read().replace('PNP', '') hid = int(hid, 16) << 16 | 0x41d0 hid = struct.pack('