155 lines
3.6 KiB
Go
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)
|
|
}
|
|
}
|