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

155 lines
3.6 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 are read from environment variables:
MIAB_HOST Mail-in-a-Box hostname (e.g. box.example.com)
MIAB_USERNAME Admin email address
MIAB_PASSWORD Admin password
`)
}
func mustClient() *miab.Client {
host := os.Getenv("MIAB_HOST")
username := os.Getenv("MIAB_USERNAME")
password := os.Getenv("MIAB_PASSWORD")
var missing []string
if host == "" {
missing = append(missing, "MIAB_HOST")
}
if username == "" {
missing = append(missing, "MIAB_USERNAME")
}
if password == "" {
missing = append(missing, "MIAB_PASSWORD")
}
if len(missing) > 0 {
fmt.Fprintf(os.Stderr, "miab: missing required environment variables: %v\n", missing)
os.Exit(1)
}
return miab.NewClient(host, username, password)
}
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)
}
}