package cloudflare import ( "encoding/json" "strconv" "time" "github.com/pkg/errors" ) // LogpushJob describes a Logpush job. type LogpushJob struct { ID int `json:"id,omitempty"` Enabled bool `json:"enabled"` Name string `json:"name"` LogpullOptions string `json:"logpull_options"` DestinationConf string `json:"destination_conf"` OwnershipChallenge string `json:"ownership_challenge,omitempty"` LastComplete *time.Time `json:"last_complete,omitempty"` LastError *time.Time `json:"last_error,omitempty"` ErrorMessage string `json:"error_message,omitempty"` } // LogpushJobsResponse is the API response, containing an array of Logpush Jobs. type LogpushJobsResponse struct { Response Result []LogpushJob `json:"result"` } // LogpushJobDetailsResponse is the API response, containing a single Logpush Job. type LogpushJobDetailsResponse struct { Response Result LogpushJob `json:"result"` } // LogpushGetOwnershipChallenge describes a ownership validation. type LogpushGetOwnershipChallenge struct { Filename string `json:"filename"` Valid bool `json:"valid"` Message string `json:"message"` } // LogpushGetOwnershipChallengeResponse is the API response, containing a ownership challenge. type LogpushGetOwnershipChallengeResponse struct { Response Result LogpushGetOwnershipChallenge `json:"result"` } // LogpushGetOwnershipChallengeRequest is the API request for get ownership challenge. type LogpushGetOwnershipChallengeRequest struct { DestinationConf string `json:"destination_conf"` } // LogpushOwnershipChallangeValidationResponse is the API response, // containing a ownership challenge validation result. type LogpushOwnershipChallangeValidationResponse struct { Response Result struct { Valid bool `json:"valid"` } } // LogpushValidateOwnershipChallengeRequest is the API request for validate ownership challenge. type LogpushValidateOwnershipChallengeRequest struct { DestinationConf string `json:"destination_conf"` OwnershipChallenge string `json:"ownership_challenge"` } // LogpushDestinationExistsResponse is the API response, // containing a destination exists check result. type LogpushDestinationExistsResponse struct { Response Result struct { Exists bool `json:"exists"` } } // LogpushDestinationExistsRequest is the API request for check destination exists. type LogpushDestinationExistsRequest struct { DestinationConf string `json:"destination_conf"` } // CreateLogpushJob creates a new LogpushJob for a zone. // // API reference: https://api.cloudflare.com/#logpush-jobs-create-logpush-job func (api *API) CreateLogpushJob(zoneID string, job LogpushJob) (*LogpushJob, error) { uri := "/zones/" + zoneID + "/logpush/jobs" res, err := api.makeRequest("POST", uri, job) if err != nil { return nil, errors.Wrap(err, errMakeRequestError) } var r LogpushJobDetailsResponse err = json.Unmarshal(res, &r) if err != nil { return nil, errors.Wrap(err, errUnmarshalError) } return &r.Result, nil } // LogpushJobs returns all Logpush Jobs for a zone. // // API reference: https://api.cloudflare.com/#logpush-jobs-list-logpush-jobs func (api *API) LogpushJobs(zoneID string) ([]LogpushJob, error) { uri := "/zones/" + zoneID + "/logpush/jobs" res, err := api.makeRequest("GET", uri, nil) if err != nil { return []LogpushJob{}, errors.Wrap(err, errMakeRequestError) } var r LogpushJobsResponse err = json.Unmarshal(res, &r) if err != nil { return []LogpushJob{}, errors.Wrap(err, errUnmarshalError) } return r.Result, nil } // LogpushJob fetches detail about one Logpush Job for a zone. // // API reference: https://api.cloudflare.com/#logpush-jobs-logpush-job-details func (api *API) LogpushJob(zoneID string, jobID int) (LogpushJob, error) { uri := "/zones/" + zoneID + "/logpush/jobs/" + strconv.Itoa(jobID) res, err := api.makeRequest("GET", uri, nil) if err != nil { return LogpushJob{}, errors.Wrap(err, errMakeRequestError) } var r LogpushJobDetailsResponse err = json.Unmarshal(res, &r) if err != nil { return LogpushJob{}, errors.Wrap(err, errUnmarshalError) } return r.Result, nil } // UpdateLogpushJob lets you update a Logpush Job. // // API reference: https://api.cloudflare.com/#logpush-jobs-update-logpush-job func (api *API) UpdateLogpushJob(zoneID string, jobID int, job LogpushJob) error { uri := "/zones/" + zoneID + "/logpush/jobs/" + strconv.Itoa(jobID) res, err := api.makeRequest("PUT", uri, job) if err != nil { return errors.Wrap(err, errMakeRequestError) } var r LogpushJobDetailsResponse err = json.Unmarshal(res, &r) if err != nil { return errors.Wrap(err, errUnmarshalError) } return nil } // DeleteLogpushJob deletes a Logpush Job for a zone. // // API reference: https://api.cloudflare.com/#logpush-jobs-delete-logpush-job func (api *API) DeleteLogpushJob(zoneID string, jobID int) error { uri := "/zones/" + zoneID + "/logpush/jobs/" + strconv.Itoa(jobID) res, err := api.makeRequest("DELETE", uri, nil) if err != nil { return errors.Wrap(err, errMakeRequestError) } var r LogpushJobDetailsResponse err = json.Unmarshal(res, &r) if err != nil { return errors.Wrap(err, errUnmarshalError) } return nil } // GetLogpushOwnershipChallenge returns ownership challenge. // // API reference: https://api.cloudflare.com/#logpush-jobs-get-ownership-challenge func (api *API) GetLogpushOwnershipChallenge(zoneID, destinationConf string) (*LogpushGetOwnershipChallenge, error) { uri := "/zones/" + zoneID + "/logpush/ownership" res, err := api.makeRequest("POST", uri, LogpushGetOwnershipChallengeRequest{ DestinationConf: destinationConf, }) if err != nil { return nil, errors.Wrap(err, errMakeRequestError) } var r LogpushGetOwnershipChallengeResponse err = json.Unmarshal(res, &r) if err != nil { return nil, errors.Wrap(err, errUnmarshalError) } return &r.Result, nil } // ValidateLogpushOwnershipChallenge returns ownership challenge validation result. // // API reference: https://api.cloudflare.com/#logpush-jobs-validate-ownership-challenge func (api *API) ValidateLogpushOwnershipChallenge(zoneID, destinationConf, ownershipChallenge string) (bool, error) { uri := "/zones/" + zoneID + "/logpush/ownership/validate" res, err := api.makeRequest("POST", uri, LogpushValidateOwnershipChallengeRequest{ DestinationConf: destinationConf, OwnershipChallenge: ownershipChallenge, }) if err != nil { return false, errors.Wrap(err, errMakeRequestError) } var r LogpushGetOwnershipChallengeResponse err = json.Unmarshal(res, &r) if err != nil { return false, errors.Wrap(err, errUnmarshalError) } return r.Result.Valid, nil } // CheckLogpushDestinationExists returns destination exists check result. // // API reference: https://api.cloudflare.com/#logpush-jobs-check-destination-exists func (api *API) CheckLogpushDestinationExists(zoneID, destinationConf string) (bool, error) { uri := "/zones/" + zoneID + "/logpush/validate/destination/exists" res, err := api.makeRequest("POST", uri, LogpushDestinationExistsRequest{ DestinationConf: destinationConf, }) if err != nil { return false, errors.Wrap(err, errMakeRequestError) } var r LogpushDestinationExistsResponse err = json.Unmarshal(res, &r) if err != nil { return false, errors.Wrap(err, errUnmarshalError) } return r.Result.Exists, nil }