golang实现PowerDNS API绑定与操作的插件库go-powerdns的使用

Golang实现PowerDNS API绑定与操作的插件库go-powerdns的使用

介绍

这是一个为PowerDNS权威服务器提供API绑定的社区项目。它不隶属于官方PowerDNS产品。

Test coverage

功能

可以方便地管理:

  • 区域(zones)
  • 资源记录(resource records)
  • 加密密钥(cryptokeys) (DNSSEC)
  • TSIG密钥
  • 服务器(servers)
  • 统计信息(statistics)
  • 元数据(metadata)
  • 配置(configuration)

它完全使用Go标准库,可以轻松定制。

安装

go get -u github.com/joeig/go-powerdns/v3
import "github.com/joeig/go-powerdns/v3"

使用示例

初始化连接

import (
	"github.com/joeig/go-powerdns/v3"
	"context"
)

// 假设:
// * PowerDNS权威服务器监听在`http://localhost:80`
// * 虚拟主机是`localhost`
// * API密钥是`apipw`
pdns := powerdns.New("http://localhost:80", "localhost", powerdns.WithAPIKey("apipw"))

// 所有API交互都支持Go上下文,允许传递取消信号和截止时间
// 如果不需要上下文,可以使用context.Background()
ctx := context.Background()

区域操作

zones, err := pdns.Zones.List(ctx)
zone, err := pdns.Zones.Get(ctx, "example.com")
export, err := pdns.Zones.Export(ctx, "example.com")
zone, err := pdns.Zones.AddNative(ctx, "example.com", true, "", false, "foo", "foo", true, []string{"ns.foo.tld."})
err := pdns.Zones.Change(ctx, "example.com", &zone)
err := pdns.Zones.Delete(ctx, "example.com")

资源记录操作

err := pdns.Records.Add(ctx, "example.com", "www.example.com", powerdns.RRTypeAAAA, 60, []string{"::1"})
err := pdns.Records.Change(ctx, "example.com", "www.example.com", powerdns.RRTypeAAAA, 3600, []string{"::1"})
err := pdns.Records.Delete(ctx, "example.com", "www.example.com", powerdns.RRTypeA)
records, err := pdns.Records.Get(ctx, "example.com", "www.example.com", powerdns.RRTypePtr(powerdns.RRTypeA))

服务器信息和统计

statistics, err := pdns.Statistics.List(ctx)
servers, err := pdns.Servers.List(ctx)
server, err := pdns.Servers.Get(ctx, "localhost")

DNSSEC加密材料处理

cryptokeys, err := pdns.Cryptokeys.List(ctx)
cryptokey, err := pdns.Cryptokeys.Get(ctx, "example.com", "1337")
err := pdns.Cryptokeys.Delete(ctx, "example.com", "1337")

TSIG密钥操作

tsigkey, err := pdns.TSIGKeys.Create(ctx, "examplekey", "hmac-sha256", "")
tsigkey, err := pdns.TSIGKeys.Change(ctx, "examplekey.", powerdns.TSIGKey{Key: powerdns.String("newkey")})
tsigkeys, err := pdns.TSIGKeys.List(ctx)
tsigkey, err := pdns.TSIGKeys.Get(ctx, "examplekey.")
err := pdns.TSIGKeys.Delete(ctx, "examplekey.")

要求

测试过的PowerDNS版本

支持的PowerDNS权威服务器版本(“API v1”):

  • 4.7
  • 4.8
  • 4.9

测试过的Go版本

根据Go的版本支持策略,此模块已测试以下Go版本:

  • 1.23
  • 1.24

贡献

这个API客户端尚未完成,欢迎贡献。OpenAPI规范是一个很好的参考。

你可以使用Docker Compose启动一个PowerDNS权威服务器,包括通用SQLite3后端、DNSSEC支持和一些可选固定装置:

docker-compose -f docker-compose-v4.9.yml up
docker-compose -f docker-compose-v4.9.yml exec powerdns sh init_docker_fixtures.sh

也可以针对此服务器或任何其他运行在http://localhost:8080上的PowerDNS实例进行测试:

make test-without-mocks

模拟测试假设有一个名为localhost的vHost/服务器ID和API密钥apipw


更多关于golang实现PowerDNS API绑定与操作的插件库go-powerdns的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现PowerDNS API绑定与操作的插件库go-powerdns的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-powerdns操作PowerDNS API

go-powerdns是一个用于与PowerDNS API交互的Golang库,它简化了与PowerDNS服务器的通信过程。下面我将介绍如何使用这个库来绑定和操作PowerDNS API。

安装

首先安装go-powerdns库:

go get github.com/joeig/go-powerdns/v3

基本使用

1. 初始化客户端

package main

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"time"

	"github.com/joeig/go-powerdns/v3"
)

func main() {
	// 创建PowerDNS客户端
	pdns := powerdns.NewClient(
		"http://localhost:8080",  // PowerDNS API地址
		"localhost",              // 服务器ID
		"very-secret-key",        // API密钥
		&http.Client{Timeout: 5 * time.Second},
		powerdns.V3,              // API版本
	)

2. 查询区域(zone)

	// 获取所有区域
	zones, err := pdns.Zones.List(context.Background())
	if err != nil {
		log.Fatalf("获取区域列表失败: %v", err)
	}
	fmt.Printf("区域列表: %+v\n", zones)

	// 获取特定区域
	zone, err := pdns.Zones.Get(context.Background(), "example.com.")
	if err != nil {
		log.Fatalf("获取区域信息失败: %v", err)
	}
	fmt.Printf("区域详情: %+v\n", zone)

3. 创建区域

	// 创建新区域
	newZone := powerdns.Zone{
		Name:        "example.com.",
		Kind:        "Native",
		Nameservers: []string{"ns1.example.com.", "ns2.example.com."},
	}

	createdZone, err := pdns.Zones.Add(context.Background(), newZone)
	if err != nil {
		log.Fatalf("创建区域失败: %v", err)
	}
	fmt.Printf("创建的区域: %+v\n", createdZone)

4. 添加记录

	// 添加A记录
	rrset := powerdns.ResourceRecordSet{
		Name:    "www.example.com.",
		Type:    "A",
		TTL:     3600,
		Records: []powerdns.Record{{Content: "192.0.2.1", Disabled: false}},
	}

	err = pdns.Zones.AddRecordSet(context.Background(), "example.com.", rrset)
	if err != nil {
		log.Fatalf("添加记录失败: %v", err)
	}
	fmt.Println("A记录添加成功")

5. 修改记录

	// 修改现有记录
	updatedRRSet := powerdns.ResourceRecordSet{
		Name:    "www.example.com.",
		Type:    "A",
		TTL:     3600,
		Records: []powerdns.Record{{Content: "192.0.2.2", Disabled: false}},
	}

	err = pdns.Zones.ChangeRecordSet(context.Background(), "example.com.", "www.example.com.", "A", updatedRRSet)
	if err != nil {
		log.Fatalf("修改记录失败: %v", err)
	}
	fmt.Println("记录修改成功")

6. 删除记录

	// 删除记录
	err = pdns.Zones.DeleteRecordSet(context.Background(), "example.com.", "www.example.com.", "A")
	if err != nil {
		log.Fatalf("删除记录失败: %v", err)
	}
	fmt.Println("记录删除成功")

7. 删除区域

	// 删除区域
	err = pdns.Zones.Delete(context.Background(), "example.com.")
	if err != nil {
		log.Fatalf("删除区域失败: %v", err)
	}
	fmt.Println("区域删除成功")

高级功能

批量操作

// 批量添加记录
func batchAddRecords(pdns *powerdns.Client, zone string, records []powerdns.ResourceRecordSet) error {
	for _, rrset := range records {
		if err := pdns.Zones.AddRecordSet(context.Background(), zone, rrset); err != nil {
			return fmt.Errorf("添加记录 %s 失败: %v", rrset.Name, err)
		}
	}
	return nil
}

错误处理

// 更健壮的错误处理
func getZoneWithRetry(pdns *powerdns.Client, zone string, retries int) (*powerdns.Zone, error) {
	var lastErr error
	for i := 0; i < retries; i++ {
		z, err := pdns.Zones.Get(context.Background(), zone)
		if err == nil {
			return z, nil
		}
		lastErr = err
		time.Sleep(time.Second * time.Duration(i+1))
	}
	return nil, fmt.Errorf("重试 %d 次后失败: %v", retries, lastErr)
}

注意事项

  1. 确保PowerDNS服务器已启用API并配置了正确的API密钥
  2. 区域名称需要以点(.)结尾,如"example.com."
  3. 操作前最好检查区域是否存在
  4. 对于生产环境,建议添加更完善的错误处理和重试机制
  5. 考虑使用context.WithTimeout设置操作超时

go-powerdns库提供了完整的PowerDNS API功能,包括区域管理、记录管理、元数据操作等。以上示例展示了基本用法,更多高级功能可以参考官方文档。

希望这些示例能帮助你开始使用go-powerdns库来管理PowerDNS服务器!

回到顶部