initial commit: add Mail-in-a-Box Go client library and CLI with DNS record management
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user