conf: add ddns-domain options
This commit is contained in:
@@ -291,6 +291,9 @@ log-level info
|
|||||||
# nftset /www.example.com/-, ignore this domain
|
# nftset /www.example.com/-, ignore this domain
|
||||||
# nftset /www.example.com/#6:-, ignore ipv6
|
# nftset /www.example.com/#6:-, ignore ipv6
|
||||||
|
|
||||||
|
# set ddns domain
|
||||||
|
# ddns-domain domain
|
||||||
|
|
||||||
# set domain rules
|
# set domain rules
|
||||||
# domain-rules /domain/ [-speed-check-mode [...]]
|
# domain-rules /domain/ [-speed-check-mode [...]]
|
||||||
# rules:
|
# rules:
|
||||||
|
|||||||
@@ -2839,6 +2839,18 @@ errout:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _conf_ddns_domain(void *data, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if (argc <= 1) {
|
||||||
|
tlog(TLOG_ERROR, "invalid parameter.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *domain = argv[1];
|
||||||
|
_config_domain_rule_flag_set(domain, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int _conf_domain_rule_rr_ttl(const char *domain, int ttl, int ttl_min, int ttl_max)
|
static int _conf_domain_rule_rr_ttl(const char *domain, int ttl, int ttl_min, int ttl_max)
|
||||||
{
|
{
|
||||||
struct dns_ttl_rule *rr_ttl = NULL;
|
struct dns_ttl_rule *rr_ttl = NULL;
|
||||||
@@ -3582,6 +3594,7 @@ static struct config_item _config_item[] = {
|
|||||||
CONF_CUSTOM("edns-client-subnet", _conf_edns_client_subnet, NULL),
|
CONF_CUSTOM("edns-client-subnet", _conf_edns_client_subnet, NULL),
|
||||||
CONF_CUSTOM("domain-rules", _conf_domain_rules, NULL),
|
CONF_CUSTOM("domain-rules", _conf_domain_rules, NULL),
|
||||||
CONF_CUSTOM("domain-set", _conf_domain_set, NULL),
|
CONF_CUSTOM("domain-set", _conf_domain_set, NULL),
|
||||||
|
CONF_CUSTOM("ddns-domain", _conf_ddns_domain, NULL),
|
||||||
CONF_CUSTOM("dnsmasq-lease-file", _conf_dhcp_lease_dnsmasq_file, NULL),
|
CONF_CUSTOM("dnsmasq-lease-file", _conf_dhcp_lease_dnsmasq_file, NULL),
|
||||||
CONF_CUSTOM("hosts-file", _conf_hosts_file, NULL),
|
CONF_CUSTOM("hosts-file", _conf_hosts_file, NULL),
|
||||||
CONF_STRING("ca-file", (char *)&dns_conf_ca_file, DNS_MAX_PATH),
|
CONF_STRING("ca-file", (char *)&dns_conf_ca_file, DNS_MAX_PATH),
|
||||||
|
|||||||
@@ -3630,6 +3630,10 @@ static int _dns_server_get_inet_by_addr(struct sockaddr_storage *localaddr, stru
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ifa == NULL) {
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
freeifaddrs(ifaddr);
|
freeifaddrs(ifaddr);
|
||||||
return 0;
|
return 0;
|
||||||
errout:
|
errout:
|
||||||
@@ -6175,7 +6179,9 @@ static int _dns_server_process_tls(struct dns_server_conn_tls_client *tls_client
|
|||||||
} else {
|
} else {
|
||||||
unsigned long ssl_err = ERR_get_error();
|
unsigned long ssl_err = ERR_get_error();
|
||||||
int ssl_reason = ERR_GET_REASON(ssl_err);
|
int ssl_reason = ERR_GET_REASON(ssl_err);
|
||||||
tlog(TLOG_DEBUG, "Handshake with %s failed, error no: %s(%d, %d, %d)\n", "",
|
char name[DNS_MAX_CNAME_LEN];
|
||||||
|
tlog(TLOG_DEBUG, "Handshake with %s failed, error no: %s(%d, %d, %d)\n",
|
||||||
|
get_host_by_addr(name, sizeof(name), (struct sockaddr *)&tls_client->addr),
|
||||||
ERR_reason_error_string(ssl_err), ret, ssl_ret, ssl_reason);
|
ERR_reason_error_string(ssl_err), ret, ssl_ret, ssl_reason);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|||||||
124
test/cases/test-ddns.cc
Normal file
124
test/cases/test-ddns.cc
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018-2023 Ruilin Peng (Nick) <pymumu@gmail.com>.
|
||||||
|
*
|
||||||
|
* smartdns is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* smartdns is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "dns.h"
|
||||||
|
#include "include/utils.h"
|
||||||
|
#include "server.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
class DDNS : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp() {}
|
||||||
|
virtual void TearDown() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(DDNS, smartdns)
|
||||||
|
{
|
||||||
|
smartdns::MockServer server_upstream;
|
||||||
|
smartdns::Server server;
|
||||||
|
|
||||||
|
server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
|
||||||
|
return smartdns::SERVER_REQUEST_SOA;
|
||||||
|
});
|
||||||
|
|
||||||
|
server.Start(R"""(bind [::]:60053
|
||||||
|
server 127.0.0.1:61053
|
||||||
|
log-num 0
|
||||||
|
log-console yes
|
||||||
|
dualstack-ip-selection no
|
||||||
|
log-level debug
|
||||||
|
cache-persist no)""");
|
||||||
|
smartdns::Client client;
|
||||||
|
ASSERT_TRUE(client.Query("smartdns A", 60053));
|
||||||
|
std::cout << client.GetResult() << std::endl;
|
||||||
|
ASSERT_EQ(client.GetAnswerNum(), 1);
|
||||||
|
EXPECT_EQ(client.GetStatus(), "NOERROR");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetName(), "smartdns");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetData(), "127.0.0.1");
|
||||||
|
|
||||||
|
ASSERT_TRUE(client.Query("smartdns AAAA", 60053));
|
||||||
|
std::cout << client.GetResult() << std::endl;
|
||||||
|
ASSERT_EQ(client.GetAnswerNum(), 1);
|
||||||
|
EXPECT_EQ(client.GetStatus(), "NOERROR");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetName(), "smartdns");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetData(), "::1");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(DDNS, ddns)
|
||||||
|
{
|
||||||
|
smartdns::MockServer server_upstream;
|
||||||
|
smartdns::Server server;
|
||||||
|
|
||||||
|
server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
|
||||||
|
return smartdns::SERVER_REQUEST_SOA;
|
||||||
|
});
|
||||||
|
|
||||||
|
server.Start(R"""(bind [::]:60053
|
||||||
|
server 127.0.0.1:61053
|
||||||
|
log-num 0
|
||||||
|
ddns-domain test.ddns.com
|
||||||
|
ddns-domain test.ddns.org
|
||||||
|
log-console yes
|
||||||
|
dualstack-ip-selection no
|
||||||
|
log-level debug
|
||||||
|
cache-persist no)""");
|
||||||
|
smartdns::Client client;
|
||||||
|
ASSERT_TRUE(client.Query("test.ddns.com A", 60053));
|
||||||
|
std::cout << client.GetResult() << std::endl;
|
||||||
|
ASSERT_EQ(client.GetAnswerNum(), 1);
|
||||||
|
EXPECT_EQ(client.GetStatus(), "NOERROR");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetName(), "test.ddns.com");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetData(), "127.0.0.1");
|
||||||
|
|
||||||
|
ASSERT_TRUE(client.Query("test.ddns.com AAAA", 60053));
|
||||||
|
std::cout << client.GetResult() << std::endl;
|
||||||
|
ASSERT_EQ(client.GetAnswerNum(), 1);
|
||||||
|
EXPECT_EQ(client.GetStatus(), "NOERROR");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetName(), "test.ddns.com");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetData(), "::1");
|
||||||
|
|
||||||
|
ASSERT_TRUE(client.Query("test.ddns.org A", 60053));
|
||||||
|
std::cout << client.GetResult() << std::endl;
|
||||||
|
ASSERT_EQ(client.GetAnswerNum(), 1);
|
||||||
|
EXPECT_EQ(client.GetStatus(), "NOERROR");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetName(), "test.ddns.org");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetData(), "127.0.0.1");
|
||||||
|
|
||||||
|
ASSERT_TRUE(client.Query("test.ddns.org AAAA", 60053));
|
||||||
|
std::cout << client.GetResult() << std::endl;
|
||||||
|
ASSERT_EQ(client.GetAnswerNum(), 1);
|
||||||
|
EXPECT_EQ(client.GetStatus(), "NOERROR");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetName(), "test.ddns.org");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
|
||||||
|
EXPECT_EQ(client.GetAnswer()[0].GetData(), "::1");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user