package main import ( "flag" "fmt" "os" miab "gitea.koszewscy.waw.pl/koszewscy/mailinabox-go" ) func usage() { fmt.Fprintf(os.Stderr, `Usage: miab [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) } }