0
Create a zone ruleset
One script reply has been approved by the moderators Verified

Creates a ruleset at the zone level.

Created by hugo697 570 days ago Viewed 22422 times
0
Submitted by hugo697 Typescript (fetch-only)
Verified 570 days ago
1
type Cloudflare = {
2
  token: string;
3
  email: string;
4
  key: string;
5
};
6
/**
7
 * Create a zone ruleset
8
 * Creates a ruleset at the zone level.
9
 */
10
export async function main(
11
  auth: Cloudflare,
12
  zone_id: string,
13
  body: {
14
    description?: string;
15
    id: string & { [k: string]: unknown };
16
    kind?: "managed" | "custom" | "root" | "zone";
17
    last_updated: string;
18
    name?: string;
19
    phase?:
20
      | "ddos_l4"
21
      | "ddos_l7"
22
      | "http_config_settings"
23
      | "http_custom_errors"
24
      | "http_log_custom_fields"
25
      | "http_ratelimit"
26
      | "http_request_cache_settings"
27
      | "http_request_dynamic_redirect"
28
      | "http_request_firewall_custom"
29
      | "http_request_firewall_managed"
30
      | "http_request_late_transform"
31
      | "http_request_origin"
32
      | "http_request_redirect"
33
      | "http_request_sanitize"
34
      | "http_request_sbfm"
35
      | "http_request_select_configuration"
36
      | "http_request_transform"
37
      | "http_response_compression"
38
      | "http_response_firewall_managed"
39
      | "http_response_headers_transform"
40
      | "magic_transit"
41
      | "magic_transit_ids_managed"
42
      | "magic_transit_managed";
43
    version: string;
44
    [k: string]: unknown;
45
  } & {
46
    rules: (
47
      | ({
48
          action?: string;
49
          action_parameters?: { [k: string]: unknown };
50
          categories?: string[];
51
          description?: string;
52
          enabled?: boolean & boolean;
53
          expression?: string;
54
          id?: string;
55
          last_updated: string;
56
          logging?: { enabled: boolean; [k: string]: unknown };
57
          ref?: string;
58
          version: string;
59
          [k: string]: unknown;
60
        } & {
61
          action?: "block";
62
          action_parameters?: {
63
            response?: {
64
              content: string;
65
              content_type: string;
66
              status_code: number;
67
              [k: string]: unknown;
68
            };
69
            [k: string]: unknown;
70
          };
71
          description?: { [k: string]: unknown };
72
          [k: string]: unknown;
73
        })
74
      | ({
75
          action?: string;
76
          action_parameters?: { [k: string]: unknown };
77
          categories?: string[];
78
          description?: string;
79
          enabled?: boolean & boolean;
80
          expression?: string;
81
          id?: string;
82
          last_updated: string;
83
          logging?: { enabled: boolean; [k: string]: unknown };
84
          ref?: string;
85
          version: string;
86
          [k: string]: unknown;
87
        } & {
88
          action?: "execute";
89
          action_parameters?: {
90
            id: string & { [k: string]: unknown };
91
            matched_data?: { public_key: string; [k: string]: unknown };
92
            overrides?: {
93
              action?: string & { [k: string]: unknown };
94
              categories?: {
95
                action?: string & { [k: string]: unknown };
96
                category: string & { [k: string]: unknown };
97
                enabled?: boolean & { [k: string]: unknown };
98
                sensitivity_level?:
99
                  | "default"
100
                  | "medium"
101
                  | "low"
102
                  | ("eoff" & { [k: string]: unknown });
103
                [k: string]: unknown;
104
              }[];
105
              enabled?: boolean & { [k: string]: unknown };
106
              rules?: {
107
                action?: string & { [k: string]: unknown };
108
                enabled?: boolean & { [k: string]: unknown };
109
                id: string & { [k: string]: unknown };
110
                score_threshold?: number;
111
                sensitivity_level?:
112
                  | "default"
113
                  | "medium"
114
                  | "low"
115
                  | ("eoff" & { [k: string]: unknown });
116
                [k: string]: unknown;
117
              }[];
118
              sensitivity_level?:
119
                | "default"
120
                | "medium"
121
                | "low"
122
                | ("eoff" & { [k: string]: unknown });
123
              [k: string]: unknown;
124
            };
125
            [k: string]: unknown;
126
          };
127
          description?: { [k: string]: unknown };
128
          [k: string]: unknown;
129
        })
130
      | ({
131
          action?: string;
132
          action_parameters?: { [k: string]: unknown };
133
          categories?: string[];
134
          description?: string;
135
          enabled?: boolean & boolean;
136
          expression?: string;
137
          id?: string;
138
          last_updated: string;
139
          logging?: { enabled: boolean; [k: string]: unknown };
140
          ref?: string;
141
          version: string;
142
          [k: string]: unknown;
143
        } & {
144
          action?: "log";
145
          action_parameters?: {};
146
          description?: { [k: string]: unknown };
147
          [k: string]: unknown;
148
        })
149
      | ({
150
          action?: string;
151
          action_parameters?: { [k: string]: unknown };
152
          categories?: string[];
153
          description?: string;
154
          enabled?: boolean & boolean;
155
          expression?: string;
156
          id?: string;
157
          last_updated: string;
158
          logging?: { enabled: boolean; [k: string]: unknown };
159
          ref?: string;
160
          version: string;
161
          [k: string]: unknown;
162
        } & {
163
          action?: "skip";
164
          action_parameters?: {
165
            phases?: (
166
              | "ddos_l4"
167
              | "ddos_l7"
168
              | "http_config_settings"
169
              | "http_custom_errors"
170
              | "http_log_custom_fields"
171
              | "http_ratelimit"
172
              | "http_request_cache_settings"
173
              | "http_request_dynamic_redirect"
174
              | "http_request_firewall_custom"
175
              | "http_request_firewall_managed"
176
              | "http_request_late_transform"
177
              | "http_request_origin"
178
              | "http_request_redirect"
179
              | "http_request_sanitize"
180
              | "http_request_sbfm"
181
              | "http_request_select_configuration"
182
              | "http_request_transform"
183
              | "http_response_compression"
184
              | "http_response_firewall_managed"
185
              | "http_response_headers_transform"
186
              | "magic_transit"
187
              | "magic_transit_ids_managed"
188
              | ("magic_transit_managed" & { [k: string]: unknown })
189
            )[];
190
            products?:
191
              | "bic"
192
              | "hot"
193
              | "rateLimit"
194
              | "securityLevel"
195
              | "uaBlock"
196
              | "waf"
197
              | "zoneLockdown"[];
198
            rules?: { [k: string]: (string & { [k: string]: unknown })[] };
199
            ruleset?: "current";
200
            rulesets?: (string & { [k: string]: unknown })[];
201
            [k: string]: unknown;
202
          };
203
          description?: { [k: string]: unknown };
204
          [k: string]: unknown;
205
        })
206
    )[];
207
    [k: string]: unknown;
208
  }
209
) {
210
  const url = new URL(
211
    `https://api.cloudflare.com/client/v4/zones/${zone_id}/rulesets`
212
  );
213

214
  const response = await fetch(url, {
215
    method: "POST",
216
    headers: {
217
      "X-AUTH-EMAIL": auth.email,
218
      "X-AUTH-KEY": auth.key,
219
      "Content-Type": "application/json",
220
      Authorization: "Bearer " + auth.token,
221
    },
222
    body: JSON.stringify(body),
223
  });
224
  if (!response.ok) {
225
    const text = await response.text();
226
    throw new Error(`${response.status} ${text}`);
227
  }
228
  return await response.json();
229
}
230