XIU2/CloudflareSpeedTest · error

[错误] 缺少配置项 [TTL] !

Error message

[错误] 缺少配置项 [TTL] !

What it means

_READ() requires TTL from cfst_ddns.conf (grep 'TTL=' | awk -F '=' '{print $NF}') and exits 1 at script/cfst_ddns.sh:29 when empty. TTL is embedded unquoted and unvalidated into the JSON payload — "ttl":${TTL} (lines 53/59) — so it must be a bare integer Cloudflare accepts: 1 (automatic) or 60-86400.

Source

Thrown at script/cfst_ddns.sh:29

_READ() {
	[[ ! -e "cfst_ddns.conf" ]] && echo -e "[错误] 配置文件不存在 [cfst_ddns.conf] !" && exit 1
	CONFIG=$(cat "cfst_ddns.conf")
	FOLDER=$(echo "${CONFIG}"|grep 'FOLDER='|awk -F '=' '{print $NF}')
	[[ -z "${FOLDER}" ]] && echo -e "[错误] 缺少配置项 [FOLDER] !" && exit 1
	ZONE_ID=$(echo "${CONFIG}"|grep 'ZONE_ID='|awk -F '=' '{print $NF}')
	[[ -z "${ZONE_ID}" ]] && echo -e "[错误] 缺少配置项 [ZONE_ID] !" && exit 1
	DNS_RECORDS_ID=$(echo "${CONFIG}"|grep 'DNS_RECORDS_ID='|awk -F '=' '{print $NF}')
	[[ -z "${DNS_RECORDS_ID}" ]] && echo -e "[错误] 缺少配置项 [DNS_RECORDS_ID] !" && exit 1
	KEY=$(echo "${CONFIG}"|grep 'KEY='|awk -F '=' '{print $NF}')
	[[ -z "${KEY}" ]] && echo -e "[错误] 缺少配置项 [KEY] !" && exit 1
	EMAIL=$(echo "${CONFIG}"|grep 'EMAIL='|awk -F '=' '{print $NF}')
	[[ -z "${EMAIL}" ]] && echo -e "[信息] 缺少配置项 [EMAIL],由 [API 密钥] 方式转为 [API 令牌] 方式!"
	TYPE=$(echo "${CONFIG}"|grep 'TYPE='|awk -F '=' '{print $NF}')
	[[ -z "${TYPE}" ]] && echo -e "[错误] 缺少配置项 [TYPE] !" && exit 1
	NAME=$(echo "${CONFIG}"|grep 'NAME='|awk -F '=' '{print $NF}')
	[[ -z "${NAME}" ]] && echo -e "[错误] 缺少配置项 [NAME] !" && exit 1
	TTL=$(echo "${CONFIG}"|grep 'TTL='|awk -F '=' '{print $NF}')
	[[ -z "${TTL}" ]] && echo -e "[错误] 缺少配置项 [TTL] !" && exit 1
	PROXIED=$(echo "${CONFIG}"|grep 'PROXIED='|awk -F '=' '{print $NF}')
	[[ -z "${PROXIED}" ]] && echo -e "[错误] 缺少配置项 [PROXIED] !" && exit 1
}

_UPDATE() {
	# 这里可以自己添加、修改 CFST 的运行参数
	./cfst -o "result_ddns.txt"

	# 判断结果文件是否存在,如果不存在说明结果为 0
	[[ ! -e "result_ddns.txt" ]] && echo "CFST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0

	CONTENT=$(sed -n "2,1p" result_ddns.txt | awk -F, '{print $1}')
	if [[ -z "${CONTENT}" ]]; then
		echo "CFST 测速结果 IP 数量为 0,跳过下面步骤..."
		exit 0
	fi
	# 如果 EMAIL 变量是空的,那么就代表要使用 API 令牌方式
	if [[ -n "${EMAIL}" ]]; then

View on GitHub (pinned to 1da0c025d7)

Solutions

  1. Set TTL=1 (Cloudflare automatic TTL) or an integer between 60 and 86400 in cfst_ddns.conf
  2. Do not quote or suffix the value — it is spliced raw into the JSON number position
  3. Re-run the script to finish the _READ checks

Example fix

# cfst_ddns.conf (before)
TTL=
# (after)
TTL=1
Defensive patterns

Strategy: validation

Validate before calling

ttl=$(grep '^TTL=' cfst_ddns.conf | head -1 | cut -d= -f2-)
[[ $ttl =~ ^(1|[6-9][0-9]|[1-9][0-9]{2,3}|86400)$ ]] || { echo "TTL invalid: '$ttl' (use 1 or 60-86400)" >&2; exit 1; }

Type guard

is_valid_ttl(){ [ "$1" -eq "$1" ] 2>/dev/null && { [ "$1" -eq 1 ] || { [ "$1" -ge 60 ] && [ "$1" -le 86400 ]; }; }; }

Prevention

When it happens

Trigger: cfst_ddns.conf has no TTL= line, a commented line, or 'TTL=' with an empty value.

Common situations: Blank template value; user enters a unit like '1h' or the word 'auto' which later makes the PUT return 400 invalid_ttl even though this check passed; user copies TTL from the dashboard (which displays 'Auto') instead of the numeric API value.

Related errors


AI-assisted analysis of XIU2/CloudflareSpeedTest@1da0c025d7 (2026-08-15). Data as JSON: /api/errors/96c107ae7e719975. Report an issue: GitHub.