Pull request 1992: 3701-fallback-dns-check

Squashed commit of the following:

commit a5191def0b950cb7ab1ea737e9c8c6e8b65ec720
Merge: 7d127bfca 5bd452516
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date:   Wed Sep 6 12:21:08 2023 +0300

    Merge branch 'master' into 3701-fallback-dns-check

commit 7d127bfca54ac940c611681e6f48b89881491602
Author: Ildar Kamalov <ik@adguard.com>
Date:   Tue Sep 5 13:21:35 2023 +0300

    client: add fallback_dns to the upstream test

commit 970da7215503b5f05c53fcad47c715a96d9fc3c4
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date:   Mon Sep 4 19:23:35 2023 +0300

    all: add fallback dns check
This commit is contained in:
Stanislav Chzhen 2023-09-06 12:29:45 +03:00
parent 5bd4525161
commit 581891af22
5 changed files with 54 additions and 10 deletions

View File

@ -343,7 +343,12 @@ export const testUpstreamFailure = createAction('TEST_UPSTREAM_FAILURE');
export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS'); export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS');
export const testUpstream = ( export const testUpstream = (
{ bootstrap_dns, upstream_dns, local_ptr_upstreams }, upstream_dns_file, {
bootstrap_dns,
upstream_dns,
local_ptr_upstreams,
fallback_dns,
}, upstream_dns_file,
) => async (dispatch) => { ) => async (dispatch) => {
dispatch(testUpstreamRequest()); dispatch(testUpstreamRequest());
try { try {
@ -352,6 +357,7 @@ export const testUpstream = (
const config = { const config = {
bootstrap_dns: splitByNewLine(bootstrap_dns), bootstrap_dns: splitByNewLine(bootstrap_dns),
private_upstream: splitByNewLine(local_ptr_upstreams), private_upstream: splitByNewLine(local_ptr_upstreams),
fallback_dns: splitByNewLine(fallback_dns),
...(upstream_dns_file ? null : { ...(upstream_dns_file ? null : {
upstream_dns: removeComments(upstream_dns), upstream_dns: removeComments(upstream_dns),
}), }),
@ -386,12 +392,14 @@ export const testUpstreamWithFormValues = () => async (dispatch, getState) => {
bootstrap_dns, bootstrap_dns,
upstream_dns, upstream_dns,
local_ptr_upstreams, local_ptr_upstreams,
fallback_dns,
} = getState().form[FORM_NAME.UPSTREAM].values; } = getState().form[FORM_NAME.UPSTREAM].values;
return dispatch(testUpstream({ return dispatch(testUpstream({
bootstrap_dns, bootstrap_dns,
upstream_dns, upstream_dns,
local_ptr_upstreams, local_ptr_upstreams,
fallback_dns,
}, upstream_dns_file)); }, upstream_dns_file));
}; };

View File

@ -392,6 +392,7 @@ func (s *Server) setConfigRestartable(dc *jsonDNSConfig) (shouldRestart bool) {
type upstreamJSON struct { type upstreamJSON struct {
Upstreams []string `json:"upstream_dns"` Upstreams []string `json:"upstream_dns"`
BootstrapDNS []string `json:"bootstrap_dns"` BootstrapDNS []string `json:"bootstrap_dns"`
FallbackDNS []string `json:"fallback_dns"`
PrivateUpstreams []string `json:"private_upstream"` PrivateUpstreams []string `json:"private_upstream"`
} }
@ -750,11 +751,10 @@ func (s *Server) handleTestUpstreamDNS(w http.ResponseWriter, r *http.Request) {
req.Upstreams = stringutil.FilterOut(req.Upstreams, IsCommentOrEmpty) req.Upstreams = stringutil.FilterOut(req.Upstreams, IsCommentOrEmpty)
req.PrivateUpstreams = stringutil.FilterOut(req.PrivateUpstreams, IsCommentOrEmpty) req.PrivateUpstreams = stringutil.FilterOut(req.PrivateUpstreams, IsCommentOrEmpty)
upsNum := len(req.Upstreams) + len(req.PrivateUpstreams) upsNum := len(req.Upstreams) + len(req.FallbackDNS) + len(req.PrivateUpstreams)
result := make(map[string]string, upsNum) result := make(map[string]string, upsNum)
resCh := make(chan upsCheckResult, upsNum) resCh := make(chan upsCheckResult, upsNum)
// TODO(s.chzhen): Check fallback DNS servers.
for _, ups := range req.Upstreams { for _, ups := range req.Upstreams {
go func(ups string) { go func(ups string) {
resCh <- upsCheckResult{ resCh <- upsCheckResult{
@ -763,6 +763,14 @@ func (s *Server) handleTestUpstreamDNS(w http.ResponseWriter, r *http.Request) {
} }
}(ups) }(ups)
} }
for _, ups := range req.FallbackDNS {
go func(ups string) {
resCh <- upsCheckResult{
host: ups,
err: s.checkDNS(ups, opts, checkDNSUpstreamExc),
}
}(ups)
}
for _, ups := range req.PrivateUpstreams { for _, ups := range req.PrivateUpstreams {
go func(ups string) { go func(ups string) {
resCh <- upsCheckResult{ resCh <- upsCheckResult{

View File

@ -560,6 +560,23 @@ func TestServer_HandleTestUpstreamDNS(t *testing.T) {
hostsUps: "OK", hostsUps: "OK",
}, },
name: "etc_hosts", name: "etc_hosts",
}, {
body: map[string]any{
"fallback_dns": []string{goodUps},
},
wantResp: map[string]any{
goodUps: "OK",
},
name: "fallback_success",
}, {
body: map[string]any{
"fallback_dns": []string{badUps},
},
wantResp: map[string]any{
badUps: `couldn't communicate with upstream: exchanging with ` +
badUps + ` over tcp: dns: id mismatch`,
},
name: "fallback_broken",
}} }}
for _, tc := range testCases { for _, tc := range testCases {

View File

@ -6,6 +6,11 @@
## v0.107.37: API changes ## v0.107.37: API changes
### The new field `"fallback_dns"` in `UpstreamsConfig` object
* The new field `"fallback_dns"` in `POST /control/test_upstream_dns` is the
list of fallback DNS servers to test.
### The new field `"fallback_dns"` in `DNSConfig` object ### The new field `"fallback_dns"` in `DNSConfig` object
* The new field `"fallback_dns"` in `GET /control/dns_info` and `POST * The new field `"fallback_dns"` in `GET /control/dns_info` and `POST

View File

@ -1503,7 +1503,7 @@
- 'tls://1.0.0.1' - 'tls://1.0.0.1'
'UpstreamsConfig': 'UpstreamsConfig':
'type': 'object' 'type': 'object'
'description': 'Upstreams configuration' 'description': 'Upstream configuration to be tested'
'required': 'required':
- 'bootstrap_dns' - 'bootstrap_dns'
- 'upstream_dns' - 'upstream_dns'
@ -1511,8 +1511,7 @@
'bootstrap_dns': 'bootstrap_dns':
'type': 'array' 'type': 'array'
'description': > 'description': >
Bootstrap servers, port is optional after colon. Empty value will Bootstrap DNS servers, port is optional after colon.
reset it to default values.
'items': 'items':
'type': 'string' 'type': 'string'
'example': 'example':
@ -1521,18 +1520,25 @@
'upstream_dns': 'upstream_dns':
'type': 'array' 'type': 'array'
'description': > 'description': >
Upstream servers, port is optional after colon. Empty value will Upstream DNS servers, port is optional after colon.
reset it to default values.
'items': 'items':
'type': 'string' 'type': 'string'
'example': 'example':
- 'tls://1.1.1.1' - 'tls://1.1.1.1'
- 'tls://1.0.0.1' - 'tls://1.0.0.1'
'fallback_dns':
'type': 'array'
'description': >
Fallback DNS servers, port is optional after colon.
'items':
'type': 'string'
'example':
- '8.8.8.8'
- '1.1.1.1:53'
'private_upstream': 'private_upstream':
'type': 'array' 'type': 'array'
'description': > 'description': >
Local PTR resolvers, port is optional after colon. Empty value will Local PTR resolvers, port is optional after colon.
reset it to default values.
'items': 'items':
'type': 'string' 'type': 'string'
'example': 'example':