Files
cftunnel/internal/cfapi/tunnel.go
T
admin b4da59cb07 feat: cftunnel MVP — Cloudflare Tunnel 一键管理工具
- cfapi: 基于 cloudflare-go/v6 SDK 封装隧道 CRUD、DNS CNAME、Zone 查询
- config: YAML 配置读写 (~/.cftunnel/config.yml)
- daemon: cloudflared 自动下载 + 进程管理
- service: macOS launchd 系统服务注册
- CLI: init/add/remove/list/up/down/status/install/uninstall/logs
2026-02-22 21:05:59 +08:00

61 lines
1.8 KiB
Go

package cfapi
import (
"context"
"fmt"
cf "github.com/cloudflare/cloudflare-go/v6"
"github.com/cloudflare/cloudflare-go/v6/shared"
"github.com/cloudflare/cloudflare-go/v6/zero_trust"
)
// CreateTunnel 创建 Cloudflare Tunnel
func (c *Client) CreateTunnel(ctx context.Context, name string) (*shared.CloudflareTunnel, error) {
tunnel, err := c.api.ZeroTrust.Tunnels.Cloudflared.New(ctx, zero_trust.TunnelCloudflaredNewParams{
AccountID: cf.F(c.accountID),
Name: cf.F(name),
ConfigSrc: cf.F(zero_trust.TunnelCloudflaredNewParamsConfigSrcCloudflare),
})
if err != nil {
return nil, fmt.Errorf("创建隧道失败: %w", err)
}
return tunnel, nil
}
// DeleteTunnel 删除隧道
func (c *Client) DeleteTunnel(ctx context.Context, tunnelID string) error {
_, err := c.api.ZeroTrust.Tunnels.Cloudflared.Delete(ctx, tunnelID, zero_trust.TunnelCloudflaredDeleteParams{
AccountID: cf.F(c.accountID),
})
if err != nil {
return fmt.Errorf("删除隧道失败: %w", err)
}
return nil
}
// ListTunnels 列出所有隧道
func (c *Client) ListTunnels(ctx context.Context) ([]shared.CloudflareTunnel, error) {
pager := c.api.ZeroTrust.Tunnels.Cloudflared.ListAutoPaging(ctx, zero_trust.TunnelCloudflaredListParams{
AccountID: cf.F(c.accountID),
})
var result []shared.CloudflareTunnel
for pager.Next() {
result = append(result, pager.Current())
}
if err := pager.Err(); err != nil {
return nil, fmt.Errorf("列出隧道失败: %w", err)
}
return result, nil
}
// GetTunnelToken 获取隧道运行 Token
func (c *Client) GetTunnelToken(ctx context.Context, tunnelID string) (string, error) {
token, err := c.api.ZeroTrust.Tunnels.Cloudflared.Token.Get(ctx, tunnelID, zero_trust.TunnelCloudflaredTokenGetParams{
AccountID: cf.F(c.accountID),
})
if err != nil {
return "", fmt.Errorf("获取隧道 Token 失败: %w", err)
}
return *token, nil
}