- // Package main provides the command line interface.
- //
- package main
-
- import (
- "fmt"
- "log"
- "os"
-
- "github.com/pborman/getopt/v2"
-
- "gerrit.wikimedia.org/r/blubber/config"
- "gerrit.wikimedia.org/r/blubber/docker"
- "gerrit.wikimedia.org/r/blubber/meta"
- )
-
- const parameters = "config.yaml variant"
-
- var (
- showHelp = getopt.BoolLong("help", 'h', "show help/usage")
- showVersion = getopt.BoolLong("version", 'v', "show version information")
- policyURI = getopt.StringLong("policy", 'p', "", "policy file URI", "uri")
- )
-
- func main() {
- getopt.SetParameters(parameters)
- getopt.Parse()
-
- if *showHelp {
- getopt.Usage()
- os.Exit(1)
- }
-
- if *showVersion {
- fmt.Println(meta.FullVersion())
- os.Exit(0)
- }
-
- args := getopt.Args()
-
- if len(args) < 2 {
- getopt.Usage()
- os.Exit(1)
- }
-
- cfgPath, variant := args[0], args[1]
-
- cfg, err := config.ReadConfigFile(cfgPath)
-
- if err != nil {
- if config.IsValidationError(err) {
- log.Printf("%s is invalid:\n%v", cfgPath, config.HumanizeValidationError(err))
- os.Exit(4)
- } else {
- log.Printf("Error reading %s: %v\n", cfgPath, err)
- os.Exit(2)
- }
- }
-
- if *policyURI != "" {
- policy, err := config.ReadPolicyFromURI(*policyURI)
-
- if err != nil {
- log.Printf("Error loading policy from %s: %v\n", *policyURI, err)
- os.Exit(5)
- }
-
- err = policy.Validate(*cfg)
-
- if err != nil {
- log.Printf("Configuration fails policy check against:\npolicy: %s\nviolation: %v\n", *policyURI, err)
- os.Exit(6)
- }
- }
-
- dockerFile, err := docker.Compile(cfg, variant)
-
- if err != nil {
- log.Printf("Error compiling config: %v\n", err)
- os.Exit(3)
- }
-
- dockerFile.WriteTo(os.Stdout)
- }
|