diff options
| author | Ophestra <cat@gensokyo.uk> | 2024-12-23 17:57:54 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2024-12-23 17:57:54 +0900 |
| commit | 70bffeaa1e74b2e0e8344d5cb22698f32fb866fe (patch) | |
| tree | 1d0046cc252a6a52e953c8d4431cd12bb8ef380a /parse.go | |
| parent | c109ac26530ba38d3713bedcb404c1ddd7452d13 (diff) | |
fortify: clean up config loading
Move duplicate code to function. Also handle - as config from stdin.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'parse.go')
| -rw-r--r-- | parse.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/parse.go b/parse.go new file mode 100644 index 00000000..b5074165 --- /dev/null +++ b/parse.go @@ -0,0 +1,78 @@ +package main + +import ( + "encoding/json" + "io" + direct "os" + "strings" + + "git.gensokyo.uk/security/fortify/fst" + "git.gensokyo.uk/security/fortify/internal/fmsg" + "git.gensokyo.uk/security/fortify/internal/state" +) + +func tryPath(name string) (config *fst.Config) { + var r io.Reader + config = new(fst.Config) + + if name != "-" { + if f, err := os.Open(name); err != nil { + fmsg.Fatalf("cannot access configuration file %q: %s", name, err) + panic("unreachable") + } else { + // finalizer closes f + r = f + } + } else { + r = direct.Stdin + } + + if err := json.NewDecoder(r).Decode(&config); err != nil { + fmsg.Fatalf("cannot load configuration: %v", err) + panic("unreachable") + } + + return +} + +func tryShort(name string) (config *fst.Config, instance *state.State) { + likePrefix := false + if len(name) <= 32 { + likePrefix = true + for _, c := range name { + if c >= '0' && c <= '9' { + continue + } + if c >= 'a' && c <= 'f' { + continue + } + likePrefix = false + break + } + } + + // try to match from state store + if likePrefix && len(name) >= 8 { + fmsg.VPrintln("argument looks like prefix") + + s := state.NewMulti(os.Paths().RunDirPath) + if entries, err := state.Join(s); err != nil { + fmsg.Printf("cannot join store: %v", err) + // drop to fetch from file + } else { + for id := range entries { + v := id.String() + if strings.HasPrefix(v, name) { + // match, use config from this state entry + instance = entries[id] + config = instance.Config + break + } + + fmsg.VPrintf("instance %s skipped", v) + } + } + } + + return +} |
