mirror of
https://github.com/timothymiller/cloudflare-ddns.git
synced 2026-03-21 14:38:56 -03:00
Change default IPv4 provider to ipify
Update README and tests to reflect new defaults Bump actions/checkout to v6, replace linux/arm/v7 with linux/ppc64le in the Docker build, and normalize tag quoting in the GitHub workflow
This commit is contained in:
4
.github/workflows/image.yml
vendored
4
.github/workflows/image.yml
vendored
@@ -4,7 +4,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches: master
|
branches: master
|
||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- "v*"
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -12,7 +12,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ At least one of `DOMAINS`, `IP4_DOMAINS`, `IP6_DOMAINS`, or `WAF_LISTS` must be
|
|||||||
|
|
||||||
| Variable | Default | Description |
|
| Variable | Default | Description |
|
||||||
|----------|---------|-------------|
|
|----------|---------|-------------|
|
||||||
| `IP4_PROVIDER` | `cloudflare.trace` | IPv4 detection method |
|
| `IP4_PROVIDER` | `ipify` | IPv4 detection method |
|
||||||
| `IP6_PROVIDER` | `cloudflare.trace` | IPv6 detection method |
|
| `IP6_PROVIDER` | `cloudflare.trace` | IPv6 detection method |
|
||||||
|
|
||||||
Available providers:
|
Available providers:
|
||||||
@@ -195,7 +195,7 @@ Heartbeats are sent after each update cycle. On failure, a fail signal is sent.
|
|||||||
| `DOMAINS` | — | 🌐 Domains for both IPv4 and IPv6 |
|
| `DOMAINS` | — | 🌐 Domains for both IPv4 and IPv6 |
|
||||||
| `IP4_DOMAINS` | — | 4️⃣ IPv4-only domains |
|
| `IP4_DOMAINS` | — | 4️⃣ IPv4-only domains |
|
||||||
| `IP6_DOMAINS` | — | 6️⃣ IPv6-only domains |
|
| `IP6_DOMAINS` | — | 6️⃣ IPv6-only domains |
|
||||||
| `IP4_PROVIDER` | `cloudflare.trace` | 🔍 IPv4 detection provider |
|
| `IP4_PROVIDER` | `ipify` | 🔍 IPv4 detection provider |
|
||||||
| `IP6_PROVIDER` | `cloudflare.trace` | 🔍 IPv6 detection provider |
|
| `IP6_PROVIDER` | `cloudflare.trace` | 🔍 IPv6 detection provider |
|
||||||
| `UPDATE_CRON` | `@every 5m` | ⏱️ Update schedule |
|
| `UPDATE_CRON` | `@every 5m` | ⏱️ Update schedule |
|
||||||
| `UPDATE_ON_START` | `true` | 🚀 Update on startup |
|
| `UPDATE_ON_START` | `true` | 🚀 Update on startup |
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
BASH_DIR=$(dirname $(realpath "${BASH_SOURCE}"))
|
BASH_DIR=$(dirname $(realpath "${BASH_SOURCE}"))
|
||||||
VERSION=$(grep '^version' ${BASH_DIR}/../Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
|
VERSION=$(grep '^version' ${BASH_DIR}/../Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
|
||||||
docker buildx build \
|
docker buildx build \
|
||||||
--platform linux/amd64,linux/arm64,linux/arm/v7 \
|
--platform linux/amd64,linux/arm64,linux/ppc64le \
|
||||||
--tag timothyjmiller/cloudflare-ddns:latest \
|
--tag timothyjmiller/cloudflare-ddns:latest \
|
||||||
--tag timothyjmiller/cloudflare-ddns:${VERSION} \
|
--tag timothyjmiller/cloudflare-ddns:${VERSION} \
|
||||||
--push ${BASH_DIR}/../
|
--push ${BASH_DIR}/../
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ fn read_providers_from_env(ppfmt: &PP) -> Result<HashMap<IpType, ProviderType>,
|
|||||||
let ip4_provider = match ip4_str {
|
let ip4_provider = match ip4_str {
|
||||||
Some(s) => ProviderType::parse(&s)
|
Some(s) => ProviderType::parse(&s)
|
||||||
.map_err(|e| format!("Invalid IP4_PROVIDER: {e}"))?,
|
.map_err(|e| format!("Invalid IP4_PROVIDER: {e}"))?,
|
||||||
None => ProviderType::CloudflareTrace { url: None },
|
None => ProviderType::Ipify,
|
||||||
};
|
};
|
||||||
|
|
||||||
let ip6_provider = match ip6_str {
|
let ip6_provider = match ip6_str {
|
||||||
@@ -1429,12 +1429,12 @@ mod tests {
|
|||||||
let pp = PP::new(false, true);
|
let pp = PP::new(false, true);
|
||||||
let providers = read_providers_from_env(&pp).unwrap();
|
let providers = read_providers_from_env(&pp).unwrap();
|
||||||
drop(g);
|
drop(g);
|
||||||
// Both default to CloudflareTrace, so both V4 and V6 are present.
|
// V4 defaults to Ipify, V6 defaults to CloudflareTrace.
|
||||||
assert!(providers.contains_key(&IpType::V4));
|
assert!(providers.contains_key(&IpType::V4));
|
||||||
assert!(providers.contains_key(&IpType::V6));
|
assert!(providers.contains_key(&IpType::V6));
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
providers[&IpType::V4],
|
providers[&IpType::V4],
|
||||||
ProviderType::CloudflareTrace { url: None }
|
ProviderType::Ipify
|
||||||
));
|
));
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
providers[&IpType::V6],
|
providers[&IpType::V6],
|
||||||
|
|||||||
@@ -314,6 +314,7 @@ impl LegacyDdnsClient {
|
|||||||
&mut warnings.shown_ipv4,
|
&mut warnings.shown_ipv4,
|
||||||
&mut warnings.shown_ipv4_secondary,
|
&mut warnings.shown_ipv4_secondary,
|
||||||
"IPv4",
|
"IPv4",
|
||||||
|
true,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
if a.is_none() && purge_unknown_records {
|
if a.is_none() && purge_unknown_records {
|
||||||
@@ -337,6 +338,7 @@ impl LegacyDdnsClient {
|
|||||||
&mut warnings.shown_ipv6,
|
&mut warnings.shown_ipv6,
|
||||||
&mut warnings.shown_ipv6_secondary,
|
&mut warnings.shown_ipv6_secondary,
|
||||||
"IPv6",
|
"IPv6",
|
||||||
|
false,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
if aaaa.is_none() && purge_unknown_records {
|
if aaaa.is_none() && purge_unknown_records {
|
||||||
@@ -362,6 +364,7 @@ impl LegacyDdnsClient {
|
|||||||
shown_primary: &mut bool,
|
shown_primary: &mut bool,
|
||||||
shown_secondary: &mut bool,
|
shown_secondary: &mut bool,
|
||||||
label: &str,
|
label: &str,
|
||||||
|
expect_v4: bool,
|
||||||
) -> Option<String> {
|
) -> Option<String> {
|
||||||
for (i, url) in urls.iter().enumerate() {
|
for (i, url) in urls.iter().enumerate() {
|
||||||
match self.client.get(url).send().await {
|
match self.client.get(url).send().await {
|
||||||
@@ -369,6 +372,17 @@ impl LegacyDdnsClient {
|
|||||||
if let Some(ip) =
|
if let Some(ip) =
|
||||||
crate::provider::parse_trace_ip(&resp.text().await.unwrap_or_default())
|
crate::provider::parse_trace_ip(&resp.text().await.unwrap_or_default())
|
||||||
{
|
{
|
||||||
|
// Validate the IP matches the expected address family
|
||||||
|
if let Ok(addr) = ip.parse::<std::net::IpAddr>() {
|
||||||
|
if expect_v4 && !addr.is_ipv4() {
|
||||||
|
eprintln!("{label} trace returned IPv6 address, skipping");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if !expect_v4 && !addr.is_ipv6() {
|
||||||
|
eprintln!("{label} trace returned IPv4 address, skipping");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
return Some(ip);
|
return Some(ip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1655,7 +1669,7 @@ mod tests {
|
|||||||
let mut shown_primary = false;
|
let mut shown_primary = false;
|
||||||
let mut shown_secondary = false;
|
let mut shown_secondary = false;
|
||||||
let result = ddns
|
let result = ddns
|
||||||
.try_trace_urls(&ddns.ipv4_urls, &mut shown_primary, &mut shown_secondary, "IPv4")
|
.try_trace_urls(&ddns.ipv4_urls, &mut shown_primary, &mut shown_secondary, "IPv4", true)
|
||||||
.await;
|
.await;
|
||||||
assert_eq!(result, Some("198.51.100.1".to_string()));
|
assert_eq!(result, Some("198.51.100.1".to_string()));
|
||||||
}
|
}
|
||||||
@@ -1685,7 +1699,7 @@ mod tests {
|
|||||||
let mut shown_primary = false;
|
let mut shown_primary = false;
|
||||||
let mut shown_secondary = false;
|
let mut shown_secondary = false;
|
||||||
let result = ddns
|
let result = ddns
|
||||||
.try_trace_urls(&ddns.ipv4_urls, &mut shown_primary, &mut shown_secondary, "IPv4")
|
.try_trace_urls(&ddns.ipv4_urls, &mut shown_primary, &mut shown_secondary, "IPv4", true)
|
||||||
.await;
|
.await;
|
||||||
assert_eq!(result, Some("198.51.100.2".to_string()));
|
assert_eq!(result, Some("198.51.100.2".to_string()));
|
||||||
assert!(shown_primary);
|
assert!(shown_primary);
|
||||||
@@ -1706,7 +1720,7 @@ mod tests {
|
|||||||
let mut shown_primary = false;
|
let mut shown_primary = false;
|
||||||
let mut shown_secondary = false;
|
let mut shown_secondary = false;
|
||||||
let result = ddns
|
let result = ddns
|
||||||
.try_trace_urls(&ddns.ipv4_urls, &mut shown_primary, &mut shown_secondary, "IPv4")
|
.try_trace_urls(&ddns.ipv4_urls, &mut shown_primary, &mut shown_secondary, "IPv4", true)
|
||||||
.await;
|
.await;
|
||||||
assert!(result.is_none());
|
assert!(result.is_none());
|
||||||
assert!(shown_primary);
|
assert!(shown_primary);
|
||||||
|
|||||||
Reference in New Issue
Block a user