feat: add CLI to use it every day

This commit is contained in:
Peter 2023-04-27 15:17:24 +02:00
parent 81e23c0436
commit 8ef26fd974
No known key found for this signature in database
2 changed files with 94 additions and 0 deletions

68
cmd/pwgen/main.go Normal file
View file

@ -0,0 +1,68 @@
package main
import (
"code.icb4dc0.de/prskr/go-pwgen"
"flag"
"fmt"
"log"
"os"
"strings"
)
// although there might be terminals where it's less, let's be pessimistic
const tabWidth = 8
var (
length uint
count int
letters uint
lowercase uint
uppercase uint
digits uint
specials uint
specialsAlphabet string
)
func main() {
flags := flag.NewFlagSet("pwgen", flag.ExitOnError)
flags.IntVar(&count, "count", 20, "Number of passwords to generate")
flags.UintVar(&length, "length", 20, "Length of each password to generate")
flags.UintVar(&letters, "letters", 0, "Number of letters to include at least")
flags.UintVar(&lowercase, "lowercase", 3, "Number of lowercase characters to include at least")
flags.UintVar(&uppercase, "uppercase", 3, "Number of uppercase characters to include at least")
flags.UintVar(&digits, "digits", 3, "Number of digits to include at least")
flags.UintVar(&specials, "specials", 0, "Number of special characters to include at least")
flags.StringVar(&specialsAlphabet, "specials-alphabet", pwgen.DefaultSpecialsAlphabet, "Special characters to include as special characters")
if err := flags.Parse(os.Args[1:]); err != nil {
log.Fatalf("Failed to parse arguments: %v", err)
}
terminalWidth := getWidth()
passwordsPerRow := int(terminalWidth / (length + tabWidth))
builder := strings.Builder{}
for i := 0; i < count; i += passwordsPerRow {
for j := 0; j < passwordsPerRow && i+j < count; j++ {
pw, err := pwgen.Generate(
pwgen.WithLength(length),
pwgen.WithLetters(letters),
pwgen.WithLowercase(lowercase),
pwgen.WithUppercase(uppercase),
pwgen.WithDigits(digits),
pwgen.WithSpecials(specials),
pwgen.WithSpecialsAlphabet(specialsAlphabet),
)
if err != nil {
log.Fatalf("Error occurred generating password: %v", err)
}
builder.WriteString(pw)
builder.WriteRune('\t')
}
fmt.Println(strings.TrimSuffix(builder.String(), "\t"))
builder.Reset()
}
}

26
cmd/pwgen/terminal.go Normal file
View file

@ -0,0 +1,26 @@
package main
import (
"syscall"
"unsafe"
)
type winsize struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}
func getWidth() uint {
ws := &winsize{}
retCode, _, errno := syscall.Syscall(syscall.SYS_IOCTL,
uintptr(syscall.Stdin),
uintptr(syscall.TIOCGWINSZ),
uintptr(unsafe.Pointer(ws)))
if int(retCode) == -1 {
panic(errno)
}
return uint(ws.Col)
}