github.com/linuxboot/fiano@v1.2.0/pkg/visitors/nvarinvalidate.go (about) 1 // Copyright 2019 the LinuxBoot Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package visitors 6 7 import ( 8 "fmt" 9 "io" 10 "os" 11 12 "github.com/linuxboot/fiano/pkg/uefi" 13 ) 14 15 // NVarInvalidate set NVar as Invalid 16 type NVarInvalidate struct { 17 // Input 18 Predicate func(f uefi.Firmware) bool 19 20 // Output 21 Matches []uefi.Firmware 22 // logs are written to this writer. 23 W io.Writer 24 } 25 26 func (v *NVarInvalidate) printf(format string, a ...interface{}) { 27 if v.W != nil { 28 fmt.Fprintf(v.W, format, a...) 29 } 30 } 31 32 // Run uses find and wraps Visit. 33 func (v *NVarInvalidate) Run(f uefi.Firmware) error { 34 // First run "find" to generate a list of matches to replace. 35 find := Find{ 36 Predicate: v.Predicate, 37 } 38 if err := find.Run(f); err != nil { 39 return err 40 } 41 42 v.Matches = find.Matches 43 for _, m := range v.Matches { 44 if err := m.Apply(v); err != nil { 45 return err 46 } 47 } 48 return nil 49 } 50 51 // Visit set NVar as Invalid 52 func (v *NVarInvalidate) Visit(f uefi.Firmware) error { 53 switch f := f.(type) { 54 case *uefi.NVar: 55 v.printf("Invalidate: %v %v\n", f.GUID, f) 56 f.Type = uefi.InvalidNVarEntry 57 } 58 return nil 59 } 60 61 func init() { 62 RegisterCLI("invalidate_nvar", "invalidate NVar by Name", 1, func(args []string) (uefi.Visitor, error) { 63 pred, err := FindNVarPredicate(args[0]) 64 if err != nil { 65 return nil, err 66 } 67 return &NVarInvalidate{ 68 Predicate: pred, 69 W: os.Stdout, 70 }, nil 71 }) 72 RegisterCLI("invalidate_nvar_except", "invalidate all NVar except those in the specified file", 1, func(args []string) (uefi.Visitor, error) { 73 fileName := args[0] 74 fileContents, err := os.ReadFile(fileName) 75 if err != nil { 76 return nil, fmt.Errorf("cannot read blacklist file %q: %v", fileName, err) 77 } 78 blackListRegex, err := parseBlackList(fileName, string(fileContents)) 79 if err != nil { 80 return nil, err 81 } 82 blackListPredicate, err := FindNVarPredicate(blackListRegex) 83 if err != nil { 84 return nil, err 85 } 86 pred := FindNotPredicate(blackListPredicate) 87 88 return &NVarInvalidate{ 89 Predicate: pred, 90 W: os.Stdout, 91 }, nil 92 }) 93 94 }