mirror of https://github.com/ericonr/sbctl.git
Attempt to trigger automounts to find the ESP
The ESP may be an automount partition, so try touching a file in each candidate location so as to trigger an automounts. This is the same way systemd attempts to find it: https://github.com/systemd/systemd/blob/f565b86/src/shared/bootspec.c#L1014-L1018 I've also changed the function to return an error if no ESP is found. The previous behaviour (an empty string) just results in a crash later on. When no ESP is found, the `bundle` command will have no default for the `esp` flag. Passing an empty string to it as a default results in no value being show in the output of `--help`. This seemed like the most reasonable compromise instead of panicking. Fixes #78
This commit is contained in:
parent
1614cfbd2e
commit
1aca349c90
11
bundles.go
11
bundles.go
|
@ -74,15 +74,18 @@ func GetEfistub() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBundle() *Bundle {
|
func NewBundle() (bundle *Bundle, err error) {
|
||||||
esp := GetESP()
|
esp, err := GetESP()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
stub := GetEfistub()
|
stub := GetEfistub()
|
||||||
if stub == "" {
|
if stub == "" {
|
||||||
panic("No EFISTUB file found. Please install systemd-boot or gummiboot!")
|
panic("No EFISTUB file found. Please install systemd-boot or gummiboot!")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Bundle{
|
bundle = &Bundle{
|
||||||
Output: "",
|
Output: "",
|
||||||
IntelMicrocode: "",
|
IntelMicrocode: "",
|
||||||
AMDMicrocode: "",
|
AMDMicrocode: "",
|
||||||
|
@ -94,6 +97,8 @@ func NewBundle() *Bundle {
|
||||||
EFIStub: stub,
|
EFIStub: stub,
|
||||||
ESP: esp,
|
ESP: esp,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateBundle(bundle *Bundle) (bool, error) {
|
func GenerateBundle(bundle *Bundle) (bool, error) {
|
||||||
|
|
|
@ -40,7 +40,10 @@ var bundleCmd = &cobra.Command{
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bundle := sbctl.NewBundle()
|
bundle, err := sbctl.NewBundle()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
output, err := filepath.Abs(args[0])
|
output, err := filepath.Abs(args[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -81,7 +84,11 @@ var bundleCmd = &cobra.Command{
|
||||||
}
|
}
|
||||||
|
|
||||||
func bundleCmdFlags(cmd *cobra.Command) {
|
func bundleCmdFlags(cmd *cobra.Command) {
|
||||||
esp := sbctl.GetESP()
|
esp, err := sbctl.GetESP()
|
||||||
|
if err != nil {
|
||||||
|
logging.Warn("Failed to find ESP: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
f := cmd.Flags()
|
f := cmd.Flags()
|
||||||
f.StringVarP(&amducode, "amducode", "a", "", "AMD microcode location")
|
f.StringVarP(&amducode, "amducode", "a", "", "AMD microcode location")
|
||||||
f.StringVarP(&intelucode, "intelucode", "i", "", "Intel microcode location")
|
f.StringVarP(&intelucode, "intelucode", "i", "", "Intel microcode location")
|
||||||
|
|
|
@ -35,7 +35,10 @@ var listBundlesCmd = &cobra.Command{
|
||||||
isSigned = false
|
isSigned = false
|
||||||
logging.NotOk("Not Signed")
|
logging.NotOk("Not Signed")
|
||||||
}
|
}
|
||||||
esp := sbctl.GetESP()
|
esp, err := sbctl.GetESP()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
logging.Print("\tESP Location:\t%s\n", esp)
|
logging.Print("\tESP Location:\t%s\n", esp)
|
||||||
logging.Print("\tOutput:\t\t└─%s\n", strings.TrimPrefix(s.Output, esp))
|
logging.Print("\tOutput:\t\t└─%s\n", strings.TrimPrefix(s.Output, esp))
|
||||||
logging.Print("\tEFI Stub Image:\t └─%s\n", s.EFIStub)
|
logging.Print("\tEFI Stub Image:\t └─%s\n", s.EFIStub)
|
||||||
|
|
|
@ -18,7 +18,10 @@ var verifyCmd = &cobra.Command{
|
||||||
if err := sbctl.CanVerifyFiles(); err != nil {
|
if err := sbctl.CanVerifyFiles(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
espPath := sbctl.GetESP()
|
espPath, err := sbctl.GetESP()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
logging.Print("Verifying file database and EFI images in %s...\n", espPath)
|
logging.Print("Verifying file database and EFI images in %s...\n", espPath)
|
||||||
if err := sbctl.SigningEntryIter(func(file *sbctl.SigningEntry) error {
|
if err := sbctl.SigningEntryIter(func(file *sbctl.SigningEntry) error {
|
||||||
sbctl.AddChecked(file.OutputFile)
|
sbctl.AddChecked(file.OutputFile)
|
||||||
|
|
21
sbctl.go
21
sbctl.go
|
@ -24,16 +24,29 @@ type LsblkRoot struct {
|
||||||
Blockdevices []LsblkEntry `json:"blockdevices"`
|
Blockdevices []LsblkEntry `json:"blockdevices"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var espLocations = []string{
|
||||||
|
"/boot",
|
||||||
|
"/boot/efi",
|
||||||
|
"/efi",
|
||||||
|
}
|
||||||
|
var ErrNoESP = errors.New("failed to find EFI system partition")
|
||||||
|
|
||||||
// Slightly more advanced check
|
// Slightly more advanced check
|
||||||
func GetESP() string {
|
func GetESP() (string, error) {
|
||||||
|
|
||||||
for _, env := range []string{"SYSTEMD_ESP_PATH", "ESP_PATH"} {
|
for _, env := range []string{"SYSTEMD_ESP_PATH", "ESP_PATH"} {
|
||||||
envEspPath, found := os.LookupEnv(env)
|
envEspPath, found := os.LookupEnv(env)
|
||||||
if found {
|
if found {
|
||||||
return envEspPath
|
return envEspPath, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, location := range espLocations {
|
||||||
|
// "Touch" a file inside all candiadate locations to trigger an
|
||||||
|
// automount if there's an automount partition.
|
||||||
|
os.Stat(fmt.Sprintf("%s/does-not-exist", location))
|
||||||
|
}
|
||||||
|
|
||||||
out, err := exec.Command(
|
out, err := exec.Command(
|
||||||
"lsblk",
|
"lsblk",
|
||||||
"--json",
|
"--json",
|
||||||
|
@ -80,10 +93,10 @@ func GetESP() string {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
return entryToCheck.Mountpoint
|
return entryToCheck.Mountpoint, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return "", ErrNoESP
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sign(file, output string, enroll bool) error {
|
func Sign(file, output string, enroll bool) error {
|
||||||
|
|
Loading…
Reference in New Issue