2
0

print.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package main
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "os"
  8. "strings"
  9. "github.com/skip2/go-qrcode"
  10. "github.com/slackhq/nebula/cert"
  11. )
  12. type printFlags struct {
  13. set *flag.FlagSet
  14. json *bool
  15. outQRPath *string
  16. path *string
  17. }
  18. func newPrintFlags() *printFlags {
  19. pf := printFlags{set: flag.NewFlagSet("print", flag.ContinueOnError)}
  20. pf.set.Usage = func() {}
  21. pf.json = pf.set.Bool("json", false, "Optional: outputs certificates in json format")
  22. pf.outQRPath = pf.set.String("out-qr", "", "Optional: output a qr code image (png) of the certificate")
  23. pf.path = pf.set.String("path", "", "Required: path to the certificate")
  24. return &pf
  25. }
  26. func printCert(args []string, out io.Writer, errOut io.Writer) error {
  27. pf := newPrintFlags()
  28. err := pf.set.Parse(args)
  29. if err != nil {
  30. return err
  31. }
  32. if err := mustFlagString("path", pf.path); err != nil {
  33. return err
  34. }
  35. rawCert, err := os.ReadFile(*pf.path)
  36. if err != nil {
  37. return fmt.Errorf("unable to read cert; %s", err)
  38. }
  39. var c cert.Certificate
  40. var qrBytes []byte
  41. part := 0
  42. var jsonCerts []cert.Certificate
  43. for {
  44. c, rawCert, err = cert.UnmarshalCertificateFromPEM(rawCert)
  45. if err != nil {
  46. return fmt.Errorf("error while unmarshaling cert: %s", err)
  47. }
  48. if *pf.json {
  49. jsonCerts = append(jsonCerts, c)
  50. } else {
  51. _, _ = out.Write([]byte(c.String()))
  52. _, _ = out.Write([]byte("\n"))
  53. }
  54. if *pf.outQRPath != "" {
  55. b, err := c.MarshalPEM()
  56. if err != nil {
  57. return fmt.Errorf("error while marshalling cert to PEM: %s", err)
  58. }
  59. qrBytes = append(qrBytes, b...)
  60. }
  61. if rawCert == nil || len(rawCert) == 0 || strings.TrimSpace(string(rawCert)) == "" {
  62. break
  63. }
  64. part++
  65. }
  66. if *pf.json {
  67. b, _ := json.Marshal(jsonCerts)
  68. _, _ = out.Write(b)
  69. _, _ = out.Write([]byte("\n"))
  70. }
  71. if *pf.outQRPath != "" {
  72. b, err := qrcode.Encode(string(qrBytes), qrcode.Medium, -5)
  73. if err != nil {
  74. return fmt.Errorf("error while generating qr code: %s", err)
  75. }
  76. err = os.WriteFile(*pf.outQRPath, b, 0600)
  77. if err != nil {
  78. return fmt.Errorf("error while writing out-qr: %s", err)
  79. }
  80. }
  81. return nil
  82. }
  83. func printSummary() string {
  84. return "print <flags>: prints details about a certificate"
  85. }
  86. func printHelp(out io.Writer) {
  87. pf := newPrintFlags()
  88. out.Write([]byte("Usage of " + os.Args[0] + " " + printSummary() + "\n"))
  89. pf.set.SetOutput(out)
  90. pf.set.PrintDefaults()
  91. }