mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-11-09 16:00:36 +08:00
101 lines
3 KiB
Go
101 lines
3 KiB
Go
package cloudflare
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/goccy/go-json"
|
|
)
|
|
|
|
// ErrMissingASN is for when ASN is required but not set.
|
|
var ErrMissingASN = errors.New("required asn missing")
|
|
|
|
// ASNInfo represents ASN information.
|
|
type ASNInfo struct {
|
|
ASN int `json:"asn"`
|
|
Description string `json:"description"`
|
|
Country string `json:"country"`
|
|
Type string `json:"type"`
|
|
DomainCount int `json:"domain_count"`
|
|
TopDomains []string `json:"top_domains"`
|
|
}
|
|
|
|
// IntelligenceASNOverviewParameters represents parameters for an ASN request.
|
|
type IntelligenceASNOverviewParameters struct {
|
|
AccountID string
|
|
ASN int
|
|
}
|
|
|
|
// IntelligenceASNResponse represents an API response for ASN info.
|
|
type IntelligenceASNResponse struct {
|
|
Response
|
|
Result []ASNInfo `json:"result,omitempty"`
|
|
}
|
|
|
|
// IntelligenceASNSubnetsParameters represents parameters for an ASN subnet request.
|
|
type IntelligenceASNSubnetsParameters struct {
|
|
AccountID string
|
|
ASN int
|
|
}
|
|
|
|
// IntelligenceASNSubnetResponse represents an ASN subnet API response.
|
|
type IntelligenceASNSubnetResponse struct {
|
|
ASN int `json:"asn,omitempty"`
|
|
IPCountTotal int `json:"ip_count_total,omitempty"`
|
|
Subnets []string `json:"subnets,omitempty"`
|
|
Count int `json:"count,omitempty"`
|
|
Page int `json:"page,omitempty"`
|
|
PerPage int `json:"per_page,omitempty"`
|
|
}
|
|
|
|
// IntelligenceASNOverview get overview for an ASN number
|
|
//
|
|
// API Reference: https://api.cloudflare.com/#asn-intelligence-get-asn-overview
|
|
func (api *API) IntelligenceASNOverview(ctx context.Context, params IntelligenceASNOverviewParameters) ([]ASNInfo, error) {
|
|
if params.AccountID == "" {
|
|
return []ASNInfo{}, ErrMissingAccountID
|
|
}
|
|
|
|
if params.ASN == 0 {
|
|
return []ASNInfo{}, ErrMissingASN
|
|
}
|
|
|
|
uri := fmt.Sprintf("/accounts/%s/intel/asn/%d", params.AccountID, params.ASN)
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return []ASNInfo{}, err
|
|
}
|
|
|
|
var asnInfoResponse IntelligenceASNResponse
|
|
if err := json.Unmarshal(res, &asnInfoResponse); err != nil {
|
|
return []ASNInfo{}, err
|
|
}
|
|
return asnInfoResponse.Result, nil
|
|
}
|
|
|
|
// IntelligenceASNSubnets gets all subnets of an ASN
|
|
//
|
|
// API Reference: https://api.cloudflare.com/#asn-intelligence-get-asn-subnets
|
|
func (api *API) IntelligenceASNSubnets(ctx context.Context, params IntelligenceASNSubnetsParameters) (IntelligenceASNSubnetResponse, error) {
|
|
if params.AccountID == "" {
|
|
return IntelligenceASNSubnetResponse{}, ErrMissingAccountID
|
|
}
|
|
|
|
if params.ASN == 0 {
|
|
return IntelligenceASNSubnetResponse{}, ErrMissingASN
|
|
}
|
|
|
|
uri := fmt.Sprintf("/accounts/%s/intel/asn/%d/subnets", params.AccountID, params.ASN)
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return IntelligenceASNSubnetResponse{}, err
|
|
}
|
|
|
|
var intelligenceASNSubnetResponse IntelligenceASNSubnetResponse
|
|
if err := json.Unmarshal(res, &intelligenceASNSubnetResponse); err != nil {
|
|
return IntelligenceASNSubnetResponse{}, err
|
|
}
|
|
return intelligenceASNSubnetResponse, nil
|
|
}
|