diff --git a/actions/create_zone_access_rule.py b/actions/create_zone_access_rule.py new file mode 100644 index 0000000..f34c661 --- /dev/null +++ b/actions/create_zone_access_rule.py @@ -0,0 +1,39 @@ +from lib.actions import CloudflareBaseAction + + +class CreateZoneAccessRuleAction(CloudflareBaseAction): + def run(self, **kwargs): + """ + Create Access Rule in a Zone + + Args: + zone_id: ID of the zone to create the access rule + mode: The action the access rule will apply to matched requests + target_type: The address type to target in requests + target: The address to target in requests + notes: An optional note about the rule + + Raises: + CloudFlareAPIError: On HTTP Error or Invaild JSON. + + Returns: + dict: containing the Access Rule created + """ + + # grab URL components and remove from kwargs + zone_id = kwargs['zone_id'] + del kwargs['zone_id'] + + # set up target configuration + target_config = { + 'target': kwargs['target_type'], + 'value': kwargs['target'] + } + del kwargs['target_type'] + del kwargs['target'] + kwargs['configuration'] = target_config + + # invoke API call + func = self.client.zones.firewall.access_rules.rules.post # pylint: disable=no-member + result = self.invoke(func, zone_id, **kwargs) + return result diff --git a/actions/create_zone_access_rule.yaml b/actions/create_zone_access_rule.yaml new file mode 100644 index 0000000..3d51c22 --- /dev/null +++ b/actions/create_zone_access_rule.yaml @@ -0,0 +1,39 @@ +--- +description: "Create an access rule for a zone" +enabled: true +entry_point: "create_zone_access_rule.py" +name: "create_zone_access_rule" +pack: "cloudflare" +runner_type: "python-script" +parameters: + zone_id: + type: string + description: "Zone identify tag (ex: '023e105f4ecef8ad9ca31a8372d0c353')" + required: true + mode: + type: string + description: "The action to apply to a matched request" + required: true + enum: + - "block" + - "challenge" + - "js_challenge" + - "managed_challenge" + - "whitelist" + target_type: + type: string + description: "The address type to target in requests" + required: true + enum: + - "asn" + - "country" + - "ip_range" + - "ip" + - "ip6" + target: + type: string + description: "The address to target in requests" + required: true + notes: + type: string + description: "A note about the rule." diff --git a/actions/delete_zone_access_rule.py b/actions/delete_zone_access_rule.py new file mode 100644 index 0000000..e6ca2fc --- /dev/null +++ b/actions/delete_zone_access_rule.py @@ -0,0 +1,30 @@ +from lib.actions import CloudflareBaseAction + + +class DeleteZoneAccessRuleAction(CloudflareBaseAction): + def run(self, **kwargs): + """ + Delete Access Rule in a Zone + + Args: + zone_id: ID of the zone to delete from the access rule + rule_id: ID of the rule to delete + + Raises: + CloudFlareAPIError: On HTTP Error or Invaild JSON. + + Returns: + dict: containing the Access Rule deleted + """ + + # grab URL components and remove from kwargs + zone_id = kwargs['zone_id'] + del kwargs['zone_id'] + + rule_id = kwargs['rule_id'] + del kwargs['rule_id'] + + # invoke API call + func = self.client.zones.firewall.access_rules.rules.delete # pylint: disable=no-member + result = self.invoke(func, zone_id, rule_id, **kwargs) + return result diff --git a/actions/delete_zone_access_rule.yaml b/actions/delete_zone_access_rule.yaml new file mode 100644 index 0000000..4966d79 --- /dev/null +++ b/actions/delete_zone_access_rule.yaml @@ -0,0 +1,16 @@ +--- +description: "Delete an access rule from a zone" +enabled: true +entry_point: "delete_zone_access_rule.py" +name: "delete_zone_access_rule" +pack: "cloudflare" +runner_type: "python-script" +parameters: + zone_id: + type: string + description: "Zone identify tag (ex: '023e105f4ecef8ad9ca31a8372d0c353')" + required: true + rule_id: + type: string + description: "Rule identify tag (ex: '023e105f4ecef8ad9ca31a8372d0c353')" + required: true diff --git a/actions/get_zone_access_rule.py b/actions/get_zone_access_rule.py new file mode 100644 index 0000000..844f0e3 --- /dev/null +++ b/actions/get_zone_access_rule.py @@ -0,0 +1,34 @@ +from lib.actions import CloudflareBaseAction + + +class GetZoneAccessRuleAction(CloudflareBaseAction): + def run(self, **kwargs): + """ + List Access Rule in a Zone + + Args: + zone_id: ID of the zone to delete from the access rule + + Raises: + CloudFlareAPIError: On HTTP Error or Invaild JSON. + + Returns: + list: containing the Access Rules + """ + + # grab URL components and remove from kwargs + zone_id = kwargs['zone_id'] + del kwargs['zone_id'] + + if 'configuration_target' in kwargs: + kwargs['configuration.target'] = kwargs['configuration_target'] + del kwargs['configuration_target'] + + if 'configuration_value' in kwargs: + kwargs['configuration.value'] = kwargs['configuration_value'] + del kwargs['configuration_value'] + + # invoke API call + func = self.client.zones.firewall.access_rules.rules.get # pylint: disable=no-member + result = self.invoke(func, zone_id, **kwargs) + return result diff --git a/actions/get_zone_access_rule.yaml b/actions/get_zone_access_rule.yaml new file mode 100644 index 0000000..476dda0 --- /dev/null +++ b/actions/get_zone_access_rule.yaml @@ -0,0 +1,35 @@ +--- +description: "List access rules from a zone" +enabled: true +entry_point: "get_zone_access_rule.py" +name: "get_zone_access_rule" +pack: "cloudflare" +runner_type: "python-script" +parameters: + zone_id: + type: string + description: "Zone identify tag (ex: '023e105f4ecef8ad9ca31a8372d0c353')" + required: true + match: + type: string + description: "Whether to match all search requirements or at least one (any)." + enum: + - "all" + - "any" + notes: + type: string + description: "Search rules by notes." + mode: + type: string + description: "Search rules by action." + configuration_target: + type: string + description: "Search rules by target." + enum: + - "asn" + - "country" + - "ip" + - "ip_range" + configuration_value: + type: string + description: "Search rules by IP, range, or country code" diff --git a/actions/lib/actions.py b/actions/lib/actions.py index e6a8f95..ae1b387 100644 --- a/actions/lib/actions.py +++ b/actions/lib/actions.py @@ -55,8 +55,11 @@ def invoke(self, func, *args, **kwargs): # NOTE: the default page number = 1 params['page'] = page_number - # invoke the Cloudflare APIo - raw_results = func(*args, params=copy.deepcopy(params)) + # invoke the Cloudflare API + if func.__name__ == 'post': + raw_results = func(*args, data=copy.deepcopy(params)) + else: + raw_results = func(*args, params=copy.deepcopy(params)) # do we have paged results if 'result_info' not in raw_results: