Files
mailinabox-go/cmd/miab/main.go
T

144 lines
3.4 KiB
Go

package main
import (
"flag"
"fmt"
"os"
miab "gitea.koszewscy.waw.pl/koszewscy/mailinabox-go"
)
func usage() {
fmt.Fprintf(os.Stderr, `Usage: miab <command> [options]
Commands:
list List custom DNS records
set Set (replace) a DNS record
delete Delete a DNS record
add Add a DNS record
Credentials: any empty parameter falls back to environment variables.
MIAB_HOST / MAILINABOX_BASE_URL Mail-in-a-Box hostname (MIAB_HOST takes precedence;
hostname is parsed from MAILINABOX_BASE_URL if set)
MIAB_USERNAME / MAILINABOX_EMAIL Admin email address
MIAB_PASSWORD / MAILINABOX_PASSWORD Admin password
`)
}
func mustClient() *miab.Client {
c, err := miab.NewClient("", "", "")
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return c
}
func main() {
flag.Usage = usage
flag.Parse()
if flag.NArg() < 1 {
usage()
os.Exit(1)
}
cmd := flag.Arg(0)
args := flag.Args()[1:]
switch cmd {
case "list":
runList(args)
case "set":
runSet(args)
case "delete":
runDelete(args)
case "add":
runAdd(args)
default:
fmt.Fprintf(os.Stderr, "miab: unknown command %q\n", cmd)
usage()
os.Exit(1)
}
}
func runList(args []string) {
fs := flag.NewFlagSet("list", flag.ExitOnError)
recordType := fs.String("type", "", "Filter by record type (e.g. A, TXT, MX)")
fs.Parse(args)
client := mustClient()
records, err := client.ListRecords(*recordType)
if err != nil {
fmt.Fprintf(os.Stderr, "miab: %v\n", err)
os.Exit(1)
}
if *recordType != "" {
fmt.Printf("Custom %s records:\n", *recordType)
} else {
fmt.Println("Custom DNS records:")
}
for _, r := range records {
fmt.Printf(" - %s (%s): %s\n", r.Name, r.Type, r.Value)
}
}
func runSet(args []string) {
fs := flag.NewFlagSet("set", flag.ExitOnError)
name := fs.String("name", "", "Domain name")
recordType := fs.String("type", "", "Record type (e.g. A, TXT)")
value := fs.String("value", "", "Record value")
fs.Parse(args)
if *name == "" || *recordType == "" || *value == "" {
fmt.Fprintln(os.Stderr, "miab set: --name, --type and --value are required")
os.Exit(1)
}
client := mustClient()
if err := client.SetRecord(*name, *recordType, *value); err != nil {
fmt.Fprintf(os.Stderr, "miab: %v\n", err)
os.Exit(1)
}
}
func runDelete(args []string) {
fs := flag.NewFlagSet("delete", flag.ExitOnError)
name := fs.String("name", "", "Domain name")
recordType := fs.String("type", "", "Record type (e.g. A, TXT)")
value := fs.String("value", "", "Record value (optional)")
fs.Parse(args)
if *name == "" || *recordType == "" {
fmt.Fprintln(os.Stderr, "miab delete: --name and --type are required")
os.Exit(1)
}
client := mustClient()
if err := client.DeleteRecord(*name, *recordType, *value); err != nil {
fmt.Fprintf(os.Stderr, "miab: %v\n", err)
os.Exit(1)
}
}
func runAdd(args []string) {
fs := flag.NewFlagSet("add", flag.ExitOnError)
name := fs.String("name", "", "Domain name")
recordType := fs.String("type", "", "Record type (e.g. A, TXT)")
value := fs.String("value", "", "Record value")
fs.Parse(args)
if *name == "" || *recordType == "" || *value == "" {
fmt.Fprintln(os.Stderr, "miab add: --name, --type and --value are required")
os.Exit(1)
}
client := mustClient()
if err := client.AddRecord(*name, *recordType, *value); err != nil {
fmt.Fprintf(os.Stderr, "miab: %v\n", err)
os.Exit(1)
}
}