print.go 2.3 KB

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