goutils/cmd/pemit/main.go

92 lines
1.7 KiB
Go

package main
import (
"bytes"
"encoding/pem"
"flag"
"fmt"
"io"
"os"
"git.wntrmute.dev/kyle/goutils/assert"
"git.wntrmute.dev/kyle/goutils/die"
"git.wntrmute.dev/kyle/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)
}