You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
1.6 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. // Package main provides the command line interface.
  2. //
  3. package main
  4. import (
  5. "fmt"
  6. "log"
  7. "os"
  8. "github.com/pborman/getopt/v2"
  9. "gerrit.wikimedia.org/r/blubber/config"
  10. "gerrit.wikimedia.org/r/blubber/docker"
  11. "gerrit.wikimedia.org/r/blubber/meta"
  12. )
  13. const parameters = "config.yaml variant"
  14. var (
  15. showHelp = getopt.BoolLong("help", 'h', "show help/usage")
  16. showVersion = getopt.BoolLong("version", 'v', "show version information")
  17. policyURI = getopt.StringLong("policy", 'p', "", "policy file URI", "uri")
  18. )
  19. func main() {
  20. getopt.SetParameters(parameters)
  21. getopt.Parse()
  22. if *showHelp {
  23. getopt.Usage()
  24. os.Exit(1)
  25. }
  26. if *showVersion {
  27. fmt.Println(meta.FullVersion())
  28. os.Exit(0)
  29. }
  30. args := getopt.Args()
  31. if len(args) < 2 {
  32. getopt.Usage()
  33. os.Exit(1)
  34. }
  35. cfgPath, variant := args[0], args[1]
  36. cfg, err := config.ReadConfigFile(cfgPath)
  37. if err != nil {
  38. if config.IsValidationError(err) {
  39. log.Printf("%s is invalid:\n%v", cfgPath, config.HumanizeValidationError(err))
  40. os.Exit(4)
  41. } else {
  42. log.Printf("Error reading %s: %v\n", cfgPath, err)
  43. os.Exit(2)
  44. }
  45. }
  46. if *policyURI != "" {
  47. policy, err := config.ReadPolicyFromURI(*policyURI)
  48. if err != nil {
  49. log.Printf("Error loading policy from %s: %v\n", *policyURI, err)
  50. os.Exit(5)
  51. }
  52. err = policy.Validate(*cfg)
  53. if err != nil {
  54. log.Printf("Configuration fails policy check against:\npolicy: %s\nviolation: %v\n", *policyURI, err)
  55. os.Exit(6)
  56. }
  57. }
  58. dockerFile, err := docker.Compile(cfg, variant)
  59. if err != nil {
  60. log.Printf("Error compiling config: %v\n", err)
  61. os.Exit(3)
  62. }
  63. dockerFile.WriteTo(os.Stdout)
  64. }