Source code for uhugo.post_install.providers.cloudflare
import logging
import os
from typing import Text, Union
import requests
from . import ProviderBase
log = logging.getLogger(__name__)
[docs]
class Cloudflare(ProviderBase):
"""
Cloudflare provider
"""
def __init__(
self, api_key: Text = None, email_address: Text = None, account_id: Text = None, hugo_version: Text = None
):
"""
:param hugo_version: New Hugo version
:param api_key: Authentication key for Cloudflare
:param email_address: Registered email address
:param account_id: Cloudflare worker account ID
:raises ValueError: If ``email_address`` and ``account_id`` is not provided
"""
super().__init__(api_key, None, hugo_version)
self.account_id = account_id
if not email_address:
email_address = os.environ.get("CLOUDFLARE_EMAIL", None)
if not self.account_id:
self.account_id = os.environ.get("CLOUDFLARE_WORKER_ACCOUNT_ID", None)
if not email_address and not self.account_id and not self.hugo_version:
raise ValueError("email_address, account_id or hugo_version not provided")
if email_address:
self.headers = {"X-Auth-Email": email_address, "X-Auth-Key": self.api_key}
else:
self.headers = {"Authorization": f"Bearer {self.api_key}"}
[docs]
def update_api(self, project_name: Text) -> requests.Response:
"""
Updates Cloudflare Pages environment variable of ``HUGO_VERSION``.
:param project_name: Name of the project to update
:return:
"""
data = {
"deployment_configs": {
"preview": {"env_vars": {"delete_this_env_var": None, "HUGO_VERSION": {"value": self.hugo_version}}},
"production": {"env_vars": {"delete_this_env_var": None, "HUGO_VERSION": {"value": self.hugo_version}}},
}
}
response = requests.patch(
f"https://api.cloudflare.com/client/v4/accounts/{self.account_id}/pages/projects/{project_name}",
json=data,
headers=self.headers,
)
return response
[docs]
def get_projects(self, project_name: Text = None) -> requests.Response:
"""
This checks and gets the projects available
:param project_name: Name of the project to get
:return: Returns HTTP response
"""
if not project_name:
response = requests.get(
f"https://api.cloudflare.com/client/v4/accounts/{self.account_id}/pages/projects", headers=self.headers
)
else:
response = requests.get(
f"https://api.cloudflare.com/client/v4/accounts/{self.account_id}/pages/projects/{project_name}",
headers=self.headers,
)
return response
[docs]
def current_version(self, project_name: Text = None) -> Union[str, None]:
"""
Gets the current Hugo version
:param project_name: Name of the project to check from
"""
response = requests.get(
f"https://api.cloudflare.com/client/v4/accounts/{self.account_id}/pages/projects/{project_name}",
headers=self.headers,
)
data = response.json()
try:
return data["result"]["deployment_configs"]["production"]["env_vars"]["HUGO_VERSION"]["value"]
except KeyError as e:
log.debug(e)
return None