Add pemit to convert data to PEM.
This commit is contained in:
		
							parent
							
								
									4b9da3632a
								
							
						
					
					
						commit
						25bafdac15
					
				| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					pemit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is a utility to pem-encode data. It requires a PEM type to be
 | 
				
			||||||
 | 
					specified via the `-t` flag. Any number of files may be specified on
 | 
				
			||||||
 | 
					the command line; alternatively, if no arguments are provided or the
 | 
				
			||||||
 | 
					only argument is "-", pemit will read from standard input.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example of standard input:
 | 
				
			||||||
 | 
						$ dd if=/dev/zero bs=32 count=1 | pemit -t "NULL DATA" 
 | 
				
			||||||
 | 
						1+0 records in
 | 
				
			||||||
 | 
						1+0 records out
 | 
				
			||||||
 | 
						32 bytes (32 B) copied, 8.8908e-05 s, 360 kB/s
 | 
				
			||||||
 | 
						-----BEGIN NULL DATA-----
 | 
				
			||||||
 | 
						AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
 | 
				
			||||||
 | 
						-----END NULL DATA-----
 | 
				
			||||||
 | 
						$ dd if=/dev/zero bs=32 count=1 | pemit -t "NULL DATA" -
 | 
				
			||||||
 | 
						1+0 records in
 | 
				
			||||||
 | 
						1+0 records out
 | 
				
			||||||
 | 
						32 bytes (32 B) copied, 3.1041e-05 s, 1.0 MB/s
 | 
				
			||||||
 | 
						-----BEGIN NULL DATA-----
 | 
				
			||||||
 | 
						AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
 | 
				
			||||||
 | 
						-----END NULL DATA-----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Using files:
 | 
				
			||||||
 | 
					        $ dd if=/dev/zero of=fileA bs=32 count=1
 | 
				
			||||||
 | 
						1+0 records in
 | 
				
			||||||
 | 
						1+0 records out
 | 
				
			||||||
 | 
						32 bytes (32 B) copied, 9.0908e-05 s, 352 kB/s
 | 
				
			||||||
 | 
					        $ dd if=/dev/zero of=fileB bs=32 count=1
 | 
				
			||||||
 | 
						1+0 records in
 | 
				
			||||||
 | 
						1+0 records out
 | 
				
			||||||
 | 
						32 bytes (32 B) copied, 9.0908e-05 s, 352 kB/s
 | 
				
			||||||
 | 
						$ pemit -t NULL\ DATA fileA      
 | 
				
			||||||
 | 
						-----BEGIN NULL DATA-----
 | 
				
			||||||
 | 
						AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
 | 
				
			||||||
 | 
						-----END NULL DATA-----
 | 
				
			||||||
 | 
						$ pemit -t NULL\ DATA fileA fileB
 | 
				
			||||||
 | 
						-----BEGIN NULL DATA-----
 | 
				
			||||||
 | 
						AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
				
			||||||
 | 
						AAAAAAAAAAAAAAAAAAAAAA==
 | 
				
			||||||
 | 
						-----END NULL DATA-----
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,91 @@
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"encoding/pem"
 | 
				
			||||||
 | 
						"flag"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/kisom/goutils/assert"
 | 
				
			||||||
 | 
						"github.com/kisom/goutils/die"
 | 
				
			||||||
 | 
						"github.com/kisom/goutils/lib"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func usage(w io.Writer) {
 | 
				
			||||||
 | 
						fmt.Fprintf(w, `Usage: %s [-h] -t type sources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Flags:
 | 
				
			||||||
 | 
							-h	Display this help message.
 | 
				
			||||||
 | 
							-t type	Set the PEM type. This is required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Sources may be a list of files or a single '-'. A single dash
 | 
				
			||||||
 | 
						(or no arguments) will cause %s to use standard input.
 | 
				
			||||||
 | 
					`, lib.ProgName(), lib.ProgName())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						flag.Usage = func() { usage(os.Stderr) }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func copyFile(path string, buf *bytes.Buffer) error {
 | 
				
			||||||
 | 
						assert.Bool(buf != nil, "buffer should not be nil")
 | 
				
			||||||
 | 
						file, err := os.Open(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = io.Copy(buf, file)
 | 
				
			||||||
 | 
						file.Close()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						var pemType string
 | 
				
			||||||
 | 
						flag.StringVar(&pemType, "t", "", "Specify the `PEM type`.")
 | 
				
			||||||
 | 
						flag.Parse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						die.When(len(pemType) == 0, "no PEM type specified.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf := &bytes.Buffer{}
 | 
				
			||||||
 | 
						argc := flag.NArg()
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case argc == 0:
 | 
				
			||||||
 | 
							_, err = io.Copy(buf, os.Stdin)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								lib.Err(lib.ExitFailure, err, "failed to read input")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case argc == 1:
 | 
				
			||||||
 | 
							path := flag.Arg(0)
 | 
				
			||||||
 | 
							if path == "-" {
 | 
				
			||||||
 | 
								_, err = io.Copy(buf, os.Stdin)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								err = copyFile(path, buf)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								lib.Err(lib.ExitFailure, err, "failed to read input")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case argc > 1:
 | 
				
			||||||
 | 
							for i := 0; i < argc; i++ {
 | 
				
			||||||
 | 
								path := flag.Arg(i)
 | 
				
			||||||
 | 
								err = copyFile(path, buf)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									lib.Err(lib.ExitFailure, err, "reading file failed")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							panic("shouldn't be here")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p := &pem.Block{
 | 
				
			||||||
 | 
							Type:  pemType,
 | 
				
			||||||
 | 
							Bytes: buf.Bytes(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						encoded := string(pem.EncodeToMemory(p))
 | 
				
			||||||
 | 
						fmt.Print(encoded)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue