main.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. var Build string
  9. type helpError struct {
  10. s string
  11. }
  12. func (he *helpError) Error() string {
  13. return he.s
  14. }
  15. func newHelpErrorf(s string, v ...interface{}) error {
  16. return &helpError{s: fmt.Sprintf(s, v...)}
  17. }
  18. func main() {
  19. flag.Usage = func() {
  20. help("", os.Stderr)
  21. os.Exit(1)
  22. }
  23. printVersion := flag.Bool("version", false, "Print version")
  24. flagHelp := flag.Bool("help", false, "Print command line usage")
  25. flagH := flag.Bool("h", false, "Print command line usage")
  26. printUsage := false
  27. flag.Parse()
  28. if *flagH || *flagHelp {
  29. printUsage = true
  30. }
  31. args := flag.Args()
  32. if *printVersion {
  33. fmt.Printf("Version: %v", Build)
  34. os.Exit(0)
  35. }
  36. if len(args) < 1 {
  37. if printUsage {
  38. help("", os.Stderr)
  39. os.Exit(0)
  40. }
  41. help("No mode was provided", os.Stderr)
  42. os.Exit(1)
  43. } else if printUsage {
  44. handleError(args[0], &helpError{}, os.Stderr)
  45. os.Exit(0)
  46. }
  47. var err error
  48. switch args[0] {
  49. case "ca":
  50. err = ca(args[1:], os.Stdout, os.Stderr)
  51. case "keygen":
  52. err = keygen(args[1:], os.Stdout, os.Stderr)
  53. case "sign":
  54. err = signCert(args[1:], os.Stdout, os.Stderr)
  55. case "print":
  56. err = printCert(args[1:], os.Stdout, os.Stderr)
  57. case "verify":
  58. err = verify(args[1:], os.Stdout, os.Stderr)
  59. default:
  60. err = fmt.Errorf("unknown mode: %s", args[0])
  61. }
  62. if err != nil {
  63. os.Exit(handleError(args[0], err, os.Stderr))
  64. }
  65. }
  66. func handleError(mode string, e error, out io.Writer) int {
  67. code := 1
  68. // Handle -help, -h flags properly
  69. if e == flag.ErrHelp {
  70. code = 0
  71. e = &helpError{}
  72. } else if e != nil && e.Error() != "" {
  73. fmt.Fprintln(out, "Error:", e)
  74. }
  75. switch e.(type) {
  76. case *helpError:
  77. switch mode {
  78. case "ca":
  79. caHelp(out)
  80. case "keygen":
  81. keygenHelp(out)
  82. case "sign":
  83. signHelp(out)
  84. case "print":
  85. printHelp(out)
  86. case "verify":
  87. verifyHelp(out)
  88. }
  89. }
  90. return code
  91. }
  92. func help(err string, out io.Writer) {
  93. if err != "" {
  94. fmt.Fprintln(out, "Error:", err)
  95. fmt.Fprintln(out, "")
  96. }
  97. fmt.Fprintf(out, "Usage of %s <global flags> <mode>:\n", os.Args[0])
  98. fmt.Fprintln(out, " Global flags:")
  99. fmt.Fprintln(out, " -version: Prints the version")
  100. fmt.Fprintln(out, " -h, -help: Prints this help message")
  101. fmt.Fprintln(out, "")
  102. fmt.Fprintln(out, " Modes:")
  103. fmt.Fprintln(out, " "+caSummary())
  104. fmt.Fprintln(out, " "+keygenSummary())
  105. fmt.Fprintln(out, " "+signSummary())
  106. fmt.Fprintln(out, " "+printSummary())
  107. fmt.Fprintln(out, " "+verifySummary())
  108. }
  109. func mustFlagString(name string, val *string) error {
  110. if *val == "" {
  111. return newHelpErrorf("-%s is required", name)
  112. }
  113. return nil
  114. }