cloudflare_client_rb 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/cloudflare_client.rb +211 -0
- data/lib/cloudflare_client/certificate.rb +40 -0
- data/lib/cloudflare_client/organization.rb +26 -0
- data/lib/cloudflare_client/organization/access_rule.rb +76 -0
- data/lib/cloudflare_client/organization/invite.rb +53 -0
- data/lib/cloudflare_client/organization/member.rb +37 -0
- data/lib/cloudflare_client/organization/railgun.rb +79 -0
- data/lib/cloudflare_client/organization/role.rb +19 -0
- data/lib/cloudflare_client/railgun.rb +63 -0
- data/lib/cloudflare_client/version.rb +3 -0
- data/lib/cloudflare_client/virtual_dns_cluster.rb +133 -0
- data/lib/cloudflare_client/virtual_dns_cluster/analytic.rb +38 -0
- data/lib/cloudflare_client/zone.rb +129 -0
- data/lib/cloudflare_client/zone/analytics.rb +56 -0
- data/lib/cloudflare_client/zone/base.rb +9 -0
- data/lib/cloudflare_client/zone/custom_hostname.rb +86 -0
- data/lib/cloudflare_client/zone/custom_page.rb +28 -0
- data/lib/cloudflare_client/zone/custom_ssl.rb +62 -0
- data/lib/cloudflare_client/zone/dns.rb +66 -0
- data/lib/cloudflare_client/zone/firewall.rb +3 -0
- data/lib/cloudflare_client/zone/firewall/access_rule.rb +87 -0
- data/lib/cloudflare_client/zone/firewall/waf_package.rb +46 -0
- data/lib/cloudflare_client/zone/firewall/waf_package/base.rb +9 -0
- data/lib/cloudflare_client/zone/firewall/waf_package/rule.rb +46 -0
- data/lib/cloudflare_client/zone/firewall/waf_package/rule_group.rb +42 -0
- data/lib/cloudflare_client/zone/keyless_ssl.rb +56 -0
- data/lib/cloudflare_client/zone/log.rb +51 -0
- data/lib/cloudflare_client/zone/page_rule.rb +64 -0
- data/lib/cloudflare_client/zone/railgun_connections.rb +43 -0
- data/lib/cloudflare_client/zone/rate_limit.rb +73 -0
- data/lib/cloudflare_client/zone/ssl.rb +28 -0
- data/lib/cloudflare_client/zone/ssl/certificate_pack.rb +32 -0
- data/lib/cloudflare_client/zone/subscription.rb +55 -0
- metadata +76 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
class CloudflareClient::Zone::Analytics < CloudflareClient::Zone::Base
|
2
|
+
##
|
3
|
+
# zone analytics (free, pro, business, enterprise)
|
4
|
+
|
5
|
+
##
|
6
|
+
# return dashboard data for a given zone or colo
|
7
|
+
def zone_dashboard
|
8
|
+
cf_get(path: "/zones/#{zone_id}/analytics/dashboard")
|
9
|
+
end
|
10
|
+
|
11
|
+
##
|
12
|
+
# creturn analytics for colos for a time window.
|
13
|
+
# since and untill must be RFC 3339 timestamps
|
14
|
+
# TODO: support continuous
|
15
|
+
def colo_dashboard(since_ts: nil, until_ts: nil)
|
16
|
+
raise 'since_ts must be a valid timestamp' if since_ts.nil? || !date_rfc3339?(since_ts)
|
17
|
+
raise 'until_ts must be a valid timestamp' if until_ts.nil? || !date_rfc3339?(until_ts)
|
18
|
+
|
19
|
+
cf_get(path: "/zones/#{zone_id}/analytics/dashboard")
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# DNS analytics
|
24
|
+
|
25
|
+
##
|
26
|
+
# return a table of analytics
|
27
|
+
def dns_table
|
28
|
+
cf_get(path: "/zones/#{zone_id}/dns_analytics/report")
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# return analytics by time
|
33
|
+
def dns_by_time(dimensions: [],
|
34
|
+
metrics: [],
|
35
|
+
sort: [],
|
36
|
+
filters: [],
|
37
|
+
since_ts: nil,
|
38
|
+
until_ts: nil,
|
39
|
+
limit: 100,
|
40
|
+
time_delta: 'hour')
|
41
|
+
# TODO: what are valid dimensions?
|
42
|
+
# TODO: what are valid metrics?
|
43
|
+
unless since_ts.nil?
|
44
|
+
raise 'since_ts must be a valid timestamp' unless date_rfc3339?(since_ts)
|
45
|
+
end
|
46
|
+
unless until_ts.nil?
|
47
|
+
raise 'until_ts must be a valid timestamp' unless date_rfc3339?(until_ts)
|
48
|
+
end
|
49
|
+
|
50
|
+
params = {limit: limit, time_delta: time_delta}
|
51
|
+
params['since'] = since_ts
|
52
|
+
params['until'] = until_ts
|
53
|
+
|
54
|
+
cf_get(path: "/zones/#{zone_id}/dns_analytics/report/bytime", params: params)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# https://api.cloudflare.com/#custom-hostname-for-a-zone-list-custom-hostnames
|
2
|
+
class CloudflareClient::Zone::CustomHostname < CloudflareClient::Zone::Base
|
3
|
+
VALID_METHODS = %w[http email cname].freeze
|
4
|
+
VALID_TYPES = ['read only', 'dv'].freeze
|
5
|
+
VALID_ORDERS = %w[ssl ssl_status].freeze
|
6
|
+
DEFAULT_SSL_PROPERTIES = { method: 'http', type: 'dv' }.freeze
|
7
|
+
|
8
|
+
##
|
9
|
+
# create custom_hostname
|
10
|
+
# - :custom_metadata may only work for enterprise or better customers
|
11
|
+
# - :ssl has undocumented properties: 'custom_certificate' and 'custom_key', or can be nulled
|
12
|
+
def create(hostname:, ssl: DEFAULT_SSL_PROPERTIES, custom_metadata: {})
|
13
|
+
#FIXME: implement checks for the custom_metedata/find out of it's going to be exposed to anyone else
|
14
|
+
#"custom_metadata":{"origin_override":"hostname.zendesk.com"}
|
15
|
+
#"custom_metadata":{"hsts_enabled":"true"}
|
16
|
+
#"custom_metadata":{"hsts_enabled":"true","custom_maxage":value}
|
17
|
+
id_check('hostname', hostname)
|
18
|
+
|
19
|
+
if ssl && ssl[:method] && ssl[:type]
|
20
|
+
valid_value_check(:method, ssl[:method], VALID_METHODS)
|
21
|
+
valid_value_check(:type, ssl[:type], VALID_TYPES)
|
22
|
+
end
|
23
|
+
|
24
|
+
data = { hostname: hostname, ssl: ssl }
|
25
|
+
data[:custom_metadata] = custom_metadata unless custom_metadata.empty?
|
26
|
+
|
27
|
+
cf_post(path: "/zones/#{zone_id}/custom_hostnames", data: data)
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# list custom_hostnames
|
32
|
+
def list(hostname: nil, id: nil, page: 1, per_page: 50, order: 'ssl', direction: 'desc', ssl: 0)
|
33
|
+
raise 'cannot use both hostname and id' if hostname && id
|
34
|
+
valid_value_check(:order, order, VALID_ORDERS)
|
35
|
+
valid_value_check(:direction, direction, VALID_DIRECTIONS)
|
36
|
+
valid_value_check(:ssl, ssl, [0, 1])
|
37
|
+
|
38
|
+
params = {page: page, per_page: per_page, order: order, direction: direction, ssl: ssl}
|
39
|
+
params[:hostname] = hostname if hostname
|
40
|
+
params[:id] = id if id
|
41
|
+
|
42
|
+
cf_get(path: "/zones/#{zone_id}/custom_hostnames", params: params)
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# details of a custom hostname
|
47
|
+
def show(id:)
|
48
|
+
id_check('id', id)
|
49
|
+
|
50
|
+
cf_get(path: "/zones/#{zone_id}/custom_hostnames/#{id}")
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# update a custom hosntame
|
55
|
+
# https://api.cloudflare.com/#custom-hostname-for-a-zone-update-custom-hostname-configuration
|
56
|
+
def update(id:, ssl: {}, custom_metadata: nil)
|
57
|
+
id_check('id', id)
|
58
|
+
|
59
|
+
data = {}
|
60
|
+
|
61
|
+
if ssl && ssl[:method] && ssl[:type]
|
62
|
+
valid_value_check(:method, ssl[:method], VALID_METHODS)
|
63
|
+
valid_value_check(:type, ssl[:type], VALID_TYPES)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Setting this to "null" requests removal of the attached certificate. We're
|
67
|
+
# using {} as the default value to denote "don't alter the SSL".
|
68
|
+
data[:ssl] = ssl unless ssl == {}
|
69
|
+
|
70
|
+
unless custom_metadata.nil?
|
71
|
+
raise 'custom_metadata must be an object' unless custom_metadata.is_a?(Hash)
|
72
|
+
|
73
|
+
data[:custom_metadata] = custom_metadata
|
74
|
+
end
|
75
|
+
|
76
|
+
cf_patch(path: "/zones/#{zone_id}/custom_hostnames/#{id}", data: data)
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# delete a custom hostname and ssl certs
|
81
|
+
def delete(id:)
|
82
|
+
id_check('id', id)
|
83
|
+
|
84
|
+
cf_delete(path: "/zones/#{zone_id}/custom_hostnames/#{id}")
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class CloudflareClient::Zone::CustomPage < CloudflareClient::Zone::Base
|
2
|
+
##
|
3
|
+
# Custom pages for a zone
|
4
|
+
##
|
5
|
+
# custom_pages list all avaialble custom_pages
|
6
|
+
def list
|
7
|
+
cf_get(path: "/zones/#{zone_id}/custom_pages")
|
8
|
+
end
|
9
|
+
|
10
|
+
##
|
11
|
+
# custom_page details
|
12
|
+
def show(id:)
|
13
|
+
raise 'id must not be nil' if id.nil?
|
14
|
+
cf_get(path: "/zones/#{zone_id}/custom_pages/#{id}")
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# update_custom_page
|
19
|
+
def update(id:, url:, state:)
|
20
|
+
id_check('id', id)
|
21
|
+
id_check('url', url)
|
22
|
+
raise 'state must be either default | customized' unless %w[default customized].include?(state)
|
23
|
+
|
24
|
+
data = {url: url, state: state}
|
25
|
+
|
26
|
+
cf_put(path: "/zones/#{zone_id}/custom_pages/#{id}", data: data)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class CloudflareClient::Zone::CustomSSL < CloudflareClient::Zone::Base
|
2
|
+
VALID_ORDERS = %w[status issuer priority expires_on].freeze
|
3
|
+
|
4
|
+
##
|
5
|
+
# Custom SSL for a zone
|
6
|
+
|
7
|
+
##
|
8
|
+
# create custom ssl for a zone
|
9
|
+
def create(certificate:, private_key:, bundle_method: nil)
|
10
|
+
id_check('certificate', certificate)
|
11
|
+
id_check('private_key', private_key)
|
12
|
+
bundle_method_check(bundle_method) unless bundle_method.nil?
|
13
|
+
# TODO: validate the cert/key using openssl? Could be difficult if they are
|
14
|
+
# privately generated
|
15
|
+
data = {certificate: certificate, private_key: private_key}
|
16
|
+
data[:bundle_method] = bundle_method unless bundle_method.nil?
|
17
|
+
cf_post(path: "/zones/#{zone_id}/custom_certificates", data: data)
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# list custom ssl configurations
|
22
|
+
def list(page: 1, per_page: 50, order: 'priority', direction: 'asc', match: 'all')
|
23
|
+
raise ("order must be one of #{VALID_ORDERS}") unless VALID_ORDERS.include?(order)
|
24
|
+
raise ('direction must be asc || desc') unless (direction == 'asc' || direction == 'desc')
|
25
|
+
raise ('match must be all || any') unless (match == 'any' || match == 'all')
|
26
|
+
params = {page: page, per_page: per_page}
|
27
|
+
params[:match] = match
|
28
|
+
params[:direction] = direction
|
29
|
+
cf_get(path: "/zones/#{zone_id}/custom_certficates", params: params)
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# details of a single config
|
34
|
+
def show(configuration_id:)
|
35
|
+
raise 'ssl configuration id required' if configuration_id.nil?
|
36
|
+
cf_get(path: "/zones/#{zone_id}/custom_certificates/#{configuration_id}")
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# updates a custom ssl record
|
41
|
+
def update(id:, private_key: nil, certificate: nil, bundle_method: nil)
|
42
|
+
id_check('id', id)
|
43
|
+
id_check('private_key must be provided') if private_key.nil?
|
44
|
+
bundle_method_check(bundle_method)
|
45
|
+
data = {private_key: private_key, certificate: certificate, bundle_method: bundle_method}
|
46
|
+
cf_patch(path: "/zones/#{zone_id}/custom_certificates/#{id}", data: data)
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# re-prioritize ssl certs data = [{id: "cert_id", priority: 2}, {id: "cert_id", priority: 1}]
|
51
|
+
def prioritize(data: [])
|
52
|
+
raise 'must provide an array of certifiates and priorities' unless data.is_a?(Array) && !data.empty?
|
53
|
+
cf_put(path: "/zones/#{zone_id}/custom_certificates/prioritize", data: data)
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# delete a custom ssl cert
|
58
|
+
def delete(id:)
|
59
|
+
id_check('id', id)
|
60
|
+
cf_delete(path: "/zones/#{zone_id}/custom_certificates/#{id}")
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
class CloudflareClient::Zone::DNS < CloudflareClient::Zone::Base
|
2
|
+
VALID_TYPES = ['A', 'AAAA', 'CNAME', 'TXT', 'SRV', 'LOC', 'MX', 'NS', 'SPF', 'read only'].freeze
|
3
|
+
|
4
|
+
##
|
5
|
+
# DNS methods
|
6
|
+
|
7
|
+
##
|
8
|
+
# Create a dns record
|
9
|
+
def create(name:, type:, content:, ttl: nil, proxied: nil)
|
10
|
+
raise ("type must be one of #{VALID_TYPES.flatten}") unless VALID_TYPES.include?(type)
|
11
|
+
data = {name: name, type: type, content: content}
|
12
|
+
cf_post(path: "/zones/#{zone_id}/dns_records", data: data)
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# list/search for dns records in a given zone
|
17
|
+
def list(name: nil, content: nil, per_page: 50, page_no: 1, order: 'type', match: 'all', type: nil)
|
18
|
+
raise('match must be either all | any') unless %w[all any].include?(match)
|
19
|
+
params = {per_page: per_page, page: page_no, order: order}
|
20
|
+
params[:name] = name unless name.nil?
|
21
|
+
params[:content] = content unless content.nil?
|
22
|
+
params[:type] = type unless type.nil?
|
23
|
+
cf_get(path: "/zones/#{zone_id}/dns_records", params: params)
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# details for a given dns_record
|
28
|
+
def show(id:)
|
29
|
+
id_check('dns record id', id)
|
30
|
+
cf_get(path: "/zones/#{zone_id}/dns_records/#{id}")
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# update a dns record.
|
35
|
+
# zone_id, id, type, and name are all required. ttl and proxied are optional
|
36
|
+
def update(id:, type:, name:, content:, ttl: nil, proxied: nil)
|
37
|
+
id_check('dns record id', id)
|
38
|
+
id_check('dns record type', type)
|
39
|
+
id_check('dns record name', name)
|
40
|
+
id_check('dns record content', content)
|
41
|
+
raise('must suply type, name, and content') if (type.nil? || name.nil? || content.nil?)
|
42
|
+
data = {type: type, name: name, content: content}
|
43
|
+
data[:ttl] = ttl unless ttl.nil?
|
44
|
+
data[:proxied] = proxied unless proxied.nil?
|
45
|
+
cf_put(path: "/zones/#{zone_id}/dns_records/#{id}", data: data)
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# delete a dns record
|
50
|
+
# id is required. ttl and proxied are optional
|
51
|
+
def delete(id:)
|
52
|
+
id_check('id', id)
|
53
|
+
cf_delete(path: "/zones/#{zone_id}/dns_records/#{id}")
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# import a BIND formatted zone file
|
58
|
+
# def import_zone_file(path_to_file: nil)
|
59
|
+
# # FIXME: not tested
|
60
|
+
# raise("full path of file to import") if path_to_file.nil?
|
61
|
+
# # TODO: ensure that this is a bind file?
|
62
|
+
# raise("import file_name does not exist") if File.exists?(path_to_file)
|
63
|
+
# data = { file: Faraday::UploadIO.new(path_to_file, 'multipart/form-data') }
|
64
|
+
# cf_post(path: "/v4/zones/#{zone_id}/dns_records/import", data: data)
|
65
|
+
# end
|
66
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class CloudflareClient::Zone::Firewall::AccessRule < CloudflareClient::Zone::Firewall
|
2
|
+
VALID_MODES = %w[block challenge whitelist].freeze
|
3
|
+
VALID_SCOPE_TYPES = %w[user organization zone].freeze
|
4
|
+
VALID_CONFIG_TARGETS = %w[ip ip_range country].freeze
|
5
|
+
VALID_ORDERS = %w[scope_type configuration_target configuration_value mode].freeze
|
6
|
+
VALID_CASCADES = %w[none basic aggressive].freeze
|
7
|
+
|
8
|
+
##
|
9
|
+
# firewall_access_rules_for_a_zone
|
10
|
+
def list(notes: nil, mode: nil, match: nil, scope_type: nil, configuration_value: nil, order: nil, page: 1, per_page: 50, configuration_target: nil, direction: 'desc')
|
11
|
+
params = {page: page, per_page: per_page}
|
12
|
+
params[:notes] = notes unless notes.nil?
|
13
|
+
params[:configuration_value] = configuration_value unless configuration_value.nil?
|
14
|
+
|
15
|
+
unless mode.nil?
|
16
|
+
valid_value_check(:mode, mode, VALID_MODES)
|
17
|
+
params[:mode] = mode
|
18
|
+
end
|
19
|
+
|
20
|
+
unless match.nil?
|
21
|
+
valid_value_check(:match, match, VALID_MATCHES)
|
22
|
+
params[:match] = match
|
23
|
+
end
|
24
|
+
|
25
|
+
unless scope_type.nil?
|
26
|
+
valid_value_check(:scope_type, scope_type, VALID_SCOPE_TYPES)
|
27
|
+
params[:scope_type] = scope_type
|
28
|
+
end
|
29
|
+
|
30
|
+
unless configuration_target.nil?
|
31
|
+
valid_value_check(:configuration_target, configuration_target, VALID_CONFIG_TARGETS)
|
32
|
+
params[:configuration_target] = configuration_target
|
33
|
+
end
|
34
|
+
|
35
|
+
unless direction.nil?
|
36
|
+
valid_value_check(:direction, direction, VALID_DIRECTIONS)
|
37
|
+
params[:direction] = direction
|
38
|
+
end
|
39
|
+
|
40
|
+
unless order.nil?
|
41
|
+
valid_value_check(:order, order, VALID_ORDERS)
|
42
|
+
params[:order] = order
|
43
|
+
end
|
44
|
+
|
45
|
+
cf_get(path: "/zones/#{zone_id}/firewall/access_rules/rules", params: params)
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# create firewall access rule
|
50
|
+
def create(mode:, configuration:, notes: nil)
|
51
|
+
valid_value_check(:mode, mode, VALID_MODES)
|
52
|
+
if configuration.is_a?(Hash)
|
53
|
+
unless configuration.keys.map(&:to_sym).sort == [:target, :value]
|
54
|
+
raise 'configuration must contain valid a valid target and value'
|
55
|
+
end
|
56
|
+
else
|
57
|
+
raise 'configuration must be a valid configuration object'
|
58
|
+
end
|
59
|
+
|
60
|
+
data = {mode: mode, configuration: configuration}
|
61
|
+
data[:notes] = notes unless notes.nil?
|
62
|
+
|
63
|
+
cf_post(path: "/zones/#{zone_id}/firewall/access_rules/rules", data: data)
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# updates firewall_access_rule
|
68
|
+
def update(id:, mode: nil, notes: nil)
|
69
|
+
id_check('id', id)
|
70
|
+
valid_value_check(:mode, mode, VALID_MODES) unless mode.nil?
|
71
|
+
|
72
|
+
data = {}
|
73
|
+
data[:mode] = mode unless mode.nil?
|
74
|
+
data[:notes] = notes unless notes.nil?
|
75
|
+
|
76
|
+
cf_patch(path: "/zones/#{zone_id}/firewall/access_rules/rules/#{id}", data: data)
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# delete a firewall access rule
|
81
|
+
def delete(id:, cascade: 'none')
|
82
|
+
id_check('id', id)
|
83
|
+
valid_value_check(:cascade, cascade, VALID_CASCADES)
|
84
|
+
|
85
|
+
cf_delete(path: "/zones/#{zone_id}/firewall/access_rules/rules/#{id}")
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class CloudflareClient::Zone::Firewall::WAFPackage < CloudflareClient::Zone::Firewall
|
2
|
+
require_relative './waf_package/base.rb'
|
3
|
+
Dir[File.expand_path('../waf_package/*.rb', __FILE__)].each {|f| require f}
|
4
|
+
|
5
|
+
VALID_ORDERS = %w[status name].freeze
|
6
|
+
VALID_SENSITIVITIES = %w[high low off].freeze
|
7
|
+
VALID_ACTION_MODES = %w[simulate block challenge].freeze
|
8
|
+
|
9
|
+
##
|
10
|
+
# lists waf_rule_packages
|
11
|
+
def list(name: nil, page: 1, per_page: 50, order: 'status', direction: 'desc', match: 'all')
|
12
|
+
params = {page: page, per_page: per_page}
|
13
|
+
params[:name] = name unless name.nil?
|
14
|
+
|
15
|
+
valid_value_check(:order, order, VALID_ORDERS)
|
16
|
+
params[:order] = order
|
17
|
+
|
18
|
+
valid_value_check(:direction, direction, VALID_DIRECTIONS)
|
19
|
+
params[:direction] = direction
|
20
|
+
|
21
|
+
valid_value_check(:match, match, VALID_MATCHES)
|
22
|
+
params[:match] = match
|
23
|
+
|
24
|
+
cf_get(path: "/zones/#{zone_id}/firewall/waf/packages", params: params)
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# shows details of a single package
|
29
|
+
def show(id:)
|
30
|
+
id_check('id', id)
|
31
|
+
|
32
|
+
cf_get(path: "/zones/#{zone_id}/firewall/waf/packages/#{id}")
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# changes the sensitivity and action for an anomaly detection type WAF rule package
|
37
|
+
def update(id:, sensitivity: 'high', action_mode: 'challange')
|
38
|
+
id_check('id', id)
|
39
|
+
valid_value_check(:sensitivity, sensitivity, VALID_SENSITIVITIES)
|
40
|
+
valid_value_check(:action_mode, action_mode, VALID_ACTION_MODES)
|
41
|
+
|
42
|
+
data = {sensitivity: sensitivity, action_mode: action_mode}
|
43
|
+
|
44
|
+
cf_patch(path: "/zones/#{zone_id}/firewall/waf/packages/#{id}", data: data)
|
45
|
+
end
|
46
|
+
end
|