| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | 
							- package main
 
- import (
 
- 	"encoding/json"
 
- 	"flag"
 
- 	"fmt"
 
- 	"io"
 
- 	"os"
 
- 	"strings"
 
- 	"github.com/skip2/go-qrcode"
 
- 	"github.com/slackhq/nebula/cert"
 
- )
 
- type printFlags struct {
 
- 	set       *flag.FlagSet
 
- 	json      *bool
 
- 	outQRPath *string
 
- 	path      *string
 
- }
 
- func newPrintFlags() *printFlags {
 
- 	pf := printFlags{set: flag.NewFlagSet("print", flag.ContinueOnError)}
 
- 	pf.set.Usage = func() {}
 
- 	pf.json = pf.set.Bool("json", false, "Optional: outputs certificates in json format")
 
- 	pf.outQRPath = pf.set.String("out-qr", "", "Optional: output a qr code image (png) of the certificate")
 
- 	pf.path = pf.set.String("path", "", "Required: path to the certificate")
 
- 	return &pf
 
- }
 
- func printCert(args []string, out io.Writer, errOut io.Writer) error {
 
- 	pf := newPrintFlags()
 
- 	err := pf.set.Parse(args)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	if err := mustFlagString("path", pf.path); err != nil {
 
- 		return err
 
- 	}
 
- 	rawCert, err := os.ReadFile(*pf.path)
 
- 	if err != nil {
 
- 		return fmt.Errorf("unable to read cert; %s", err)
 
- 	}
 
- 	var c *cert.NebulaCertificate
 
- 	var qrBytes []byte
 
- 	part := 0
 
- 	for {
 
- 		c, rawCert, err = cert.UnmarshalNebulaCertificateFromPEM(rawCert)
 
- 		if err != nil {
 
- 			return fmt.Errorf("error while unmarshaling cert: %s", err)
 
- 		}
 
- 		if *pf.json {
 
- 			b, _ := json.Marshal(c)
 
- 			out.Write(b)
 
- 			out.Write([]byte("\n"))
 
- 		} else {
 
- 			out.Write([]byte(c.String()))
 
- 			out.Write([]byte("\n"))
 
- 		}
 
- 		if *pf.outQRPath != "" {
 
- 			b, err := c.MarshalToPEM()
 
- 			if err != nil {
 
- 				return fmt.Errorf("error while marshalling cert to PEM: %s", err)
 
- 			}
 
- 			qrBytes = append(qrBytes, b...)
 
- 		}
 
- 		if rawCert == nil || len(rawCert) == 0 || strings.TrimSpace(string(rawCert)) == "" {
 
- 			break
 
- 		}
 
- 		part++
 
- 	}
 
- 	if *pf.outQRPath != "" {
 
- 		b, err := qrcode.Encode(string(qrBytes), qrcode.Medium, -5)
 
- 		if err != nil {
 
- 			return fmt.Errorf("error while generating qr code: %s", err)
 
- 		}
 
- 		err = os.WriteFile(*pf.outQRPath, b, 0600)
 
- 		if err != nil {
 
- 			return fmt.Errorf("error while writing out-qr: %s", err)
 
- 		}
 
- 	}
 
- 	return nil
 
- }
 
- func printSummary() string {
 
- 	return "print <flags>: prints details about a certificate"
 
- }
 
- func printHelp(out io.Writer) {
 
- 	pf := newPrintFlags()
 
- 	out.Write([]byte("Usage of " + os.Args[0] + " " + printSummary() + "\n"))
 
- 	pf.set.SetOutput(out)
 
- 	pf.set.PrintDefaults()
 
- }
 
 
  |