diff --git a/tools/rule_checker/main.go b/tools/rule_checker/main.go index 52f891d24..a4ecf90a5 100644 --- a/tools/rule_checker/main.go +++ b/tools/rule_checker/main.go @@ -19,29 +19,82 @@ package main import ( "flag" "fmt" - - "github.com/golang/glog" + "io" + "os" "github.com/prometheus/prometheus/rules" ) -var ruleFile = flag.String("rule-file", "", "The path to the rule file to check.") +var ( + flagset = flag.NewFlagSet(os.Args[0], flag.ExitOnError) + ruleFile = flagset.String("rule-file", "", "The path to the rule file to check. (Deprecated)") +) + +// checkRules reads rules from in. Sucessfully read rules +// are printed to out. +func checkRules(filename string, in io.Reader, out io.Writer) error { + rules, err := rules.LoadRulesFromReader(in) + if err != nil { + return err + } + + fmt.Fprintf(os.Stderr, "%s: successfully loaded %d rules:\n", filename, len(rules)) + for _, rule := range rules { + fmt.Fprint(out, rule.String()) + fmt.Fprint(out, "\n") + } + return nil +} + +func usage() { + fmt.Fprintf(os.Stderr, "usage: rule_checker [path ...]\n") + + flagset.PrintDefaults() + os.Exit(2) +} func main() { - flag.Parse() + flagset.Usage = usage + flagset.Parse(os.Args[1:]) - if *ruleFile == "" { - glog.Fatal("Must provide a rule file path") + if flagset.NArg() == 0 && *ruleFile == "" { + if err := checkRules("", os.Stdin, os.Stdout); err != nil { + fmt.Fprintf(os.Stderr, "error checking standard input: %s\n", err) + os.Exit(1) + } + os.Exit(0) } - rules, err := rules.LoadRulesFromFile(*ruleFile) - if err != nil { - glog.Fatalf("Error loading rule file %s: %s", *ruleFile, err) + paths := flagset.Args() + if *ruleFile != "" { + paths = []string{*ruleFile} + + fmt.Fprint(os.Stderr, "warning: usage of -rule-file is deprecated.\n") } - fmt.Printf("Successfully loaded %d rules:\n\n", len(rules)) + failed := false + for _, path := range paths { + switch dir, err := os.Stat(path); { + case err != nil: + fmt.Fprintf(os.Stderr, "%s: error checking path: %s\n", path, err) + os.Exit(2) + case dir.IsDir(): + fmt.Fprintf(os.Stderr, "%s: error checking path: directories not allowed\n", path) + os.Exit(2) + default: + f, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, "%s: error opening file: %s\n", path, err) + failed = true + } else if err := checkRules(path, f, os.Stdout); err != nil { + fmt.Fprintf(os.Stderr, "%s: error checking rules: %s\n", path, err) + failed = true + } + f.Close() + } + } - for _, rule := range rules { - fmt.Println(rule) + if failed { + os.Exit(1) } }