print.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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.NebulaCertificate
  40. var qrBytes []byte
  41. part := 0
  42. for {
  43. c, rawCert, err = cert.UnmarshalNebulaCertificateFromPEM(rawCert)
  44. if err != nil {
  45. return fmt.Errorf("error while unmarshaling cert: %s", err)
  46. }
  47. if *pf.json {
  48. b, _ := json.Marshal(c)
  49. out.Write(b)
  50. out.Write([]byte("\n"))
  51. } else {
  52. out.Write([]byte(c.String()))
  53. out.Write([]byte("\n"))
  54. }
  55. if *pf.outQRPath != "" {
  56. b, err := c.MarshalToPEM()
  57. if err != nil {
  58. return fmt.Errorf("error while marshalling cert to PEM: %s", err)
  59. }
  60. qrBytes = append(qrBytes, b...)
  61. }
  62. if rawCert == nil || len(rawCert) == 0 || strings.TrimSpace(string(rawCert)) == "" {
  63. break
  64. }
  65. part++
  66. }
  67. if *pf.outQRPath != "" {
  68. b, err := qrcode.Encode(string(qrBytes), qrcode.Medium, -5)
  69. if err != nil {
  70. return fmt.Errorf("error while generating qr code: %s", err)
  71. }
  72. err = os.WriteFile(*pf.outQRPath, b, 0600)
  73. if err != nil {
  74. return fmt.Errorf("error while writing out-qr: %s", err)
  75. }
  76. }
  77. return nil
  78. }
  79. func printSummary() string {
  80. return "print <flags>: prints details about a certificate"
  81. }
  82. func printHelp(out io.Writer) {
  83. pf := newPrintFlags()
  84. out.Write([]byte("Usage of " + os.Args[0] + " " + printSummary() + "\n"))
  85. pf.set.SetOutput(out)
  86. pf.set.PrintDefaults()
  87. }