Cloudflare を CLI で操作する

# 1.  python-cloudflare

こちらにある Python ライブラリを活用できます。

> - [cloudflare/python-cloudflare: Python wrapper for the Cloudflare Client API v4](https://github.com/cloudflare/python-cloudflare)
>
> - [python-cloudflare](https://blog.cloudflare.com/python-cloudflare/)

## インストール

```shell
sudo pip install cloudflare
```

## バージョン確認

```shell
% cli4 -V
Cloudflare library version: 2.8.15
```

## 設定ファイル作成

![image-20211104155415629](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20211104155415629.png)

![image-20211104155603778](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20211104155603778.png)

```shell
mkdir ~/.cloudflare
cat << EOS > ~/.cloudflare/cloudflare.cfg
[CloudFlare]
email = user@example.com # YOUR_EMAIL
token = 00000000000000000000000000000000 # YOUR_API_KEY
certtoken = v1.0-xxxxxxx # YOUR_ORIGIN_CA_KEY
extras =
EOS
```
## 参考：extras の追加
こちらの Python スクリプトを使って extras を追加しておくと、ほぼ全ての API コールをおこなえるようにできます。

```python:list_cf_api_endpoint.py
# Import Library
from bs4 import BeautifulSoup
import urllib.request

# Set URL
url = "https://api.cloudflare.com/"
# Retrieve from URL
html = urllib.request.urlopen(url)
# Use BeautifulSoup
soup = BeautifulSoup(html, "html.parser")

# Retrieve the list of API endpoint
list_of_endpoints = []

for e in soup.find_all('pre',class_='language-http'):
    list_of_endpoints.append(e.get_text().split()[-1])

#list_of_endpoints.sort()
#for e in list_of_endpoints:
#    print(e)

# Get and show the unique value of the list above
list_of_unique_endpoints = list(set(list_of_endpoints))
list_of_unique_endpoints.remove('object/:object_id')
list_of_unique_endpoints.sort()
  
for e in list_of_unique_endpoints:
    print('    /client/v4/' + e)
```

```shell
python3 list_cf_api_endpoint.py >> ~/.cloudflare/cloudflare.cfg
```


## コマンド例

> [cli4 man page - python3-cloudflare - General Commands](https://www.mankier.com/1/cli4)

```
cli4 /zones # List information for all zones.
cli4 --raw per_page=100 /zones # default paging is {"count":20,"page":1,"per_page":20}
cli4 /zones/:example.com # List specific zone info.
cli4 /zones/:example.com/settings # List settings for a specific zone.
cli4 --delete purge_everything=true /zones/:example.com/purge_cache # Purge cache for a specific zone.
cli4 --delete files='[http://example.com/css/styles.css]' /zones/:example.com/purge_cache # Purge cache for a specific zone.
cli4 --delete files='[http://example.com/css/styles.css,http://example.com/js/script.js] /zones/:example.com/purge_cache # Purge cache for a specific zone.
cli4 --delete tags='[tag1,tag2,tag3]' /zones/:example.com/purge_cache # Purge cache for a specific zone.
cli4 /zones/:example.com/available_plans # List available plans for a zone.
cli4 --patch status=active /zones/:example.com/dnssec # Make DNSSEC active for specfic zone.
cli4 /zones/:example.com/dnssec # List DNSSEC information and status for a specific zone.
```

## ゾーンの設定値一覧を取得

このような形で取得しておくと、パラメータシート等で利用しやすいです。

```shell
cli4 /zones/:example.com/settings | jq -r '.[] | [.editable,.id,.modified_on,.value|tostring]|@csv'
```

```csv:result.csv
"true","0rtt","null","off"
"false","advanced_ddos","null","on"
"true","always_online","2021-07-01T15:11:49.794076Z","on"
"true","always_use_https","2021-09-01T03:49:14.208475Z","on"
"true","automatic_https_rewrites","null","off"
"true","brotli","2021-09-06T05:35:03.436837Z","on"
"true","browser_cache_ttl","null","14400"
"true","browser_check","2021-08-23T13:56:31.228728Z","off"
"true","cache_level","null","aggressive"
"true","challenge_ttl","null","1800"
"true","ciphers","null","[""ECDHE-ECDSA-AES128-GCM-SHA256""]"
"true","cname_flattening","null","flatten_all"
"true","development_mode","null","off"
"true","edge_cache_ttl","null","7200"
"true","email_obfuscation","null","on"
"true","filter_logs_to_cloudflare","null","off"
"true","hotlink_protection","null","off"
"true","http2","null","on"
"true","http3","2021-08-23T07:21:11.227618Z","on"
"true","ip_geolocation","null","on"
"true","ipv6","2021-07-02T14:32:19.338095Z","off"
"true","log_to_cloudflare","null","on"
"true","max_upload","2021-10-04T04:27:00.936383Z","500"
"true","min_tls_version","null","1.0"
"true","minify","2021-09-06T05:35:43.295595Z","{""css"":""on"",""html"":""on"",""js"":""on""}"
"true","mirage","2021-08-10T05:16:21.602454Z","on"
"true","mobile_redirect","null","{""mobile_subdomain"":null,""status"":""off"",""strip_uri"":false}"
"true","opportunistic_encryption","null","off"
"true","opportunistic_onion","null","on"
"true","orange_to_orange","null","off"
"true","origin_error_page_pass_thru","null","off"
"true","polish","2021-09-03T02:26:58.070012Z","lossy"
"true","prefetch_preload","null","off"
"true","privacy_pass","null","on"
"true","proxy_read_timeout","null","100"
"true","pseudo_ipv4","2021-07-29T04:15:51.230691Z","add_header"
"true","response_buffering","null","off"
"true","rocket_loader","2021-08-24T01:40:37.546320Z","on"
"true","security_header","null","{""strict_transport_security"":{""enabled"":false,""include_subdomains"":false,""max_age"":0,""nosniff"":false,""preload"":false}}"
"true","security_level","null","medium"
"true","server_side_exclude","null","on"
"true","sort_query_string_for_cache","null","off"
"true","ssl","2021-09-01T03:50:07.962873Z","full"
"true","tls_1_2_only","null","off"
"true","tls_1_3","null","on"
"true","tls_client_auth","2021-10-14T07:34:31.711373Z","on"
"true","true_client_ip_header","null","off"
"true","visitor_ip","null","on"
"true","waf","2021-08-04T05:45:29.377270Z","off"
"true","webp","2021-09-03T02:21:10.978032Z","on"
"true","websockets","null","on"
```

# 2. flarectl

こちらにある GO ライブラリを活用できます。

> [Release Latest · cloudflare/cloudflare-go](https://github.com/cloudflare/cloudflare-go/releases/latest)

## インストール

latest バージョンをインストールします。

```
pip install gh-release-install
gh-release-install "cloudflare/cloudflare-go" \
"flarectl_{version}_macos_amd64.tar.xz" \
--extract "flarectl" \
"/usr/local/bin/flarectl"
```

## バージョン確認

```shell
% flarectl --version
flarectl version 0.27.0
```

## 環境変数設定

```shell
export CF_API_EMAIL='YOUR_EMAIL'
export CF_API_KEY='YOUR_APIKEY'
```

## コマンド例

CLI を使って DNS レコード等の操作ができます。

```shell
% flarectl dns list --zone example.com
                 ID                | TYPE  |                NAME                 |                        CONTENT                        | PROXIED | TTL  
-----------------------------------+-------+-------------------------------------+-------------------------------------------------------+---------+------
  xxx | A     | a.example.com              | x.x.x.x                                          | true    |   1  
  xxx | A     | b.example.com            | x.x.x.x                                          | true    |   1  
  xxx | A     | c.example.com   | x.x.x.x                                          | true    |   1  
```