Compare commits
2 Commits
v0.108.0-b
...
AG-21485
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
521aedc5bc | ||
|
|
40ff26ea21 |
134
.github/ISSUE_TEMPLATE/bug.yml
vendored
134
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -10,60 +10,52 @@
|
|||||||
- 'label': >
|
- 'label': >
|
||||||
I have checked the
|
I have checked the
|
||||||
[Wiki](https://github.com/AdguardTeam/AdGuardHome/wiki) and
|
[Wiki](https://github.com/AdguardTeam/AdGuardHome/wiki) and
|
||||||
[Discussions](https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a)
|
[Discussions](https://github.com/AdguardTeam/AdGuardHome/discussions)
|
||||||
and found no answer
|
and found no answer
|
||||||
'required': true
|
'required': true
|
||||||
- 'label': >
|
- 'label': >
|
||||||
I have searched other issues and found no duplicates
|
I have searched other issues and found no duplicates
|
||||||
'required': true
|
'required': true
|
||||||
- 'label': >
|
- 'label': >
|
||||||
I want to report a bug and not [ask a question or ask for
|
I want to report a bug and not ask a question
|
||||||
help](https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a)
|
|
||||||
'required': true
|
|
||||||
- 'label': >
|
|
||||||
I have set up AdGuard Home correctly and [configured clients to
|
|
||||||
use it](https://github.com/AdguardTeam/AdGuardHome/wiki/Clients).
|
|
||||||
(Use the
|
|
||||||
[Discussions](https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a)
|
|
||||||
for help with installing and configuring clients.)
|
|
||||||
'required': true
|
'required': true
|
||||||
'id': 'prerequisites'
|
'id': 'prerequisites'
|
||||||
'type': 'checkboxes'
|
'type': 'checkboxes'
|
||||||
- 'attributes':
|
- 'attributes':
|
||||||
'description': 'On which Platform does the issue occur?'
|
'description': 'On which operating system type does the issue occur?'
|
||||||
'label': 'Platform (OS and CPU architecture)'
|
'label': 'Operating system type'
|
||||||
# NOTE: Keep the 386 at the bottom for each OS, because a lot of people
|
|
||||||
# Seem to confuse them with AMD64, which is what they actually need.
|
|
||||||
'options':
|
'options':
|
||||||
- 'Darwin (aka macOS), AMD64 (aka x86_64)'
|
- 'FreeBSD'
|
||||||
- 'Darwin (aka macOS), ARM64'
|
- 'Linux, OpenWrt'
|
||||||
- 'FreeBSD, AMD64 (aka x86_64)'
|
- 'Linux, Other (please mention the version in the description)'
|
||||||
- 'FreeBSD, ARM64'
|
- 'macOS (aka Darwin)'
|
||||||
- 'FreeBSD, ARMv5'
|
- 'OpenBSD'
|
||||||
- 'FreeBSD, ARMv6'
|
- 'Windows'
|
||||||
- 'FreeBSD, ARMv7'
|
- 'Other (please mention in the description)'
|
||||||
- 'FreeBSD, 32-bit Intel (aka 386)'
|
|
||||||
- 'Linux, AMD64 (aka x86_64)'
|
|
||||||
- 'Linux, ARM64'
|
|
||||||
- 'Linux, ARMv5'
|
|
||||||
- 'Linux, ARMv6'
|
|
||||||
- 'Linux, ARMv7'
|
|
||||||
- 'Linux, MIPS LE'
|
|
||||||
- 'Linux, MIPS'
|
|
||||||
- 'Linux, MIPS64 LE'
|
|
||||||
- 'Linux, MIPS64'
|
|
||||||
- 'Linux, PPC64 LE'
|
|
||||||
- 'Linux, 32-bit Intel (aka 386)'
|
|
||||||
- 'OpenBSD, AMD64 (aka x86_64)'
|
|
||||||
- 'OpenBSD, ARM64'
|
|
||||||
- 'Windows, AMD64 (aka x86_64)'
|
|
||||||
- 'Windows, ARM64'
|
|
||||||
- 'Windows, 32-bit Intel (aka 386)'
|
|
||||||
- 'Custom (please mention in the description)'
|
|
||||||
'id': 'os'
|
'id': 'os'
|
||||||
'type': 'dropdown'
|
'type': 'dropdown'
|
||||||
'validations':
|
'validations':
|
||||||
'required': true
|
'required': true
|
||||||
|
- 'attributes':
|
||||||
|
'description': 'On which CPU architecture does the issue occur?'
|
||||||
|
'label': 'CPU architecture'
|
||||||
|
'options':
|
||||||
|
- 'AMD64'
|
||||||
|
- 'x86'
|
||||||
|
- '64-bit ARM'
|
||||||
|
- 'ARMv5'
|
||||||
|
- 'ARMv6'
|
||||||
|
- 'ARMv7'
|
||||||
|
- '64-bit MIPS'
|
||||||
|
- '64-bit MIPS LE'
|
||||||
|
- '32-bit MIPS'
|
||||||
|
- '32-bit MIPS LE'
|
||||||
|
- '64-bit PowerPC LE'
|
||||||
|
- 'Other (please mention in the description)'
|
||||||
|
'id': 'arch'
|
||||||
|
'type': 'dropdown'
|
||||||
|
'validations':
|
||||||
|
'required': true
|
||||||
- 'attributes':
|
- 'attributes':
|
||||||
'description': 'How did you install AdGuard Home?'
|
'description': 'How did you install AdGuard Home?'
|
||||||
'label': 'Installation'
|
'label': 'Installation'
|
||||||
@@ -71,7 +63,7 @@
|
|||||||
- 'GitHub releases or script from README'
|
- 'GitHub releases or script from README'
|
||||||
- 'Docker'
|
- 'Docker'
|
||||||
- 'Snapcraft'
|
- 'Snapcraft'
|
||||||
- 'Custom package (OpenWrt, HomeAssistant, etc; please mention in the description)'
|
- 'Custom port'
|
||||||
- 'Other (please mention in the description)'
|
- 'Other (please mention in the description)'
|
||||||
'id': 'install'
|
'id': 'install'
|
||||||
'type': 'dropdown'
|
'type': 'dropdown'
|
||||||
@@ -97,57 +89,21 @@
|
|||||||
'validations':
|
'validations':
|
||||||
'required': true
|
'required': true
|
||||||
- 'attributes':
|
- 'attributes':
|
||||||
'description': >
|
'description': 'Please describe the bug'
|
||||||
Please describe what you did. An `nslookup` or a `dig` command is
|
'label': 'Description'
|
||||||
the best way. For crashes, please provide a full failure log.
|
|
||||||
'label': 'Action'
|
|
||||||
'value': |
|
'value': |
|
||||||
```sh
|
#### What did you do?
|
||||||
nslookup -debug -type=a 'www.example.com' '$YOUR_AGH_ADDRESS'
|
|
||||||
```
|
#### Expected result
|
||||||
'id': 'failing_action'
|
|
||||||
|
#### Actual result
|
||||||
|
|
||||||
|
#### Screenshots (if applicable)
|
||||||
|
|
||||||
|
#### Additional information
|
||||||
|
'id': 'description'
|
||||||
'type': 'textarea'
|
'type': 'textarea'
|
||||||
'validations':
|
'validations':
|
||||||
'required': true
|
'required': true
|
||||||
- 'attributes':
|
'description': 'File a bug report'
|
||||||
'description': >
|
|
||||||
What did you expect to see? Please add a description and/or
|
|
||||||
screenshots, if applicable.
|
|
||||||
'label': 'Expected result'
|
|
||||||
'placeholder': >
|
|
||||||
What did you expect to see?
|
|
||||||
'id': 'expected'
|
|
||||||
'type': 'textarea'
|
|
||||||
'validations':
|
|
||||||
'required': true
|
|
||||||
- 'attributes':
|
|
||||||
'description': >
|
|
||||||
What happened instead? Please add a description and/or screenshots,
|
|
||||||
if applicable.
|
|
||||||
'label': 'Actual result'
|
|
||||||
'placeholder': >
|
|
||||||
What did you see instead?
|
|
||||||
'id': 'result'
|
|
||||||
'type': 'textarea'
|
|
||||||
'validations':
|
|
||||||
'required': true
|
|
||||||
- 'attributes':
|
|
||||||
'description': >
|
|
||||||
Please add additional information, such as non-standard OS or port,
|
|
||||||
here. You can also put screenshots here, if applicable. For
|
|
||||||
example, it is better to copy and paste text from a terminal instead
|
|
||||||
of posting a screenshot of the terminal.
|
|
||||||
'label': 'Additional information and/or screenshots'
|
|
||||||
'placeholder': >
|
|
||||||
Additional OS information, screenshots of the UI, etc.
|
|
||||||
'id': 'additional'
|
|
||||||
'type': 'textarea'
|
|
||||||
'validations':
|
|
||||||
'required': false
|
|
||||||
# NOTE: GitHub limits the description length to 200 characters. Also, Markdown
|
|
||||||
# doesn't work here.
|
|
||||||
'description': |
|
|
||||||
For help, use the Discussions section instead. Write the title in English
|
|
||||||
to make it easier for other people to search for duplicates. (Any language
|
|
||||||
is fine in the body.)
|
|
||||||
'name': 'Bug'
|
'name': 'Bug'
|
||||||
|
|||||||
41
.github/ISSUE_TEMPLATE/feature.yml
vendored
41
.github/ISSUE_TEMPLATE/feature.yml
vendored
@@ -23,36 +23,19 @@
|
|||||||
'id': 'prerequisites'
|
'id': 'prerequisites'
|
||||||
'type': 'checkboxes'
|
'type': 'checkboxes'
|
||||||
- 'attributes':
|
- 'attributes':
|
||||||
'description': 'Please describe the problem you are trying to solve'
|
'description': 'Please describe the request'
|
||||||
'label': 'The problem'
|
'label': 'Description'
|
||||||
'placeholder': >
|
'value': |
|
||||||
Please describe the problem you are trying to solve
|
#### What problem are you trying to solve?
|
||||||
'id': 'problem'
|
|
||||||
|
#### Proposed solution
|
||||||
|
|
||||||
|
#### Alternatives considered
|
||||||
|
|
||||||
|
#### Additional information
|
||||||
|
'id': 'description'
|
||||||
'type': 'textarea'
|
'type': 'textarea'
|
||||||
'validations':
|
'validations':
|
||||||
'required': true
|
'required': true
|
||||||
- 'attributes':
|
'description': 'Suggest a feature or an enhancement for AdGuard Home'
|
||||||
'description': 'What feature are you proposing to solve this problem?'
|
|
||||||
'label': 'Proposed solution'
|
|
||||||
'placeholder': >
|
|
||||||
What feature are you proposing to solve this problem?
|
|
||||||
'id': 'proposed_solution'
|
|
||||||
'type': 'textarea'
|
|
||||||
'validations':
|
|
||||||
'required': true
|
|
||||||
- 'attributes':
|
|
||||||
'label': 'Alternatives considered and additional information'
|
|
||||||
'placeholder': >
|
|
||||||
Are there any other ways to solve the problem?
|
|
||||||
'id': 'additional'
|
|
||||||
'type': 'textarea'
|
|
||||||
'validations':
|
|
||||||
'required': false
|
|
||||||
# NOTE: GitHub limits the description length to 200 characters. Also, Markdown
|
|
||||||
# doesn't work here.
|
|
||||||
'description': |
|
|
||||||
Write the title in English to make it easier for other people to search for
|
|
||||||
duplicates. (Any language is fine in the body.)
|
|
||||||
'labels':
|
|
||||||
- 'feature request'
|
|
||||||
'name': 'Feature request or enhancement'
|
'name': 'Feature request or enhancement'
|
||||||
|
|||||||
20
.github/PULL_REQUEST_TEMPLATE
vendored
20
.github/PULL_REQUEST_TEMPLATE
vendored
@@ -1,20 +0,0 @@
|
|||||||
Before submitting a PR please make sure that:
|
|
||||||
|
|
||||||
1. You have discussed your solution in an issue and have got an
|
|
||||||
approval from a maintainer.
|
|
||||||
|
|
||||||
2. This isn't a localization fix; please send those to our
|
|
||||||
[CrowdIn](https://crowdin.com/project/adguard-applications/en#/adguard-home)
|
|
||||||
page.
|
|
||||||
|
|
||||||
3. Your code follows our
|
|
||||||
[code guidelines](https://github.com/AdguardTeam/CodeGuidelines/blob/master/Go/Go.md).
|
|
||||||
|
|
||||||
Add a short description here. The description should include:
|
|
||||||
|
|
||||||
1. Which issue this PR closes (`Closes #NNNN.`) or updates (`Updates
|
|
||||||
#NNNN.`).
|
|
||||||
|
|
||||||
2. A short description of how the change achieves that.
|
|
||||||
|
|
||||||
Do not forget to remove these instructions.
|
|
||||||
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
'name': 'build'
|
'name': 'build'
|
||||||
|
|
||||||
'env':
|
'env':
|
||||||
'GO_VERSION': '1.20.7'
|
'GO_VERSION': '1.19.8'
|
||||||
'NODE_VERSION': '14'
|
'NODE_VERSION': '14'
|
||||||
|
|
||||||
'on':
|
'on':
|
||||||
|
|||||||
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
'name': 'lint'
|
'name': 'lint'
|
||||||
|
|
||||||
'env':
|
'env':
|
||||||
'GO_VERSION': '1.20.7'
|
'GO_VERSION': '1.19.8'
|
||||||
|
|
||||||
'on':
|
'on':
|
||||||
'push':
|
'push':
|
||||||
|
|||||||
18
.github/workflows/potential-duplicates.yml
vendored
18
.github/workflows/potential-duplicates.yml
vendored
@@ -1,18 +0,0 @@
|
|||||||
'name': 'potential-duplicates'
|
|
||||||
'on':
|
|
||||||
'issues':
|
|
||||||
'types':
|
|
||||||
- 'opened'
|
|
||||||
'jobs':
|
|
||||||
'run':
|
|
||||||
'runs-on': 'ubuntu-latest'
|
|
||||||
'steps':
|
|
||||||
- 'uses': 'wow-actions/potential-duplicates@v1'
|
|
||||||
'with':
|
|
||||||
'GITHUB_TOKEN': '${{ secrets.GITHUB_TOKEN }}'
|
|
||||||
'state': 'all'
|
|
||||||
'threshold': 0.6
|
|
||||||
'comment': |
|
|
||||||
Potential duplicates: {{#issues}}
|
|
||||||
* [#{{ number }}] {{ title }} ({{ accuracy }}%)
|
|
||||||
{{/issues}}
|
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -9,7 +9,6 @@
|
|||||||
*.db
|
*.db
|
||||||
*.log
|
*.log
|
||||||
*.snap
|
*.snap
|
||||||
*.test
|
|
||||||
/agh-backup/
|
/agh-backup/
|
||||||
/bin/
|
/bin/
|
||||||
/build/*
|
/build/*
|
||||||
@@ -17,14 +16,12 @@
|
|||||||
/dist/
|
/dist/
|
||||||
/filtering/tests/filtering.TestLotsOfRules*.pprof
|
/filtering/tests/filtering.TestLotsOfRules*.pprof
|
||||||
/filtering/tests/top-1m.csv
|
/filtering/tests/top-1m.csv
|
||||||
/internal/next/AdGuardHome.yaml
|
|
||||||
/launchpad_credentials
|
/launchpad_credentials
|
||||||
/querylog.json*
|
/querylog.json*
|
||||||
/snapcraft_login
|
/snapcraft_login
|
||||||
AdGuardHome
|
AdGuardHome*
|
||||||
AdGuardHome.exe
|
|
||||||
AdGuardHome.yaml*
|
|
||||||
coverage.txt
|
coverage.txt
|
||||||
|
leases.db
|
||||||
node_modules/
|
node_modules/
|
||||||
|
|
||||||
!/build/gitkeep
|
!/build/gitkeep
|
||||||
|
|||||||
462
CHANGELOG.md
462
CHANGELOG.md
@@ -14,448 +14,20 @@ and this project adheres to
|
|||||||
<!--
|
<!--
|
||||||
## [v0.108.0] - TBA
|
## [v0.108.0] - TBA
|
||||||
|
|
||||||
## [v0.107.37] - 2023-08-16 (APPROX.)
|
## [v0.107.29] - 2023-04-26 (APPROX.)
|
||||||
|
|
||||||
See also the [v0.107.37 GitHub milestone][ms-v0.107.37].
|
See also the [v0.107.29 GitHub milestone][ms-v0.107.29].
|
||||||
|
|
||||||
[ms-v0.107.37]: https://github.com/AdguardTeam/AdGuardHome/milestone/72?closed=1
|
[ms-v0.107.29]: https://github.com/AdguardTeam/AdGuardHome/milestone/65?closed=1
|
||||||
|
|
||||||
NOTE: Add new changes BELOW THIS COMMENT.
|
NOTE: Add new changes BELOW THIS COMMENT.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- IPv6 hints are now filtered in case IPv6 addresses resolving is disabled
|
|
||||||
([#6122]).
|
|
||||||
- The ability to set fallback DNS servers in the configuration file ([#3701]).
|
|
||||||
- While adding or updating blocklists, the title can now be parsed from
|
|
||||||
`! Title:` definition of the blocklist's source ([#6020]).
|
|
||||||
- The ability to filter DNS HTTPS records including IPv4/v6 hints ([#6053]).
|
|
||||||
- Two new metrics showing total number of responses from each upstream DNS
|
|
||||||
server and their average processing time in the Web UI ([#1453]).
|
|
||||||
- The ability to set the port for the `pprof` debug API, see configuration
|
|
||||||
changes below.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- `$dnsrewrite` rules containing IPv4-mapped IPv6 addresses are now working
|
|
||||||
consistently with legacy DNS rewrites and match the `AAAA` requests.
|
|
||||||
- For non-A and non-AAAA requests, which has been filtered, the NODATA response
|
|
||||||
is returned if the blocking mode isn't set to `Null IP`. In previous versions
|
|
||||||
it returned NXDOMAIN response in such cases.
|
|
||||||
|
|
||||||
#### Configuration Changes
|
|
||||||
|
|
||||||
In this release, the schema version has changed from 24 to 25.
|
|
||||||
|
|
||||||
- Property `debug_pprof` which used to setup profiling HTTP handler, is now
|
|
||||||
moved to the new `pprof` object under `http` section. The new object contains
|
|
||||||
properties `enabled` and `port`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'debug_pprof': true
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'http':
|
|
||||||
'pprof':
|
|
||||||
'enabled': true
|
|
||||||
'port': 6060
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that the new default `6060` is used as default. To rollback this change,
|
|
||||||
remove the new object `pprof`, set back `debug_pprof`, and change the
|
|
||||||
`schema_version` back to `24`.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Occasional DNS-over-QUIC and DNS-over-HTTP/3 errors ([#6133]).
|
|
||||||
- Legacy DNS rewrites containing IPv4-mapped IPv6 addresses are now matching the
|
|
||||||
`AAAA` requests, not `A` ([#6050]).
|
|
||||||
- File log configuration, such as `max_size`, being ignored ([#6093]).
|
|
||||||
- Panic on using a single-slash filtering rule.
|
|
||||||
- Panic on shutting down while DNS requests are in process of filtering
|
|
||||||
([#5948]).
|
|
||||||
|
|
||||||
[#1453]: https://github.com/AdguardTeam/AdGuardHome/issues/1453
|
|
||||||
[#3701]: https://github.com/AdguardTeam/AdGuardHome/issues/3701
|
|
||||||
[#5948]: https://github.com/AdguardTeam/AdGuardHome/issues/5948
|
|
||||||
[#6020]: https://github.com/AdguardTeam/AdGuardHome/issues/6020
|
|
||||||
[#6050]: https://github.com/AdguardTeam/AdGuardHome/issues/6050
|
|
||||||
[#6053]: https://github.com/AdguardTeam/AdGuardHome/issues/6053
|
|
||||||
[#6093]: https://github.com/AdguardTeam/AdGuardHome/issues/6093
|
|
||||||
[#6122]: https://github.com/AdguardTeam/AdGuardHome/issues/6122
|
|
||||||
[#6133]: https://github.com/AdguardTeam/AdGuardHome/issues/6133
|
|
||||||
|
|
||||||
<!--
|
|
||||||
NOTE: Add new changes ABOVE THIS COMMENT.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.36] - 2023-08-02
|
|
||||||
|
|
||||||
See also the [v0.107.36 GitHub milestone][ms-v0.107.36].
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Go version has been updated to prevent the possibility of exploiting the
|
|
||||||
CVE-2023-29409 Go vulnerability fixed in [Go 1.20.7][go-1.20.7].
|
|
||||||
|
|
||||||
### Deprecated
|
|
||||||
|
|
||||||
- Go 1.20 support. Future versions will require at least Go 1.21 to build.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Inability to block queries for the root domain, such as `NS .` queries, using
|
|
||||||
the *Disallowed domains* feature on the *DNS settings* page ([#6049]). Users
|
|
||||||
who want to block `.` queries should use the `|.^` AdBlock rule or a similar
|
|
||||||
regular expression.
|
|
||||||
- Client hostnames not resolving when upstream server responds with zero-TTL
|
|
||||||
records ([#6046]).
|
|
||||||
|
|
||||||
[#6046]: https://github.com/AdguardTeam/AdGuardHome/issues/6046
|
|
||||||
[#6049]: https://github.com/AdguardTeam/AdGuardHome/issues/6049
|
|
||||||
|
|
||||||
[go-1.20.7]: https://groups.google.com/g/golang-announce/c/X0b6CsSAaYI/m/Efv5DbZ9AwAJ
|
|
||||||
[ms-v0.107.36]: https://github.com/AdguardTeam/AdGuardHome/milestone/71?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.35] - 2023-07-26
|
|
||||||
|
|
||||||
See also the [v0.107.35 GitHub milestone][ms-v0.107.35].
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Improved reliability filtering-rule list updates on Unix systems.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Occasional client information lookup failures that could lead to the DNS
|
|
||||||
server getting stuck ([#6006]).
|
|
||||||
- `bufio.Scanner: token too long` and other errors when trying to add
|
|
||||||
filtering-rule lists with lines over 1024 bytes long or containing cosmetic
|
|
||||||
rules ([#6003]).
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Default exposure of the non-standard ports 784 and 8853 for DNS-over-QUIC in
|
|
||||||
the `Dockerfile`.
|
|
||||||
|
|
||||||
[#6003]: https://github.com/AdguardTeam/AdGuardHome/issues/6003
|
|
||||||
[#6006]: https://github.com/AdguardTeam/AdGuardHome/issues/6006
|
|
||||||
|
|
||||||
[ms-v0.107.35]: https://github.com/AdguardTeam/AdGuardHome/milestone/70?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.34] - 2023-07-12
|
|
||||||
|
|
||||||
See also the [v0.107.34 GitHub milestone][ms-v0.107.34].
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Go version has been updated to prevent the possibility of exploiting the
|
|
||||||
CVE-2023-29406 Go vulnerability fixed in [Go 1.19.11][go-1.19.11].
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Ability to ignore queries for the root domain, such as `NS .` queries
|
|
||||||
([#5990]).
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Improved CPU and RAM consumption during updates of filtering-rule lists.
|
|
||||||
|
|
||||||
#### Configuration Changes
|
|
||||||
|
|
||||||
In this release, the schema version has changed from 23 to 24.
|
|
||||||
|
|
||||||
- Properties starting with `log_`, and `verbose` property, which used to set up
|
|
||||||
logging are now moved to the new object `log` containing new properties
|
|
||||||
`file`, `max_backups`, `max_size`, `max_age`, `compress`, `local_time`, and
|
|
||||||
`verbose`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'log_file': ""
|
|
||||||
'log_max_backups': 0
|
|
||||||
'log_max_size': 100
|
|
||||||
'log_max_age': 3
|
|
||||||
'log_compress': false
|
|
||||||
'log_localtime': false
|
|
||||||
'verbose': false
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'log':
|
|
||||||
'file': ""
|
|
||||||
'max_backups': 0
|
|
||||||
'max_size': 100
|
|
||||||
'max_age': 3
|
|
||||||
'compress': false
|
|
||||||
'local_time': false
|
|
||||||
'verbose': false
|
|
||||||
```
|
|
||||||
|
|
||||||
To rollback this change, remove the new object `log`, set back `log_` and
|
|
||||||
`verbose` properties and change the `schema_version` back to `23`.
|
|
||||||
|
|
||||||
### Deprecated
|
|
||||||
|
|
||||||
- Default exposure of the non-standard ports 784 and 8853 for DNS-over-QUIC in
|
|
||||||
the `Dockerfile`.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Two unspecified IPs when a host is blocked in two filter lists ([#5972]).
|
|
||||||
- Incorrect setting of Parental Control cache size.
|
|
||||||
- Excessive RAM and CPU consumption by Safe Browsing and Parental Control
|
|
||||||
filters ([#5896]).
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- The `HEALTHCHECK` section and the use of `tini` in the `ENTRYPOINT` section in
|
|
||||||
`Dockerfile` ([#5939]). They caused a lot of issues, especially with tools
|
|
||||||
like `docker-compose` and `podman`.
|
|
||||||
|
|
||||||
**NOTE:** Some Docker tools may cache `ENTRYPOINT` sections, so some users may
|
|
||||||
be required to backup their configuration, stop the container, purge the old
|
|
||||||
image, and reload it from scratch.
|
|
||||||
|
|
||||||
[#5896]: https://github.com/AdguardTeam/AdGuardHome/issues/5896
|
|
||||||
[#5972]: https://github.com/AdguardTeam/AdGuardHome/issues/5972
|
|
||||||
[#5990]: https://github.com/AdguardTeam/AdGuardHome/issues/5990
|
|
||||||
|
|
||||||
[go-1.19.11]: https://groups.google.com/g/golang-announce/c/2q13H6LEEx0/m/sduSepLLBwAJ
|
|
||||||
[ms-v0.107.34]: https://github.com/AdguardTeam/AdGuardHome/milestone/69?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.33] - 2023-07-03
|
|
||||||
|
|
||||||
See also the [v0.107.33 GitHub milestone][ms-v0.107.33].
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- The new command-line flag `--web-addr` is the address to serve the web UI on,
|
|
||||||
in the host:port format.
|
|
||||||
- The ability to set inactivity periods for filtering blocked services, both
|
|
||||||
globally and per client, in the configuration file ([#951]). The UI changes
|
|
||||||
are coming in the upcoming releases.
|
|
||||||
- The ability to edit rewrite rules via `PUT /control/rewrite/update` HTTP API
|
|
||||||
and the Web UI ([#1577]).
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
#### Configuration Changes
|
|
||||||
|
|
||||||
In this release, the schema version has changed from 20 to 23.
|
|
||||||
|
|
||||||
- Properties `bind_host`, `bind_port`, and `web_session_ttl` which used to setup
|
|
||||||
web UI binding configuration, are now moved to a new object `http` containing
|
|
||||||
new properties `address` and `session_ttl`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'bind_host': '1.2.3.4'
|
|
||||||
'bind_port': 8080
|
|
||||||
'web_session_ttl': 720
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'http':
|
|
||||||
'address': '1.2.3.4:8080'
|
|
||||||
'session_ttl': '720h'
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that the new `http.session_ttl` property is now a duration string. To
|
|
||||||
rollback this change, remove the new object `http`, set back `bind_host`,
|
|
||||||
`bind_port`, `web_session_ttl`, and change the `schema_version` back to `22`.
|
|
||||||
- Property `clients.persistent.blocked_services`, which in schema versions 21
|
|
||||||
and earlier used to be a list containing ids of blocked services, is now an
|
|
||||||
object containing ids and schedule for blocked services:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'clients':
|
|
||||||
'persistent':
|
|
||||||
- 'name': 'client-name'
|
|
||||||
'blocked_services':
|
|
||||||
- id_1
|
|
||||||
- id_2
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'clients':
|
|
||||||
'persistent':
|
|
||||||
- 'name': client-name
|
|
||||||
'blocked_services':
|
|
||||||
'ids':
|
|
||||||
- id_1
|
|
||||||
- id_2
|
|
||||||
'schedule':
|
|
||||||
'time_zone': 'Local'
|
|
||||||
'sun':
|
|
||||||
'start': '0s'
|
|
||||||
'end': '24h'
|
|
||||||
'mon':
|
|
||||||
'start': '1h'
|
|
||||||
'end': '23h'
|
|
||||||
```
|
|
||||||
|
|
||||||
To rollback this change, replace `clients.persistent.blocked_services` object
|
|
||||||
with the list of ids of blocked services and change the `schema_version` back
|
|
||||||
to `21`.
|
|
||||||
- Property `dns.blocked_services`, which in schema versions 20 and earlier used
|
|
||||||
to be a list containing ids of blocked services, is now an object containing
|
|
||||||
ids and schedule for blocked services:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'blocked_services':
|
|
||||||
- id_1
|
|
||||||
- id_2
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'blocked_services':
|
|
||||||
'ids':
|
|
||||||
- id_1
|
|
||||||
- id_2
|
|
||||||
'schedule':
|
|
||||||
'time_zone': 'Local'
|
|
||||||
'sun':
|
|
||||||
'start': '0s'
|
|
||||||
'end': '24h'
|
|
||||||
'mon':
|
|
||||||
'start': '10m'
|
|
||||||
'end': '23h30m'
|
|
||||||
'tue':
|
|
||||||
'start': '20m'
|
|
||||||
'end': '23h'
|
|
||||||
'wed':
|
|
||||||
'start': '30m'
|
|
||||||
'end': '22h30m'
|
|
||||||
'thu':
|
|
||||||
'start': '40m'
|
|
||||||
'end': '22h'
|
|
||||||
'fri':
|
|
||||||
'start': '50m'
|
|
||||||
'end': '21h30m'
|
|
||||||
'sat':
|
|
||||||
'start': '1h'
|
|
||||||
'end': '21h'
|
|
||||||
```
|
|
||||||
|
|
||||||
To rollback this change, replace `dns.blocked_services` object with the list
|
|
||||||
of ids of blocked services and change the `schema_version` back to `20`.
|
|
||||||
|
|
||||||
### Deprecated
|
|
||||||
|
|
||||||
- The `HEALTHCHECK` section and the use of `tini` in the `ENTRYPOINT` section in
|
|
||||||
`Dockerfile` ([#5939]). They cause a lot of issues, especially with tools
|
|
||||||
like `docker-compose` and `podman`, and will be removed in a future release.
|
|
||||||
- Flags `-h`, `--host`, `-p`, `--port` have been deprecated. The `-h` flag
|
|
||||||
will work as an alias for `--help`, instead of the deprecated `--host` in the
|
|
||||||
future releases.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Ignoring of `/etc/hosts` file when resolving the hostnames of upstream DNS
|
|
||||||
servers ([#5902]).
|
|
||||||
- Excessive error logging when using DNS-over-QUIC ([#5285]).
|
|
||||||
- Inability to set `bind_host` in `AdGuardHome.yaml` in Docker ([#4231],
|
|
||||||
[#4235]).
|
|
||||||
- The blocklists can now be deleted properly ([#5700]).
|
|
||||||
- Queries with the question-section target `.`, for example `NS .`, are now
|
|
||||||
counted in the statistics and correctly shown in the query log ([#5910]).
|
|
||||||
- Safe Search not working with `AAAA` queries for domains that don't have `AAAA`
|
|
||||||
records ([#5913]).
|
|
||||||
|
|
||||||
[#951]: https://github.com/AdguardTeam/AdGuardHome/issues/951
|
|
||||||
[#1577]: https://github.com/AdguardTeam/AdGuardHome/issues/1577
|
|
||||||
[#4231]: https://github.com/AdguardTeam/AdGuardHome/issues/4231
|
|
||||||
[#4235]: https://github.com/AdguardTeam/AdGuardHome/pull/4235
|
|
||||||
[#5285]: https://github.com/AdguardTeam/AdGuardHome/issues/5285
|
|
||||||
[#5700]: https://github.com/AdguardTeam/AdGuardHome/issues/5700
|
|
||||||
[#5902]: https://github.com/AdguardTeam/AdGuardHome/issues/5902
|
|
||||||
[#5910]: https://github.com/AdguardTeam/AdGuardHome/issues/5910
|
|
||||||
[#5913]: https://github.com/AdguardTeam/AdGuardHome/issues/5913
|
|
||||||
[#5939]: https://github.com/AdguardTeam/AdGuardHome/discussions/5939
|
|
||||||
|
|
||||||
[ms-v0.107.33]: https://github.com/AdguardTeam/AdGuardHome/milestone/68?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.32] - 2023-06-13
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- DNSCrypt upstream not resetting the client and resolver information on
|
|
||||||
dialing errors ([#5872]).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.31] - 2023-06-08
|
|
||||||
|
|
||||||
See also the [v0.107.31 GitHub milestone][ms-v0.107.31].
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Startup errors on OpenWrt ([#5872]).
|
|
||||||
- Plain-UDP upstreams always falling back to TCP, causing outages and slowdowns
|
|
||||||
([#5873], [#5874]).
|
|
||||||
|
|
||||||
[#5872]: https://github.com/AdguardTeam/AdGuardHome/issues/5872
|
|
||||||
[#5873]: https://github.com/AdguardTeam/AdGuardHome/issues/5873
|
|
||||||
[#5874]: https://github.com/AdguardTeam/AdGuardHome/issues/5874
|
|
||||||
|
|
||||||
[ms-v0.107.31]: https://github.com/AdguardTeam/AdGuardHome/milestone/67?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.30] - 2023-06-07
|
|
||||||
|
|
||||||
See also the [v0.107.30 GitHub milestone][ms-v0.107.30].
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Go version has been updated to prevent the possibility of exploiting the
|
|
||||||
CVE-2023-29402, CVE-2023-29403, and CVE-2023-29404 Go vulnerabilities fixed in
|
|
||||||
[Go 1.19.10][go-1.19.10].
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Unquoted IPv6 bind hosts with trailing colons erroneously considered
|
|
||||||
unspecified addresses are now properly validated ([#5752]).
|
|
||||||
|
|
||||||
**NOTE:** the Docker healthcheck script now also doesn't interpret the `""`
|
|
||||||
value as unspecified address.
|
|
||||||
- Incorrect `Content-Type` header value in `POST /control/version.json` and `GET
|
|
||||||
/control/dhcp/interfaces` HTTP APIs ([#5716]).
|
|
||||||
- Provided bootstrap servers are now used to resolve the hostnames of plain
|
|
||||||
UDP/TCP upstream servers.
|
|
||||||
|
|
||||||
[#5716]: https://github.com/AdguardTeam/AdGuardHome/issues/5716
|
|
||||||
|
|
||||||
[go-1.19.10]: https://groups.google.com/g/golang-announce/c/q5135a9d924/m/j0ZoAJOHAwAJ
|
|
||||||
[ms-v0.107.30]: https://github.com/AdguardTeam/AdGuardHome/milestone/66?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.29] - 2023-04-18
|
|
||||||
|
|
||||||
See also the [v0.107.29 GitHub milestone][ms-v0.107.29].
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- The ability to exclude client activity from the query log or statistics by
|
- The ability to exclude client activity from the query log or statistics by
|
||||||
editing client's settings on the respective page in the UI ([#1717], [#4299]).
|
editing client's settings on the Clients settings page in the UI ([#1717],
|
||||||
|
[#4299]).
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Stored DHCP leases moved from `leases.db` to `data/leases.json`. The file
|
|
||||||
format has also been optimized.
|
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
@@ -466,12 +38,14 @@ See also the [v0.107.29 GitHub milestone][ms-v0.107.29].
|
|||||||
- All Safe Search services being unchecked by default.
|
- All Safe Search services being unchecked by default.
|
||||||
- Panic when a DNSCrypt stamp is invalid ([#5721]).
|
- Panic when a DNSCrypt stamp is invalid ([#5721]).
|
||||||
|
|
||||||
[#5712]: https://github.com/AdguardTeam/AdGuardHome/issues/5712
|
[#1717]: https://github.com/AdguardTeam/AdGuardHome/issues/1717
|
||||||
|
[#4299]: https://github.com/AdguardTeam/AdGuardHome/issues/4299
|
||||||
[#5721]: https://github.com/AdguardTeam/AdGuardHome/issues/5721
|
[#5721]: https://github.com/AdguardTeam/AdGuardHome/issues/5721
|
||||||
[#5725]: https://github.com/AdguardTeam/AdGuardHome/issues/5725
|
[#5725]: https://github.com/AdguardTeam/AdGuardHome/issues/5725
|
||||||
[#5752]: https://github.com/AdguardTeam/AdGuardHome/issues/5752
|
|
||||||
|
|
||||||
[ms-v0.107.29]: https://github.com/AdguardTeam/AdGuardHome/milestone/65?closed=1
|
<!--
|
||||||
|
NOTE: Add new changes ABOVE THIS COMMENT.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -596,9 +170,11 @@ In this release, the schema version has changed from 17 to 20.
|
|||||||
[#1163]: https://github.com/AdguardTeam/AdGuardHome/issues/1163
|
[#1163]: https://github.com/AdguardTeam/AdGuardHome/issues/1163
|
||||||
[#1333]: https://github.com/AdguardTeam/AdGuardHome/issues/1333
|
[#1333]: https://github.com/AdguardTeam/AdGuardHome/issues/1333
|
||||||
[#1472]: https://github.com/AdguardTeam/AdGuardHome/issues/1472
|
[#1472]: https://github.com/AdguardTeam/AdGuardHome/issues/1472
|
||||||
|
[#1717]: https://github.com/AdguardTeam/AdGuardHome/issues/1717
|
||||||
[#3290]: https://github.com/AdguardTeam/AdGuardHome/issues/3290
|
[#3290]: https://github.com/AdguardTeam/AdGuardHome/issues/3290
|
||||||
[#3459]: https://github.com/AdguardTeam/AdGuardHome/issues/3459
|
[#3459]: https://github.com/AdguardTeam/AdGuardHome/issues/3459
|
||||||
[#4262]: https://github.com/AdguardTeam/AdGuardHome/issues/4262
|
[#4262]: https://github.com/AdguardTeam/AdGuardHome/issues/4262
|
||||||
|
[#4299]: https://github.com/AdguardTeam/AdGuardHome/issues/4299
|
||||||
[#5567]: https://github.com/AdguardTeam/AdGuardHome/issues/5567
|
[#5567]: https://github.com/AdguardTeam/AdGuardHome/issues/5567
|
||||||
[#5701]: https://github.com/AdguardTeam/AdGuardHome/issues/5701
|
[#5701]: https://github.com/AdguardTeam/AdGuardHome/issues/5701
|
||||||
|
|
||||||
@@ -2364,19 +1940,11 @@ See also the [v0.104.2 GitHub milestone][ms-v0.104.2].
|
|||||||
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.37...HEAD
|
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.29...HEAD
|
||||||
[v0.107.37]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.36...v0.107.37
|
[v0.107.29]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.28...v0.107.29
|
||||||
-->
|
-->
|
||||||
|
|
||||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.36...HEAD
|
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.28...HEAD
|
||||||
[v0.107.36]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.35...v0.107.36
|
|
||||||
[v0.107.35]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.34...v0.107.35
|
|
||||||
[v0.107.34]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.33...v0.107.34
|
|
||||||
[v0.107.33]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.32...v0.107.33
|
|
||||||
[v0.107.32]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.31...v0.107.32
|
|
||||||
[v0.107.31]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.30...v0.107.31
|
|
||||||
[v0.107.30]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.29...v0.107.30
|
|
||||||
[v0.107.29]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.28...v0.107.29
|
|
||||||
[v0.107.28]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.27...v0.107.28
|
[v0.107.28]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.27...v0.107.28
|
||||||
[v0.107.27]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.26...v0.107.27
|
[v0.107.27]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.26...v0.107.27
|
||||||
[v0.107.26]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.25...v0.107.26
|
[v0.107.26]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.25...v0.107.26
|
||||||
|
|||||||
11
Makefile
11
Makefile
@@ -78,7 +78,7 @@ build: deps quick-build
|
|||||||
|
|
||||||
quick-build: js-build go-build
|
quick-build: js-build go-build
|
||||||
|
|
||||||
ci: deps test go-bench go-fuzz
|
ci: deps test
|
||||||
|
|
||||||
deps: js-deps go-deps
|
deps: js-deps go-deps
|
||||||
lint: js-lint go-lint
|
lint: js-lint go-lint
|
||||||
@@ -104,10 +104,8 @@ js-deps:
|
|||||||
js-lint: ; $(NPM) $(NPM_FLAGS) run lint
|
js-lint: ; $(NPM) $(NPM_FLAGS) run lint
|
||||||
js-test: ; $(NPM) $(NPM_FLAGS) run test
|
js-test: ; $(NPM) $(NPM_FLAGS) run test
|
||||||
|
|
||||||
go-bench: ; $(ENV) "$(SHELL)" ./scripts/make/go-bench.sh
|
|
||||||
go-build: ; $(ENV) "$(SHELL)" ./scripts/make/go-build.sh
|
go-build: ; $(ENV) "$(SHELL)" ./scripts/make/go-build.sh
|
||||||
go-deps: ; $(ENV) "$(SHELL)" ./scripts/make/go-deps.sh
|
go-deps: ; $(ENV) "$(SHELL)" ./scripts/make/go-deps.sh
|
||||||
go-fuzz: ; $(ENV) "$(SHELL)" ./scripts/make/go-fuzz.sh
|
|
||||||
go-lint: ; $(ENV) "$(SHELL)" ./scripts/make/go-lint.sh
|
go-lint: ; $(ENV) "$(SHELL)" ./scripts/make/go-lint.sh
|
||||||
go-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-tools.sh
|
go-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-tools.sh
|
||||||
|
|
||||||
@@ -130,10 +128,3 @@ openapi-lint: ; cd ./openapi/ && $(YARN) test
|
|||||||
openapi-show: ; cd ./openapi/ && $(YARN) start
|
openapi-show: ; cd ./openapi/ && $(YARN) start
|
||||||
|
|
||||||
txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh
|
txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh
|
||||||
|
|
||||||
# TODO(a.garipov): Consider adding to scripts/ and the common project
|
|
||||||
# structure.
|
|
||||||
go-upd-tools:
|
|
||||||
cd ./internal/tools/ &&\
|
|
||||||
"$(GO.MACRO)" get -u &&\
|
|
||||||
"$(GO.MACRO)" mod tidy
|
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -54,7 +54,7 @@ code.
|
|||||||
|
|
||||||
|
|
||||||
* [Getting Started](#getting-started)
|
* [Getting Started](#getting-started)
|
||||||
* [Automated install (Linux/Unix/MacOS/FreeBSD/OpenBSD)](#automated-install-linux-and-mac)
|
* [Automated install (Unix)](#automated-install-linux-and-mac)
|
||||||
* [Alternative methods](#alternative-methods)
|
* [Alternative methods](#alternative-methods)
|
||||||
* [Guides](#guides)
|
* [Guides](#guides)
|
||||||
* [API](#api)
|
* [API](#api)
|
||||||
@@ -79,7 +79,7 @@ code.
|
|||||||
|
|
||||||
## <a href="#getting-started" id="getting-started" name="getting-started">Getting Started</a>
|
## <a href="#getting-started" id="getting-started" name="getting-started">Getting Started</a>
|
||||||
|
|
||||||
### <a href="#automated-install-linux-and-mac" id="automated-install-linux-and-mac" name="automated-install-linux-and-mac">Automated install (Linux/Unix/MacOS/FreeBSD/OpenBSD)</a>
|
### <a href="#automated-install-linux-and-mac" id="automated-install-linux-and-mac" name="automated-install-linux-and-mac">Automated install (Unix)</a>
|
||||||
|
|
||||||
To install with `curl` run the following command:
|
To install with `curl` run the following command:
|
||||||
|
|
||||||
@@ -261,7 +261,7 @@ Run `make init` to prepare the development environment.
|
|||||||
|
|
||||||
You will need this to build AdGuard Home:
|
You will need this to build AdGuard Home:
|
||||||
|
|
||||||
* [Go](https://golang.org/dl/) v1.20 or later;
|
* [Go](https://golang.org/dl/) v1.19 or later;
|
||||||
* [Node.js](https://nodejs.org/en/download/) v10.16.2 or later;
|
* [Node.js](https://nodejs.org/en/download/) v10.16.2 or later;
|
||||||
* [npm](https://www.npmjs.com/) v6.14 or later;
|
* [npm](https://www.npmjs.com/) v6.14 or later;
|
||||||
* [yarn](https://yarnpkg.com/) v1.22.5 or later.
|
* [yarn](https://yarnpkg.com/) v1.22.5 or later.
|
||||||
@@ -416,8 +416,7 @@ There are three options how you can install an unstable version:
|
|||||||
### <a href="#reporting-issues" id="reporting-issues" name="reporting-issues">Report issues</a>
|
### <a href="#reporting-issues" id="reporting-issues" name="reporting-issues">Report issues</a>
|
||||||
|
|
||||||
If you run into any problem or have a suggestion, head to [this page][iss] and
|
If you run into any problem or have a suggestion, head to [this page][iss] and
|
||||||
click on the “New issue” button. Please follow the instructions in the issue
|
click on the “New issue” button.
|
||||||
form carefully and don't forget to start by searching for duplicates.
|
|
||||||
|
|
||||||
[iss]: https://github.com/AdguardTeam/AdGuardHome/issues
|
[iss]: https://github.com/AdguardTeam/AdGuardHome/issues
|
||||||
|
|
||||||
@@ -467,10 +466,6 @@ bug or implementing the feature.
|
|||||||
Home](https://github.com/ebrianne/adguard-exporter) by
|
Home](https://github.com/ebrianne/adguard-exporter) by
|
||||||
[@ebrianne](https://github.com/ebrianne).
|
[@ebrianne](https://github.com/ebrianne).
|
||||||
|
|
||||||
* [Terminal-based, real-time traffic monitoring and statistics for your AdGuard Home
|
|
||||||
instance](https://github.com/Lissy93/AdGuardian-Term) by
|
|
||||||
[@Lissy93](https://github.com/Lissy93)
|
|
||||||
|
|
||||||
* [AdGuard Home on GLInet
|
* [AdGuard Home on GLInet
|
||||||
routers](https://forum.gl-inet.com/t/adguardhome-on-gl-routers/10664) by
|
routers](https://forum.gl-inet.com/t/adguardhome-on-gl-routers/10664) by
|
||||||
[Gl-Inet](https://gl-inet.com/).
|
[Gl-Inet](https://gl-inet.com/).
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
---
|
|
||||||
!include release.yaml
|
|
||||||
|
|
||||||
---
|
|
||||||
!include snapcraft.yaml
|
|
||||||
|
|
||||||
---
|
---
|
||||||
!include test.yaml
|
!include test.yaml
|
||||||
|
|
||||||
|
---
|
||||||
|
!include release.yaml
|
||||||
|
|||||||
@@ -7,34 +7,40 @@
|
|||||||
# Make sure to sync any changes with the branch overrides below.
|
# Make sure to sync any changes with the branch overrides below.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'edge'
|
'channel': 'edge'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
'dockerGo': 'adguard/golang-ubuntu:6.3'
|
||||||
|
|
||||||
'stages':
|
'stages':
|
||||||
- 'Build frontend':
|
- 'Build frontend':
|
||||||
'manual': false
|
'manual': false
|
||||||
'final': false
|
'final': false
|
||||||
'jobs':
|
'jobs':
|
||||||
- 'Build frontend'
|
- 'Build frontend'
|
||||||
|
|
||||||
- 'Make release':
|
- 'Make release':
|
||||||
'manual': false
|
'manual': false
|
||||||
'final': false
|
'final': false
|
||||||
'jobs':
|
'jobs':
|
||||||
- 'Make release'
|
- 'Make release'
|
||||||
|
|
||||||
- 'Make and publish docker':
|
- 'Make and publish docker':
|
||||||
'manual': false
|
'manual': false
|
||||||
'final': false
|
'final': false
|
||||||
'jobs':
|
'jobs':
|
||||||
- 'Make and publish docker'
|
- 'Make and publish docker'
|
||||||
|
|
||||||
- 'Publish to static storage':
|
- 'Publish to static storage':
|
||||||
'manual': false
|
'manual': false
|
||||||
'final': false
|
'final': false
|
||||||
'jobs':
|
'jobs':
|
||||||
- 'Publish to static storage'
|
- 'Publish to static storage'
|
||||||
|
|
||||||
- 'Publish to GitHub Releases':
|
- 'Publish to Snapstore':
|
||||||
|
'manual': false
|
||||||
|
'final': false
|
||||||
|
'jobs':
|
||||||
|
- 'Publish to Snapstore'
|
||||||
|
|
||||||
|
- 'Publish to GitHub Releases':
|
||||||
'manual': false
|
'manual': false
|
||||||
'final': false
|
'final': false
|
||||||
'jobs':
|
'jobs':
|
||||||
@@ -65,7 +71,7 @@
|
|||||||
make js-deps js-build
|
make js-deps js-build
|
||||||
'artifacts':
|
'artifacts':
|
||||||
- 'name': 'AdGuardHome frontend'
|
- 'name': 'AdGuardHome frontend'
|
||||||
'pattern': 'build/**'
|
'pattern': 'build*/**'
|
||||||
'shared': true
|
'shared': true
|
||||||
'required': true
|
'required': true
|
||||||
'requirements':
|
'requirements':
|
||||||
@@ -198,6 +204,59 @@
|
|||||||
'requirements':
|
'requirements':
|
||||||
- 'adg-docker': 'true'
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
|
'Publish to Snapstore':
|
||||||
|
'docker':
|
||||||
|
'image': '${bamboo.dockerGo}'
|
||||||
|
'key': 'PTS'
|
||||||
|
'other':
|
||||||
|
'clean-working-dir': true
|
||||||
|
'tasks':
|
||||||
|
- 'clean'
|
||||||
|
- 'checkout':
|
||||||
|
'repository': 'bamboo-deploy-publisher'
|
||||||
|
'path': 'bamboo-deploy-publisher'
|
||||||
|
'force-clean-build': true
|
||||||
|
- 'script':
|
||||||
|
'interpreter': 'SHELL'
|
||||||
|
'scripts':
|
||||||
|
- |
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e -f -u -x
|
||||||
|
|
||||||
|
cd ./dist/
|
||||||
|
|
||||||
|
channel="${bamboo.channel}"
|
||||||
|
readonly channel
|
||||||
|
|
||||||
|
case "$channel"
|
||||||
|
in
|
||||||
|
('release')
|
||||||
|
snapchannel='candidate'
|
||||||
|
;;
|
||||||
|
('beta')
|
||||||
|
snapchannel='beta'
|
||||||
|
;;
|
||||||
|
('edge')
|
||||||
|
snapchannel='edge'
|
||||||
|
;;
|
||||||
|
(*)
|
||||||
|
echo "invalid channel '$channel'"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
env\
|
||||||
|
SNAPCRAFT_CHANNEL="$snapchannel"\
|
||||||
|
SNAPCRAFT_EMAIL="${bamboo.snapcraftEmail}"\
|
||||||
|
SNAPCRAFT_MACAROON="${bamboo.snapcraftMacaroonPassword}"\
|
||||||
|
SNAPCRAFT_UBUNTU_DISCHARGE="${bamboo.snapcraftUbuntuDischargePassword}"\
|
||||||
|
../bamboo-deploy-publisher/deploy.sh adguard-home-snap
|
||||||
|
'final-tasks':
|
||||||
|
- 'clean'
|
||||||
|
'requirements':
|
||||||
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
'Publish to GitHub Releases':
|
'Publish to GitHub Releases':
|
||||||
'key': 'PTGR'
|
'key': 'PTGR'
|
||||||
'other':
|
'other':
|
||||||
@@ -237,9 +296,9 @@
|
|||||||
- 'adg-docker': 'true'
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
'triggers':
|
'triggers':
|
||||||
# Don't use minute values that end with a zero or a five as these are often
|
# Don't use minute values that end with a zero or a five as these are often used
|
||||||
# used in CI and so resources during these minutes can be quite busy.
|
# in CI and so resources during these minutes can be quite busy.
|
||||||
- 'cron': '0 42 13 ? * MON-FRI *'
|
- 'cron': '0 42 13 ? * MON-FRI *'
|
||||||
'branches':
|
'branches':
|
||||||
'create': 'manually'
|
'create': 'manually'
|
||||||
'delete':
|
'delete':
|
||||||
@@ -251,7 +310,7 @@
|
|||||||
'link-to-jira': true
|
'link-to-jira': true
|
||||||
|
|
||||||
'notifications':
|
'notifications':
|
||||||
- 'events':
|
- 'events':
|
||||||
- 'plan-completed'
|
- 'plan-completed'
|
||||||
'recipients':
|
'recipients':
|
||||||
- 'webhook':
|
- 'webhook':
|
||||||
@@ -263,19 +322,19 @@
|
|||||||
'concurrent-build-plugin': 'system-default'
|
'concurrent-build-plugin': 'system-default'
|
||||||
|
|
||||||
'branch-overrides':
|
'branch-overrides':
|
||||||
# beta-vX.Y branches are the branches into which the commits that are needed
|
# beta-vX.Y branches are the branches into which the commits that are needed to
|
||||||
# to release a new patch version are initially cherry-picked.
|
# release a new patch version are initially cherry-picked.
|
||||||
- '^beta-v[0-9]+\.[0-9]+':
|
- '^beta-v[0-9]+\.[0-9]+':
|
||||||
# Build betas on release branches manually.
|
# Build betas on release branches manually.
|
||||||
'triggers': []
|
'triggers': []
|
||||||
# Set the default release channel on the release branch to beta, as we may
|
# Set the default release channel on the release branch to beta, as we may
|
||||||
# need to build a few of these.
|
# need to build a few of these.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'beta'
|
'channel': 'beta'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
'dockerGo': 'adguard/golang-ubuntu:6.3'
|
||||||
# release-vX.Y.Z branches are the branches from which the actual final
|
# release-vX.Y.Z branches are the branches from which the actual final release
|
||||||
# release is built.
|
# is built.
|
||||||
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
||||||
# Disable integration branches for release branches.
|
# Disable integration branches for release branches.
|
||||||
'branch-config':
|
'branch-config':
|
||||||
'integration':
|
'integration':
|
||||||
@@ -287,4 +346,4 @@
|
|||||||
# are the ones that actually get released.
|
# are the ones that actually get released.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'release'
|
'channel': 'release'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
'dockerGo': 'adguard/golang-ubuntu:6.3'
|
||||||
|
|||||||
@@ -1,211 +0,0 @@
|
|||||||
---
|
|
||||||
# This part of the release build is separate from the one described in
|
|
||||||
# release.yaml, because the Snapcraft infrastructure is brittle, and timeouts
|
|
||||||
# during logins and uploads often lead to release blocking.
|
|
||||||
'version': 2
|
|
||||||
'plan':
|
|
||||||
'project-key': 'AGH'
|
|
||||||
'key': 'AGHSNAP'
|
|
||||||
'name': 'AdGuard Home - Build and publish Snapcraft release'
|
|
||||||
# Make sure to sync any changes with the branch overrides below.
|
|
||||||
'variables':
|
|
||||||
'channel': 'edge'
|
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
|
||||||
'snapcraftChannel': 'edge'
|
|
||||||
|
|
||||||
'stages':
|
|
||||||
- 'Download release':
|
|
||||||
'manual': false
|
|
||||||
'final': false
|
|
||||||
'jobs':
|
|
||||||
- 'Download release'
|
|
||||||
|
|
||||||
- 'Build packages':
|
|
||||||
'manual': false
|
|
||||||
'final': false
|
|
||||||
'jobs':
|
|
||||||
- 'Build packages'
|
|
||||||
|
|
||||||
- 'Publish to Snapstore':
|
|
||||||
'manual': false
|
|
||||||
'final': false
|
|
||||||
'jobs':
|
|
||||||
- 'Publish to Snapstore'
|
|
||||||
|
|
||||||
# TODO(a.garipov): Consider using the Artifact Downloader Task if it ever learns
|
|
||||||
# about plan branches.
|
|
||||||
'Download release':
|
|
||||||
'artifacts':
|
|
||||||
- 'name': 'i386_binary'
|
|
||||||
'pattern': 'AdGuardHome_i386'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'amd64_binary'
|
|
||||||
'pattern': 'AdGuardHome_amd64'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'armhf_binary'
|
|
||||||
'pattern': 'AdGuardHome_armhf'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'arm64_binary'
|
|
||||||
'pattern': 'AdGuardHome_arm64'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
'docker':
|
|
||||||
'image': '${bamboo.dockerGo}'
|
|
||||||
'key': 'DR'
|
|
||||||
'other':
|
|
||||||
'clean-working-dir': true
|
|
||||||
'tasks':
|
|
||||||
- 'checkout':
|
|
||||||
'force-clean-build': true
|
|
||||||
- 'script':
|
|
||||||
'interpreter': 'SHELL'
|
|
||||||
'scripts':
|
|
||||||
- |
|
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e -f -u -x
|
|
||||||
|
|
||||||
env\
|
|
||||||
CHANNEL="${bamboo.channel}"\
|
|
||||||
VERBOSE='1'\
|
|
||||||
sh ./scripts/snap/download.sh
|
|
||||||
'requirements':
|
|
||||||
- 'adg-docker': 'true'
|
|
||||||
|
|
||||||
'Build packages':
|
|
||||||
'artifact-subscriptions':
|
|
||||||
- 'artifact': 'i386_binary'
|
|
||||||
- 'artifact': 'amd64_binary'
|
|
||||||
- 'artifact': 'armhf_binary'
|
|
||||||
- 'artifact': 'arm64_binary'
|
|
||||||
'artifacts':
|
|
||||||
- 'name': 'i386_snap'
|
|
||||||
'pattern': 'AdGuardHome_i386.snap'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'amd64_snap'
|
|
||||||
'pattern': 'AdGuardHome_amd64.snap'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'armhf_snap'
|
|
||||||
'pattern': 'AdGuardHome_armhf.snap'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'arm64_snap'
|
|
||||||
'pattern': 'AdGuardHome_arm64.snap'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
'docker':
|
|
||||||
'image': '${bamboo.dockerGo}'
|
|
||||||
'key': 'BP'
|
|
||||||
'other':
|
|
||||||
'clean-working-dir': true
|
|
||||||
'tasks':
|
|
||||||
- 'checkout':
|
|
||||||
'force-clean-build': true
|
|
||||||
- 'script':
|
|
||||||
'interpreter': 'SHELL'
|
|
||||||
'scripts':
|
|
||||||
- |
|
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e -f -u -x
|
|
||||||
|
|
||||||
env\
|
|
||||||
VERBOSE='1'\
|
|
||||||
sh ./scripts/snap/build.sh
|
|
||||||
'requirements':
|
|
||||||
- 'adg-docker': 'true'
|
|
||||||
|
|
||||||
'Publish to Snapstore':
|
|
||||||
'artifact-subscriptions':
|
|
||||||
- 'artifact': 'i386_snap'
|
|
||||||
- 'artifact': 'amd64_snap'
|
|
||||||
- 'artifact': 'armhf_snap'
|
|
||||||
- 'artifact': 'arm64_snap'
|
|
||||||
'docker':
|
|
||||||
'image': '${bamboo.dockerGo}'
|
|
||||||
'key': 'PTS'
|
|
||||||
'other':
|
|
||||||
'clean-working-dir': true
|
|
||||||
'tasks':
|
|
||||||
- 'checkout':
|
|
||||||
'force-clean-build': true
|
|
||||||
- 'script':
|
|
||||||
'interpreter': 'SHELL'
|
|
||||||
'scripts':
|
|
||||||
- |
|
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e -f -u -x
|
|
||||||
|
|
||||||
env\
|
|
||||||
SNAPCRAFT_CHANNEL="${bamboo.snapcraftChannel}"\
|
|
||||||
SNAPCRAFT_STORE_CREDENTIALS="${bamboo.snapcraftMacaroonPassword}"\
|
|
||||||
VERBOSE='1'\
|
|
||||||
sh ./scripts/snap/upload.sh
|
|
||||||
'final-tasks':
|
|
||||||
- 'clean'
|
|
||||||
'requirements':
|
|
||||||
- 'adg-docker': 'true'
|
|
||||||
|
|
||||||
'triggers':
|
|
||||||
# Don't use minute values that end with a zero or a five as these are often
|
|
||||||
# used in CI and so resources during these minutes can be quite busy.
|
|
||||||
#
|
|
||||||
# NOTE: The time is chosen to be exactly one hour after the main release
|
|
||||||
# build as defined as in release.yaml.
|
|
||||||
- 'cron': '0 42 14 ? * MON-FRI *'
|
|
||||||
'branches':
|
|
||||||
'create': 'manually'
|
|
||||||
'delete':
|
|
||||||
'after-deleted-days': 1
|
|
||||||
'after-inactive-days': 30
|
|
||||||
'integration':
|
|
||||||
'push-on-success': false
|
|
||||||
'merge-from': 'AdGuard Home - Build and publish Snapcraft release'
|
|
||||||
'link-to-jira': true
|
|
||||||
|
|
||||||
'notifications':
|
|
||||||
- 'events':
|
|
||||||
- 'plan-completed'
|
|
||||||
'recipients':
|
|
||||||
- 'webhook':
|
|
||||||
'name': 'Build webhook'
|
|
||||||
'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa'
|
|
||||||
|
|
||||||
'labels': []
|
|
||||||
'other':
|
|
||||||
'concurrent-build-plugin': 'system-default'
|
|
||||||
|
|
||||||
'branch-overrides':
|
|
||||||
# beta-vX.Y branches are the branches into which the commits that are needed
|
|
||||||
# to release a new patch version are initially cherry-picked.
|
|
||||||
- '^beta-v[0-9]+\.[0-9]+':
|
|
||||||
# Build betas on release branches manually.
|
|
||||||
'triggers': []
|
|
||||||
# Set the default release channel on the release branch to beta, as we may
|
|
||||||
# need to build a few of these.
|
|
||||||
'variables':
|
|
||||||
'channel': 'beta'
|
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
|
||||||
'snapcraftChannel': 'beta'
|
|
||||||
# release-vX.Y.Z branches are the branches from which the actual final
|
|
||||||
# release is built.
|
|
||||||
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
|
||||||
# Disable integration branches for release branches.
|
|
||||||
'branch-config':
|
|
||||||
'integration':
|
|
||||||
'push-on-success': false
|
|
||||||
'merge-from': 'beta-v0.107'
|
|
||||||
# Build final releases on release branches manually.
|
|
||||||
'triggers': []
|
|
||||||
# Set the default release channel on the final branch to release, as these
|
|
||||||
# are the ones that actually get released.
|
|
||||||
'variables':
|
|
||||||
'channel': 'release'
|
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
|
||||||
'snapcraftChannel': 'candidate'
|
|
||||||
@@ -5,21 +5,15 @@
|
|||||||
'key': 'AHBRTSPECS'
|
'key': 'AHBRTSPECS'
|
||||||
'name': 'AdGuard Home - Build and run tests'
|
'name': 'AdGuard Home - Build and run tests'
|
||||||
'variables':
|
'variables':
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
'dockerGo': 'adguard/golang-ubuntu:6.3'
|
||||||
|
|
||||||
'stages':
|
'stages':
|
||||||
- 'Tests':
|
- 'Tests':
|
||||||
'manual': false
|
'manual': false
|
||||||
'final': false
|
'final': false
|
||||||
'jobs':
|
'jobs':
|
||||||
- 'Test'
|
- 'Test'
|
||||||
|
|
||||||
- 'Artifact':
|
|
||||||
manual: false
|
|
||||||
final: false
|
|
||||||
jobs:
|
|
||||||
- 'Artifact'
|
|
||||||
|
|
||||||
'Test':
|
'Test':
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerGo}'
|
||||||
@@ -47,53 +41,6 @@
|
|||||||
'requirements':
|
'requirements':
|
||||||
- 'adg-docker': 'true'
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
'Artifact':
|
|
||||||
'docker':
|
|
||||||
'image': '${bamboo.dockerGo}'
|
|
||||||
'volumes':
|
|
||||||
'${system.GO_CACHE_DIR}': '${bamboo.cacheGo}'
|
|
||||||
'${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}'
|
|
||||||
'key': 'ART'
|
|
||||||
'other':
|
|
||||||
'clean-working-dir': true
|
|
||||||
'tasks':
|
|
||||||
- 'checkout':
|
|
||||||
'force-clean-build': true
|
|
||||||
- 'script':
|
|
||||||
'interpreter': 'SHELL'
|
|
||||||
'scripts':
|
|
||||||
- |-
|
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e -f -u -x
|
|
||||||
|
|
||||||
# Explicitly checkout the revision that we need.
|
|
||||||
git checkout "${bamboo.repository.revision.number}"
|
|
||||||
|
|
||||||
make\
|
|
||||||
ARCH="amd64"\
|
|
||||||
OS="windows darwin linux"\
|
|
||||||
CHANNEL="development"\
|
|
||||||
SIGN=0\
|
|
||||||
PARALLELISM=1\
|
|
||||||
VERBOSE=2\
|
|
||||||
build-release
|
|
||||||
'artifacts':
|
|
||||||
- 'name': 'AdGuardHome_windows_amd64'
|
|
||||||
'pattern': 'dist/AdGuardHome_windows_amd64.zip'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'AdGuardHome_darwin_amd64'
|
|
||||||
'pattern': 'dist/AdGuardHome_darwin_amd64.zip'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
- 'name': 'AdGuardHome_linux_amd64'
|
|
||||||
'pattern': 'dist/AdGuardHome_linux_amd64.tar.gz'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
'requirements':
|
|
||||||
- 'adg-docker': 'true'
|
|
||||||
|
|
||||||
'branches':
|
'branches':
|
||||||
'create': 'for-pull-request'
|
'create': 'for-pull-request'
|
||||||
'delete':
|
'delete':
|
||||||
@@ -105,7 +52,7 @@
|
|||||||
'link-to-jira': true
|
'link-to-jira': true
|
||||||
|
|
||||||
'notifications':
|
'notifications':
|
||||||
- 'events':
|
- 'events':
|
||||||
- 'plan-status-changed'
|
- 'plan-status-changed'
|
||||||
'recipients':
|
'recipients':
|
||||||
- 'webhook':
|
- 'webhook':
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "كبار العملاء",
|
"top_clients": "كبار العملاء",
|
||||||
"no_clients_found": "لم يتم العثور على عملاء",
|
"no_clients_found": "لم يتم العثور على عملاء",
|
||||||
"general_statistics": "الإحصاءات العامة",
|
"general_statistics": "الإحصاءات العامة",
|
||||||
"top_upstreams": "أعلى الخوادم upstream",
|
|
||||||
"no_upstreams_data_found": "لم يتم العثور على بيانات خوادم upstream",
|
|
||||||
"number_of_dns_query_days": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} يوم",
|
"number_of_dns_query_days": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} يوم",
|
||||||
"number_of_dns_query_days_plural": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} أيام",
|
"number_of_dns_query_days_plural": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} أيام",
|
||||||
"number_of_dns_query_24_hours": "عدد استعلامات DNS التي تمت معالجتها لآخر 24 ساعة",
|
"number_of_dns_query_24_hours": "عدد استعلامات DNS التي تمت معالجتها لآخر 24 ساعة",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "تم اعداده في {{path}}",
|
"upstream_dns_configured_in_file": "تم اعداده في {{path}}",
|
||||||
"test_upstream_btn": "اختبار upstream",
|
"test_upstream_btn": "اختبار upstream",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream",
|
|
||||||
"apply_btn": "تطبيق",
|
"apply_btn": "تطبيق",
|
||||||
"disabled_filtering_toast": "تم تعطيل الفلترة",
|
"disabled_filtering_toast": "تم تعطيل الفلترة",
|
||||||
"enabled_filtering_toast": "تم تمكين الفلترة",
|
"enabled_filtering_toast": "تم تمكين الفلترة",
|
||||||
@@ -215,7 +212,6 @@
|
|||||||
"example_upstream_udp": "regular DNS (over UDP, hostname);",
|
"example_upstream_udp": "regular DNS (over UDP, hostname);",
|
||||||
"example_upstream_dot": "مشفر<0>DNS-over-TLS</0>;",
|
"example_upstream_dot": "مشفر<0>DNS-over-TLS</0>;",
|
||||||
"example_upstream_doh": "مشفر <0>DNS-over-HTTPS</0>;",
|
"example_upstream_doh": "مشفر <0>DNS-over-HTTPS</0>;",
|
||||||
"example_upstream_doh3": "DNS-over-HTTPS المشفر مع فرض <0> HTTP / 3</0> ولا يوجد رجوع إلى HTTP / 2 أو أقل ؛",
|
|
||||||
"example_upstream_doq": "encrypted <0>DNS-over-QUIC</0>;",
|
"example_upstream_doq": "encrypted <0>DNS-over-QUIC</0>;",
|
||||||
"example_upstream_sdns": "<0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers;",
|
"example_upstream_sdns": "<0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers;",
|
||||||
"example_upstream_tcp": "regular DNS (over TCP);",
|
"example_upstream_tcp": "regular DNS (over TCP);",
|
||||||
@@ -639,6 +635,5 @@
|
|||||||
"parental_control": "الرقابة الابويه",
|
"parental_control": "الرقابة الابويه",
|
||||||
"safe_browsing": "تصفح آمن",
|
"safe_browsing": "تصفح آمن",
|
||||||
"served_from_cache": "{{value}} <i>(يتم تقديمه من ذاكرة التخزين المؤقت)</i>",
|
"served_from_cache": "{{value}} <i>(يتم تقديمه من ذاكرة التخزين المؤقت)</i>",
|
||||||
"form_error_password_length": "يجب أن تتكون كلمة المرور من {{value}} من الأحرف على الأقل",
|
"form_error_password_length": "يجب أن تتكون كلمة المرور من {{value}} من الأحرف على الأقل"
|
||||||
"protection_section_label": "الحماية"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Частыя кліенты",
|
"top_clients": "Частыя кліенты",
|
||||||
"no_clients_found": "Кліентаў не знойдзена",
|
"no_clients_found": "Кліентаў не знойдзена",
|
||||||
"general_statistics": "Агульная статыстыка",
|
"general_statistics": "Агульная статыстыка",
|
||||||
"top_upstreams": "Часта запытаныя upstream серверы",
|
|
||||||
"no_upstreams_data_found": "Няма дадзеных аб upstream серверах",
|
|
||||||
"number_of_dns_query_days": "Колькасць DNS-запытаў за апошні {{count}} дзень",
|
"number_of_dns_query_days": "Колькасць DNS-запытаў за апошні {{count}} дзень",
|
||||||
"number_of_dns_query_days_plural": "Колькасць DNS запытаў, апрацаваных за апошнія {{count}} дзён",
|
"number_of_dns_query_days_plural": "Колькасць DNS запытаў, апрацаваных за апошнія {{count}} дзён",
|
||||||
"number_of_dns_query_24_hours": "Колькасць DNS-запытаў за 24 гадзіны",
|
"number_of_dns_query_24_hours": "Колькасць DNS-запытаў за 24 гадзіны",
|
||||||
@@ -152,7 +150,7 @@
|
|||||||
"dns_allowlists": "Белыя спісы DNS",
|
"dns_allowlists": "Белыя спісы DNS",
|
||||||
"dns_blocklists_desc": "AdGuard Home будзе блакаваць дамены з чорных спісаў.",
|
"dns_blocklists_desc": "AdGuard Home будзе блакаваць дамены з чорных спісаў.",
|
||||||
"dns_allowlists_desc": "Дамены з белых спісаў DNS будуць дазволены, нават калі яны знаходзяцца ў любым з чорных спісаў.",
|
"dns_allowlists_desc": "Дамены з белых спісаў DNS будуць дазволены, нават калі яны знаходзяцца ў любым з чорных спісаў.",
|
||||||
"custom_filtering_rules": "Карыстальніцкія правілы фільтрацыі",
|
"custom_filtering_rules": "Карыстацкія правілы фільтрацыі",
|
||||||
"encryption_settings": "Налады шыфравання",
|
"encryption_settings": "Налады шыфравання",
|
||||||
"dhcp_settings": "Налады DHCP",
|
"dhcp_settings": "Налады DHCP",
|
||||||
"upstream_dns": "Upstream DNS-серверы",
|
"upstream_dns": "Upstream DNS-серверы",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Наладжаны ў {{path}}",
|
"upstream_dns_configured_in_file": "Наладжаны ў {{path}}",
|
||||||
"test_upstream_btn": "Тэст upstream сервераў",
|
"test_upstream_btn": "Тэст upstream сервераў",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream сервер",
|
|
||||||
"apply_btn": "Ужыць",
|
"apply_btn": "Ужыць",
|
||||||
"disabled_filtering_toast": "Фільтрацыя выкл.",
|
"disabled_filtering_toast": "Фільтрацыя выкл.",
|
||||||
"enabled_filtering_toast": "Фільтрацыя ўкл.",
|
"enabled_filtering_toast": "Фільтрацыя ўкл.",
|
||||||
@@ -250,7 +247,7 @@
|
|||||||
"loading_table_status": "Загрузка...",
|
"loading_table_status": "Загрузка...",
|
||||||
"page_table_footer_text": "Старонка",
|
"page_table_footer_text": "Старонка",
|
||||||
"rows_table_footer_text": "радкоў",
|
"rows_table_footer_text": "радкоў",
|
||||||
"updated_custom_filtering_toast": "Карыстальніцкія правілы паспяхова захаваны",
|
"updated_custom_filtering_toast": "Занесены змены ў карыстацкія правілы",
|
||||||
"rule_removed_from_custom_filtering_toast": "Карыстацкае правіла выдалена: {{rule}}",
|
"rule_removed_from_custom_filtering_toast": "Карыстацкае правіла выдалена: {{rule}}",
|
||||||
"rule_added_to_custom_filtering_toast": "Карыстацкае правіла дададзена: {{rule}}",
|
"rule_added_to_custom_filtering_toast": "Карыстацкае правіла дададзена: {{rule}}",
|
||||||
"query_log_response_status": "Статус: {{value}}",
|
"query_log_response_status": "Статус: {{value}}",
|
||||||
@@ -478,9 +475,7 @@
|
|||||||
"setup_dns_notice": "Каб выкарыстоўваць <1>DNS-over-HTTPS</1> ці <1>DNS-over-TLS</1>, вам патрэбна <0>наладзіць шыфраванне</0> у наладах AdGuard Home.",
|
"setup_dns_notice": "Каб выкарыстоўваць <1>DNS-over-HTTPS</1> ці <1>DNS-over-TLS</1>, вам патрэбна <0>наладзіць шыфраванне</0> у наладах AdGuard Home.",
|
||||||
"rewrite_added": "Правіла перанакіравання DNS для «{{key}}» паспяхова дададзена",
|
"rewrite_added": "Правіла перанакіравання DNS для «{{key}}» паспяхова дададзена",
|
||||||
"rewrite_deleted": "Правіла перанакіравання DNS для «{{key}}» паспяхова выдалена",
|
"rewrite_deleted": "Правіла перанакіравання DNS для «{{key}}» паспяхова выдалена",
|
||||||
"rewrite_updated": "Перазапіс DNS паспяхова абноўлены",
|
|
||||||
"rewrite_add": "Дадаць правіла перанакіравання DNS",
|
"rewrite_add": "Дадаць правіла перанакіравання DNS",
|
||||||
"rewrite_edit": "Рэдагаваць перазапіс DNS",
|
|
||||||
"rewrite_not_found": "Не знойдзена правілаў перанакіравання DNS",
|
"rewrite_not_found": "Не знойдзена правілаў перанакіравання DNS",
|
||||||
"rewrite_confirm_delete": "Вы ўпэўнены, што хочаце выдаліць правіла перанакіравання DNS для «{{key}}»?",
|
"rewrite_confirm_delete": "Вы ўпэўнены, што хочаце выдаліць правіла перанакіравання DNS для «{{key}}»?",
|
||||||
"rewrite_desc": "Дазваляе лёгка наладзіць карыстацкі DNS-адказ для пэўнага дамена.",
|
"rewrite_desc": "Дазваляе лёгка наладзіць карыстацкі DNS-адказ для пэўнага дамена.",
|
||||||
@@ -573,7 +568,7 @@
|
|||||||
"check_desc": "Праверыць фільтрацыю імя хаста",
|
"check_desc": "Праверыць фільтрацыю імя хаста",
|
||||||
"check": "Праверыць",
|
"check": "Праверыць",
|
||||||
"form_enter_host": "Увядзіце імя хаста",
|
"form_enter_host": "Увядзіце імя хаста",
|
||||||
"filtered_custom_rules": "Адфільтраваны з дапамогай карыстальніцкіх правіл фільтрацыі",
|
"filtered_custom_rules": "Адфільтраваны з дапамогай карыстацкіх правілаў фільтрацыі",
|
||||||
"choose_from_list": "Абраць са спіса",
|
"choose_from_list": "Абраць са спіса",
|
||||||
"add_custom_list": "Дадаць свой спіс",
|
"add_custom_list": "Дадаць свой спіс",
|
||||||
"host_whitelisted": "Хост занесены ў белы спіс",
|
"host_whitelisted": "Хост занесены ў белы спіс",
|
||||||
@@ -647,6 +642,5 @@
|
|||||||
"anonymizer_notification": "<0>Заўвага:</0> Ананімізацыя IP уключана. Вы можаце адключыць яе ў <1>Агульных наладах</1>.",
|
"anonymizer_notification": "<0>Заўвага:</0> Ананімізацыя IP уключана. Вы можаце адключыць яе ў <1>Агульных наладах</1>.",
|
||||||
"confirm_dns_cache_clear": "Вы ўпэўнены, што хочаце ачысціць кэш DNS?",
|
"confirm_dns_cache_clear": "Вы ўпэўнены, што хочаце ачысціць кэш DNS?",
|
||||||
"cache_cleared": "Кэш DNS паспяхова ачышчаны",
|
"cache_cleared": "Кэш DNS паспяхова ачышчаны",
|
||||||
"clear_cache": "Ачысціць кэш",
|
"clear_cache": "Ачысціць кэш"
|
||||||
"protection_section_label": "Ахова"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Nejčastější klienti",
|
"top_clients": "Nejčastější klienti",
|
||||||
"no_clients_found": "Nenalezeny žádní klienti",
|
"no_clients_found": "Nenalezeny žádní klienti",
|
||||||
"general_statistics": "Obecné statistiky",
|
"general_statistics": "Obecné statistiky",
|
||||||
"top_upstreams": "Top odchozí připojení",
|
|
||||||
"no_upstreams_data_found": "Nebyla nalezena žádná data odchozích připojení",
|
|
||||||
"number_of_dns_query_days": "Počet DNS dotazů zpracovaných za posledních {{count}} den",
|
"number_of_dns_query_days": "Počet DNS dotazů zpracovaných za posledních {{count}} den",
|
||||||
"number_of_dns_query_days_plural": "Počet DNS dotazů zpracovaných za posledních {{count}} dní",
|
"number_of_dns_query_days_plural": "Počet DNS dotazů zpracovaných za posledních {{count}} dní",
|
||||||
"number_of_dns_query_24_hours": "Počet DNS dotazů zpracovaných za posledních 24 hodin",
|
"number_of_dns_query_24_hours": "Počet DNS dotazů zpracovaných za posledních 24 hodin",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Vynucené bezpečné vyhledávání",
|
"enforced_save_search": "Vynucené bezpečné vyhledávání",
|
||||||
"number_of_dns_query_to_safe_search": "Počet požadavků DNS na vyhledávače, při kterých bylo vynucené bezpečné vyhledávání",
|
"number_of_dns_query_to_safe_search": "Počet požadavků DNS na vyhledávače, při kterých bylo vynucené bezpečné vyhledávání",
|
||||||
"average_processing_time": "Průměrný čas zpracování",
|
"average_processing_time": "Průměrný čas zpracování",
|
||||||
"processing_time": "Doba zpracování",
|
|
||||||
"average_processing_time_hint": "Průměrný čas zpracování požadavků DNS v milisekundách",
|
"average_processing_time_hint": "Průměrný čas zpracování požadavků DNS v milisekundách",
|
||||||
"block_domain_use_filters_and_hosts": "Blokovat domény pomocí filtrů a seznamů adres",
|
"block_domain_use_filters_and_hosts": "Blokovat domény pomocí filtrů a seznamů adres",
|
||||||
"filters_block_toggle_hint": "Pravidla blokování můžete nastavit v nastavení <a>Filtry</a>.",
|
"filters_block_toggle_hint": "Pravidla blokování můžete nastavit v nastavení <a>Filtry</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Konfigurováno v {{path}}",
|
"upstream_dns_configured_in_file": "Konfigurováno v {{path}}",
|
||||||
"test_upstream_btn": "Test upstreamů",
|
"test_upstream_btn": "Test upstreamů",
|
||||||
"upstreams": "Odesláno",
|
"upstreams": "Odesláno",
|
||||||
"upstream": "Odchozí připojení",
|
|
||||||
"apply_btn": "Použít",
|
"apply_btn": "Použít",
|
||||||
"disabled_filtering_toast": "Vypnuté filtrování",
|
"disabled_filtering_toast": "Vypnuté filtrování",
|
||||||
"enabled_filtering_toast": "Zapnuté filtrování",
|
"enabled_filtering_toast": "Zapnuté filtrování",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Protokol dotazů byl úspěšně vymazán",
|
"query_log_cleared": "Protokol dotazů byl úspěšně vymazán",
|
||||||
"query_log_updated": "Protokol dotazů byl úspěšně aktualizován",
|
"query_log_updated": "Protokol dotazů byl úspěšně aktualizován",
|
||||||
"query_log_clear": "Vymazat protokoly dotazů",
|
"query_log_clear": "Vymazat protokoly dotazů",
|
||||||
"query_log_retention": "Rotace protokolů dotazů",
|
"query_log_retention": "Uchování protokolů dotazů",
|
||||||
"query_log_enable": "Povolit protokol",
|
"query_log_enable": "Povolit protokol",
|
||||||
"query_log_configuration": "Konfigurace protokolů",
|
"query_log_configuration": "Konfigurace protokolů",
|
||||||
"query_log_disabled": "Protokol dotazu je zakázán a lze jej nakonfigurovat v <0>nastavení</0>",
|
"query_log_disabled": "Protokol dotazu je zakázán a lze jej nakonfigurovat v <0>nastavení</0>",
|
||||||
"query_log_strict_search": "Pro striktní vyhledávání použijte dvojité uvozovky",
|
"query_log_strict_search": "Pro striktní vyhledávání použijte dvojité uvozovky",
|
||||||
"query_log_retention_confirm": "Opravdu chcete změnit rotaci protokolu dotazů? Pokud snížíte hodnotu intervalu, některá data budou ztracena",
|
"query_log_retention_confirm": "Opravdu chcete změnit uchovávání protokolu dotazů? Pokud snížíte hodnotu intervalu, některá data budou ztracena",
|
||||||
"anonymize_client_ip": "Anonymizovat IP klienta",
|
"anonymize_client_ip": "Anonymizovat IP klienta",
|
||||||
"anonymize_client_ip_desc": "Neukládat úplnou IP adresu klienta do protokolů a statistik",
|
"anonymize_client_ip_desc": "Neukládat úplnou IP adresu klienta do protokolů a statistik",
|
||||||
"dns_config": "Konfigurace DNS serveru",
|
"dns_config": "Konfigurace DNS serveru",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Opravdu chcete odstranit klienta \"{{key}}\"?",
|
"client_confirm_delete": "Opravdu chcete odstranit klienta \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Opravdu chcete smazat tento seznam?",
|
"list_confirm_delete": "Opravdu chcete smazat tento seznam?",
|
||||||
"auto_clients_title": "Spuštění klienti",
|
"auto_clients_title": "Spuštění klienti",
|
||||||
"auto_clients_desc": "Informace o IP adresách zařízení, která používají nebo mohou používat AdGuard Home. Tyto informace se získávají z několika zdrojů, včetně souborů hosts, reverzního DNS atd.",
|
"auto_clients_desc": "Zařízení, která nejsou na seznamu stálých klientů, a mohou nadále používat AdGuard Home",
|
||||||
"access_title": "Nastavení přístupu",
|
"access_title": "Nastavení přístupu",
|
||||||
"access_desc": "Zde můžete konfigurovat pravidla přístupu pro server DNS AdGuard Home",
|
"access_desc": "Zde můžete konfigurovat pravidla přístupu pro server DNS AdGuard Home",
|
||||||
"access_allowed_title": "Povolení klienti",
|
"access_allowed_title": "Povolení klienti",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Pro použití <1>DNS skrze HTTPS</1> nebo <1>DNS skrze TLS</1> potřebujete v nastaveních AdGuard Home <0>nakonfigurovat šifrování</0>.",
|
"setup_dns_notice": "Pro použití <1>DNS skrze HTTPS</1> nebo <1>DNS skrze TLS</1> potřebujete v nastaveních AdGuard Home <0>nakonfigurovat šifrování</0>.",
|
||||||
"rewrite_added": "Přesměrování DNS pro „{{key}}“ úspěšně přidáno",
|
"rewrite_added": "Přesměrování DNS pro „{{key}}“ úspěšně přidáno",
|
||||||
"rewrite_deleted": "Přesměrování DNS pro „{{key}}“ úspěšně smazáno",
|
"rewrite_deleted": "Přesměrování DNS pro „{{key}}“ úspěšně smazáno",
|
||||||
"rewrite_updated": "Přesměrování DNS bylo úspěšně aktualizováno",
|
|
||||||
"rewrite_add": "Přidat přesměrování DNS",
|
"rewrite_add": "Přidat přesměrování DNS",
|
||||||
"rewrite_edit": "Upravit přesměrování DNS",
|
|
||||||
"rewrite_not_found": "Přesměrování DNS nenalezeny",
|
"rewrite_not_found": "Přesměrování DNS nenalezeny",
|
||||||
"rewrite_confirm_delete": "Jste si jisti, že chcete smazat přesměrování DNS pro „{{key}}“?",
|
"rewrite_confirm_delete": "Jste si jisti, že chcete smazat přesměrování DNS pro „{{key}}“?",
|
||||||
"rewrite_desc": "Umožňuje snadno nakonfigurovat vlastní DNS odezvy pro konkrétní název domény.",
|
"rewrite_desc": "Umožňuje snadno nakonfigurovat vlastní DNS odezvy pro konkrétní název domény.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Vypnout ochranu na {{count}} hod.",
|
"disable_notify_for_hours": "Vypnout ochranu na {{count}} hod.",
|
||||||
"disable_notify_for_hours_plural": "Vypnout ochranu na {{count}} hod.",
|
"disable_notify_for_hours_plural": "Vypnout ochranu na {{count}} hod.",
|
||||||
"disable_notify_until_tomorrow": "Vypnout ochranu do zítřka",
|
"disable_notify_until_tomorrow": "Vypnout ochranu do zítřka",
|
||||||
"enable_protection_timer": "Ochrana bude zapnuta za {{time}}",
|
"enable_protection_timer": "Ochrana bude zapnuta za {{time}}"
|
||||||
"custom_retention_input": "Zadejte retenci v hodinách",
|
|
||||||
"custom_rotation_input": "Zadejte rotaci v hodinách",
|
|
||||||
"protection_section_label": "Ochrana",
|
|
||||||
"log_and_stats_section_label": "Protokol dotazů a statistiky",
|
|
||||||
"ignore_query_log": "Ignorovat tohoto klienta v protokolu dotazů",
|
|
||||||
"ignore_statistics": "Ignorovat tohoto klienta ve statistikách"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Hyppigste klienter",
|
"top_clients": "Hyppigste klienter",
|
||||||
"no_clients_found": "Ingen klienter fundet",
|
"no_clients_found": "Ingen klienter fundet",
|
||||||
"general_statistics": "Generelle statistikker",
|
"general_statistics": "Generelle statistikker",
|
||||||
"top_upstreams": "Top-upstreams",
|
|
||||||
"no_upstreams_data_found": "Ingen upstreams-data fundet",
|
|
||||||
"number_of_dns_query_days": "Antallet af DNS-forespørgsler behandlet den seneste {{count}} dag",
|
"number_of_dns_query_days": "Antallet af DNS-forespørgsler behandlet den seneste {{count}} dag",
|
||||||
"number_of_dns_query_days_plural": "Antallet af DNS-forespørgsler behandlet de seneste {{count}} dage",
|
"number_of_dns_query_days_plural": "Antallet af DNS-forespørgsler behandlet de seneste {{count}} dage",
|
||||||
"number_of_dns_query_24_hours": "Antallet af DNS-forespørgsler behandlet de seneste 24 timer",
|
"number_of_dns_query_24_hours": "Antallet af DNS-forespørgsler behandlet de seneste 24 timer",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Håndhævet sikker søgning",
|
"enforced_save_search": "Håndhævet sikker søgning",
|
||||||
"number_of_dns_query_to_safe_search": "Antallet af DNS-forespørgsler til søgemaskiner, hvor Sikker Søgning blev håndhævet",
|
"number_of_dns_query_to_safe_search": "Antallet af DNS-forespørgsler til søgemaskiner, hvor Sikker Søgning blev håndhævet",
|
||||||
"average_processing_time": "Gennemsnitlig behandlingstid",
|
"average_processing_time": "Gennemsnitlig behandlingstid",
|
||||||
"processing_time": "Behandlingstid",
|
|
||||||
"average_processing_time_hint": "Gennemsnitlig behandlingstid i millisekunder af DNS-forespørgsel",
|
"average_processing_time_hint": "Gennemsnitlig behandlingstid i millisekunder af DNS-forespørgsel",
|
||||||
"block_domain_use_filters_and_hosts": "Blokér domæner vha. filtre og værtsfiler",
|
"block_domain_use_filters_and_hosts": "Blokér domæner vha. filtre og værtsfiler",
|
||||||
"filters_block_toggle_hint": "Du kan opsætte blokeringsregler i <a>Filterindstillingerne</a>.",
|
"filters_block_toggle_hint": "Du kan opsætte blokeringsregler i <a>Filterindstillingerne</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Opsat i {{path}}",
|
"upstream_dns_configured_in_file": "Opsat i {{path}}",
|
||||||
"test_upstream_btn": "Test upstreams",
|
"test_upstream_btn": "Test upstreams",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream",
|
|
||||||
"apply_btn": "Anvend",
|
"apply_btn": "Anvend",
|
||||||
"disabled_filtering_toast": "Filtrering deaktiveret",
|
"disabled_filtering_toast": "Filtrering deaktiveret",
|
||||||
"enabled_filtering_toast": "Filtrering aktiveret",
|
"enabled_filtering_toast": "Filtrering aktiveret",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Forespørgselsloggen er blevet ryddet",
|
"query_log_cleared": "Forespørgselsloggen er blevet ryddet",
|
||||||
"query_log_updated": "Forespørgselsloggen er blevet opdateret",
|
"query_log_updated": "Forespørgselsloggen er blevet opdateret",
|
||||||
"query_log_clear": "Ryd forespørgselslogfiler",
|
"query_log_clear": "Ryd forespørgselslogfiler",
|
||||||
"query_log_retention": "Rotation af forespørgselslog",
|
"query_log_retention": "Opbevar forespørgselslogger i",
|
||||||
"query_log_enable": "Aktivér log",
|
"query_log_enable": "Aktivér log",
|
||||||
"query_log_configuration": "Opsætning af logger",
|
"query_log_configuration": "Opsætning af logger",
|
||||||
"query_log_disabled": "Forespørgselsloggen er deaktiveret og kan opsættes i <0>indstillingerne</0>",
|
"query_log_disabled": "Forespørgselsloggen er deaktiveret og kan opsættes i <0>indstillingerne</0>",
|
||||||
"query_log_strict_search": "Brug dobbelt anførselstegn til stringent søgning",
|
"query_log_strict_search": "Brug dobbelt anførselstegn til stringent søgning",
|
||||||
"query_log_retention_confirm": "Sikker på, at forespørgselsloggens rotationstid skal ændres? Mindskes intervalværdien, mistes nogle data",
|
"query_log_retention_confirm": "Sikker på, at du vil ændre forespørgselsloggens opbevaringperiode? Mindskes intervalværdien, mistes data",
|
||||||
"anonymize_client_ip": "Anonymisér klient-IP",
|
"anonymize_client_ip": "Anonymisér klient-IP",
|
||||||
"anonymize_client_ip_desc": "Gem ikke fuld klient IP-adresse i logfiler eller statistikker",
|
"anonymize_client_ip_desc": "Gem ikke fuld klient IP-adresse i logfiler eller statistikker",
|
||||||
"dns_config": "DNS-serveropsætning",
|
"dns_config": "DNS-serveropsætning",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Sikker på, at du vil slette klient \"{{key}}\"?",
|
"client_confirm_delete": "Sikker på, at du vil slette klient \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Sikker på, at du vil slette denne liste?",
|
"list_confirm_delete": "Sikker på, at du vil slette denne liste?",
|
||||||
"auto_clients_title": "Klienter (runtime)",
|
"auto_clients_title": "Klienter (runtime)",
|
||||||
"auto_clients_desc": "Oplysninger om IP-adresser på enheder, som (måske) bruger AdGuard Home. Disse oplysninger indsamles fra flere kilder, herunder hosts-filer, reverse DNS mv.",
|
"auto_clients_desc": "Enheder, som ikke er på listen over Permanente klienter, kan stadig bruge AdGuard Home",
|
||||||
"access_title": "Adgangsindstillinger",
|
"access_title": "Adgangsindstillinger",
|
||||||
"access_desc": "Her kan adgangsregler for AdGuard Home DNS-serveren opsættes",
|
"access_desc": "Her kan adgangsregler for AdGuard Home DNS-serveren opsættes",
|
||||||
"access_allowed_title": "Tilladte klienter",
|
"access_allowed_title": "Tilladte klienter",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "For at kunne bruge <1>DNS-over-HTTPS</1> eller <1>DNS-over-TLS</1>, skal du <0>opsætte Krypteringen</0> i AdGuard Homes indstillinger.",
|
"setup_dns_notice": "For at kunne bruge <1>DNS-over-HTTPS</1> eller <1>DNS-over-TLS</1>, skal du <0>opsætte Krypteringen</0> i AdGuard Homes indstillinger.",
|
||||||
"rewrite_added": "DNS-omskrivning for \"{{key}}\" blev tilføjet",
|
"rewrite_added": "DNS-omskrivning for \"{{key}}\" blev tilføjet",
|
||||||
"rewrite_deleted": "DNS-omskrivning for \"{{key}}\" blev slettet",
|
"rewrite_deleted": "DNS-omskrivning for \"{{key}}\" blev slettet",
|
||||||
"rewrite_updated": "DNS-omskrivning hermed opdateret",
|
|
||||||
"rewrite_add": "Tilføj DNS-omskrivning",
|
"rewrite_add": "Tilføj DNS-omskrivning",
|
||||||
"rewrite_edit": "Redigér DNS-omskrivning",
|
|
||||||
"rewrite_not_found": "Ingen DNS-omskrivninger fundet",
|
"rewrite_not_found": "Ingen DNS-omskrivninger fundet",
|
||||||
"rewrite_confirm_delete": "Sikker på, at du vil slette DNS-omskrivning for \"{{key}}\"?",
|
"rewrite_confirm_delete": "Sikker på, at du vil slette DNS-omskrivning for \"{{key}}\"?",
|
||||||
"rewrite_desc": "Gør det nemt at opsætte det tilpassede DNS-svar for et specifikt domænenavn.",
|
"rewrite_desc": "Gør det nemt at opsætte det tilpassede DNS-svar for et specifikt domænenavn.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Deaktivere beskyttelse i {{count}} time",
|
"disable_notify_for_hours": "Deaktivere beskyttelse i {{count}} time",
|
||||||
"disable_notify_for_hours_plural": "Deaktivere beskyttelse i {{count}} timer",
|
"disable_notify_for_hours_plural": "Deaktivere beskyttelse i {{count}} timer",
|
||||||
"disable_notify_until_tomorrow": "Deaktiver beskyttelse indtil i morgen",
|
"disable_notify_until_tomorrow": "Deaktiver beskyttelse indtil i morgen",
|
||||||
"enable_protection_timer": "Beskyttelse deaktiveres om {{time}}",
|
"enable_protection_timer": "Beskyttelse deaktiveres om {{time}}"
|
||||||
"custom_retention_input": "Angiv opbevaringstid i timer",
|
|
||||||
"custom_rotation_input": "Angiv rotationstid i timer",
|
|
||||||
"protection_section_label": "Beskyttelse",
|
|
||||||
"log_and_stats_section_label": "Forespørgselslog og statistik",
|
|
||||||
"ignore_query_log": "Ignorér denne klient i forespørgselslog",
|
|
||||||
"ignore_statistics": "Ignorér denne klient i statistik"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Top Clients",
|
"top_clients": "Top Clients",
|
||||||
"no_clients_found": "Keine Clients gefunden",
|
"no_clients_found": "Keine Clients gefunden",
|
||||||
"general_statistics": "Allgemeine Statistiken",
|
"general_statistics": "Allgemeine Statistiken",
|
||||||
"top_upstreams": "Top Upstreams",
|
|
||||||
"no_upstreams_data_found": "Keine Upstream-Daten gefunden",
|
|
||||||
"number_of_dns_query_days": "Anzahl der in den letzten {{count}} Tagen verarbeiteten DNS-Anfragen",
|
"number_of_dns_query_days": "Anzahl der in den letzten {{count}} Tagen verarbeiteten DNS-Anfragen",
|
||||||
"number_of_dns_query_days_plural": "Anzahl der DNS-Abfragen, die in den letzten {{count}} Tagen verarbeitet wurden",
|
"number_of_dns_query_days_plural": "Anzahl der DNS-Abfragen, die in den letzten {{count}} Tagen verarbeitet wurden",
|
||||||
"number_of_dns_query_24_hours": "Anzahl der in den letzten 24 Stunden durchgeführten DNS-Anfragen",
|
"number_of_dns_query_24_hours": "Anzahl der in den letzten 24 Stunden durchgeführten DNS-Anfragen",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Sichere Suche erzwungen",
|
"enforced_save_search": "Sichere Suche erzwungen",
|
||||||
"number_of_dns_query_to_safe_search": "Anzahl der DNS-Anfragen bei denen Sichere Suche für Suchanfragen erzwungen wurde",
|
"number_of_dns_query_to_safe_search": "Anzahl der DNS-Anfragen bei denen Sichere Suche für Suchanfragen erzwungen wurde",
|
||||||
"average_processing_time": "Durchschnittliche Bearbeitungsdauer",
|
"average_processing_time": "Durchschnittliche Bearbeitungsdauer",
|
||||||
"processing_time": "Verarbeitungszeit",
|
|
||||||
"average_processing_time_hint": "Durchschnittliche Zeit in Millisekunden zur Bearbeitung von DNS-Anfragen",
|
"average_processing_time_hint": "Durchschnittliche Zeit in Millisekunden zur Bearbeitung von DNS-Anfragen",
|
||||||
"block_domain_use_filters_and_hosts": "Domains durch Filter und Host-Dateien sperren",
|
"block_domain_use_filters_and_hosts": "Domains durch Filter und Host-Dateien sperren",
|
||||||
"filters_block_toggle_hint": "Sie können Blockierregeln in den <a>Filter</a>einstellungen erstellen.",
|
"filters_block_toggle_hint": "Sie können Blockierregeln in den <a>Filter</a>einstellungen erstellen.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Konfiguriert in {{path}}",
|
"upstream_dns_configured_in_file": "Konfiguriert in {{path}}",
|
||||||
"test_upstream_btn": "Upstreams testen",
|
"test_upstream_btn": "Upstreams testen",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream",
|
|
||||||
"apply_btn": "Anwenden",
|
"apply_btn": "Anwenden",
|
||||||
"disabled_filtering_toast": "Filtern deaktiviert",
|
"disabled_filtering_toast": "Filtern deaktiviert",
|
||||||
"enabled_filtering_toast": "Filtern aktiviert",
|
"enabled_filtering_toast": "Filtern aktiviert",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Das Abfrageprotokoll wurde erfolgreich gelöscht",
|
"query_log_cleared": "Das Abfrageprotokoll wurde erfolgreich gelöscht",
|
||||||
"query_log_updated": "Das Abfrageprotokoll wurde erfolgreich aktualisiert",
|
"query_log_updated": "Das Abfrageprotokoll wurde erfolgreich aktualisiert",
|
||||||
"query_log_clear": "Abfrageprotokolle leeren",
|
"query_log_clear": "Abfrageprotokolle leeren",
|
||||||
"query_log_retention": "Rotation der Abfrageprotokolle",
|
"query_log_retention": "Abfrageprotokolle aufbewahren",
|
||||||
"query_log_enable": "Protokoll aktivieren",
|
"query_log_enable": "Protokoll aktivieren",
|
||||||
"query_log_configuration": "Konfiguration der Protokolle",
|
"query_log_configuration": "Konfiguration der Protokolle",
|
||||||
"query_log_disabled": "Das Abfrageprotokoll ist deaktiviert und kann in den <0>Einstellungen</0> konfiguriert werden.",
|
"query_log_disabled": "Das Abfrageprotokoll ist deaktiviert und kann in den <0>Einstellungen</0> konfiguriert werden.",
|
||||||
"query_log_strict_search": "Doppelte Anführungszeichen für die strikte Suche verwenden",
|
"query_log_strict_search": "Doppelte Anführungszeichen für die strikte Suche verwenden",
|
||||||
"query_log_retention_confirm": "Möchten Sie die Abfrageprotokollrotation wirklich ändern? Wenn Sie den Intervallwert verringern, gehen einige Daten verloren",
|
"query_log_retention_confirm": "Möchten Sie die Aufbewahrung des Abfrageprotokolls wirklich ändern? Wenn Sie den Zeitabstand verringern, gehen einige Daten verloren.",
|
||||||
"anonymize_client_ip": "Client-IP anonymisieren",
|
"anonymize_client_ip": "Client-IP anonymisieren",
|
||||||
"anonymize_client_ip_desc": "Vollständige IP-Adresse des Clients nicht in Protokollen und Statistiken speichern",
|
"anonymize_client_ip_desc": "Vollständige IP-Adresse des Clients nicht in Protokollen und Statistiken speichern",
|
||||||
"dns_config": "DNS-Serverkonfiguration",
|
"dns_config": "DNS-Serverkonfiguration",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Möchten Sie den Client „{{key}}“ wirklich löschen?",
|
"client_confirm_delete": "Möchten Sie den Client „{{key}}“ wirklich löschen?",
|
||||||
"list_confirm_delete": "Möchten Sie diese Liste wirklich löschen?",
|
"list_confirm_delete": "Möchten Sie diese Liste wirklich löschen?",
|
||||||
"auto_clients_title": "Laufzeit-Clients",
|
"auto_clients_title": "Laufzeit-Clients",
|
||||||
"auto_clients_desc": "Informationen über IP-Adressen der Geräten, die AdGuard Home nutzen oder nutzen könnten. Diese Informationen werden aus verschiedenen Quellen gesammelt, darunter Hosts-Dateien, Reverse-DNS usw.",
|
"auto_clients_desc": "Geräte, die nicht auf der Liste der persistenten Clients stehen und trotzdem AdGuard Home verwenden dürfen",
|
||||||
"access_title": "Zugriffsrechte",
|
"access_title": "Zugriffsrechte",
|
||||||
"access_desc": "Hier können Sie die Zugriffsregeln für den DNS-Server von AdGuard Home konfigurieren",
|
"access_desc": "Hier können Sie die Zugriffsregeln für den DNS-Server von AdGuard Home konfigurieren",
|
||||||
"access_allowed_title": "Zugelassene Clients",
|
"access_allowed_title": "Zugelassene Clients",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Um <1>DNS-over-HTTTPS</1> oder <1>DNS-over-TLS</1> verwenden zu können, müssen Sie in den AdGuard Home Einstellungen die <0>Verschlüsselung konfigurieren</0>.",
|
"setup_dns_notice": "Um <1>DNS-over-HTTTPS</1> oder <1>DNS-over-TLS</1> verwenden zu können, müssen Sie in den AdGuard Home Einstellungen die <0>Verschlüsselung konfigurieren</0>.",
|
||||||
"rewrite_added": "DNS-Umschreibung für „{{key}}“ erfolgreich hinzugefügt",
|
"rewrite_added": "DNS-Umschreibung für „{{key}}“ erfolgreich hinzugefügt",
|
||||||
"rewrite_deleted": "DNS-Umschreibung für „{{key}}“ erfolgreich entfernt",
|
"rewrite_deleted": "DNS-Umschreibung für „{{key}}“ erfolgreich entfernt",
|
||||||
"rewrite_updated": "DNS-Rewrite erfolgreich aktualisiert",
|
|
||||||
"rewrite_add": "DNS-Umschreibung hinzufügen",
|
"rewrite_add": "DNS-Umschreibung hinzufügen",
|
||||||
"rewrite_edit": "DNS-Rewrite bearbeiten",
|
|
||||||
"rewrite_not_found": "Keine DNS-Umschreibungen gefunden",
|
"rewrite_not_found": "Keine DNS-Umschreibungen gefunden",
|
||||||
"rewrite_confirm_delete": "Möchten Sie die DNS-Umschreibung für „{{key}}“ wirklich entfernen?",
|
"rewrite_confirm_delete": "Möchten Sie die DNS-Umschreibung für „{{key}}“ wirklich entfernen?",
|
||||||
"rewrite_desc": "Ermöglicht die einfache Konfiguration der benutzerdefinierten DNS-Antwort für einen bestimmten Domainnamen.",
|
"rewrite_desc": "Ermöglicht die einfache Konfiguration der benutzerdefinierten DNS-Antwort für einen bestimmten Domainnamen.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Schutz für {{count}} Stunde deaktivieren",
|
"disable_notify_for_hours": "Schutz für {{count}} Stunde deaktivieren",
|
||||||
"disable_notify_for_hours_plural": "Schutz für {{count}} Stunden deaktivieren",
|
"disable_notify_for_hours_plural": "Schutz für {{count}} Stunden deaktivieren",
|
||||||
"disable_notify_until_tomorrow": "Schutz bis morgen deaktivieren",
|
"disable_notify_until_tomorrow": "Schutz bis morgen deaktivieren",
|
||||||
"enable_protection_timer": "Der Schutz wird in {{time}} wieder aktiviert",
|
"enable_protection_timer": "Der Schutz wird in {{time}} wieder aktiviert"
|
||||||
"custom_retention_input": "Rückhaltezeit in Stunden eingeben",
|
|
||||||
"custom_rotation_input": "Rotation in Stunden eingeben",
|
|
||||||
"protection_section_label": "Schutz",
|
|
||||||
"log_and_stats_section_label": "Abfrageprotokoll und Statistik",
|
|
||||||
"ignore_query_log": "Diesen Client im Abfrageprotokoll ignorieren",
|
|
||||||
"ignore_statistics": "Diesen Client in der Statistik ignorieren"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"load_balancing": "Load-balancing",
|
"load_balancing": "Load-balancing",
|
||||||
"load_balancing_desc": "Query one upstream server at a time. AdGuard Home uses its weighted random algorithm to pick the server so that the fastest server is used more often.",
|
"load_balancing_desc": "Query one upstream server at a time. AdGuard Home uses its weighted random algorithm to pick the server so that the fastest server is used more often.",
|
||||||
"bootstrap_dns": "Bootstrap DNS servers",
|
"bootstrap_dns": "Bootstrap DNS servers",
|
||||||
"bootstrap_dns_desc": "IP addresses of DNS servers used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams. Comments are not permitted.",
|
"bootstrap_dns_desc": "Bootstrap DNS servers are used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams.",
|
||||||
"local_ptr_title": "Private reverse DNS servers",
|
"local_ptr_title": "Private reverse DNS servers",
|
||||||
"local_ptr_desc": "The DNS servers that AdGuard Home uses for local PTR queries. These servers are used to resolve PTR requests for addresses in private IP ranges, for example \"192.168.12.34\", using reverse DNS. If not set, AdGuard Home uses the addresses of the default DNS resolvers of your OS except for the addresses of AdGuard Home itself.",
|
"local_ptr_desc": "The DNS servers that AdGuard Home uses for local PTR queries. These servers are used to resolve PTR requests for addresses in private IP ranges, for example \"192.168.12.34\", using reverse DNS. If not set, AdGuard Home uses the addresses of the default DNS resolvers of your OS except for the addresses of AdGuard Home itself.",
|
||||||
"local_ptr_default_resolver": "By default, AdGuard Home uses the following reverse DNS resolvers: {{ip}}.",
|
"local_ptr_default_resolver": "By default, AdGuard Home uses the following reverse DNS resolvers: {{ip}}.",
|
||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Top clients",
|
"top_clients": "Top clients",
|
||||||
"no_clients_found": "No clients found",
|
"no_clients_found": "No clients found",
|
||||||
"general_statistics": "General statistics",
|
"general_statistics": "General statistics",
|
||||||
"top_upstreams": "Top upstreams",
|
|
||||||
"no_upstreams_data_found": "No upstreams data found",
|
|
||||||
"number_of_dns_query_days": "The number of DNS queries processed for the last {{count}} day",
|
"number_of_dns_query_days": "The number of DNS queries processed for the last {{count}} day",
|
||||||
"number_of_dns_query_days_plural": "The number of DNS queries processed for the last {{count}} days",
|
"number_of_dns_query_days_plural": "The number of DNS queries processed for the last {{count}} days",
|
||||||
"number_of_dns_query_24_hours": "The number of DNS queries processed for the last 24 hours",
|
"number_of_dns_query_24_hours": "The number of DNS queries processed for the last 24 hours",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Enforced safe search",
|
"enforced_save_search": "Enforced safe search",
|
||||||
"number_of_dns_query_to_safe_search": "The number of DNS requests to search engines for which Safe Search was enforced",
|
"number_of_dns_query_to_safe_search": "The number of DNS requests to search engines for which Safe Search was enforced",
|
||||||
"average_processing_time": "Average processing time",
|
"average_processing_time": "Average processing time",
|
||||||
"processing_time": "Processing time",
|
|
||||||
"average_processing_time_hint": "Average time in milliseconds on processing a DNS request",
|
"average_processing_time_hint": "Average time in milliseconds on processing a DNS request",
|
||||||
"block_domain_use_filters_and_hosts": "Block domains using filters and hosts files",
|
"block_domain_use_filters_and_hosts": "Block domains using filters and hosts files",
|
||||||
"filters_block_toggle_hint": "You can setup blocking rules in the <a>Filters</a> settings.",
|
"filters_block_toggle_hint": "You can setup blocking rules in the <a>Filters</a> settings.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Configured in {{path}}",
|
"upstream_dns_configured_in_file": "Configured in {{path}}",
|
||||||
"test_upstream_btn": "Test upstreams",
|
"test_upstream_btn": "Test upstreams",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream",
|
|
||||||
"apply_btn": "Apply",
|
"apply_btn": "Apply",
|
||||||
"disabled_filtering_toast": "Disabled filtering",
|
"disabled_filtering_toast": "Disabled filtering",
|
||||||
"enabled_filtering_toast": "Enabled filtering",
|
"enabled_filtering_toast": "Enabled filtering",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Are you sure you want to delete client \"{{key}}\"?",
|
"client_confirm_delete": "Are you sure you want to delete client \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Are you sure you want to delete this list?",
|
"list_confirm_delete": "Are you sure you want to delete this list?",
|
||||||
"auto_clients_title": "Runtime clients",
|
"auto_clients_title": "Runtime clients",
|
||||||
"auto_clients_desc": "Information about IP addresses of devices that are using or may use AdGuard Home. This information is gathered from several sources, including hosts files, reverse DNS, etc.",
|
"auto_clients_desc": "Devices not on the list of Persistent clients that may still use AdGuard Home",
|
||||||
"access_title": "Access settings",
|
"access_title": "Access settings",
|
||||||
"access_desc": "Here you can configure access rules for the AdGuard Home DNS server",
|
"access_desc": "Here you can configure access rules for the AdGuard Home DNS server",
|
||||||
"access_allowed_title": "Allowed clients",
|
"access_allowed_title": "Allowed clients",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "In order to use <1>DNS-over-HTTPS</1> or <1>DNS-over-TLS</1>, you need to <0>configure Encryption</0> in AdGuard Home settings.",
|
"setup_dns_notice": "In order to use <1>DNS-over-HTTPS</1> or <1>DNS-over-TLS</1>, you need to <0>configure Encryption</0> in AdGuard Home settings.",
|
||||||
"rewrite_added": "DNS rewrite for \"{{key}}\" successfully added",
|
"rewrite_added": "DNS rewrite for \"{{key}}\" successfully added",
|
||||||
"rewrite_deleted": "DNS rewrite for \"{{key}}\" successfully deleted",
|
"rewrite_deleted": "DNS rewrite for \"{{key}}\" successfully deleted",
|
||||||
"rewrite_updated": "DNS rewrite successfully updated",
|
|
||||||
"rewrite_add": "Add DNS rewrite",
|
"rewrite_add": "Add DNS rewrite",
|
||||||
"rewrite_edit": "Edit DNS rewrite",
|
|
||||||
"rewrite_not_found": "No DNS rewrites found",
|
"rewrite_not_found": "No DNS rewrites found",
|
||||||
"rewrite_confirm_delete": "Are you sure you want to delete DNS rewrite for \"{{key}}\"?",
|
"rewrite_confirm_delete": "Are you sure you want to delete DNS rewrite for \"{{key}}\"?",
|
||||||
"rewrite_desc": "Allows to easily configure custom DNS response for a specific domain name.",
|
"rewrite_desc": "Allows to easily configure custom DNS response for a specific domain name.",
|
||||||
@@ -568,7 +562,7 @@
|
|||||||
"rewrite_A": "<0>A</0>: special value, keep <0>A</0> records from the upstream",
|
"rewrite_A": "<0>A</0>: special value, keep <0>A</0> records from the upstream",
|
||||||
"rewrite_AAAA": "<0>AAAA</0>: special value, keep <0>AAAA</0> records from the upstream",
|
"rewrite_AAAA": "<0>AAAA</0>: special value, keep <0>AAAA</0> records from the upstream",
|
||||||
"disable_ipv6": "Disable resolving of IPv6 addresses",
|
"disable_ipv6": "Disable resolving of IPv6 addresses",
|
||||||
"disable_ipv6_desc": "Drop all DNS queries for IPv6 addresses (type AAAA) and remove IPv6 hints from HTTPS responses.",
|
"disable_ipv6_desc": "Drop all DNS queries for IPv6 addresses (type AAAA).",
|
||||||
"fastest_addr": "Fastest IP address",
|
"fastest_addr": "Fastest IP address",
|
||||||
"fastest_addr_desc": "Query all DNS servers and return the fastest IP address among all responses. This slows down DNS queries as AdGuard Home has to wait for responses from all DNS servers, but improves the overall connectivity.",
|
"fastest_addr_desc": "Query all DNS servers and return the fastest IP address among all responses. This slows down DNS queries as AdGuard Home has to wait for responses from all DNS servers, but improves the overall connectivity.",
|
||||||
"autofix_warning_text": "If you click \"Fix\", AdGuard Home will configure your system to use AdGuard Home DNS server.",
|
"autofix_warning_text": "If you click \"Fix\", AdGuard Home will configure your system to use AdGuard Home DNS server.",
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Clientes más frecuentes",
|
"top_clients": "Clientes más frecuentes",
|
||||||
"no_clients_found": "No se han encontrado clientes",
|
"no_clients_found": "No se han encontrado clientes",
|
||||||
"general_statistics": "Estadísticas generales",
|
"general_statistics": "Estadísticas generales",
|
||||||
"top_upstreams": "Mejores upstreams",
|
|
||||||
"no_upstreams_data_found": "No se han encontrado datos de upstreams",
|
|
||||||
"number_of_dns_query_days": "Número de consultas DNS procesadas durante el último {{count}} día",
|
"number_of_dns_query_days": "Número de consultas DNS procesadas durante el último {{count}} día",
|
||||||
"number_of_dns_query_days_plural": "Número de consultas DNS procesadas durante los últimos {{count}} días",
|
"number_of_dns_query_days_plural": "Número de consultas DNS procesadas durante los últimos {{count}} días",
|
||||||
"number_of_dns_query_24_hours": "Número de consultas DNS procesadas durante las últimas 24 horas",
|
"number_of_dns_query_24_hours": "Número de consultas DNS procesadas durante las últimas 24 horas",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Búsquedas seguras forzadas",
|
"enforced_save_search": "Búsquedas seguras forzadas",
|
||||||
"number_of_dns_query_to_safe_search": "Número de peticiones DNS a los motores de búsqueda para los que se aplicó la búsqueda segura forzada",
|
"number_of_dns_query_to_safe_search": "Número de peticiones DNS a los motores de búsqueda para los que se aplicó la búsqueda segura forzada",
|
||||||
"average_processing_time": "Tiempo promedio de procesamiento",
|
"average_processing_time": "Tiempo promedio de procesamiento",
|
||||||
"processing_time": "Tiempo de procesamiento",
|
|
||||||
"average_processing_time_hint": "Tiempo promedio en milisegundos al procesar una petición DNS",
|
"average_processing_time_hint": "Tiempo promedio en milisegundos al procesar una petición DNS",
|
||||||
"block_domain_use_filters_and_hosts": "Bloquear dominios usando filtros y archivos hosts",
|
"block_domain_use_filters_and_hosts": "Bloquear dominios usando filtros y archivos hosts",
|
||||||
"filters_block_toggle_hint": "Puedes configurar las reglas de bloqueo en la configuración de <a>filtros</a>.",
|
"filters_block_toggle_hint": "Puedes configurar las reglas de bloqueo en la configuración de <a>filtros</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Configurado en {{path}}",
|
"upstream_dns_configured_in_file": "Configurado en {{path}}",
|
||||||
"test_upstream_btn": "Probar DNS de subida",
|
"test_upstream_btn": "Probar DNS de subida",
|
||||||
"upstreams": "DNS de subida",
|
"upstreams": "DNS de subida",
|
||||||
"upstream": "Upstream",
|
|
||||||
"apply_btn": "Aplicar",
|
"apply_btn": "Aplicar",
|
||||||
"disabled_filtering_toast": "Filtrado deshabilitado",
|
"disabled_filtering_toast": "Filtrado deshabilitado",
|
||||||
"enabled_filtering_toast": "Filtrado habilitado",
|
"enabled_filtering_toast": "Filtrado habilitado",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "El registro de consultas se ha borrado correctamente",
|
"query_log_cleared": "El registro de consultas se ha borrado correctamente",
|
||||||
"query_log_updated": "El registro de consultas se ha actualizado correctamente",
|
"query_log_updated": "El registro de consultas se ha actualizado correctamente",
|
||||||
"query_log_clear": "Borrar registros de consultas",
|
"query_log_clear": "Borrar registros de consultas",
|
||||||
"query_log_retention": "Rotanción de registros de consultas",
|
"query_log_retention": "Retención de registros de consultas",
|
||||||
"query_log_enable": "Habilitar registro",
|
"query_log_enable": "Habilitar registro",
|
||||||
"query_log_configuration": "Configuración de registros",
|
"query_log_configuration": "Configuración de registros",
|
||||||
"query_log_disabled": "El registro de consultas está deshabilitado y se puede configurar en la <0>configuración</0>",
|
"query_log_disabled": "El registro de consultas está deshabilitado y se puede configurar en la <0>configuración</0>",
|
||||||
"query_log_strict_search": "Usar comillas dobles para una búsqueda estricta",
|
"query_log_strict_search": "Usar comillas dobles para una búsqueda estricta",
|
||||||
"query_log_retention_confirm": "¿Está seguro de que deseas cambiar la rotación del registro de consultas? Si reduces el valor del intervalo, se perderán algunos datos",
|
"query_log_retention_confirm": "¿Estás seguro de que deseas cambiar la retención del registro de consultas? Si disminuye el valor del intervalo, se perderán algunos datos",
|
||||||
"anonymize_client_ip": "Anonimizar IP del cliente",
|
"anonymize_client_ip": "Anonimizar IP del cliente",
|
||||||
"anonymize_client_ip_desc": "No guarda la dirección IP completa del cliente en registros o estadísticas",
|
"anonymize_client_ip_desc": "No guarda la dirección IP completa del cliente en registros o estadísticas",
|
||||||
"dns_config": "Configuración del servidor DNS",
|
"dns_config": "Configuración del servidor DNS",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "¿Estás seguro de que deseas eliminar el cliente \"{{key}}\"?",
|
"client_confirm_delete": "¿Estás seguro de que deseas eliminar el cliente \"{{key}}\"?",
|
||||||
"list_confirm_delete": "¿Estás seguro de que deseas eliminar esta lista?",
|
"list_confirm_delete": "¿Estás seguro de que deseas eliminar esta lista?",
|
||||||
"auto_clients_title": "Clientes activos",
|
"auto_clients_title": "Clientes activos",
|
||||||
"auto_clients_desc": "Información sobre las direcciones IP de los dispositivos que usan o pueden usar AdGuard Home. Esta información se recopila de varias fuentes, incluidos ficheros de host, DNS inverso, etc.",
|
"auto_clients_desc": "Dispositivos que no están en la lista de clientes persistentes que aún pueden utilizar AdGuard Home",
|
||||||
"access_title": "Configuración de acceso",
|
"access_title": "Configuración de acceso",
|
||||||
"access_desc": "Aquí puedes configurar las reglas de acceso para el servidor DNS de AdGuard Home",
|
"access_desc": "Aquí puedes configurar las reglas de acceso para el servidor DNS de AdGuard Home",
|
||||||
"access_allowed_title": "Clientes permitidos",
|
"access_allowed_title": "Clientes permitidos",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Para utilizar <1>DNS mediante HTTPS</1> o <1>DNS mediante TLS</1>, debes <0>configurar el cifrado</0> en la configuración de AdGuard Home.",
|
"setup_dns_notice": "Para utilizar <1>DNS mediante HTTPS</1> o <1>DNS mediante TLS</1>, debes <0>configurar el cifrado</0> en la configuración de AdGuard Home.",
|
||||||
"rewrite_added": "Reescritura DNS para \"{{key}}\" añadido correctamente",
|
"rewrite_added": "Reescritura DNS para \"{{key}}\" añadido correctamente",
|
||||||
"rewrite_deleted": "Reescritura DNS para \"{{key}}\" eliminado correctamente",
|
"rewrite_deleted": "Reescritura DNS para \"{{key}}\" eliminado correctamente",
|
||||||
"rewrite_updated": "Reconfiguración de DNS actualizada correctamente",
|
|
||||||
"rewrite_add": "Añadir reescritura DNS",
|
"rewrite_add": "Añadir reescritura DNS",
|
||||||
"rewrite_edit": "Editar reconfiguración de DNS",
|
|
||||||
"rewrite_not_found": "No se han encontrado reescrituras DNS",
|
"rewrite_not_found": "No se han encontrado reescrituras DNS",
|
||||||
"rewrite_confirm_delete": "¿Estás seguro de que deseas eliminar la reescritura DNS para \"{{key}}\"?",
|
"rewrite_confirm_delete": "¿Estás seguro de que deseas eliminar la reescritura DNS para \"{{key}}\"?",
|
||||||
"rewrite_desc": "Permite configurar fácilmente la respuesta DNS personalizada para un nombre de dominio específico.",
|
"rewrite_desc": "Permite configurar fácilmente la respuesta DNS personalizada para un nombre de dominio específico.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Desactivar la protección por {{count}} hora",
|
"disable_notify_for_hours": "Desactivar la protección por {{count}} hora",
|
||||||
"disable_notify_for_hours_plural": "Desactivar la protección por {{count}} horas",
|
"disable_notify_for_hours_plural": "Desactivar la protección por {{count}} horas",
|
||||||
"disable_notify_until_tomorrow": "Desactivar la protección hasta mañana",
|
"disable_notify_until_tomorrow": "Desactivar la protección hasta mañana",
|
||||||
"enable_protection_timer": "La protección se activará en {{time}}",
|
"enable_protection_timer": "La protección se activará en {{time}}"
|
||||||
"custom_retention_input": "Ingresa la retención en horas",
|
|
||||||
"custom_rotation_input": "Ingresa la rotación en horas",
|
|
||||||
"protection_section_label": "Protección",
|
|
||||||
"log_and_stats_section_label": "Registro de consultas y estadísticas",
|
|
||||||
"ignore_query_log": "Ignorar este cliente en el registro de consultas",
|
|
||||||
"ignore_statistics": "Ignorar este cliente en las estadísticas"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,8 +118,6 @@
|
|||||||
"top_clients": "بالاترین کلاینت ها",
|
"top_clients": "بالاترین کلاینت ها",
|
||||||
"no_clients_found": "کلاینتی یافت نشد",
|
"no_clients_found": "کلاینتی یافت نشد",
|
||||||
"general_statistics": "آمار عمومی",
|
"general_statistics": "آمار عمومی",
|
||||||
"top_upstreams": "سرورهای بالادست بالا",
|
|
||||||
"no_upstreams_data_found": "هیچ اطلاعاتی در مورد سرورهای بالادست یافت نشد",
|
|
||||||
"number_of_dns_query_days": "تعداد جستار DNS پردازش شده در {{count}} روز آخر",
|
"number_of_dns_query_days": "تعداد جستار DNS پردازش شده در {{count}} روز آخر",
|
||||||
"number_of_dns_query_days_plural": "تعداد جستار DNS پردازش شده در {{count}} روز گذشته",
|
"number_of_dns_query_days_plural": "تعداد جستار DNS پردازش شده در {{count}} روز گذشته",
|
||||||
"number_of_dns_query_24_hours": "تعداد جستار DNS پردازش شده در 24 ساعت گذشته",
|
"number_of_dns_query_24_hours": "تعداد جستار DNS پردازش شده در 24 ساعت گذشته",
|
||||||
@@ -151,7 +149,6 @@
|
|||||||
"upstream_dns": "سرورهای DNS جریان ارسالی",
|
"upstream_dns": "سرورهای DNS جریان ارسالی",
|
||||||
"test_upstream_btn": "تست جریان ارسالی",
|
"test_upstream_btn": "تست جریان ارسالی",
|
||||||
"upstreams": "جریان ارسالی",
|
"upstreams": "جریان ارسالی",
|
||||||
"upstream": "سرور مادر",
|
|
||||||
"apply_btn": "اِعمال",
|
"apply_btn": "اِعمال",
|
||||||
"disabled_filtering_toast": "فیلترینگ غیرفعال شده است",
|
"disabled_filtering_toast": "فیلترینگ غیرفعال شده است",
|
||||||
"enabled_filtering_toast": "فیلترینگ فعال شده است",
|
"enabled_filtering_toast": "فیلترینگ فعال شده است",
|
||||||
@@ -271,8 +268,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: پاسخ با کُد NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: پاسخ با کُد NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "Null IP: پاسخ با آدرس آی پی صفر(0.0.0.0 برای A; :: برای AAAA)",
|
"blocking_mode_null_ip": "Null IP: پاسخ با آدرس آی پی صفر(0.0.0.0 برای A; :: برای AAAA)",
|
||||||
"blocking_mode_custom_ip": "آی پی دستی: پاسخ با آدرس آی پی دستی تنظیم شده",
|
"blocking_mode_custom_ip": "آی پی دستی: پاسخ با آدرس آی پی دستی تنظیم شده",
|
||||||
"theme_light": "پوسته روشن",
|
|
||||||
"theme_dark": "پوسته تیره",
|
|
||||||
"upstream_dns_client_desc": "اگر این فیلد را خالی نگه دارید، AdGuard Home از سرور پیکربندی شده در <0> تنظیماتDNS </0> استفاده می کند.",
|
"upstream_dns_client_desc": "اگر این فیلد را خالی نگه دارید، AdGuard Home از سرور پیکربندی شده در <0> تنظیماتDNS </0> استفاده می کند.",
|
||||||
"tracker_source": "منبع ردیاب",
|
"tracker_source": "منبع ردیاب",
|
||||||
"source_label": "منبع",
|
"source_label": "منبع",
|
||||||
@@ -443,9 +438,7 @@
|
|||||||
"setup_dns_notice": "به منظور استفاده از <1>DNS-over-HTTPS</1> یا <1>DNS-over-TLS</1>، شما نیاز به <0>پیکربندی رمزگذاری</0> در تنظیمات AdGuard Home دارید.",
|
"setup_dns_notice": "به منظور استفاده از <1>DNS-over-HTTPS</1> یا <1>DNS-over-TLS</1>، شما نیاز به <0>پیکربندی رمزگذاری</0> در تنظیمات AdGuard Home دارید.",
|
||||||
"rewrite_added": "بازنویسی DNS برای \"{{key}}\" با موفقیت اضافه شد",
|
"rewrite_added": "بازنویسی DNS برای \"{{key}}\" با موفقیت اضافه شد",
|
||||||
"rewrite_deleted": "بازنویسی DNS برای \"{{key}}\" با موفقیت حذف شد",
|
"rewrite_deleted": "بازنویسی DNS برای \"{{key}}\" با موفقیت حذف شد",
|
||||||
"rewrite_updated": "بازنویسی DNS با موفقیت به روز شد",
|
|
||||||
"rewrite_add": "افزودن بازنویسی DNS",
|
"rewrite_add": "افزودن بازنویسی DNS",
|
||||||
"rewrite_edit": "بازنویسی DNS را ویرایش کنید",
|
|
||||||
"rewrite_not_found": "بازنویسی DNS یافت نشد",
|
"rewrite_not_found": "بازنویسی DNS یافت نشد",
|
||||||
"rewrite_confirm_delete": "آیا واقعا میخواهید بازنویسی DNS برای \"{{key}}\" را حذف کنید؟",
|
"rewrite_confirm_delete": "آیا واقعا میخواهید بازنویسی DNS برای \"{{key}}\" را حذف کنید؟",
|
||||||
"rewrite_desc": "به آسانی اجازه پیکربندی پاسخ DNS دستی برای یک نام دامنه خاص را می دهد.",
|
"rewrite_desc": "به آسانی اجازه پیکربندی پاسخ DNS دستی برای یک نام دامنه خاص را می دهد.",
|
||||||
@@ -574,6 +567,5 @@
|
|||||||
"use_saved_key": "از کلید ذخیره شده قبلی استفاده کنید",
|
"use_saved_key": "از کلید ذخیره شده قبلی استفاده کنید",
|
||||||
"parental_control": "نظارت والدین",
|
"parental_control": "نظارت والدین",
|
||||||
"safe_browsing": "وب گردی اَمن",
|
"safe_browsing": "وب گردی اَمن",
|
||||||
"form_error_password_length": "رمزعبور باید حداقل {{value}} کاراکتر باشد.",
|
"form_error_password_length": "رمزعبور باید حداقل {{value}} کاراکتر باشد."
|
||||||
"protection_section_label": "حفاظت"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,21 +2,21 @@
|
|||||||
"client_settings": "Päätelaiteasetukset",
|
"client_settings": "Päätelaiteasetukset",
|
||||||
"example_upstream_reserved": "ylävirta <0>tietyille verkkotunnuksille</0>;",
|
"example_upstream_reserved": "ylävirta <0>tietyille verkkotunnuksille</0>;",
|
||||||
"example_upstream_comment": "kommentti.",
|
"example_upstream_comment": "kommentti.",
|
||||||
"upstream_parallel": "Käytä rinnakkaisia pyyntöjä ja nopeuta selvitystä käyttämällä kaikkia ylävirtapalvelimia samanaikaisesti.",
|
"upstream_parallel": "Käytä rinnakkaisia pyyntöjä ja nopeuta selvitystä käyttämällä kaikkia ylävirran palvelimia samanaikaisesti.",
|
||||||
"parallel_requests": "Rinnakkaiset pyynnöt",
|
"parallel_requests": "Rinnakkaiset pyynnöt",
|
||||||
"load_balancing": "Kuormantasaus",
|
"load_balancing": "Kuormantasaus",
|
||||||
"load_balancing_desc": "Lähetä pyyntö yhdelle ylävirtapalvelimelle kerrallaan. AdGuard Home pyrkii valitsemaan nopeimman palvelimen painotetun satunnaisalgoritminsa avulla.",
|
"load_balancing_desc": "Lähetä pyyntö yhdelle ylävirran palvelimelle kerrallaan. AdGuard Home pyrkii valitsemaan nopeimman palvelimen painotetun satunnaisalgoritminsa avulla.",
|
||||||
"bootstrap_dns": "Bootstrap DNS-palvelimet",
|
"bootstrap_dns": "Bootstrap DNS-palvelimet",
|
||||||
"bootstrap_dns_desc": "Bootstrap DNS-palvelimia käytetään ylävirroiksi määritettyjen DoH/DoT-resolvereiden IP-osoitteiden selvitykseen.",
|
"bootstrap_dns_desc": "Bootstrap DNS-palvelimia käytetään ylävirroiksi määritettyjen DoH/DoT-resolvereiden IP-osoitteiden selvitykseen.",
|
||||||
"local_ptr_title": "Yksityiset käänteis-DNS-palvelimet",
|
"local_ptr_title": "Yksityiset käänteiset DNS-palvelimet",
|
||||||
"local_ptr_desc": "DNS-palvelimet, joita AdGuard Home käyttää paikallisille PTR-pyynnöille. Näitä palvelimia käytetään yksityistä IP-osoitetta käyttävien PTR-pyyntöjen osoitteiden, kuten \"192.168.12.34\", selvitykseen käänteis-DNS:n avulla. Jos ei käytössä, AdGuard Home käyttää käyttöjärjestelmän oletusarvoisia DNS-resolvereita, poislukien AdGuard Homen omat osoitteet.",
|
"local_ptr_desc": "DNS-palvelimet, joita AdGuard Home käyttää paikallisille PTR-pyynnöille. Näitä palvelimia käytetään yksityistä IP-osoitetta käyttävien PTR-pyyntöjen osoitteiden, kuten \"192.168.12.34\", selvitykseen käänteisen DNS:n avulla. Jos ei käytössä, AdGuard Home käyttää käyttöjärjestelmän oletusarvoisia DNS-resolvereita, poislukien AdGuard Homen omat osoitteet.",
|
||||||
"local_ptr_default_resolver": "Oletusarvoisesti AdGuard Home käyttää seuraavia käänteis-DNS-resolvereita: {{ip}}.",
|
"local_ptr_default_resolver": "Oletusarvoisesti AdGuard Home käyttää seuraavia käänteisiä DNS-resolvereita: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home ei voinut määrittää tälle järjestelmälle sopivaa yksityistä käänteis-DNS-resolveria.",
|
"local_ptr_no_default_resolver": "AdGuard Home ei voinut määrittää tälle järjestelmälle sopivaa yksityistä käänteistä DNS-resolveria.",
|
||||||
"local_ptr_placeholder": "Syötä yksi palvelimen osoite per rivi",
|
"local_ptr_placeholder": "Syötä yksi palvelimen osoite per rivi",
|
||||||
"resolve_clients_title": "Käytä päätelaitteiden IP-osoitteille käänteistä selvitystä",
|
"resolve_clients_title": "Käytä päätelaitteiden IP-osoitteille käänteistä selvitystä",
|
||||||
"resolve_clients_desc": "Selvitä päätelaitteiden IP-osoitteiden isäntänimet käänteisesti lähettämällä PTR-pyynnöt sopiville resolvereille (yksityiset DNS-palvelimet paikallisille päätelaitteille, ylävirtapalvelimet päätelaitteille, joilla on julkiset IP-osoitteet).",
|
"resolve_clients_desc": "Selvitä päätelaitteiden IP-osoitteiden isäntänimet käänteisesti lähettämällä PTR-pyynnöt sopiville resolvereille (yksityiset DNS-palvelimet paikallisille päätelaitteille, lähtevät palvelimet päätelaitteille, joilla on julkiset IP-osoitteet).",
|
||||||
"use_private_ptr_resolvers_title": "Käytä yksityisiä käänteis-DNS-resolvereita",
|
"use_private_ptr_resolvers_title": "Käytä yksityisiä käänteisiä DNS-resolvereita",
|
||||||
"use_private_ptr_resolvers_desc": "Suorita käänteis-DNS-selvitykset paikallisesti tarjotuille osoitteille käyttäen näitä ylävirtapalvelimia. Jos ei käytössä, vastaa AdGuard Home kaikkiin sen tyyppisiin PTR-pyyntöihin NXDOMAIN-arvolla, pois lukien DHCP, /etc/hosts, yms. -tiedoista tunnistettut päätelaitteet.",
|
"use_private_ptr_resolvers_desc": "Suorita käänteiset DNS-selvitykset paikallisesti tarjotuille osoitteille käyttäen näitä ylävirran palvelimia. Jos ei käytössä, vastaa AdGuard Home kaikkiin sen tyyppisiin PTR-pyyntöihin NXDOMAIN-arvolla, pois lukien DHCP, /etc/hosts, yms. -tiedoista tunnistettut päätelaitteet.",
|
||||||
"check_dhcp_servers": "Etsi DHCP-palvelimia",
|
"check_dhcp_servers": "Etsi DHCP-palvelimia",
|
||||||
"save_config": "Tallenna asetukset",
|
"save_config": "Tallenna asetukset",
|
||||||
"enabled_dhcp": "DHCP-palvelin otettiin käyttöön",
|
"enabled_dhcp": "DHCP-palvelin otettiin käyttöön",
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
"request_details": "Pyynnön tiedot",
|
"request_details": "Pyynnön tiedot",
|
||||||
"client_details": "Päätelaitteen tiedot",
|
"client_details": "Päätelaitteen tiedot",
|
||||||
"details": "Yksityiskohdat",
|
"details": "Yksityiskohdat",
|
||||||
"back": "Palaa takaisin",
|
"back": "Takaisin",
|
||||||
"dashboard": "Tila",
|
"dashboard": "Tila",
|
||||||
"settings": "Asetukset",
|
"settings": "Asetukset",
|
||||||
"filters": "Suodattimet",
|
"filters": "Suodattimet",
|
||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Käytetyimmät päätelaitteet",
|
"top_clients": "Käytetyimmät päätelaitteet",
|
||||||
"no_clients_found": "Päätelaitteita ei löytynyt",
|
"no_clients_found": "Päätelaitteita ei löytynyt",
|
||||||
"general_statistics": "Yleiset tilastot",
|
"general_statistics": "Yleiset tilastot",
|
||||||
"top_upstreams": "Käytetyimmät ylävirrat",
|
|
||||||
"no_upstreams_data_found": "Ylävirtatietoja ei löytynyt",
|
|
||||||
"number_of_dns_query_days": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten {{count}} päivän ajalta",
|
"number_of_dns_query_days": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten {{count}} päivän ajalta",
|
||||||
"number_of_dns_query_days_plural": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten {{count}} päivän ajalta",
|
"number_of_dns_query_days_plural": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten {{count}} päivän ajalta",
|
||||||
"number_of_dns_query_24_hours": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten 24 tunnin ajalta",
|
"number_of_dns_query_24_hours": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten 24 tunnin ajalta",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Turvallinen haku pakotettiin",
|
"enforced_save_search": "Turvallinen haku pakotettiin",
|
||||||
"number_of_dns_query_to_safe_search": "DNS-pyyntöjen määrä, joille turvallinen haku pakotettiin käyttöön",
|
"number_of_dns_query_to_safe_search": "DNS-pyyntöjen määrä, joille turvallinen haku pakotettiin käyttöön",
|
||||||
"average_processing_time": "Keskimääräinen käsittelyaika",
|
"average_processing_time": "Keskimääräinen käsittelyaika",
|
||||||
"processing_time": "Käsittelyaika",
|
|
||||||
"average_processing_time_hint": "Keskimääräinen DNS-pyynnön käsittelyyn kulutettu aika millisekunteina",
|
"average_processing_time_hint": "Keskimääräinen DNS-pyynnön käsittelyyn kulutettu aika millisekunteina",
|
||||||
"block_domain_use_filters_and_hosts": "Estä verkkotunnuksia suodattimilla ja hosts-tiedostoilla",
|
"block_domain_use_filters_and_hosts": "Estä verkkotunnuksia suodattimilla ja hosts-tiedostoilla",
|
||||||
"filters_block_toggle_hint": "Voit määrittää estosääntöjä <a>suodatinasetuksissa</a>.",
|
"filters_block_toggle_hint": "Voit määrittää estosääntöjä <a>suodatinasetuksissa</a>.",
|
||||||
@@ -149,8 +146,8 @@
|
|||||||
"no_servers_specified": "Palvelimia ei ole määritetty",
|
"no_servers_specified": "Palvelimia ei ole määritetty",
|
||||||
"general_settings": "Yleiset asetukset",
|
"general_settings": "Yleiset asetukset",
|
||||||
"dns_settings": "DNS-asetukset",
|
"dns_settings": "DNS-asetukset",
|
||||||
"dns_blocklists": "DNS-estot",
|
"dns_blocklists": "DNS-estolistat",
|
||||||
"dns_allowlists": "DNS-sallinnat",
|
"dns_allowlists": "DNS-sallittujen listat",
|
||||||
"dns_blocklists_desc": "AdGuard Home estää estolistalla olevat verkkotunnukset.",
|
"dns_blocklists_desc": "AdGuard Home estää estolistalla olevat verkkotunnukset.",
|
||||||
"dns_allowlists_desc": "DNS-sallittujen listalla olevat verkkotunnukset sallitaan myös silloin, jos ne ovat jollain muulla estolistalla.",
|
"dns_allowlists_desc": "DNS-sallittujen listalla olevat verkkotunnukset sallitaan myös silloin, jos ne ovat jollain muulla estolistalla.",
|
||||||
"custom_filtering_rules": "Omat suodatussäännöt",
|
"custom_filtering_rules": "Omat suodatussäännöt",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Määritetty tiedostossa {{path}}",
|
"upstream_dns_configured_in_file": "Määritetty tiedostossa {{path}}",
|
||||||
"test_upstream_btn": "Testaa ylävirtoja",
|
"test_upstream_btn": "Testaa ylävirtoja",
|
||||||
"upstreams": "Ylävirrat",
|
"upstreams": "Ylävirrat",
|
||||||
"upstream": "Ylävirta",
|
|
||||||
"apply_btn": "Käytä",
|
"apply_btn": "Käytä",
|
||||||
"disabled_filtering_toast": "Suodatus poistettiin käytöstä",
|
"disabled_filtering_toast": "Suodatus poistettiin käytöstä",
|
||||||
"enabled_filtering_toast": "Suodatus otettiin käyttöön",
|
"enabled_filtering_toast": "Suodatus otettiin käyttöön",
|
||||||
@@ -224,9 +220,9 @@
|
|||||||
"example_upstream_tcp_port": "tavallinen DNS (TCP, portti);",
|
"example_upstream_tcp_port": "tavallinen DNS (TCP, portti);",
|
||||||
"example_upstream_tcp_hostname": "tavallinen DNS (TCP, isäntänimi);",
|
"example_upstream_tcp_hostname": "tavallinen DNS (TCP, isäntänimi);",
|
||||||
"all_lists_up_to_date_toast": "Kaikki listat ovat ajan tasalla",
|
"all_lists_up_to_date_toast": "Kaikki listat ovat ajan tasalla",
|
||||||
"updated_upstream_dns_toast": "Ylävirtapalvelimet tallennettiin",
|
"updated_upstream_dns_toast": "Ylävirtojen palvelimet tallennettiin",
|
||||||
"dns_test_ok_toast": "Määritetyt DNS-palvelimet toimivat oikein",
|
"dns_test_ok_toast": "Määritetyt DNS-palvelimet toimivat oikein",
|
||||||
"dns_test_not_ok_toast": "Palvelin \"{{key}}\": Ei voitu käyttää, tarkista oikeinkirjoitus",
|
"dns_test_not_ok_toast": "Palvelin \"{{key}}\": ei voitu käyttää, tarkista sen oikeinkirjoitus",
|
||||||
"dns_test_warning_toast": "Datavuon \"{{key}}\" ei vastaa testipyyntöihin eikä välttämättä toimi kunnolla",
|
"dns_test_warning_toast": "Datavuon \"{{key}}\" ei vastaa testipyyntöihin eikä välttämättä toimi kunnolla",
|
||||||
"unblock": "Salli",
|
"unblock": "Salli",
|
||||||
"block": "Estä",
|
"block": "Estä",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Pyyntöhistorian tyhjennys onnistui",
|
"query_log_cleared": "Pyyntöhistorian tyhjennys onnistui",
|
||||||
"query_log_updated": "Pyyntöhistorian päivitys onnistui",
|
"query_log_updated": "Pyyntöhistorian päivitys onnistui",
|
||||||
"query_log_clear": "Tyhjennä pyyntöhistoria",
|
"query_log_clear": "Tyhjennä pyyntöhistoria",
|
||||||
"query_log_retention": "Kyselylokien kierto",
|
"query_log_retention": "Pyyntöhistorian säilytys",
|
||||||
"query_log_enable": "Käytä historiaa",
|
"query_log_enable": "Käytä historiaa",
|
||||||
"query_log_configuration": "Historian määritys",
|
"query_log_configuration": "Historian määritys",
|
||||||
"query_log_disabled": "Pyyntöhistoria ei ole käytössä. Voit ottaa sen käyttöön <0>asetuksissa</0>",
|
"query_log_disabled": "Pyyntöhistoria ei ole käytössä. Voit ottaa sen käyttöön <0>asetuksissa</0>",
|
||||||
"query_log_strict_search": "Käytä tarkalle haulle lainausmerkkejä",
|
"query_log_strict_search": "Käytä tarkalle haulle lainausmerkkejä",
|
||||||
"query_log_retention_confirm": "Haluatko varmasti muuttaa kyselylokin kiertoa? Jos pienennät intervalliarvoa, osa tiedoista menetetään",
|
"query_log_retention_confirm": "Haluatko varmasti muuttaa pyyntöhistoriasi säilytysaikaa? Jos lyhennät aikaa, joitakin tietoja menetetään",
|
||||||
"anonymize_client_ip": "Piilota päätelaitteen IP-osoite",
|
"anonymize_client_ip": "Piilota päätelaitteen IP-osoite",
|
||||||
"anonymize_client_ip_desc": "Älä tallenna päätelaitteen täydellistä IP-osoitetta historiaan ja tilastoihin.",
|
"anonymize_client_ip_desc": "Älä tallenna päätelaitteen täydellistä IP-osoitetta historiaan ja tilastoihin.",
|
||||||
"dns_config": "DNS-palvelimen määritys",
|
"dns_config": "DNS-palvelimen määritys",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Haluatko varmasti poistaa päätelaitteen \"{{key}}\"?",
|
"client_confirm_delete": "Haluatko varmasti poistaa päätelaitteen \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Haluatko varmasti poistaa tämän listan?",
|
"list_confirm_delete": "Haluatko varmasti poistaa tämän listan?",
|
||||||
"auto_clients_title": "Määrittämättömät päätelaitteet",
|
"auto_clients_title": "Määrittämättömät päätelaitteet",
|
||||||
"auto_clients_desc": "Päätelaitteet, joita ei ole määritetty pysyviksi ja jotka voivat silti käyttää AdGuard Homea. Näitä tietoja kertään useista lähteistä, mm. hosts-tiedostoista ja kääteis-DNS:llä.",
|
"auto_clients_desc": "Päätelaitteet, joita ei ole määritetty pysyviksi ja jotka voivat silti käyttää AdGuard Homea.",
|
||||||
"access_title": "Käytön asetukset",
|
"access_title": "Käytön asetukset",
|
||||||
"access_desc": "Tässä voidaan määrittää AdGuard Homen DNS-palvelimen käyttöoikeussääntöjä.",
|
"access_desc": "Tässä voidaan määrittää AdGuard Homen DNS-palvelimen käyttöoikeussääntöjä.",
|
||||||
"access_allowed_title": "Sallitut päätelaitteet",
|
"access_allowed_title": "Sallitut päätelaitteet",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "<1>DNS-over-HTTPS</1> tai <1>DNS-over-TLS</1> -toteutuksia varten, on AdGuard Homen <0>Salausasetukset</0> määritettävä.",
|
"setup_dns_notice": "<1>DNS-over-HTTPS</1> tai <1>DNS-over-TLS</1> -toteutuksia varten, on AdGuard Homen <0>Salausasetukset</0> määritettävä.",
|
||||||
"rewrite_added": "Kohteen \"{{key}}\" DNS-uudelleenohjaus lisättiin",
|
"rewrite_added": "Kohteen \"{{key}}\" DNS-uudelleenohjaus lisättiin",
|
||||||
"rewrite_deleted": "Kohteen \"{{key}}\" DNS-uudelleenohjaus poistettiin",
|
"rewrite_deleted": "Kohteen \"{{key}}\" DNS-uudelleenohjaus poistettiin",
|
||||||
"rewrite_updated": "DNS-uudelleenohjaukset päivitettiin",
|
|
||||||
"rewrite_add": "Lisää DNS-uudelleenohjaus",
|
"rewrite_add": "Lisää DNS-uudelleenohjaus",
|
||||||
"rewrite_edit": "Muokkaa DNS-uudelleenohjausta",
|
|
||||||
"rewrite_not_found": "DNS-uudelleenohjauksia ei löytynyt",
|
"rewrite_not_found": "DNS-uudelleenohjauksia ei löytynyt",
|
||||||
"rewrite_confirm_delete": "Haluatko varmasti poistaa DNS-uudelleenohjauksen kohteelle \"{{key}}\"?",
|
"rewrite_confirm_delete": "Haluatko varmasti poistaa DNS-uudelleenohjauksen kohteelle \"{{key}}\"?",
|
||||||
"rewrite_desc": "Mahdollistaa oman DNS-vastauksen helpon määrityksen tietylle verkkotunnukselle.",
|
"rewrite_desc": "Mahdollistaa oman DNS-vastauksen helpon määrityksen tietylle verkkotunnukselle.",
|
||||||
@@ -627,13 +621,13 @@
|
|||||||
"enter_cache_size": "Syötä välimuistin koko (tavuina)",
|
"enter_cache_size": "Syötä välimuistin koko (tavuina)",
|
||||||
"enter_cache_ttl_min_override": "Syötä vähimmäis-TTL (sekunteina)",
|
"enter_cache_ttl_min_override": "Syötä vähimmäis-TTL (sekunteina)",
|
||||||
"enter_cache_ttl_max_override": "Syötä enimmäis-TTL (sekunteina)",
|
"enter_cache_ttl_max_override": "Syötä enimmäis-TTL (sekunteina)",
|
||||||
"cache_ttl_min_override_desc": "Pidennä ylävirtapalvelimelta vastaanotettuja, lyhyitä elinaika-arvoja (sekunteina) tallennettaessa DNS-vastauksia välimuistiin.",
|
"cache_ttl_min_override_desc": "Pidennä ylävirran palvelimelta vastaanotettuja, lyhyitä elinaika-arvoja (sekunteina) tallennettaessa DNS-vastauksia välimuistiin.",
|
||||||
"cache_ttl_max_override_desc": "Määritä DNS-välimuistin kohteiden enimmäiselinaika (sekunteina).",
|
"cache_ttl_max_override_desc": "Määritä DNS-välimuistin kohteiden enimmäiselinaika (sekunteina).",
|
||||||
"ttl_cache_validation": "Välimuistin vähimmäiselinajan on oltava pienempi tai sama kuin enimmäiselinajan",
|
"ttl_cache_validation": "Välimuistin vähimmäiselinajan on oltava pienempi tai sama kuin enimmäiselinajan",
|
||||||
"cache_optimistic": "Optimistinen välimuisti",
|
"cache_optimistic": "Optimistinen välimuisti",
|
||||||
"cache_optimistic_desc": "Pakota AdGuard Home vastaamaan välimuistista vaikka tiedot olisivat vanhentuneet. Pyri samalla myös päivittämään tiedot.",
|
"cache_optimistic_desc": "Pakota AdGuard Home vastaamaan välimuistista vaikka tiedot olisivat vanhentuneet. Pyri samalla myös päivittämään tiedot.",
|
||||||
"filter_category_general": "Yleiset",
|
"filter_category_general": "Yleiset",
|
||||||
"filter_category_security": "Tietoturva",
|
"filter_category_security": "Turvallisuus",
|
||||||
"filter_category_regional": "Alueelliset",
|
"filter_category_regional": "Alueelliset",
|
||||||
"filter_category_other": "Muut",
|
"filter_category_other": "Muut",
|
||||||
"filter_category_general_desc": "Listat, jotka estävät seurannan ja mainokset useimmilla laitteilla",
|
"filter_category_general_desc": "Listat, jotka estävät seurannan ja mainokset useimmilla laitteilla",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Poista suojaus käytöstä {{count}} tunniksi",
|
"disable_notify_for_hours": "Poista suojaus käytöstä {{count}} tunniksi",
|
||||||
"disable_notify_for_hours_plural": "Poista suojaus käytöstä {{count}} tunniksi",
|
"disable_notify_for_hours_plural": "Poista suojaus käytöstä {{count}} tunniksi",
|
||||||
"disable_notify_until_tomorrow": "Poista suojaus käytöstä huomiseen asti",
|
"disable_notify_until_tomorrow": "Poista suojaus käytöstä huomiseen asti",
|
||||||
"enable_protection_timer": "Suojaus otetaan käyttöön {{time}} kuluttua",
|
"enable_protection_timer": "Suojaus otetaan käyttöön {{time}} kuluttua"
|
||||||
"custom_retention_input": "Syötä säilytysaika tunteina",
|
|
||||||
"custom_rotation_input": "Syötä uudistusaika tunteina",
|
|
||||||
"protection_section_label": "Suojaus",
|
|
||||||
"log_and_stats_section_label": "Kyselyhistoria ja tilastot",
|
|
||||||
"ignore_query_log": "Älä huomioi tätä päätettä kyselyhistoriassa",
|
|
||||||
"ignore_statistics": "Älä huomioi tätä päätettä tilastoissa"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Meilleurs clients",
|
"top_clients": "Meilleurs clients",
|
||||||
"no_clients_found": "Pas de clients trouvés",
|
"no_clients_found": "Pas de clients trouvés",
|
||||||
"general_statistics": "Statistiques générales",
|
"general_statistics": "Statistiques générales",
|
||||||
"top_upstreams": "Top amonts",
|
|
||||||
"no_upstreams_data_found": "Aucune donnée en amont trouvée",
|
|
||||||
"number_of_dns_query_days": "Le nombre de requêtes DNS traitées pour les {{count}} derniers jours",
|
"number_of_dns_query_days": "Le nombre de requêtes DNS traitées pour les {{count}} derniers jours",
|
||||||
"number_of_dns_query_days_plural": "Le nombre de requêtes DNS traitées ces {{count}} derniers jours",
|
"number_of_dns_query_days_plural": "Le nombre de requêtes DNS traitées ces {{count}} derniers jours",
|
||||||
"number_of_dns_query_24_hours": "Le nombre de requêtes DNS traitées au cours des 24 dernières heures",
|
"number_of_dns_query_24_hours": "Le nombre de requêtes DNS traitées au cours des 24 dernières heures",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Recherche sécurisée forcée",
|
"enforced_save_search": "Recherche sécurisée forcée",
|
||||||
"number_of_dns_query_to_safe_search": "Le nombre de requêtes DNS faites avec la Recherche securisée",
|
"number_of_dns_query_to_safe_search": "Le nombre de requêtes DNS faites avec la Recherche securisée",
|
||||||
"average_processing_time": "Temps moyen de traitement",
|
"average_processing_time": "Temps moyen de traitement",
|
||||||
"processing_time": "Délai de traitement",
|
|
||||||
"average_processing_time_hint": "Temps moyen (en millisecondes) de traitement d'une requête DNS",
|
"average_processing_time_hint": "Temps moyen (en millisecondes) de traitement d'une requête DNS",
|
||||||
"block_domain_use_filters_and_hosts": "Bloquez les domaines à l'aide des filtres et fichiers hosts",
|
"block_domain_use_filters_and_hosts": "Bloquez les domaines à l'aide des filtres et fichiers hosts",
|
||||||
"filters_block_toggle_hint": "Vous pouvez configurer les règles de filtrage dans les paramètres des <a>Filtres</a>.",
|
"filters_block_toggle_hint": "Vous pouvez configurer les règles de filtrage dans les paramètres des <a>Filtres</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Configuré dans {{path}}",
|
"upstream_dns_configured_in_file": "Configuré dans {{path}}",
|
||||||
"test_upstream_btn": "Tester les upstreams",
|
"test_upstream_btn": "Tester les upstreams",
|
||||||
"upstreams": "En amont",
|
"upstreams": "En amont",
|
||||||
"upstream": "Amont",
|
|
||||||
"apply_btn": "Appliquer",
|
"apply_btn": "Appliquer",
|
||||||
"disabled_filtering_toast": "Filtrage désactivé",
|
"disabled_filtering_toast": "Filtrage désactivé",
|
||||||
"enabled_filtering_toast": "Filtrage activé",
|
"enabled_filtering_toast": "Filtrage activé",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Le journal des requêtes a été effacé",
|
"query_log_cleared": "Le journal des requêtes a été effacé",
|
||||||
"query_log_updated": "Le journal des requêtes a été mis à jour",
|
"query_log_updated": "Le journal des requêtes a été mis à jour",
|
||||||
"query_log_clear": "Effacer journal des requêtes",
|
"query_log_clear": "Effacer journal des requêtes",
|
||||||
"query_log_retention": "Rotation des journaux de requêtes",
|
"query_log_retention": "Rétention du journal des requêtes",
|
||||||
"query_log_enable": "Activer le journal",
|
"query_log_enable": "Activer le journal",
|
||||||
"query_log_configuration": "Configuration du journal",
|
"query_log_configuration": "Configuration du journal",
|
||||||
"query_log_disabled": "Le journal des requêtes est désactivé et peut être configuré dans les <0>paramètres</0>",
|
"query_log_disabled": "Le journal des requêtes est désactivé et peut être configuré dans les <0>paramètres</0>",
|
||||||
"query_log_strict_search": "Utilisez les doubles guillemets pour une recherche stricte",
|
"query_log_strict_search": "Utilisez les doubles guillemets pour une recherche stricte",
|
||||||
"query_log_retention_confirm": "Êtes-vous sûr de souhaiter modifier la rotation des journaux de requêtes ? Si vous diminuez la valeur de l'intervalle, certaines données seront perdues",
|
"query_log_retention_confirm": "Êtes-vous sûr de vouloir modifier la rétention des journaux de requêtes ? Si vous diminuez la valeur de l'intervalle, certaines données seront perdues",
|
||||||
"anonymize_client_ip": "Anonymiser l’IP du client",
|
"anonymize_client_ip": "Anonymiser l’IP du client",
|
||||||
"anonymize_client_ip_desc": "Ne pas enregistrer l’adresse IP complète du client dans les journaux et statistiques",
|
"anonymize_client_ip_desc": "Ne pas enregistrer l’adresse IP complète du client dans les journaux et statistiques",
|
||||||
"dns_config": "Configuration du serveur DNS",
|
"dns_config": "Configuration du serveur DNS",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Voulez-vous vraiment supprimer le client « {{key}} » ?",
|
"client_confirm_delete": "Voulez-vous vraiment supprimer le client « {{key}} » ?",
|
||||||
"list_confirm_delete": "Voulez-vous vraiment supprimer cette liste ?",
|
"list_confirm_delete": "Voulez-vous vraiment supprimer cette liste ?",
|
||||||
"auto_clients_title": "Clients d'exécution",
|
"auto_clients_title": "Clients d'exécution",
|
||||||
"auto_clients_desc": "Informations sur les adresses IP des appareils qui utilisent ou pourraient utiliser AdGuard Home. Ces informations sont recueillies à partir de plusieurs sources, notamment les fichiers hosts, le DNS inverse, etc.",
|
"auto_clients_desc": "Appareils ne figurant pas sur la liste des clients persistants qui peuvent encore utiliser AdGuard Home.",
|
||||||
"access_title": "Paramètres d'accès",
|
"access_title": "Paramètres d'accès",
|
||||||
"access_desc": "Ici vous pouvez configurer les règles d'accès au serveur DNS AdGuard Home",
|
"access_desc": "Ici vous pouvez configurer les règles d'accès au serveur DNS AdGuard Home",
|
||||||
"access_allowed_title": "Clients autorisés",
|
"access_allowed_title": "Clients autorisés",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Pour utiliser le <1>DNS-over-HTTPS</1> ou le <1>DNS-over-TLS</1>, vous devez <0>configurer le Chiffrement</0> dans les paramètres de AdGuard Home.",
|
"setup_dns_notice": "Pour utiliser le <1>DNS-over-HTTPS</1> ou le <1>DNS-over-TLS</1>, vous devez <0>configurer le Chiffrement</0> dans les paramètres de AdGuard Home.",
|
||||||
"rewrite_added": "Réécriture DNS pour « {{key}} » ajoutée",
|
"rewrite_added": "Réécriture DNS pour « {{key}} » ajoutée",
|
||||||
"rewrite_deleted": "Réécriture DNS pour « {{key}} » supprimée",
|
"rewrite_deleted": "Réécriture DNS pour « {{key}} » supprimée",
|
||||||
"rewrite_updated": "Réécriture DNS mise à jour",
|
|
||||||
"rewrite_add": "Ajouter une réécriture DNS",
|
"rewrite_add": "Ajouter une réécriture DNS",
|
||||||
"rewrite_edit": "Modifier la réécriture DNS",
|
|
||||||
"rewrite_not_found": "Aucune réécriture DNS trouvée",
|
"rewrite_not_found": "Aucune réécriture DNS trouvée",
|
||||||
"rewrite_confirm_delete": "Voulez-vous vraiment supprimer la réécriture DNS pour « {{key}} » ?",
|
"rewrite_confirm_delete": "Voulez-vous vraiment supprimer la réécriture DNS pour « {{key}} » ?",
|
||||||
"rewrite_desc": "Permet de configurer facilement la réponse DNS personnalisée pour un nom de domaine spécifique.",
|
"rewrite_desc": "Permet de configurer facilement la réponse DNS personnalisée pour un nom de domaine spécifique.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Désactiver la protection pendant {{count}} heure",
|
"disable_notify_for_hours": "Désactiver la protection pendant {{count}} heure",
|
||||||
"disable_notify_for_hours_plural": "Désactiver la protection pendant {{count}} heures",
|
"disable_notify_for_hours_plural": "Désactiver la protection pendant {{count}} heures",
|
||||||
"disable_notify_until_tomorrow": "Désactiver la protection jusqu'à demain",
|
"disable_notify_until_tomorrow": "Désactiver la protection jusqu'à demain",
|
||||||
"enable_protection_timer": "La protection sera activée dans {{time}}",
|
"enable_protection_timer": "La protection sera activée dans {{time}}"
|
||||||
"custom_retention_input": "Saisir la rétention en heures",
|
|
||||||
"custom_rotation_input": "Saisir la rotation en heures",
|
|
||||||
"protection_section_label": "Protection",
|
|
||||||
"log_and_stats_section_label": "Journal des requêtes et statistiques",
|
|
||||||
"ignore_query_log": "Ignorer ce client dans le journal des requêtes",
|
|
||||||
"ignore_statistics": "Ignorer ce client dans les statistiques"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Top klijenti",
|
"top_clients": "Top klijenti",
|
||||||
"no_clients_found": "Nema pronađenih klijenata",
|
"no_clients_found": "Nema pronađenih klijenata",
|
||||||
"general_statistics": "Opća statistika",
|
"general_statistics": "Opća statistika",
|
||||||
"top_upstreams": "Top upstream poslužitelji",
|
|
||||||
"no_upstreams_data_found": "Nema podataka o upstream poslužiteljima",
|
|
||||||
"number_of_dns_query_days": "Broj DNS upita obrađenih u posljednja {{count}} dan",
|
"number_of_dns_query_days": "Broj DNS upita obrađenih u posljednja {{count}} dan",
|
||||||
"number_of_dns_query_days_plural": "Broj DNS upita obrađenih u posljednja {{count}} dana",
|
"number_of_dns_query_days_plural": "Broj DNS upita obrađenih u posljednja {{count}} dana",
|
||||||
"number_of_dns_query_24_hours": "Broj DNS upita obrađenih u posljednja 24 sata",
|
"number_of_dns_query_24_hours": "Broj DNS upita obrađenih u posljednja 24 sata",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Postavljeno u {{path}}",
|
"upstream_dns_configured_in_file": "Postavljeno u {{path}}",
|
||||||
"test_upstream_btn": "Testiraj upstream-ove",
|
"test_upstream_btn": "Testiraj upstream-ove",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream poslužitelj",
|
|
||||||
"apply_btn": "Primijeni",
|
"apply_btn": "Primijeni",
|
||||||
"disabled_filtering_toast": "Onemogućeno filtriranje",
|
"disabled_filtering_toast": "Onemogućeno filtriranje",
|
||||||
"enabled_filtering_toast": "Omogućeno filtriranje",
|
"enabled_filtering_toast": "Omogućeno filtriranje",
|
||||||
@@ -260,12 +257,12 @@
|
|||||||
"query_log_cleared": "Zapisnik upita je uspješno uklonjen",
|
"query_log_cleared": "Zapisnik upita je uspješno uklonjen",
|
||||||
"query_log_updated": "Zapisnik upita je uspješno ažuriran",
|
"query_log_updated": "Zapisnik upita je uspješno ažuriran",
|
||||||
"query_log_clear": "Očisti zapisnik upita",
|
"query_log_clear": "Očisti zapisnik upita",
|
||||||
"query_log_retention": "Rotacija dnevnika upita",
|
"query_log_retention": "Spremanje zapisnika upita",
|
||||||
"query_log_enable": "Omogući zapise",
|
"query_log_enable": "Omogući zapise",
|
||||||
"query_log_configuration": "Postavke zapisa",
|
"query_log_configuration": "Postavke zapisa",
|
||||||
"query_log_disabled": "Zapisnik upita je onemogućen i može se postaviti u <0>postavkama</0>",
|
"query_log_disabled": "Zapisnik upita je onemogućen i može se postaviti u <0>postavkama</0>",
|
||||||
"query_log_strict_search": "Koristite dvostruke navodnike za strogo pretraživanje",
|
"query_log_strict_search": "Koristite dvostruke navodnike za strogo pretraživanje",
|
||||||
"query_log_retention_confirm": "Jeste li sigurni da želite promijeniti rotaciju dnevnika upita? Ako smanjite vrijednost intervala, neki će se podaci izgubiti",
|
"query_log_retention_confirm": "Jeste li sigurni da želite promijeniti zadržavanje zapisnika upita? Ako smanjite vrijednost intervala, neki će podaci biti izgubljeni",
|
||||||
"anonymize_client_ip": "Anonimiraj IP klijenta",
|
"anonymize_client_ip": "Anonimiraj IP klijenta",
|
||||||
"anonymize_client_ip_desc": "Ne spremajte cijelu IP adresu klijenta u zapisnike i statistike",
|
"anonymize_client_ip_desc": "Ne spremajte cijelu IP adresu klijenta u zapisnike i statistike",
|
||||||
"dns_config": "DNS postavke poslužitelja",
|
"dns_config": "DNS postavke poslužitelja",
|
||||||
@@ -447,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Jeste li sigurni da želite ukloniti \"{{key}}\" klijenta?",
|
"client_confirm_delete": "Jeste li sigurni da želite ukloniti \"{{key}}\" klijenta?",
|
||||||
"list_confirm_delete": "Jeste li sigurni da želite ukloniti ovaj popis?",
|
"list_confirm_delete": "Jeste li sigurni da želite ukloniti ovaj popis?",
|
||||||
"auto_clients_title": "Runtime klijenti",
|
"auto_clients_title": "Runtime klijenti",
|
||||||
"auto_clients_desc": "Informacije o IP adresama uređaja koji koriste ili bi mogli koristiti AdGuard Home. Ove informacije prikupljaju se iz nekoliko izvora, uključujući datoteke hostova, obrnuti DNS itd.",
|
"auto_clients_desc": "Podaci na klijentu koji koriste AdGuard Home, ali se ne mijenjaju u postavkama",
|
||||||
"access_title": "Postavke pristupa",
|
"access_title": "Postavke pristupa",
|
||||||
"access_desc": "Ovdje možete konfigurirati pravila pristupa za AdGuard Home DNS poslužitelj",
|
"access_desc": "Ovdje možete konfigurirati pravila pristupa za AdGuard Home DNS poslužitelj",
|
||||||
"access_allowed_title": "Dopušteni klijenti",
|
"access_allowed_title": "Dopušteni klijenti",
|
||||||
@@ -481,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Da biste koristili <1>DNS-over-HTTPS</1> ili <1>DNS-over-TLS</1>, morate <0>postaviti šifriranje</0> u AdGuard Home postavkama.",
|
"setup_dns_notice": "Da biste koristili <1>DNS-over-HTTPS</1> ili <1>DNS-over-TLS</1>, morate <0>postaviti šifriranje</0> u AdGuard Home postavkama.",
|
||||||
"rewrite_added": "DNS prijepis za \"{{key}}\" je uspješno dodan",
|
"rewrite_added": "DNS prijepis za \"{{key}}\" je uspješno dodan",
|
||||||
"rewrite_deleted": "DNS prijepis za \"{{key}}\" je uspješno uklonjen",
|
"rewrite_deleted": "DNS prijepis za \"{{key}}\" je uspješno uklonjen",
|
||||||
"rewrite_updated": "Prepisivanje DNS-a uspješno ažurirano",
|
|
||||||
"rewrite_add": "Dodaj DNS prijepis",
|
"rewrite_add": "Dodaj DNS prijepis",
|
||||||
"rewrite_edit": "Uredite prepisivanje DNS-a",
|
|
||||||
"rewrite_not_found": "Nema DNS prijepisa",
|
"rewrite_not_found": "Nema DNS prijepisa",
|
||||||
"rewrite_confirm_delete": "Jeste li sigurni da želite ukloniti DNS prijepis za \"{{key}}\" klijenta?",
|
"rewrite_confirm_delete": "Jeste li sigurni da želite ukloniti DNS prijepis za \"{{key}}\" klijenta?",
|
||||||
"rewrite_desc": "Omogućuje jednostavno postavljanje prilagođenog DNS odgovora za određenu domenu.",
|
"rewrite_desc": "Omogućuje jednostavno postavljanje prilagođenog DNS odgovora za određenu domenu.",
|
||||||
@@ -673,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Isključi zaštitu na {{count}} sati",
|
"disable_notify_for_hours": "Isključi zaštitu na {{count}} sati",
|
||||||
"disable_notify_for_hours_plural": "Isključi zaštitu na {{count}} sati",
|
"disable_notify_for_hours_plural": "Isključi zaštitu na {{count}} sati",
|
||||||
"disable_notify_until_tomorrow": "Isključi zaštitu do sutra",
|
"disable_notify_until_tomorrow": "Isključi zaštitu do sutra",
|
||||||
"enable_protection_timer": "Zaštita će biti omogućena u {{time}}",
|
"enable_protection_timer": "Zaštita će biti omogućena u {{time}}"
|
||||||
"custom_retention_input": "Unesite zadržavanje u satima",
|
|
||||||
"custom_rotation_input": "Unesite rotaciju u satima",
|
|
||||||
"protection_section_label": "Zaštita",
|
|
||||||
"log_and_stats_section_label": "Zapisnik upita i statistika",
|
|
||||||
"ignore_query_log": "Zanemari ovog klijenta u zapisniku upita",
|
|
||||||
"ignore_statistics": "Ignorirajte ovog klijenta u statistici"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Legaktívabb kliensek",
|
"top_clients": "Legaktívabb kliensek",
|
||||||
"no_clients_found": "Nem található kliens",
|
"no_clients_found": "Nem található kliens",
|
||||||
"general_statistics": "Általános statisztikák",
|
"general_statistics": "Általános statisztikák",
|
||||||
"top_upstreams": "Top upstream szerverek",
|
|
||||||
"no_upstreams_data_found": "Nem található upstream szerver adat",
|
|
||||||
"number_of_dns_query_days": "Lekérdezések száma az utolsó {{count}} napban",
|
"number_of_dns_query_days": "Lekérdezések száma az utolsó {{count}} napban",
|
||||||
"number_of_dns_query_days_plural": "Feldolgozott DNS lekérdezések száma az utolsó {{count}} napban",
|
"number_of_dns_query_days_plural": "Feldolgozott DNS lekérdezések száma az utolsó {{count}} napban",
|
||||||
"number_of_dns_query_24_hours": "Az elmúlt 24 órában feldolgozott DNS lekérdezések száma",
|
"number_of_dns_query_24_hours": "Az elmúlt 24 órában feldolgozott DNS lekérdezések száma",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Beállítva itt: {{path}}",
|
"upstream_dns_configured_in_file": "Beállítva itt: {{path}}",
|
||||||
"test_upstream_btn": "Upstreamek tesztelése",
|
"test_upstream_btn": "Upstreamek tesztelése",
|
||||||
"upstreams": "Upstream-ek",
|
"upstreams": "Upstream-ek",
|
||||||
"upstream": "Upstream szerver",
|
|
||||||
"apply_btn": "Alkalmaz",
|
"apply_btn": "Alkalmaz",
|
||||||
"disabled_filtering_toast": "Szűrés letiltva",
|
"disabled_filtering_toast": "Szűrés letiltva",
|
||||||
"enabled_filtering_toast": "Szűrés engedélyezve",
|
"enabled_filtering_toast": "Szűrés engedélyezve",
|
||||||
@@ -170,7 +167,6 @@
|
|||||||
"enabled_parental_toast": "Szülői felügyelet engedélyezve",
|
"enabled_parental_toast": "Szülői felügyelet engedélyezve",
|
||||||
"disabled_safe_search_toast": "Biztonságos keresés letiltva",
|
"disabled_safe_search_toast": "Biztonságos keresés letiltva",
|
||||||
"enabled_save_search_toast": "Biztonságos keresés engedélyezve",
|
"enabled_save_search_toast": "Biztonságos keresés engedélyezve",
|
||||||
"updated_save_search_toast": "A Biztonságos keresés beállításai frissítve",
|
|
||||||
"enabled_table_header": "Engedélyezve",
|
"enabled_table_header": "Engedélyezve",
|
||||||
"name_table_header": "Név",
|
"name_table_header": "Név",
|
||||||
"list_url_table_header": "Lista URL-je",
|
"list_url_table_header": "Lista URL-je",
|
||||||
@@ -294,8 +290,6 @@
|
|||||||
"rate_limit": "Kérések korlátozása",
|
"rate_limit": "Kérések korlátozása",
|
||||||
"edns_enable": "EDNS kliens alhálózat engedélyezése",
|
"edns_enable": "EDNS kliens alhálózat engedélyezése",
|
||||||
"edns_cs_desc": "Adja hozzá az EDNS Client Subnet beállítást (ECS) a felfelé irányuló kérésekhez, és naplózza a kliensek által küldött értékeket a lekérdezési naplóban.",
|
"edns_cs_desc": "Adja hozzá az EDNS Client Subnet beállítást (ECS) a felfelé irányuló kérésekhez, és naplózza a kliensek által küldött értékeket a lekérdezési naplóban.",
|
||||||
"edns_use_custom_ip": "Használjon egyéni IP-címet az EDNS-hez",
|
|
||||||
"edns_use_custom_ip_desc": "Engedélyezze az egyéni IP-cím használatát az EDNS-hez",
|
|
||||||
"rate_limit_desc": "Maximálisan hány kérést küldhet egy kliens másodpercenkén. Ha 0-ra állítja, akkor nincs korlátozás.",
|
"rate_limit_desc": "Maximálisan hány kérést küldhet egy kliens másodpercenkén. Ha 0-ra állítja, akkor nincs korlátozás.",
|
||||||
"blocking_ipv4_desc": "A blokkolt A kéréshez visszaadandó IP-cím",
|
"blocking_ipv4_desc": "A blokkolt A kéréshez visszaadandó IP-cím",
|
||||||
"blocking_ipv6_desc": "A blokkolt AAAA kéréshez visszaadandó IP-cím",
|
"blocking_ipv6_desc": "A blokkolt AAAA kéréshez visszaadandó IP-cím",
|
||||||
@@ -447,7 +441,7 @@
|
|||||||
"client_confirm_delete": "Biztosan törölni szeretné a(z) \"{{key}}\" klienst?",
|
"client_confirm_delete": "Biztosan törölni szeretné a(z) \"{{key}}\" klienst?",
|
||||||
"list_confirm_delete": "Biztosan törölni kívánja ezt a listát?",
|
"list_confirm_delete": "Biztosan törölni kívánja ezt a listát?",
|
||||||
"auto_clients_title": "Futási idejű kliensek",
|
"auto_clients_title": "Futási idejű kliensek",
|
||||||
"auto_clients_desc": "Az AdGuard Home-ot használó vagy esetleg használó eszközök IP-címeire vonatkozó információk. Ezeket az információkat több forrásból gyűjtik, beleértve a hosts fájlokat, a fordított DNS-t stb.",
|
"auto_clients_desc": "Ezek az eszközök nem szerepelnek a fenntartott kliensek listáján, de használják az AdGuard Home-ot",
|
||||||
"access_title": "Hozzáférési beállítások",
|
"access_title": "Hozzáférési beállítások",
|
||||||
"access_desc": "Itt konfigurálhatja az AdGuard Home DNS-kiszolgáló hozzáférési szabályait",
|
"access_desc": "Itt konfigurálhatja az AdGuard Home DNS-kiszolgáló hozzáférési szabályait",
|
||||||
"access_allowed_title": "Engedélyezett kliensek",
|
"access_allowed_title": "Engedélyezett kliensek",
|
||||||
@@ -481,9 +475,7 @@
|
|||||||
"setup_dns_notice": "Ahhoz, hogy a <1>DNS-over-HTTPS</1> vagy a <1>DNS-over-TLS</1> valamelyikét használja, muszáj <0>beállítania a titkosítást</0> az AdGuard Home beállításaiban.",
|
"setup_dns_notice": "Ahhoz, hogy a <1>DNS-over-HTTPS</1> vagy a <1>DNS-over-TLS</1> valamelyikét használja, muszáj <0>beállítania a titkosítást</0> az AdGuard Home beállításaiban.",
|
||||||
"rewrite_added": "DNS átírás a(z) \"{{key}}\" kulcshoz sikeresen hozzáadva",
|
"rewrite_added": "DNS átírás a(z) \"{{key}}\" kulcshoz sikeresen hozzáadva",
|
||||||
"rewrite_deleted": "DNS átírás a(z) \"{{key}}\" kulcshoz sikeresen törölve",
|
"rewrite_deleted": "DNS átírás a(z) \"{{key}}\" kulcshoz sikeresen törölve",
|
||||||
"rewrite_updated": "A DNS újraírása sikeresen frissítve",
|
|
||||||
"rewrite_add": "DNS átírás hozzáadása",
|
"rewrite_add": "DNS átírás hozzáadása",
|
||||||
"rewrite_edit": "DNS újraírás szerkesztése",
|
|
||||||
"rewrite_not_found": "Nem találhatók DNS átírások",
|
"rewrite_not_found": "Nem találhatók DNS átírások",
|
||||||
"rewrite_confirm_delete": "Biztosan törölni szeretné a DNS átírást ehhez: \"{{key}}\"?",
|
"rewrite_confirm_delete": "Biztosan törölni szeretné a DNS átírást ehhez: \"{{key}}\"?",
|
||||||
"rewrite_desc": "Lehetővé teszi, hogy egyszerűen beállítson egyéni DNS választ egy adott domain névhez.",
|
"rewrite_desc": "Lehetővé teszi, hogy egyszerűen beállítson egyéni DNS választ egy adott domain névhez.",
|
||||||
@@ -531,10 +523,6 @@
|
|||||||
"statistics_retention_confirm": "Biztos benne, hogy megváltoztatja a statisztika megőrzési idejét? Ha csökkentette az értéket, a megadottnál korábbi adatok elvesznek",
|
"statistics_retention_confirm": "Biztos benne, hogy megváltoztatja a statisztika megőrzési idejét? Ha csökkentette az értéket, a megadottnál korábbi adatok elvesznek",
|
||||||
"statistics_cleared": "A statisztikák sikeresen vissza lettek állítva",
|
"statistics_cleared": "A statisztikák sikeresen vissza lettek állítva",
|
||||||
"statistics_enable": "Statisztikák engedélyezése",
|
"statistics_enable": "Statisztikák engedélyezése",
|
||||||
"ignore_domains": "Figyelmen kívül hagyott domainek (újsorral elválasztva)",
|
|
||||||
"ignore_domains_title": "Figyelmen kívül hagyott domainek",
|
|
||||||
"ignore_domains_desc_stats": "Az ezekre a tartományokra vonatkozó lekérdezések nem kerülnek a statisztikákba",
|
|
||||||
"ignore_domains_desc_query": "Az ezekhez a tartományokhoz tartozó lekérdezések nem kerülnek a lekérdezési naplóba",
|
|
||||||
"interval_hours": "{{count}} óra",
|
"interval_hours": "{{count}} óra",
|
||||||
"interval_hours_plural": "{{count}} óra",
|
"interval_hours_plural": "{{count}} óra",
|
||||||
"filters_configuration": "Szűrők beállításai",
|
"filters_configuration": "Szűrők beállításai",
|
||||||
@@ -654,30 +642,5 @@
|
|||||||
"anonymizer_notification": "<0>Megjegyzés:</0> Az IP anonimizálás engedélyezve van. Az <1>Általános beállításoknál letilthatja</1> .",
|
"anonymizer_notification": "<0>Megjegyzés:</0> Az IP anonimizálás engedélyezve van. Az <1>Általános beállításoknál letilthatja</1> .",
|
||||||
"confirm_dns_cache_clear": "Biztos benne, hogy törölni szeretné a DNS-gyorsítótárat?",
|
"confirm_dns_cache_clear": "Biztos benne, hogy törölni szeretné a DNS-gyorsítótárat?",
|
||||||
"cache_cleared": "A DNS gyorsítótár sikeresen törlődött",
|
"cache_cleared": "A DNS gyorsítótár sikeresen törlődött",
|
||||||
"clear_cache": "Gyorsítótár törlése",
|
"clear_cache": "Gyorsítótár törlése"
|
||||||
"make_static": "Statikussá tétel",
|
|
||||||
"theme_auto_desc": "Automatikus (az eszköz színsémájától függően)",
|
|
||||||
"theme_dark_desc": "Sötét téma",
|
|
||||||
"theme_light_desc": "Világos téma",
|
|
||||||
"disable_for_seconds": "{{count}} másodpercig",
|
|
||||||
"disable_for_seconds_plural": "{{count}} másodpercig",
|
|
||||||
"disable_for_minutes": "{{count}} percig",
|
|
||||||
"disable_for_minutes_plural": "{{count}} percig",
|
|
||||||
"disable_for_hours": "{{count}} óráig",
|
|
||||||
"disable_for_hours_plural": "{{count}} óráig",
|
|
||||||
"disable_until_tomorrow": "Holnapig",
|
|
||||||
"disable_notify_for_seconds": "Kapcsolja ki a védelmet {{count}} másodpercre",
|
|
||||||
"disable_notify_for_seconds_plural": "Kapcsolja ki a védelmet {{count}} másodpercre",
|
|
||||||
"disable_notify_for_minutes": "Kapcsolja ki a védelmet {{count}} percre",
|
|
||||||
"disable_notify_for_minutes_plural": "Kapcsolja ki a védelmet {{count}} percre",
|
|
||||||
"disable_notify_for_hours": "Kapcsolja ki a védelmet {{count}} órára",
|
|
||||||
"disable_notify_for_hours_plural": "Kapcsolja ki a védelmet {{count}} órára",
|
|
||||||
"disable_notify_until_tomorrow": "Holnapig kapcsolja ki a védelmet",
|
|
||||||
"enable_protection_timer": "A védelem {{time}}-kor aktiválódik",
|
|
||||||
"custom_retention_input": "Adja meg a megőrzést órákban",
|
|
||||||
"custom_rotation_input": "Írja be a forgatást órákban",
|
|
||||||
"protection_section_label": "Védelem",
|
|
||||||
"log_and_stats_section_label": "Lekérdezési napló és statisztikák",
|
|
||||||
"ignore_query_log": "Figyelmen kívül hagyja ezt az ügyfelet a lekérdezési naplóban",
|
|
||||||
"ignore_statistics": "Hagyja figyelmen kívül ezt az ügyfelet a statisztikákban"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Klien teratas",
|
"top_clients": "Klien teratas",
|
||||||
"no_clients_found": "Tidak ditemukan klien",
|
"no_clients_found": "Tidak ditemukan klien",
|
||||||
"general_statistics": "Statistik umum",
|
"general_statistics": "Statistik umum",
|
||||||
"top_upstreams": "Top servers upstream",
|
|
||||||
"no_upstreams_data_found": "Tidak ada data server upstream yang ditemukan",
|
|
||||||
"number_of_dns_query_days": "Jumlah kueri DNS diproses selama {{value}} hari terakhir",
|
"number_of_dns_query_days": "Jumlah kueri DNS diproses selama {{value}} hari terakhir",
|
||||||
"number_of_dns_query_days_plural": "Jumlah kueri DNS yang diproses selama {{count}} hari terakhir",
|
"number_of_dns_query_days_plural": "Jumlah kueri DNS yang diproses selama {{count}} hari terakhir",
|
||||||
"number_of_dns_query_24_hours": "Jumlah kueri DNS diproses selama 24 jam terakhir",
|
"number_of_dns_query_24_hours": "Jumlah kueri DNS diproses selama 24 jam terakhir",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Diatur dalam {{path}}",
|
"upstream_dns_configured_in_file": "Diatur dalam {{path}}",
|
||||||
"test_upstream_btn": "Uji hulu",
|
"test_upstream_btn": "Uji hulu",
|
||||||
"upstreams": "Upstream",
|
"upstreams": "Upstream",
|
||||||
"upstream": "Server upstream",
|
|
||||||
"apply_btn": "Terapkan",
|
"apply_btn": "Terapkan",
|
||||||
"disabled_filtering_toast": "Penyaringan nonaktif",
|
"disabled_filtering_toast": "Penyaringan nonaktif",
|
||||||
"enabled_filtering_toast": "Penyaringan aktif",
|
"enabled_filtering_toast": "Penyaringan aktif",
|
||||||
@@ -477,9 +474,7 @@
|
|||||||
"setup_dns_notice": "Jikalau ingin menggunakan <1>DNS-over-HTTPS</1> atau <1>DNS-over-TLS</1>, Anda perlu <0>mengatur Enkripsi</0> pada pengaturan AdGuard Home.",
|
"setup_dns_notice": "Jikalau ingin menggunakan <1>DNS-over-HTTPS</1> atau <1>DNS-over-TLS</1>, Anda perlu <0>mengatur Enkripsi</0> pada pengaturan AdGuard Home.",
|
||||||
"rewrite_added": "DNS rewrite untuk \"{{key}}\" berhasil ditambahkan",
|
"rewrite_added": "DNS rewrite untuk \"{{key}}\" berhasil ditambahkan",
|
||||||
"rewrite_deleted": "DNS rewrite untuk \"{{key}}\" berhasil dihapus",
|
"rewrite_deleted": "DNS rewrite untuk \"{{key}}\" berhasil dihapus",
|
||||||
"rewrite_updated": "Penulisan ulang DNS berhasil diperbarui",
|
|
||||||
"rewrite_add": "Tambah DNS rewrite",
|
"rewrite_add": "Tambah DNS rewrite",
|
||||||
"rewrite_edit": "Edit penulisan ulang DNS",
|
|
||||||
"rewrite_not_found": "Tidak ada DNS rewrite ditemukan",
|
"rewrite_not_found": "Tidak ada DNS rewrite ditemukan",
|
||||||
"rewrite_confirm_delete": "Apakah anda yakin ingin menghapus DNS rewrite untuk \"{{key}}\"?",
|
"rewrite_confirm_delete": "Apakah anda yakin ingin menghapus DNS rewrite untuk \"{{key}}\"?",
|
||||||
"rewrite_desc": "Memungkinkan untuk dengan mudah mengkonfigurasi respons DNS kustom untuk nama domain tertentu.",
|
"rewrite_desc": "Memungkinkan untuk dengan mudah mengkonfigurasi respons DNS kustom untuk nama domain tertentu.",
|
||||||
@@ -646,6 +641,5 @@
|
|||||||
"anonymizer_notification": "<0>Catatan:</0> Anonimisasi IP diaktifkan. Anda dapat menonaktifkannya di <1>Pengaturan umum</1> .",
|
"anonymizer_notification": "<0>Catatan:</0> Anonimisasi IP diaktifkan. Anda dapat menonaktifkannya di <1>Pengaturan umum</1> .",
|
||||||
"confirm_dns_cache_clear": "Apakah Anda yakin ingin menghapus cache DNS?",
|
"confirm_dns_cache_clear": "Apakah Anda yakin ingin menghapus cache DNS?",
|
||||||
"cache_cleared": "Cache DNS berhasil dibersihkan",
|
"cache_cleared": "Cache DNS berhasil dibersihkan",
|
||||||
"clear_cache": "Hapus cache",
|
"clear_cache": "Hapus cache"
|
||||||
"protection_section_label": "Perlindungan"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Client più utilizzati",
|
"top_clients": "Client più utilizzati",
|
||||||
"no_clients_found": "Nessun client trovato",
|
"no_clients_found": "Nessun client trovato",
|
||||||
"general_statistics": "Statistiche generali",
|
"general_statistics": "Statistiche generali",
|
||||||
"top_upstreams": "Top upstream",
|
|
||||||
"no_upstreams_data_found": "Nessun dato upstream trovato",
|
|
||||||
"number_of_dns_query_days": "Numero di richieste DNS elaborate negli ultimi {{count}} giorni",
|
"number_of_dns_query_days": "Numero di richieste DNS elaborate negli ultimi {{count}} giorni",
|
||||||
"number_of_dns_query_days_plural": "Numero di richieste DNS elaborate negli ultimi {{count}} giorni",
|
"number_of_dns_query_days_plural": "Numero di richieste DNS elaborate negli ultimi {{count}} giorni",
|
||||||
"number_of_dns_query_24_hours": "Numero di richieste DNS elaborate nelle ultime 24 ore",
|
"number_of_dns_query_24_hours": "Numero di richieste DNS elaborate nelle ultime 24 ore",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Ricerca sicura forzata",
|
"enforced_save_search": "Ricerca sicura forzata",
|
||||||
"number_of_dns_query_to_safe_search": "Numero di richieste DNS dai motori di ricerca per i quali la Ricerca Sicura è stata forzata",
|
"number_of_dns_query_to_safe_search": "Numero di richieste DNS dai motori di ricerca per i quali la Ricerca Sicura è stata forzata",
|
||||||
"average_processing_time": "Tempo di elaborazione medio",
|
"average_processing_time": "Tempo di elaborazione medio",
|
||||||
"processing_time": "Tempo di elaborazione",
|
|
||||||
"average_processing_time_hint": "Tempo medio in millisecondi per elaborare una richiesta DNS",
|
"average_processing_time_hint": "Tempo medio in millisecondi per elaborare una richiesta DNS",
|
||||||
"block_domain_use_filters_and_hosts": "Blocca domini utilizzando filtri e file hosts",
|
"block_domain_use_filters_and_hosts": "Blocca domini utilizzando filtri e file hosts",
|
||||||
"filters_block_toggle_hint": "Puoi impostare le regole di blocco nelle impostazioni dei <a>Filtri</a>.",
|
"filters_block_toggle_hint": "Puoi impostare le regole di blocco nelle impostazioni dei <a>Filtri</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Configurato su {{path}}",
|
"upstream_dns_configured_in_file": "Configurato su {{path}}",
|
||||||
"test_upstream_btn": "Testa gli upstream",
|
"test_upstream_btn": "Testa gli upstream",
|
||||||
"upstreams": "Upstream",
|
"upstreams": "Upstream",
|
||||||
"upstream": "Upstream",
|
|
||||||
"apply_btn": "Applica",
|
"apply_btn": "Applica",
|
||||||
"disabled_filtering_toast": "Disattiva filtri",
|
"disabled_filtering_toast": "Disattiva filtri",
|
||||||
"enabled_filtering_toast": "Attiva filtri",
|
"enabled_filtering_toast": "Attiva filtri",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Il registro richieste è stato correttamente cancellato",
|
"query_log_cleared": "Il registro richieste è stato correttamente cancellato",
|
||||||
"query_log_updated": "Il registro richieste è stato correttamente aggiornato",
|
"query_log_updated": "Il registro richieste è stato correttamente aggiornato",
|
||||||
"query_log_clear": "Cancella registri richieste",
|
"query_log_clear": "Cancella registri richieste",
|
||||||
"query_log_retention": "Rotazione dei registri richieste",
|
"query_log_retention": "Conservazione dei registri richieste",
|
||||||
"query_log_enable": "Attiva registro",
|
"query_log_enable": "Attiva registro",
|
||||||
"query_log_configuration": "Configurazione registri",
|
"query_log_configuration": "Configurazione registri",
|
||||||
"query_log_disabled": "Il registro richieste è stato disattivato e può essere configurata dalle <0>impostazioni</0>",
|
"query_log_disabled": "Il registro richieste è stato disattivato e può essere configurata dalle <0>impostazioni</0>",
|
||||||
"query_log_strict_search": "Utilizzare le doppie virgolette per una ricerca precisa",
|
"query_log_strict_search": "Utilizzare le doppie virgolette per una ricerca precisa",
|
||||||
"query_log_retention_confirm": "Sei sicuro di voler modificare il registro delle richieste? Se si riduce il valore dell'intervallo, alcuni dati andranno persi",
|
"query_log_retention_confirm": "Sei sicuro di voler modificare il registro delle richieste? Se il valore di intervallo dovesse diminuire, alcuni dati andranno persi",
|
||||||
"anonymize_client_ip": "Anonimizza client IP",
|
"anonymize_client_ip": "Anonimizza client IP",
|
||||||
"anonymize_client_ip_desc": "Non salvare l'indirizzo IP completo del client nel registro o nelle statistiche",
|
"anonymize_client_ip_desc": "Non salvare l'indirizzo IP completo del client nel registro o nelle statistiche",
|
||||||
"dns_config": "Configurazione server DNS",
|
"dns_config": "Configurazione server DNS",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Sei sicuro di voler eliminare il client \"{{key}}\"?",
|
"client_confirm_delete": "Sei sicuro di voler eliminare il client \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Sei sicuro di voler eliminare questo elenco?",
|
"list_confirm_delete": "Sei sicuro di voler eliminare questo elenco?",
|
||||||
"auto_clients_title": "Client in tempo reale",
|
"auto_clients_title": "Client in tempo reale",
|
||||||
"auto_clients_desc": "Informazioni sugli indirizzi IP dei dispositivi che utilizzano o potrebbero utilizzare AdGuard Home. Queste informazioni vengono raccolte da diverse fonti, inclusi file host, DNS inverso, ecc.",
|
"auto_clients_desc": "Dispositivi non presenti nell'elenco dei client Persistenti che possono ancora utilizzare AdGuard Home",
|
||||||
"access_title": "Impostazioni di accesso",
|
"access_title": "Impostazioni di accesso",
|
||||||
"access_desc": "Qui puoi configurare le regole d'accesso per il server DNS di AdGuard Home",
|
"access_desc": "Qui puoi configurare le regole d'accesso per il server DNS di AdGuard Home",
|
||||||
"access_allowed_title": "Client permessi",
|
"access_allowed_title": "Client permessi",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Per utilizzare <1>DNS su HTTPS</1> o <1>DNS su TLS</1>, è necessario <0>configurare la crittografia</0> nelle impostazioni di AdGuard Home.",
|
"setup_dns_notice": "Per utilizzare <1>DNS su HTTPS</1> o <1>DNS su TLS</1>, è necessario <0>configurare la crittografia</0> nelle impostazioni di AdGuard Home.",
|
||||||
"rewrite_added": "Riscrittura DNS per \"{{key}}\" aggiunta correttamente",
|
"rewrite_added": "Riscrittura DNS per \"{{key}}\" aggiunta correttamente",
|
||||||
"rewrite_deleted": "La riscrittura DNS per \"{{key}}\" è stata eliminata correttamente",
|
"rewrite_deleted": "La riscrittura DNS per \"{{key}}\" è stata eliminata correttamente",
|
||||||
"rewrite_updated": "Riscrittura DNS aggiornata correttamente",
|
|
||||||
"rewrite_add": "Aggiungi la riscrittura DNS",
|
"rewrite_add": "Aggiungi la riscrittura DNS",
|
||||||
"rewrite_edit": "Modifica della riscrittura DNS",
|
|
||||||
"rewrite_not_found": "Nessuna riscrittura DNS trovata",
|
"rewrite_not_found": "Nessuna riscrittura DNS trovata",
|
||||||
"rewrite_confirm_delete": "Sei sicuro di voler cancellare la riscrittura DNS per \"{{key}}\"?",
|
"rewrite_confirm_delete": "Sei sicuro di voler cancellare la riscrittura DNS per \"{{key}}\"?",
|
||||||
"rewrite_desc": "Consente di configurare facilmente la risposta DNS personalizzata per un nome di dominio specifico.",
|
"rewrite_desc": "Consente di configurare facilmente la risposta DNS personalizzata per un nome di dominio specifico.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Disattiva la protezione per {{count}} ora",
|
"disable_notify_for_hours": "Disattiva la protezione per {{count}} ora",
|
||||||
"disable_notify_for_hours_plural": "Disattiva la protezione per {{count}} ore",
|
"disable_notify_for_hours_plural": "Disattiva la protezione per {{count}} ore",
|
||||||
"disable_notify_until_tomorrow": "Disattiva la protezione fino a domani",
|
"disable_notify_until_tomorrow": "Disattiva la protezione fino a domani",
|
||||||
"enable_protection_timer": "La protezione verrà attivata in {{time}}",
|
"enable_protection_timer": "La protezione verrà attivata in {{time}}"
|
||||||
"custom_retention_input": "Inserisci la conservazione in ore",
|
|
||||||
"custom_rotation_input": "Inserisci la rotazione in ore",
|
|
||||||
"protection_section_label": "Protezione",
|
|
||||||
"log_and_stats_section_label": "Registro richieste e statistiche",
|
|
||||||
"ignore_query_log": "Ignora questo client nel registro delle richieste",
|
|
||||||
"ignore_statistics": "Ignora questo cliente nelle statistiche"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,16 @@
|
|||||||
"load_balancing": "ロードバランシング",
|
"load_balancing": "ロードバランシング",
|
||||||
"load_balancing_desc": "一度に1つのアップストリームサーバに処理要求します。 AdGuard Homeは、重み付きランダムアルゴリズム(weighted random algorithm)を使用してサーバを選択するため、最速のサーバがより頻繁に使用されます。",
|
"load_balancing_desc": "一度に1つのアップストリームサーバに処理要求します。 AdGuard Homeは、重み付きランダムアルゴリズム(weighted random algorithm)を使用してサーバを選択するため、最速のサーバがより頻繁に使用されます。",
|
||||||
"bootstrap_dns": "ブートストラップDNSサーバ",
|
"bootstrap_dns": "ブートストラップDNSサーバ",
|
||||||
"bootstrap_dns_desc": "ブートストラップDNSサーバは、アップストリームとして指定したDoH/DoTリゾルバのIPアドレスを解決するために使用されます。",
|
"bootstrap_dns_desc": "ブートストラップDNSサーバは、上流として指定したDoH/DoTリゾルバのIPアドレスを解決するために使用されます。",
|
||||||
"local_ptr_title": "プライベートリバースDNSサーバー",
|
"local_ptr_title": "プライベートリバースDNSサーバー",
|
||||||
"local_ptr_desc": "AdGuard HomeがローカルPTRクエリに使用するDNSサーバーです。これらのサーバーは、rDNSを使ってプライベートIPアドレス(例えば\"192.168.12.34\")を持つクライアントのホスト名を解決するために使用されます。設定されていない場合、AdGuard HomeはOSのデフォルトDNSリゾルバーのアドレス(AdGuard Home自体のアドレスを除く)を自動的に使用します。",
|
"local_ptr_desc": "AdGuard HomeがローカルPTRクエリに使用するDNSサーバーです。これらのサーバーは、rDNSを使ってプライベートIPアドレス(例えば\"192.168.12.34\")を持つクライアントのホスト名を解決するために使用されます。設定されていない場合、AdGuard HomeはOSのデフォルトDNSリゾルバーのアドレス(AdGuard Home自体のアドレスを除く)を自動的に使用します。",
|
||||||
"local_ptr_default_resolver": "デフォルトでは、AdGuard Homeは次のリバースDNSリゾルバを使用します: {{ip}}",
|
"local_ptr_default_resolver": "デフォルトでは、AdGuard Homeは次のリバースDNSリゾルバを使用します: {{ip}}",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Homeは、このシステムに適したプライベートリバースDNSリゾルバを特定できませんでした。",
|
"local_ptr_no_default_resolver": "AdGuard Homeは、このシステムに適したプライベートリバースDNSリゾルバを特定できませんでした。",
|
||||||
"local_ptr_placeholder": "1行に1つのサーバを入力してください。",
|
"local_ptr_placeholder": "1行に1つのサーバを入力してください。",
|
||||||
"resolve_clients_title": "クライアントのIPアドレスの逆解決を有効にする",
|
"resolve_clients_title": "クライアントのIPアドレスの逆解決を有効にする",
|
||||||
"resolve_clients_desc": "対応するリゾルバー(ローカルクライアントの場合はプライベートDNSサーバ、パブリックIPを持つクライアントの場合はアップストリームサーバー)にPTRクエリを送信することにより、クライアントのIPアドレスをホストネームに逆解決します。",
|
"resolve_clients_desc": "対応するリゾルバー(ローカルクライアントの場合はプライベートDNSサーバ、パブリックIPを持つクライアントの場合は上流サーバ)にPTRクエリを送信することにより、クライアントのIPアドレスをホストネームに逆解決します。",
|
||||||
"use_private_ptr_resolvers_title": "プライベートリバースDNSリゾルバを使用",
|
"use_private_ptr_resolvers_title": "プライベートリバースDNSリゾルバを使用",
|
||||||
"use_private_ptr_resolvers_desc": "これらのアップストリームサーバーを使用して、ローカルで提供されるアドレスのリバースDNSルックアップを実行します。無効にすると、AdGuard Homeは、DHCP, /etc/hosts などから認識されるクライアントを除き、すべてのこのようなPTR要求にNXDOMAINで応答します。",
|
"use_private_ptr_resolvers_desc": "これらの上流サーバを使用して、ローカルで提供されるアドレスのリバースDNSルックアップを実行します。無効にすると、AdGuard Homeは、DHCP, /etc/hosts などから認識されるクライアントを除き、すべてのこのようなPTR要求にNXDOMAINで応答します。",
|
||||||
"check_dhcp_servers": "DHCPサーバをチェックする",
|
"check_dhcp_servers": "DHCPサーバをチェックする",
|
||||||
"save_config": "構成を保存する",
|
"save_config": "構成を保存する",
|
||||||
"enabled_dhcp": "DHCPサーバを有効にしました",
|
"enabled_dhcp": "DHCPサーバを有効にしました",
|
||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "トップクライアント",
|
"top_clients": "トップクライアント",
|
||||||
"no_clients_found": "クライアント情報はありません",
|
"no_clients_found": "クライアント情報はありません",
|
||||||
"general_statistics": "全般的な統計",
|
"general_statistics": "全般的な統計",
|
||||||
"top_upstreams": "上位のアップストリーム",
|
|
||||||
"no_upstreams_data_found": "アップストリームのデータが見つかりません",
|
|
||||||
"number_of_dns_query_days": "過去{{count}}日間に処理されたDNSクエリの数",
|
"number_of_dns_query_days": "過去{{count}}日間に処理されたDNSクエリの数",
|
||||||
"number_of_dns_query_days_plural": "過去{{count}}日間に処理されたDNSクエリの数",
|
"number_of_dns_query_days_plural": "過去{{count}}日間に処理されたDNSクエリの数",
|
||||||
"number_of_dns_query_24_hours": "過去24時間に処理されたDNSクエリの数",
|
"number_of_dns_query_24_hours": "過去24時間に処理されたDNSクエリの数",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "強制されたセーフサーチ",
|
"enforced_save_search": "強制されたセーフサーチ",
|
||||||
"number_of_dns_query_to_safe_search": "セーフサーチが強制適用された検索エンジンへのDNSリクエストの数",
|
"number_of_dns_query_to_safe_search": "セーフサーチが強制適用された検索エンジンへのDNSリクエストの数",
|
||||||
"average_processing_time": "平均処理時間",
|
"average_processing_time": "平均処理時間",
|
||||||
"processing_time": "処理時間",
|
|
||||||
"average_processing_time_hint": "DNSリクエストの処理にかかる平均時間(ミリ秒単位)",
|
"average_processing_time_hint": "DNSリクエストの処理にかかる平均時間(ミリ秒単位)",
|
||||||
"block_domain_use_filters_and_hosts": "フィルタとhostsファイルを使用してドメインをブロックする",
|
"block_domain_use_filters_and_hosts": "フィルタとhostsファイルを使用してドメインをブロックする",
|
||||||
"filters_block_toggle_hint": "<a>フィルタ</a>の設定でブロックするルールを設定することができます。",
|
"filters_block_toggle_hint": "<a>フィルタ</a>の設定でブロックするルールを設定することができます。",
|
||||||
@@ -156,12 +153,11 @@
|
|||||||
"custom_filtering_rules": "カスタム・フィルタリングルール",
|
"custom_filtering_rules": "カスタム・フィルタリングルール",
|
||||||
"encryption_settings": "暗号化設定",
|
"encryption_settings": "暗号化設定",
|
||||||
"dhcp_settings": "DHCP設定",
|
"dhcp_settings": "DHCP設定",
|
||||||
"upstream_dns": "アップストリームDNSサーバー",
|
"upstream_dns": "上流DNSサーバ",
|
||||||
"upstream_dns_help": "サーバのアドレスは1行に1つずつ入力してください。アップストリームDNSサーバーの構成設定について詳しくは<a>こちら</a>でご確認いただけます。",
|
"upstream_dns_help": "サーバのアドレスは1行に1つずつ入力してください。上流DNSサーバの構成設定について詳しくは<a>こちら</a>でご確認いただけます。",
|
||||||
"upstream_dns_configured_in_file": "{{path}} にて設定されています",
|
"upstream_dns_configured_in_file": "{{path}} にて設定されています",
|
||||||
"test_upstream_btn": "アップストリームをテストする",
|
"test_upstream_btn": "上流サーバをテストする",
|
||||||
"upstreams": "アップストリーム",
|
"upstreams": "上流",
|
||||||
"upstream": "アップストリーム",
|
|
||||||
"apply_btn": "適用する",
|
"apply_btn": "適用する",
|
||||||
"disabled_filtering_toast": "フィルタリングを無効にしました",
|
"disabled_filtering_toast": "フィルタリングを無効にしました",
|
||||||
"enabled_filtering_toast": "フィルタリングを有効にしました",
|
"enabled_filtering_toast": "フィルタリングを有効にしました",
|
||||||
@@ -224,7 +220,7 @@
|
|||||||
"example_upstream_tcp_port": "レギュラーDNS(over TCP、ポート付き);",
|
"example_upstream_tcp_port": "レギュラーDNS(over TCP、ポート付き);",
|
||||||
"example_upstream_tcp_hostname": "通常のDNS(over TCP, ホスト名)。",
|
"example_upstream_tcp_hostname": "通常のDNS(over TCP, ホスト名)。",
|
||||||
"all_lists_up_to_date_toast": "すべてのリストは既に最新です",
|
"all_lists_up_to_date_toast": "すべてのリストは既に最新です",
|
||||||
"updated_upstream_dns_toast": "アップストリームサーバーを保存しました。",
|
"updated_upstream_dns_toast": "上流DNSサーバを保存しました。",
|
||||||
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
|
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
|
||||||
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
|
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
|
||||||
"dns_test_warning_toast": "アップストリーム\"{{key}}\"はテストリクエストに応答せず、正しく動作しない可能性があります。",
|
"dns_test_warning_toast": "アップストリーム\"{{key}}\"はテストリクエストに応答せず、正しく動作しない可能性があります。",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "クエリ・ログの消去に成功しました",
|
"query_log_cleared": "クエリ・ログの消去に成功しました",
|
||||||
"query_log_updated": "クエリ・ログの更新が成功しました",
|
"query_log_updated": "クエリ・ログの更新が成功しました",
|
||||||
"query_log_clear": "クエリ・ログを消去する",
|
"query_log_clear": "クエリ・ログを消去する",
|
||||||
"query_log_retention": "クエリ・ログのローテーション",
|
"query_log_retention": "クエリ・ログの保持",
|
||||||
"query_log_enable": "ログを有効にする",
|
"query_log_enable": "ログを有効にする",
|
||||||
"query_log_configuration": "ログ設定",
|
"query_log_configuration": "ログ設定",
|
||||||
"query_log_disabled": "クエリ・ログは無効になっており、<0>設定</0>で構成できます",
|
"query_log_disabled": "クエリ・ログは無効になっており、<0>設定</0>で構成できます",
|
||||||
"query_log_strict_search": "完全一致検索には二重引用符を使用します",
|
"query_log_strict_search": "完全一致検索には二重引用符を使用します",
|
||||||
"query_log_retention_confirm": "クエリ・ログのローテーションを変更してもよろしいですか? 間隔の値を減らすと、一部のデータが失われます",
|
"query_log_retention_confirm": "クエリ・ログの保持を変更してもよろしいですか? 期間を短くすると、一部のデータが失われます",
|
||||||
"anonymize_client_ip": "クライアントIPを匿名化する",
|
"anonymize_client_ip": "クライアントIPを匿名化する",
|
||||||
"anonymize_client_ip_desc": "ログと統計にクライアントのフルIPアドレスを保存しないようにします。",
|
"anonymize_client_ip_desc": "ログと統計にクライアントのフルIPアドレスを保存しないようにします。",
|
||||||
"dns_config": "DNSサーバ設定",
|
"dns_config": "DNSサーバ設定",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "クライアント \"{{key}}\" を削除してもよろしいですか?",
|
"client_confirm_delete": "クライアント \"{{key}}\" を削除してもよろしいですか?",
|
||||||
"list_confirm_delete": "このリストを削除してもよろしいですか?",
|
"list_confirm_delete": "このリストを削除してもよろしいですか?",
|
||||||
"auto_clients_title": "ランタイムクライアント",
|
"auto_clients_title": "ランタイムクライアント",
|
||||||
"auto_clients_desc": "AdGuard Home を使用している、または使用する可能性のあるデバイスの IP アドレスに関する情報です。この情報は、hosts ファイル、リバース DNS など、複数の情報源から収集されます。",
|
"auto_clients_desc": "永続的クライアントのリストに未登録で、AdGuard Homeを使用する場合があるデバイスのリスト。",
|
||||||
"access_title": "アクセス設定",
|
"access_title": "アクセス設定",
|
||||||
"access_desc": "こちらでは、AdGuard Home DNSサーバーのアクセスルールを設定できます。",
|
"access_desc": "こちらでは、AdGuard Home DNSサーバーのアクセスルールを設定できます。",
|
||||||
"access_allowed_title": "許可されたクライアント",
|
"access_allowed_title": "許可されたクライアント",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "<1>DNS-over-HTTPS</1>または<1>DNS-over-TLS</1>を使用するには、AdGuard Home 設定の<0>暗号化設定</0>が必要です。",
|
"setup_dns_notice": "<1>DNS-over-HTTPS</1>または<1>DNS-over-TLS</1>を使用するには、AdGuard Home 設定の<0>暗号化設定</0>が必要です。",
|
||||||
"rewrite_added": "\"{{key}}\" のDNS書き換え情報を追加完了しました",
|
"rewrite_added": "\"{{key}}\" のDNS書き換え情報を追加完了しました",
|
||||||
"rewrite_deleted": "\"{{key}}\" のDNS書き換え情報を削除完了しました",
|
"rewrite_deleted": "\"{{key}}\" のDNS書き換え情報を削除完了しました",
|
||||||
"rewrite_updated": "DNS rewrite を更新完了しました。",
|
|
||||||
"rewrite_add": "DNS書き換え情報を追加する",
|
"rewrite_add": "DNS書き換え情報を追加する",
|
||||||
"rewrite_edit": "DNS rewrite を編集する",
|
|
||||||
"rewrite_not_found": "DNS書き換え情報はありません",
|
"rewrite_not_found": "DNS書き換え情報はありません",
|
||||||
"rewrite_confirm_delete": "\"{{key}}\" のDNS書き換え情報を削除してもよろしいですか?",
|
"rewrite_confirm_delete": "\"{{key}}\" のDNS書き換え情報を削除してもよろしいですか?",
|
||||||
"rewrite_desc": "特定のドメイン名に対するDNS応答を簡単にカスタマイズすることを可能にします。",
|
"rewrite_desc": "特定のドメイン名に対するDNS応答を簡単にカスタマイズすることを可能にします。",
|
||||||
@@ -627,7 +621,7 @@
|
|||||||
"enter_cache_size": "キャッシュサイズ(バイト単位)を入力してください",
|
"enter_cache_size": "キャッシュサイズ(バイト単位)を入力してください",
|
||||||
"enter_cache_ttl_min_override": "最小TTL(秒単位)を入力してください",
|
"enter_cache_ttl_min_override": "最小TTL(秒単位)を入力してください",
|
||||||
"enter_cache_ttl_max_override": "最大TTL(秒単位)を入力してください",
|
"enter_cache_ttl_max_override": "最大TTL(秒単位)を入力してください",
|
||||||
"cache_ttl_min_override_desc": "DNS応答をキャッシュするとき、アップストリームサーバーから受信した短いTTL(秒単位)を延長します。",
|
"cache_ttl_min_override_desc": "DNS応答をキャッシュするとき、上流サーバから受信した短いTTL(秒単位)を延長します。",
|
||||||
"cache_ttl_max_override_desc": "DNSキャッシュ内のエントリの最大TTL(秒単位)を設定します。",
|
"cache_ttl_max_override_desc": "DNSキャッシュ内のエントリの最大TTL(秒単位)を設定します。",
|
||||||
"ttl_cache_validation": "最小キャッシュTTL上書き値は最大値以下にする必要があります",
|
"ttl_cache_validation": "最小キャッシュTTL上書き値は最大値以下にする必要があります",
|
||||||
"cache_optimistic": "Optimistic cashing (オプティミスティック・キャッシュ)",
|
"cache_optimistic": "Optimistic cashing (オプティミスティック・キャッシュ)",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "保護を {{count}} 時間無効にする",
|
"disable_notify_for_hours": "保護を {{count}} 時間無効にする",
|
||||||
"disable_notify_for_hours_plural": "保護を {{count}} 時間無効にする",
|
"disable_notify_for_hours_plural": "保護を {{count}} 時間無効にする",
|
||||||
"disable_notify_until_tomorrow": "明日まで保護を無効にする",
|
"disable_notify_until_tomorrow": "明日まで保護を無効にする",
|
||||||
"enable_protection_timer": "保護は後 {{time}} で有効になります",
|
"enable_protection_timer": "保護は後 {{time}} で有効になります"
|
||||||
"custom_retention_input": "保持期間を入力してください(時間単位)",
|
|
||||||
"custom_rotation_input": "ローテーションを入力してください(時間単位)",
|
|
||||||
"protection_section_label": "AdGuardによる保護",
|
|
||||||
"log_and_stats_section_label": "クエリ・ログと統計情報",
|
|
||||||
"ignore_query_log": "クエリ・ログでこのクライアントを無視する",
|
|
||||||
"ignore_statistics": "統計でこのクライアントを無視する"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "클라이언트",
|
"top_clients": "클라이언트",
|
||||||
"no_clients_found": "클라이언트가 없습니다",
|
"no_clients_found": "클라이언트가 없습니다",
|
||||||
"general_statistics": "일반 통계",
|
"general_statistics": "일반 통계",
|
||||||
"top_upstreams": "상위 업스트림",
|
|
||||||
"no_upstreams_data_found": "업스트림 데이터 없음",
|
|
||||||
"number_of_dns_query_days": "최근 {{count}}일 동안 처리된 DNS 쿼리의 수",
|
"number_of_dns_query_days": "최근 {{count}}일 동안 처리된 DNS 쿼리의 수",
|
||||||
"number_of_dns_query_days_plural": "최근 {{count}}일 동안 처리된 DNS 쿼리의 수",
|
"number_of_dns_query_days_plural": "최근 {{count}}일 동안 처리된 DNS 쿼리의 수",
|
||||||
"number_of_dns_query_24_hours": "최근 24시간 동안 처리된 DNS 쿼리의 수",
|
"number_of_dns_query_24_hours": "최근 24시간 동안 처리된 DNS 쿼리의 수",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "세이프서치 강제",
|
"enforced_save_search": "세이프서치 강제",
|
||||||
"number_of_dns_query_to_safe_search": "세이프서치가 적용된 검색 엔진에 대해 DNS 요청 수",
|
"number_of_dns_query_to_safe_search": "세이프서치가 적용된 검색 엔진에 대해 DNS 요청 수",
|
||||||
"average_processing_time": "평균처리 시간",
|
"average_processing_time": "평균처리 시간",
|
||||||
"processing_time": "처리 시간",
|
|
||||||
"average_processing_time_hint": "DNS 요청 처리시 평균 시간(밀리초)",
|
"average_processing_time_hint": "DNS 요청 처리시 평균 시간(밀리초)",
|
||||||
"block_domain_use_filters_and_hosts": "필터 및 호스트 파일을 사용하여 도메인 차단",
|
"block_domain_use_filters_and_hosts": "필터 및 호스트 파일을 사용하여 도메인 차단",
|
||||||
"filters_block_toggle_hint": "차단규칙<a>필터</a>을 설정할 수 있습니다.",
|
"filters_block_toggle_hint": "차단규칙<a>필터</a>을 설정할 수 있습니다.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "{{path}}에서 구성됨",
|
"upstream_dns_configured_in_file": "{{path}}에서 구성됨",
|
||||||
"test_upstream_btn": "업스트림 테스트",
|
"test_upstream_btn": "업스트림 테스트",
|
||||||
"upstreams": "업스트림",
|
"upstreams": "업스트림",
|
||||||
"upstream": "업스트림",
|
|
||||||
"apply_btn": "적용",
|
"apply_btn": "적용",
|
||||||
"disabled_filtering_toast": "필터링 비활성화됨",
|
"disabled_filtering_toast": "필터링 비활성화됨",
|
||||||
"enabled_filtering_toast": "필터링 활성화됨",
|
"enabled_filtering_toast": "필터링 활성화됨",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "쿼리 로그를 성공적으로 초기화했습니다",
|
"query_log_cleared": "쿼리 로그를 성공적으로 초기화했습니다",
|
||||||
"query_log_updated": "질의 로그가 성공적으로 업데이트되었습니다",
|
"query_log_updated": "질의 로그가 성공적으로 업데이트되었습니다",
|
||||||
"query_log_clear": "쿼리 로그 비우기",
|
"query_log_clear": "쿼리 로그 비우기",
|
||||||
"query_log_retention": "쿼리 로그 로테이션",
|
"query_log_retention": "쿼리 로그 저장 기간",
|
||||||
"query_log_enable": "로그 활성화",
|
"query_log_enable": "로그 활성화",
|
||||||
"query_log_configuration": "로그 구성",
|
"query_log_configuration": "로그 구성",
|
||||||
"query_log_disabled": "쿼리 로그가 비활성화되어 있으며 <0>설정</0>에서 설정할 수 있습니다",
|
"query_log_disabled": "쿼리 로그가 비활성화되어 있으며 <0>설정</0>에서 설정할 수 있습니다",
|
||||||
"query_log_strict_search": "검색을 제한하려면 쌍따옴표를 사용해주세요",
|
"query_log_strict_search": "검색을 제한하려면 쌍따옴표를 사용해주세요",
|
||||||
"query_log_retention_confirm": "쿼리 로그 로테이션을 변경하시겠습니까? 간격 값을 줄이면 일부 데이터가 손실됩니다.",
|
"query_log_retention_confirm": "정말로 쿼리 로그 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다",
|
||||||
"anonymize_client_ip": "클라이언트 IP 익명화",
|
"anonymize_client_ip": "클라이언트 IP 익명화",
|
||||||
"anonymize_client_ip_desc": "클라이언트의 전체 IP 주소를 로그와 통계에 저장하저장하지 마세요",
|
"anonymize_client_ip_desc": "클라이언트의 전체 IP 주소를 로그와 통계에 저장하저장하지 마세요",
|
||||||
"dns_config": "DNS 서버 설정",
|
"dns_config": "DNS 서버 설정",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "정말 클라이언트 '{{key}}'을(를) 삭제하시겠습니까?",
|
"client_confirm_delete": "정말 클라이언트 '{{key}}'을(를) 삭제하시겠습니까?",
|
||||||
"list_confirm_delete": "정말로 이 목록을 제거하시겠습니까?",
|
"list_confirm_delete": "정말로 이 목록을 제거하시겠습니까?",
|
||||||
"auto_clients_title": "런타임 클라이언트",
|
"auto_clients_title": "런타임 클라이언트",
|
||||||
"auto_clients_desc": "AdGuard Home을 사용 중이거나 사용할 수 있는 기기의 IP 주소에 대한 정보가 표시됩니다. 이 정보는 호스트 파일, 역방향 DNS 등 여러 소스에서 수집됩니다.",
|
"auto_clients_desc": "AdGuard Home을 계속 사용할 수 있는 영구 클라이언트 목록에 없는 디바이스입니다",
|
||||||
"access_title": "접근 설정",
|
"access_title": "접근 설정",
|
||||||
"access_desc": "여기에서 AdGuard Home DNS 서버에 대한 액세스 규칙을 설정할 수 있습니다",
|
"access_desc": "여기에서 AdGuard Home DNS 서버에 대한 액세스 규칙을 설정할 수 있습니다",
|
||||||
"access_allowed_title": "허용된 클라이언트",
|
"access_allowed_title": "허용된 클라이언트",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "<1>DNS-over-HTTPS</1> 또는 <1>DNS-over-TLS를</1> 사용하려면 AdGuard Home 설정에서 <0>암호화를 구성해야 합니다.</0>",
|
"setup_dns_notice": "<1>DNS-over-HTTPS</1> 또는 <1>DNS-over-TLS를</1> 사용하려면 AdGuard Home 설정에서 <0>암호화를 구성해야 합니다.</0>",
|
||||||
"rewrite_added": "'{{key}}'에 대한 DNS 수정 정보를 성공적으로 추가 됩니다",
|
"rewrite_added": "'{{key}}'에 대한 DNS 수정 정보를 성공적으로 추가 됩니다",
|
||||||
"rewrite_deleted": "'{{key}}'에 대한 DNS 수정 정보를 성공적으로 삭제 됩니다",
|
"rewrite_deleted": "'{{key}}'에 대한 DNS 수정 정보를 성공적으로 삭제 됩니다",
|
||||||
"rewrite_updated": "DNS 다시 쓰기 업데이트 완료",
|
|
||||||
"rewrite_add": "DNS 변환 정보를 추가합니다",
|
"rewrite_add": "DNS 변환 정보를 추가합니다",
|
||||||
"rewrite_edit": "DNS 다시 쓰기 편집",
|
|
||||||
"rewrite_not_found": "DNS 변경 정보를 찾을 수 없습니다",
|
"rewrite_not_found": "DNS 변경 정보를 찾을 수 없습니다",
|
||||||
"rewrite_confirm_delete": "'{{key}}'에 대한 DNS 변경 정보를 삭제하시겠습니까?",
|
"rewrite_confirm_delete": "'{{key}}'에 대한 DNS 변경 정보를 삭제하시겠습니까?",
|
||||||
"rewrite_desc": "특정 도메인 이름에 대한 사용자 지정 DNS 응답을 쉽게 구성할 수 있습니다.",
|
"rewrite_desc": "특정 도메인 이름에 대한 사용자 지정 DNS 응답을 쉽게 구성할 수 있습니다.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "{{count}}시간 동안 보호 기능 비활성화",
|
"disable_notify_for_hours": "{{count}}시간 동안 보호 기능 비활성화",
|
||||||
"disable_notify_for_hours_plural": "{{count}}시간 동안 보호 기능 비활성화",
|
"disable_notify_for_hours_plural": "{{count}}시간 동안 보호 기능 비활성화",
|
||||||
"disable_notify_until_tomorrow": "내일까지 보호 기능 비활성화",
|
"disable_notify_until_tomorrow": "내일까지 보호 기능 비활성화",
|
||||||
"enable_protection_timer": "{{time}}에 보호 기능이 활성화됩니다.",
|
"enable_protection_timer": "{{time}}에 보호 기능이 활성화됩니다."
|
||||||
"custom_retention_input": "시간 단위로 보존 기간 입력",
|
|
||||||
"custom_rotation_input": "시간 단위로 로테이션 입력",
|
|
||||||
"protection_section_label": "보호",
|
|
||||||
"log_and_stats_section_label": "쿼리 로그 및 통계",
|
|
||||||
"ignore_query_log": "쿼리 로그에서 이 클라이언트 무시",
|
|
||||||
"ignore_statistics": "통계에서 이 클라이언트 무시"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Top gebruikers",
|
"top_clients": "Top gebruikers",
|
||||||
"no_clients_found": "Geen gebruikers gevonden",
|
"no_clients_found": "Geen gebruikers gevonden",
|
||||||
"general_statistics": "Algemene statistieken",
|
"general_statistics": "Algemene statistieken",
|
||||||
"top_upstreams": "Top upstreams",
|
|
||||||
"no_upstreams_data_found": "Geen upstreams-gegevens gevonden",
|
|
||||||
"number_of_dns_query_days": "Aantal verwerkte DNS aanvragen van de laatste {{count}} dag",
|
"number_of_dns_query_days": "Aantal verwerkte DNS aanvragen van de laatste {{count}} dag",
|
||||||
"number_of_dns_query_days_plural": "Aantal verwerkte DNS aanvragen van de laatste {{count}} dagen",
|
"number_of_dns_query_days_plural": "Aantal verwerkte DNS aanvragen van de laatste {{count}} dagen",
|
||||||
"number_of_dns_query_24_hours": "Aantal verwerkte DNS aanvragen van de laatste 24 uur",
|
"number_of_dns_query_24_hours": "Aantal verwerkte DNS aanvragen van de laatste 24 uur",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Geforceerd veilig zoeken",
|
"enforced_save_search": "Geforceerd veilig zoeken",
|
||||||
"number_of_dns_query_to_safe_search": "Aantal DNS aanvragen in zoekmachines dmv geforceerd veilig zoeken",
|
"number_of_dns_query_to_safe_search": "Aantal DNS aanvragen in zoekmachines dmv geforceerd veilig zoeken",
|
||||||
"average_processing_time": "Gemiddelde procestijd",
|
"average_processing_time": "Gemiddelde procestijd",
|
||||||
"processing_time": "Verwerkingstijd",
|
|
||||||
"average_processing_time_hint": "Gemiddelde verwerkingstijd in milliseconden van een DNS aanvraag",
|
"average_processing_time_hint": "Gemiddelde verwerkingstijd in milliseconden van een DNS aanvraag",
|
||||||
"block_domain_use_filters_and_hosts": "Domeinen blokkeren d.m.v. filters en host-bestanden",
|
"block_domain_use_filters_and_hosts": "Domeinen blokkeren d.m.v. filters en host-bestanden",
|
||||||
"filters_block_toggle_hint": "Je kan blokkeringsregels toevoegen in de <a>Filters</a> instellingen.",
|
"filters_block_toggle_hint": "Je kan blokkeringsregels toevoegen in de <a>Filters</a> instellingen.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Geconfigureerd in {{path}}",
|
"upstream_dns_configured_in_file": "Geconfigureerd in {{path}}",
|
||||||
"test_upstream_btn": "Test upstream",
|
"test_upstream_btn": "Test upstream",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream",
|
|
||||||
"apply_btn": "Toepassen",
|
"apply_btn": "Toepassen",
|
||||||
"disabled_filtering_toast": "Filters uitgeschakeld",
|
"disabled_filtering_toast": "Filters uitgeschakeld",
|
||||||
"enabled_filtering_toast": "Filters ingeschakeld",
|
"enabled_filtering_toast": "Filters ingeschakeld",
|
||||||
@@ -190,7 +186,7 @@
|
|||||||
"cancel_btn": "Annuleren",
|
"cancel_btn": "Annuleren",
|
||||||
"enter_name_hint": "Voeg naam toe",
|
"enter_name_hint": "Voeg naam toe",
|
||||||
"enter_url_or_path_hint": "Voer een URL in of het pad van de lijst",
|
"enter_url_or_path_hint": "Voer een URL in of het pad van de lijst",
|
||||||
"check_updates_btn": "Controleren op updates",
|
"check_updates_btn": "Controleer op updates",
|
||||||
"new_blocklist": "Nieuwe blokkeerlijst",
|
"new_blocklist": "Nieuwe blokkeerlijst",
|
||||||
"new_allowlist": "Nieuwe toelatingslijst",
|
"new_allowlist": "Nieuwe toelatingslijst",
|
||||||
"edit_blocklist": "Blokkeerlijst beheren",
|
"edit_blocklist": "Blokkeerlijst beheren",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Het query logboek is succesvol geleegd",
|
"query_log_cleared": "Het query logboek is succesvol geleegd",
|
||||||
"query_log_updated": "Het query logboek is succesvol bijgewerkt",
|
"query_log_updated": "Het query logboek is succesvol bijgewerkt",
|
||||||
"query_log_clear": "Leeg query logs",
|
"query_log_clear": "Leeg query logs",
|
||||||
"query_log_retention": "Query logs rotatie",
|
"query_log_retention": "Query logs bewaartermijn",
|
||||||
"query_log_enable": "Log bestanden inschakelen",
|
"query_log_enable": "Log bestanden inschakelen",
|
||||||
"query_log_configuration": "Logbestanden instellingen",
|
"query_log_configuration": "Logbestanden instellingen",
|
||||||
"query_log_disabled": "Het query logboek is uitgeschakeld en kan worden geconfigureerd in de <0>instellingen</0>",
|
"query_log_disabled": "Het query logboek is uitgeschakeld en kan worden geconfigureerd in de <0>instellingen</0>",
|
||||||
"query_log_strict_search": "Gebruik dubbele aanhalingstekens voor strikt zoeken",
|
"query_log_strict_search": "Gebruik dubbele aanhalingstekens voor strikt zoeken",
|
||||||
"query_log_retention_confirm": "Weet u zeker dat u de rotatie van het querylogboek wilt wijzigen? Als u de intervalwaarde verlaagt, gaan sommige gegevens verloren",
|
"query_log_retention_confirm": "Weet u zeker dat u de bewaartermijn van het query logboek wilt wijzigen? Als u de intervalwaarde verlaagt, gaan sommige gegevens verloren",
|
||||||
"anonymize_client_ip": "Cliënt IP anonimiseren",
|
"anonymize_client_ip": "Cliënt IP anonimiseren",
|
||||||
"anonymize_client_ip_desc": "Het volledige IP-adres van de cliënt niet opnemen in logboeken en statistiekbestanden",
|
"anonymize_client_ip_desc": "Het volledige IP-adres van de cliënt niet opnemen in logboeken en statistiekbestanden",
|
||||||
"dns_config": "DNS-server configuratie",
|
"dns_config": "DNS-server configuratie",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Ben je zeker dat je deze gebruiker \"{{key}}\" wilt verwijderen?",
|
"client_confirm_delete": "Ben je zeker dat je deze gebruiker \"{{key}}\" wilt verwijderen?",
|
||||||
"list_confirm_delete": "Ben je zeker om deze lijst te verwijderen?",
|
"list_confirm_delete": "Ben je zeker om deze lijst te verwijderen?",
|
||||||
"auto_clients_title": "Runtime-clients",
|
"auto_clients_title": "Runtime-clients",
|
||||||
"auto_clients_desc": "Informatie over IP-adressen van apparaten die AdGuard Home gebruiken of kunnen gebruiken. Deze informatie wordt verzameld uit verschillende bronnen, waaronder hosts-bestanden, reverse DNS, enz.",
|
"auto_clients_desc": "Apparaten die niet op de lijst van permanente clients staan die mogelijk nog steeds AdGuard Home gebruiken",
|
||||||
"access_title": "Toegangs instellingen",
|
"access_title": "Toegangs instellingen",
|
||||||
"access_desc": "Hier kan je toegangsregels voor de AdGuard Home DNS-server instellen",
|
"access_desc": "Hier kan je toegangsregels voor de AdGuard Home DNS-server instellen",
|
||||||
"access_allowed_title": "Toegestane gebruikers",
|
"access_allowed_title": "Toegestane gebruikers",
|
||||||
@@ -460,7 +456,7 @@
|
|||||||
"access_settings_saved": "Toegangsinstellingen succesvol opgeslagen",
|
"access_settings_saved": "Toegangsinstellingen succesvol opgeslagen",
|
||||||
"updates_checked": "Een nieuwe versie van AdGuard Home is beschikbaar\n",
|
"updates_checked": "Een nieuwe versie van AdGuard Home is beschikbaar\n",
|
||||||
"updates_version_equal": "AdGuard Home is actueel",
|
"updates_version_equal": "AdGuard Home is actueel",
|
||||||
"check_updates_now": "Nu controleren op updates",
|
"check_updates_now": "Controleer op updates",
|
||||||
"version_request_error": "Updatecontrole mislukt. Controleer je internetverbinding.",
|
"version_request_error": "Updatecontrole mislukt. Controleer je internetverbinding.",
|
||||||
"dns_privacy": "DNS Privacy",
|
"dns_privacy": "DNS Privacy",
|
||||||
"setup_dns_privacy_1": "<0>DNS-via-TLS:</0> Gebruik <1>{{address}}</1> string.",
|
"setup_dns_privacy_1": "<0>DNS-via-TLS:</0> Gebruik <1>{{address}}</1> string.",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Om <1>DNS-via-HTTPS</1> of <1>DNS-via-TLS</1> te gebruiken, moet je <0>Versleuteling configureren</0> in de AdGuard Home instellingen.",
|
"setup_dns_notice": "Om <1>DNS-via-HTTPS</1> of <1>DNS-via-TLS</1> te gebruiken, moet je <0>Versleuteling configureren</0> in de AdGuard Home instellingen.",
|
||||||
"rewrite_added": "DNS-herschrijving voor \"{{key}}\" met succes toegevoegd",
|
"rewrite_added": "DNS-herschrijving voor \"{{key}}\" met succes toegevoegd",
|
||||||
"rewrite_deleted": "DNS-herschrijving voor \"{{key}}\" met succes verwijderd",
|
"rewrite_deleted": "DNS-herschrijving voor \"{{key}}\" met succes verwijderd",
|
||||||
"rewrite_updated": "DNS-herschrijven succesvol bijgewerkt",
|
|
||||||
"rewrite_add": "DNS-herschrijving toevoegen",
|
"rewrite_add": "DNS-herschrijving toevoegen",
|
||||||
"rewrite_edit": "DNS-herschrijven bewerken",
|
|
||||||
"rewrite_not_found": "Geen DNS-herschrijving gevonden",
|
"rewrite_not_found": "Geen DNS-herschrijving gevonden",
|
||||||
"rewrite_confirm_delete": "Bent u zeker dat u DNS-herschrijving \"{{key}}\" wilt verwijderen?",
|
"rewrite_confirm_delete": "Bent u zeker dat u DNS-herschrijving \"{{key}}\" wilt verwijderen?",
|
||||||
"rewrite_desc": "Hiermee kunt u eenvoudig aangepaste DNS-antwoorden configureren voor een specifieke domeinnaam.",
|
"rewrite_desc": "Hiermee kunt u eenvoudig aangepaste DNS-antwoorden configureren voor een specifieke domeinnaam.",
|
||||||
@@ -577,7 +571,7 @@
|
|||||||
"tags_title": "Labels",
|
"tags_title": "Labels",
|
||||||
"tags_desc": "Je kunt labels selecteren die overeenkomen met de client. Labels kunnen worden opgenomen in de filterregels om ze \n nauwkeuriger toe te passen. <0>Meer informatie</0>.",
|
"tags_desc": "Je kunt labels selecteren die overeenkomen met de client. Labels kunnen worden opgenomen in de filterregels om ze \n nauwkeuriger toe te passen. <0>Meer informatie</0>.",
|
||||||
"form_select_tags": "Client tags selecteren",
|
"form_select_tags": "Client tags selecteren",
|
||||||
"check_title": "De filtering controleren",
|
"check_title": "Controleer de filtering",
|
||||||
"check_desc": "Controleren of een hostnaam wordt gefilterd.",
|
"check_desc": "Controleren of een hostnaam wordt gefilterd.",
|
||||||
"check": "Controleren",
|
"check": "Controleren",
|
||||||
"form_enter_host": "Voer een hostnaam in",
|
"form_enter_host": "Voer een hostnaam in",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Beveiliging uitschakelen voor {{count}} uur",
|
"disable_notify_for_hours": "Beveiliging uitschakelen voor {{count}} uur",
|
||||||
"disable_notify_for_hours_plural": "Beveiliging uitschakelen voor {{count}} uren",
|
"disable_notify_for_hours_plural": "Beveiliging uitschakelen voor {{count}} uren",
|
||||||
"disable_notify_until_tomorrow": "Beveiliging uitschakelen tot morgen",
|
"disable_notify_until_tomorrow": "Beveiliging uitschakelen tot morgen",
|
||||||
"enable_protection_timer": "Bescherming wordt ingeschakeld over {{time}}",
|
"enable_protection_timer": "Bescherming wordt ingeschakeld over {{time}}"
|
||||||
"custom_retention_input": "Voer retentie in uren in",
|
|
||||||
"custom_rotation_input": "Voer rotatie in uren in",
|
|
||||||
"protection_section_label": "Bescherming",
|
|
||||||
"log_and_stats_section_label": "Aanvragenlogboek en statistieken",
|
|
||||||
"ignore_query_log": "Deze client negeren in het aanvragenlogboek",
|
|
||||||
"ignore_statistics": "Deze client negeren in de statistieken"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,8 +114,6 @@
|
|||||||
"top_clients": "Vanligste klienter",
|
"top_clients": "Vanligste klienter",
|
||||||
"no_clients_found": "Ingen klienter ble funnet",
|
"no_clients_found": "Ingen klienter ble funnet",
|
||||||
"general_statistics": "Generelle statistikker",
|
"general_statistics": "Generelle statistikker",
|
||||||
"top_upstreams": "Topp oppstrøms servere",
|
|
||||||
"no_upstreams_data_found": "Ingen oppstrøms servere data funnet",
|
|
||||||
"number_of_dns_query_days": "Antall DNS-spørringer behandlet for de siste {{count}} dagene",
|
"number_of_dns_query_days": "Antall DNS-spørringer behandlet for de siste {{count}} dagene",
|
||||||
"number_of_dns_query_days_plural": "Antall DNS-forespørsler som ble behandlet de siste {{count}} dagene",
|
"number_of_dns_query_days_plural": "Antall DNS-forespørsler som ble behandlet de siste {{count}} dagene",
|
||||||
"number_of_dns_query_24_hours": "Antall DNS-forespørsler som ble behandlet de siste 24 timene",
|
"number_of_dns_query_24_hours": "Antall DNS-forespørsler som ble behandlet de siste 24 timene",
|
||||||
@@ -149,7 +147,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Satt opp i {{path}}",
|
"upstream_dns_configured_in_file": "Satt opp i {{path}}",
|
||||||
"test_upstream_btn": "Test oppstrømstilkoblinger",
|
"test_upstream_btn": "Test oppstrømstilkoblinger",
|
||||||
"upstreams": "Oppstrømstjenere",
|
"upstreams": "Oppstrømstjenere",
|
||||||
"upstream": "Oppstrøms server",
|
|
||||||
"apply_btn": "Benytt",
|
"apply_btn": "Benytt",
|
||||||
"disabled_filtering_toast": "Skrudde av filtrering",
|
"disabled_filtering_toast": "Skrudde av filtrering",
|
||||||
"enabled_filtering_toast": "Skrudde på filtrering",
|
"enabled_filtering_toast": "Skrudde på filtrering",
|
||||||
@@ -285,8 +282,6 @@
|
|||||||
"blocking_mode_null_ip": "Null IP: Svar med en 0-IP-adresse (0.0.0.0 for A; :: for AAAA)",
|
"blocking_mode_null_ip": "Null IP: Svar med en 0-IP-adresse (0.0.0.0 for A; :: for AAAA)",
|
||||||
"blocking_mode_custom_ip": "Tilpasset IP: Svar med en manuelt valgt IP-adresse",
|
"blocking_mode_custom_ip": "Tilpasset IP: Svar med en manuelt valgt IP-adresse",
|
||||||
"theme_auto": "Auto",
|
"theme_auto": "Auto",
|
||||||
"theme_light": "Lyst tema",
|
|
||||||
"theme_dark": "Mørkt tema",
|
|
||||||
"upstream_dns_client_desc": "Hvis dette feltet holdes tomt, vil AdGuard Home bruke tjenerne som er satt opp i <0>DNS-innstillingene</0>.",
|
"upstream_dns_client_desc": "Hvis dette feltet holdes tomt, vil AdGuard Home bruke tjenerne som er satt opp i <0>DNS-innstillingene</0>.",
|
||||||
"tracker_source": "Sporerkilde",
|
"tracker_source": "Sporerkilde",
|
||||||
"source_label": "Kilde",
|
"source_label": "Kilde",
|
||||||
@@ -460,9 +455,7 @@
|
|||||||
"setup_dns_notice": "For å benytte <1>DNS-over-HTTPS</1> eller <1>DNS-over-TLS</1>, må du <0>sette opp Kryptering</0> i AdGuard Home-innstillingene.",
|
"setup_dns_notice": "For å benytte <1>DNS-over-HTTPS</1> eller <1>DNS-over-TLS</1>, må du <0>sette opp Kryptering</0> i AdGuard Home-innstillingene.",
|
||||||
"rewrite_added": "DNS-omdirigeringen for «{{key}}» ble vellykket lagt til",
|
"rewrite_added": "DNS-omdirigeringen for «{{key}}» ble vellykket lagt til",
|
||||||
"rewrite_deleted": "DNS-omdirigeringen for «{{key}}» ble vellykket slettet",
|
"rewrite_deleted": "DNS-omdirigeringen for «{{key}}» ble vellykket slettet",
|
||||||
"rewrite_updated": "DNS-omskriving ble oppdatert",
|
|
||||||
"rewrite_add": "Legg til DNS-omdirigering",
|
"rewrite_add": "Legg til DNS-omdirigering",
|
||||||
"rewrite_edit": "Rediger DNS-omskriving",
|
|
||||||
"rewrite_not_found": "Ingen DNS-omdirigeringer ble funnet",
|
"rewrite_not_found": "Ingen DNS-omdirigeringer ble funnet",
|
||||||
"rewrite_confirm_delete": "Er du sikker på at du vil slette DNS-omdirigeringen for «{{key}}»?",
|
"rewrite_confirm_delete": "Er du sikker på at du vil slette DNS-omdirigeringen for «{{key}}»?",
|
||||||
"rewrite_desc": "Lar deg enkelt konfigurere selvvalgte DNS-tilbakemeldinger for et spesifikt domenenavn.",
|
"rewrite_desc": "Lar deg enkelt konfigurere selvvalgte DNS-tilbakemeldinger for et spesifikt domenenavn.",
|
||||||
@@ -621,6 +614,5 @@
|
|||||||
"use_saved_key": "Bruk den tidligere lagrede nøkkelen",
|
"use_saved_key": "Bruk den tidligere lagrede nøkkelen",
|
||||||
"parental_control": "Foreldrekontroll",
|
"parental_control": "Foreldrekontroll",
|
||||||
"safe_browsing": "Sikker surfing",
|
"safe_browsing": "Sikker surfing",
|
||||||
"served_from_cache": "{{value}} <i>(formidlet fra mellomlageret)</i>",
|
"served_from_cache": "{{value}} <i>(formidlet fra mellomlageret)</i>"
|
||||||
"protection_section_label": "Beskyttelse"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Główni klienci",
|
"top_clients": "Główni klienci",
|
||||||
"no_clients_found": "Nie znaleziono klienta",
|
"no_clients_found": "Nie znaleziono klienta",
|
||||||
"general_statistics": "Ogólne statystyki",
|
"general_statistics": "Ogólne statystyki",
|
||||||
"top_upstreams": "Często żądane serwery nadrzędne",
|
|
||||||
"no_upstreams_data_found": "Brak danych dotyczących serwerów nadrzędnych",
|
|
||||||
"number_of_dns_query_days": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
"number_of_dns_query_days": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
||||||
"number_of_dns_query_days_plural": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
"number_of_dns_query_days_plural": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
||||||
"number_of_dns_query_24_hours": "Liczba zapytań DNS przetworzonych w ciągu ostatnich 24 godzin",
|
"number_of_dns_query_24_hours": "Liczba zapytań DNS przetworzonych w ciągu ostatnich 24 godzin",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Skonfigurowano w {{path}}",
|
"upstream_dns_configured_in_file": "Skonfigurowano w {{path}}",
|
||||||
"test_upstream_btn": "Test głównych serwerów DNS",
|
"test_upstream_btn": "Test głównych serwerów DNS",
|
||||||
"upstreams": "Główne serwery DNS",
|
"upstreams": "Główne serwery DNS",
|
||||||
"upstream": "Serwer nadrzędny",
|
|
||||||
"apply_btn": "Zastosuj",
|
"apply_btn": "Zastosuj",
|
||||||
"disabled_filtering_toast": "Wyłączone filtrowanie",
|
"disabled_filtering_toast": "Wyłączone filtrowanie",
|
||||||
"enabled_filtering_toast": "Włączone filtrowanie",
|
"enabled_filtering_toast": "Włączone filtrowanie",
|
||||||
@@ -170,7 +167,6 @@
|
|||||||
"enabled_parental_toast": "Włączona Kontrola Rodzicielska",
|
"enabled_parental_toast": "Włączona Kontrola Rodzicielska",
|
||||||
"disabled_safe_search_toast": "Wyłączone bezpieczne wyszukiwanie",
|
"disabled_safe_search_toast": "Wyłączone bezpieczne wyszukiwanie",
|
||||||
"enabled_save_search_toast": "Włączone bezpieczne wyszukiwanie",
|
"enabled_save_search_toast": "Włączone bezpieczne wyszukiwanie",
|
||||||
"updated_save_search_toast": "Zaktualizowano ustawienia bezpiecznego wyszukiwania",
|
|
||||||
"enabled_table_header": "Włączone",
|
"enabled_table_header": "Włączone",
|
||||||
"name_table_header": "Nazwa",
|
"name_table_header": "Nazwa",
|
||||||
"list_url_table_header": "Adres URL listy",
|
"list_url_table_header": "Adres URL listy",
|
||||||
@@ -225,7 +221,7 @@
|
|||||||
"all_lists_up_to_date_toast": "Wszystkie listy są już aktualne",
|
"all_lists_up_to_date_toast": "Wszystkie listy są już aktualne",
|
||||||
"updated_upstream_dns_toast": "Serwery nadrzędne zostały pomyślnie zapisane",
|
"updated_upstream_dns_toast": "Serwery nadrzędne zostały pomyślnie zapisane",
|
||||||
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie",
|
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie",
|
||||||
"dns_test_not_ok_toast": "Serwer \"{{key}}\": nie może być użyte, sprawdź, czy zapisano go poprawnie",
|
"dns_test_not_ok_toast": "Serwer \"{{key}}\": nie można go użyć, sprawdź, czy napisałeś go poprawnie",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" nie odpowiada na zapytania testowe i może nie działać prawidłowo",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" nie odpowiada na zapytania testowe i może nie działać prawidłowo",
|
||||||
"unblock": "Odblokuj",
|
"unblock": "Odblokuj",
|
||||||
"block": "Zablokuj",
|
"block": "Zablokuj",
|
||||||
@@ -260,12 +256,12 @@
|
|||||||
"query_log_cleared": "Dziennik zapytań został pomyślnie wyczyszczony",
|
"query_log_cleared": "Dziennik zapytań został pomyślnie wyczyszczony",
|
||||||
"query_log_updated": "Dziennik zapytań został zaktualizowany",
|
"query_log_updated": "Dziennik zapytań został zaktualizowany",
|
||||||
"query_log_clear": "Wyczyść dzienniki zapytań",
|
"query_log_clear": "Wyczyść dzienniki zapytań",
|
||||||
"query_log_retention": "Rotacja dzienników zapytań",
|
"query_log_retention": "Przechowywanie dzienników zapytań",
|
||||||
"query_log_enable": "Włącz dziennik",
|
"query_log_enable": "Włącz dziennik",
|
||||||
"query_log_configuration": "Konfiguracja dzienników",
|
"query_log_configuration": "Konfiguracja dzienników",
|
||||||
"query_log_disabled": "Dziennik zapytań jest wyłączony i można go skonfigurować w <0>ustawieniach</0>",
|
"query_log_disabled": "Dziennik zapytań jest wyłączony i można go skonfigurować w <0>ustawieniach</0>",
|
||||||
"query_log_strict_search": "Używaj podwójnych cudzysłowów do ścisłego wyszukiwania",
|
"query_log_strict_search": "Używaj podwójnych cudzysłowów do ścisłego wyszukiwania",
|
||||||
"query_log_retention_confirm": "Czy na pewno chcesz zmienić rotację dziennika zapytań? Jeśli zmniejszysz wartość interwału, niektóre dane zostaną utracone",
|
"query_log_retention_confirm": "Czy na pewno chcesz zmienić sposób przechowywania dziennika zapytań? Jeśli zmniejszysz wartość interwału, niektóre dane zostaną utracone",
|
||||||
"anonymize_client_ip": "Anonimizuj adres IP klienta",
|
"anonymize_client_ip": "Anonimizuj adres IP klienta",
|
||||||
"anonymize_client_ip_desc": "Nie zapisuj pełnego adresu IP w dziennikach i statystykach",
|
"anonymize_client_ip_desc": "Nie zapisuj pełnego adresu IP w dziennikach i statystykach",
|
||||||
"dns_config": "Konfiguracja serwera DNS",
|
"dns_config": "Konfiguracja serwera DNS",
|
||||||
@@ -294,8 +290,6 @@
|
|||||||
"rate_limit": "Limit ilościowy",
|
"rate_limit": "Limit ilościowy",
|
||||||
"edns_enable": "Włącz podsieć klienta EDNS",
|
"edns_enable": "Włącz podsieć klienta EDNS",
|
||||||
"edns_cs_desc": "Dodaj opcję podsieci klienta EDNS (ECS) do żądań nadrzędnych i rejestruj wartości wysyłane przez klientów w dzienniku zapytań.",
|
"edns_cs_desc": "Dodaj opcję podsieci klienta EDNS (ECS) do żądań nadrzędnych i rejestruj wartości wysyłane przez klientów w dzienniku zapytań.",
|
||||||
"edns_use_custom_ip": "Użyj niestandardowego adresu IP dla EDNS",
|
|
||||||
"edns_use_custom_ip_desc": "Zezwól na użycie niestandardowego adresu IP dla EDNS",
|
|
||||||
"rate_limit_desc": "Liczba żądań na sekundę dozwolona na klienta. Ustawienie wartości 0 oznacza brak ograniczeń.",
|
"rate_limit_desc": "Liczba żądań na sekundę dozwolona na klienta. Ustawienie wartości 0 oznacza brak ograniczeń.",
|
||||||
"blocking_ipv4_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania A",
|
"blocking_ipv4_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania A",
|
||||||
"blocking_ipv6_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania AAAA",
|
"blocking_ipv6_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania AAAA",
|
||||||
@@ -349,7 +343,7 @@
|
|||||||
"install_devices_windows_list_2": "Przejdź do kategorii Sieć i Internet, a następnie do Centrum sieci i udostępniania.",
|
"install_devices_windows_list_2": "Przejdź do kategorii Sieć i Internet, a następnie do Centrum sieci i udostępniania.",
|
||||||
"install_devices_windows_list_3": "W lewym panelu kliknij \"Zmień ustawienia adaptera\".",
|
"install_devices_windows_list_3": "W lewym panelu kliknij \"Zmień ustawienia adaptera\".",
|
||||||
"install_devices_windows_list_4": "Kliknij prawym przyciskiem myszy aktywne połączenie i wybierz Właściwości.",
|
"install_devices_windows_list_4": "Kliknij prawym przyciskiem myszy aktywne połączenie i wybierz Właściwości.",
|
||||||
"install_devices_windows_list_5": "Znajdź na liście \"Protokół internetowy w wersji 4 (TCP/IPv4)\" (lub w przypadku IPv6 \"Protokół internetowy w wersji 6 (TCP/IPv6)\"), zaznacz go i ponownie kliknij Właściwości.",
|
"install_devices_windows_list_5": "Znajdź na liście \"Protokół internetowy w wersji 4 (TCP/IPv4)\" (lub w przypadku IPv6 \"Protokół internetowy w wersji 6 (TCP/IPv6)\"), zaznacz go i ponownie kliknij na Właściwości.",
|
||||||
"install_devices_windows_list_6": "Wybierz opcję \"Użyj następujących adresów serwerów DNS\" i wprowadź adresy serwerów AdGuard Home.",
|
"install_devices_windows_list_6": "Wybierz opcję \"Użyj następujących adresów serwerów DNS\" i wprowadź adresy serwerów AdGuard Home.",
|
||||||
"install_devices_macos_list_1": "Kliknij ikonę Apple i przejdź do Preferencje systemowe.",
|
"install_devices_macos_list_1": "Kliknij ikonę Apple i przejdź do Preferencje systemowe.",
|
||||||
"install_devices_macos_list_2": "Kliknij Sieć.",
|
"install_devices_macos_list_2": "Kliknij Sieć.",
|
||||||
@@ -399,7 +393,7 @@
|
|||||||
"encryption_issuer": "Zgłaszający",
|
"encryption_issuer": "Zgłaszający",
|
||||||
"encryption_hostnames": "Nazwy hostów",
|
"encryption_hostnames": "Nazwy hostów",
|
||||||
"encryption_reset": "Czy na pewno chcesz zresetować ustawienia szyfrowania?",
|
"encryption_reset": "Czy na pewno chcesz zresetować ustawienia szyfrowania?",
|
||||||
"encryption_warning": "Uwaga",
|
"encryption_warning": "Uwaga!",
|
||||||
"topline_expiring_certificate": "Twój certyfikat SSL wkrótce wygaśnie. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
"topline_expiring_certificate": "Twój certyfikat SSL wkrótce wygaśnie. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
||||||
"topline_expired_certificate": "Twój certyfikat SSL wygasł. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
"topline_expired_certificate": "Twój certyfikat SSL wygasł. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
||||||
"form_error_port_range": "Wpisz numer portu z zakresu 80-65535",
|
"form_error_port_range": "Wpisz numer portu z zakresu 80-65535",
|
||||||
@@ -447,7 +441,7 @@
|
|||||||
"client_confirm_delete": "Czy na pewno chcesz usunąć klienta \"{{key}}\"?",
|
"client_confirm_delete": "Czy na pewno chcesz usunąć klienta \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Czy na pewno chcesz usunąć tę listę?",
|
"list_confirm_delete": "Czy na pewno chcesz usunąć tę listę?",
|
||||||
"auto_clients_title": "Uruchomieni klienci",
|
"auto_clients_title": "Uruchomieni klienci",
|
||||||
"auto_clients_desc": "Informacje o adresach IP urządzeń korzystających lub mogących korzystać z AdGuard Home. Te informacje są gromadzone z wielu źródeł takich jak pliki hosta, odwrotna translacja DNS, itp.",
|
"auto_clients_desc": "Urządzenia, których nie ma na liście stałych klientów, które mogą nadal korzystać z AdGuard Home",
|
||||||
"access_title": "Ustawienia dostępu",
|
"access_title": "Ustawienia dostępu",
|
||||||
"access_desc": "Tutaj możesz skonfigurować reguły dostępu dla serwera DNS AdGuard Home",
|
"access_desc": "Tutaj możesz skonfigurować reguły dostępu dla serwera DNS AdGuard Home",
|
||||||
"access_allowed_title": "Dozwoleni klienci",
|
"access_allowed_title": "Dozwoleni klienci",
|
||||||
@@ -473,7 +467,7 @@
|
|||||||
"setup_dns_privacy_ios_2": "Aplikacja <0>AdGuard dla iOS</0> obsługuje <1>DNS-over-HTTPS</1> i <1>DNS-over-TLS</1>.",
|
"setup_dns_privacy_ios_2": "Aplikacja <0>AdGuard dla iOS</0> obsługuje <1>DNS-over-HTTPS</1> i <1>DNS-over-TLS</1>.",
|
||||||
"setup_dns_privacy_other_title": "Inne implementacje",
|
"setup_dns_privacy_other_title": "Inne implementacje",
|
||||||
"setup_dns_privacy_other_1": "Sam AdGuard Home może być bezpiecznym klientem DNS na dowolnej platformie.",
|
"setup_dns_privacy_other_1": "Sam AdGuard Home może być bezpiecznym klientem DNS na dowolnej platformie.",
|
||||||
"setup_dns_privacy_other_2": "<0>dnsproxy</0> obsługuje wszystkie znane bezpieczne protokoły DNS.",
|
"setup_dns_privacy_other_2": "<0>dnsproxy</0> obsługuje wszystkie znane bezpieczne protokoły DNS.\n\n",
|
||||||
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> obsługuje <1>DNS-over-HTTPS</1>.",
|
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> obsługuje <1>DNS-over-HTTPS</1>.",
|
||||||
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> obsługuje <1>DNS-over-HTTPS</1>.",
|
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> obsługuje <1>DNS-over-HTTPS</1>.",
|
||||||
"setup_dns_privacy_other_5": "Znajdziesz więcej implementacji <0>tutaj</0> i <1>tutaj</1>.",
|
"setup_dns_privacy_other_5": "Znajdziesz więcej implementacji <0>tutaj</0> i <1>tutaj</1>.",
|
||||||
@@ -481,9 +475,7 @@
|
|||||||
"setup_dns_notice": "Aby skorzystać z <1>DNS-over-HTTPS</1> lub <1>DNS-over-TLS</1>, musisz w ustawieniach AdGuard Home <0>skonfigurować szyfrowanie</0>.",
|
"setup_dns_notice": "Aby skorzystać z <1>DNS-over-HTTPS</1> lub <1>DNS-over-TLS</1>, musisz w ustawieniach AdGuard Home <0>skonfigurować szyfrowanie</0>.",
|
||||||
"rewrite_added": "Pomyślnie dodano przepisanie DNS dla „{{key}}”",
|
"rewrite_added": "Pomyślnie dodano przepisanie DNS dla „{{key}}”",
|
||||||
"rewrite_deleted": "Przepisanie DNS dla „{{key}}” zostało pomyślnie usunięte",
|
"rewrite_deleted": "Przepisanie DNS dla „{{key}}” zostało pomyślnie usunięte",
|
||||||
"rewrite_updated": "Pomyślnie zaktualizowano przepisywanie DNS",
|
|
||||||
"rewrite_add": "Dodaj przepisywanie DNS",
|
"rewrite_add": "Dodaj przepisywanie DNS",
|
||||||
"rewrite_edit": "Edytuj przepisywanie DNS",
|
|
||||||
"rewrite_not_found": "Nie znaleziono przepisywania DNS",
|
"rewrite_not_found": "Nie znaleziono przepisywania DNS",
|
||||||
"rewrite_confirm_delete": "Czy na pewno chcesz usunąć przepisywanie DNS dla „{{key}}”?",
|
"rewrite_confirm_delete": "Czy na pewno chcesz usunąć przepisywanie DNS dla „{{key}}”?",
|
||||||
"rewrite_desc": "Pozwala łatwo skonfigurować niestandardową odpowiedź DNS dla określonej nazwy domeny.",
|
"rewrite_desc": "Pozwala łatwo skonfigurować niestandardową odpowiedź DNS dla określonej nazwy domeny.",
|
||||||
@@ -531,10 +523,6 @@
|
|||||||
"statistics_retention_confirm": "Czy chcesz zmienić sposób przechowania statystyk? Jeżeli obniżysz wartość interwału, niektóre dane będą utracone",
|
"statistics_retention_confirm": "Czy chcesz zmienić sposób przechowania statystyk? Jeżeli obniżysz wartość interwału, niektóre dane będą utracone",
|
||||||
"statistics_cleared": "Statystyki zostały pomyślnie wyczyszczone",
|
"statistics_cleared": "Statystyki zostały pomyślnie wyczyszczone",
|
||||||
"statistics_enable": "Włącz statystyki",
|
"statistics_enable": "Włącz statystyki",
|
||||||
"ignore_domains": "Ignorowane domeny (każda w nowym wierszu)",
|
|
||||||
"ignore_domains_title": "Ignorowane domeny",
|
|
||||||
"ignore_domains_desc_stats": "Zapytania dla tych domen nie są zapisywane do statystyk",
|
|
||||||
"ignore_domains_desc_query": "Zapytania dla tych domen nie są zapisywane do dziennika",
|
|
||||||
"interval_hours": "{{count}} godzina",
|
"interval_hours": "{{count}} godzina",
|
||||||
"interval_hours_plural": "{{count}} godziny",
|
"interval_hours_plural": "{{count}} godziny",
|
||||||
"filters_configuration": "Konfiguracja filtrów",
|
"filters_configuration": "Konfiguracja filtrów",
|
||||||
@@ -547,7 +535,7 @@
|
|||||||
"password_placeholder": "Wpisz hasło",
|
"password_placeholder": "Wpisz hasło",
|
||||||
"sign_in": "Zaloguj się",
|
"sign_in": "Zaloguj się",
|
||||||
"sign_out": "Wyloguj się",
|
"sign_out": "Wyloguj się",
|
||||||
"forgot_password": "Zapomniano hasła?",
|
"forgot_password": "Zapomniałeś hasła?",
|
||||||
"forgot_password_desc": "Wykonaj <0>te kroki</0>, aby utworzyć nowe hasło do konta użytkownika.",
|
"forgot_password_desc": "Wykonaj <0>te kroki</0>, aby utworzyć nowe hasło do konta użytkownika.",
|
||||||
"location": "Lokalizacja",
|
"location": "Lokalizacja",
|
||||||
"orgname": "Nazwa firmy",
|
"orgname": "Nazwa firmy",
|
||||||
@@ -654,30 +642,5 @@
|
|||||||
"anonymizer_notification": "<0>Uwaga:</0> Anonimizacja IP jest włączona. Możesz ją wyłączyć w <1>Ustawieniach ogólnych</1>.",
|
"anonymizer_notification": "<0>Uwaga:</0> Anonimizacja IP jest włączona. Możesz ją wyłączyć w <1>Ustawieniach ogólnych</1>.",
|
||||||
"confirm_dns_cache_clear": "Czy na pewno chcesz wyczyścić pamięć podręczną DNS?",
|
"confirm_dns_cache_clear": "Czy na pewno chcesz wyczyścić pamięć podręczną DNS?",
|
||||||
"cache_cleared": "Pamięć podręczna DNS została pomyślnie wyczyszczona",
|
"cache_cleared": "Pamięć podręczna DNS została pomyślnie wyczyszczona",
|
||||||
"clear_cache": "Wyczyść pamięć podręczną",
|
"clear_cache": "Wyczyść pamięć podręczną"
|
||||||
"make_static": "Ustaw adres statyczny",
|
|
||||||
"theme_auto_desc": "Automatycznie (na podstawie schematu kolorów Twojego urządzenia)",
|
|
||||||
"theme_dark_desc": "Ciemny motyw",
|
|
||||||
"theme_light_desc": "Jasny motyw",
|
|
||||||
"disable_for_seconds": "Na {{count}} sekundę",
|
|
||||||
"disable_for_seconds_plural": "Na {{count}} sekund",
|
|
||||||
"disable_for_minutes": "Na {{count}} minutę",
|
|
||||||
"disable_for_minutes_plural": "Na {{count}} minut",
|
|
||||||
"disable_for_hours": "Na {{count}} godzinę",
|
|
||||||
"disable_for_hours_plural": "Na {{count}} godziny",
|
|
||||||
"disable_until_tomorrow": "Do jutra",
|
|
||||||
"disable_notify_for_seconds": "Wyłącz ochronę na {{count}} sekundę",
|
|
||||||
"disable_notify_for_seconds_plural": "Wyłącz ochronę na {{count}} sekund",
|
|
||||||
"disable_notify_for_minutes": "Wyłącz ochronę na {{count}} minutę",
|
|
||||||
"disable_notify_for_minutes_plural": "Wyłącz ochronę na {{count}} minut",
|
|
||||||
"disable_notify_for_hours": "Wyłącz ochronę na {{count}} godzinę",
|
|
||||||
"disable_notify_for_hours_plural": "Wyłącz ochronę na {{count}} godziny",
|
|
||||||
"disable_notify_until_tomorrow": "Wyłącz ochronę do jutra",
|
|
||||||
"enable_protection_timer": "Ochrona zostanie włączona za {{time}}",
|
|
||||||
"custom_retention_input": "Wprowadź retencję w godzinach",
|
|
||||||
"custom_rotation_input": "Wprowadź rotację w godzinach",
|
|
||||||
"protection_section_label": "Ochrona",
|
|
||||||
"log_and_stats_section_label": "Dziennik zapytań i statystyki",
|
|
||||||
"ignore_query_log": "Zignoruj tego klienta w dzienniku zapytań",
|
|
||||||
"ignore_statistics": "Ignoruj tego klienta w statystykach"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Principais clientes",
|
"top_clients": "Principais clientes",
|
||||||
"no_clients_found": "Nenhuma cliente encontrado",
|
"no_clients_found": "Nenhuma cliente encontrado",
|
||||||
"general_statistics": "Estatísticas gerais",
|
"general_statistics": "Estatísticas gerais",
|
||||||
"top_upstreams": "Melhores servidores DNS primários",
|
|
||||||
"no_upstreams_data_found": "Nenhum dado de servidor DNS primário encontrado",
|
|
||||||
"number_of_dns_query_days": "O número de consultas DNS processadas nos últimos {{count}} dias",
|
"number_of_dns_query_days": "O número de consultas DNS processadas nos últimos {{count}} dias",
|
||||||
"number_of_dns_query_days_plural": "Número de consultas DNS processadas nos últimos {{count}} dias",
|
"number_of_dns_query_days_plural": "Número de consultas DNS processadas nos últimos {{count}} dias",
|
||||||
"number_of_dns_query_24_hours": "O número de consultas DNS processadas nas últimas 24 horas",
|
"number_of_dns_query_24_hours": "O número de consultas DNS processadas nas últimas 24 horas",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Forçar pesquisa segura",
|
"enforced_save_search": "Forçar pesquisa segura",
|
||||||
"number_of_dns_query_to_safe_search": "O número de solicitações de DNS para mecanismos de pesquisa para os quais a pesquisa segura foi aplicada",
|
"number_of_dns_query_to_safe_search": "O número de solicitações de DNS para mecanismos de pesquisa para os quais a pesquisa segura foi aplicada",
|
||||||
"average_processing_time": "Tempo médio de processamento",
|
"average_processing_time": "Tempo médio de processamento",
|
||||||
"processing_time": "Tempo de processamento",
|
|
||||||
"average_processing_time_hint": "Tempo médio em milissegundos no processamento de uma solicitação DNS",
|
"average_processing_time_hint": "Tempo médio em milissegundos no processamento de uma solicitação DNS",
|
||||||
"block_domain_use_filters_and_hosts": "Bloquear domínios usando arquivos de filtros e hosts",
|
"block_domain_use_filters_and_hosts": "Bloquear domínios usando arquivos de filtros e hosts",
|
||||||
"filters_block_toggle_hint": "Você pode configurar as regras de bloqueio nas configurações de <a>Filtros</a>.",
|
"filters_block_toggle_hint": "Você pode configurar as regras de bloqueio nas configurações de <a>Filtros</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Configurado em {{path}}",
|
"upstream_dns_configured_in_file": "Configurado em {{path}}",
|
||||||
"test_upstream_btn": "Testar DNS primário",
|
"test_upstream_btn": "Testar DNS primário",
|
||||||
"upstreams": "DNS primário",
|
"upstreams": "DNS primário",
|
||||||
"upstream": "Servidor DNS primário",
|
|
||||||
"apply_btn": "Aplicar",
|
"apply_btn": "Aplicar",
|
||||||
"disabled_filtering_toast": "Filtragem desativada",
|
"disabled_filtering_toast": "Filtragem desativada",
|
||||||
"enabled_filtering_toast": "Filtragem ativada",
|
"enabled_filtering_toast": "Filtragem ativada",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "O registro de consulta foi limpo com sucesso",
|
"query_log_cleared": "O registro de consulta foi limpo com sucesso",
|
||||||
"query_log_updated": "O registro da consulta foi atualizado com sucesso",
|
"query_log_updated": "O registro da consulta foi atualizado com sucesso",
|
||||||
"query_log_clear": "Limpar registros de consulta",
|
"query_log_clear": "Limpar registros de consulta",
|
||||||
"query_log_retention": "Rotação de registros de consulta",
|
"query_log_retention": "Arquivamento de registros de consultas",
|
||||||
"query_log_enable": "Ativar registro",
|
"query_log_enable": "Ativar registro",
|
||||||
"query_log_configuration": "Configuração de registros",
|
"query_log_configuration": "Configuração de registros",
|
||||||
"query_log_disabled": "O registro de consulta está desativado e pode ser configurado em <0>configurações</0>",
|
"query_log_disabled": "O registro de consulta está desativado e pode ser configurado em <0>configurações</0>",
|
||||||
"query_log_strict_search": "Use aspas duplas para uma pesquisa mais criteriosa",
|
"query_log_strict_search": "Use aspas duplas para uma pesquisa mais criteriosa",
|
||||||
"query_log_retention_confirm": "Tem a certeza de que quer alterar a rotação do registo de consulta? Se diminuir o valor do intervalo, alguns dados serão perdidos",
|
"query_log_retention_confirm": "Você tem certeza de que deseja alterar o arquivamento do registro de consulta? Se diminuir o valor de intervalo, alguns dados serão perdidos",
|
||||||
"anonymize_client_ip": "Tornar anônimo o IP do cliente",
|
"anonymize_client_ip": "Tornar anônimo o IP do cliente",
|
||||||
"anonymize_client_ip_desc": "Não salva o endereço de IP completo do cliente em registros ou estatísticas",
|
"anonymize_client_ip_desc": "Não salva o endereço de IP completo do cliente em registros ou estatísticas",
|
||||||
"dns_config": "Configuração do servidor DNS",
|
"dns_config": "Configuração do servidor DNS",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Você tem certeza de que deseja excluir o cliente \"{{key}}\"?",
|
"client_confirm_delete": "Você tem certeza de que deseja excluir o cliente \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Você tem certeza de que deseja excluir essa lista?",
|
"list_confirm_delete": "Você tem certeza de que deseja excluir essa lista?",
|
||||||
"auto_clients_title": "Clientes ativos",
|
"auto_clients_title": "Clientes ativos",
|
||||||
"auto_clients_desc": "Informações sobre endereços IP de dispositivos que usam ou podem usar o AdGuard Home. Essas informações são coletadas de várias fontes, incluindo arquivos de hosts, DNS reverso, etc.",
|
"auto_clients_desc": "Dispositivo não está na lista de dispositivos persistentes que podem ser utilizados no AdGuard Home",
|
||||||
"access_title": "Configurações de acessos",
|
"access_title": "Configurações de acessos",
|
||||||
"access_desc": "Aqui você pode configurar as regras de acesso para o servidores de DNS do AdGuard Home",
|
"access_desc": "Aqui você pode configurar as regras de acesso para o servidores de DNS do AdGuard Home",
|
||||||
"access_allowed_title": "Clientes permitidos",
|
"access_allowed_title": "Clientes permitidos",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Para usar o <1>DNS-sobre-HTTPS</1> ou <1>DNS-sobre-TLS</1>, você precisa <0>configurar a criptografia</0> nas configurações do AdGuard Home.",
|
"setup_dns_notice": "Para usar o <1>DNS-sobre-HTTPS</1> ou <1>DNS-sobre-TLS</1>, você precisa <0>configurar a criptografia</0> nas configurações do AdGuard Home.",
|
||||||
"rewrite_added": "Reescrita de DNS para \"{{key}}\" adicionada com sucesso",
|
"rewrite_added": "Reescrita de DNS para \"{{key}}\" adicionada com sucesso",
|
||||||
"rewrite_deleted": "Reescrita de DNS para \"{{key}}\" excluída com sucesso",
|
"rewrite_deleted": "Reescrita de DNS para \"{{key}}\" excluída com sucesso",
|
||||||
"rewrite_updated": "Reconfiguração de DNS atualizada com êxito",
|
|
||||||
"rewrite_add": "Adicionar reescrita de DNS",
|
"rewrite_add": "Adicionar reescrita de DNS",
|
||||||
"rewrite_edit": "Editar reconfiguração de DNS",
|
|
||||||
"rewrite_not_found": "Nenhuma reescrita de DNS foi encontrada",
|
"rewrite_not_found": "Nenhuma reescrita de DNS foi encontrada",
|
||||||
"rewrite_confirm_delete": "Você tem certeza de que deseja excluir a reescrita de DNS para \"{{key}}\"?",
|
"rewrite_confirm_delete": "Você tem certeza de que deseja excluir a reescrita de DNS para \"{{key}}\"?",
|
||||||
"rewrite_desc": "Permite configurar uma resposta personalizada do DNS para um nome de domínio específico.",
|
"rewrite_desc": "Permite configurar uma resposta personalizada do DNS para um nome de domínio específico.",
|
||||||
@@ -535,7 +529,7 @@
|
|||||||
"ignore_domains": "Domínios ignorados (separados por nova linha)",
|
"ignore_domains": "Domínios ignorados (separados por nova linha)",
|
||||||
"ignore_domains_title": "Domínios ignorados",
|
"ignore_domains_title": "Domínios ignorados",
|
||||||
"ignore_domains_desc_stats": "As consultas para esses domínios não são gravadas nas estatísticas",
|
"ignore_domains_desc_stats": "As consultas para esses domínios não são gravadas nas estatísticas",
|
||||||
"ignore_domains_desc_query": "As consultas para esses domínios não são gravadas no registro de consulta",
|
"ignore_domains_desc_query": "As consultas para esses domínios não são gravadas no log de consulta",
|
||||||
"interval_hours": "{{count}} hora",
|
"interval_hours": "{{count}} hora",
|
||||||
"interval_hours_plural": "{{count}} horas",
|
"interval_hours_plural": "{{count}} horas",
|
||||||
"filters_configuration": "Configuração de filtros",
|
"filters_configuration": "Configuração de filtros",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Desativar proteção por {{count}} hora",
|
"disable_notify_for_hours": "Desativar proteção por {{count}} hora",
|
||||||
"disable_notify_for_hours_plural": "Desativar proteção por {{count}} horas",
|
"disable_notify_for_hours_plural": "Desativar proteção por {{count}} horas",
|
||||||
"disable_notify_until_tomorrow": "Desativar a proteção até amanhã",
|
"disable_notify_until_tomorrow": "Desativar a proteção até amanhã",
|
||||||
"enable_protection_timer": "A proteção será ativada em {{time}}",
|
"enable_protection_timer": "A proteção será ativada em {{time}}"
|
||||||
"custom_retention_input": "Insira a retenção em horas",
|
|
||||||
"custom_rotation_input": "Insira a rotação em horas",
|
|
||||||
"protection_section_label": "Proteção",
|
|
||||||
"log_and_stats_section_label": "Registro de consultas e estatísticas",
|
|
||||||
"ignore_query_log": "Ignorar este cliente no registo de consultas",
|
|
||||||
"ignore_statistics": "Ignorar este cliente nas estatísticas"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Principais clientes",
|
"top_clients": "Principais clientes",
|
||||||
"no_clients_found": "Nenhum cliente foi encontrado",
|
"no_clients_found": "Nenhum cliente foi encontrado",
|
||||||
"general_statistics": "Estatísticas gerais",
|
"general_statistics": "Estatísticas gerais",
|
||||||
"top_upstreams": "Melhores servidores DNS primários",
|
|
||||||
"no_upstreams_data_found": "Nenhum dado de servidor DNS primário encontrado",
|
|
||||||
"number_of_dns_query_days": "Número de consultas DNS processadas durante los últimos {{count}} días",
|
"number_of_dns_query_days": "Número de consultas DNS processadas durante los últimos {{count}} días",
|
||||||
"number_of_dns_query_days_plural": "Número de consultas DNS processadas durante os últimos {{count}} dias",
|
"number_of_dns_query_days_plural": "Número de consultas DNS processadas durante os últimos {{count}} dias",
|
||||||
"number_of_dns_query_24_hours": "O número de consultas DNS processadas nas últimas 24 horas",
|
"number_of_dns_query_24_hours": "O número de consultas DNS processadas nas últimas 24 horas",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Forçar pesquisa segura",
|
"enforced_save_search": "Forçar pesquisa segura",
|
||||||
"number_of_dns_query_to_safe_search": "O número de solicitações de DNS para motores de busca para os quais a pesquisa segura foi aplicada",
|
"number_of_dns_query_to_safe_search": "O número de solicitações de DNS para motores de busca para os quais a pesquisa segura foi aplicada",
|
||||||
"average_processing_time": "Tempo médio de processamento",
|
"average_processing_time": "Tempo médio de processamento",
|
||||||
"processing_time": "Tempo de processamento",
|
|
||||||
"average_processing_time_hint": "Tempo médio em milissegundos no processamento de uma solicitação DNS",
|
"average_processing_time_hint": "Tempo médio em milissegundos no processamento de uma solicitação DNS",
|
||||||
"block_domain_use_filters_and_hosts": "Bloquear domínios usando ficheiros de filtros e hosts",
|
"block_domain_use_filters_and_hosts": "Bloquear domínios usando ficheiros de filtros e hosts",
|
||||||
"filters_block_toggle_hint": "Pode configurar as regras de bloqueio nas configurações de <a>Filtros</a>.",
|
"filters_block_toggle_hint": "Pode configurar as regras de bloqueio nas configurações de <a>Filtros</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Configurado em {{path}}",
|
"upstream_dns_configured_in_file": "Configurado em {{path}}",
|
||||||
"test_upstream_btn": "Testar DNS primário",
|
"test_upstream_btn": "Testar DNS primário",
|
||||||
"upstreams": "DNS primário",
|
"upstreams": "DNS primário",
|
||||||
"upstream": "Servidor DNS primário",
|
|
||||||
"apply_btn": "Aplicar",
|
"apply_btn": "Aplicar",
|
||||||
"disabled_filtering_toast": "Filtragem desativada",
|
"disabled_filtering_toast": "Filtragem desativada",
|
||||||
"enabled_filtering_toast": "Filtragem ativada",
|
"enabled_filtering_toast": "Filtragem ativada",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "O registo de consulta foi limpo com sucesso",
|
"query_log_cleared": "O registo de consulta foi limpo com sucesso",
|
||||||
"query_log_updated": "O registo da consulta foi atualizado com sucesso",
|
"query_log_updated": "O registo da consulta foi atualizado com sucesso",
|
||||||
"query_log_clear": "Limpar registos de consulta",
|
"query_log_clear": "Limpar registos de consulta",
|
||||||
"query_log_retention": "Rotação de registros de consulta",
|
"query_log_retention": "Retenção de registos de consulta",
|
||||||
"query_log_enable": "Ativar registo",
|
"query_log_enable": "Ativar registo",
|
||||||
"query_log_configuration": "Definições do registo",
|
"query_log_configuration": "Definições do registo",
|
||||||
"query_log_disabled": "O registo de consulta está desativado e pode ser configurado em <0>definições</0>",
|
"query_log_disabled": "O registo de consulta está desativado e pode ser configurado em <0>definições</0>",
|
||||||
"query_log_strict_search": "Usar aspas duplas para uma pesquisa rigorosa",
|
"query_log_strict_search": "Usar aspas duplas para uma pesquisa rigorosa",
|
||||||
"query_log_retention_confirm": "Tem a certeza de que quer alterar a rotação do registo de consulta? Se diminuir o valor do intervalo, alguns dados serão perdidos",
|
"query_log_retention_confirm": "Tem a certeza de que deseja alterar a retenção do registo de consulta? Se diminuir o valor do intervalo, alguns dados serão perdidos",
|
||||||
"anonymize_client_ip": "Tornar anónimo o IP do cliente",
|
"anonymize_client_ip": "Tornar anónimo o IP do cliente",
|
||||||
"anonymize_client_ip_desc": "Não gurda o endereço de IP completo do cliente em registo ou estatísticas",
|
"anonymize_client_ip_desc": "Não gurda o endereço de IP completo do cliente em registo ou estatísticas",
|
||||||
"dns_config": "Definição do servidor DNS",
|
"dns_config": "Definição do servidor DNS",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Tem a certeza de que deseja excluir o cliente \"{{key}}\"?",
|
"client_confirm_delete": "Tem a certeza de que deseja excluir o cliente \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Você tem certeza de que deseja excluir essa lista?",
|
"list_confirm_delete": "Você tem certeza de que deseja excluir essa lista?",
|
||||||
"auto_clients_title": "Clientes ativos",
|
"auto_clients_title": "Clientes ativos",
|
||||||
"auto_clients_desc": "Informações sobre endereços IP de dispositivos que estão a utilizar ou podem utilizar o AdGuard Home. Estas informações são recolhidas a partir de várias fontes, incluindo ficheiros hosts, DNS reverso etc.",
|
"auto_clients_desc": "Dispositivo não está na lista de dispositivos persistentes que podem ser utilizados no AdGuard Home",
|
||||||
"access_title": "Definições de acesso",
|
"access_title": "Definições de acesso",
|
||||||
"access_desc": "Aqui pode configurar as regras de acesso para o servidores de DNS do AdGuard Home",
|
"access_desc": "Aqui pode configurar as regras de acesso para o servidores de DNS do AdGuard Home",
|
||||||
"access_allowed_title": "Clientes permitidos",
|
"access_allowed_title": "Clientes permitidos",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Para usar o <1>DNS-sobre-HTTPS</1> ou <1>DNS-sobre-TLS</1>, precisa de <0>configurar a criptografia</0> nas configurações do AdGuard Home.",
|
"setup_dns_notice": "Para usar o <1>DNS-sobre-HTTPS</1> ou <1>DNS-sobre-TLS</1>, precisa de <0>configurar a criptografia</0> nas configurações do AdGuard Home.",
|
||||||
"rewrite_added": "Reescrita de DNS para \"{{key}}\" adicionada com sucesso",
|
"rewrite_added": "Reescrita de DNS para \"{{key}}\" adicionada com sucesso",
|
||||||
"rewrite_deleted": "Reescrita de DNS para \"{{key}}\" excluída com sucesso",
|
"rewrite_deleted": "Reescrita de DNS para \"{{key}}\" excluída com sucesso",
|
||||||
"rewrite_updated": "Reedição de DNS atualizada com sucesso",
|
|
||||||
"rewrite_add": "Adicionar reescrita de DNS",
|
"rewrite_add": "Adicionar reescrita de DNS",
|
||||||
"rewrite_edit": "Editar reedição de DNS",
|
|
||||||
"rewrite_not_found": "Nenhuma reescrita de DNS foi encontrada",
|
"rewrite_not_found": "Nenhuma reescrita de DNS foi encontrada",
|
||||||
"rewrite_confirm_delete": "Tem a certeza de que deseja excluir a reescrita de DNS para \"{{key}}\"?",
|
"rewrite_confirm_delete": "Tem a certeza de que deseja excluir a reescrita de DNS para \"{{key}}\"?",
|
||||||
"rewrite_desc": "Permite configurar uma resposta personalizada do DNS para um nome de domínio específico.",
|
"rewrite_desc": "Permite configurar uma resposta personalizada do DNS para um nome de domínio específico.",
|
||||||
@@ -535,7 +529,7 @@
|
|||||||
"ignore_domains": "Domínios ignorados (separados por nova linha)",
|
"ignore_domains": "Domínios ignorados (separados por nova linha)",
|
||||||
"ignore_domains_title": "Domínios ignorados",
|
"ignore_domains_title": "Domínios ignorados",
|
||||||
"ignore_domains_desc_stats": "As consultas para estes domínios não aparecem nas estatísticas",
|
"ignore_domains_desc_stats": "As consultas para estes domínios não aparecem nas estatísticas",
|
||||||
"ignore_domains_desc_query": "As consultas para estes domínios não aparecem no registo de consultas",
|
"ignore_domains_desc_query": "As consultas para estes domínios nãoaparecem no registo de consultas",
|
||||||
"interval_hours": "{{count}} hora",
|
"interval_hours": "{{count}} hora",
|
||||||
"interval_hours_plural": "{{count}} horas",
|
"interval_hours_plural": "{{count}} horas",
|
||||||
"filters_configuration": "Definição dos filtros",
|
"filters_configuration": "Definição dos filtros",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Desativar proteção por {{count}} hora",
|
"disable_notify_for_hours": "Desativar proteção por {{count}} hora",
|
||||||
"disable_notify_for_hours_plural": "Desativar proteção por {{count}} horas",
|
"disable_notify_for_hours_plural": "Desativar proteção por {{count}} horas",
|
||||||
"disable_notify_until_tomorrow": "Desativar a proteção até amanhã",
|
"disable_notify_until_tomorrow": "Desativar a proteção até amanhã",
|
||||||
"enable_protection_timer": "A proteção será habilitada em {{time}}",
|
"enable_protection_timer": "A proteção será habilitada em {{time}}"
|
||||||
"custom_retention_input": "Insira a retenção em horas",
|
|
||||||
"custom_rotation_input": "Insira a rotação em horas",
|
|
||||||
"protection_section_label": "Proteção",
|
|
||||||
"log_and_stats_section_label": "Log de consulta e estatísticas",
|
|
||||||
"ignore_query_log": "Ignorar este cliente no log de consulta",
|
|
||||||
"ignore_statistics": "Ignorar este cliente nas estatísticas"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Clienți de top",
|
"top_clients": "Clienți de top",
|
||||||
"no_clients_found": "Nu au fost găsiți clienți",
|
"no_clients_found": "Nu au fost găsiți clienți",
|
||||||
"general_statistics": "Statistici generale",
|
"general_statistics": "Statistici generale",
|
||||||
"top_upstreams": "Top servere în amonte",
|
|
||||||
"no_upstreams_data_found": "Nu există date despre serverele din amonte",
|
|
||||||
"number_of_dns_query_days": "Numărul de interogări DNS procesate în ultima {{count}} zi",
|
"number_of_dns_query_days": "Numărul de interogări DNS procesate în ultima {{count}} zi",
|
||||||
"number_of_dns_query_days_plural": "Numărul de interogări DNS procesate în ultimele {{count}} zile",
|
"number_of_dns_query_days_plural": "Numărul de interogări DNS procesate în ultimele {{count}} zile",
|
||||||
"number_of_dns_query_24_hours": "Numărul de interogări DNS procesate în ultimele 24 de ore",
|
"number_of_dns_query_24_hours": "Numărul de interogări DNS procesate în ultimele 24 de ore",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Configurat în {{path}}",
|
"upstream_dns_configured_in_file": "Configurat în {{path}}",
|
||||||
"test_upstream_btn": "Testați upstreams",
|
"test_upstream_btn": "Testați upstreams",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Server în amonte",
|
|
||||||
"apply_btn": "Aplică",
|
"apply_btn": "Aplică",
|
||||||
"disabled_filtering_toast": "Filtrare dezactivată",
|
"disabled_filtering_toast": "Filtrare dezactivată",
|
||||||
"enabled_filtering_toast": "Filtrare activată",
|
"enabled_filtering_toast": "Filtrare activată",
|
||||||
@@ -170,7 +167,6 @@
|
|||||||
"enabled_parental_toast": "Control Parental activat",
|
"enabled_parental_toast": "Control Parental activat",
|
||||||
"disabled_safe_search_toast": "Căutare protejată dezactivată",
|
"disabled_safe_search_toast": "Căutare protejată dezactivată",
|
||||||
"enabled_save_search_toast": "Căutare protejată activată",
|
"enabled_save_search_toast": "Căutare protejată activată",
|
||||||
"updated_save_search_toast": "Setări Căutare sigură actualizate",
|
|
||||||
"enabled_table_header": "Activat",
|
"enabled_table_header": "Activat",
|
||||||
"name_table_header": "Nume",
|
"name_table_header": "Nume",
|
||||||
"list_url_table_header": "Lista URL",
|
"list_url_table_header": "Lista URL",
|
||||||
@@ -260,12 +256,12 @@
|
|||||||
"query_log_cleared": "Jurnalul de interogare a fost șters cu succes",
|
"query_log_cleared": "Jurnalul de interogare a fost șters cu succes",
|
||||||
"query_log_updated": "Jurnalul de solicitări a fost actualizat cu succes",
|
"query_log_updated": "Jurnalul de solicitări a fost actualizat cu succes",
|
||||||
"query_log_clear": "Curăță jurnalele",
|
"query_log_clear": "Curăță jurnalele",
|
||||||
"query_log_retention": "Interogarea jurnalelor de rotație",
|
"query_log_retention": "Retenție jurnale interogare",
|
||||||
"query_log_enable": "Activați jurnal",
|
"query_log_enable": "Activați jurnal",
|
||||||
"query_log_configuration": "Configurația jurnalelor",
|
"query_log_configuration": "Configurația jurnalelor",
|
||||||
"query_log_disabled": "Jurnalul de interogare este dezactivat și poate fi configurat în <0>setări</0>",
|
"query_log_disabled": "Jurnalul de interogare este dezactivat și poate fi configurat în <0>setări</0>",
|
||||||
"query_log_strict_search": "Utilizați ghilimele duble pentru căutare strictă",
|
"query_log_strict_search": "Utilizați ghilimele duble pentru căutare strictă",
|
||||||
"query_log_retention_confirm": "Sigur doriți să modificați rotația jurnalului de interogări? Dacă micșorați valoarea intervalului, unele date se vor pierde",
|
"query_log_retention_confirm": "Sunteți sigur că doriți să schimbați retenția jurnalului de interogare? Reducând valoarea intervalului, unele date vor fi pierdute",
|
||||||
"anonymize_client_ip": "Anonimizare client IP",
|
"anonymize_client_ip": "Anonimizare client IP",
|
||||||
"anonymize_client_ip_desc": "Nu salvați adresa IP completă a clientului în jurnale și statistici",
|
"anonymize_client_ip_desc": "Nu salvați adresa IP completă a clientului în jurnale și statistici",
|
||||||
"dns_config": "Configurația serverului DNS",
|
"dns_config": "Configurația serverului DNS",
|
||||||
@@ -294,8 +290,6 @@
|
|||||||
"rate_limit": "Limita ratei",
|
"rate_limit": "Limita ratei",
|
||||||
"edns_enable": "Activați subrețeaua de clienți EDNS",
|
"edns_enable": "Activați subrețeaua de clienți EDNS",
|
||||||
"edns_cs_desc": "Adaugă opțiunea EDNS Client Subnet (ECS) la solicitările în amonte și înregistrează valorile trimise de clienți în jurnalul de interogare.",
|
"edns_cs_desc": "Adaugă opțiunea EDNS Client Subnet (ECS) la solicitările în amonte și înregistrează valorile trimise de clienți în jurnalul de interogare.",
|
||||||
"edns_use_custom_ip": "Utilizați IP personalizat pentru EDNS",
|
|
||||||
"edns_use_custom_ip_desc": "Permiteți utilizarea IP-ului personalizat pentru EDNS",
|
|
||||||
"rate_limit_desc": "Numărul de interogări pe secundă permise pe client. Setarea la 0 înseamnă că nu există limită.",
|
"rate_limit_desc": "Numărul de interogări pe secundă permise pe client. Setarea la 0 înseamnă că nu există limită.",
|
||||||
"blocking_ipv4_desc": "Adresa IP de returnat pentru o cerere A de blocare",
|
"blocking_ipv4_desc": "Adresa IP de returnat pentru o cerere A de blocare",
|
||||||
"blocking_ipv6_desc": "Adresa IP de returnat pentru o cerere AAAA de blocare",
|
"blocking_ipv6_desc": "Adresa IP de returnat pentru o cerere AAAA de blocare",
|
||||||
@@ -447,7 +441,7 @@
|
|||||||
"client_confirm_delete": "Sunteți sigur că doriți să ștergeți clientul \"{{key}}\"?",
|
"client_confirm_delete": "Sunteți sigur că doriți să ștergeți clientul \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Sigur doriți să ștergeți această listă?",
|
"list_confirm_delete": "Sigur doriți să ștergeți această listă?",
|
||||||
"auto_clients_title": "Clienți runtime",
|
"auto_clients_title": "Clienți runtime",
|
||||||
"auto_clients_desc": "Informații despre adresele IP ale dispozitivelor care utilizează sau pot utiliza AdGuard Home. Aceste informații sunt colectate din mai multe surse, inclusiv din fișiere hosts, DNS inversat etc.",
|
"auto_clients_desc": "Dispozitivele care nu se află pe lista de clienți Persistent care pot utiliza în continuare AdGuard Home",
|
||||||
"access_title": "Setări de acces",
|
"access_title": "Setări de acces",
|
||||||
"access_desc": "Aici puteți configura regulile de acces pentru serverul DNS AdGuard Home",
|
"access_desc": "Aici puteți configura regulile de acces pentru serverul DNS AdGuard Home",
|
||||||
"access_allowed_title": "Clienți autorizați",
|
"access_allowed_title": "Clienți autorizați",
|
||||||
@@ -481,9 +475,7 @@
|
|||||||
"setup_dns_notice": "Pentru a utiliza <1>DNS-over-HTTPS</1> sau <1>DNS-over-TLS</1>, trebuie să <0>configurați Criptarea</0> în setările AdGuard Home.",
|
"setup_dns_notice": "Pentru a utiliza <1>DNS-over-HTTPS</1> sau <1>DNS-over-TLS</1>, trebuie să <0>configurați Criptarea</0> în setările AdGuard Home.",
|
||||||
"rewrite_added": "Rescriere DNS pentru \"{{key}}\" adăugată cu succes",
|
"rewrite_added": "Rescriere DNS pentru \"{{key}}\" adăugată cu succes",
|
||||||
"rewrite_deleted": "Rescriere DNS pentru \"{{key}}\" ștearsă cu succes",
|
"rewrite_deleted": "Rescriere DNS pentru \"{{key}}\" ștearsă cu succes",
|
||||||
"rewrite_updated": "DNS rescrie actualizat cu succes",
|
|
||||||
"rewrite_add": "Adăugați rescriere DNS",
|
"rewrite_add": "Adăugați rescriere DNS",
|
||||||
"rewrite_edit": "Editați rescrierea DNS",
|
|
||||||
"rewrite_not_found": "Nu s-au găsit rescrieri DNS",
|
"rewrite_not_found": "Nu s-au găsit rescrieri DNS",
|
||||||
"rewrite_confirm_delete": "Sunteți sigur că doriți să ștergeți rescrierea DNS pentru \"{{key}}\"?",
|
"rewrite_confirm_delete": "Sunteți sigur că doriți să ștergeți rescrierea DNS pentru \"{{key}}\"?",
|
||||||
"rewrite_desc": "Permite configurarea cu ușurință a răspunsului personalizat DNS pentru un nume de domeniu specific.",
|
"rewrite_desc": "Permite configurarea cu ușurință a răspunsului personalizat DNS pentru un nume de domeniu specific.",
|
||||||
@@ -531,10 +523,6 @@
|
|||||||
"statistics_retention_confirm": "Sunteți sigur că doriți să schimbați păstrarea statisticilor? Dacă reduceți valoarea intervalului, unele date vor fi pierdute",
|
"statistics_retention_confirm": "Sunteți sigur că doriți să schimbați păstrarea statisticilor? Dacă reduceți valoarea intervalului, unele date vor fi pierdute",
|
||||||
"statistics_cleared": "Statisticile au fost șterse cu succes",
|
"statistics_cleared": "Statisticile au fost șterse cu succes",
|
||||||
"statistics_enable": "Activați statisticile",
|
"statistics_enable": "Activați statisticile",
|
||||||
"ignore_domains": "Domenii ignorate (separate prin linie nouă)",
|
|
||||||
"ignore_domains_title": "Domenii ignorate",
|
|
||||||
"ignore_domains_desc_stats": "Interogările pentru aceste domenii nu sunt scrise în statistici",
|
|
||||||
"ignore_domains_desc_query": "Interogările pentru aceste domenii nu sunt scrise în jurnalul de interogări",
|
|
||||||
"interval_hours": "{{count}} oră",
|
"interval_hours": "{{count}} oră",
|
||||||
"interval_hours_plural": "{{count}} ore",
|
"interval_hours_plural": "{{count}} ore",
|
||||||
"filters_configuration": "Configurația filtrelor",
|
"filters_configuration": "Configurația filtrelor",
|
||||||
@@ -654,30 +642,5 @@
|
|||||||
"anonymizer_notification": "<0>Nota:</0> Anonimizarea IP este activată. Puteți să o dezactivați în <1>Setări generale</1>.",
|
"anonymizer_notification": "<0>Nota:</0> Anonimizarea IP este activată. Puteți să o dezactivați în <1>Setări generale</1>.",
|
||||||
"confirm_dns_cache_clear": "Sunteți sigur că doriți să ștergeți memoria cache DNS?",
|
"confirm_dns_cache_clear": "Sunteți sigur că doriți să ștergeți memoria cache DNS?",
|
||||||
"cache_cleared": "Cache-ul DNS a fost golit cu succes",
|
"cache_cleared": "Cache-ul DNS a fost golit cu succes",
|
||||||
"clear_cache": "Goliți memoria cache",
|
"clear_cache": "Goliți memoria cache"
|
||||||
"make_static": "Faceți static",
|
|
||||||
"theme_auto_desc": "Auto (pe baza schemei de culori a dispozitivului dvs.)",
|
|
||||||
"theme_dark_desc": "Temă întunecată",
|
|
||||||
"theme_light_desc": "Temă luminoasă",
|
|
||||||
"disable_for_seconds": "Timp de {{count}} secundă",
|
|
||||||
"disable_for_seconds_plural": "Timp de {{count}} secunde",
|
|
||||||
"disable_for_minutes": "Timp de {{count}} minut",
|
|
||||||
"disable_for_minutes_plural": "Timp de {{count}} minute",
|
|
||||||
"disable_for_hours": "Timp de {{count}} oră",
|
|
||||||
"disable_for_hours_plural": "Timp de {{count}} ore",
|
|
||||||
"disable_until_tomorrow": "Până mâine",
|
|
||||||
"disable_notify_for_seconds": "Dezactivați protecția timp de {{count}} secundă",
|
|
||||||
"disable_notify_for_seconds_plural": "Dezactivați protecția timp de {{count}} secunde",
|
|
||||||
"disable_notify_for_minutes": "Dezactivați protecția timp de {{count}} minut",
|
|
||||||
"disable_notify_for_minutes_plural": "Dezactivați protecția timp de {{count}} minute",
|
|
||||||
"disable_notify_for_hours": "Dezactivează protecția timp de {{count}} oră",
|
|
||||||
"disable_notify_for_hours_plural": "Dezactivați protecția timp de {{count}} ore",
|
|
||||||
"disable_notify_until_tomorrow": "Dezactivează protecția până mâine",
|
|
||||||
"enable_protection_timer": "Protecția va fi activată în {{time}}",
|
|
||||||
"custom_retention_input": "Introduceți reținerea în ore",
|
|
||||||
"custom_rotation_input": "Introduceți rotația în ore",
|
|
||||||
"protection_section_label": "Protecție",
|
|
||||||
"log_and_stats_section_label": "Jurnal de interogări și statistici",
|
|
||||||
"ignore_query_log": "Ignorați acest client în jurnalul de interogări",
|
|
||||||
"ignore_statistics": "Ignorați acest client în statistici"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Частые клиенты",
|
"top_clients": "Частые клиенты",
|
||||||
"no_clients_found": "Клиентов не найдено",
|
"no_clients_found": "Клиентов не найдено",
|
||||||
"general_statistics": "Общая статистика",
|
"general_statistics": "Общая статистика",
|
||||||
"top_upstreams": "Часто запрашиваемые upstream-серверы",
|
|
||||||
"no_upstreams_data_found": "Нет данных об upstream-серверах",
|
|
||||||
"number_of_dns_query_days": "Количество DNS-запросов за последний {{count}} день",
|
"number_of_dns_query_days": "Количество DNS-запросов за последний {{count}} день",
|
||||||
"number_of_dns_query_days_plural": "Количество DNS запросов, обработанных за последние {{count}} дней",
|
"number_of_dns_query_days_plural": "Количество DNS запросов, обработанных за последние {{count}} дней",
|
||||||
"number_of_dns_query_24_hours": "Количество DNS-запросов за последние 24 часа",
|
"number_of_dns_query_24_hours": "Количество DNS-запросов за последние 24 часа",
|
||||||
@@ -136,9 +134,8 @@
|
|||||||
"enforced_save_search": "Применён безопасный поиск",
|
"enforced_save_search": "Применён безопасный поиск",
|
||||||
"number_of_dns_query_to_safe_search": "Количество запросов DNS для поисковых систем, для которых был применён Безопасный поиск",
|
"number_of_dns_query_to_safe_search": "Количество запросов DNS для поисковых систем, для которых был применён Безопасный поиск",
|
||||||
"average_processing_time": "Среднее время обработки запроса",
|
"average_processing_time": "Среднее время обработки запроса",
|
||||||
"processing_time": "Время обработки",
|
|
||||||
"average_processing_time_hint": "Среднее время для обработки запроса DNS в миллисекундах",
|
"average_processing_time_hint": "Среднее время для обработки запроса DNS в миллисекундах",
|
||||||
"block_domain_use_filters_and_hosts": "Блокировать домены с использованием фильтров и файлов hosts",
|
"block_domain_use_filters_and_hosts": "Блокировать домены с использованием фильтров и файлов хостов",
|
||||||
"filters_block_toggle_hint": "Вы можете настроить правила блокировки в <a>«Фильтрах»</a>.",
|
"filters_block_toggle_hint": "Вы можете настроить правила блокировки в <a>«Фильтрах»</a>.",
|
||||||
"use_adguard_browsing_sec": "Включить Безопасную навигацию AdGuard",
|
"use_adguard_browsing_sec": "Включить Безопасную навигацию AdGuard",
|
||||||
"use_adguard_browsing_sec_hint": "AdGuard Home проверит, включён ли домен в веб-службу безопасности браузера. Он будет использовать API, чтобы выполнить проверку: на сервер отправляется только короткий префикс имени домена SHA256.",
|
"use_adguard_browsing_sec_hint": "AdGuard Home проверит, включён ли домен в веб-службу безопасности браузера. Он будет использовать API, чтобы выполнить проверку: на сервер отправляется только короткий префикс имени домена SHA256.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Настроен в {{path}}",
|
"upstream_dns_configured_in_file": "Настроен в {{path}}",
|
||||||
"test_upstream_btn": "Тест upstream серверов",
|
"test_upstream_btn": "Тест upstream серверов",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream-сервер",
|
|
||||||
"apply_btn": "Применить",
|
"apply_btn": "Применить",
|
||||||
"disabled_filtering_toast": "Фильтрация выкл.",
|
"disabled_filtering_toast": "Фильтрация выкл.",
|
||||||
"enabled_filtering_toast": "Фильтрация вкл.",
|
"enabled_filtering_toast": "Фильтрация вкл.",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Журнал запросов успешно очищен",
|
"query_log_cleared": "Журнал запросов успешно очищен",
|
||||||
"query_log_updated": "Журнал запросов успешно обновлён",
|
"query_log_updated": "Журнал запросов успешно обновлён",
|
||||||
"query_log_clear": "Очистить журнал запросов",
|
"query_log_clear": "Очистить журнал запросов",
|
||||||
"query_log_retention": "Частота ротации журнала запросов",
|
"query_log_retention": "Сохранение журнала запросов",
|
||||||
"query_log_enable": "Включить журнал",
|
"query_log_enable": "Включить журнал",
|
||||||
"query_log_configuration": "Настройка журнала",
|
"query_log_configuration": "Настройка журнала",
|
||||||
"query_log_disabled": "Журнал запросов выключен, его можно включить в <0>настройках</0>",
|
"query_log_disabled": "Журнал запросов выключен, его можно включить в <0>настройках</0>",
|
||||||
"query_log_strict_search": "Используйте двойные кавычки для строгого поиска",
|
"query_log_strict_search": "Используйте двойные кавычки для строгого поиска",
|
||||||
"query_log_retention_confirm": "Вы уверены, что хотите изменить частоту ротации журнала запросов? При сокращении срока данные могут быть утеряны",
|
"query_log_retention_confirm": "Вы уверены, что хотите изменить срок хранения запросов? При сокращении интервала данные могут быть утеряны",
|
||||||
"anonymize_client_ip": "Анонимизировать IP-адрес клиента",
|
"anonymize_client_ip": "Анонимизировать IP-адрес клиента",
|
||||||
"anonymize_client_ip_desc": "Не сохранять полный IP-адрес клиента в журналах и статистике",
|
"anonymize_client_ip_desc": "Не сохранять полный IP-адрес клиента в журналах и статистике",
|
||||||
"dns_config": "Настройки DNS-сервера",
|
"dns_config": "Настройки DNS-сервера",
|
||||||
@@ -300,7 +296,7 @@
|
|||||||
"rate_limit_desc": "Ограничение на количество запросов в секунду для каждого клиента (0 — неограниченно).",
|
"rate_limit_desc": "Ограничение на количество запросов в секунду для каждого клиента (0 — неограниченно).",
|
||||||
"blocking_ipv4_desc": "IP-адрес, возвращаемый при блокировке A-запроса",
|
"blocking_ipv4_desc": "IP-адрес, возвращаемый при блокировке A-запроса",
|
||||||
"blocking_ipv6_desc": "IP-адрес, возвращаемый при блокировке AAAA-запроса",
|
"blocking_ipv6_desc": "IP-адрес, возвращаемый при блокировке AAAA-запроса",
|
||||||
"blocking_mode_default": "Стандартный: Отвечает с нулевым IP-адресом, (0.0.0.0 для A; :: для AAAA) когда заблокировано правилом в стиле Adblock; отвечает с IP-адресом, указанным в правиле, когда заблокировано правилом в стиле файлов hosts",
|
"blocking_mode_default": "Стандартный: Отвечает с нулевым IP-адресом, (0.0.0.0 для A; :: для AAAA) когда заблокировано правилом в стиле Adblock; отвечает с IP-адресом, указанным в правиле, когда заблокировано правилом в стиле /etc/hosts-style",
|
||||||
"blocking_mode_refused": "REFUSED: Отвечает с кодом REFUSED",
|
"blocking_mode_refused": "REFUSED: Отвечает с кодом REFUSED",
|
||||||
"blocking_mode_nxdomain": "NXDOMAIN: Отвечает с кодом NXDOMAIN\n",
|
"blocking_mode_nxdomain": "NXDOMAIN: Отвечает с кодом NXDOMAIN\n",
|
||||||
"blocking_mode_null_ip": "Нулевой IP: Отвечает с нулевым IP-адресом (0.0.0.0 для A; :: для AAAA)",
|
"blocking_mode_null_ip": "Нулевой IP: Отвечает с нулевым IP-адресом (0.0.0.0 для A; :: для AAAA)",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Вы уверены, что хотите удалить клиента «{{key}}»?",
|
"client_confirm_delete": "Вы уверены, что хотите удалить клиента «{{key}}»?",
|
||||||
"list_confirm_delete": "Вы уверены, что хотите удалить этот список?",
|
"list_confirm_delete": "Вы уверены, что хотите удалить этот список?",
|
||||||
"auto_clients_title": "Клиенты (runtime)",
|
"auto_clients_title": "Клиенты (runtime)",
|
||||||
"auto_clients_desc": "Информация об IP-адресах устройств, которые используют или могут использовать AdGuard Home. Эта информация собирается из нескольких источников, включая файлы hosts, обратный DNS и так далее.",
|
"auto_clients_desc": "Несохранённые клиенты, которые могут пользоваться AdGuard Home",
|
||||||
"access_title": "Настройки доступа",
|
"access_title": "Настройки доступа",
|
||||||
"access_desc": "Здесь вы можете настроить правила доступа к DNS-серверу AdGuard Home",
|
"access_desc": "Здесь вы можете настроить правила доступа к DNS-серверу AdGuard Home",
|
||||||
"access_allowed_title": "Разрешённые клиенты",
|
"access_allowed_title": "Разрешённые клиенты",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Чтобы использовать <1>DNS-over-HTTPS</1> или <1>DNS-over-TLS</1>, вам нужно <0>настроить шифрование</0> в настройках AdGuard Home.",
|
"setup_dns_notice": "Чтобы использовать <1>DNS-over-HTTPS</1> или <1>DNS-over-TLS</1>, вам нужно <0>настроить шифрование</0> в настройках AdGuard Home.",
|
||||||
"rewrite_added": "Правило перезаписи DNS-запросов для «{{key}}» успешно добавлено",
|
"rewrite_added": "Правило перезаписи DNS-запросов для «{{key}}» успешно добавлено",
|
||||||
"rewrite_deleted": "Правило перезаписи DNS-запросов для «{{key}}» успешно удалено",
|
"rewrite_deleted": "Правило перезаписи DNS-запросов для «{{key}}» успешно удалено",
|
||||||
"rewrite_updated": "Правило перезаписи DNS-запросов успешно обновлено",
|
|
||||||
"rewrite_add": "Добавить правило перезаписи DNS-запросов",
|
"rewrite_add": "Добавить правило перезаписи DNS-запросов",
|
||||||
"rewrite_edit": "Редактировать правило перезаписи DNS-запросов",
|
|
||||||
"rewrite_not_found": "Не найдено правил перезаписи DNS-запросов",
|
"rewrite_not_found": "Не найдено правил перезаписи DNS-запросов",
|
||||||
"rewrite_confirm_delete": "Вы уверены, что хотите удалить правило перезаписи DNS-запросов для «{{key}}»?",
|
"rewrite_confirm_delete": "Вы уверены, что хотите удалить правило перезаписи DNS-запросов для «{{key}}»?",
|
||||||
"rewrite_desc": "Позволяет легко настроить пользовательский DNS-ответ для определеннного домена.",
|
"rewrite_desc": "Позволяет легко настроить пользовательский DNS-ответ для определеннного домена.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Отключить защиту на {{count}} час",
|
"disable_notify_for_hours": "Отключить защиту на {{count}} час",
|
||||||
"disable_notify_for_hours_plural": "Отключить защиту на {{count}} часов",
|
"disable_notify_for_hours_plural": "Отключить защиту на {{count}} часов",
|
||||||
"disable_notify_until_tomorrow": "Отключить защиту до завтра",
|
"disable_notify_until_tomorrow": "Отключить защиту до завтра",
|
||||||
"enable_protection_timer": "Защита будет включена в {{time}}",
|
"enable_protection_timer": "Защита будет включена в {{time}}"
|
||||||
"custom_retention_input": "Введите срок хранения в часах",
|
|
||||||
"custom_rotation_input": "Введите частоту ротации в часах",
|
|
||||||
"protection_section_label": "Защита",
|
|
||||||
"log_and_stats_section_label": "Журнал запросов и статистика",
|
|
||||||
"ignore_query_log": "Игнорировать этого клиента в журнале запросов",
|
|
||||||
"ignore_statistics": "Игнорировать этого клиента в статистике"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,7 +153,6 @@
|
|||||||
"enabled_parental_toast": "දෙමාපිය පාලනය සබල කෙරිණි",
|
"enabled_parental_toast": "දෙමාපිය පාලනය සබල කෙරිණි",
|
||||||
"disabled_safe_search_toast": "ආරක්ෂිත සෙවුම අබල කෙරිණි",
|
"disabled_safe_search_toast": "ආරක්ෂිත සෙවුම අබල කෙරිණි",
|
||||||
"enabled_save_search_toast": "ආරක්ෂිත සෙවුම සබල කෙරිණි",
|
"enabled_save_search_toast": "ආරක්ෂිත සෙවුම සබල කෙරිණි",
|
||||||
"updated_save_search_toast": "ආරක්ෂිත සෙවුමේ සැකසුම් යාවත්කාල විය",
|
|
||||||
"enabled_table_header": "සබලයි",
|
"enabled_table_header": "සබලයි",
|
||||||
"name_table_header": "නම",
|
"name_table_header": "නම",
|
||||||
"list_url_table_header": "ඒ.ස.නි.(URL) ලැයිස්තුව",
|
"list_url_table_header": "ඒ.ස.නි.(URL) ලැයිස්තුව",
|
||||||
@@ -238,12 +237,12 @@
|
|||||||
"query_log_cleared": "විමසුම් සටහන සාර්ථකව හිස් කර ඇත",
|
"query_log_cleared": "විමසුම් සටහන සාර්ථකව හිස් කර ඇත",
|
||||||
"query_log_updated": "විමසුම් සටහන සාර්ථකව යාවත්කාල කෙරිණි",
|
"query_log_updated": "විමසුම් සටහන සාර්ථකව යාවත්කාල කෙරිණි",
|
||||||
"query_log_clear": "විමසුම් සටහන් හිස් කරන්න",
|
"query_log_clear": "විමසුම් සටහන් හිස් කරන්න",
|
||||||
"query_log_retention": "විමසුම් සටහන් රැඳවීම",
|
"query_log_retention": "විමසුම් සටහන් රඳවා තබා ගැනීම",
|
||||||
"query_log_enable": "සටහන සබල කරන්න",
|
"query_log_enable": "සටහන සබල කරන්න",
|
||||||
"query_log_configuration": "සටහන් වින්යාසය",
|
"query_log_configuration": "සටහන් වින්යාසය",
|
||||||
"query_log_disabled": "විමසුම් සටහන අබල කර ඇති අතර එය <0>සැකසුම්</0> තුළ වින්යාසගත කළ හැකිය",
|
"query_log_disabled": "විමසුම් සටහන අබල කර ඇති අතර එය <0>සැකසුම්</0> තුළ වින්යාසගත කළ හැකිය",
|
||||||
"query_log_strict_search": "ඉතා නිවැරදිව සෙවීමට ද්විත්ව උද්ධෘතය භාවිතා කරන්න",
|
"query_log_strict_search": "ඉතා නිවැරදිව සෙවීමට ද්විත්ව උද්ධෘතය භාවිතා කරන්න",
|
||||||
"query_log_retention_confirm": "විමසුම් සටහන රඳවා තබා ගැනීම වෙනස් කිරීමට වුවමනා ද? ඔබ කාල පරතරයෙහි අගය අඩු කළහොත් සමහර දත්ත නැති වී යනු ඇත",
|
"query_log_retention_confirm": "විමසුම් සටහන රඳවා තබා ගැනීම වෙනස් කිරීමට ඇවැසි බව ඔබට විශ්වාසද? ඔබ කාල පරතරයෙහි අගය අඩු කළහොත් සමහර දත්ත නැති වී යනු ඇත",
|
||||||
"anonymize_client_ip": "අනුග්රාහකයෙහි අ.ජා.කෙ. (IP) නිර්නාමික කරන්න",
|
"anonymize_client_ip": "අනුග්රාහකයෙහි අ.ජා.කෙ. (IP) නිර්නාමික කරන්න",
|
||||||
"anonymize_client_ip_desc": "සටහන් සහ සංඛ්යාලේඛන තුළ අනුග්රාහකයේ පූර්ණ අ.ජා.කෙ. ලිපිනය සුරකින්න එපා",
|
"anonymize_client_ip_desc": "සටහන් සහ සංඛ්යාලේඛන තුළ අනුග්රාහකයේ පූර්ණ අ.ජා.කෙ. ලිපිනය සුරකින්න එපා",
|
||||||
"dns_config": "ව.නා.ප. සේවාදායක වින්යාසය",
|
"dns_config": "ව.නා.ප. සේවාදායක වින්යාසය",
|
||||||
@@ -271,8 +270,6 @@
|
|||||||
"form_enter_rate_limit": "අනුපාත සීමාව ඇතුල් කරන්න",
|
"form_enter_rate_limit": "අනුපාත සීමාව ඇතුල් කරන්න",
|
||||||
"rate_limit": "අනුපාත සීමාව",
|
"rate_limit": "අනුපාත සීමාව",
|
||||||
"edns_enable": "EDNS අනුග්රාහක අනුජාලය සබල කරන්න",
|
"edns_enable": "EDNS අනුග්රාහක අනුජාලය සබල කරන්න",
|
||||||
"edns_use_custom_ip": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. යොදාගන්න",
|
|
||||||
"edns_use_custom_ip_desc": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. භාවිතයට ඉඩදෙන්න",
|
|
||||||
"rate_limit_desc": "එක් අනුග්රාහකයකට ඉඩ දී ඇති තත්පරයට ඉල්ලීම් ගණන. එය 0 ලෙස සැකසීම යනුවෙන් අදහස් කරන්නේ සීමාවක් නැති බවයි.",
|
"rate_limit_desc": "එක් අනුග්රාහකයකට ඉඩ දී ඇති තත්පරයට ඉල්ලීම් ගණන. එය 0 ලෙස සැකසීම යනුවෙන් අදහස් කරන්නේ සීමාවක් නැති බවයි.",
|
||||||
"blocking_ipv4_desc": "අවහිර කළ A ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
"blocking_ipv4_desc": "අවහිර කළ A ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
||||||
"blocking_ipv6_desc": "අවහිර කළ AAAA ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
"blocking_ipv6_desc": "අවහිර කළ AAAA ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
||||||
@@ -281,9 +278,6 @@
|
|||||||
"blocking_mode_nxdomain": "නොපවතින වසම: NXDOMAIN කේතය සමඟ ප්රතිචාර දක්වයි",
|
"blocking_mode_nxdomain": "නොපවතින වසම: NXDOMAIN කේතය සමඟ ප්රතිචාර දක්වයි",
|
||||||
"blocking_mode_null_ip": "අභිශූන්යය අ.ජා.කෙ.: ශුන්ය අ.ජා.කෙ. ලිපිනය සමඟ ප්රතිචාර දක්වයි (A සඳහා 0.0.0.0; AAAA සඳහා ::)",
|
"blocking_mode_null_ip": "අභිශූන්යය අ.ජා.කෙ.: ශුන්ය අ.ජා.කෙ. ලිපිනය සමඟ ප්රතිචාර දක්වයි (A සඳහා 0.0.0.0; AAAA සඳහා ::)",
|
||||||
"blocking_mode_custom_ip": "අභිරුචි අන්තර්ජාල කෙටුම්පත: අතින් සැකසූ අ.ජා. කෙ. ලිපිනයක් සමඟ ප්රතිචාර දක්වයි",
|
"blocking_mode_custom_ip": "අභිරුචි අන්තර්ජාල කෙටුම්පත: අතින් සැකසූ අ.ජා. කෙ. ලිපිනයක් සමඟ ප්රතිචාර දක්වයි",
|
||||||
"theme_auto": "ස්වයං",
|
|
||||||
"theme_light": "දීප්ත",
|
|
||||||
"theme_dark": "අඳුරු",
|
|
||||||
"upstream_dns_client_desc": "ඔබ මෙම ක්ෂේත්රය හිස්ව තබා ගන්නේ නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් <0>ව.නා.ප. සැකසුම්</0> හි වින්යාසගත කර ඇති සේවාදායක භාවිතා කරනු ඇත.",
|
"upstream_dns_client_desc": "ඔබ මෙම ක්ෂේත්රය හිස්ව තබා ගන්නේ නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් <0>ව.නා.ප. සැකසුම්</0> හි වින්යාසගත කර ඇති සේවාදායක භාවිතා කරනු ඇත.",
|
||||||
"tracker_source": "ලුහුබැඳීම් මූලාශ්රය",
|
"tracker_source": "ලුහුබැඳීම් මූලාශ්රය",
|
||||||
"source_label": "මූලාශ්රය",
|
"source_label": "මූලාශ්රය",
|
||||||
@@ -376,7 +370,6 @@
|
|||||||
"encryption_issuer": "නිකුත් කරන්නා",
|
"encryption_issuer": "නිකුත් කරන්නා",
|
||||||
"encryption_hostnames": "ධාරක නාම",
|
"encryption_hostnames": "ධාරක නාම",
|
||||||
"encryption_reset": "සංකේතාංකන සැකසුම් යළි පිහිටුවීමට අවශ්ය බව ඔබට විශ්වාස ද?",
|
"encryption_reset": "සංකේතාංකන සැකසුම් යළි පිහිටුවීමට අවශ්ය බව ඔබට විශ්වාස ද?",
|
||||||
"encryption_warning": "අවවාදයයි",
|
|
||||||
"topline_expiring_certificate": "ඔබගේ SSL සහතිකය කල් ඉකුත්වීමට ආසන්න වී ඇත. <0>සංකේතන සැකසුම්</0> යාවත්කාල කරන්න.",
|
"topline_expiring_certificate": "ඔබගේ SSL සහතිකය කල් ඉකුත්වීමට ආසන්න වී ඇත. <0>සංකේතන සැකසුම්</0> යාවත්කාල කරන්න.",
|
||||||
"topline_expired_certificate": "ඔබගේ SSL සහතිකය කල් ඉකුත් වී ඇත. <0>සංකේතන සැකසුම්</0> යාවත්කාල කරන්න.",
|
"topline_expired_certificate": "ඔබගේ SSL සහතිකය කල් ඉකුත් වී ඇත. <0>සංකේතන සැකසුම්</0> යාවත්කාල කරන්න.",
|
||||||
"form_error_port_range": "80-65535 පරාසය හි තොටක අගයක් ඇතුල් කරන්න",
|
"form_error_port_range": "80-65535 පරාසය හි තොටක අගයක් ඇතුල් කරන්න",
|
||||||
@@ -435,7 +428,6 @@
|
|||||||
"updates_checked": "ඇඩ්ගාර්ඩ් හෝම් හි නව අනුවාදයක් තිබේ",
|
"updates_checked": "ඇඩ්ගාර්ඩ් හෝම් හි නව අනුවාදයක් තිබේ",
|
||||||
"updates_version_equal": "ඇඩ්ගාර්ඩ් හෝම් යාවත්කාලීනයි",
|
"updates_version_equal": "ඇඩ්ගාර්ඩ් හෝම් යාවත්කාලීනයි",
|
||||||
"check_updates_now": "දැන් යාවත්කාල පරීක්ෂා කරන්න",
|
"check_updates_now": "දැන් යාවත්කාල පරීක්ෂා කරන්න",
|
||||||
"version_request_error": "යාවත්කාලීන පරීක්ෂාවට අසමත් විය. ඔබගේ අන්තර්ජාල සම්බන්ධතාවය පරීක්ෂා කරන්න.",
|
|
||||||
"dns_privacy": "ව.නා.ප. රහස්යතා",
|
"dns_privacy": "ව.නා.ප. රහස්යතා",
|
||||||
"setup_dns_privacy_1": "<0>TLS-මගින්-ව.නා.ප.</0> සඳහා <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>TLS-මගින්-ව.නා.ප.</0> සඳහා <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>HTTPS-මගින්-ව.නා.ප.</0> සඳහා <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>HTTPS-මගින්-ව.නා.ප.</0> සඳහා <1>{{address}}</1>.",
|
||||||
@@ -454,9 +446,7 @@
|
|||||||
"setup_dns_notice": "ඔබට <1>HTTPS-මගින්-ව.නා.ප.</1> හෝ <1>DNS-මගින්-ව.නා.ප.</1> භාවිතයට ඇඩ්ගාර්ඩ් හෝම් සැකසුම් තුළ <0>සංකේතනය වින්යාසගත</0> කළ යුතුය.",
|
"setup_dns_notice": "ඔබට <1>HTTPS-මගින්-ව.නා.ප.</1> හෝ <1>DNS-මගින්-ව.නා.ප.</1> භාවිතයට ඇඩ්ගාර්ඩ් හෝම් සැකසුම් තුළ <0>සංකේතනය වින්යාසගත</0> කළ යුතුය.",
|
||||||
"rewrite_added": "\"{{key}}\" සඳහා ව.නා.ප. නැවත ලිවීම සාර්ථකව එකතු කෙරිණි",
|
"rewrite_added": "\"{{key}}\" සඳහා ව.නා.ප. නැවත ලිවීම සාර්ථකව එකතු කෙරිණි",
|
||||||
"rewrite_deleted": "\"{{key}}\" සඳහා ව.නා.ප. නැවත ලිවීම ඉවත් කෙරිණි",
|
"rewrite_deleted": "\"{{key}}\" සඳහා ව.නා.ප. නැවත ලිවීම ඉවත් කෙරිණි",
|
||||||
"rewrite_updated": "ව.නා.ප. නැවත ලිවීම සාර්ථකව යාවත්කාලීන කෙරිණි",
|
"rewrite_add": "ව.නා.ප. නැවත ලිවීමක් එකතු කරන්න",
|
||||||
"rewrite_add": "ව.නා.ප. නැවත ලිවීමක් යොදන්න",
|
|
||||||
"rewrite_edit": "ව.නා.ප. නැවත ලිවීම සංස්කරණය",
|
|
||||||
"rewrite_not_found": "ව.නා.ප. නැවත ලිවීම් හමු නොවිණි",
|
"rewrite_not_found": "ව.නා.ප. නැවත ලිවීම් හමු නොවිණි",
|
||||||
"rewrite_confirm_delete": "\"{{key}}\" සඳහා ව.නා.ප. නැවත ලිවීම ඉවත් කිරීමට අවශ්ය බව ඔබට විශ්වාසද?",
|
"rewrite_confirm_delete": "\"{{key}}\" සඳහා ව.නා.ප. නැවත ලිවීම ඉවත් කිරීමට අවශ්ය බව ඔබට විශ්වාසද?",
|
||||||
"rewrite_desc": "නිශ්චිත වසම් නාමයක් සඳහා අභිරුචි ව.නා.ප. ප්රතිචාර පහසුවෙන් වින්යාසගත කිරීමට ඉඩ දෙයි.",
|
"rewrite_desc": "නිශ්චිත වසම් නාමයක් සඳහා අභිරුචි ව.නා.ප. ප්රතිචාර පහසුවෙන් වින්යාසගත කිරීමට ඉඩ දෙයි.",
|
||||||
@@ -500,10 +490,8 @@
|
|||||||
"statistics_clear": "සංඛ්යාලේඛන හිස් කරන්න",
|
"statistics_clear": "සංඛ්යාලේඛන හිස් කරන්න",
|
||||||
"statistics_clear_confirm": "සංඛ්යාලේඛන ඉවත් කිරීමට වුවමනා ද?",
|
"statistics_clear_confirm": "සංඛ්යාලේඛන ඉවත් කිරීමට වුවමනා ද?",
|
||||||
"statistics_retention_confirm": "සංඛ්යාලේඛන රඳවා තබා ගැනීම වෙනස් කිරීමට අවශ්ය බව ඔබට විශ්වාසද? ඔබ කාල පරතරයෙහි අගය අඩු කළහොත් සමහර දත්ත නැති වී යනු ඇත",
|
"statistics_retention_confirm": "සංඛ්යාලේඛන රඳවා තබා ගැනීම වෙනස් කිරීමට අවශ්ය බව ඔබට විශ්වාසද? ඔබ කාල පරතරයෙහි අගය අඩු කළහොත් සමහර දත්ත නැති වී යනු ඇත",
|
||||||
"statistics_cleared": "සංඛ්යාලේඛන සාර්ථකව හිස් කෙරිණි",
|
"statistics_cleared": "සංඛ්යාලේඛන සාර්ථකව ඉවත් කෙරිණි",
|
||||||
"statistics_enable": "සංඛ්යාලේඛන සබල කරන්න",
|
"statistics_enable": "සංඛ්යාලේඛන සබල කරන්න",
|
||||||
"ignore_domains": "නොසලකන වසම් (පේළියකට එක බැගින්)",
|
|
||||||
"ignore_domains_title": "නොසලකන වසම්",
|
|
||||||
"interval_hours": "පැය {{count}}",
|
"interval_hours": "පැය {{count}}",
|
||||||
"interval_hours_plural": "පැය {{count}}",
|
"interval_hours_plural": "පැය {{count}}",
|
||||||
"filters_configuration": "පෙරහන් වින්යාසය",
|
"filters_configuration": "පෙරහන් වින්යාසය",
|
||||||
@@ -613,34 +601,5 @@
|
|||||||
"parental_control": "දෙමාපිය පාලනය",
|
"parental_control": "දෙමාපිය පාලනය",
|
||||||
"safe_browsing": "ආරක්ෂිත පිරික්සුම",
|
"safe_browsing": "ආරක්ෂිත පිරික්සුම",
|
||||||
"served_from_cache": "{{value}} <i>(නිහිතයෙන් ගැනිණි)</i>",
|
"served_from_cache": "{{value}} <i>(නිහිතයෙන් ගැනිණි)</i>",
|
||||||
"form_error_password_length": "මුරපදය අවම වශයෙන් අකුරු {{value}} ක් දිගු විය යුතුමයි",
|
"form_error_password_length": "මුරපදය අවම වශයෙන් අකුරු {{value}} ක් දිගු විය යුතුමයි"
|
||||||
"anonymizer_notification": "<0>සටහන:</0> අ.ජා.කෙ. නිර්නාමිකකරණය සබලයි. ඔබට එය <1>පොදු සැකසුම්</1> හරහා අබල කිරීමට හැකිය .",
|
|
||||||
"confirm_dns_cache_clear": "ඔබට ව.නා.ප. නිහිතය හිස් කිරීමට වුවමනාද?",
|
|
||||||
"cache_cleared": "ව.නා.ප. නිහිතය හිස් කෙරිණි",
|
|
||||||
"clear_cache": "නිහිතය මකන්න",
|
|
||||||
"make_static": "ස්ථිතික කරන්න",
|
|
||||||
"theme_auto_desc": "ස්වයං (උපාංගයේ වර්ණ පරිපාටිය මත පදනම්ව)",
|
|
||||||
"theme_dark_desc": "අඳුරු තේමාව",
|
|
||||||
"theme_light_desc": "දීප්ත තේමාව",
|
|
||||||
"disable_for_seconds": "තත්පර {{count}} ක්",
|
|
||||||
"disable_for_seconds_plural": "තත්පර {{count}} ක්",
|
|
||||||
"disable_for_minutes": "විනාඩි {{count}} ක්",
|
|
||||||
"disable_for_minutes_plural": "විනාඩි {{count}} ක්",
|
|
||||||
"disable_for_hours": "පැය {{count}} ක්",
|
|
||||||
"disable_for_hours_plural": "පැය {{count}} ක්",
|
|
||||||
"disable_until_tomorrow": "හෙට වනතුරු",
|
|
||||||
"disable_notify_for_seconds": "තත්. {{count}} කට රැකවරණය අබල කරන්න",
|
|
||||||
"disable_notify_for_seconds_plural": "තත්. {{count}} කට රැකවරණය අබල කරන්න",
|
|
||||||
"disable_notify_for_minutes": "විනාඩි {{count}} කට රැකවරණය අබල කරන්න",
|
|
||||||
"disable_notify_for_minutes_plural": "විනාඩි {{count}} කට රැකවරණය අබල කරන්න",
|
|
||||||
"disable_notify_for_hours": "පැය {{count}} කට රැකවරණය අබල කරන්න",
|
|
||||||
"disable_notify_for_hours_plural": "පැය {{count}} කට රැකවරණය අබල කරන්න",
|
|
||||||
"disable_notify_until_tomorrow": "හෙට වනතුරු රැකවරණය අබල කරන්න",
|
|
||||||
"enable_protection_timer": "{{time}} න් රැකවරණය සබල කෙරේ",
|
|
||||||
"custom_retention_input": "රඳවා ගැනීම පැය වලින්",
|
|
||||||
"custom_rotation_input": "රඳවා ගැනීම පැය වලින්",
|
|
||||||
"protection_section_label": "රැකවරණය",
|
|
||||||
"log_and_stats_section_label": "විමසුම් සටහන හා සංඛ්යාලේඛන",
|
|
||||||
"ignore_query_log": "සටහනෙහි අනුග්රාහකය නොසලකන්න",
|
|
||||||
"ignore_statistics": "සංඛ්යාලේඛනයට අනුග්රාහකය නොසලකන්න"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Najčastejší klienti",
|
"top_clients": "Najčastejší klienti",
|
||||||
"no_clients_found": "Neboli nájdení žiadni klienti",
|
"no_clients_found": "Neboli nájdení žiadni klienti",
|
||||||
"general_statistics": "Všeobecná štatistika",
|
"general_statistics": "Všeobecná štatistika",
|
||||||
"top_upstreams": "Často požadované upstream servery",
|
|
||||||
"no_upstreams_data_found": "Nenašli sa žiadne údaje o upstream serveroch",
|
|
||||||
"number_of_dns_query_days": "Počet DNS dopytov spracovaných za posledný {{count}} deň",
|
"number_of_dns_query_days": "Počet DNS dopytov spracovaných za posledný {{count}} deň",
|
||||||
"number_of_dns_query_days_plural": "Počet DNS dopytov spracovaných za posledných {{count}} dní",
|
"number_of_dns_query_days_plural": "Počet DNS dopytov spracovaných za posledných {{count}} dní",
|
||||||
"number_of_dns_query_24_hours": "Počet DNS dopytov spracovaných za posledných 24 hodín",
|
"number_of_dns_query_24_hours": "Počet DNS dopytov spracovaných za posledných 24 hodín",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Konfigurované v {{path}}",
|
"upstream_dns_configured_in_file": "Konfigurované v {{path}}",
|
||||||
"test_upstream_btn": "Test upstreamov",
|
"test_upstream_btn": "Test upstreamov",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream server",
|
|
||||||
"apply_btn": "Použiť",
|
"apply_btn": "Použiť",
|
||||||
"disabled_filtering_toast": "Vypnutá filtrácia",
|
"disabled_filtering_toast": "Vypnutá filtrácia",
|
||||||
"enabled_filtering_toast": "Zapnutá filtrácia",
|
"enabled_filtering_toast": "Zapnutá filtrácia",
|
||||||
@@ -260,12 +257,12 @@
|
|||||||
"query_log_cleared": "Denník dopytov bol úspešne vymazaný",
|
"query_log_cleared": "Denník dopytov bol úspešne vymazaný",
|
||||||
"query_log_updated": "Denník dopytov bol úspešne aktualizovaný",
|
"query_log_updated": "Denník dopytov bol úspešne aktualizovaný",
|
||||||
"query_log_clear": "Vymazať denníky dopytov",
|
"query_log_clear": "Vymazať denníky dopytov",
|
||||||
"query_log_retention": "Rotácia denníkov dopytov",
|
"query_log_retention": "Obdobie záznamu denníka dopytov",
|
||||||
"query_log_enable": "Zapnúť denník",
|
"query_log_enable": "Zapnúť denník",
|
||||||
"query_log_configuration": "Konfigurácia denníka",
|
"query_log_configuration": "Konfigurácia denníka",
|
||||||
"query_log_disabled": "Protokol dopytov je vypnutý a možno ho nakonfigurovať v <0>nastaveniach</0>",
|
"query_log_disabled": "Protokol dopytov je vypnutý a možno ho nakonfigurovať v <0>nastaveniach</0>",
|
||||||
"query_log_strict_search": "Na prísne vyhľadávanie použite dvojité úvodzovky",
|
"query_log_strict_search": "Na prísne vyhľadávanie použite dvojité úvodzovky",
|
||||||
"query_log_retention_confirm": "Naozaj chcete zmeniť rotáciu denníka dopytov? Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
|
"query_log_retention_confirm": "Naozaj chcete zmeniť uchovávanie denníku dopytov? Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
|
||||||
"anonymize_client_ip": "Anonymizujte IP klienta",
|
"anonymize_client_ip": "Anonymizujte IP klienta",
|
||||||
"anonymize_client_ip_desc": "Neukladať úplnú IP adresu klienta do protokolov a štatistík",
|
"anonymize_client_ip_desc": "Neukladať úplnú IP adresu klienta do protokolov a štatistík",
|
||||||
"dns_config": "Konfigurácia DNS servera",
|
"dns_config": "Konfigurácia DNS servera",
|
||||||
@@ -390,7 +387,7 @@
|
|||||||
"encryption_key": "Súkromný kľúč",
|
"encryption_key": "Súkromný kľúč",
|
||||||
"encryption_key_input": "Skopírujte a prilepte sem svoj súkromný kľúč vo formáte PEM pre Váš certifikát.",
|
"encryption_key_input": "Skopírujte a prilepte sem svoj súkromný kľúč vo formáte PEM pre Váš certifikát.",
|
||||||
"encryption_enable": "Zapnite šifrovanie (HTTPS, DNS-cez-HTTPS a DNS-cez-TLS)",
|
"encryption_enable": "Zapnite šifrovanie (HTTPS, DNS-cez-HTTPS a DNS-cez-TLS)",
|
||||||
"encryption_enable_desc": "Ak je šifrovanie zapnuté, AdGuard Home administrátorské rozhranie bude pracovať cez HTTPS a DNS server bude počúvať dopyty cez DNS-cez-HTTPS a DNS-cez-TLS.",
|
"encryption_enable_desc": "Ak je šifrovanie zapnuté, AdGuard Home administrátorské rozhranie bude pracovať cez HTTPS a DNS server bude počúvať požiadavky cez DNS-cez-HTTPS a DNS-cez-TLS.",
|
||||||
"encryption_chain_valid": "Certifikačný reťazec je platný",
|
"encryption_chain_valid": "Certifikačný reťazec je platný",
|
||||||
"encryption_chain_invalid": "Certifikačný reťazec je neplatný",
|
"encryption_chain_invalid": "Certifikačný reťazec je neplatný",
|
||||||
"encryption_key_valid": "Toto je platný {{type}} súkromný kľúč",
|
"encryption_key_valid": "Toto je platný {{type}} súkromný kľúč",
|
||||||
@@ -447,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Naozaj chcete vymazať \"{{key}}\" klienta?",
|
"client_confirm_delete": "Naozaj chcete vymazať \"{{key}}\" klienta?",
|
||||||
"list_confirm_delete": "Naozaj chcete vymazať tento zoznam?",
|
"list_confirm_delete": "Naozaj chcete vymazať tento zoznam?",
|
||||||
"auto_clients_title": "Runtime klienti",
|
"auto_clients_title": "Runtime klienti",
|
||||||
"auto_clients_desc": "Informácie o IP adresách zariadení, ktoré používajú alebo môžu používať AdGuard Home. Tieto informácie sa získavajú z viacerých zdrojov vrátane súborov hosts, reverzného DNS atď.",
|
"auto_clients_desc": "Zariadenia, ktoré nie sú na zozname trvalých klientov, ktorí môžu stále používať AdGuard Home",
|
||||||
"access_title": "Nastavenia prístupu",
|
"access_title": "Nastavenia prístupu",
|
||||||
"access_desc": "Tu môžete konfigurovať pravidlá prístupu pre server DNS AdGuard Home.",
|
"access_desc": "Tu môžete konfigurovať pravidlá prístupu pre server DNS AdGuard Home.",
|
||||||
"access_allowed_title": "Povolení klienti",
|
"access_allowed_title": "Povolení klienti",
|
||||||
@@ -481,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Pre použitie <1>DNS-over-HTTPS</1> alebo <1>DNS-over-TLS</1>, potrebujete v nastaveniach AdGuard Home <0>nakonfigurovať šifrovanie</0>.",
|
"setup_dns_notice": "Pre použitie <1>DNS-over-HTTPS</1> alebo <1>DNS-over-TLS</1>, potrebujete v nastaveniach AdGuard Home <0>nakonfigurovať šifrovanie</0>.",
|
||||||
"rewrite_added": "DNS prepísanie pre \"{{key}}\" bolo úspešne pridané",
|
"rewrite_added": "DNS prepísanie pre \"{{key}}\" bolo úspešne pridané",
|
||||||
"rewrite_deleted": "DNS prepísanie pre \"{{key}}\" bolo úspešne vymazané",
|
"rewrite_deleted": "DNS prepísanie pre \"{{key}}\" bolo úspešne vymazané",
|
||||||
"rewrite_updated": "Prepísanie DNS bolo úspešne aktualizované",
|
|
||||||
"rewrite_add": "Pridať DNS prepísanie",
|
"rewrite_add": "Pridať DNS prepísanie",
|
||||||
"rewrite_edit": "Upraviť prepísanie DNS",
|
|
||||||
"rewrite_not_found": "Neboli nájdené žiadne DNS prepísania",
|
"rewrite_not_found": "Neboli nájdené žiadne DNS prepísania",
|
||||||
"rewrite_confirm_delete": "Naozaj chcete odstrániť prepísanie DNS pre \"{{key}}\"?",
|
"rewrite_confirm_delete": "Naozaj chcete odstrániť prepísanie DNS pre \"{{key}}\"?",
|
||||||
"rewrite_desc": "Umožňuje ľahko nakonfigurovať vlastnú odpoveď DNS pre konkrétne meno domény.",
|
"rewrite_desc": "Umožňuje ľahko nakonfigurovať vlastnú odpoveď DNS pre konkrétne meno domény.",
|
||||||
@@ -500,7 +495,7 @@
|
|||||||
"blocked_services": "Blokované služby",
|
"blocked_services": "Blokované služby",
|
||||||
"blocked_services_desc": "Umožňuje rýchlo blokovať populárne stránky a služby.",
|
"blocked_services_desc": "Umožňuje rýchlo blokovať populárne stránky a služby.",
|
||||||
"blocked_services_saved": "Blokované služby boli úspešne uložené",
|
"blocked_services_saved": "Blokované služby boli úspešne uložené",
|
||||||
"blocked_services_global": "Použiť globálne blokované služby",
|
"blocked_services_global": "Použite globálne blokované služby",
|
||||||
"blocked_service": "Blokované služby",
|
"blocked_service": "Blokované služby",
|
||||||
"block_all": "Blokovať všetko",
|
"block_all": "Blokovať všetko",
|
||||||
"unblock_all": "Odblokovať všetko",
|
"unblock_all": "Odblokovať všetko",
|
||||||
@@ -557,7 +552,7 @@
|
|||||||
"whois": "WHOIS",
|
"whois": "WHOIS",
|
||||||
"filtering_rules_learn_more": "<0>Dozvedieť sa viac</0> o tvorbe vlastných zoznamov hostiteľov.",
|
"filtering_rules_learn_more": "<0>Dozvedieť sa viac</0> o tvorbe vlastných zoznamov hostiteľov.",
|
||||||
"blocked_by_response": "Blokované pomocou CNAME alebo IP v odpovedi",
|
"blocked_by_response": "Blokované pomocou CNAME alebo IP v odpovedi",
|
||||||
"blocked_by_cname_or_ip": "Blokované pomocou CNAME alebo IP",
|
"blocked_by_cname_or_ip": "Zablokované na základe CNAME alebo IP",
|
||||||
"try_again": "Skúste znova",
|
"try_again": "Skúste znova",
|
||||||
"domain_desc": "Zadajte meno domény alebo zástupný znak, ktorý chcete prepísať.",
|
"domain_desc": "Zadajte meno domény alebo zástupný znak, ktorý chcete prepísať.",
|
||||||
"example_rewrite_domain": "prepísať odpovede iba pre toto meno domény.",
|
"example_rewrite_domain": "prepísať odpovede iba pre toto meno domény.",
|
||||||
@@ -574,7 +569,7 @@
|
|||||||
"autofix_warning_list": "Bude vykonávať tieto úlohy: <0>Deaktivovať systém DNSStubListener</0> <0>Nastaviť adresu servera DNS na 127.0.0.1</0> <0>Nahradiť cieľový symbolický odkaz /etc/resolv.conf na /run/systemd/resolve/resolv.conf</0> <0>Zastaviť službu DNSStubListener (znova načítať službu systemd-resolved)</0>",
|
"autofix_warning_list": "Bude vykonávať tieto úlohy: <0>Deaktivovať systém DNSStubListener</0> <0>Nastaviť adresu servera DNS na 127.0.0.1</0> <0>Nahradiť cieľový symbolický odkaz /etc/resolv.conf na /run/systemd/resolve/resolv.conf</0> <0>Zastaviť službu DNSStubListener (znova načítať službu systemd-resolved)</0>",
|
||||||
"autofix_warning_result": "Výsledkom bude, že všetky DNS dopyty z Vášho systému budú štandardne spracované službou AdGuard Home.",
|
"autofix_warning_result": "Výsledkom bude, že všetky DNS dopyty z Vášho systému budú štandardne spracované službou AdGuard Home.",
|
||||||
"tags_title": "Tagy",
|
"tags_title": "Tagy",
|
||||||
"tags_desc": "Môžete vybrať značky, ktoré zodpovedajú klientovi. Zahrňte značky do pravidiel filtrácie, aby ste ich použili presnejšie. <0>Viac informácií</0>.",
|
"tags_desc": "Môžete vybrať značky, ktoré zodpovedajú klientovi. Zahrňte značky do pravidiel filtrovania, aby ste ich použili presnejšie. <0>Viac informácií</0>.",
|
||||||
"form_select_tags": "Zvoľte tagy klienta",
|
"form_select_tags": "Zvoľte tagy klienta",
|
||||||
"check_title": "Skontrolujte filtráciu",
|
"check_title": "Skontrolujte filtráciu",
|
||||||
"check_desc": "Skontrolujte, či je názov hostiteľa filtrovaný.",
|
"check_desc": "Skontrolujte, či je názov hostiteľa filtrovaný.",
|
||||||
@@ -611,7 +606,7 @@
|
|||||||
"show_whitelisted_responses": "Obsiahnuté v bielej listine",
|
"show_whitelisted_responses": "Obsiahnuté v bielej listine",
|
||||||
"show_processed_responses": "Spracované",
|
"show_processed_responses": "Spracované",
|
||||||
"blocked_safebrowsing": "Zablokované modulom Bezpečné prehliadanie",
|
"blocked_safebrowsing": "Zablokované modulom Bezpečné prehliadanie",
|
||||||
"blocked_adult_websites": "Zablokované Rodičovskou kontrolou",
|
"blocked_adult_websites": "Zablokovaná stránka pre dospelých",
|
||||||
"blocked_threats": "Zablokované hrozby",
|
"blocked_threats": "Zablokované hrozby",
|
||||||
"allowed": "Povolené",
|
"allowed": "Povolené",
|
||||||
"filtered": "Filtrované",
|
"filtered": "Filtrované",
|
||||||
@@ -673,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Vypnite ochranu na {{count}} hodinu",
|
"disable_notify_for_hours": "Vypnite ochranu na {{count}} hodinu",
|
||||||
"disable_notify_for_hours_plural": "Vypnite ochranu na {{count}} hodín",
|
"disable_notify_for_hours_plural": "Vypnite ochranu na {{count}} hodín",
|
||||||
"disable_notify_until_tomorrow": "Vypnúť ochranu do zajtra",
|
"disable_notify_until_tomorrow": "Vypnúť ochranu do zajtra",
|
||||||
"enable_protection_timer": "Ochrana bude zapnutá o {{time}}",
|
"enable_protection_timer": "Ochrana bude zapnutá o {{time}}"
|
||||||
"custom_retention_input": "Zadajte retenciu v hodinách",
|
|
||||||
"custom_rotation_input": "Zadajte rotáciu v hodinách",
|
|
||||||
"protection_section_label": "Ochrana",
|
|
||||||
"log_and_stats_section_label": "Protokol dopytov a štatistiky",
|
|
||||||
"ignore_query_log": "Ignorovať tohto klienta v denníku dopytov",
|
|
||||||
"ignore_statistics": "Ignorovanie tohto klienta v štatistikách"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Najpogostejši odjemalci",
|
"top_clients": "Najpogostejši odjemalci",
|
||||||
"no_clients_found": "Ni najdenih odjemalcev",
|
"no_clients_found": "Ni najdenih odjemalcev",
|
||||||
"general_statistics": "Splošna statistika",
|
"general_statistics": "Splošna statistika",
|
||||||
"top_upstreams": "Pogosto zahtevani gorvodni strežniki",
|
|
||||||
"no_upstreams_data_found": "Ni podatkov o gorvodnih strežnikih",
|
|
||||||
"number_of_dns_query_days": "Število obdelanih poizvedb DNS v zadnjem {{count}} dnevu",
|
"number_of_dns_query_days": "Število obdelanih poizvedb DNS v zadnjem {{count}} dnevu",
|
||||||
"number_of_dns_query_days_plural": "Število obdelanih poizvedb DNS v zadnjih {{count}} dneh",
|
"number_of_dns_query_days_plural": "Število obdelanih poizvedb DNS v zadnjih {{count}} dneh",
|
||||||
"number_of_dns_query_24_hours": "Število obdelanih poizvedb DNS v zadnjih 24 urah",
|
"number_of_dns_query_24_hours": "Število obdelanih poizvedb DNS v zadnjih 24 urah",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Prisilno varno iskanje",
|
"enforced_save_search": "Prisilno varno iskanje",
|
||||||
"number_of_dns_query_to_safe_search": "Število zahtev DNS za iskalnike, za katere je bilo uveljavljeno varno iskanje",
|
"number_of_dns_query_to_safe_search": "Število zahtev DNS za iskalnike, za katere je bilo uveljavljeno varno iskanje",
|
||||||
"average_processing_time": "Povprečni čas obdelave",
|
"average_processing_time": "Povprečni čas obdelave",
|
||||||
"processing_time": "Čas obdelave",
|
|
||||||
"average_processing_time_hint": "Povprečni čas v milisekundah pri obdelavi zahteve DNS",
|
"average_processing_time_hint": "Povprečni čas v milisekundah pri obdelavi zahteve DNS",
|
||||||
"block_domain_use_filters_and_hosts": "Onemogoči domene s filtri in gostiteljskimi datotekami",
|
"block_domain_use_filters_and_hosts": "Onemogoči domene s filtri in gostiteljskimi datotekami",
|
||||||
"filters_block_toggle_hint": "Pravila zaviranja lahko nastavite v nastavitvah <a>Filtri</a>.",
|
"filters_block_toggle_hint": "Pravila zaviranja lahko nastavite v nastavitvah <a>Filtri</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Nastavljen v {{path}}",
|
"upstream_dns_configured_in_file": "Nastavljen v {{path}}",
|
||||||
"test_upstream_btn": "Preizkusi upstreame",
|
"test_upstream_btn": "Preizkusi upstreame",
|
||||||
"upstreams": "Tokovi navzgor",
|
"upstreams": "Tokovi navzgor",
|
||||||
"upstream": "Gorvodni strežnik",
|
|
||||||
"apply_btn": "Uporabi",
|
"apply_btn": "Uporabi",
|
||||||
"disabled_filtering_toast": "Onemogočeno filtriranje",
|
"disabled_filtering_toast": "Onemogočeno filtriranje",
|
||||||
"enabled_filtering_toast": "Omogočeno filtriranje",
|
"enabled_filtering_toast": "Omogočeno filtriranje",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Dnevnik poizvedb je uspešno izbrisan",
|
"query_log_cleared": "Dnevnik poizvedb je uspešno izbrisan",
|
||||||
"query_log_updated": "Dnevnik poizvedb je bil uspešno posodobljen",
|
"query_log_updated": "Dnevnik poizvedb je bil uspešno posodobljen",
|
||||||
"query_log_clear": "Počisti dnevnike poizvedb",
|
"query_log_clear": "Počisti dnevnike poizvedb",
|
||||||
"query_log_retention": "Rotacija dnevnikov poizvedb",
|
"query_log_retention": "Zadrževanje dnevnikov poizvedb",
|
||||||
"query_log_enable": "Omogoči dnevni",
|
"query_log_enable": "Omogoči dnevni",
|
||||||
"query_log_configuration": "Konfiguracija dnevnikov",
|
"query_log_configuration": "Konfiguracija dnevnikov",
|
||||||
"query_log_disabled": "Dnevnik poizvedb je onemogočen in ga je mogoče konfigurirati v <0>nastavitvah</0>",
|
"query_log_disabled": "Dnevnik poizvedb je onemogočen in ga je mogoče konfigurirati v <0>nastavitvah</0>",
|
||||||
"query_log_strict_search": "Za strogo iskanje uporabite dvojne narekovaje",
|
"query_log_strict_search": "Za strogo iskanje uporabite dvojne narekovaje",
|
||||||
"query_log_retention_confirm": "Ali ste prepričani, da želite spremeniti rotacijo dnevnika poizvedb? Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
|
"query_log_retention_confirm": "Ali ste prepričani, da želite spremeniti zadrževanje dnevnika poizvedb? Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
|
||||||
"anonymize_client_ip": "Anonimiziraj odjemalca IP",
|
"anonymize_client_ip": "Anonimiziraj odjemalca IP",
|
||||||
"anonymize_client_ip_desc": "Ne shrani celotnega naslova IP odjemalca v dnevnikih ali statistiki",
|
"anonymize_client_ip_desc": "Ne shrani celotnega naslova IP odjemalca v dnevnikih ali statistiki",
|
||||||
"dns_config": "Konfiguracija strežnika DNS",
|
"dns_config": "Konfiguracija strežnika DNS",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "Ali ste prepričani, da želite izbrisati odjemalca \"{{key}}\"?",
|
"client_confirm_delete": "Ali ste prepričani, da želite izbrisati odjemalca \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Ali ste prepričani, da želite izbrisati ta seznam?",
|
"list_confirm_delete": "Ali ste prepričani, da želite izbrisati ta seznam?",
|
||||||
"auto_clients_title": "Odjemalci izvajanja",
|
"auto_clients_title": "Odjemalci izvajanja",
|
||||||
"auto_clients_desc": "Informacije o naslovih IP naprav, ki uporabljajo ali bi lahko uporabljale AdGuard Home. Te informacije so zbrane iz več virov, vključno z datotekami gostiteljev, povratnim DNS-jem itd.",
|
"auto_clients_desc": "Naprave, ki niso na seznamu trajnih odjemalcev, ki morda še vedno uporabljajo AdGuard Home",
|
||||||
"access_title": "Nastavitve dostopa",
|
"access_title": "Nastavitve dostopa",
|
||||||
"access_desc": "Tukaj lahko nastavite pravila dostopa strežnika DNS AdGuard Home",
|
"access_desc": "Tukaj lahko nastavite pravila dostopa strežnika DNS AdGuard Home",
|
||||||
"access_allowed_title": "Dovoljeni odjemalci",
|
"access_allowed_title": "Dovoljeni odjemalci",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "Za uporabo <1>DNS-prek-HTTPS</1> ali <1>DNS-prek-TLS</1>, morate <0>konfigurirati šifriranje</0> v nastavitvah AdGuard Home.",
|
"setup_dns_notice": "Za uporabo <1>DNS-prek-HTTPS</1> ali <1>DNS-prek-TLS</1>, morate <0>konfigurirati šifriranje</0> v nastavitvah AdGuard Home.",
|
||||||
"rewrite_added": "Uspešno je dodano DNS prepisovanje za \"{{key}}\"",
|
"rewrite_added": "Uspešno je dodano DNS prepisovanje za \"{{key}}\"",
|
||||||
"rewrite_deleted": "Uspešno je izbrisano DNS prepisovanje za \"{{key}}\"",
|
"rewrite_deleted": "Uspešno je izbrisano DNS prepisovanje za \"{{key}}\"",
|
||||||
"rewrite_updated": "DNS prepisovanje uspešno posodobljen",
|
|
||||||
"rewrite_add": "Dodaj prepisovanje DNS",
|
"rewrite_add": "Dodaj prepisovanje DNS",
|
||||||
"rewrite_edit": "Urejanje prepisa DNS",
|
|
||||||
"rewrite_not_found": "Ni bilo najdenih prepisovanj DNS",
|
"rewrite_not_found": "Ni bilo najdenih prepisovanj DNS",
|
||||||
"rewrite_confirm_delete": "Ali ste prepričani, da želite izbrisati prepisovanje DNS za \"{{key}}\"?",
|
"rewrite_confirm_delete": "Ali ste prepričani, da želite izbrisati prepisovanje DNS za \"{{key}}\"?",
|
||||||
"rewrite_desc": "Omogoča enostavno konfiguriranje odgovora DNS po meri za določeno ime domene.",
|
"rewrite_desc": "Omogoča enostavno konfiguriranje odgovora DNS po meri za določeno ime domene.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Onemogoči zaščito za {{count}} uro",
|
"disable_notify_for_hours": "Onemogoči zaščito za {{count}} uro",
|
||||||
"disable_notify_for_hours_plural": "Onemogoči zaščito za {{count}} ur",
|
"disable_notify_for_hours_plural": "Onemogoči zaščito za {{count}} ur",
|
||||||
"disable_notify_until_tomorrow": "Onemogoči zaščito do jutri",
|
"disable_notify_until_tomorrow": "Onemogoči zaščito do jutri",
|
||||||
"enable_protection_timer": "Zaščita bo omogočena ob {{time}}",
|
"enable_protection_timer": "Zaščita bo omogočena ob {{time}}"
|
||||||
"custom_retention_input": "Vnesite zadrževanje v urah",
|
|
||||||
"custom_rotation_input": "Vnesite rotacijo v urah",
|
|
||||||
"protection_section_label": "Zaščita",
|
|
||||||
"log_and_stats_section_label": "Dnevnik poizvedb in statistika",
|
|
||||||
"ignore_query_log": "Ignorirajte tega odjemalca v dnevniku poizvedb",
|
|
||||||
"ignore_statistics": "Ignoriranje tega odjemalca v statistiki"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Najčešći klijenti",
|
"top_clients": "Najčešći klijenti",
|
||||||
"no_clients_found": "Nema pronađenih klijenata",
|
"no_clients_found": "Nema pronađenih klijenata",
|
||||||
"general_statistics": "Opšte statistike",
|
"general_statistics": "Opšte statistike",
|
||||||
"top_upstreams": "Često traženi upstream serveri",
|
|
||||||
"no_upstreams_data_found": "Nema podataka o upstream serverima",
|
|
||||||
"number_of_dns_query_days": "Broj obrađenih DNS unosa u poslednjih {{count}} dan",
|
"number_of_dns_query_days": "Broj obrađenih DNS unosa u poslednjih {{count}} dan",
|
||||||
"number_of_dns_query_days_plural": "Broj obrađenih DNS unosa u poslednjih {{count}} dana",
|
"number_of_dns_query_days_plural": "Broj obrađenih DNS unosa u poslednjih {{count}} dana",
|
||||||
"number_of_dns_query_24_hours": "Broj obrađenih DNS unosa u poslednja 24 časa",
|
"number_of_dns_query_24_hours": "Broj obrađenih DNS unosa u poslednja 24 časa",
|
||||||
@@ -160,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Konfiguriši u {{path}}",
|
"upstream_dns_configured_in_file": "Konfiguriši u {{path}}",
|
||||||
"test_upstream_btn": "Testiraj upstreams",
|
"test_upstream_btn": "Testiraj upstreams",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream-server",
|
|
||||||
"apply_btn": "Primeni",
|
"apply_btn": "Primeni",
|
||||||
"disabled_filtering_toast": "Isključeno filtriranje",
|
"disabled_filtering_toast": "Isključeno filtriranje",
|
||||||
"enabled_filtering_toast": "Uključeno filtriranje",
|
"enabled_filtering_toast": "Uključeno filtriranje",
|
||||||
@@ -170,7 +167,6 @@
|
|||||||
"enabled_parental_toast": "Uključena roditeljska kontrola",
|
"enabled_parental_toast": "Uključena roditeljska kontrola",
|
||||||
"disabled_safe_search_toast": "Isključena sigurna pretraga",
|
"disabled_safe_search_toast": "Isključena sigurna pretraga",
|
||||||
"enabled_save_search_toast": "Uključeno sigurno pretraživanje",
|
"enabled_save_search_toast": "Uključeno sigurno pretraživanje",
|
||||||
"updated_save_search_toast": "Ažurirane postavke bezbedne pretrage",
|
|
||||||
"enabled_table_header": "Uključeno",
|
"enabled_table_header": "Uključeno",
|
||||||
"name_table_header": "Ime",
|
"name_table_header": "Ime",
|
||||||
"list_url_table_header": "URL do liste",
|
"list_url_table_header": "URL do liste",
|
||||||
@@ -260,12 +256,12 @@
|
|||||||
"query_log_cleared": "Dnevnik unosa je uspešno očišćen",
|
"query_log_cleared": "Dnevnik unosa je uspešno očišćen",
|
||||||
"query_log_updated": "Dnevnik zapisa je uspešno ažuriran",
|
"query_log_updated": "Dnevnik zapisa je uspešno ažuriran",
|
||||||
"query_log_clear": "Očisti dnevnike unosa",
|
"query_log_clear": "Očisti dnevnike unosa",
|
||||||
"query_log_retention": "Rotacija evidencija upita",
|
"query_log_retention": "Zadržavanje dnevnika unosa",
|
||||||
"query_log_enable": "Uključi dnevnik",
|
"query_log_enable": "Uključi dnevnik",
|
||||||
"query_log_configuration": "Konfiguracija dnevnika",
|
"query_log_configuration": "Konfiguracija dnevnika",
|
||||||
"query_log_disabled": "Dnevnik unosa je isključen ali se može konfigurisati u <0>postavkama</0>",
|
"query_log_disabled": "Dnevnik unosa je isključen ali se može konfigurisati u <0>postavkama</0>",
|
||||||
"query_log_strict_search": "Koristi duple navodnike za striktnu pretragu",
|
"query_log_strict_search": "Koristi duple navodnike za striktnu pretragu",
|
||||||
"query_log_retention_confirm": "Želite li zaista da promenite rotaciju evidencije upita? Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
|
"query_log_retention_confirm": "Jeste li sigurni da želite da promenite zadržavanje dnevnika unosa? Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
|
||||||
"anonymize_client_ip": "Anonimizuj IP klijenta",
|
"anonymize_client_ip": "Anonimizuj IP klijenta",
|
||||||
"anonymize_client_ip_desc": "Ne čuvaj punu IP adresu klijenta u dnevnicima i statistikama",
|
"anonymize_client_ip_desc": "Ne čuvaj punu IP adresu klijenta u dnevnicima i statistikama",
|
||||||
"dns_config": "Konfiguracija DNS servera",
|
"dns_config": "Konfiguracija DNS servera",
|
||||||
@@ -294,8 +290,6 @@
|
|||||||
"rate_limit": "Ograničenje brzine",
|
"rate_limit": "Ograničenje brzine",
|
||||||
"edns_enable": "Uključi EDNS Client Subnet",
|
"edns_enable": "Uključi EDNS Client Subnet",
|
||||||
"edns_cs_desc": "Dodajte opciju podmreži EDNS klijenta (ECS) uzvodnim zahtevima i evidentirajte vrednosti koje klijenti šalju u evidenciji upita.",
|
"edns_cs_desc": "Dodajte opciju podmreži EDNS klijenta (ECS) uzvodnim zahtevima i evidentirajte vrednosti koje klijenti šalju u evidenciji upita.",
|
||||||
"edns_use_custom_ip": "Koristi prilagođeni IP za EDNS",
|
|
||||||
"edns_use_custom_ip_desc": "Dozvoli korišćenje prilagođenog IP-a za EDNS",
|
|
||||||
"rate_limit_desc": "Broj zahteva u sekundi dozvoljen po klijentu. Postavljanje na 0 znači da nema ograničenja.",
|
"rate_limit_desc": "Broj zahteva u sekundi dozvoljen po klijentu. Postavljanje na 0 znači da nema ograničenja.",
|
||||||
"blocking_ipv4_desc": "IP adresa koja će biti vraćena za blokirane zahteve",
|
"blocking_ipv4_desc": "IP adresa koja će biti vraćena za blokirane zahteve",
|
||||||
"blocking_ipv6_desc": "IP adresa koja će biti vraćena za blokirane AAAA zahteve",
|
"blocking_ipv6_desc": "IP adresa koja će biti vraćena za blokirane AAAA zahteve",
|
||||||
@@ -447,7 +441,7 @@
|
|||||||
"client_confirm_delete": "Jeste li sigurni da želite da izbrišete klijenta \"{{key}}\"?",
|
"client_confirm_delete": "Jeste li sigurni da želite da izbrišete klijenta \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Jeste li sigurni da želite da izbrišete ovu listu?",
|
"list_confirm_delete": "Jeste li sigurni da želite da izbrišete ovu listu?",
|
||||||
"auto_clients_title": "Klijenti (runtime)",
|
"auto_clients_title": "Klijenti (runtime)",
|
||||||
"auto_clients_desc": "Podaci o klijentima koji koriste AdGuard Home, ali nisu sačuvani u konfiguraciji",
|
"auto_clients_desc": "Uređaji koji nisu na listi upornih klijenata koji i dalje mogu da koriste AdGuard Home",
|
||||||
"access_title": "Postavke pristupa",
|
"access_title": "Postavke pristupa",
|
||||||
"access_desc": "Ovde možete konfigurisati pravila pristupa za AdGuard Home DNS server",
|
"access_desc": "Ovde možete konfigurisati pravila pristupa za AdGuard Home DNS server",
|
||||||
"access_allowed_title": "Dozvoljeni klijenti",
|
"access_allowed_title": "Dozvoljeni klijenti",
|
||||||
@@ -481,9 +475,7 @@
|
|||||||
"setup_dns_notice": "Kako biste koristili <1>DNS-over-HTTPS</1> ili <1>DNS-over-TLS</1>, potrebno je da <0>konfigurišete šifrovanje</0> u AdGuard Home postavkama.",
|
"setup_dns_notice": "Kako biste koristili <1>DNS-over-HTTPS</1> ili <1>DNS-over-TLS</1>, potrebno je da <0>konfigurišete šifrovanje</0> u AdGuard Home postavkama.",
|
||||||
"rewrite_added": "DNS prepisivanje za \"{{key}}\" je uspešno dodato",
|
"rewrite_added": "DNS prepisivanje za \"{{key}}\" je uspešno dodato",
|
||||||
"rewrite_deleted": "DNS prepisivanje za \"{{key}}\" uspešno izbrisano",
|
"rewrite_deleted": "DNS prepisivanje za \"{{key}}\" uspešno izbrisano",
|
||||||
"rewrite_updated": "DNS ponovo napisao uspešno ažuriran",
|
|
||||||
"rewrite_add": "Dodaj DNS prepisivanje",
|
"rewrite_add": "Dodaj DNS prepisivanje",
|
||||||
"rewrite_edit": "Uređivanje DNS prepravke",
|
|
||||||
"rewrite_not_found": "DNS prepisivanja nisu pronađena",
|
"rewrite_not_found": "DNS prepisivanja nisu pronađena",
|
||||||
"rewrite_confirm_delete": "Jeste li sigurni da želite da izbrišete DNS prepisivanje za \"{{key}}\"?",
|
"rewrite_confirm_delete": "Jeste li sigurni da želite da izbrišete DNS prepisivanje za \"{{key}}\"?",
|
||||||
"rewrite_desc": "Dozvoljava da jednostavno konfigurišete prilagođeni DNS odgovor za određeni domen.",
|
"rewrite_desc": "Dozvoljava da jednostavno konfigurišete prilagođeni DNS odgovor za određeni domen.",
|
||||||
@@ -531,10 +523,6 @@
|
|||||||
"statistics_retention_confirm": "Jeste li sigurni da želite da promenite zadržavanje statistike? Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
|
"statistics_retention_confirm": "Jeste li sigurni da želite da promenite zadržavanje statistike? Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
|
||||||
"statistics_cleared": "Statistika je uspešno očišćena",
|
"statistics_cleared": "Statistika je uspešno očišćena",
|
||||||
"statistics_enable": "Uključi statistiku",
|
"statistics_enable": "Uključi statistiku",
|
||||||
"ignore_domains": "Zanemari domene (razdvojene novom linijom)",
|
|
||||||
"ignore_domains_title": "Zanemareni domeni",
|
|
||||||
"ignore_domains_desc_stats": "Upiti za ove domene nisu upisani u statistiku",
|
|
||||||
"ignore_domains_desc_query": "Upiti za ove domene nisu upisani u evidenciju upita",
|
|
||||||
"interval_hours": "{{count}} čas",
|
"interval_hours": "{{count}} čas",
|
||||||
"interval_hours_plural": "{{count}} časova",
|
"interval_hours_plural": "{{count}} časova",
|
||||||
"filters_configuration": "Konfiguracija filtera",
|
"filters_configuration": "Konfiguracija filtera",
|
||||||
@@ -654,30 +642,5 @@
|
|||||||
"anonymizer_notification": "<0>Nota:</0> IP prepoznavanje je omogućeno. Možete ga onemogućiti u opštim <1>postavkama</1>.",
|
"anonymizer_notification": "<0>Nota:</0> IP prepoznavanje je omogućeno. Možete ga onemogućiti u opštim <1>postavkama</1>.",
|
||||||
"confirm_dns_cache_clear": "Želite li zaista da obrišite DNS keš?",
|
"confirm_dns_cache_clear": "Želite li zaista da obrišite DNS keš?",
|
||||||
"cache_cleared": "DNS keš je uspešno očišćen",
|
"cache_cleared": "DNS keš je uspešno očišćen",
|
||||||
"clear_cache": "Obriši keš memoriju",
|
"clear_cache": "Obriši keš memoriju"
|
||||||
"make_static": "Učini statičnim",
|
|
||||||
"theme_auto_desc": "Automatski (na osnovu šeme boja uređaja)",
|
|
||||||
"theme_dark_desc": "Tamna tema",
|
|
||||||
"theme_light_desc": "Svetla tema",
|
|
||||||
"disable_for_seconds": "Za {{count}} sekund",
|
|
||||||
"disable_for_seconds_plural": "Za {{count}} sekundi",
|
|
||||||
"disable_for_minutes": "Za {{count}} minut",
|
|
||||||
"disable_for_minutes_plural": "Za {{count}} minuta",
|
|
||||||
"disable_for_hours": "Za {{count}} sat",
|
|
||||||
"disable_for_hours_plural": "Za {{count}} sati",
|
|
||||||
"disable_until_tomorrow": "Do sutra",
|
|
||||||
"disable_notify_for_seconds": "Isključi zaštitu na {{count}} sekund",
|
|
||||||
"disable_notify_for_seconds_plural": "Isključi zaštitu na {{count}} sekundi",
|
|
||||||
"disable_notify_for_minutes": "Isključi zaštitu na {{count}} minut",
|
|
||||||
"disable_notify_for_minutes_plural": "Isključi zaštitu na {{count}} minuta",
|
|
||||||
"disable_notify_for_hours": "Isključi zaštitu na {{count}} sat",
|
|
||||||
"disable_notify_for_hours_plural": "Isključi zaštitu na {{count}} sati",
|
|
||||||
"disable_notify_until_tomorrow": "Isključi zaštitu do sutra",
|
|
||||||
"enable_protection_timer": "Zaštita će biti uključena u {{time}}",
|
|
||||||
"custom_retention_input": "Unesite zadržavanje u časovima",
|
|
||||||
"custom_rotation_input": "Unesite rotaciju u časovima",
|
|
||||||
"protection_section_label": "Zaštita",
|
|
||||||
"log_and_stats_section_label": "Evidencija upita i statistika",
|
|
||||||
"ignore_query_log": "Zanemari ovog klijenta u evidenciji upita",
|
|
||||||
"ignore_statistics": "Zanemari ovog klijenta u statističkim podacima"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Toppklienter",
|
"top_clients": "Toppklienter",
|
||||||
"no_clients_found": "Inga klienter hittade",
|
"no_clients_found": "Inga klienter hittade",
|
||||||
"general_statistics": "Allmän statistik",
|
"general_statistics": "Allmän statistik",
|
||||||
"top_upstreams": "Topp uppströmsservrar",
|
|
||||||
"no_upstreams_data_found": "Inga uppströmsdata hittades",
|
|
||||||
"number_of_dns_query_days": "Antalet DNS-förfrågningar som utfördes under senaste {{count}} dagen",
|
"number_of_dns_query_days": "Antalet DNS-förfrågningar som utfördes under senaste {{count}} dagen",
|
||||||
"number_of_dns_query_days_plural": "Ett antal DNS förfrågningar utfördes under de senaste {{count}} dagarna",
|
"number_of_dns_query_days_plural": "Ett antal DNS förfrågningar utfördes under de senaste {{count}} dagarna",
|
||||||
"number_of_dns_query_24_hours": "Antalet DNS-förfrågningar som utfördes under de senaste 24 timmarna",
|
"number_of_dns_query_24_hours": "Antalet DNS-förfrågningar som utfördes under de senaste 24 timmarna",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Aktivering av Säker surf",
|
"enforced_save_search": "Aktivering av Säker surf",
|
||||||
"number_of_dns_query_to_safe_search": "Antalet DNS-förfrågningar mot sökmotorer där Säker surf tvingats",
|
"number_of_dns_query_to_safe_search": "Antalet DNS-förfrågningar mot sökmotorer där Säker surf tvingats",
|
||||||
"average_processing_time": "Genomsnittlig processtid",
|
"average_processing_time": "Genomsnittlig processtid",
|
||||||
"processing_time": "Bearbetningstid",
|
|
||||||
"average_processing_time_hint": "Genomsnittlig processtid i millisekunder för DNS-förfrågning",
|
"average_processing_time_hint": "Genomsnittlig processtid i millisekunder för DNS-förfrågning",
|
||||||
"block_domain_use_filters_and_hosts": "Blockera domäner med filter- och värdfiler",
|
"block_domain_use_filters_and_hosts": "Blockera domäner med filter- och värdfiler",
|
||||||
"filters_block_toggle_hint": "Du kan ställa in egna blockerings regler i <a>Filterinställningar</a>.",
|
"filters_block_toggle_hint": "Du kan ställa in egna blockerings regler i <a>Filterinställningar</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Konfigurerad i {{path}}",
|
"upstream_dns_configured_in_file": "Konfigurerad i {{path}}",
|
||||||
"test_upstream_btn": "Testa uppströmmar",
|
"test_upstream_btn": "Testa uppströmmar",
|
||||||
"upstreams": "Uppströms",
|
"upstreams": "Uppströms",
|
||||||
"upstream": "Uppströms server",
|
|
||||||
"apply_btn": "Tillämpa",
|
"apply_btn": "Tillämpa",
|
||||||
"disabled_filtering_toast": "Filtrering bortkopplad",
|
"disabled_filtering_toast": "Filtrering bortkopplad",
|
||||||
"enabled_filtering_toast": "Filtrering inkopplad",
|
"enabled_filtering_toast": "Filtrering inkopplad",
|
||||||
@@ -479,9 +475,7 @@
|
|||||||
"setup_dns_notice": "För att kunna använda <1>DNS-över-HTTPS</1> eller <1>DNS-över-TLS</1>, behöver du <0>konfigurera Kryptering</0> i AdGuard Home-inställningar.",
|
"setup_dns_notice": "För att kunna använda <1>DNS-över-HTTPS</1> eller <1>DNS-över-TLS</1>, behöver du <0>konfigurera Kryptering</0> i AdGuard Home-inställningar.",
|
||||||
"rewrite_added": "DNS-omskrivning för \"{{key}}\" lyckad",
|
"rewrite_added": "DNS-omskrivning för \"{{key}}\" lyckad",
|
||||||
"rewrite_deleted": "DNS-omskrivning för \"{{key}}\" har tagits bort",
|
"rewrite_deleted": "DNS-omskrivning för \"{{key}}\" har tagits bort",
|
||||||
"rewrite_updated": "DNS-omskrivning har uppdaterats",
|
|
||||||
"rewrite_add": "Lägg till DNS omskrivning",
|
"rewrite_add": "Lägg till DNS omskrivning",
|
||||||
"rewrite_edit": "Redigera DNS-omskrivning",
|
|
||||||
"rewrite_not_found": "Inga DNS omskrivningar hittades",
|
"rewrite_not_found": "Inga DNS omskrivningar hittades",
|
||||||
"rewrite_confirm_delete": "Är du säker på att du vill ta bort DNS-omskrivningen för \"{{key}}\"?",
|
"rewrite_confirm_delete": "Är du säker på att du vill ta bort DNS-omskrivningen för \"{{key}}\"?",
|
||||||
"rewrite_desc": "Gör det enkelt att konfigurera anpassat DNS svar för ett specifikt domännamn.",
|
"rewrite_desc": "Gör det enkelt att konfigurera anpassat DNS svar för ett specifikt domännamn.",
|
||||||
|
|||||||
@@ -172,7 +172,6 @@
|
|||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
"dns_over_quic": "DNS-over-QUIC",
|
|
||||||
"form_enter_rate_limit": "ป้อนขีดจำกัดอัตรา",
|
"form_enter_rate_limit": "ป้อนขีดจำกัดอัตรา",
|
||||||
"rate_limit": "จำกัดอัตรา",
|
"rate_limit": "จำกัดอัตรา",
|
||||||
"edns_enable": "เปิดใช้งานซับเน็ตไคลเอ็นต์ EDNS",
|
"edns_enable": "เปิดใช้งานซับเน็ตไคลเอ็นต์ EDNS",
|
||||||
@@ -393,7 +392,6 @@
|
|||||||
"show_processed_responses": "การประมวลผล",
|
"show_processed_responses": "การประมวลผล",
|
||||||
"blocked_adult_websites": "ถูกปิดกั้นโดยการควบคุมของผู้ปกครอง",
|
"blocked_adult_websites": "ถูกปิดกั้นโดยการควบคุมของผู้ปกครอง",
|
||||||
"safe_search": "ค้นหาอย่างปลอดภัย",
|
"safe_search": "ค้นหาอย่างปลอดภัย",
|
||||||
"blocklist": "บัญชีดำ",
|
|
||||||
"filter_category_other": "อื่น ๆ",
|
"filter_category_other": "อื่น ๆ",
|
||||||
"parental_control": "ควบคุมโดยผู้ปกครอง"
|
"parental_control": "ควบคุมโดยผู้ปกครอง"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Başlıca istemciler",
|
"top_clients": "Başlıca istemciler",
|
||||||
"no_clients_found": "İstemci bulunamadı",
|
"no_clients_found": "İstemci bulunamadı",
|
||||||
"general_statistics": "Genel istatistikler",
|
"general_statistics": "Genel istatistikler",
|
||||||
"top_upstreams": "Başlıca üst kaynaklar",
|
|
||||||
"no_upstreams_data_found": "Üst kaynak verisi bulunamadı",
|
|
||||||
"number_of_dns_query_days": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
"number_of_dns_query_days": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
||||||
"number_of_dns_query_days_plural": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
"number_of_dns_query_days_plural": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
||||||
"number_of_dns_query_24_hours": "Son 24 saat içinde işlenen DNS sorgularının sayısı",
|
"number_of_dns_query_24_hours": "Son 24 saat içinde işlenen DNS sorgularının sayısı",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Uygulanan güvenli arama",
|
"enforced_save_search": "Uygulanan güvenli arama",
|
||||||
"number_of_dns_query_to_safe_search": "Güvenli Aramanın uygulandığı arama motorlarına gönderilen DNS isteklerinin sayısı",
|
"number_of_dns_query_to_safe_search": "Güvenli Aramanın uygulandığı arama motorlarına gönderilen DNS isteklerinin sayısı",
|
||||||
"average_processing_time": "Ortalama işlem süresi",
|
"average_processing_time": "Ortalama işlem süresi",
|
||||||
"processing_time": "İşlem süresi",
|
|
||||||
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
|
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
|
||||||
"block_domain_use_filters_and_hosts": "Filtre ve hosts dosyalarını kullanarak alan adlarını engelle",
|
"block_domain_use_filters_and_hosts": "Filtre ve hosts dosyalarını kullanarak alan adlarını engelle",
|
||||||
"filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
|
"filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "{{path}} dosyasında yapılandırıldı",
|
"upstream_dns_configured_in_file": "{{path}} dosyasında yapılandırıldı",
|
||||||
"test_upstream_btn": "Üst sunucuyu test et",
|
"test_upstream_btn": "Üst sunucuyu test et",
|
||||||
"upstreams": "Üst kaynak",
|
"upstreams": "Üst kaynak",
|
||||||
"upstream": "Üst kaynak",
|
|
||||||
"apply_btn": "Uygula",
|
"apply_btn": "Uygula",
|
||||||
"disabled_filtering_toast": "Filtreleme devre dışı",
|
"disabled_filtering_toast": "Filtreleme devre dışı",
|
||||||
"enabled_filtering_toast": "Filtreleme etkin",
|
"enabled_filtering_toast": "Filtreleme etkin",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "Sorgu günlüğü başarıyla temizlendi",
|
"query_log_cleared": "Sorgu günlüğü başarıyla temizlendi",
|
||||||
"query_log_updated": "Sorgu günlüğü başarıyla güncellendi",
|
"query_log_updated": "Sorgu günlüğü başarıyla güncellendi",
|
||||||
"query_log_clear": "Sorgu günlüklerini temizle",
|
"query_log_clear": "Sorgu günlüklerini temizle",
|
||||||
"query_log_retention": "Sorgu günlükleri rotasyonu",
|
"query_log_retention": "Sorgu günlüklerini sakla",
|
||||||
"query_log_enable": "Günlüğü etkinleştir",
|
"query_log_enable": "Günlüğü etkinleştir",
|
||||||
"query_log_configuration": "Günlük yapılandırması",
|
"query_log_configuration": "Günlük yapılandırması",
|
||||||
"query_log_disabled": "Sorgu günlüğü devre dışı bırakıldı, bunu <0>ayarlar</0> kısmından yapılandırılabilirsiniz",
|
"query_log_disabled": "Sorgu günlüğü devre dışı bırakıldı, bunu <0>ayarlar</0> kısmından yapılandırılabilirsiniz",
|
||||||
"query_log_strict_search": "Tam arama için çift tırnak işareti kullanın",
|
"query_log_strict_search": "Tam arama için çift tırnak işareti kullanın",
|
||||||
"query_log_retention_confirm": "Sorgu günlüğü rotasyonunu değiştirmek istediğinizden emin misiniz? Aralık değerini düşürürseniz, bazı veriler kaybolacaktır.",
|
"query_log_retention_confirm": "Sorgu günlüğü saklama süresini değiştirmek istediğinize emin misiniz? Aralık değerini azaltırsanız, bazı veriler kaybolacaktır",
|
||||||
"anonymize_client_ip": "İstemcinin IP adresini gizle",
|
"anonymize_client_ip": "İstemcinin IP adresini gizle",
|
||||||
"anonymize_client_ip_desc": "İstemcinin tam IP adresini günlüklere veya istatistiklere kaydetmeyin",
|
"anonymize_client_ip_desc": "İstemcinin tam IP adresini günlüklere veya istatistiklere kaydetmeyin",
|
||||||
"dns_config": "DNS sunucu yapılandırması",
|
"dns_config": "DNS sunucu yapılandırması",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "\"{{key}}\" istemcisini silmek istediğinizden emin misiniz?",
|
"client_confirm_delete": "\"{{key}}\" istemcisini silmek istediğinizden emin misiniz?",
|
||||||
"list_confirm_delete": "Bu listeyi silmek istediğinizden emin misiniz?",
|
"list_confirm_delete": "Bu listeyi silmek istediğinizden emin misiniz?",
|
||||||
"auto_clients_title": "Çalışma zamanı istemcileri",
|
"auto_clients_title": "Çalışma zamanı istemcileri",
|
||||||
"auto_clients_desc": "AdGuard Home'u kullanan veya kullanabilecek cihazların IP adresleri hakkında bilgiler. Bu bilgiler, hosts dosyaları, ters DNS, vb. dahil olmak üzere çeşitli kaynaklardan toplanır.",
|
"auto_clients_desc": "Henüz AdGuard Home'u kullanabilecek Kalıcı istemciler listesinde olmayan cihazlar",
|
||||||
"access_title": "Erişim ayarları",
|
"access_title": "Erişim ayarları",
|
||||||
"access_desc": "AdGuard Home DNS sunucusu için erişim kurallarını buradan yapılandırabilirsiniz",
|
"access_desc": "AdGuard Home DNS sunucusu için erişim kurallarını buradan yapılandırabilirsiniz",
|
||||||
"access_allowed_title": "İzin verilen istemciler",
|
"access_allowed_title": "İzin verilen istemciler",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "<1>DNS-over-HTTPS</1> veya <1>DNS-over-TLS</1> protokolünü kullanmak için AdGuard Home üzerinde <0>Şifreleme ayarları</0> bölümünden ayarları yapmanız gerekir.",
|
"setup_dns_notice": "<1>DNS-over-HTTPS</1> veya <1>DNS-over-TLS</1> protokolünü kullanmak için AdGuard Home üzerinde <0>Şifreleme ayarları</0> bölümünden ayarları yapmanız gerekir.",
|
||||||
"rewrite_added": "\"{{key}}\" için DNS yeniden yazımı başarıyla eklendi",
|
"rewrite_added": "\"{{key}}\" için DNS yeniden yazımı başarıyla eklendi",
|
||||||
"rewrite_deleted": "\"{{key}}\" için DNS yeniden yazımı başarıyla silindi",
|
"rewrite_deleted": "\"{{key}}\" için DNS yeniden yazımı başarıyla silindi",
|
||||||
"rewrite_updated": "DNS yeniden yazma başarıyla güncellendi",
|
|
||||||
"rewrite_add": "DNS yeniden yazımı ekle",
|
"rewrite_add": "DNS yeniden yazımı ekle",
|
||||||
"rewrite_edit": "DNS yeniden yazmayı düzenle",
|
|
||||||
"rewrite_not_found": "DNS yeniden yazımı bulunamadı",
|
"rewrite_not_found": "DNS yeniden yazımı bulunamadı",
|
||||||
"rewrite_confirm_delete": "\"{{key}}\" için DNS yeniden yazımını silmek istediğinize emin misiniz?",
|
"rewrite_confirm_delete": "\"{{key}}\" için DNS yeniden yazımını silmek istediğinize emin misiniz?",
|
||||||
"rewrite_desc": "Belirli bir alan adı için özel DNS yanıtını kolayca yapılandırmanızı sağlar.",
|
"rewrite_desc": "Belirli bir alan adı için özel DNS yanıtını kolayca yapılandırmanızı sağlar.",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "Korumayı {{count}} saatliğine devre dışı bırak",
|
"disable_notify_for_hours": "Korumayı {{count}} saatliğine devre dışı bırak",
|
||||||
"disable_notify_for_hours_plural": "Korumayı {{count}} saatliğine devre dışı bırak",
|
"disable_notify_for_hours_plural": "Korumayı {{count}} saatliğine devre dışı bırak",
|
||||||
"disable_notify_until_tomorrow": "Korumayı yarına kadar devre dışı bırak",
|
"disable_notify_until_tomorrow": "Korumayı yarına kadar devre dışı bırak",
|
||||||
"enable_protection_timer": "Koruma {{time}} içinde etkinleştirilecektir",
|
"enable_protection_timer": "Koruma {{time}} içinde etkinleştirilecektir"
|
||||||
"custom_retention_input": "Saklama süresini saat olarak girin",
|
|
||||||
"custom_rotation_input": "Rotasyonu saat cinsinden girin",
|
|
||||||
"protection_section_label": "Koruma",
|
|
||||||
"log_and_stats_section_label": "Sorgu günlüğü ve istatistikler",
|
|
||||||
"ignore_query_log": "Sorgu günlüğünde bu istemciyi yoksay",
|
|
||||||
"ignore_statistics": "İstatistiklerde bu istemciyi yoksay"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Найактивніші клієнти",
|
"top_clients": "Найактивніші клієнти",
|
||||||
"no_clients_found": "Клієнтів не знайдено",
|
"no_clients_found": "Клієнтів не знайдено",
|
||||||
"general_statistics": "Загальна статистика",
|
"general_statistics": "Загальна статистика",
|
||||||
"top_upstreams": "Часто запитувані upstream-сервери",
|
|
||||||
"no_upstreams_data_found": "Немає даних про upstream-сервери",
|
|
||||||
"number_of_dns_query_days": "Кількість DNS-запитів, оброблених за останні {{count}} дні",
|
"number_of_dns_query_days": "Кількість DNS-запитів, оброблених за останні {{count}} дні",
|
||||||
"number_of_dns_query_days_plural": "Кількість DNS-запитів, оброблених за останні {{count}} днів",
|
"number_of_dns_query_days_plural": "Кількість DNS-запитів, оброблених за останні {{count}} днів",
|
||||||
"number_of_dns_query_24_hours": "Кількість DNS-запитів, оброблених за останні 24 години",
|
"number_of_dns_query_24_hours": "Кількість DNS-запитів, оброблених за останні 24 години",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Примусовий безпечний пошук",
|
"enforced_save_search": "Примусовий безпечний пошук",
|
||||||
"number_of_dns_query_to_safe_search": "Кількість DNS-запитів до пошукових систем, для яких примусово застосований безпечний пошук",
|
"number_of_dns_query_to_safe_search": "Кількість DNS-запитів до пошукових систем, для яких примусово застосований безпечний пошук",
|
||||||
"average_processing_time": "Середній час обробки",
|
"average_processing_time": "Середній час обробки",
|
||||||
"processing_time": "Час обробки",
|
|
||||||
"average_processing_time_hint": "Середній час обробки DNS запиту в мілісекундах",
|
"average_processing_time_hint": "Середній час обробки DNS запиту в мілісекундах",
|
||||||
"block_domain_use_filters_and_hosts": "Блокування доменів за допомогою фільтрів та hosts-файлів",
|
"block_domain_use_filters_and_hosts": "Блокування доменів за допомогою фільтрів та hosts-файлів",
|
||||||
"filters_block_toggle_hint": "Ви можете налаштувати правила блокування в розділі <a>Фільтри</a>.",
|
"filters_block_toggle_hint": "Ви можете налаштувати правила блокування в розділі <a>Фільтри</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Налаштовано в {{path}}",
|
"upstream_dns_configured_in_file": "Налаштовано в {{path}}",
|
||||||
"test_upstream_btn": "Перевірити сервери",
|
"test_upstream_btn": "Перевірити сервери",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"upstream": "Upstream-сервер",
|
|
||||||
"apply_btn": "Застосувати",
|
"apply_btn": "Застосувати",
|
||||||
"disabled_filtering_toast": "Фільтрування вимкнено",
|
"disabled_filtering_toast": "Фільтрування вимкнено",
|
||||||
"enabled_filtering_toast": "Фільтрування увімкнено",
|
"enabled_filtering_toast": "Фільтрування увімкнено",
|
||||||
@@ -171,7 +167,6 @@
|
|||||||
"enabled_parental_toast": "«Батьківський контроль» увімкнено",
|
"enabled_parental_toast": "«Батьківський контроль» увімкнено",
|
||||||
"disabled_safe_search_toast": "Безпечний пошук вимкнено",
|
"disabled_safe_search_toast": "Безпечний пошук вимкнено",
|
||||||
"enabled_save_search_toast": "Безпечний пошук увімкнено",
|
"enabled_save_search_toast": "Безпечний пошук увімкнено",
|
||||||
"updated_save_search_toast": "Налаштування Безпечного пошуку оновлено",
|
|
||||||
"enabled_table_header": "Увімкнено",
|
"enabled_table_header": "Увімкнено",
|
||||||
"name_table_header": "Назва",
|
"name_table_header": "Назва",
|
||||||
"list_url_table_header": "URL списку",
|
"list_url_table_header": "URL списку",
|
||||||
@@ -295,8 +290,6 @@
|
|||||||
"rate_limit": "Обмеження швидкості",
|
"rate_limit": "Обмеження швидкості",
|
||||||
"edns_enable": "Увімкнути відправку EDNS Client Subnet",
|
"edns_enable": "Увімкнути відправку EDNS Client Subnet",
|
||||||
"edns_cs_desc": "Додавати параметр EDNS Client Subnet (ECS) до запитів до upstream-серверів, а також записувати в журнал значення, що надсилаються клієнтами.",
|
"edns_cs_desc": "Додавати параметр EDNS Client Subnet (ECS) до запитів до upstream-серверів, а також записувати в журнал значення, що надсилаються клієнтами.",
|
||||||
"edns_use_custom_ip": "Використання користувацької IP-адреси для EDNS",
|
|
||||||
"edns_use_custom_ip_desc": "Дозволити використовувати користувацьку IP-адресу для EDNS",
|
|
||||||
"rate_limit_desc": "Кількість запитів в секунду, які може робити один клієнт. Встановлене значення «0» означатиме необмежену кількість.",
|
"rate_limit_desc": "Кількість запитів в секунду, які може робити один клієнт. Встановлене значення «0» означатиме необмежену кількість.",
|
||||||
"blocking_ipv4_desc": "IP-адреса, яку потрібно видати для заблокованого A запиту",
|
"blocking_ipv4_desc": "IP-адреса, яку потрібно видати для заблокованого A запиту",
|
||||||
"blocking_ipv6_desc": "IP-адреса, яку потрібно видати для заблокованого АААА запиту",
|
"blocking_ipv6_desc": "IP-адреса, яку потрібно видати для заблокованого АААА запиту",
|
||||||
@@ -448,7 +441,7 @@
|
|||||||
"client_confirm_delete": "Ви впевнені, що хочете видалити клієнта «{{key}}»?",
|
"client_confirm_delete": "Ви впевнені, що хочете видалити клієнта «{{key}}»?",
|
||||||
"list_confirm_delete": "Ви впевнені, що хочете видалити цей список?",
|
"list_confirm_delete": "Ви впевнені, що хочете видалити цей список?",
|
||||||
"auto_clients_title": "Runtime-клієнти",
|
"auto_clients_title": "Runtime-клієнти",
|
||||||
"auto_clients_desc": "Інформація про IP-адреси пристроїв, які використовують або можуть використовувати AdGuard Home. Ця інформація збирається з кількох джерел, зокрема з файлів hosts, зворотного DNS тощо.",
|
"auto_clients_desc": "Клієнти, які використовують AdGuard Home, незалежно від того, чи збережені вони в списку постійних",
|
||||||
"access_title": "Налаштування доступу",
|
"access_title": "Налаштування доступу",
|
||||||
"access_desc": "Тут ви можете налаштувати правила доступу для DNS-сервера AdGuard Home",
|
"access_desc": "Тут ви можете налаштувати правила доступу для DNS-сервера AdGuard Home",
|
||||||
"access_allowed_title": "Дозволені клієнти",
|
"access_allowed_title": "Дозволені клієнти",
|
||||||
@@ -482,9 +475,7 @@
|
|||||||
"setup_dns_notice": "Для використання <1>DNS-over-HTTPS</1> або <1>DNS-over-TLS</1>, вам потрібно <0>налаштувати Шифрування</0> в налаштуваннях AdGuard Home.",
|
"setup_dns_notice": "Для використання <1>DNS-over-HTTPS</1> або <1>DNS-over-TLS</1>, вам потрібно <0>налаштувати Шифрування</0> в налаштуваннях AdGuard Home.",
|
||||||
"rewrite_added": "Перезапис DNS для «{{key}}» успішно додано",
|
"rewrite_added": "Перезапис DNS для «{{key}}» успішно додано",
|
||||||
"rewrite_deleted": "Перезапис DNS для «{{key}}» успішно видалено",
|
"rewrite_deleted": "Перезапис DNS для «{{key}}» успішно видалено",
|
||||||
"rewrite_updated": "Перезапис DNS успішно оновлено",
|
|
||||||
"rewrite_add": "Додати перезапис DNS",
|
"rewrite_add": "Додати перезапис DNS",
|
||||||
"rewrite_edit": "Редагувати перезапис DNS",
|
|
||||||
"rewrite_not_found": "Перезаписів DNS не знайдено",
|
"rewrite_not_found": "Перезаписів DNS не знайдено",
|
||||||
"rewrite_confirm_delete": "Ви впевнені, що хочете видалити перезапис DNS для «{{key}}»?",
|
"rewrite_confirm_delete": "Ви впевнені, що хочете видалити перезапис DNS для «{{key}}»?",
|
||||||
"rewrite_desc": "Дозволяє легко налаштувати власну відповідь DNS для певного доменного імені.",
|
"rewrite_desc": "Дозволяє легко налаштувати власну відповідь DNS для певного доменного імені.",
|
||||||
@@ -532,10 +523,6 @@
|
|||||||
"statistics_retention_confirm": "Ви впевнені, що хочете змінити тривалість статистики? Якщо зменшити значення інтервалу, деякі дані будуть втрачені",
|
"statistics_retention_confirm": "Ви впевнені, що хочете змінити тривалість статистики? Якщо зменшити значення інтервалу, деякі дані будуть втрачені",
|
||||||
"statistics_cleared": "Статистику успішно очищено",
|
"statistics_cleared": "Статистику успішно очищено",
|
||||||
"statistics_enable": "Увімкнути статистику",
|
"statistics_enable": "Увімкнути статистику",
|
||||||
"ignore_domains": "Ігноровані домени (по одному на рядок)",
|
|
||||||
"ignore_domains_title": "Ігноровані домени",
|
|
||||||
"ignore_domains_desc_stats": "Запити для цих доменів в статистику не пишуться",
|
|
||||||
"ignore_domains_desc_query": "Запити для цих доменів не записуються до журналу запитів",
|
|
||||||
"interval_hours": "{{count}} година",
|
"interval_hours": "{{count}} година",
|
||||||
"interval_hours_plural": "{{count}} годин(и)",
|
"interval_hours_plural": "{{count}} годин(и)",
|
||||||
"filters_configuration": "Конфігурація фільтрів",
|
"filters_configuration": "Конфігурація фільтрів",
|
||||||
@@ -655,30 +642,5 @@
|
|||||||
"anonymizer_notification": "<0>Примітка:</0> IP-анонімізацію ввімкнено. Ви можете вимкнути його в <1>Загальні налаштування</1> .",
|
"anonymizer_notification": "<0>Примітка:</0> IP-анонімізацію ввімкнено. Ви можете вимкнути його в <1>Загальні налаштування</1> .",
|
||||||
"confirm_dns_cache_clear": "Ви впевнені, що бажаєте очистити кеш DNS?",
|
"confirm_dns_cache_clear": "Ви впевнені, що бажаєте очистити кеш DNS?",
|
||||||
"cache_cleared": "Кеш DNS успішно очищено",
|
"cache_cleared": "Кеш DNS успішно очищено",
|
||||||
"clear_cache": "Очистити кеш",
|
"clear_cache": "Очистити кеш"
|
||||||
"make_static": "Зробити статичним",
|
|
||||||
"theme_auto_desc": "Автоматична (на основі теми вашого пристрою)",
|
|
||||||
"theme_dark_desc": "Темна тема",
|
|
||||||
"theme_light_desc": "Світла тема",
|
|
||||||
"disable_for_seconds": "На {{count}} секунду",
|
|
||||||
"disable_for_seconds_plural": "На {{count}} секунд",
|
|
||||||
"disable_for_minutes": "На {{count}} хвилину",
|
|
||||||
"disable_for_minutes_plural": "На {{count}} хвилин",
|
|
||||||
"disable_for_hours": "На {{count}} годину",
|
|
||||||
"disable_for_hours_plural": "На {{count}} годин",
|
|
||||||
"disable_until_tomorrow": "До завтра",
|
|
||||||
"disable_notify_for_seconds": "Вимкнення захисту на {{count}} секунду",
|
|
||||||
"disable_notify_for_seconds_plural": "Вимкнення захисту на {{count}} секунд",
|
|
||||||
"disable_notify_for_minutes": "Вимкнення захисту на {{count}} хвилину",
|
|
||||||
"disable_notify_for_minutes_plural": "Вимкнення захисту на {{count}} хвилин",
|
|
||||||
"disable_notify_for_hours": "Вимкнення захисту на {{count}} годину",
|
|
||||||
"disable_notify_for_hours_plural": "Вимкнення захисту на {{count}} годин",
|
|
||||||
"disable_notify_until_tomorrow": "Відключення захисту до завтра",
|
|
||||||
"enable_protection_timer": "Захист буде ввімкнено о {{time}}",
|
|
||||||
"custom_retention_input": "Введіть час в годинах",
|
|
||||||
"custom_rotation_input": "Введіть час в годинах",
|
|
||||||
"protection_section_label": "Захист",
|
|
||||||
"log_and_stats_section_label": "Журнал запитів і статистика",
|
|
||||||
"ignore_query_log": "Ігнорувати цей клієнт у журналі запитів",
|
|
||||||
"ignore_statistics": "Ігноруйте цей клієнт в статистиці"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"client_settings": "Cài đặt thiết bị",
|
"client_settings": "Cài đặt máy khách",
|
||||||
"example_upstream_reserved": "ngược dòng <0>cho các miền cụ thể</0>;",
|
"example_upstream_reserved": "ngược dòng <0>cho các miền cụ thể</0>;",
|
||||||
"example_upstream_comment": "một lời bình luận.",
|
"example_upstream_comment": "một lời bình luận.",
|
||||||
"upstream_parallel": "Sử dụng truy vấn song song để tăng tốc độ giải quyết bằng cách truy vấn đồng thời tất cả các máy chủ ngược tuyến",
|
"upstream_parallel": "Sử dụng truy vấn song song để tăng tốc độ giải quyết bằng cách truy vấn đồng thời tất cả các máy chủ ngược tuyến",
|
||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "Người dùng hàng đầu",
|
"top_clients": "Người dùng hàng đầu",
|
||||||
"no_clients_found": "Không có người dùng",
|
"no_clients_found": "Không có người dùng",
|
||||||
"general_statistics": "Thống kê chung",
|
"general_statistics": "Thống kê chung",
|
||||||
"top_upstreams": "Máy chủ thượng nguồn hàng đầu",
|
|
||||||
"no_upstreams_data_found": "Không tìm thấy dữ liệu máy chủ ngược dòng",
|
|
||||||
"number_of_dns_query_days": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
"number_of_dns_query_days": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
||||||
"number_of_dns_query_days_plural": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
"number_of_dns_query_days_plural": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
||||||
"number_of_dns_query_24_hours": "Số yêu cầu DNS đã xử lý trong 24 giờ qua",
|
"number_of_dns_query_24_hours": "Số yêu cầu DNS đã xử lý trong 24 giờ qua",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "Bắt buộc tìm kiếm an toàn",
|
"enforced_save_search": "Bắt buộc tìm kiếm an toàn",
|
||||||
"number_of_dns_query_to_safe_search": "Số yêu cầu DNS tới công cụ tìm kiếm đã chuyển thành tìm kiếm an toàn",
|
"number_of_dns_query_to_safe_search": "Số yêu cầu DNS tới công cụ tìm kiếm đã chuyển thành tìm kiếm an toàn",
|
||||||
"average_processing_time": "Thời gian xử lý trung bình",
|
"average_processing_time": "Thời gian xử lý trung bình",
|
||||||
"processing_time": "Thời gian xử lý",
|
|
||||||
"average_processing_time_hint": "Thời gian trung bình cho một yêu cầu DNS tính bằng mili giây",
|
"average_processing_time_hint": "Thời gian trung bình cho một yêu cầu DNS tính bằng mili giây",
|
||||||
"block_domain_use_filters_and_hosts": "Chặn tên miền sử dụng các bộ lọc và file hosts",
|
"block_domain_use_filters_and_hosts": "Chặn tên miền sử dụng các bộ lọc và file hosts",
|
||||||
"filters_block_toggle_hint": "Bạn có thể thiết lập quy tắc chặn tại cài đặt <a>Bộ lọc</a>.",
|
"filters_block_toggle_hint": "Bạn có thể thiết lập quy tắc chặn tại cài đặt <a>Bộ lọc</a>.",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "Cấu hình tại {{path}}",
|
"upstream_dns_configured_in_file": "Cấu hình tại {{path}}",
|
||||||
"test_upstream_btn": "Kiểm tra",
|
"test_upstream_btn": "Kiểm tra",
|
||||||
"upstreams": "Nguồn",
|
"upstreams": "Nguồn",
|
||||||
"upstream": "Máy chủ thượng nguồn",
|
|
||||||
"apply_btn": "Áp dụng",
|
"apply_btn": "Áp dụng",
|
||||||
"disabled_filtering_toast": "Đã tắt chặn quảng cáo",
|
"disabled_filtering_toast": "Đã tắt chặn quảng cáo",
|
||||||
"enabled_filtering_toast": "Đã bật chặn quảng cáo",
|
"enabled_filtering_toast": "Đã bật chặn quảng cáo",
|
||||||
@@ -171,7 +167,6 @@
|
|||||||
"enabled_parental_toast": "Đã bật quản lý của phụ huynh",
|
"enabled_parental_toast": "Đã bật quản lý của phụ huynh",
|
||||||
"disabled_safe_search_toast": "Đã tắt tìm kiếm an toàn",
|
"disabled_safe_search_toast": "Đã tắt tìm kiếm an toàn",
|
||||||
"enabled_save_search_toast": "Đã bật tìm kiếm an toàn",
|
"enabled_save_search_toast": "Đã bật tìm kiếm an toàn",
|
||||||
"updated_save_search_toast": "Cài đặt Tìm kiếm an toàn đã được cập nhật",
|
|
||||||
"enabled_table_header": "Kích hoạt",
|
"enabled_table_header": "Kích hoạt",
|
||||||
"name_table_header": "Tên",
|
"name_table_header": "Tên",
|
||||||
"list_url_table_header": "URL bộ lọc",
|
"list_url_table_header": "URL bộ lọc",
|
||||||
@@ -261,12 +256,12 @@
|
|||||||
"query_log_cleared": "Nhật ký truy vấn đã được xóa thành công",
|
"query_log_cleared": "Nhật ký truy vấn đã được xóa thành công",
|
||||||
"query_log_updated": "Cập nhật thành công nhật kí truy xuất",
|
"query_log_updated": "Cập nhật thành công nhật kí truy xuất",
|
||||||
"query_log_clear": "Xóa nhật ký truy vấn",
|
"query_log_clear": "Xóa nhật ký truy vấn",
|
||||||
"query_log_retention": "Xoay vòng nhật ký truy vấn",
|
"query_log_retention": "Lưu giữ nhật ký truy vấn",
|
||||||
"query_log_enable": "Bật nhật ký",
|
"query_log_enable": "Bật nhật ký",
|
||||||
"query_log_configuration": "Cấu hình nhật ký",
|
"query_log_configuration": "Cấu hình nhật ký",
|
||||||
"query_log_disabled": "Nhật ký truy vấn bị vô hiệu hóa và có thể được định cấu hình trong <0>cài đặt</ 0>",
|
"query_log_disabled": "Nhật ký truy vấn bị vô hiệu hóa và có thể được định cấu hình trong <0>cài đặt</ 0>",
|
||||||
"query_log_strict_search": "Sử dụng dấu ngoặc kép để tìm kiếm nghiêm ngặt",
|
"query_log_strict_search": "Sử dụng dấu ngoặc kép để tìm kiếm nghiêm ngặt",
|
||||||
"query_log_retention_confirm": "Bạn có chắc chắn muốn thay đổi xoay vòng nhật ký truy vấn không? Nếu bạn giảm giá trị khoảng thời gian, một số dữ liệu sẽ bị mất",
|
"query_log_retention_confirm": "Bạn có chắc chắn muốn thay đổi lưu giữ nhật ký truy vấn? Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất",
|
||||||
"anonymize_client_ip": "Ẩn danh IP khách",
|
"anonymize_client_ip": "Ẩn danh IP khách",
|
||||||
"anonymize_client_ip_desc": "Không lưu địa chỉ IP đầy đủ của khách hàng trong nhật ký và thống kê",
|
"anonymize_client_ip_desc": "Không lưu địa chỉ IP đầy đủ của khách hàng trong nhật ký và thống kê",
|
||||||
"dns_config": "Thiết lập máy chủ DNS",
|
"dns_config": "Thiết lập máy chủ DNS",
|
||||||
@@ -295,8 +290,6 @@
|
|||||||
"rate_limit": "Giới hạn yêu cầu",
|
"rate_limit": "Giới hạn yêu cầu",
|
||||||
"edns_enable": "Bật mạng con EDNS Client",
|
"edns_enable": "Bật mạng con EDNS Client",
|
||||||
"edns_cs_desc": "Thêm tùy chọn EDNS Client Subnet (ECS) vào các yêu cầu ngược dòng và ghi lại các giá trị được gửi bởi các máy khách trong nhật ký truy vấn.",
|
"edns_cs_desc": "Thêm tùy chọn EDNS Client Subnet (ECS) vào các yêu cầu ngược dòng và ghi lại các giá trị được gửi bởi các máy khách trong nhật ký truy vấn.",
|
||||||
"edns_use_custom_ip": "Sử dụng địa chỉ IP tùy chỉnh cho EDNS",
|
|
||||||
"edns_use_custom_ip_desc": "Cho phép sử dụng địa chỉ IP tùy chỉnh cho EDNS",
|
|
||||||
"rate_limit_desc": "Số lượng yêu cầu mỗi giây mà một khách hàng được phép thực hiện (0: không giới hạn)",
|
"rate_limit_desc": "Số lượng yêu cầu mỗi giây mà một khách hàng được phép thực hiện (0: không giới hạn)",
|
||||||
"blocking_ipv4_desc": "Địa chỉ IP được trả lại cho một yêu cầu A bị chặn",
|
"blocking_ipv4_desc": "Địa chỉ IP được trả lại cho một yêu cầu A bị chặn",
|
||||||
"blocking_ipv6_desc": "Địa chỉ IP được trả lại cho một yêu cầu AAA bị chặn",
|
"blocking_ipv6_desc": "Địa chỉ IP được trả lại cho một yêu cầu AAA bị chặn",
|
||||||
@@ -448,7 +441,7 @@
|
|||||||
"client_confirm_delete": "Bạn có chắc chắn muốn xóa máy khách \"{{key}}\" không?",
|
"client_confirm_delete": "Bạn có chắc chắn muốn xóa máy khách \"{{key}}\" không?",
|
||||||
"list_confirm_delete": "Bạn có muốn xóa bộ lọc này?",
|
"list_confirm_delete": "Bạn có muốn xóa bộ lọc này?",
|
||||||
"auto_clients_title": "Máy khách (thời gian chạy)",
|
"auto_clients_title": "Máy khách (thời gian chạy)",
|
||||||
"auto_clients_desc": "Thông tin về địa chỉ IP của thiết bị đang sử dụng hoặc có thể sử dụng AdGuard Home. Thông tin này được thu thập từ nhiều nguồn, bao gồm tệp máy chủ, DNS ngược, v.v.",
|
"auto_clients_desc": "Các thiết bị không có trong danh sách khách hàng ổn định vẫn có thể sử dụng AdGuard Home",
|
||||||
"access_title": "Cài đặt truy cập",
|
"access_title": "Cài đặt truy cập",
|
||||||
"access_desc": "Tại đây bạn có thể định cấu hình quy tắc truy cập cho máy chủ AdGuard Home DNS",
|
"access_desc": "Tại đây bạn có thể định cấu hình quy tắc truy cập cho máy chủ AdGuard Home DNS",
|
||||||
"access_allowed_title": "Máy chủ được phép",
|
"access_allowed_title": "Máy chủ được phép",
|
||||||
@@ -482,9 +475,7 @@
|
|||||||
"setup_dns_notice": "Để sử dụng <1>DNS-over-HTTPS</1> hoặc <1>DNS-over-TLS</1>, bạn cần <0>định cấu hình Mã hóa</0> trong cài đặt AdGuard Home.",
|
"setup_dns_notice": "Để sử dụng <1>DNS-over-HTTPS</1> hoặc <1>DNS-over-TLS</1>, bạn cần <0>định cấu hình Mã hóa</0> trong cài đặt AdGuard Home.",
|
||||||
"rewrite_added": "DNS viết lại cho \"{{key}}\" đã thêm thành công",
|
"rewrite_added": "DNS viết lại cho \"{{key}}\" đã thêm thành công",
|
||||||
"rewrite_deleted": "DNS viết lại cho \"{{key}}\" đã xóa thành công",
|
"rewrite_deleted": "DNS viết lại cho \"{{key}}\" đã xóa thành công",
|
||||||
"rewrite_updated": "Viết lại DNS được cập nhật thành công",
|
|
||||||
"rewrite_add": "Thêm DNS viết lại",
|
"rewrite_add": "Thêm DNS viết lại",
|
||||||
"rewrite_edit": "Chỉnh sửa viết lại DNS",
|
|
||||||
"rewrite_not_found": "Không tìm thấy DNS viết lại",
|
"rewrite_not_found": "Không tìm thấy DNS viết lại",
|
||||||
"rewrite_confirm_delete": "Bạn có chắc chắn muốn xóa DNS viết lại cho \"{{key}}\" không?",
|
"rewrite_confirm_delete": "Bạn có chắc chắn muốn xóa DNS viết lại cho \"{{key}}\" không?",
|
||||||
"rewrite_desc": "Cho phép dễ dàng định cấu hình tùy chỉnh DNS phản hồi cho một tên miền cụ thể.",
|
"rewrite_desc": "Cho phép dễ dàng định cấu hình tùy chỉnh DNS phản hồi cho một tên miền cụ thể.",
|
||||||
@@ -532,10 +523,6 @@
|
|||||||
"statistics_retention_confirm": "Bạn có chắc chắn muốn thay đổi lưu giữ số liệu thống kê? Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất",
|
"statistics_retention_confirm": "Bạn có chắc chắn muốn thay đổi lưu giữ số liệu thống kê? Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất",
|
||||||
"statistics_cleared": "Xoá thống kê thành công",
|
"statistics_cleared": "Xoá thống kê thành công",
|
||||||
"statistics_enable": "Bật thống kê",
|
"statistics_enable": "Bật thống kê",
|
||||||
"ignore_domains": "Các miền bị bỏ qua (cách nhau bởi dòng mới)",
|
|
||||||
"ignore_domains_title": "Các miền bị bỏ qua",
|
|
||||||
"ignore_domains_desc_stats": "Các truy vấn cho các miền này sẽ không được ghi vào thống kê",
|
|
||||||
"ignore_domains_desc_query": "Các truy vấn cho các miền này sẽ không được ghi vào nhật ký truy vấn",
|
|
||||||
"interval_hours": "{{count}} giờ",
|
"interval_hours": "{{count}} giờ",
|
||||||
"interval_hours_plural": "{{count}} giờ",
|
"interval_hours_plural": "{{count}} giờ",
|
||||||
"filters_configuration": "Cấu hình bộ lọc",
|
"filters_configuration": "Cấu hình bộ lọc",
|
||||||
@@ -655,30 +642,5 @@
|
|||||||
"anonymizer_notification": "<0> Lưu ý:</0> Tính năng ẩn danh IP được bật. Bạn có thể tắt nó trong <1> Cài đặt chung</1>.",
|
"anonymizer_notification": "<0> Lưu ý:</0> Tính năng ẩn danh IP được bật. Bạn có thể tắt nó trong <1> Cài đặt chung</1>.",
|
||||||
"confirm_dns_cache_clear": "Bạn có chắc chắn muốn xóa bộ đệm ẩn DNS không?",
|
"confirm_dns_cache_clear": "Bạn có chắc chắn muốn xóa bộ đệm ẩn DNS không?",
|
||||||
"cache_cleared": "Đã xóa thành công bộ đệm DNS",
|
"cache_cleared": "Đã xóa thành công bộ đệm DNS",
|
||||||
"clear_cache": "Xóa bộ nhớ cache",
|
"clear_cache": "Xóa bộ nhớ cache"
|
||||||
"make_static": "Chuyển sang tĩnh",
|
|
||||||
"theme_auto_desc": "Tự động (dựa trên chủ đề màu của thiết bị của bạn)",
|
|
||||||
"theme_dark_desc": "Chủ đề tối",
|
|
||||||
"theme_light_desc": "Chủ đề sáng",
|
|
||||||
"disable_for_seconds": "Trong {{count}} giây",
|
|
||||||
"disable_for_seconds_plural": "Trong {{count}} giây",
|
|
||||||
"disable_for_minutes": "Trong {{count}} phút",
|
|
||||||
"disable_for_minutes_plural": "Trong {{count}} phút",
|
|
||||||
"disable_for_hours": "Trong {{count}} giờ",
|
|
||||||
"disable_for_hours_plural": "Trong {{count}} giờ",
|
|
||||||
"disable_until_tomorrow": "Cho đến ngày mai",
|
|
||||||
"disable_notify_for_seconds": "Tắt bảo vệ trong {{count}} giây",
|
|
||||||
"disable_notify_for_seconds_plural": "Tắt bảo vệ trong {{count}} giây",
|
|
||||||
"disable_notify_for_minutes": "Tắt bảo vệ trong {{count}} phút",
|
|
||||||
"disable_notify_for_minutes_plural": "Tắt bảo vệ trong {{count}} phút",
|
|
||||||
"disable_notify_for_hours": "Tắt bảo vệ trong {{count}} giờ",
|
|
||||||
"disable_notify_for_hours_plural": "Tắt bảo vệ trong {{count}} giờ",
|
|
||||||
"disable_notify_until_tomorrow": "Vô hiệu hóa bảo vệ cho đến ngày mai",
|
|
||||||
"enable_protection_timer": "Bảo vệ sẽ được bật trong {{time}}",
|
|
||||||
"custom_retention_input": "Nhập thời gian giữ lại theo giờ",
|
|
||||||
"custom_rotation_input": "Nhập chu kỳ theo giờ",
|
|
||||||
"protection_section_label": "Sự bảo vệ",
|
|
||||||
"log_and_stats_section_label": "Nhật ký truy vấn và thống kê",
|
|
||||||
"ignore_query_log": "Bỏ qua máy khách này trong nhật ký truy vấn",
|
|
||||||
"ignore_statistics": "Bỏ qua máy khách này trong thống kê"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "客户端排行",
|
"top_clients": "客户端排行",
|
||||||
"no_clients_found": "未找到客户端",
|
"no_clients_found": "未找到客户端",
|
||||||
"general_statistics": "概况统计",
|
"general_statistics": "概况统计",
|
||||||
"top_upstreams": "经常请求的上游服务器",
|
|
||||||
"no_upstreams_data_found": "未找到上游服务器数据",
|
|
||||||
"number_of_dns_query_days": "过去 {{count}} 天内处理的 DNS 查询总数",
|
"number_of_dns_query_days": "过去 {{count}} 天内处理的 DNS 查询总数",
|
||||||
"number_of_dns_query_days_plural": "在过去的 {{count}} 天内处理了多少个 DNS 查询",
|
"number_of_dns_query_days_plural": "在过去的 {{count}} 天内处理了多少个 DNS 查询",
|
||||||
"number_of_dns_query_24_hours": "过去 24 小时内处理的 DNS 请求总数",
|
"number_of_dns_query_24_hours": "过去 24 小时内处理的 DNS 请求总数",
|
||||||
@@ -136,7 +134,6 @@
|
|||||||
"enforced_save_search": "强制安全搜索",
|
"enforced_save_search": "强制安全搜索",
|
||||||
"number_of_dns_query_to_safe_search": "启用强制安全搜索后对搜索引擎的 DNS 请求总数",
|
"number_of_dns_query_to_safe_search": "启用强制安全搜索后对搜索引擎的 DNS 请求总数",
|
||||||
"average_processing_time": "平均处理时间",
|
"average_processing_time": "平均处理时间",
|
||||||
"processing_time": "处理时间",
|
|
||||||
"average_processing_time_hint": "处理 DNS 请求的平均时间(毫秒)",
|
"average_processing_time_hint": "处理 DNS 请求的平均时间(毫秒)",
|
||||||
"block_domain_use_filters_and_hosts": "使用过滤器和 Hosts 文件以拦截指定域名",
|
"block_domain_use_filters_and_hosts": "使用过滤器和 Hosts 文件以拦截指定域名",
|
||||||
"filters_block_toggle_hint": "你可以在 <a>过滤器</a> 设置中添加过滤规则。",
|
"filters_block_toggle_hint": "你可以在 <a>过滤器</a> 设置中添加过滤规则。",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "配置路径{{path}}",
|
"upstream_dns_configured_in_file": "配置路径{{path}}",
|
||||||
"test_upstream_btn": "测试上游 DNS",
|
"test_upstream_btn": "测试上游 DNS",
|
||||||
"upstreams": "上游服务器",
|
"upstreams": "上游服务器",
|
||||||
"upstream": "上游服务器",
|
|
||||||
"apply_btn": "应用",
|
"apply_btn": "应用",
|
||||||
"disabled_filtering_toast": "过滤器已禁用",
|
"disabled_filtering_toast": "过滤器已禁用",
|
||||||
"enabled_filtering_toast": "过滤器已启用",
|
"enabled_filtering_toast": "过滤器已启用",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "查询日志已成功清除",
|
"query_log_cleared": "查询日志已成功清除",
|
||||||
"query_log_updated": "已成功更新查询日志",
|
"query_log_updated": "已成功更新查询日志",
|
||||||
"query_log_clear": "清除查询日志",
|
"query_log_clear": "清除查询日志",
|
||||||
"query_log_retention": "查询日志保留时间",
|
"query_log_retention": "查询记录保留时间",
|
||||||
"query_log_enable": "启用日志",
|
"query_log_enable": "启用日志",
|
||||||
"query_log_configuration": "日志配置",
|
"query_log_configuration": "日志配置",
|
||||||
"query_log_disabled": "查询日志已禁用,在<0>这些设置</0>中能配置它们",
|
"query_log_disabled": "查询日志已禁用,在<0>这些设置</0>中能配置它们",
|
||||||
"query_log_strict_search": "使用双引号进行严谨搜索",
|
"query_log_strict_search": "使用双引号进行严谨搜索",
|
||||||
"query_log_retention_confirm": "您确定要更改查询记录保留时间吗?如果减少时间间隔数值,某些数据可能会丢失",
|
"query_log_retention_confirm": "您确定要更改查询记录保留时间吗? 如果您减少间隔时间的值, 某些数据可能会丢失。",
|
||||||
"anonymize_client_ip": "匿名化客户端IP",
|
"anonymize_client_ip": "匿名化客户端IP",
|
||||||
"anonymize_client_ip_desc": "不要在日志和统计信息中保存客户端的完整 IP 地址",
|
"anonymize_client_ip_desc": "不要在日志和统计信息中保存客户端的完整 IP 地址",
|
||||||
"dns_config": "DNS 服务配置",
|
"dns_config": "DNS 服务配置",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "您确定要删除客户端 \"{{key}}\"?",
|
"client_confirm_delete": "您确定要删除客户端 \"{{key}}\"?",
|
||||||
"list_confirm_delete": "您确定要删除此列表吗?",
|
"list_confirm_delete": "您确定要删除此列表吗?",
|
||||||
"auto_clients_title": "客户端(运行时间)",
|
"auto_clients_title": "客户端(运行时间)",
|
||||||
"auto_clients_desc": "有关正在使用或可能使用 AdGuard Home 的设备的 IP 地址的信息。此信息是从多个来源收集的,包括 hosts 文件、反向 DNS 等。",
|
"auto_clients_desc": "不在可继续使用 AdGuard Home 的持久客户端列表中的设备。",
|
||||||
"access_title": "访问设置",
|
"access_title": "访问设置",
|
||||||
"access_desc": "您可以在此处配置 AdGuard Home 的 DNS 服务器的访问规则",
|
"access_desc": "您可以在此处配置 AdGuard Home 的 DNS 服务器的访问规则",
|
||||||
"access_allowed_title": "允许的客户端",
|
"access_allowed_title": "允许的客户端",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "为了使用 <1>DNS-over-HTTPS</1> 或者 <1>DNS-over-TLS</1> ,您需要在 AdGuard Home 设置中 <0>配置加密</0> 。",
|
"setup_dns_notice": "为了使用 <1>DNS-over-HTTPS</1> 或者 <1>DNS-over-TLS</1> ,您需要在 AdGuard Home 设置中 <0>配置加密</0> 。",
|
||||||
"rewrite_added": "已成功添加 \"{{key}}\" 的 DNS 重写",
|
"rewrite_added": "已成功添加 \"{{key}}\" 的 DNS 重写",
|
||||||
"rewrite_deleted": "已成功删除 \"{{key}}\" 的 DNS 重写",
|
"rewrite_deleted": "已成功删除 \"{{key}}\" 的 DNS 重写",
|
||||||
"rewrite_updated": "DNS 重写已成功更新",
|
|
||||||
"rewrite_add": "添加 DNS 重写",
|
"rewrite_add": "添加 DNS 重写",
|
||||||
"rewrite_edit": "编辑 DNS 重写",
|
|
||||||
"rewrite_not_found": "未找到 DNS 重写",
|
"rewrite_not_found": "未找到 DNS 重写",
|
||||||
"rewrite_confirm_delete": "您确定要删除 \"{{key}}\" 的 DNS 重写?",
|
"rewrite_confirm_delete": "您确定要删除 \"{{key}}\" 的 DNS 重写?",
|
||||||
"rewrite_desc": "可以轻松地为特定域名配置自定义 DNS 响应。",
|
"rewrite_desc": "可以轻松地为特定域名配置自定义 DNS 响应。",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "禁用保护 {{count}} 小时",
|
"disable_notify_for_hours": "禁用保护 {{count}} 小时",
|
||||||
"disable_notify_for_hours_plural": "禁用保护 {{count}} 小时",
|
"disable_notify_for_hours_plural": "禁用保护 {{count}} 小时",
|
||||||
"disable_notify_until_tomorrow": "禁用保护直到明天",
|
"disable_notify_until_tomorrow": "禁用保护直到明天",
|
||||||
"enable_protection_timer": "保护将于 {{time}} 启用",
|
"enable_protection_timer": "保护将于 {{time}} 启用"
|
||||||
"custom_retention_input": "输入保留时间(小时)",
|
|
||||||
"custom_rotation_input": "输入旋转时间(小时)",
|
|
||||||
"protection_section_label": "防护",
|
|
||||||
"log_and_stats_section_label": "查询日志和统计数据",
|
|
||||||
"ignore_query_log": "在查询日志中忽略此客户端",
|
|
||||||
"ignore_statistics": "在统计数据中忽略此客户端"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
"out_of_range_error": "必須介於 \"{{start}}\" - \"{{end}}\" 範圍之外",
|
"out_of_range_error": "必須介於 \"{{start}}\" - \"{{end}}\" 範圍之外",
|
||||||
"lower_range_start_error": "必須小於起始值",
|
"lower_range_start_error": "必須小於起始值",
|
||||||
"greater_range_start_error": "必須大於起始值",
|
"greater_range_start_error": "必須大於起始值",
|
||||||
"gateway_or_subnet_invalid": "無效子網路",
|
|
||||||
"dhcp_form_gateway_input": "閘道 IP 位址",
|
"dhcp_form_gateway_input": "閘道 IP 位址",
|
||||||
"dhcp_form_subnet_input": "子網路遮罩",
|
"dhcp_form_subnet_input": "子網路遮罩",
|
||||||
"dhcp_form_range_title": "IP 位址範圍",
|
"dhcp_form_range_title": "IP 位址範圍",
|
||||||
@@ -164,7 +163,7 @@
|
|||||||
"disabled_parental_toast": "已停用家長監護",
|
"disabled_parental_toast": "已停用家長監護",
|
||||||
"enabled_parental_toast": "已啟用家長監護",
|
"enabled_parental_toast": "已啟用家長監護",
|
||||||
"disabled_safe_search_toast": "已停用安全搜尋",
|
"disabled_safe_search_toast": "已停用安全搜尋",
|
||||||
"updated_save_search_toast": "已更新安全搜尋設定",
|
"enabled_save_search_toast": "已啟用安全搜尋",
|
||||||
"enabled_table_header": "啟用",
|
"enabled_table_header": "啟用",
|
||||||
"name_table_header": "名稱",
|
"name_table_header": "名稱",
|
||||||
"list_url_table_header": "清單 URL 網址",
|
"list_url_table_header": "清單 URL 網址",
|
||||||
@@ -196,7 +195,6 @@
|
|||||||
"form_error_url_or_path_format": "列表中含有的 URL 網址或絕對路徑",
|
"form_error_url_or_path_format": "列表中含有的 URL 網址或絕對路徑",
|
||||||
"custom_filter_rules": "自訂過濾規則",
|
"custom_filter_rules": "自訂過濾規則",
|
||||||
"custom_filter_rules_hint": "一行一條規則。您可以使用「adblock」語法或「hosts檔案」的語法。",
|
"custom_filter_rules_hint": "一行一條規則。您可以使用「adblock」語法或「hosts檔案」的語法。",
|
||||||
"system_host_files": "系統 hosts 檔案",
|
|
||||||
"examples_title": "範例",
|
"examples_title": "範例",
|
||||||
"example_meaning_filter_block": "封鎖對 example.org 網域及其所有子網域的存取",
|
"example_meaning_filter_block": "封鎖對 example.org 網域及其所有子網域的存取",
|
||||||
"example_meaning_filter_whitelist": "解除對 example.org 網域及其所有子網域存取封鎖",
|
"example_meaning_filter_whitelist": "解除對 example.org 網域及其所有子網域存取封鎖",
|
||||||
@@ -211,10 +209,6 @@
|
|||||||
"example_upstream_doq": "加密 <0>DNS-over-QUIC</0>",
|
"example_upstream_doq": "加密 <0>DNS-over-QUIC</0>",
|
||||||
"example_upstream_sdns": "您可以使透過 <0>DNS Stamps</0> 來解析 <1>DNSCrypt</1> 或 <2>DNS-over-HTTPS</2>",
|
"example_upstream_sdns": "您可以使透過 <0>DNS Stamps</0> 來解析 <1>DNSCrypt</1> 或 <2>DNS-over-HTTPS</2>",
|
||||||
"example_upstream_tcp": "一般 DNS(透過 TCP)",
|
"example_upstream_tcp": "一般 DNS(透過 TCP)",
|
||||||
"example_upstream_regular_port": "一般 DNS(透過 UDP,連接埠)",
|
|
||||||
"example_upstream_udp": "一般 DNS(透過 UDP,主機名稱)",
|
|
||||||
"example_upstream_tcp_port": "一般 DNS(透過 TCP,連接埠)",
|
|
||||||
"example_upstream_tcp_hostname": "一般 DNS(透過 TCP,主機名稱)",
|
|
||||||
"all_lists_up_to_date_toast": "所有清單已更新至最新",
|
"all_lists_up_to_date_toast": "所有清單已更新至最新",
|
||||||
"dns_test_ok_toast": "設定中的 DNS 上游運作正常",
|
"dns_test_ok_toast": "設定中的 DNS 上游運作正常",
|
||||||
"dns_test_not_ok_toast": "DNS 設定中的 \"{{key}}\" 出現錯誤,請確認是否正確輸入",
|
"dns_test_not_ok_toast": "DNS 設定中的 \"{{key}}\" 出現錯誤,請確認是否正確輸入",
|
||||||
@@ -285,8 +279,6 @@
|
|||||||
"rate_limit": "速率限制",
|
"rate_limit": "速率限制",
|
||||||
"edns_enable": "啟用 EDNS Client Subnet",
|
"edns_enable": "啟用 EDNS Client Subnet",
|
||||||
"edns_cs_desc": "傳送用戶端的子網路給 DNS 伺服器。",
|
"edns_cs_desc": "傳送用戶端的子網路給 DNS 伺服器。",
|
||||||
"edns_use_custom_ip": "使用自訂 EDNS IP",
|
|
||||||
"edns_use_custom_ip_desc": "允許使用自訂 EDNS IP",
|
|
||||||
"rate_limit_desc": "限制單一裝置每秒發出的查詢次數(設定為 0 即表示無限制)",
|
"rate_limit_desc": "限制單一裝置每秒發出的查詢次數(設定為 0 即表示無限制)",
|
||||||
"blocking_ipv4_desc": "回覆指定 IPv4 位址給被封鎖的網域的 A 紀錄查詢",
|
"blocking_ipv4_desc": "回覆指定 IPv4 位址給被封鎖的網域的 A 紀錄查詢",
|
||||||
"blocking_ipv6_desc": "回覆指定 IPv6 位址給被封鎖的網域的 AAAA 紀錄查詢",
|
"blocking_ipv6_desc": "回覆指定 IPv6 位址給被封鎖的網域的 AAAA 紀錄查詢",
|
||||||
@@ -295,9 +287,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN:回應 NXDOMAIN 狀態碼",
|
"blocking_mode_nxdomain": "NXDOMAIN:回應 NXDOMAIN 狀態碼",
|
||||||
"blocking_mode_null_ip": "Null IP:回應零值的 IP 位址(A 紀錄回應 0.0.0.0 ,AAAA 紀錄回應 ::)",
|
"blocking_mode_null_ip": "Null IP:回應零值的 IP 位址(A 紀錄回應 0.0.0.0 ,AAAA 紀錄回應 ::)",
|
||||||
"blocking_mode_custom_ip": "自訂 IP 位址:回應一個自訂的 IP 位址",
|
"blocking_mode_custom_ip": "自訂 IP 位址:回應一個自訂的 IP 位址",
|
||||||
"theme_auto": "自動",
|
|
||||||
"theme_light": "明亮",
|
|
||||||
"theme_dark": "深色",
|
|
||||||
"upstream_dns_client_desc": "如果您將此欄位留白,AdGuard Home 將使用 <0>DNS 設定</0> 內的設定的 DNS 伺服器。",
|
"upstream_dns_client_desc": "如果您將此欄位留白,AdGuard Home 將使用 <0>DNS 設定</0> 內的設定的 DNS 伺服器。",
|
||||||
"tracker_source": "追蹤器來源",
|
"tracker_source": "追蹤器來源",
|
||||||
"source_label": "來源",
|
"source_label": "來源",
|
||||||
@@ -408,7 +397,6 @@
|
|||||||
"dns_providers": "下列為常見的<0> DNS 伺服器</0>。",
|
"dns_providers": "下列為常見的<0> DNS 伺服器</0>。",
|
||||||
"update_now": "立即更新",
|
"update_now": "立即更新",
|
||||||
"update_failed": "自動更新發生錯誤。請嘗試依照<a>以下步驟</a> 來手動更新。",
|
"update_failed": "自動更新發生錯誤。請嘗試依照<a>以下步驟</a> 來手動更新。",
|
||||||
"manual_update": "請嘗試依照<a>下列步驟</a>來手動更新。",
|
|
||||||
"processing_update": "請稍候,AdGuard Home 正在更新",
|
"processing_update": "請稍候,AdGuard Home 正在更新",
|
||||||
"clients_title": "用戶端",
|
"clients_title": "用戶端",
|
||||||
"clients_desc": "對已連接到 AdGuard Home 的裝置進行設定",
|
"clients_desc": "對已連接到 AdGuard Home 的裝置進行設定",
|
||||||
@@ -472,7 +460,6 @@
|
|||||||
"rewrite_added": "「{{key}}」的 DNS 覆寫新增成功",
|
"rewrite_added": "「{{key}}」的 DNS 覆寫新增成功",
|
||||||
"rewrite_deleted": "「{{key}}」的 DNS 覆寫刪除成功",
|
"rewrite_deleted": "「{{key}}」的 DNS 覆寫刪除成功",
|
||||||
"rewrite_add": "新增 DNS 覆寫",
|
"rewrite_add": "新增 DNS 覆寫",
|
||||||
"rewrite_edit": "編輯 DNS 覆寫",
|
|
||||||
"rewrite_not_found": "找不到 DNS 覆寫",
|
"rewrite_not_found": "找不到 DNS 覆寫",
|
||||||
"rewrite_confirm_delete": "您確定要刪除 \"{{key}}\" 的 DNS 覆寫?",
|
"rewrite_confirm_delete": "您確定要刪除 \"{{key}}\" 的 DNS 覆寫?",
|
||||||
"rewrite_desc": "提供簡單的方式對特定網域自訂 DNS 回應。",
|
"rewrite_desc": "提供簡單的方式對特定網域自訂 DNS 回應。",
|
||||||
@@ -506,7 +493,6 @@
|
|||||||
"interval_days": "{{count}} 天",
|
"interval_days": "{{count}} 天",
|
||||||
"interval_days_plural": "{{count}} 天",
|
"interval_days_plural": "{{count}} 天",
|
||||||
"domain": "網域",
|
"domain": "網域",
|
||||||
"ecs": "EDNS 子網",
|
|
||||||
"punycode": "Punycode",
|
"punycode": "Punycode",
|
||||||
"answer": "回應",
|
"answer": "回應",
|
||||||
"filter_added_successfully": "已成功新增清單",
|
"filter_added_successfully": "已成功新增清單",
|
||||||
@@ -519,9 +505,6 @@
|
|||||||
"statistics_clear_confirm": "您確定要清除統計資料嗎?",
|
"statistics_clear_confirm": "您確定要清除統計資料嗎?",
|
||||||
"statistics_retention_confirm": "您確定要更改統計資料保存時間嗎?如果您縮短期限部分資料可能將會遺失",
|
"statistics_retention_confirm": "您確定要更改統計資料保存時間嗎?如果您縮短期限部分資料可能將會遺失",
|
||||||
"statistics_cleared": "已清除統計資料",
|
"statistics_cleared": "已清除統計資料",
|
||||||
"statistics_enable": "啟用統計數據",
|
|
||||||
"ignore_domains": "已忽略網域(每行一個)",
|
|
||||||
"ignore_domains_title": "已忽略網域",
|
|
||||||
"interval_hours": "{{count}} 小時",
|
"interval_hours": "{{count}} 小時",
|
||||||
"interval_hours_plural": "{{count}} 小時",
|
"interval_hours_plural": "{{count}} 小時",
|
||||||
"filters_configuration": "過濾器設定",
|
"filters_configuration": "過濾器設定",
|
||||||
@@ -630,23 +613,5 @@
|
|||||||
"original_response": "原始回應",
|
"original_response": "原始回應",
|
||||||
"click_to_view_queries": "按一下以檢視查詢結果",
|
"click_to_view_queries": "按一下以檢視查詢結果",
|
||||||
"port_53_faq_link": "連接埠 53 經常被「DNSStubListener」或「systemd-resolved」服務佔用。請閱讀下列有關解決<0>這個問題</0>的說明",
|
"port_53_faq_link": "連接埠 53 經常被「DNSStubListener」或「systemd-resolved」服務佔用。請閱讀下列有關解決<0>這個問題</0>的說明",
|
||||||
"adg_will_drop_dns_queries": "AdGuard Home 將停止回應此用戶端的所有 DNS 查詢。",
|
"adg_will_drop_dns_queries": "AdGuard Home 將停止回應此用戶端的所有 DNS 查詢。"
|
||||||
"safe_browsing": "安全瀏覽",
|
|
||||||
"served_from_cache": "{{value}} <i>(由快取回應)</i>",
|
|
||||||
"form_error_password_length": "密碼必須至少 {{value}} 個字元長度",
|
|
||||||
"make_static": "新增為靜態",
|
|
||||||
"theme_dark_desc": "深色主題",
|
|
||||||
"theme_light_desc": "淺色主題",
|
|
||||||
"disable_for_seconds": "{{count}} 秒",
|
|
||||||
"disable_for_seconds_plural": "{{count}} 秒",
|
|
||||||
"disable_for_minutes": "{{count}} 分鐘",
|
|
||||||
"disable_for_minutes_plural": "{{count}} 分鐘",
|
|
||||||
"disable_for_hours": "{{count}} 小時",
|
|
||||||
"disable_for_hours_plural": "{{count}} 小時",
|
|
||||||
"disable_until_tomorrow": "直到明天",
|
|
||||||
"disable_notify_for_seconds": "暫停防護 {{count}} 秒",
|
|
||||||
"disable_notify_for_seconds_plural": "暫停防護 {{count}} 秒",
|
|
||||||
"disable_notify_for_minutes": "暫停防護 {{count}} 分鐘",
|
|
||||||
"disable_notify_for_minutes_plural": "暫停防護 {{count}} 分鐘",
|
|
||||||
"disable_notify_for_hours": "暫停防護 {{count}} 小時"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
"top_clients": "熱門用戶端",
|
"top_clients": "熱門用戶端",
|
||||||
"no_clients_found": "無已發現之用戶端",
|
"no_clients_found": "無已發現之用戶端",
|
||||||
"general_statistics": "一般的統計資料",
|
"general_statistics": "一般的統計資料",
|
||||||
"top_upstreams": "經常請求的上游伺服器",
|
|
||||||
"no_upstreams_data_found": "找不到上游伺服器資料",
|
|
||||||
"number_of_dns_query_days": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
|
"number_of_dns_query_days": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
|
||||||
"number_of_dns_query_days_plural": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
|
"number_of_dns_query_days_plural": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
|
||||||
"number_of_dns_query_24_hours": "在最近的 24 小時內已處理的 DNS 查詢之數量",
|
"number_of_dns_query_24_hours": "在最近的 24 小時內已處理的 DNS 查詢之數量",
|
||||||
@@ -136,14 +134,13 @@
|
|||||||
"enforced_save_search": "已強制執行的安全搜尋",
|
"enforced_save_search": "已強制執行的安全搜尋",
|
||||||
"number_of_dns_query_to_safe_search": "安全搜尋已被強制執行之屬於搜尋引擎的 DNS 請求之數量",
|
"number_of_dns_query_to_safe_search": "安全搜尋已被強制執行之屬於搜尋引擎的 DNS 請求之數量",
|
||||||
"average_processing_time": "平均的處理時間",
|
"average_processing_time": "平均的處理時間",
|
||||||
"processing_time": "處理時間",
|
|
||||||
"average_processing_time_hint": "在處理一項 DNS 請求時以毫秒(ms)計的平均時間",
|
"average_processing_time_hint": "在處理一項 DNS 請求時以毫秒(ms)計的平均時間",
|
||||||
"block_domain_use_filters_and_hosts": "透過過濾器和主機檔案封鎖網域",
|
"block_domain_use_filters_and_hosts": "透過過濾器和主機檔案封鎖網域",
|
||||||
"filters_block_toggle_hint": "您可在<a>過濾器</a>設定中設置封鎖規則。",
|
"filters_block_toggle_hint": "您可在<a>過濾器</a>設定中設置封鎖規則。",
|
||||||
"use_adguard_browsing_sec": "使用 AdGuard 瀏覽安全網路服務",
|
"use_adguard_browsing_sec": "使用 AdGuard 瀏覽安全網路服務",
|
||||||
"use_adguard_browsing_sec_hint": "AdGuard Home 將檢查該網域是否被瀏覽安全網路服務封鎖。它將使用對隱私友好的查找應用程式介面(API)以執行檢查:僅域名 SHA256 雜湊的短前綴被傳送到該伺服器。",
|
"use_adguard_browsing_sec_hint": "AdGuard Home 將檢查該網域是否被瀏覽安全網路服務封鎖。它將使用友好的隱私查找應用程式介面(API)以執行檢查:僅域名 SHA256 雜湊的短前綴被傳送到該伺服器。",
|
||||||
"use_adguard_parental": "使用 AdGuard 家長控制之網路服務",
|
"use_adguard_parental": "使用 AdGuard 家長控制之網路服務",
|
||||||
"use_adguard_parental_hint": "AdGuard Home 將檢查網域是否包含成人資料。它使用如同瀏覽安全網路服務一樣之對隱私友好的應用程式介面(API)。",
|
"use_adguard_parental_hint": "AdGuard Home 將檢查網域是否包含成人資料。它使用如同瀏覽安全網路服務一樣之友好的隱私應用程式介面(API)。",
|
||||||
"enforce_safe_search": "使用安全搜尋",
|
"enforce_safe_search": "使用安全搜尋",
|
||||||
"enforce_save_search_hint": "AdGuard Home 將在下列的搜尋引擎:Google、YouTube、Bing、DuckDuckGo、Yandex 和 Pixabay 中強制執行安全搜尋。",
|
"enforce_save_search_hint": "AdGuard Home 將在下列的搜尋引擎:Google、YouTube、Bing、DuckDuckGo、Yandex 和 Pixabay 中強制執行安全搜尋。",
|
||||||
"no_servers_specified": "無已明確指定的伺服器",
|
"no_servers_specified": "無已明確指定的伺服器",
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
"upstream_dns_configured_in_file": "被配置在 {{path}}",
|
"upstream_dns_configured_in_file": "被配置在 {{path}}",
|
||||||
"test_upstream_btn": "測試上行資料流",
|
"test_upstream_btn": "測試上行資料流",
|
||||||
"upstreams": "上游",
|
"upstreams": "上游",
|
||||||
"upstream": "上游伺服器",
|
|
||||||
"apply_btn": "套用",
|
"apply_btn": "套用",
|
||||||
"disabled_filtering_toast": "已禁用過濾",
|
"disabled_filtering_toast": "已禁用過濾",
|
||||||
"enabled_filtering_toast": "已啟用過濾",
|
"enabled_filtering_toast": "已啟用過濾",
|
||||||
@@ -261,12 +257,12 @@
|
|||||||
"query_log_cleared": "該查詢記錄已被成功地清除",
|
"query_log_cleared": "該查詢記錄已被成功地清除",
|
||||||
"query_log_updated": "該查詢記錄已被成功地更新",
|
"query_log_updated": "該查詢記錄已被成功地更新",
|
||||||
"query_log_clear": "清除查詢記錄",
|
"query_log_clear": "清除查詢記錄",
|
||||||
"query_log_retention": "查詢記錄保留時間",
|
"query_log_retention": "查詢記錄保留",
|
||||||
"query_log_enable": "啟用記錄",
|
"query_log_enable": "啟用記錄",
|
||||||
"query_log_configuration": "記錄配置",
|
"query_log_configuration": "記錄配置",
|
||||||
"query_log_disabled": "查詢記錄被禁用並可在<0>設定</0>中被配置",
|
"query_log_disabled": "查詢記錄被禁用並可在<0>設定</0>中被配置",
|
||||||
"query_log_strict_search": "使用雙引號於嚴謹的搜尋",
|
"query_log_strict_search": "使用雙引號於嚴謹的搜尋",
|
||||||
"query_log_retention_confirm": "您確定要更改記錄檔保存期限嗎?如果您縮短期限部分資料可能將會遺失",
|
"query_log_retention_confirm": "您確定您想要更改查詢記錄保留嗎?如果您減少該間隔值,某些資料將被丟失",
|
||||||
"anonymize_client_ip": "將用戶端 IP 匿名",
|
"anonymize_client_ip": "將用戶端 IP 匿名",
|
||||||
"anonymize_client_ip_desc": "不要儲存用戶端之完整的 IP 位址到記錄或統計資料裡",
|
"anonymize_client_ip_desc": "不要儲存用戶端之完整的 IP 位址到記錄或統計資料裡",
|
||||||
"dns_config": "DNS 伺服器配置",
|
"dns_config": "DNS 伺服器配置",
|
||||||
@@ -448,7 +444,7 @@
|
|||||||
"client_confirm_delete": "您確定您想要刪除用戶端 \"{{key}}\" 嗎?",
|
"client_confirm_delete": "您確定您想要刪除用戶端 \"{{key}}\" 嗎?",
|
||||||
"list_confirm_delete": "您確定您想要刪除該清單嗎?",
|
"list_confirm_delete": "您確定您想要刪除該清單嗎?",
|
||||||
"auto_clients_title": "執行時期用戶端",
|
"auto_clients_title": "執行時期用戶端",
|
||||||
"auto_clients_desc": "AdGuard Home 使用或可能使用的裝置的 IP 地址資訊。這些資訊來自多個來源,包括主機檔案、反向 DNS 等。",
|
"auto_clients_desc": "未於可能仍然使用 AdGuard Home 的持續性用戶端之清單上的裝置",
|
||||||
"access_title": "存取設定",
|
"access_title": "存取設定",
|
||||||
"access_desc": "於此您可配置用於 AdGuard Home DNS 伺服器之存取規則",
|
"access_desc": "於此您可配置用於 AdGuard Home DNS 伺服器之存取規則",
|
||||||
"access_allowed_title": "已允許的用戶端",
|
"access_allowed_title": "已允許的用戶端",
|
||||||
@@ -482,9 +478,7 @@
|
|||||||
"setup_dns_notice": "為了使用 <1>DNS-over-HTTPS</1> 或 <1>DNS-over-TLS</1>,您需要在 AdGuard Home 設定裡<0>配置加密</0>。",
|
"setup_dns_notice": "為了使用 <1>DNS-over-HTTPS</1> 或 <1>DNS-over-TLS</1>,您需要在 AdGuard Home 設定裡<0>配置加密</0>。",
|
||||||
"rewrite_added": "對於 \"{{key}}\" 之 DNS 改寫被成功地加入",
|
"rewrite_added": "對於 \"{{key}}\" 之 DNS 改寫被成功地加入",
|
||||||
"rewrite_deleted": "對於 \"{{key}}\" 之 DNS 改寫被成功地刪除",
|
"rewrite_deleted": "對於 \"{{key}}\" 之 DNS 改寫被成功地刪除",
|
||||||
"rewrite_updated": "DNS 重寫已成功更新",
|
|
||||||
"rewrite_add": "新增 DNS 改寫",
|
"rewrite_add": "新增 DNS 改寫",
|
||||||
"rewrite_edit": "編輯 DNS 重寫",
|
|
||||||
"rewrite_not_found": "無已發現之 DNS 改寫",
|
"rewrite_not_found": "無已發現之 DNS 改寫",
|
||||||
"rewrite_confirm_delete": "您確定您想要刪除對於 \"{{key}}\" 之 DNS 改寫嗎?",
|
"rewrite_confirm_delete": "您確定您想要刪除對於 \"{{key}}\" 之 DNS 改寫嗎?",
|
||||||
"rewrite_desc": "允許輕易地配置自訂的 DNS 回應供特定的域名。",
|
"rewrite_desc": "允許輕易地配置自訂的 DNS 回應供特定的域名。",
|
||||||
@@ -674,11 +668,5 @@
|
|||||||
"disable_notify_for_hours": "計 {{count}} 小時禁用防護",
|
"disable_notify_for_hours": "計 {{count}} 小時禁用防護",
|
||||||
"disable_notify_for_hours_plural": "計 {{count}} 小時禁用防護",
|
"disable_notify_for_hours_plural": "計 {{count}} 小時禁用防護",
|
||||||
"disable_notify_until_tomorrow": "禁用防護直到明天",
|
"disable_notify_until_tomorrow": "禁用防護直到明天",
|
||||||
"enable_protection_timer": "防護將於 {{time}} 被啟用",
|
"enable_protection_timer": "防護將於 {{time}} 被啟用"
|
||||||
"custom_retention_input": "輸入保留時間(小時)",
|
|
||||||
"custom_rotation_input": "輸入旋轉時間(小時)",
|
|
||||||
"protection_section_label": "防護",
|
|
||||||
"log_and_stats_section_label": "查詢記錄和統計資料",
|
|
||||||
"ignore_query_log": "在查詢記錄中忽略此用戶端",
|
|
||||||
"ignore_statistics": "在統計資料中忽略此用戶端"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,29 +38,6 @@ export const addRewrite = (config) => async (dispatch) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const updateRewriteRequest = createAction('UPDATE_REWRITE_REQUEST');
|
|
||||||
export const updateRewriteFailure = createAction('UPDATE_REWRITE_FAILURE');
|
|
||||||
export const updateRewriteSuccess = createAction('UPDATE_REWRITE_SUCCESS');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} config
|
|
||||||
* @param {string} config.target - current DNS rewrite value
|
|
||||||
* @param {string} config.update - updated DNS rewrite value
|
|
||||||
*/
|
|
||||||
export const updateRewrite = (config) => async (dispatch) => {
|
|
||||||
dispatch(updateRewriteRequest());
|
|
||||||
try {
|
|
||||||
await apiClient.updateRewrite(config);
|
|
||||||
dispatch(updateRewriteSuccess());
|
|
||||||
dispatch(toggleRewritesModal());
|
|
||||||
dispatch(getRewritesList());
|
|
||||||
dispatch(addSuccessToast(i18next.t('rewrite_updated', { key: config.domain })));
|
|
||||||
} catch (error) {
|
|
||||||
dispatch(addErrorToast({ error }));
|
|
||||||
dispatch(updateRewriteFailure());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteRewriteRequest = createAction('DELETE_REWRITE_REQUEST');
|
export const deleteRewriteRequest = createAction('DELETE_REWRITE_REQUEST');
|
||||||
export const deleteRewriteFailure = createAction('DELETE_REWRITE_FAILURE');
|
export const deleteRewriteFailure = createAction('DELETE_REWRITE_FAILURE');
|
||||||
export const deleteRewriteSuccess = createAction('DELETE_REWRITE_SUCCESS');
|
export const deleteRewriteSuccess = createAction('DELETE_REWRITE_SUCCESS');
|
||||||
|
|||||||
@@ -56,8 +56,6 @@ export const getStats = () => async (dispatch) => {
|
|||||||
top_clients: topClientsWithInfo,
|
top_clients: topClientsWithInfo,
|
||||||
top_queried_domains: normalizeTopStats(stats.top_queried_domains),
|
top_queried_domains: normalizeTopStats(stats.top_queried_domains),
|
||||||
avg_processing_time: secondsToMilliseconds(stats.avg_processing_time),
|
avg_processing_time: secondsToMilliseconds(stats.avg_processing_time),
|
||||||
top_upstreams_responses: normalizeTopStats(stats.top_upstreams_responses),
|
|
||||||
top_upstrems_avg_time: normalizeTopStats(stats.top_upstreams_avg_time),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
dispatch(getStatsSuccess(normalizedStats));
|
dispatch(getStatsSuccess(normalizedStats));
|
||||||
|
|||||||
@@ -455,8 +455,6 @@ class Api {
|
|||||||
|
|
||||||
REWRITE_ADD = { path: 'rewrite/add', method: 'POST' };
|
REWRITE_ADD = { path: 'rewrite/add', method: 'POST' };
|
||||||
|
|
||||||
REWRITE_UPDATE = { path: 'rewrite/update', method: 'PUT' };
|
|
||||||
|
|
||||||
REWRITE_DELETE = { path: 'rewrite/delete', method: 'POST' };
|
REWRITE_DELETE = { path: 'rewrite/delete', method: 'POST' };
|
||||||
|
|
||||||
getRewritesList() {
|
getRewritesList() {
|
||||||
@@ -472,14 +470,6 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateRewrite(config) {
|
|
||||||
const { path, method } = this.REWRITE_UPDATE;
|
|
||||||
const parameters = {
|
|
||||||
data: config,
|
|
||||||
};
|
|
||||||
return this.makeRequest(path, method, parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteRewrite(config) {
|
deleteRewrite(config) {
|
||||||
const { path, method } = this.REWRITE_DELETE;
|
const { path, method } = this.REWRITE_DELETE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { shallowEqual, useSelector } from 'react-redux';
|
|||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
import { formatNumber } from '../../helpers/helpers';
|
import { formatNumber } from '../../helpers/helpers';
|
||||||
import LogsSearchLink from '../ui/LogsSearchLink';
|
import LogsSearchLink from '../ui/LogsSearchLink';
|
||||||
import { RESPONSE_FILTER, DAY } from '../../helpers/constants';
|
import { RESPONSE_FILTER } from '../../helpers/constants';
|
||||||
import Tooltip from '../ui/Tooltip';
|
import Tooltip from '../ui/Tooltip';
|
||||||
|
|
||||||
const Row = ({
|
const Row = ({
|
||||||
@@ -54,12 +54,12 @@ const Counters = ({ refreshButton, subtitle }) => {
|
|||||||
avgProcessingTime,
|
avgProcessingTime,
|
||||||
} = useSelector((state) => state.stats, shallowEqual);
|
} = useSelector((state) => state.stats, shallowEqual);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const days = interval / DAY;
|
|
||||||
const rows = [
|
const rows = [
|
||||||
{
|
{
|
||||||
label: 'dns_query',
|
label: 'dns_query',
|
||||||
count: numDnsQueries,
|
count: numDnsQueries,
|
||||||
tooltipTitle: days === 1 ? 'number_of_dns_query_24_hours' : t('number_of_dns_query_days', { count: days }),
|
tooltipTitle: interval === 1 ? 'number_of_dns_query_24_hours' : t('number_of_dns_query_days', { count: interval }),
|
||||||
response_status: RESPONSE_FILTER.ALL.QUERY,
|
response_status: RESPONSE_FILTER.ALL.QUERY,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import ReactTable from 'react-table';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import round from 'lodash/round';
|
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
|
||||||
import DomainCell from './DomainCell';
|
|
||||||
|
|
||||||
const TimeCell = ({ value }) => {
|
|
||||||
if (!value) {
|
|
||||||
return '–';
|
|
||||||
}
|
|
||||||
|
|
||||||
const valueInMilliseconds = round(value * 1000);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="logs__row o-hidden">
|
|
||||||
<span className="logs__text logs__text--full" title={valueInMilliseconds}>
|
|
||||||
{valueInMilliseconds} ms
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
TimeCell.propTypes = {
|
|
||||||
value: PropTypes.oneOfType([
|
|
||||||
PropTypes.string,
|
|
||||||
PropTypes.number,
|
|
||||||
]),
|
|
||||||
};
|
|
||||||
|
|
||||||
const UpstreamAvgTime = ({
|
|
||||||
t,
|
|
||||||
refreshButton,
|
|
||||||
topUpstreamsAvgTime,
|
|
||||||
subtitle,
|
|
||||||
}) => (
|
|
||||||
<Card
|
|
||||||
title={t('average_processing_time')}
|
|
||||||
subtitle={subtitle}
|
|
||||||
bodyType="card-table"
|
|
||||||
refresh={refreshButton}
|
|
||||||
>
|
|
||||||
<ReactTable
|
|
||||||
data={topUpstreamsAvgTime.map(({ name: domain, count }) => ({
|
|
||||||
domain,
|
|
||||||
count,
|
|
||||||
}))}
|
|
||||||
columns={[
|
|
||||||
{
|
|
||||||
Header: <Trans>upstream</Trans>,
|
|
||||||
accessor: 'domain',
|
|
||||||
Cell: DomainCell,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Header: <Trans>processing_time</Trans>,
|
|
||||||
accessor: 'count',
|
|
||||||
maxWidth: 190,
|
|
||||||
Cell: TimeCell,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
showPagination={false}
|
|
||||||
noDataText={t('no_upstreams_data_found')}
|
|
||||||
minRows={6}
|
|
||||||
defaultPageSize={100}
|
|
||||||
className="-highlight card-table-overflow--limited stats__table"
|
|
||||||
/>
|
|
||||||
</Card>
|
|
||||||
);
|
|
||||||
|
|
||||||
UpstreamAvgTime.propTypes = {
|
|
||||||
topUpstreamsAvgTime: PropTypes.array.isRequired,
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(UpstreamAvgTime);
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import ReactTable from 'react-table';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
|
||||||
import Cell from '../ui/Cell';
|
|
||||||
import DomainCell from './DomainCell';
|
|
||||||
|
|
||||||
import { getPercent } from '../../helpers/helpers';
|
|
||||||
import { STATUS_COLORS } from '../../helpers/constants';
|
|
||||||
|
|
||||||
const CountCell = (totalBlocked) => (
|
|
||||||
function cell(row) {
|
|
||||||
const { value } = row;
|
|
||||||
const percent = getPercent(totalBlocked, value);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Cell
|
|
||||||
value={value}
|
|
||||||
percent={percent}
|
|
||||||
color={STATUS_COLORS.green}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const getTotalUpstreamRequests = (stats) => {
|
|
||||||
let total = 0;
|
|
||||||
stats.forEach(({ count }) => { total += count; });
|
|
||||||
|
|
||||||
return total;
|
|
||||||
};
|
|
||||||
|
|
||||||
const UpstreamResponses = ({
|
|
||||||
t,
|
|
||||||
refreshButton,
|
|
||||||
topUpstreamsResponses,
|
|
||||||
subtitle,
|
|
||||||
}) => (
|
|
||||||
<Card
|
|
||||||
title={t('top_upstreams')}
|
|
||||||
subtitle={subtitle}
|
|
||||||
bodyType="card-table"
|
|
||||||
refresh={refreshButton}
|
|
||||||
>
|
|
||||||
<ReactTable
|
|
||||||
data={topUpstreamsResponses.map(({ name: domain, count }) => ({
|
|
||||||
domain,
|
|
||||||
count,
|
|
||||||
}))}
|
|
||||||
columns={[
|
|
||||||
{
|
|
||||||
Header: <Trans>upstream</Trans>,
|
|
||||||
accessor: 'domain',
|
|
||||||
Cell: DomainCell,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Header: <Trans>requests_count</Trans>,
|
|
||||||
accessor: 'count',
|
|
||||||
maxWidth: 190,
|
|
||||||
Cell: CountCell(getTotalUpstreamRequests(topUpstreamsResponses)),
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
showPagination={false}
|
|
||||||
noDataText={t('no_upstreams_data_found')}
|
|
||||||
minRows={6}
|
|
||||||
defaultPageSize={100}
|
|
||||||
className="-highlight card-table-overflow--limited stats__table"
|
|
||||||
/>
|
|
||||||
</Card>
|
|
||||||
);
|
|
||||||
|
|
||||||
UpstreamResponses.propTypes = {
|
|
||||||
topUpstreamsResponses: PropTypes.array.isRequired,
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(UpstreamResponses);
|
|
||||||
@@ -21,8 +21,6 @@ import PageTitle from '../ui/PageTitle';
|
|||||||
import Loading from '../ui/Loading';
|
import Loading from '../ui/Loading';
|
||||||
import './Dashboard.css';
|
import './Dashboard.css';
|
||||||
import Dropdown from '../ui/Dropdown';
|
import Dropdown from '../ui/Dropdown';
|
||||||
import UpstreamResponses from './UpstreamResponses';
|
|
||||||
import UpstreamAvgTime from './UpstreamAvgTime';
|
|
||||||
|
|
||||||
const Dashboard = ({
|
const Dashboard = ({
|
||||||
getAccessList,
|
getAccessList,
|
||||||
@@ -236,20 +234,6 @@ const Dashboard = ({
|
|||||||
refreshButton={refreshButton}
|
refreshButton={refreshButton}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-lg-6">
|
|
||||||
<UpstreamResponses
|
|
||||||
subtitle={subtitle}
|
|
||||||
topUpstreamsResponses={stats.topUpstreamsResponses}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-6">
|
|
||||||
<UpstreamAvgTime
|
|
||||||
subtitle={subtitle}
|
|
||||||
topUpstreamsAvgTime={stats.topUpstreamsAvgTime}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>}
|
</div>}
|
||||||
</>;
|
</>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ const Form = (props) => {
|
|||||||
component={renderInputField}
|
component={renderInputField}
|
||||||
className="form-control"
|
className="form-control"
|
||||||
placeholder={t('enter_name_hint')}
|
placeholder={t('enter_name_hint')}
|
||||||
|
validate={[validateRequiredValue]}
|
||||||
normalizeOnBlur={(data) => data.trim()}
|
normalizeOnBlur={(data) => data.trim()}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ Form.propTypes = {
|
|||||||
submitting: PropTypes.bool.isRequired,
|
submitting: PropTypes.bool.isRequired,
|
||||||
processingAdd: PropTypes.bool.isRequired,
|
processingAdd: PropTypes.bool.isRequired,
|
||||||
t: PropTypes.func.isRequired,
|
t: PropTypes.func.isRequired,
|
||||||
initialValues: PropTypes.object,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default flow([
|
export default flow([
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
|
|||||||
import { Trans, withTranslation } from 'react-i18next';
|
import { Trans, withTranslation } from 'react-i18next';
|
||||||
import ReactModal from 'react-modal';
|
import ReactModal from 'react-modal';
|
||||||
|
|
||||||
import { MODAL_TYPE } from '../../../helpers/constants';
|
|
||||||
import Form from './Form';
|
import Form from './Form';
|
||||||
|
|
||||||
const Modal = (props) => {
|
const Modal = (props) => {
|
||||||
@@ -13,8 +12,6 @@ const Modal = (props) => {
|
|||||||
toggleRewritesModal,
|
toggleRewritesModal,
|
||||||
processingAdd,
|
processingAdd,
|
||||||
processingDelete,
|
processingDelete,
|
||||||
modalType,
|
|
||||||
currentRewrite,
|
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -27,18 +24,13 @@ const Modal = (props) => {
|
|||||||
<div className="modal-content">
|
<div className="modal-content">
|
||||||
<div className="modal-header">
|
<div className="modal-header">
|
||||||
<h4 className="modal-title">
|
<h4 className="modal-title">
|
||||||
{modalType === MODAL_TYPE.EDIT_REWRITE ? (
|
|
||||||
<Trans>rewrite_edit</Trans>
|
|
||||||
) : (
|
|
||||||
<Trans>rewrite_add</Trans>
|
<Trans>rewrite_add</Trans>
|
||||||
)}
|
|
||||||
</h4>
|
</h4>
|
||||||
<button type="button" className="close" onClick={() => toggleRewritesModal()}>
|
<button type="button" className="close" onClick={() => toggleRewritesModal()}>
|
||||||
<span className="sr-only">Close</span>
|
<span className="sr-only">Close</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<Form
|
<Form
|
||||||
initialValues={{ ...currentRewrite }}
|
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
toggleRewritesModal={toggleRewritesModal}
|
toggleRewritesModal={toggleRewritesModal}
|
||||||
processingAdd={processingAdd}
|
processingAdd={processingAdd}
|
||||||
@@ -55,8 +47,6 @@ Modal.propTypes = {
|
|||||||
toggleRewritesModal: PropTypes.func.isRequired,
|
toggleRewritesModal: PropTypes.func.isRequired,
|
||||||
processingAdd: PropTypes.bool.isRequired,
|
processingAdd: PropTypes.bool.isRequired,
|
||||||
processingDelete: PropTypes.bool.isRequired,
|
processingDelete: PropTypes.bool.isRequired,
|
||||||
modalType: PropTypes.string.isRequired,
|
|
||||||
currentRewrite: PropTypes.object,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default withTranslation()(Modal);
|
export default withTranslation()(Modal);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
|
|||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
import { withTranslation } from 'react-i18next';
|
import { withTranslation } from 'react-i18next';
|
||||||
import { sortIp } from '../../../helpers/helpers';
|
import { sortIp } from '../../../helpers/helpers';
|
||||||
import { MODAL_TYPE } from '../../../helpers/constants';
|
|
||||||
|
|
||||||
class Table extends Component {
|
class Table extends Component {
|
||||||
cellWrap = ({ value }) => (
|
cellWrap = ({ value }) => (
|
||||||
@@ -32,35 +31,16 @@ class Table extends Component {
|
|||||||
maxWidth: 100,
|
maxWidth: 100,
|
||||||
sortable: false,
|
sortable: false,
|
||||||
resizable: false,
|
resizable: false,
|
||||||
Cell: (value) => {
|
Cell: (value) => (
|
||||||
const currentRewrite = {
|
|
||||||
answer: value.row.answer,
|
|
||||||
domain: value.row.domain,
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="logs__row logs__row--center">
|
<div className="logs__row logs__row--center">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="btn btn-icon btn-outline-primary btn-sm mr-2"
|
className="btn btn-icon btn-icon--green btn-outline-secondary btn-sm"
|
||||||
onClick={() => {
|
onClick={() => this.props.handleDelete({
|
||||||
this.props.toggleRewritesModal({
|
answer: value.row.answer,
|
||||||
type: MODAL_TYPE.EDIT_REWRITE,
|
domain: value.row.domain,
|
||||||
currentRewrite,
|
})
|
||||||
});
|
}
|
||||||
}}
|
|
||||||
disabled={this.props.processingUpdate}
|
|
||||||
title={this.props.t('edit_table_action')}
|
|
||||||
>
|
|
||||||
<svg className="icons icon12">
|
|
||||||
<use xlinkHref="#edit" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className="btn btn-icon btn-outline-secondary btn-sm"
|
|
||||||
onClick={() => this.props.handleDelete(currentRewrite)}
|
|
||||||
title={this.props.t('delete_table_action')}
|
title={this.props.t('delete_table_action')}
|
||||||
>
|
>
|
||||||
<svg className="icons">
|
<svg className="icons">
|
||||||
@@ -68,8 +48,7 @@ class Table extends Component {
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
),
|
||||||
},
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -105,9 +84,7 @@ Table.propTypes = {
|
|||||||
processing: PropTypes.bool.isRequired,
|
processing: PropTypes.bool.isRequired,
|
||||||
processingAdd: PropTypes.bool.isRequired,
|
processingAdd: PropTypes.bool.isRequired,
|
||||||
processingDelete: PropTypes.bool.isRequired,
|
processingDelete: PropTypes.bool.isRequired,
|
||||||
processingUpdate: PropTypes.bool.isRequired,
|
|
||||||
handleDelete: PropTypes.func.isRequired,
|
handleDelete: PropTypes.func.isRequired,
|
||||||
toggleRewritesModal: PropTypes.func.isRequired,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default withTranslation()(Table);
|
export default withTranslation()(Table);
|
||||||
|
|||||||
@@ -6,13 +6,16 @@ import Table from './Table';
|
|||||||
import Modal from './Modal';
|
import Modal from './Modal';
|
||||||
import Card from '../../ui/Card';
|
import Card from '../../ui/Card';
|
||||||
import PageTitle from '../../ui/PageTitle';
|
import PageTitle from '../../ui/PageTitle';
|
||||||
import { MODAL_TYPE } from '../../../helpers/constants';
|
|
||||||
|
|
||||||
class Rewrites extends Component {
|
class Rewrites extends Component {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.getRewritesList();
|
this.props.getRewritesList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleSubmit = (values) => {
|
||||||
|
this.props.addRewrite(values);
|
||||||
|
};
|
||||||
|
|
||||||
handleDelete = (values) => {
|
handleDelete = (values) => {
|
||||||
// eslint-disable-next-line no-alert
|
// eslint-disable-next-line no-alert
|
||||||
if (window.confirm(this.props.t('rewrite_confirm_delete', { key: values.domain }))) {
|
if (window.confirm(this.props.t('rewrite_confirm_delete', { key: values.domain }))) {
|
||||||
@@ -20,19 +23,6 @@ class Rewrites extends Component {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
handleSubmit = (values) => {
|
|
||||||
const { modalType, currentRewrite } = this.props.rewrites;
|
|
||||||
|
|
||||||
if (modalType === MODAL_TYPE.EDIT_REWRITE && currentRewrite) {
|
|
||||||
this.props.updateRewrite({
|
|
||||||
target: currentRewrite,
|
|
||||||
update: values,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.props.addRewrite(values);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
t,
|
t,
|
||||||
@@ -46,9 +36,6 @@ class Rewrites extends Component {
|
|||||||
processing,
|
processing,
|
||||||
processingAdd,
|
processingAdd,
|
||||||
processingDelete,
|
processingDelete,
|
||||||
processingUpdate,
|
|
||||||
modalType,
|
|
||||||
currentRewrite,
|
|
||||||
} = rewrites;
|
} = rewrites;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -67,15 +54,13 @@ class Rewrites extends Component {
|
|||||||
processing={processing}
|
processing={processing}
|
||||||
processingAdd={processingAdd}
|
processingAdd={processingAdd}
|
||||||
processingDelete={processingDelete}
|
processingDelete={processingDelete}
|
||||||
processingUpdate={processingUpdate}
|
|
||||||
handleDelete={this.handleDelete}
|
handleDelete={this.handleDelete}
|
||||||
toggleRewritesModal={toggleRewritesModal}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="btn btn-success btn-standard mt-3"
|
className="btn btn-success btn-standard mt-3"
|
||||||
onClick={() => toggleRewritesModal({ type: MODAL_TYPE.ADD_REWRITE })}
|
onClick={() => toggleRewritesModal()}
|
||||||
disabled={processingAdd}
|
disabled={processingAdd}
|
||||||
>
|
>
|
||||||
<Trans>rewrite_add</Trans>
|
<Trans>rewrite_add</Trans>
|
||||||
@@ -83,13 +68,10 @@ class Rewrites extends Component {
|
|||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
isModalOpen={isModalOpen}
|
isModalOpen={isModalOpen}
|
||||||
modalType={modalType}
|
|
||||||
toggleRewritesModal={toggleRewritesModal}
|
toggleRewritesModal={toggleRewritesModal}
|
||||||
handleSubmit={this.handleSubmit}
|
handleSubmit={this.handleSubmit}
|
||||||
processingAdd={processingAdd}
|
processingAdd={processingAdd}
|
||||||
processingDelete={processingDelete}
|
processingDelete={processingDelete}
|
||||||
processingUpdate={processingUpdate}
|
|
||||||
currentRewrite={currentRewrite}
|
|
||||||
/>
|
/>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
</Card>
|
</Card>
|
||||||
@@ -104,7 +86,6 @@ Rewrites.propTypes = {
|
|||||||
toggleRewritesModal: PropTypes.func.isRequired,
|
toggleRewritesModal: PropTypes.func.isRequired,
|
||||||
addRewrite: PropTypes.func.isRequired,
|
addRewrite: PropTypes.func.isRequired,
|
||||||
deleteRewrite: PropTypes.func.isRequired,
|
deleteRewrite: PropTypes.func.isRequired,
|
||||||
updateRewrite: PropTypes.func.isRequired,
|
|
||||||
rewrites: PropTypes.object.isRequired,
|
rewrites: PropTypes.object.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ class Table extends Component {
|
|||||||
Header: <Trans>list_url_table_header</Trans>,
|
Header: <Trans>list_url_table_header</Trans>,
|
||||||
accessor: 'url',
|
accessor: 'url',
|
||||||
minWidth: 180,
|
minWidth: 180,
|
||||||
// eslint-disable-next-line react/prop-types
|
|
||||||
Cell: ({ value }) => (
|
Cell: ({ value }) => (
|
||||||
<div className="logs__row">
|
<div className="logs__row">
|
||||||
{isValidAbsolutePath(value) ? value
|
{isValidAbsolutePath(value) ? value
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ const ProtectionTimer = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
ProtectionTimer.propTypes = {
|
ProtectionTimer.propTypes = {
|
||||||
protectionDisabledDuration: PropTypes.number,
|
|
||||||
toggleProtectionSuccess: PropTypes.func.isRequired,
|
|
||||||
setProtectionTimerTime: PropTypes.func.isRequired,
|
setProtectionTimerTime: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ const ClientsTable = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleSubmit = (values) => {
|
const handleSubmit = (values) => {
|
||||||
const config = { ...values };
|
const config = values;
|
||||||
|
|
||||||
if (values) {
|
if (values) {
|
||||||
if (values.blocked_services) {
|
if (values.blocked_services) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import {
|
|||||||
} from '../../../helpers/constants';
|
} from '../../../helpers/constants';
|
||||||
import '../FormButton.css';
|
import '../FormButton.css';
|
||||||
|
|
||||||
|
|
||||||
const getIntervalTitle = (interval, t) => {
|
const getIntervalTitle = (interval, t) => {
|
||||||
switch (interval) {
|
switch (interval) {
|
||||||
case RETENTION_CUSTOM:
|
case RETENTION_CUSTOM:
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { Trans, withTranslation } from 'react-i18next';
|
|||||||
import flow from 'lodash/flow';
|
import flow from 'lodash/flow';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
renderRadioField,
|
renderRadioField,
|
||||||
toNumber,
|
toNumber,
|
||||||
|
|||||||
@@ -1,26 +1,13 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import LogsSearchLink from './LogsSearchLink';
|
import LogsSearchLink from './LogsSearchLink';
|
||||||
import { formatNumber } from '../../helpers/helpers';
|
import { formatNumber } from '../../helpers/helpers';
|
||||||
|
|
||||||
const Cell = ({
|
const Cell = ({
|
||||||
value,
|
value, percent, color, search,
|
||||||
percent,
|
}) => <div className="stats__row">
|
||||||
color,
|
|
||||||
search,
|
|
||||||
}) => (
|
|
||||||
<div className="stats__row">
|
|
||||||
<div className="stats__row-value mb-1">
|
<div className="stats__row-value mb-1">
|
||||||
<strong>
|
<strong><LogsSearchLink search={search}>{formatNumber(value)}</LogsSearchLink></strong>
|
||||||
{search ? (
|
|
||||||
<LogsSearchLink search={search}>
|
|
||||||
{formatNumber(value)}
|
|
||||||
</LogsSearchLink>
|
|
||||||
) : (
|
|
||||||
formatNumber(value)
|
|
||||||
)}
|
|
||||||
</strong>
|
|
||||||
<small className="ml-3 text-muted">{percent}%</small>
|
<small className="ml-3 text-muted">{percent}%</small>
|
||||||
</div>
|
</div>
|
||||||
<div className="progress progress-xs">
|
<div className="progress progress-xs">
|
||||||
@@ -32,8 +19,7 @@ const Cell = ({
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>;
|
||||||
);
|
|
||||||
|
|
||||||
Cell.propTypes = {
|
Cell.propTypes = {
|
||||||
value: PropTypes.number.isRequired,
|
value: PropTypes.number.isRequired,
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
/* eslint-disable react/no-unknown-property */
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import './Icons.css';
|
import './Icons.css';
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import {
|
|||||||
getRewritesList,
|
getRewritesList,
|
||||||
addRewrite,
|
addRewrite,
|
||||||
deleteRewrite,
|
deleteRewrite,
|
||||||
updateRewrite,
|
|
||||||
toggleRewritesModal,
|
toggleRewritesModal,
|
||||||
} from '../actions/rewrites';
|
} from '../actions/rewrites';
|
||||||
import Rewrites from '../components/Filters/Rewrites';
|
import Rewrites from '../components/Filters/Rewrites';
|
||||||
@@ -18,7 +17,6 @@ const mapDispatchToProps = {
|
|||||||
getRewritesList,
|
getRewritesList,
|
||||||
addRewrite,
|
addRewrite,
|
||||||
deleteRewrite,
|
deleteRewrite,
|
||||||
updateRewrite,
|
|
||||||
toggleRewritesModal,
|
toggleRewritesModal,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -173,8 +173,6 @@ export const MODAL_TYPE = {
|
|||||||
ADD_FILTERS: 'ADD_FILTERS',
|
ADD_FILTERS: 'ADD_FILTERS',
|
||||||
EDIT_FILTERS: 'EDIT_FILTERS',
|
EDIT_FILTERS: 'EDIT_FILTERS',
|
||||||
CHOOSE_FILTERING_LIST: 'CHOOSE_FILTERING_LIST',
|
CHOOSE_FILTERING_LIST: 'CHOOSE_FILTERING_LIST',
|
||||||
ADD_REWRITE: 'ADD_REWRITE',
|
|
||||||
EDIT_REWRITE: 'EDIT_REWRITE',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CLIENT_ID = {
|
export const CLIENT_ID = {
|
||||||
|
|||||||
@@ -64,11 +64,11 @@ export default {
|
|||||||
"homepage": "https://github.com/MasterKia/PersianBlocker",
|
"homepage": "https://github.com/MasterKia/PersianBlocker",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_19.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_19.txt"
|
||||||
},
|
},
|
||||||
"ISR_easyList_hebrew": {
|
"ITA_filtri_dns": {
|
||||||
"name": "ISR: EasyList Hebrew",
|
"name": "ITA: Filtri-DNS",
|
||||||
"categoryId": "regional",
|
"categoryId": "regional",
|
||||||
"homepage": "https://github.com/easylist/EasyListHebrew",
|
"homepage": "https://filtri-dns.ga/",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_43.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_18.txt"
|
||||||
},
|
},
|
||||||
"KOR_list_kr": {
|
"KOR_list_kr": {
|
||||||
"name": "KOR: List-KR DNS",
|
"name": "KOR: List-KR DNS",
|
||||||
@@ -100,12 +100,6 @@ export default {
|
|||||||
"homepage": "https://github.com/DandelionSprout/adfilt",
|
"homepage": "https://github.com/DandelionSprout/adfilt",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_13.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_13.txt"
|
||||||
},
|
},
|
||||||
"POL_cert_polska_list_of_malicious_domains": {
|
|
||||||
"name": "POL: CERT Polska List of malicious domains",
|
|
||||||
"categoryId": "regional",
|
|
||||||
"homepage": "https://cert.pl/posts/2020/03/ostrzezenia_phishing/",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_41.txt"
|
|
||||||
},
|
|
||||||
"POL_polish_filters_for_pi_hole": {
|
"POL_polish_filters_for_pi_hole": {
|
||||||
"name": "POL: Polish filters for Pi-hole",
|
"name": "POL: Polish filters for Pi-hole",
|
||||||
"categoryId": "regional",
|
"categoryId": "regional",
|
||||||
@@ -124,12 +118,6 @@ export default {
|
|||||||
"homepage": "https://github.com/bkrucarci/turk-adlist",
|
"homepage": "https://github.com/bkrucarci/turk-adlist",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_26.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_26.txt"
|
||||||
},
|
},
|
||||||
"TUR_turkish_ad_hosts": {
|
|
||||||
"name": "TUR: Turkish Ad Hosts",
|
|
||||||
"categoryId": "regional",
|
|
||||||
"homepage": "https://github.com/symbuzzer/Turkish-Ad-Hosts",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_40.txt"
|
|
||||||
},
|
|
||||||
"VNM_abpvn": {
|
"VNM_abpvn": {
|
||||||
"name": "VNM: ABPVN List",
|
"name": "VNM: ABPVN List",
|
||||||
"categoryId": "regional",
|
"categoryId": "regional",
|
||||||
@@ -166,48 +154,18 @@ export default {
|
|||||||
"homepage": "https://github.com/DandelionSprout/adfilt",
|
"homepage": "https://github.com/DandelionSprout/adfilt",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_12.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_12.txt"
|
||||||
},
|
},
|
||||||
"dandelion_sprouts_anti_push_notifications": {
|
|
||||||
"name": "Dandelion Sprout's Anti Push Notifications",
|
|
||||||
"categoryId": "other",
|
|
||||||
"homepage": "https://github.com/DandelionSprout/adfilt",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_39.txt"
|
|
||||||
},
|
|
||||||
"dandelion_sprouts_game_console_adblock_list": {
|
"dandelion_sprouts_game_console_adblock_list": {
|
||||||
"name": "Dandelion Sprout's Game Console Adblock List",
|
"name": "Dandelion Sprout's Game Console Adblock List",
|
||||||
"categoryId": "other",
|
"categoryId": "other",
|
||||||
"homepage": "https://github.com/DandelionSprout/adfilt",
|
"homepage": "https://github.com/DandelionSprout/adfilt",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_6.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_6.txt"
|
||||||
},
|
},
|
||||||
"hagezi_allowlist_referral": {
|
"hagezi_personal": {
|
||||||
"name": "HaGeZi's Allowlist Referral",
|
"name": "HaGeZi Personal Black \u0026 White",
|
||||||
"categoryId": "other",
|
|
||||||
"homepage": "https://github.com/hagezi/dns-blocklists#referral",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_45.txt"
|
|
||||||
},
|
|
||||||
"hagezi_antipiracy_blocklist": {
|
|
||||||
"name": "HaGeZi's Anti-Piracy Blocklist",
|
|
||||||
"categoryId": "other",
|
|
||||||
"homepage": "https://github.com/hagezi/dns-blocklists#piracy",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_46.txt"
|
|
||||||
},
|
|
||||||
"hagezi_gambling_blocklist": {
|
|
||||||
"name": "HaGeZi's Gambling Blocklist",
|
|
||||||
"categoryId": "other",
|
|
||||||
"homepage": "https://github.com/hagezi/dns-blocklists#gambling",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_47.txt"
|
|
||||||
},
|
|
||||||
"hagezi_multinormal": {
|
|
||||||
"name": "HaGeZi Multi NORMAL",
|
|
||||||
"categoryId": "general",
|
"categoryId": "general",
|
||||||
"homepage": "https://github.com/hagezi/dns-blocklists",
|
"homepage": "https://github.com/hagezi/dns-blocklists",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_34.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_34.txt"
|
||||||
},
|
},
|
||||||
"hagezi_threat_intelligence_feeds": {
|
|
||||||
"name": "HaGeZi's Threat Intelligence Feeds",
|
|
||||||
"categoryId": "security",
|
|
||||||
"homepage": "https://github.com/hagezi/dns-blocklists",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_44.txt"
|
|
||||||
},
|
|
||||||
"no_google": {
|
"no_google": {
|
||||||
"name": "No Google",
|
"name": "No Google",
|
||||||
"categoryId": "other",
|
"categoryId": "other",
|
||||||
@@ -250,24 +208,12 @@ export default {
|
|||||||
"homepage": "https://pgl.yoyo.org/adservers/",
|
"homepage": "https://pgl.yoyo.org/adservers/",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_3.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_3.txt"
|
||||||
},
|
},
|
||||||
"phishing_army": {
|
|
||||||
"name": "Phishing Army",
|
|
||||||
"categoryId": "security",
|
|
||||||
"homepage": "https://gitlab.com/malware-filter/phishing-filter",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_18.txt"
|
|
||||||
},
|
|
||||||
"scam_blocklist_by_durablenapkin": {
|
"scam_blocklist_by_durablenapkin": {
|
||||||
"name": "Scam Blocklist by DurableNapkin",
|
"name": "Scam Blocklist by DurableNapkin",
|
||||||
"categoryId": "security",
|
"categoryId": "security",
|
||||||
"homepage": "https://github.com/durablenapkin/scamblocklist",
|
"homepage": "https://github.com/durablenapkin/scamblocklist",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_10.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_10.txt"
|
||||||
},
|
},
|
||||||
"shadowwhisperers_malware_list": {
|
|
||||||
"name": "ShadowWhisperer's Malware List",
|
|
||||||
"categoryId": "security",
|
|
||||||
"homepage": "https://github.com/ShadowWhisperer/BlockLists",
|
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_42.txt"
|
|
||||||
},
|
|
||||||
"staklerware_indicators_list": {
|
"staklerware_indicators_list": {
|
||||||
"name": "Stalkerware Indicators List",
|
"name": "Stalkerware Indicators List",
|
||||||
"categoryId": "security",
|
"categoryId": "security",
|
||||||
|
|||||||
@@ -845,6 +845,7 @@ export const sortIp = (a, b) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {number} filterId
|
* @param {number} filterId
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -30,27 +30,7 @@ const rewrites = handleActions(
|
|||||||
[actions.deleteRewriteFailure]: (state) => ({ ...state, processingDelete: false }),
|
[actions.deleteRewriteFailure]: (state) => ({ ...state, processingDelete: false }),
|
||||||
[actions.deleteRewriteSuccess]: (state) => ({ ...state, processingDelete: false }),
|
[actions.deleteRewriteSuccess]: (state) => ({ ...state, processingDelete: false }),
|
||||||
|
|
||||||
[actions.updateRewriteRequest]: (state) => ({ ...state, processingUpdate: true }),
|
[actions.toggleRewritesModal]: (state) => {
|
||||||
[actions.updateRewriteFailure]: (state) => ({ ...state, processingUpdate: false }),
|
|
||||||
[actions.updateRewriteSuccess]: (state) => {
|
|
||||||
const newState = {
|
|
||||||
...state,
|
|
||||||
processingUpdate: false,
|
|
||||||
};
|
|
||||||
return newState;
|
|
||||||
},
|
|
||||||
|
|
||||||
[actions.toggleRewritesModal]: (state, { payload }) => {
|
|
||||||
if (payload) {
|
|
||||||
const newState = {
|
|
||||||
...state,
|
|
||||||
modalType: payload.type || '',
|
|
||||||
isModalOpen: !state.isModalOpen,
|
|
||||||
currentRewrite: payload.currentRewrite,
|
|
||||||
};
|
|
||||||
return newState;
|
|
||||||
}
|
|
||||||
|
|
||||||
const newState = {
|
const newState = {
|
||||||
...state,
|
...state,
|
||||||
isModalOpen: !state.isModalOpen,
|
isModalOpen: !state.isModalOpen,
|
||||||
@@ -62,10 +42,7 @@ const rewrites = handleActions(
|
|||||||
processing: true,
|
processing: true,
|
||||||
processingAdd: false,
|
processingAdd: false,
|
||||||
processingDelete: false,
|
processingDelete: false,
|
||||||
processingUpdate: false,
|
|
||||||
isModalOpen: false,
|
isModalOpen: false,
|
||||||
modalType: '',
|
|
||||||
currentRewrite: {},
|
|
||||||
list: [],
|
list: [],
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -58,8 +58,6 @@ const stats = handleActions(
|
|||||||
num_replaced_safebrowsing: numReplacedSafebrowsing,
|
num_replaced_safebrowsing: numReplacedSafebrowsing,
|
||||||
num_replaced_safesearch: numReplacedSafesearch,
|
num_replaced_safesearch: numReplacedSafesearch,
|
||||||
avg_processing_time: avgProcessingTime,
|
avg_processing_time: avgProcessingTime,
|
||||||
top_upstreams_responses: topUpstreamsResponses,
|
|
||||||
top_upstrems_avg_time: topUpstreamsAvgTime,
|
|
||||||
} = payload;
|
} = payload;
|
||||||
|
|
||||||
const newState = {
|
const newState = {
|
||||||
@@ -79,8 +77,6 @@ const stats = handleActions(
|
|||||||
numReplacedSafebrowsing,
|
numReplacedSafebrowsing,
|
||||||
numReplacedSafesearch,
|
numReplacedSafesearch,
|
||||||
avgProcessingTime,
|
avgProcessingTime,
|
||||||
topUpstreamsResponses,
|
|
||||||
topUpstreamsAvgTime,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return newState;
|
return newState;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# A docker file for scripts/make/build-docker.sh.
|
# A docker file for scripts/make/build-docker.sh.
|
||||||
|
|
||||||
FROM alpine:3.18
|
FROM alpine:3.17
|
||||||
|
|
||||||
ARG BUILD_DATE
|
ARG BUILD_DATE
|
||||||
ARG VERSION
|
ARG VERSION
|
||||||
@@ -25,6 +25,8 @@ RUN apk --no-cache add ca-certificates libcap tzdata && \
|
|||||||
mkdir -p /opt/adguardhome/conf /opt/adguardhome/work && \
|
mkdir -p /opt/adguardhome/conf /opt/adguardhome/work && \
|
||||||
chown -R nobody: /opt/adguardhome
|
chown -R nobody: /opt/adguardhome
|
||||||
|
|
||||||
|
RUN apk --no-cache add tini
|
||||||
|
|
||||||
ARG DIST_DIR
|
ARG DIST_DIR
|
||||||
ARG TARGETARCH
|
ARG TARGETARCH
|
||||||
ARG TARGETOS
|
ARG TARGETOS
|
||||||
@@ -41,19 +43,45 @@ RUN setcap 'cap_net_bind_service=+eip' /opt/adguardhome/AdGuardHome
|
|||||||
# 68 : UDP : DHCP (client)
|
# 68 : UDP : DHCP (client)
|
||||||
# 80 : TCP : HTTP (main)
|
# 80 : TCP : HTTP (main)
|
||||||
# 443 : TCP, UDP : HTTPS, DNS-over-HTTPS (incl. HTTP/3), DNSCrypt (main)
|
# 443 : TCP, UDP : HTTPS, DNS-over-HTTPS (incl. HTTP/3), DNSCrypt (main)
|
||||||
|
# 784 : UDP : DNS-over-QUIC (experimental)
|
||||||
# 853 : TCP, UDP : DNS-over-TLS, DNS-over-QUIC
|
# 853 : TCP, UDP : DNS-over-TLS, DNS-over-QUIC
|
||||||
# 3000 : TCP, UDP : HTTP(S) (alt, incl. HTTP/3)
|
# 3000 : TCP, UDP : HTTP(S) (alt, incl. HTTP/3)
|
||||||
|
# 3001 : TCP, UDP : HTTP(S) (beta, incl. HTTP/3)
|
||||||
# 5443 : TCP, UDP : DNSCrypt (alt)
|
# 5443 : TCP, UDP : DNSCrypt (alt)
|
||||||
# 6060 : TCP : HTTP (pprof)
|
# 6060 : TCP : HTTP (pprof)
|
||||||
EXPOSE 53/tcp 53/udp 67/udp 68/udp 80/tcp 443/tcp 443/udp 853/tcp\
|
# 8853 : UDP : DNS-over-QUIC (experimental)
|
||||||
853/udp 3000/tcp 3000/udp 5443/tcp 5443/udp 6060/tcp
|
#
|
||||||
|
# TODO(a.garipov): Remove the old, non-standard 784 and 8853 ports for
|
||||||
|
# DNS-over-QUIC in a future release.
|
||||||
|
EXPOSE 53/tcp 53/udp 67/udp 68/udp 80/tcp 443/tcp 443/udp 784/udp\
|
||||||
|
853/tcp 853/udp 3000/tcp 3000/udp 5443/tcp\
|
||||||
|
5443/udp 6060/tcp 8853/udp
|
||||||
|
|
||||||
WORKDIR /opt/adguardhome/work
|
WORKDIR /opt/adguardhome/work
|
||||||
|
|
||||||
ENTRYPOINT ["/opt/adguardhome/AdGuardHome"]
|
# Install helpers for healthcheck.
|
||||||
|
COPY --chown=nobody:nogroup\
|
||||||
|
./${DIST_DIR}/docker/scripts\
|
||||||
|
/opt/adguardhome/scripts
|
||||||
|
|
||||||
|
HEALTHCHECK \
|
||||||
|
--interval=30s \
|
||||||
|
--timeout=10s \
|
||||||
|
--retries=3 \
|
||||||
|
CMD [ "/opt/adguardhome/scripts/healthcheck.sh" ]
|
||||||
|
|
||||||
|
# It seems that the healthckech script sometimes spawns zombie processes, so we
|
||||||
|
# need a way to handle them, since AdGuard Home doesn't know how to keep track
|
||||||
|
# of the processes delegated to it by the OS. Use tini as entry point because
|
||||||
|
# it needs the PID=1 to be the default parent for orphaned processes.
|
||||||
|
#
|
||||||
|
# See https://github.com/adguardTeam/adGuardHome/issues/3290.
|
||||||
|
ENTRYPOINT [ "/sbin/tini", "--" ]
|
||||||
|
|
||||||
CMD [ \
|
CMD [ \
|
||||||
|
"/opt/adguardhome/AdGuardHome", \
|
||||||
"--no-check-update", \
|
"--no-check-update", \
|
||||||
"-c", "/opt/adguardhome/conf/AdGuardHome.yaml", \
|
"-c", "/opt/adguardhome/conf/AdGuardHome.yaml", \
|
||||||
|
"-h", "0.0.0.0", \
|
||||||
"-w", "/opt/adguardhome/work" \
|
"-w", "/opt/adguardhome/work" \
|
||||||
]
|
]
|
||||||
|
|||||||
30
docker/dns-bind.awk
Normal file
30
docker/dns-bind.awk
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/^[^[:space:]]/ { is_dns = /^dns:/ }
|
||||||
|
|
||||||
|
/^[[:space:]]+bind_hosts:/ { if (is_dns) prev_line = FNR }
|
||||||
|
|
||||||
|
/^[[:space:]]+- .+/ {
|
||||||
|
if (FNR - prev_line == 1) {
|
||||||
|
addrs[$2] = true
|
||||||
|
prev_line = FNR
|
||||||
|
|
||||||
|
if ($2 == "0.0.0.0" || $2 == "::") {
|
||||||
|
delete addrs
|
||||||
|
addrs["localhost"] = true
|
||||||
|
|
||||||
|
# Drop all the other addresses.
|
||||||
|
prev_line = -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/^[[:space:]]+port:/ { if (is_dns) port = $2 }
|
||||||
|
|
||||||
|
END {
|
||||||
|
for (addr in addrs) {
|
||||||
|
if (match(addr, ":")) {
|
||||||
|
print "[" addr "]:" port
|
||||||
|
} else {
|
||||||
|
print addr ":" port
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
89
docker/healthcheck.sh
Executable file
89
docker/healthcheck.sh
Executable file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# AdGuard Home Docker healthcheck script
|
||||||
|
|
||||||
|
# Exit the script if a pipeline fails (-e), prevent accidental filename
|
||||||
|
# expansion (-f), and consider undefined variables as errors (-u).
|
||||||
|
set -e -f -u
|
||||||
|
|
||||||
|
# Function error_exit is an echo wrapper that writes to stderr and stops the
|
||||||
|
# script execution with code 1.
|
||||||
|
error_exit() {
|
||||||
|
echo "$1" 1>&2
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
agh_dir="/opt/adguardhome"
|
||||||
|
readonly agh_dir
|
||||||
|
|
||||||
|
filename="${agh_dir}/conf/AdGuardHome.yaml"
|
||||||
|
readonly filename
|
||||||
|
|
||||||
|
if ! [ -f "$filename" ]
|
||||||
|
then
|
||||||
|
wget "http://127.0.0.1:3000" -O /dev/null -q || exit 1
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
help_dir="${agh_dir}/scripts"
|
||||||
|
readonly help_dir
|
||||||
|
|
||||||
|
# Parse web host
|
||||||
|
|
||||||
|
web_url="$( awk -f "${help_dir}/web-bind.awk" "$filename" )"
|
||||||
|
readonly web_url
|
||||||
|
|
||||||
|
if [ "$web_url" = '' ]
|
||||||
|
then
|
||||||
|
error_exit "no web bindings could be retrieved from $filename"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO(e.burkov): Deal with 0 port.
|
||||||
|
case "$web_url"
|
||||||
|
in
|
||||||
|
(*':0')
|
||||||
|
error_exit '0 in web port is not supported by healthcheck'
|
||||||
|
;;
|
||||||
|
(*)
|
||||||
|
# Go on.
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Parse DNS hosts
|
||||||
|
|
||||||
|
dns_hosts="$( awk -f "${help_dir}/dns-bind.awk" "$filename" )"
|
||||||
|
readonly dns_hosts
|
||||||
|
|
||||||
|
if [ "$dns_hosts" = '' ]
|
||||||
|
then
|
||||||
|
error_exit "no DNS bindings could be retrieved from $filename"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO(e.burkov): Deal with 0 port.
|
||||||
|
case "$( echo "$dns_hosts" | head -n 1 )"
|
||||||
|
in
|
||||||
|
(*':0')
|
||||||
|
error_exit '0 in DNS port is not supported by healthcheck'
|
||||||
|
;;
|
||||||
|
(*)
|
||||||
|
# Go on.
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Check
|
||||||
|
|
||||||
|
# Skip SSL certificate validation since there is no guarantee the container
|
||||||
|
# trusts the one used. It should be safe to drop the SSL validation since the
|
||||||
|
# current script intended to be used from inside the container and only checks
|
||||||
|
# the endpoint availability, ignoring the content of the response.
|
||||||
|
#
|
||||||
|
# See https://github.com/AdguardTeam/AdGuardHome/issues/5642.
|
||||||
|
wget --no-check-certificate "$web_url" -O /dev/null -q || exit 1
|
||||||
|
|
||||||
|
echo "$dns_hosts" | while read -r host
|
||||||
|
do
|
||||||
|
nslookup -type=a healthcheck.adguardhome.test. "$host" > /dev/null ||\
|
||||||
|
error_exit "nslookup failed for $host"
|
||||||
|
done
|
||||||
13
docker/web-bind.awk
Normal file
13
docker/web-bind.awk
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Don't consider the HTTPS hostname since the enforced HTTPS redirection should
|
||||||
|
# work if the SSL check skipped. See file docker/healthcheck.sh.
|
||||||
|
/^bind_host:/ { host = $2 }
|
||||||
|
|
||||||
|
/^bind_port:/ { port = $2 }
|
||||||
|
|
||||||
|
END {
|
||||||
|
if (match(host, ":")) {
|
||||||
|
print "http://[" host "]:" port
|
||||||
|
} else {
|
||||||
|
print "http://" host ":" port
|
||||||
|
}
|
||||||
|
}
|
||||||
53
go.mod
53
go.mod
@@ -1,40 +1,39 @@
|
|||||||
module github.com/AdguardTeam/AdGuardHome
|
module github.com/AdguardTeam/AdGuardHome
|
||||||
|
|
||||||
go 1.20
|
go 1.19
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/AdguardTeam/dnsproxy v0.54.0
|
github.com/AdguardTeam/dnsproxy v0.48.3
|
||||||
github.com/AdguardTeam/golibs v0.15.0
|
github.com/AdguardTeam/golibs v0.13.2
|
||||||
github.com/AdguardTeam/urlfilter v0.17.0
|
github.com/AdguardTeam/urlfilter v0.16.1
|
||||||
github.com/NYTimes/gziphandler v1.1.1
|
github.com/NYTimes/gziphandler v1.1.1
|
||||||
github.com/ameshkov/dnscrypt/v2 v2.2.7
|
github.com/ameshkov/dnscrypt/v2 v2.2.7
|
||||||
github.com/bluele/gcache v0.0.2
|
|
||||||
github.com/digineo/go-ipset/v2 v2.2.1
|
github.com/digineo/go-ipset/v2 v2.2.1
|
||||||
github.com/dimfeld/httptreemux/v5 v5.5.0
|
github.com/dimfeld/httptreemux/v5 v5.5.0
|
||||||
github.com/fsnotify/fsnotify v1.6.0
|
github.com/fsnotify/fsnotify v1.6.0
|
||||||
github.com/go-ping/ping v1.1.0
|
github.com/go-ping/ping v1.1.0
|
||||||
github.com/google/go-cmp v0.5.9
|
github.com/google/go-cmp v0.5.9
|
||||||
github.com/google/gopacket v1.1.19
|
github.com/google/gopacket v1.1.19
|
||||||
github.com/google/renameio/v2 v2.0.0
|
github.com/google/renameio v1.0.1
|
||||||
github.com/google/uuid v1.3.1
|
github.com/google/uuid v1.3.0
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d
|
github.com/insomniacslk/dhcp v0.0.0-20221215072855-de60144f33f8
|
||||||
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86
|
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86
|
||||||
github.com/kardianos/service v1.2.2
|
github.com/kardianos/service v1.2.2
|
||||||
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118
|
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118
|
||||||
github.com/mdlayher/netlink v1.7.2
|
github.com/mdlayher/netlink v1.7.1
|
||||||
github.com/mdlayher/packet v1.1.2
|
github.com/mdlayher/packet v1.1.1
|
||||||
// TODO(a.garipov): This package is deprecated; find a new one or use our
|
// TODO(a.garipov): This package is deprecated; find a new one or use our
|
||||||
// own code for that. Perhaps, use gopacket.
|
// own code for that. Perhaps, use gopacket.
|
||||||
github.com/mdlayher/raw v0.1.0
|
github.com/mdlayher/raw v0.1.0
|
||||||
github.com/miekg/dns v1.1.55
|
github.com/miekg/dns v1.1.53
|
||||||
github.com/quic-go/quic-go v0.38.0
|
github.com/quic-go/quic-go v0.33.0
|
||||||
github.com/stretchr/testify v1.8.4
|
github.com/stretchr/testify v1.8.2
|
||||||
github.com/ti-mo/netfilter v0.5.0
|
github.com/ti-mo/netfilter v0.5.0
|
||||||
go.etcd.io/bbolt v1.3.7
|
go.etcd.io/bbolt v1.3.7
|
||||||
golang.org/x/crypto v0.12.0
|
golang.org/x/crypto v0.8.0
|
||||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63
|
golang.org/x/exp v0.0.0-20230321023759-10a507213a29
|
||||||
golang.org/x/net v0.14.0
|
golang.org/x/net v0.9.0
|
||||||
golang.org/x/sys v0.11.0
|
golang.org/x/sys v0.7.0
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
howett.net/plist v1.0.0
|
howett.net/plist v1.0.0
|
||||||
@@ -45,21 +44,23 @@ require (
|
|||||||
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect
|
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect
|
||||||
github.com/ameshkov/dnsstamps v1.0.3 // indirect
|
github.com/ameshkov/dnsstamps v1.0.3 // indirect
|
||||||
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 // indirect
|
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 // indirect
|
||||||
|
github.com/bluele/gcache v0.0.2 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||||
github.com/golang/mock v1.6.0 // indirect
|
github.com/golang/mock v1.6.0 // indirect
|
||||||
github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f // indirect
|
github.com/google/pprof v0.0.0-20230406165453-00490a63f317 // indirect
|
||||||
github.com/mdlayher/socket v0.4.1 // indirect
|
github.com/mdlayher/socket v0.4.0 // indirect
|
||||||
github.com/onsi/ginkgo/v2 v2.12.0 // indirect
|
github.com/onsi/ginkgo/v2 v2.9.2 // indirect
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
||||||
github.com/pierrec/lz4/v4 v4.1.18 // indirect
|
github.com/pierrec/lz4/v4 v4.1.17 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/quic-go/qpack v0.4.0 // indirect
|
github.com/quic-go/qpack v0.4.0 // indirect
|
||||||
github.com/quic-go/qtls-go1-20 v0.3.3 // indirect
|
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
|
||||||
|
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
|
||||||
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect
|
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect
|
||||||
golang.org/x/mod v0.12.0 // indirect
|
golang.org/x/mod v0.10.0 // indirect
|
||||||
golang.org/x/sync v0.3.0 // indirect
|
golang.org/x/sync v0.1.0 // indirect
|
||||||
golang.org/x/text v0.12.0 // indirect
|
golang.org/x/text v0.9.0 // indirect
|
||||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect
|
golang.org/x/tools v0.8.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
187
go.sum
187
go.sum
@@ -1,11 +1,16 @@
|
|||||||
github.com/AdguardTeam/dnsproxy v0.54.0 h1:OgSitM/EKrMMOi+guWZNwaU1cqRqJKWgR3l3fPWWayI=
|
github.com/AdguardTeam/dnsproxy v0.48.3 h1:h9xgDSmd1MqsPFNApyaPVXolmSTtzOWOcfWvPeDEP6s=
|
||||||
github.com/AdguardTeam/dnsproxy v0.54.0/go.mod h1:tG/treaQekcKnugYoKOfm8vt3JGi6CliWta0MkQr15U=
|
github.com/AdguardTeam/dnsproxy v0.48.3/go.mod h1:Y7g7jRTd/u7+KJ/QvnGI2PCE8vnisp6EsW47/Sz0DZw=
|
||||||
github.com/AdguardTeam/golibs v0.15.0 h1:yOv/fdVkJIOWKr0NlUXAE9RA0DK9GKiBbiGzq47vY7o=
|
github.com/AdguardTeam/golibs v0.4.0/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4=
|
||||||
github.com/AdguardTeam/golibs v0.15.0/go.mod h1:66ZLs8P7nk/3IfKroQ1rqtieLk+5eXYXMBKXlVL7KeI=
|
github.com/AdguardTeam/golibs v0.10.4/go.mod h1:rSfQRGHIdgfxriDDNgNJ7HmE5zRoURq8R+VdR81Zuzw=
|
||||||
github.com/AdguardTeam/urlfilter v0.17.0 h1:tUzhtR9wMx704GIP3cibsDQJrixlMHfwoQbYJfPdFow=
|
github.com/AdguardTeam/golibs v0.13.2 h1:BPASsyQKmb+b8VnvsNOHp7bKfcZl9Z+Z2UhPjOiupSc=
|
||||||
github.com/AdguardTeam/urlfilter v0.17.0/go.mod h1:bbuZjPUzm/Ip+nz5qPPbwIP+9rZyQbQad8Lt/0fCulU=
|
github.com/AdguardTeam/golibs v0.13.2/go.mod h1:7ylQLv2Lqsc3UW3jHoITynYk6Y1tYtgEMkR09ppfsN8=
|
||||||
|
github.com/AdguardTeam/gomitmproxy v0.2.0/go.mod h1:Qdv0Mktnzer5zpdpi5rAwixNJzW2FN91LjKJCkVbYGU=
|
||||||
|
github.com/AdguardTeam/urlfilter v0.16.1 h1:ZPi0rjqo8cQf2FVdzo6cqumNoHZx2KPXj2yZa1A5BBw=
|
||||||
|
github.com/AdguardTeam/urlfilter v0.16.1/go.mod h1:46YZDOV1+qtdRDuhZKVPSSp7JWWes0KayqHrKAFBdEI=
|
||||||
github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
|
github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
|
||||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||||
|
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
|
||||||
|
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
|
||||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
|
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
|
||||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
|
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
|
||||||
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw=
|
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw=
|
||||||
@@ -18,6 +23,7 @@ github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 h1:0b2vaepXIfMsG+
|
|||||||
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA=
|
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA=
|
||||||
github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
|
github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
|
||||||
github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
|
github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@@ -25,10 +31,12 @@ github.com/digineo/go-ipset/v2 v2.2.1 h1:k6skY+0fMqeUjjeWO/m5OuWPSZUAn7AucHMnQ1M
|
|||||||
github.com/digineo/go-ipset/v2 v2.2.1/go.mod h1:wBsNzJlZlABHUITkesrggFnZQtgW5wkqw1uo8Qxe0VU=
|
github.com/digineo/go-ipset/v2 v2.2.1/go.mod h1:wBsNzJlZlABHUITkesrggFnZQtgW5wkqw1uo8Qxe0VU=
|
||||||
github.com/dimfeld/httptreemux/v5 v5.5.0 h1:p8jkiMrCuZ0CmhwYLcbNbl7DDo21fozhKHQ2PccwOFQ=
|
github.com/dimfeld/httptreemux/v5 v5.5.0 h1:p8jkiMrCuZ0CmhwYLcbNbl7DDo21fozhKHQ2PccwOFQ=
|
||||||
github.com/dimfeld/httptreemux/v5 v5.5.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw=
|
github.com/dimfeld/httptreemux/v5 v5.5.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw=
|
||||||
|
github.com/fanliao/go-promise v0.0.0-20141029170127-1890db352a72/go.mod h1:PjfxuH4FZdUyfMdtBio2lsRr1AKEaVPwelzuHuh8Lqc=
|
||||||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
|
||||||
|
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
github.com/go-ping/ping v1.1.0 h1:3MCGhVX4fyEUuhsfwPrsEdQw6xspHkv5zHsiSoDFZYw=
|
github.com/go-ping/ping v1.1.0 h1:3MCGhVX4fyEUuhsfwPrsEdQw6xspHkv5zHsiSoDFZYw=
|
||||||
github.com/go-ping/ping v1.1.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk=
|
github.com/go-ping/ping v1.1.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||||
@@ -37,137 +45,197 @@ github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
|||||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||||
github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f h1:pDhu5sgp8yJlEF/g6osliIIpF9K4F5jvkULXa4daRDQ=
|
github.com/google/pprof v0.0.0-20230406165453-00490a63f317 h1:hFhpt7CTmR3DX+b4R19ydQFtofxT0Sv3QsKNMVQYTMQ=
|
||||||
github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
github.com/google/pprof v0.0.0-20230406165453-00490a63f317/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
|
||||||
github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg=
|
github.com/google/renameio v1.0.1 h1:Lh/jXZmvZxb0BBeSY5VKEfidcbcbenKjZFzM/q0fSeU=
|
||||||
github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4=
|
github.com/google/renameio v1.0.1/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk=
|
||||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
|
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||||
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 h1:/jC7qQFrv8CrSJVmaolDVOxTfS9kc36uB6H40kdbQq8=
|
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 h1:/jC7qQFrv8CrSJVmaolDVOxTfS9kc36uB6H40kdbQq8=
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d h1:Ka64cclWedOkGzm9M2/XYuwJUdmWRUozmsxW0PyKA3A=
|
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714/go.mod h1:2Goc3h8EklBH5mspfHFxBnEoURQCGzQQH1ga9Myjvis=
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d/go.mod h1:7474bZ1YNCvarT6WFKie4kEET6J0KYRDC4XJqqXzQW4=
|
github.com/insomniacslk/dhcp v0.0.0-20221215072855-de60144f33f8 h1:Z72DOke2yOK0Ms4Z2LK1E1OrRJXOxSj5DllTz2FYTRg=
|
||||||
|
github.com/insomniacslk/dhcp v0.0.0-20221215072855-de60144f33f8/go.mod h1:m5WMe03WCvWcXjRnhvaAbAAXdCnu20J5P+mmH44ZzpE=
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||||
github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||||
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 h1:elKwZS1OcdQ0WwEDBeqxKwb7WB62QX8bvZ/FJnVXIfk=
|
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 h1:elKwZS1OcdQ0WwEDBeqxKwb7WB62QX8bvZ/FJnVXIfk=
|
||||||
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86/go.mod h1:aFAMtuldEgx/4q7iSGazk22+IcgvtiC+HIimFO9XlS8=
|
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86/go.mod h1:aFAMtuldEgx/4q7iSGazk22+IcgvtiC+HIimFO9XlS8=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c/go.mod h1:huN4d1phzjhlOsNIjFsw2SVRbwIHj3fJDMEU2SDPTmg=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60=
|
github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60=
|
||||||
github.com/kardianos/service v1.2.2/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM=
|
github.com/kardianos/service v1.2.2/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7/go.mod h1:U6ZQobyTjI/tJyq2HG+i/dfSoFUt8/aZCM+GKtmFk/Y=
|
||||||
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 h1:2oDp6OOhLxQ9JBoUuysVz9UZ9uI6oLUbvAZu0x8o+vE=
|
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 h1:2oDp6OOhLxQ9JBoUuysVz9UZ9uI6oLUbvAZu0x8o+vE=
|
||||||
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118/go.mod h1:ZFUnHIVchZ9lJoWoEGUg8Q3M4U8aNNWA3CVSUTkW4og=
|
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118/go.mod h1:ZFUnHIVchZ9lJoWoEGUg8Q3M4U8aNNWA3CVSUTkW4og=
|
||||||
github.com/mdlayher/netlink v0.0.0-20190313131330-258ea9dff42c/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
|
github.com/mdlayher/netlink v0.0.0-20190313131330-258ea9dff42c/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
|
||||||
github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
|
github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
|
||||||
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
|
||||||
|
github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY=
|
||||||
|
github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o=
|
||||||
|
github.com/mdlayher/netlink v1.7.1 h1:FdUaT/e33HjEXagwELR8R3/KL1Fq5x3G5jgHLp/BTmg=
|
||||||
|
github.com/mdlayher/netlink v1.7.1/go.mod h1:nKO5CSjE/DJjVhk/TNp6vCE1ktVxEA8VEh8drhZzxsQ=
|
||||||
github.com/mdlayher/packet v1.0.0/go.mod h1:eE7/ctqDhoiRhQ44ko5JZU2zxB88g+JH/6jmnjzPjOU=
|
github.com/mdlayher/packet v1.0.0/go.mod h1:eE7/ctqDhoiRhQ44ko5JZU2zxB88g+JH/6jmnjzPjOU=
|
||||||
github.com/mdlayher/packet v1.1.2 h1:3Up1NG6LZrsgDVn6X4L9Ge/iyRyxFEFD9o6Pr3Q1nQY=
|
github.com/mdlayher/packet v1.1.1 h1:7Fv4OEMYqPl7//uBm04VgPpnSNi8fbBZznppgh6WMr8=
|
||||||
github.com/mdlayher/packet v1.1.2/go.mod h1:GEu1+n9sG5VtiRE4SydOmX5GTwyyYlteZiFU+x0kew4=
|
github.com/mdlayher/packet v1.1.1/go.mod h1:DRvYY5mH4M4lUqAnMg04E60U4fjUKMZ/4g2cHElZkKo=
|
||||||
|
github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
|
||||||
|
github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
|
||||||
github.com/mdlayher/raw v0.1.0 h1:K4PFMVy+AFsp0Zdlrts7yNhxc/uXoPVHi9RzRvtZF2Y=
|
github.com/mdlayher/raw v0.1.0 h1:K4PFMVy+AFsp0Zdlrts7yNhxc/uXoPVHi9RzRvtZF2Y=
|
||||||
github.com/mdlayher/raw v0.1.0/go.mod h1:yXnxvs6c0XoF/aK52/H5PjsVHmWBCFfZUfoh/Y5s9Sg=
|
github.com/mdlayher/raw v0.1.0/go.mod h1:yXnxvs6c0XoF/aK52/H5PjsVHmWBCFfZUfoh/Y5s9Sg=
|
||||||
github.com/mdlayher/socket v0.2.1/go.mod h1:QLlNPkFR88mRUNQIzRBMfXxwKal8H7u1h3bL1CV+f0E=
|
github.com/mdlayher/socket v0.2.1/go.mod h1:QLlNPkFR88mRUNQIzRBMfXxwKal8H7u1h3bL1CV+f0E=
|
||||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
github.com/mdlayher/socket v0.4.0 h1:280wsy40IC9M9q1uPGcLBwXpcTQDtoGwVt+BNoITxIw=
|
||||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
github.com/mdlayher/socket v0.4.0/go.mod h1:xxFqz5GRCUN3UEOm9CZqEJsAbe1C8OwSK46NlmWuVoc=
|
||||||
github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
|
||||||
github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
|
github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw=
|
||||||
|
github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ=
|
github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU=
|
||||||
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
|
github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts=
|
||||||
|
github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||||
github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||||
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
|
github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc=
|
||||||
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
|
|
||||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||||
github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM=
|
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
|
||||||
github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
|
||||||
github.com/quic-go/quic-go v0.38.0 h1:T45lASr5q/TrVwt+jrVccmqHhPL2XuSyoCLVCpfOSLc=
|
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
|
||||||
github.com/quic-go/quic-go v0.38.0/go.mod h1:MPCuRq7KBK2hNcfKj/1iD1BGuN3eAYMeNxp3T42LRUg=
|
github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM=
|
||||||
github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4=
|
github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0=
|
||||||
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
|
github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA=
|
||||||
|
github.com/shirou/gopsutil/v3 v3.21.8 h1:nKct+uP0TV8DjjNiHanKf8SAuub+GNsbrOtM9Nl9biA=
|
||||||
|
github.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
|
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
|
||||||
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||||
|
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/ti-mo/netfilter v0.2.0/go.mod h1:8GbBGsY/8fxtyIdfwy29JiluNcPK4K7wIT+x42ipqUU=
|
github.com/ti-mo/netfilter v0.2.0/go.mod h1:8GbBGsY/8fxtyIdfwy29JiluNcPK4K7wIT+x42ipqUU=
|
||||||
github.com/ti-mo/netfilter v0.5.0 h1:MZmsUw5bFRecOb0AeyjOPxTHg4UxYzyEs0Ek/6Lxoy8=
|
github.com/ti-mo/netfilter v0.5.0 h1:MZmsUw5bFRecOb0AeyjOPxTHg4UxYzyEs0Ek/6Lxoy8=
|
||||||
github.com/ti-mo/netfilter v0.5.0/go.mod h1:nt+8B9hx/QpqHr7Hazq+2qMCCA8u2OTkyc/7+U9ARz8=
|
github.com/ti-mo/netfilter v0.5.0/go.mod h1:nt+8B9hx/QpqHr7Hazq+2qMCCA8u2OTkyc/7+U9ARz8=
|
||||||
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
|
github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo=
|
||||||
github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
|
github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=
|
||||||
|
github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ=
|
||||||
|
github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=
|
||||||
|
github.com/u-root/uio v0.0.0-20221213070652-c3537552635f/go.mod h1:IogEAUBXDEwX7oR/BMmCctShYs80ql4hF0ySdzGxf7E=
|
||||||
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg=
|
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg=
|
||||||
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
|
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
|
||||||
go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
|
go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
|
||||||
go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
|
go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
||||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ=
|
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8=
|
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug=
|
||||||
|
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
|
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
||||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
|
golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||||
|
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||||
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E=
|
golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y=
|
||||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
|
golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@@ -175,9 +243,12 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T
|
|||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
|
||||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
|
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
@@ -72,8 +72,8 @@ func WriteJSONResponse(w http.ResponseWriter, r *http.Request, resp any) (err er
|
|||||||
// WriteJSONResponseCode is like [WriteJSONResponse] but adds the ability to
|
// WriteJSONResponseCode is like [WriteJSONResponse] but adds the ability to
|
||||||
// redefine the status code.
|
// redefine the status code.
|
||||||
func WriteJSONResponseCode(w http.ResponseWriter, r *http.Request, code int, resp any) (err error) {
|
func WriteJSONResponseCode(w http.ResponseWriter, r *http.Request, code int, resp any) (err error) {
|
||||||
w.Header().Set(httphdr.ContentType, HdrValApplicationJSON)
|
|
||||||
w.WriteHeader(code)
|
w.WriteHeader(code)
|
||||||
|
w.Header().Set(httphdr.ContentType, HdrValApplicationJSON)
|
||||||
err = json.NewEncoder(w).Encode(resp)
|
err = json.NewEncoder(w).Encode(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Error(r, w, http.StatusInternalServerError, "encoding resp: %s", err)
|
Error(r, w, http.StatusInternalServerError, "encoding resp: %s", err)
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
package aghio_test
|
package aghio
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghio"
|
|
||||||
"github.com/AdguardTeam/golibs/testutil"
|
"github.com/AdguardTeam/golibs/testutil"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@@ -32,7 +31,7 @@ func TestLimitReader(t *testing.T) {
|
|||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
_, err := aghio.LimitReader(nil, tc.n)
|
_, err := LimitReader(nil, tc.n)
|
||||||
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
|
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -58,7 +57,7 @@ func TestLimitedReader_Read(t *testing.T) {
|
|||||||
limit: 3,
|
limit: 3,
|
||||||
want: 0,
|
want: 0,
|
||||||
}, {
|
}, {
|
||||||
err: &aghio.LimitReachedError{
|
err: &LimitReachedError{
|
||||||
Limit: 0,
|
Limit: 0,
|
||||||
},
|
},
|
||||||
name: "limit_reached",
|
name: "limit_reached",
|
||||||
@@ -75,7 +74,7 @@ func TestLimitedReader_Read(t *testing.T) {
|
|||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
readCloser := io.NopCloser(strings.NewReader(tc.rStr))
|
readCloser := io.NopCloser(strings.NewReader(tc.rStr))
|
||||||
lreader, err := aghio.LimitReader(readCloser, tc.limit)
|
lreader, err := LimitReader(readCloser, tc.limit)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, lreader)
|
require.NotNil(t, lreader)
|
||||||
|
|
||||||
@@ -90,7 +89,7 @@ func TestLimitedReader_Read(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLimitedReader_LimitReachedError(t *testing.T) {
|
func TestLimitedReader_LimitReachedError(t *testing.T) {
|
||||||
testutil.AssertErrorMsg(t, "attempted to read more than 0 bytes", &aghio.LimitReachedError{
|
testutil.AssertErrorMsg(t, "attempted to read more than 0 bytes", &LimitReachedError{
|
||||||
Limit: 0,
|
Limit: 0,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
package aghnet
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/AdguardTeam/golibs/stringutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NormalizeDomain returns a lowercased version of host without the final dot,
|
|
||||||
// unless host is ".", in which case it returns it unchanged. That is a special
|
|
||||||
// case that to allow matching queries like:
|
|
||||||
//
|
|
||||||
// dig IN NS '.'
|
|
||||||
func NormalizeDomain(host string) (norm string) {
|
|
||||||
if host == "." {
|
|
||||||
return host
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.ToLower(strings.TrimSuffix(host, "."))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDomainNameSet returns nil and error, if list has duplicate or empty domain
|
|
||||||
// name. Otherwise returns a set, which contains domain names normalized using
|
|
||||||
// [NormalizeDomain].
|
|
||||||
func NewDomainNameSet(list []string) (set *stringutil.Set, err error) {
|
|
||||||
set = stringutil.NewSet()
|
|
||||||
|
|
||||||
for i, host := range list {
|
|
||||||
if host == "" {
|
|
||||||
return nil, fmt.Errorf("at index %d: hostname is empty", i)
|
|
||||||
}
|
|
||||||
|
|
||||||
host = NormalizeDomain(host)
|
|
||||||
if set.Has(host) {
|
|
||||||
return nil, fmt.Errorf("duplicate hostname %q at index %d", host, i)
|
|
||||||
}
|
|
||||||
|
|
||||||
set.Add(host)
|
|
||||||
}
|
|
||||||
|
|
||||||
return set, nil
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
package aghnet_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghnet"
|
|
||||||
"github.com/AdguardTeam/golibs/testutil"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestNewDomainNameSet(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
testCases := []struct {
|
|
||||||
name string
|
|
||||||
wantErrMsg string
|
|
||||||
in []string
|
|
||||||
}{{
|
|
||||||
name: "nil",
|
|
||||||
wantErrMsg: "",
|
|
||||||
in: nil,
|
|
||||||
}, {
|
|
||||||
name: "success",
|
|
||||||
wantErrMsg: "",
|
|
||||||
in: []string{
|
|
||||||
"Domain.Example",
|
|
||||||
".",
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
name: "dups",
|
|
||||||
wantErrMsg: `duplicate hostname "domain.example" at index 1`,
|
|
||||||
in: []string{
|
|
||||||
"Domain.Example",
|
|
||||||
"domain.example",
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
name: "bad_domain",
|
|
||||||
wantErrMsg: "at index 0: hostname is empty",
|
|
||||||
in: []string{
|
|
||||||
"",
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
|
|
||||||
for _, tc := range testCases {
|
|
||||||
tc := tc
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
set, err := aghnet.NewDomainNameSet(tc.in)
|
|
||||||
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, host := range tc.in {
|
|
||||||
assert.Truef(t, set.Has(aghnet.NormalizeDomain(host)), "%q not matched", host)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
// Package arpdb implements the Network Neighborhood Database.
|
package aghnet
|
||||||
package arpdb
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
@@ -9,25 +8,15 @@ import (
|
|||||||
"net/netip"
|
"net/netip"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
|
||||||
"github.com/AdguardTeam/golibs/errors"
|
"github.com/AdguardTeam/golibs/errors"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
|
||||||
"github.com/AdguardTeam/golibs/netutil"
|
|
||||||
"golang.org/x/exp/slices"
|
"golang.org/x/exp/slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Variables and functions to substitute in tests.
|
// ARPDB: The Network Neighborhood Database
|
||||||
var (
|
|
||||||
// aghosRunCommand is the function to run shell commands.
|
|
||||||
aghosRunCommand = aghos.RunCommand
|
|
||||||
|
|
||||||
// rootDirFS is the filesystem pointing to the root directory.
|
// ARPDB stores and refreshes the network neighborhood reported by ARP (Address
|
||||||
rootDirFS = aghos.RootDirFS()
|
// Resolution Protocol).
|
||||||
)
|
type ARPDB interface {
|
||||||
|
|
||||||
// Interface stores and refreshes the network neighborhood reported by ARP
|
|
||||||
// (Address Resolution Protocol).
|
|
||||||
type Interface interface {
|
|
||||||
// Refresh updates the stored data. It must be safe for concurrent use.
|
// Refresh updates the stored data. It must be safe for concurrent use.
|
||||||
Refresh() (err error)
|
Refresh() (err error)
|
||||||
|
|
||||||
@@ -36,24 +25,28 @@ type Interface interface {
|
|||||||
Neighbors() (ns []Neighbor)
|
Neighbors() (ns []Neighbor)
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns the [Interface] properly initialized for the OS.
|
// NewARPDB returns the ARPDB properly initialized for the OS.
|
||||||
func New() (arp Interface) {
|
func NewARPDB() (arp ARPDB) {
|
||||||
return newARPDB()
|
return newARPDB()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Empty is the [Interface] implementation that does nothing.
|
// Empty ARPDB implementation
|
||||||
type Empty struct{}
|
|
||||||
|
// EmptyARPDB is the ARPDB implementation that does nothing.
|
||||||
|
type EmptyARPDB struct{}
|
||||||
|
|
||||||
// type check
|
// type check
|
||||||
var _ Interface = Empty{}
|
var _ ARPDB = EmptyARPDB{}
|
||||||
|
|
||||||
// Refresh implements the [Interface] interface for EmptyARPContainer. It does
|
// Refresh implements the ARPDB interface for EmptyARPContainer. It does
|
||||||
// nothing and always returns nil error.
|
// nothing and always returns nil error.
|
||||||
func (Empty) Refresh() (err error) { return nil }
|
func (EmptyARPDB) Refresh() (err error) { return nil }
|
||||||
|
|
||||||
// Neighbors implements the [Interface] interface for EmptyARPContainer. It
|
// Neighbors implements the ARPDB interface for EmptyARPContainer. It always
|
||||||
// always returns nil.
|
// returns nil.
|
||||||
func (Empty) Neighbors() (ns []Neighbor) { return nil }
|
func (EmptyARPDB) Neighbors() (ns []Neighbor) { return nil }
|
||||||
|
|
||||||
|
// ARPDB Helper Types
|
||||||
|
|
||||||
// Neighbor is the pair of IP address and MAC address reported by ARP.
|
// Neighbor is the pair of IP address and MAC address reported by ARP.
|
||||||
type Neighbor struct {
|
type Neighbor struct {
|
||||||
@@ -77,21 +70,8 @@ func (n Neighbor) Clone() (clone Neighbor) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// validatedHostname returns valid hostname. Otherwise returns empty string and
|
|
||||||
// logs the error if hostname is not valid.
|
|
||||||
func validatedHostname(h string) (host string) {
|
|
||||||
err := netutil.ValidateHostname(h)
|
|
||||||
if err != nil {
|
|
||||||
log.Debug("arpdb: parsing arp output: host: %s", err)
|
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// neighs is the helper type that stores neighbors to avoid copying its methods
|
// neighs is the helper type that stores neighbors to avoid copying its methods
|
||||||
// among all the [Interface] implementations.
|
// among all the ARPDB implementations.
|
||||||
type neighs struct {
|
type neighs struct {
|
||||||
mu *sync.RWMutex
|
mu *sync.RWMutex
|
||||||
ns []Neighbor
|
ns []Neighbor
|
||||||
@@ -128,12 +108,14 @@ func (ns *neighs) reset(with []Neighbor) {
|
|||||||
ns.ns = with
|
ns.ns = with
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Command ARPDB
|
||||||
|
|
||||||
// parseNeighsFunc parses the text from sc as if it'd be an output of some
|
// parseNeighsFunc parses the text from sc as if it'd be an output of some
|
||||||
// ARP-related command. lenHint is a hint for the size of the allocated slice
|
// ARP-related command. lenHint is a hint for the size of the allocated slice
|
||||||
// of Neighbors.
|
// of Neighbors.
|
||||||
type parseNeighsFunc func(sc *bufio.Scanner, lenHint int) (ns []Neighbor)
|
type parseNeighsFunc func(sc *bufio.Scanner, lenHint int) (ns []Neighbor)
|
||||||
|
|
||||||
// cmdARPDB is the implementation of the [Interface] that uses command line to
|
// cmdARPDB is the implementation of the ARPDB that uses command line to
|
||||||
// retrieve data.
|
// retrieve data.
|
||||||
type cmdARPDB struct {
|
type cmdARPDB struct {
|
||||||
parse parseNeighsFunc
|
parse parseNeighsFunc
|
||||||
@@ -143,9 +125,9 @@ type cmdARPDB struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// type check
|
// type check
|
||||||
var _ Interface = (*cmdARPDB)(nil)
|
var _ ARPDB = (*cmdARPDB)(nil)
|
||||||
|
|
||||||
// Refresh implements the [Interface] interface for *cmdARPDB.
|
// Refresh implements the ARPDB interface for *cmdARPDB.
|
||||||
func (arp *cmdARPDB) Refresh() (err error) {
|
func (arp *cmdARPDB) Refresh() (err error) {
|
||||||
defer func() { err = errors.Annotate(err, "cmd arpdb: %w") }()
|
defer func() { err = errors.Annotate(err, "cmd arpdb: %w") }()
|
||||||
|
|
||||||
@@ -168,22 +150,24 @@ func (arp *cmdARPDB) Refresh() (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Neighbors implements the [Interface] interface for *cmdARPDB.
|
// Neighbors implements the ARPDB interface for *cmdARPDB.
|
||||||
func (arp *cmdARPDB) Neighbors() (ns []Neighbor) {
|
func (arp *cmdARPDB) Neighbors() (ns []Neighbor) {
|
||||||
return arp.ns.clone()
|
return arp.ns.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
// arpdbs is the [Interface] that combines several [Interface] implementations
|
// Composite ARPDB
|
||||||
// and consequently switches between those.
|
|
||||||
|
// arpdbs is the ARPDB that combines several ARPDB implementations and
|
||||||
|
// consequently switches between those.
|
||||||
type arpdbs struct {
|
type arpdbs struct {
|
||||||
// arps is the set of [Interface] implementations to range through.
|
// arps is the set of ARPDB implementations to range through.
|
||||||
arps []Interface
|
arps []ARPDB
|
||||||
neighs
|
neighs
|
||||||
}
|
}
|
||||||
|
|
||||||
// newARPDBs returns a properly initialized *arpdbs. It begins refreshing from
|
// newARPDBs returns a properly initialized *arpdbs. It begins refreshing from
|
||||||
// the first of arps.
|
// the first of arps.
|
||||||
func newARPDBs(arps ...Interface) (arp *arpdbs) {
|
func newARPDBs(arps ...ARPDB) (arp *arpdbs) {
|
||||||
return &arpdbs{
|
return &arpdbs{
|
||||||
arps: arps,
|
arps: arps,
|
||||||
neighs: neighs{
|
neighs: neighs{
|
||||||
@@ -194,9 +178,9 @@ func newARPDBs(arps ...Interface) (arp *arpdbs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// type check
|
// type check
|
||||||
var _ Interface = (*arpdbs)(nil)
|
var _ ARPDB = (*arpdbs)(nil)
|
||||||
|
|
||||||
// Refresh implements the [Interface] interface for *arpdbs.
|
// Refresh implements the ARPDB interface for *arpdbs.
|
||||||
func (arp *arpdbs) Refresh() (err error) {
|
func (arp *arpdbs) Refresh() (err error) {
|
||||||
var errs []error
|
var errs []error
|
||||||
|
|
||||||
@@ -213,10 +197,14 @@ func (arp *arpdbs) Refresh() (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return errors.Annotate(errors.Join(errs...), "each arpdb failed: %w")
|
if len(errs) > 0 {
|
||||||
|
err = errors.List("each arpdb failed", errs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Neighbors implements the [Interface] interface for *arpdbs.
|
// Neighbors implements the ARPDB interface for *arpdbs.
|
||||||
//
|
//
|
||||||
// TODO(e.burkov): Think of a way to avoid cloning the slice twice.
|
// TODO(e.burkov): Think of a way to avoid cloning the slice twice.
|
||||||
func (arp *arpdbs) Neighbors() (ns []Neighbor) {
|
func (arp *arpdbs) Neighbors() (ns []Neighbor) {
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build darwin || freebsd
|
//go:build darwin || freebsd
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
|
"github.com/AdguardTeam/golibs/netutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newARPDB() (arp *cmdARPDB) {
|
func newARPDB() (arp *cmdARPDB) {
|
||||||
@@ -43,16 +44,16 @@ func parseArpA(sc *bufio.Scanner, lenHint int) (ns []Neighbor) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
ipStr := fields[1]
|
n := Neighbor{}
|
||||||
if len(ipStr) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ip, err := netip.ParseAddr(ipStr[1 : len(ipStr)-1])
|
if ipStr := fields[1]; len(ipStr) < 2 {
|
||||||
if err != nil {
|
continue
|
||||||
|
} else if ip, err := netip.ParseAddr(ipStr[1 : len(ipStr)-1]); err != nil {
|
||||||
log.Debug("arpdb: parsing arp output: ip: %s", err)
|
log.Debug("arpdb: parsing arp output: ip: %s", err)
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.IP = ip
|
||||||
}
|
}
|
||||||
|
|
||||||
hwStr := fields[3]
|
hwStr := fields[3]
|
||||||
@@ -61,13 +62,19 @@ func parseArpA(sc *bufio.Scanner, lenHint int) (ns []Neighbor) {
|
|||||||
log.Debug("arpdb: parsing arp output: mac: %s", err)
|
log.Debug("arpdb: parsing arp output: mac: %s", err)
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.MAC = mac
|
||||||
}
|
}
|
||||||
|
|
||||||
ns = append(ns, Neighbor{
|
host := fields[0]
|
||||||
IP: ip,
|
err = netutil.ValidateHostname(host)
|
||||||
MAC: mac,
|
if err != nil {
|
||||||
Name: validatedHostname(fields[0]),
|
log.Debug("arpdb: parsing arp output: host: %s", err)
|
||||||
})
|
} else {
|
||||||
|
n.Name = host
|
||||||
|
}
|
||||||
|
|
||||||
|
ns = append(ns, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ns
|
return ns
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build darwin || freebsd
|
//go:build darwin || freebsd
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build linux
|
//go:build linux
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
|
"github.com/AdguardTeam/golibs/netutil"
|
||||||
"github.com/AdguardTeam/golibs/stringutil"
|
"github.com/AdguardTeam/golibs/stringutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -67,9 +68,9 @@ type fsysARPDB struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// type check
|
// type check
|
||||||
var _ Interface = (*fsysARPDB)(nil)
|
var _ ARPDB = (*fsysARPDB)(nil)
|
||||||
|
|
||||||
// Refresh implements the [Interface] interface for *fsysARPDB.
|
// Refresh implements the ARPDB interface for *fsysARPDB.
|
||||||
func (arp *fsysARPDB) Refresh() (err error) {
|
func (arp *fsysARPDB) Refresh() (err error) {
|
||||||
var f fs.File
|
var f fs.File
|
||||||
f, err = arp.fsys.Open(arp.filename)
|
f, err = arp.fsys.Open(arp.filename)
|
||||||
@@ -87,10 +88,21 @@ func (arp *fsysARPDB) Refresh() (err error) {
|
|||||||
|
|
||||||
ns := make([]Neighbor, 0, arp.ns.len())
|
ns := make([]Neighbor, 0, arp.ns.len())
|
||||||
for sc.Scan() {
|
for sc.Scan() {
|
||||||
n := parseNeighbor(sc.Text())
|
ln := sc.Text()
|
||||||
if n != nil {
|
fields := stringutil.SplitTrimmed(ln, " ")
|
||||||
ns = append(ns, *n)
|
if len(fields) != 6 {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n := Neighbor{}
|
||||||
|
n.IP, err = netip.ParseAddr(fields[0])
|
||||||
|
if err != nil || n.IP.IsUnspecified() {
|
||||||
|
continue
|
||||||
|
} else if n.MAC, err = net.ParseMAC(fields[3]); err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ns = append(ns, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
arp.ns.reset(ns)
|
arp.ns.reset(ns)
|
||||||
@@ -98,30 +110,7 @@ func (arp *fsysARPDB) Refresh() (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseNeighbor parses line into *Neighbor.
|
// Neighbors implements the ARPDB interface for *fsysARPDB.
|
||||||
func parseNeighbor(line string) (n *Neighbor) {
|
|
||||||
fields := stringutil.SplitTrimmed(line, " ")
|
|
||||||
if len(fields) != 6 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
ip, err := netip.ParseAddr(fields[0])
|
|
||||||
if err != nil || ip.IsUnspecified() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
mac, err := net.ParseMAC(fields[3])
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Neighbor{
|
|
||||||
IP: ip,
|
|
||||||
MAC: mac,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Neighbors implements the [Interface] interface for *fsysARPDB.
|
|
||||||
func (arp *fsysARPDB) Neighbors() (ns []Neighbor) {
|
func (arp *fsysARPDB) Neighbors() (ns []Neighbor) {
|
||||||
return arp.ns.clone()
|
return arp.ns.clone()
|
||||||
}
|
}
|
||||||
@@ -146,11 +135,15 @@ func parseArpAWrt(sc *bufio.Scanner, lenHint int) (ns []Neighbor) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n := Neighbor{}
|
||||||
|
|
||||||
ip, err := netip.ParseAddr(fields[0])
|
ip, err := netip.ParseAddr(fields[0])
|
||||||
if err != nil {
|
if err != nil || n.IP.IsUnspecified() {
|
||||||
log.Debug("arpdb: parsing arp output: ip: %s", err)
|
log.Debug("arpdb: parsing arp output: ip: %s", err)
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.IP = ip
|
||||||
}
|
}
|
||||||
|
|
||||||
hwStr := fields[3]
|
hwStr := fields[3]
|
||||||
@@ -159,12 +152,11 @@ func parseArpAWrt(sc *bufio.Scanner, lenHint int) (ns []Neighbor) {
|
|||||||
log.Debug("arpdb: parsing arp output: mac: %s", err)
|
log.Debug("arpdb: parsing arp output: mac: %s", err)
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.MAC = mac
|
||||||
}
|
}
|
||||||
|
|
||||||
ns = append(ns, Neighbor{
|
ns = append(ns, n)
|
||||||
IP: ip,
|
|
||||||
MAC: mac,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ns
|
return ns
|
||||||
@@ -184,31 +176,35 @@ func parseArpA(sc *bufio.Scanner, lenHint int) (ns []Neighbor) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
ipStr := fields[1]
|
n := Neighbor{}
|
||||||
if len(ipStr) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ip, err := netip.ParseAddr(ipStr[1 : len(ipStr)-1])
|
if ipStr := fields[1]; len(ipStr) < 2 {
|
||||||
if err != nil {
|
continue
|
||||||
|
} else if ip, err := netip.ParseAddr(ipStr[1 : len(ipStr)-1]); err != nil {
|
||||||
log.Debug("arpdb: parsing arp output: ip: %s", err)
|
log.Debug("arpdb: parsing arp output: ip: %s", err)
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.IP = ip
|
||||||
}
|
}
|
||||||
|
|
||||||
hwStr := fields[3]
|
hwStr := fields[3]
|
||||||
mac, err := net.ParseMAC(hwStr)
|
if mac, err := net.ParseMAC(hwStr); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Debug("arpdb: parsing arp output: mac: %s", err)
|
log.Debug("arpdb: parsing arp output: mac: %s", err)
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.MAC = mac
|
||||||
}
|
}
|
||||||
|
|
||||||
ns = append(ns, Neighbor{
|
host := fields[0]
|
||||||
IP: ip,
|
if verr := netutil.ValidateHostname(host); verr != nil {
|
||||||
MAC: mac,
|
log.Debug("arpdb: parsing arp output: host: %s", verr)
|
||||||
Name: validatedHostname(fields[0]),
|
} else {
|
||||||
})
|
n.Name = host
|
||||||
|
}
|
||||||
|
|
||||||
|
ns = append(ns, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ns
|
return ns
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build linux
|
//go:build linux
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build openbsd
|
//go:build openbsd
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build openbsd
|
//go:build openbsd
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
@@ -1,12 +1,8 @@
|
|||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io/fs"
|
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -16,78 +12,30 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
// testdata is the filesystem containing data for testing the package.
|
func TestNewARPDB(t *testing.T) {
|
||||||
var testdata fs.FS = os.DirFS("./testdata")
|
var a ARPDB
|
||||||
|
require.NotPanics(t, func() { a = NewARPDB() })
|
||||||
// RunCmdFunc is the signature of aghos.RunCommand function.
|
|
||||||
type RunCmdFunc func(cmd string, args ...string) (code int, out []byte, err error)
|
|
||||||
|
|
||||||
// substShell replaces the the aghos.RunCommand function used throughout the
|
|
||||||
// package with rc for tests ran under t.
|
|
||||||
func substShell(t testing.TB, rc RunCmdFunc) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
prev := aghosRunCommand
|
|
||||||
t.Cleanup(func() { aghosRunCommand = prev })
|
|
||||||
aghosRunCommand = rc
|
|
||||||
}
|
|
||||||
|
|
||||||
// mapShell is a substitution of aghos.RunCommand that maps the command to it's
|
|
||||||
// execution result. It's only needed to simplify testing.
|
|
||||||
//
|
|
||||||
// TODO(e.burkov): Perhaps put all the shell interactions behind an interface.
|
|
||||||
type mapShell map[string]struct {
|
|
||||||
err error
|
|
||||||
out string
|
|
||||||
code int
|
|
||||||
}
|
|
||||||
|
|
||||||
// theOnlyCmd returns mapShell that only handles a single command and arguments
|
|
||||||
// combination from cmd.
|
|
||||||
func theOnlyCmd(cmd string, code int, out string, err error) (s mapShell) {
|
|
||||||
return mapShell{cmd: {code: code, out: out, err: err}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RunCmd is a RunCmdFunc handled by s.
|
|
||||||
func (s mapShell) RunCmd(cmd string, args ...string) (code int, out []byte, err error) {
|
|
||||||
key := strings.Join(append([]string{cmd}, args...), " ")
|
|
||||||
ret, ok := s[key]
|
|
||||||
if !ok {
|
|
||||||
return 0, nil, fmt.Errorf("unexpected shell command %q", key)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret.code, []byte(ret.out), ret.err
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_New(t *testing.T) {
|
|
||||||
var a Interface
|
|
||||||
require.NotPanics(t, func() { a = New() })
|
|
||||||
|
|
||||||
assert.NotNil(t, a)
|
assert.NotNil(t, a)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(s.chzhen): Consider moving mocks into aghtest.
|
// TestARPDB is the mock implementation of ARPDB to use in tests.
|
||||||
|
|
||||||
// TestARPDB is the mock implementation of [Interface] to use in tests.
|
|
||||||
type TestARPDB struct {
|
type TestARPDB struct {
|
||||||
OnRefresh func() (err error)
|
OnRefresh func() (err error)
|
||||||
OnNeighbors func() (ns []Neighbor)
|
OnNeighbors func() (ns []Neighbor)
|
||||||
}
|
}
|
||||||
|
|
||||||
// type check
|
// Refresh implements the ARPDB interface for *TestARPDB.
|
||||||
var _ Interface = (*TestARPDB)(nil)
|
|
||||||
|
|
||||||
// Refresh implements the [Interface] interface for *TestARPDB.
|
|
||||||
func (arp *TestARPDB) Refresh() (err error) {
|
func (arp *TestARPDB) Refresh() (err error) {
|
||||||
return arp.OnRefresh()
|
return arp.OnRefresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Neighbors implements the [Interface] interface for *TestARPDB.
|
// Neighbors implements the ARPDB interface for *TestARPDB.
|
||||||
func (arp *TestARPDB) Neighbors() (ns []Neighbor) {
|
func (arp *TestARPDB) Neighbors() (ns []Neighbor) {
|
||||||
return arp.OnNeighbors()
|
return arp.OnNeighbors()
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_NewARPDBs(t *testing.T) {
|
func TestARPDBS(t *testing.T) {
|
||||||
knownIP := netip.MustParseAddr("1.2.3.4")
|
knownIP := netip.MustParseAddr("1.2.3.4")
|
||||||
knownMAC := net.HardwareAddr{0xAB, 0xCD, 0xEF, 0xAB, 0xCD, 0xEF}
|
knownMAC := net.HardwareAddr{0xAB, 0xCD, 0xEF, 0xAB, 0xCD, 0xEF}
|
||||||
|
|
||||||
@@ -134,7 +82,7 @@ func Test_NewARPDBs(t *testing.T) {
|
|||||||
t.Run("fail_only", func(t *testing.T) {
|
t.Run("fail_only", func(t *testing.T) {
|
||||||
t.Cleanup(clnp)
|
t.Cleanup(clnp)
|
||||||
|
|
||||||
wantMsg := "each arpdb failed: refresh failed\nrefresh failed"
|
wantMsg := `each arpdb failed: 2 errors: "refresh failed", "refresh failed"`
|
||||||
|
|
||||||
a := newARPDBs(failDB, failDB)
|
a := newARPDBs(failDB, failDB)
|
||||||
err := a.Refresh()
|
err := a.Refresh()
|
||||||
@@ -247,7 +195,7 @@ func TestCmdARPDB_arpa(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestEmptyARPDB(t *testing.T) {
|
func TestEmptyARPDB(t *testing.T) {
|
||||||
a := Empty{}
|
a := EmptyARPDB{}
|
||||||
|
|
||||||
t.Run("refresh", func(t *testing.T) {
|
t.Run("refresh", func(t *testing.T) {
|
||||||
var err error
|
var err error
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build windows
|
//go:build windows
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
@@ -8,8 +8,6 @@ import (
|
|||||||
"net/netip"
|
"net/netip"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/AdguardTeam/golibs/log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func newARPDB() (arp *cmdARPDB) {
|
func newARPDB() (arp *cmdARPDB) {
|
||||||
@@ -44,24 +42,23 @@ func parseArpA(sc *bufio.Scanner, lenHint int) (ns []Neighbor) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n := Neighbor{}
|
||||||
|
|
||||||
ip, err := netip.ParseAddr(fields[0])
|
ip, err := netip.ParseAddr(fields[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debug("arpdb: parsing arp output: ip: %s", err)
|
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.IP = ip
|
||||||
}
|
}
|
||||||
|
|
||||||
mac, err := net.ParseMAC(fields[1])
|
mac, err := net.ParseMAC(fields[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debug("arpdb: parsing arp output: mac: %s", err)
|
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
} else {
|
||||||
|
n.MAC = mac
|
||||||
}
|
}
|
||||||
|
|
||||||
ns = append(ns, Neighbor{
|
ns = append(ns, n)
|
||||||
IP: ip,
|
|
||||||
MAC: mac,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ns
|
return ns
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//go:build windows
|
//go:build windows
|
||||||
|
|
||||||
package arpdb
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
@@ -60,7 +60,7 @@ func ifaceIPv4Subnet(iface *net.Interface) (subnet netip.Prefix, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ip = ip.To4(); ip != nil {
|
if ip = ip.To4(); ip != nil {
|
||||||
return netip.PrefixFrom(netip.AddrFrom4([4]byte(ip)), maskLen), nil
|
return netip.PrefixFrom(netip.AddrFrom4(*(*[4]byte)(ip)), maskLen), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,7 +304,7 @@ func tryConn6(req *dhcpv6.Message, c net.PacketConn) (ok, next bool, err error)
|
|||||||
if !(response.Type() == dhcpv6.MessageTypeAdvertise &&
|
if !(response.Type() == dhcpv6.MessageTypeAdvertise &&
|
||||||
msg.TransactionID == req.TransactionID &&
|
msg.TransactionID == req.TransactionID &&
|
||||||
rcid != nil &&
|
rcid != nil &&
|
||||||
cid.Equal(rcid)) {
|
cid.Equal(*rcid)) {
|
||||||
|
|
||||||
log.Debug("dhcpv6: received message from server doesn't match our request")
|
log.Debug("dhcpv6: received message from server doesn't match our request")
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
package aghnet
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/AdguardTeam/golibs/errors"
|
||||||
|
"github.com/AdguardTeam/golibs/stringutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GenerateHostname generates the hostname from ip. In case of using IPv4 the
|
// GenerateHostname generates the hostname from ip. In case of using IPv4 the
|
||||||
@@ -25,8 +29,32 @@ func GenerateHostname(ip netip.Addr) (hostname string) {
|
|||||||
hostname = ip.StringExpanded()
|
hostname = ip.StringExpanded()
|
||||||
|
|
||||||
if ip.Is4() {
|
if ip.Is4() {
|
||||||
return strings.ReplaceAll(hostname, ".", "-")
|
return strings.Replace(hostname, ".", "-", -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.ReplaceAll(hostname, ":", "-")
|
return strings.Replace(hostname, ":", "-", -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDomainNameSet returns nil and error, if list has duplicate or empty
|
||||||
|
// domain name. Otherwise returns a set, which contains non-FQDN domain names,
|
||||||
|
// and nil error.
|
||||||
|
func NewDomainNameSet(list []string) (set *stringutil.Set, err error) {
|
||||||
|
set = stringutil.NewSet()
|
||||||
|
|
||||||
|
for i, v := range list {
|
||||||
|
host := strings.ToLower(strings.TrimSuffix(v, "."))
|
||||||
|
// TODO(a.garipov): Think about ignoring empty (".") names in the
|
||||||
|
// future.
|
||||||
|
if host == "" {
|
||||||
|
return nil, errors.Error("host name is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
if set.Has(host) {
|
||||||
|
return nil, fmt.Errorf("duplicate host name %q at index %d", host, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
set.Add(host)
|
||||||
|
}
|
||||||
|
|
||||||
|
return set, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,25 @@
|
|||||||
package aghnet
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"path"
|
"path"
|
||||||
"sync/atomic"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
||||||
"github.com/AdguardTeam/golibs/errors"
|
"github.com/AdguardTeam/golibs/errors"
|
||||||
"github.com/AdguardTeam/golibs/hostsfile"
|
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
|
"github.com/AdguardTeam/golibs/netutil"
|
||||||
|
"github.com/AdguardTeam/golibs/stringutil"
|
||||||
|
"github.com/AdguardTeam/urlfilter"
|
||||||
|
"github.com/AdguardTeam/urlfilter/filterlist"
|
||||||
|
"github.com/AdguardTeam/urlfilter/rules"
|
||||||
|
"github.com/miekg/dns"
|
||||||
"golang.org/x/exp/maps"
|
"golang.org/x/exp/maps"
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// DefaultHostsPaths returns the slice of paths default for the operating system
|
// DefaultHostsPaths returns the slice of paths default for the operating system
|
||||||
@@ -23,51 +29,88 @@ func DefaultHostsPaths() (paths []string) {
|
|||||||
return defaultHostsPaths()
|
return defaultHostsPaths()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MatchAddr returns the records for the IP address.
|
// requestMatcher combines the logic for matching requests and translating the
|
||||||
func (hc *HostsContainer) MatchAddr(ip netip.Addr) (recs []*hostsfile.Record) {
|
// appropriate rules.
|
||||||
cur := hc.current.Load()
|
type requestMatcher struct {
|
||||||
if cur == nil {
|
// stateLock protects all the fields of requestMatcher.
|
||||||
return nil
|
stateLock *sync.RWMutex
|
||||||
}
|
|
||||||
|
|
||||||
return cur.addrs[ip]
|
// rulesStrg stores the rules obtained from the hosts' file.
|
||||||
|
rulesStrg *filterlist.RuleStorage
|
||||||
|
// engine serves rulesStrg.
|
||||||
|
engine *urlfilter.DNSEngine
|
||||||
|
|
||||||
|
// translator maps generated $dnsrewrite rules into hosts-syntax rules.
|
||||||
|
//
|
||||||
|
// TODO(e.burkov): Store the filename from which the rule was parsed.
|
||||||
|
translator map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// MatchName returns the records for the hostname.
|
// MatchRequest processes the request rewriting hostnames and addresses read
|
||||||
func (hc *HostsContainer) MatchName(name string) (recs []*hostsfile.Record) {
|
// from the operating system's hosts files. res is nil for any request having
|
||||||
cur := hc.current.Load()
|
// not an A/AAAA or PTR type, see man 5 hosts.
|
||||||
if cur != nil {
|
//
|
||||||
recs = cur.names[name]
|
// It's safe for concurrent use.
|
||||||
|
func (rm *requestMatcher) MatchRequest(
|
||||||
|
req *urlfilter.DNSRequest,
|
||||||
|
) (res *urlfilter.DNSResult, ok bool) {
|
||||||
|
switch req.DNSType {
|
||||||
|
case dns.TypeA, dns.TypeAAAA, dns.TypePTR:
|
||||||
|
log.Debug("%s: handling the request for %s", hostsContainerPrefix, req.Hostname)
|
||||||
|
default:
|
||||||
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
return recs
|
rm.stateLock.RLock()
|
||||||
|
defer rm.stateLock.RUnlock()
|
||||||
|
|
||||||
|
return rm.engine.MatchRequest(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Translate returns the source hosts-syntax rule for the generated dnsrewrite
|
||||||
|
// rule or an empty string if the last doesn't exist. The returned rules are in
|
||||||
|
// a processed format like:
|
||||||
|
//
|
||||||
|
// ip host1 host2 ...
|
||||||
|
func (rm *requestMatcher) Translate(rule string) (hostRule string) {
|
||||||
|
rm.stateLock.RLock()
|
||||||
|
defer rm.stateLock.RUnlock()
|
||||||
|
|
||||||
|
return rm.translator[rule]
|
||||||
|
}
|
||||||
|
|
||||||
|
// resetEng updates container's engine and the translation map.
|
||||||
|
func (rm *requestMatcher) resetEng(rulesStrg *filterlist.RuleStorage, tr map[string]string) {
|
||||||
|
rm.stateLock.Lock()
|
||||||
|
defer rm.stateLock.Unlock()
|
||||||
|
|
||||||
|
rm.rulesStrg = rulesStrg
|
||||||
|
rm.engine = urlfilter.NewDNSEngine(rm.rulesStrg)
|
||||||
|
|
||||||
|
rm.translator = tr
|
||||||
}
|
}
|
||||||
|
|
||||||
// hostsContainerPrefix is a prefix for logging and wrapping errors in
|
// hostsContainerPrefix is a prefix for logging and wrapping errors in
|
||||||
// HostsContainer's methods.
|
// HostsContainer's methods.
|
||||||
const hostsContainerPrefix = "hosts container"
|
const hostsContainerPrefix = "hosts container"
|
||||||
|
|
||||||
// Hosts is a map of IP addresses to the records, as it primarily stored in the
|
|
||||||
// [HostsContainer]. It should not be accessed for writing since it may be read
|
|
||||||
// concurrently, users should clone it before modifying.
|
|
||||||
//
|
|
||||||
// The order of records for each address is preserved from original files, but
|
|
||||||
// the order of the addresses, being a map key, is not.
|
|
||||||
//
|
|
||||||
// TODO(e.burkov): Probably, this should be a sorted slice of records.
|
|
||||||
type Hosts map[netip.Addr][]*hostsfile.Record
|
|
||||||
|
|
||||||
// HostsContainer stores the relevant hosts database provided by the OS and
|
// HostsContainer stores the relevant hosts database provided by the OS and
|
||||||
// processes both A/AAAA and PTR DNS requests for those.
|
// processes both A/AAAA and PTR DNS requests for those.
|
||||||
type HostsContainer struct {
|
type HostsContainer struct {
|
||||||
|
// requestMatcher matches the requests and translates the rules. It's
|
||||||
|
// embedded to implement MatchRequest and Translate for *HostsContainer.
|
||||||
|
//
|
||||||
|
// TODO(a.garipov, e.burkov): Consider fully merging into HostsContainer.
|
||||||
|
requestMatcher
|
||||||
|
|
||||||
// done is the channel to sign closing the container.
|
// done is the channel to sign closing the container.
|
||||||
done chan struct{}
|
done chan struct{}
|
||||||
|
|
||||||
// updates is the channel for receiving updated hosts.
|
// updates is the channel for receiving updated hosts.
|
||||||
updates chan Hosts
|
updates chan HostsRecords
|
||||||
|
|
||||||
// current is the last set of hosts parsed.
|
// last is the set of hosts that was cached within last detected change.
|
||||||
current atomic.Pointer[hostsIndex]
|
last HostsRecords
|
||||||
|
|
||||||
// fsys is the working file system to read hosts files from.
|
// fsys is the working file system to read hosts files from.
|
||||||
fsys fs.FS
|
fsys fs.FS
|
||||||
@@ -77,6 +120,30 @@ type HostsContainer struct {
|
|||||||
|
|
||||||
// patterns stores specified paths in the fs.Glob-compatible form.
|
// patterns stores specified paths in the fs.Glob-compatible form.
|
||||||
patterns []string
|
patterns []string
|
||||||
|
|
||||||
|
// listID is the identifier for the list of generated rules.
|
||||||
|
listID int
|
||||||
|
}
|
||||||
|
|
||||||
|
// HostsRecords is a mapping of an IP address to its hosts data.
|
||||||
|
type HostsRecords map[netip.Addr]*HostsRecord
|
||||||
|
|
||||||
|
// HostsRecord represents a single hosts file record.
|
||||||
|
type HostsRecord struct {
|
||||||
|
Aliases *stringutil.Set
|
||||||
|
Canonical string
|
||||||
|
}
|
||||||
|
|
||||||
|
// equal returns true if all fields of rec are equal to field in other or they
|
||||||
|
// both are nil.
|
||||||
|
func (rec *HostsRecord) equal(other *HostsRecord) (ok bool) {
|
||||||
|
if rec == nil {
|
||||||
|
return other == nil
|
||||||
|
} else if other == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return rec.Canonical == other.Canonical && rec.Aliases.Equal(other.Aliases)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrNoHostsPaths is returned when there are no valid paths to watch passed to
|
// ErrNoHostsPaths is returned when there are no valid paths to watch passed to
|
||||||
@@ -88,6 +155,7 @@ const ErrNoHostsPaths errors.Error = "no valid paths to hosts files provided"
|
|||||||
// shouldn't be empty and each of paths should locate either a file or a
|
// shouldn't be empty and each of paths should locate either a file or a
|
||||||
// directory in fsys. fsys and w must be non-nil.
|
// directory in fsys. fsys and w must be non-nil.
|
||||||
func NewHostsContainer(
|
func NewHostsContainer(
|
||||||
|
listID int,
|
||||||
fsys fs.FS,
|
fsys fs.FS,
|
||||||
w aghos.FSWatcher,
|
w aghos.FSWatcher,
|
||||||
paths ...string,
|
paths ...string,
|
||||||
@@ -107,8 +175,12 @@ func NewHostsContainer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
hc = &HostsContainer{
|
hc = &HostsContainer{
|
||||||
|
requestMatcher: requestMatcher{
|
||||||
|
stateLock: &sync.RWMutex{},
|
||||||
|
},
|
||||||
|
listID: listID,
|
||||||
done: make(chan struct{}, 1),
|
done: make(chan struct{}, 1),
|
||||||
updates: make(chan Hosts, 1),
|
updates: make(chan HostsRecords, 1),
|
||||||
fsys: fsys,
|
fsys: fsys,
|
||||||
watcher: w,
|
watcher: w,
|
||||||
patterns: patterns,
|
patterns: patterns,
|
||||||
@@ -154,7 +226,7 @@ func (hc *HostsContainer) Close() (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Upd returns the channel into which the updates are sent.
|
// Upd returns the channel into which the updates are sent.
|
||||||
func (hc *HostsContainer) Upd() (updates <-chan Hosts) {
|
func (hc *HostsContainer) Upd() (updates <-chan HostsRecords) {
|
||||||
return hc.updates
|
return hc.updates
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,7 +273,7 @@ func (hc *HostsContainer) handleEvents() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := hc.refresh(); err != nil {
|
if err := hc.refresh(); err != nil {
|
||||||
log.Error("%s: warning: refreshing: %s", hostsContainerPrefix, err)
|
log.Error("%s: %s", hostsContainerPrefix, err)
|
||||||
}
|
}
|
||||||
case _, ok = <-hc.done:
|
case _, ok = <-hc.done:
|
||||||
// Go on.
|
// Go on.
|
||||||
@@ -209,83 +281,198 @@ func (hc *HostsContainer) handleEvents() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hostsParser is a helper type to parse rules from the operating system's hosts
|
||||||
|
// file. It exists for only a single refreshing session.
|
||||||
|
type hostsParser struct {
|
||||||
|
// rulesBuilder builds the resulting rules list content.
|
||||||
|
rulesBuilder *strings.Builder
|
||||||
|
|
||||||
|
// translations maps generated rules into actual hosts file lines.
|
||||||
|
translations map[string]string
|
||||||
|
|
||||||
|
// table stores only the unique IP-hostname pairs. It's also sent to the
|
||||||
|
// updates channel afterwards.
|
||||||
|
table HostsRecords
|
||||||
|
}
|
||||||
|
|
||||||
|
// newHostsParser creates a new *hostsParser with buffers of size taken from the
|
||||||
|
// previous parse.
|
||||||
|
func (hc *HostsContainer) newHostsParser() (hp *hostsParser) {
|
||||||
|
return &hostsParser{
|
||||||
|
rulesBuilder: &strings.Builder{},
|
||||||
|
translations: map[string]string{},
|
||||||
|
table: make(HostsRecords, len(hc.last)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseFile is a aghos.FileWalker for parsing the files with hosts syntax. It
|
||||||
|
// never signs to stop walking and never returns any additional patterns.
|
||||||
|
//
|
||||||
|
// See man hosts(5).
|
||||||
|
func (hp *hostsParser) parseFile(r io.Reader) (patterns []string, cont bool, err error) {
|
||||||
|
s := bufio.NewScanner(r)
|
||||||
|
for s.Scan() {
|
||||||
|
ip, hosts := hp.parseLine(s.Text())
|
||||||
|
if ip == (netip.Addr{}) || len(hosts) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
hp.addRecord(ip, hosts)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, true, s.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseLine parses the line having the hosts syntax ignoring invalid ones.
|
||||||
|
func (hp *hostsParser) parseLine(line string) (ip netip.Addr, hosts []string) {
|
||||||
|
fields := strings.Fields(line)
|
||||||
|
if len(fields) < 2 {
|
||||||
|
return netip.Addr{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ip, err := netip.ParseAddr(fields[0])
|
||||||
|
if err != nil {
|
||||||
|
return netip.Addr{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range fields[1:] {
|
||||||
|
hashIdx := strings.IndexByte(f, '#')
|
||||||
|
if hashIdx == 0 {
|
||||||
|
// The rest of the fields are a part of the comment so return.
|
||||||
|
break
|
||||||
|
} else if hashIdx > 0 {
|
||||||
|
// Only a part of the field is a comment.
|
||||||
|
f = f[:hashIdx]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that invalid hosts aren't turned into rules.
|
||||||
|
//
|
||||||
|
// See https://github.com/AdguardTeam/AdGuardHome/issues/3946.
|
||||||
|
//
|
||||||
|
// TODO(e.burkov): Investigate if hosts may contain DNS-SD domains.
|
||||||
|
err = netutil.ValidateHostname(f)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("%s: host %q is invalid, ignoring", hostsContainerPrefix, f)
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
hosts = append(hosts, f)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ip, hosts
|
||||||
|
}
|
||||||
|
|
||||||
|
// addRecord puts the record for the IP address to the rules builder if needed.
|
||||||
|
// The first host is considered to be the canonical name for the IP address.
|
||||||
|
// hosts must have at least one name.
|
||||||
|
func (hp *hostsParser) addRecord(ip netip.Addr, hosts []string) {
|
||||||
|
line := strings.Join(append([]string{ip.String()}, hosts...), " ")
|
||||||
|
|
||||||
|
rec, ok := hp.table[ip]
|
||||||
|
if !ok {
|
||||||
|
rec = &HostsRecord{
|
||||||
|
Aliases: stringutil.NewSet(),
|
||||||
|
}
|
||||||
|
|
||||||
|
rec.Canonical, hosts = hosts[0], hosts[1:]
|
||||||
|
hp.addRules(ip, rec.Canonical, line)
|
||||||
|
hp.table[ip] = rec
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, host := range hosts {
|
||||||
|
if rec.Canonical == host || rec.Aliases.Has(host) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
rec.Aliases.Add(host)
|
||||||
|
|
||||||
|
hp.addRules(ip, host, line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// addRules adds rules and rule translations for the line.
|
||||||
|
func (hp *hostsParser) addRules(ip netip.Addr, host, line string) {
|
||||||
|
rule, rulePtr := hp.writeRules(host, ip)
|
||||||
|
hp.translations[rule], hp.translations[rulePtr] = line, line
|
||||||
|
|
||||||
|
log.Debug("%s: added ip-host pair %q-%q", hostsContainerPrefix, ip, host)
|
||||||
|
}
|
||||||
|
|
||||||
|
// writeRules writes the actual rule for the qtype and the PTR for the host-ip
|
||||||
|
// pair into internal builders.
|
||||||
|
func (hp *hostsParser) writeRules(host string, ip netip.Addr) (rule, rulePtr string) {
|
||||||
|
// TODO(a.garipov): Add a netip.Addr version to netutil.
|
||||||
|
arpa, err := netutil.IPToReversedAddr(ip.AsSlice())
|
||||||
|
if err != nil {
|
||||||
|
return "", ""
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
nl = "\n"
|
||||||
|
|
||||||
|
rwSuccess = "^$dnsrewrite=NOERROR;"
|
||||||
|
rwSuccessPTR = "^$dnsrewrite=NOERROR;PTR;"
|
||||||
|
|
||||||
|
modLen = len(rules.MaskPipe) + len(rwSuccess) + len(";")
|
||||||
|
modLenPTR = len(rules.MaskPipe) + len(rwSuccessPTR)
|
||||||
|
)
|
||||||
|
|
||||||
|
var qtype string
|
||||||
|
// The validation of the IP address has been performed earlier so it is
|
||||||
|
// guaranteed to be either an IPv4 or an IPv6.
|
||||||
|
if ip.Is4() {
|
||||||
|
qtype = "A"
|
||||||
|
} else {
|
||||||
|
qtype = "AAAA"
|
||||||
|
}
|
||||||
|
|
||||||
|
ipStr := ip.String()
|
||||||
|
fqdn := dns.Fqdn(host)
|
||||||
|
|
||||||
|
ruleBuilder := &strings.Builder{}
|
||||||
|
ruleBuilder.Grow(modLen + len(host) + len(qtype) + len(ipStr))
|
||||||
|
stringutil.WriteToBuilder(ruleBuilder, rules.MaskPipe, host, rwSuccess, qtype, ";", ipStr)
|
||||||
|
rule = ruleBuilder.String()
|
||||||
|
|
||||||
|
ruleBuilder.Reset()
|
||||||
|
|
||||||
|
ruleBuilder.Grow(modLenPTR + len(arpa) + len(fqdn))
|
||||||
|
stringutil.WriteToBuilder(ruleBuilder, rules.MaskPipe, arpa, rwSuccessPTR, fqdn)
|
||||||
|
|
||||||
|
rulePtr = ruleBuilder.String()
|
||||||
|
|
||||||
|
hp.rulesBuilder.Grow(len(rule) + len(rulePtr) + 2*len(nl))
|
||||||
|
stringutil.WriteToBuilder(hp.rulesBuilder, rule, nl, rulePtr, nl)
|
||||||
|
|
||||||
|
return rule, rulePtr
|
||||||
|
}
|
||||||
|
|
||||||
// sendUpd tries to send the parsed data to the ch.
|
// sendUpd tries to send the parsed data to the ch.
|
||||||
func (hc *HostsContainer) sendUpd(recs Hosts) {
|
func (hp *hostsParser) sendUpd(ch chan HostsRecords) {
|
||||||
log.Debug("%s: sending upd", hostsContainerPrefix)
|
log.Debug("%s: sending upd", hostsContainerPrefix)
|
||||||
|
|
||||||
ch := hc.updates
|
upd := hp.table
|
||||||
select {
|
select {
|
||||||
case ch <- recs:
|
case ch <- upd:
|
||||||
// Updates are delivered. Go on.
|
// Updates are delivered. Go on.
|
||||||
case <-ch:
|
case <-ch:
|
||||||
ch <- recs
|
ch <- upd
|
||||||
log.Debug("%s: replaced the last update", hostsContainerPrefix)
|
log.Debug("%s: replaced the last update", hostsContainerPrefix)
|
||||||
case ch <- recs:
|
case ch <- upd:
|
||||||
// The previous update was just read and the next one pushed. Go on.
|
// The previous update was just read and the next one pushed. Go on.
|
||||||
default:
|
default:
|
||||||
log.Error("%s: the updates channel is broken", hostsContainerPrefix)
|
log.Error("%s: the updates channel is broken", hostsContainerPrefix)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// hostsIndex is a [hostsfile.Set] to enumerate all the records.
|
// newStrg creates a new rules storage from parsed data.
|
||||||
type hostsIndex struct {
|
func (hp *hostsParser) newStrg(id int) (s *filterlist.RuleStorage, err error) {
|
||||||
// addrs maps IP addresses to the records.
|
return filterlist.NewRuleStorage([]filterlist.RuleList{&filterlist.StringRuleList{
|
||||||
addrs Hosts
|
ID: id,
|
||||||
|
RulesText: hp.rulesBuilder.String(),
|
||||||
// names maps hostnames to the records.
|
IgnoreCosmetic: true,
|
||||||
names map[string][]*hostsfile.Record
|
}})
|
||||||
}
|
|
||||||
|
|
||||||
// walk is a file walking function for hostsIndex.
|
|
||||||
func (idx *hostsIndex) walk(r io.Reader) (patterns []string, cont bool, err error) {
|
|
||||||
return nil, true, hostsfile.Parse(idx, r, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// type check
|
|
||||||
var _ hostsfile.Set = (*hostsIndex)(nil)
|
|
||||||
|
|
||||||
// Add implements the [hostsfile.Set] interface for *hostsIndex.
|
|
||||||
func (idx *hostsIndex) Add(rec *hostsfile.Record) {
|
|
||||||
idx.addrs[rec.Addr] = append(idx.addrs[rec.Addr], rec)
|
|
||||||
for _, name := range rec.Names {
|
|
||||||
idx.names[name] = append(idx.names[name], rec)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// type check
|
|
||||||
var _ hostsfile.HandleSet = (*hostsIndex)(nil)
|
|
||||||
|
|
||||||
// HandleInvalid implements the [hostsfile.HandleSet] interface for *hostsIndex.
|
|
||||||
func (idx *hostsIndex) HandleInvalid(src string, _ []byte, err error) {
|
|
||||||
lineErr := &hostsfile.LineError{}
|
|
||||||
if !errors.As(err, &lineErr) {
|
|
||||||
// Must not happen if idx passed to [hostsfile.Parse].
|
|
||||||
return
|
|
||||||
} else if errors.Is(lineErr, hostsfile.ErrEmptyLine) {
|
|
||||||
// Ignore empty lines.
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("%s: warning: parsing %q: %s", hostsContainerPrefix, src, lineErr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// equalRecs is an equality function for [*hostsfile.Record].
|
|
||||||
func equalRecs(a, b *hostsfile.Record) (ok bool) {
|
|
||||||
return a.Addr == b.Addr && a.Source == b.Source && slices.Equal(a.Names, b.Names)
|
|
||||||
}
|
|
||||||
|
|
||||||
// equalRecSlices is an equality function for slices of [*hostsfile.Record].
|
|
||||||
func equalRecSlices(a, b []*hostsfile.Record) (ok bool) { return slices.EqualFunc(a, b, equalRecs) }
|
|
||||||
|
|
||||||
// Equal returns true if indexes are equal.
|
|
||||||
func (idx *hostsIndex) Equal(other *hostsIndex) (ok bool) {
|
|
||||||
if idx == nil {
|
|
||||||
return other == nil
|
|
||||||
} else if other == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return maps.EqualFunc(idx.addrs, other.addrs, equalRecSlices)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// refresh gets the data from specified files and propagates the updates if
|
// refresh gets the data from specified files and propagates the updates if
|
||||||
@@ -295,27 +482,27 @@ func (idx *hostsIndex) Equal(other *hostsIndex) (ok bool) {
|
|||||||
func (hc *HostsContainer) refresh() (err error) {
|
func (hc *HostsContainer) refresh() (err error) {
|
||||||
log.Debug("%s: refreshing", hostsContainerPrefix)
|
log.Debug("%s: refreshing", hostsContainerPrefix)
|
||||||
|
|
||||||
var addrLen, nameLen int
|
hp := hc.newHostsParser()
|
||||||
last := hc.current.Load()
|
if _, err = aghos.FileWalker(hp.parseFile).Walk(hc.fsys, hc.patterns...); err != nil {
|
||||||
if last != nil {
|
return fmt.Errorf("refreshing : %w", err)
|
||||||
addrLen, nameLen = len(last.addrs), len(last.names)
|
|
||||||
}
|
|
||||||
idx := &hostsIndex{
|
|
||||||
addrs: make(Hosts, addrLen),
|
|
||||||
names: make(map[string][]*hostsfile.Record, nameLen),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = aghos.FileWalker(idx.walk).Walk(hc.fsys, hc.patterns...)
|
// hc.last is nil on the first refresh, so let that one through.
|
||||||
if err != nil {
|
if hc.last != nil && maps.EqualFunc(hp.table, hc.last, (*HostsRecord).equal) {
|
||||||
// Don't wrap the error since it's informative enough as is.
|
log.Debug("%s: no changes detected", hostsContainerPrefix)
|
||||||
return err
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
defer hp.sendUpd(hc.updates)
|
||||||
|
|
||||||
|
hc.last = maps.Clone(hp.table)
|
||||||
|
|
||||||
|
var rulesStrg *filterlist.RuleStorage
|
||||||
|
if rulesStrg, err = hp.newStrg(hc.listID); err != nil {
|
||||||
|
return fmt.Errorf("initializing rules storage: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(e.burkov): Serialize updates using time.
|
hc.resetEng(rulesStrg, hp.translations)
|
||||||
if !last.Equal(idx) {
|
|
||||||
hc.current.Store(idx)
|
|
||||||
hc.sendUpd(idx.addrs)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
package aghnet
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io/fs"
|
|
||||||
"path"
|
|
||||||
"testing"
|
|
||||||
"testing/fstest"
|
|
||||||
|
|
||||||
"github.com/AdguardTeam/golibs/errors"
|
|
||||||
"github.com/AdguardTeam/golibs/testutil/fakefs"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
|
||||||
|
|
||||||
const nl = "\n"
|
|
||||||
|
|
||||||
func TestHostsContainer_PathsToPatterns(t *testing.T) {
|
|
||||||
gsfs := fstest.MapFS{
|
|
||||||
"dir_0/file_1": &fstest.MapFile{Data: []byte{1}},
|
|
||||||
"dir_0/file_2": &fstest.MapFile{Data: []byte{2}},
|
|
||||||
"dir_0/dir_1/file_3": &fstest.MapFile{Data: []byte{3}},
|
|
||||||
}
|
|
||||||
|
|
||||||
testCases := []struct {
|
|
||||||
name string
|
|
||||||
paths []string
|
|
||||||
want []string
|
|
||||||
}{{
|
|
||||||
name: "no_paths",
|
|
||||||
paths: nil,
|
|
||||||
want: nil,
|
|
||||||
}, {
|
|
||||||
name: "single_file",
|
|
||||||
paths: []string{"dir_0/file_1"},
|
|
||||||
want: []string{"dir_0/file_1"},
|
|
||||||
}, {
|
|
||||||
name: "several_files",
|
|
||||||
paths: []string{"dir_0/file_1", "dir_0/file_2"},
|
|
||||||
want: []string{"dir_0/file_1", "dir_0/file_2"},
|
|
||||||
}, {
|
|
||||||
name: "whole_dir",
|
|
||||||
paths: []string{"dir_0"},
|
|
||||||
want: []string{"dir_0/*"},
|
|
||||||
}, {
|
|
||||||
name: "file_and_dir",
|
|
||||||
paths: []string{"dir_0/file_1", "dir_0/dir_1"},
|
|
||||||
want: []string{"dir_0/file_1", "dir_0/dir_1/*"},
|
|
||||||
}, {
|
|
||||||
name: "non-existing",
|
|
||||||
paths: []string{path.Join("dir_0", "file_3")},
|
|
||||||
want: nil,
|
|
||||||
}}
|
|
||||||
|
|
||||||
for _, tc := range testCases {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
patterns, err := pathsToPatterns(gsfs, tc.paths)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
assert.Equal(t, tc.want, patterns)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Run("bad_file", func(t *testing.T) {
|
|
||||||
const errStat errors.Error = "bad file"
|
|
||||||
|
|
||||||
badFS := &fakefs.StatFS{
|
|
||||||
OnOpen: func(_ string) (f fs.File, err error) { panic("not implemented") },
|
|
||||||
OnStat: func(name string) (fi fs.FileInfo, err error) {
|
|
||||||
return nil, errStat
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := pathsToPatterns(badFS, []string{""})
|
|
||||||
assert.ErrorIs(t, err, errStat)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,156 +1,32 @@
|
|||||||
package aghnet_test
|
package aghnet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/fs"
|
||||||
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
"testing/fstest"
|
"testing/fstest"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghchan"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghchan"
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghnet"
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghtest"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghtest"
|
||||||
"github.com/AdguardTeam/golibs/errors"
|
"github.com/AdguardTeam/golibs/errors"
|
||||||
"github.com/AdguardTeam/golibs/hostsfile"
|
|
||||||
"github.com/AdguardTeam/golibs/netutil"
|
"github.com/AdguardTeam/golibs/netutil"
|
||||||
|
"github.com/AdguardTeam/golibs/stringutil"
|
||||||
"github.com/AdguardTeam/golibs/testutil"
|
"github.com/AdguardTeam/golibs/testutil"
|
||||||
|
"github.com/AdguardTeam/urlfilter"
|
||||||
|
"github.com/AdguardTeam/urlfilter/rules"
|
||||||
|
"github.com/miekg/dns"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
// nl is a newline character.
|
const (
|
||||||
const nl = "\n"
|
nl = "\n"
|
||||||
|
sp = " "
|
||||||
// Variables mirroring the etc_hosts file from testdata.
|
|
||||||
var (
|
|
||||||
addr1000 = netip.MustParseAddr("1.0.0.0")
|
|
||||||
addr1001 = netip.MustParseAddr("1.0.0.1")
|
|
||||||
addr1002 = netip.MustParseAddr("1.0.0.2")
|
|
||||||
addr1003 = netip.MustParseAddr("1.0.0.3")
|
|
||||||
addr1004 = netip.MustParseAddr("1.0.0.4")
|
|
||||||
addr1357 = netip.MustParseAddr("1.3.5.7")
|
|
||||||
addr4216 = netip.MustParseAddr("4.2.1.6")
|
|
||||||
addr7531 = netip.MustParseAddr("7.5.3.1")
|
|
||||||
|
|
||||||
addr0 = netip.MustParseAddr("::")
|
|
||||||
addr1 = netip.MustParseAddr("::1")
|
|
||||||
addr2 = netip.MustParseAddr("::2")
|
|
||||||
addr3 = netip.MustParseAddr("::3")
|
|
||||||
addr4 = netip.MustParseAddr("::4")
|
|
||||||
addr42 = netip.MustParseAddr("::42")
|
|
||||||
addr13 = netip.MustParseAddr("::13")
|
|
||||||
addr31 = netip.MustParseAddr("::31")
|
|
||||||
|
|
||||||
hostsSrc = "./" + filepath.Join("./testdata", "etc_hosts")
|
|
||||||
|
|
||||||
testHosts = map[netip.Addr][]*hostsfile.Record{
|
|
||||||
addr1000: {{
|
|
||||||
Addr: addr1000,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"hello", "hello.world"},
|
|
||||||
}, {
|
|
||||||
Addr: addr1000,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"hello.world.again"},
|
|
||||||
}, {
|
|
||||||
Addr: addr1000,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"hello.world"},
|
|
||||||
}},
|
|
||||||
addr1001: {{
|
|
||||||
Addr: addr1001,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"simplehost"},
|
|
||||||
}, {
|
|
||||||
Addr: addr1001,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"simplehost"},
|
|
||||||
}},
|
|
||||||
addr1002: {{
|
|
||||||
Addr: addr1002,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"a.whole", "lot.of", "aliases", "for.testing"},
|
|
||||||
}},
|
|
||||||
addr1003: {{
|
|
||||||
Addr: addr1003,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"*"},
|
|
||||||
}},
|
|
||||||
addr1004: {{
|
|
||||||
Addr: addr1004,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"*.com"},
|
|
||||||
}},
|
|
||||||
addr1357: {{
|
|
||||||
Addr: addr1357,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"domain4", "domain4.alias"},
|
|
||||||
}},
|
|
||||||
addr7531: {{
|
|
||||||
Addr: addr7531,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"domain4.alias", "domain4"},
|
|
||||||
}},
|
|
||||||
addr4216: {{
|
|
||||||
Addr: addr4216,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"domain", "domain.alias"},
|
|
||||||
}},
|
|
||||||
addr0: {{
|
|
||||||
Addr: addr0,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"hello", "hello.world"},
|
|
||||||
}, {
|
|
||||||
Addr: addr0,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"hello.world.again"},
|
|
||||||
}, {
|
|
||||||
Addr: addr0,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"hello.world"},
|
|
||||||
}},
|
|
||||||
addr1: {{
|
|
||||||
Addr: addr1,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"simplehost"},
|
|
||||||
}, {
|
|
||||||
Addr: addr1,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"simplehost"},
|
|
||||||
}},
|
|
||||||
addr2: {{
|
|
||||||
Addr: addr2,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"a.whole", "lot.of", "aliases", "for.testing"},
|
|
||||||
}},
|
|
||||||
addr3: {{
|
|
||||||
Addr: addr3,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"*"},
|
|
||||||
}},
|
|
||||||
addr4: {{
|
|
||||||
Addr: addr4,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"*.com"},
|
|
||||||
}},
|
|
||||||
addr42: {{
|
|
||||||
Addr: addr42,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"domain.alias", "domain"},
|
|
||||||
}},
|
|
||||||
addr13: {{
|
|
||||||
Addr: addr13,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"domain6", "domain6.alias"},
|
|
||||||
}},
|
|
||||||
addr31: {{
|
|
||||||
Addr: addr31,
|
|
||||||
Source: hostsSrc,
|
|
||||||
Names: []string{"domain6.alias", "domain6"},
|
|
||||||
}},
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewHostsContainer(t *testing.T) {
|
func TestNewHostsContainer(t *testing.T) {
|
||||||
@@ -172,11 +48,11 @@ func TestNewHostsContainer(t *testing.T) {
|
|||||||
name: "one_file",
|
name: "one_file",
|
||||||
paths: []string{p},
|
paths: []string{p},
|
||||||
}, {
|
}, {
|
||||||
wantErr: aghnet.ErrNoHostsPaths,
|
wantErr: ErrNoHostsPaths,
|
||||||
name: "no_files",
|
name: "no_files",
|
||||||
paths: []string{},
|
paths: []string{},
|
||||||
}, {
|
}, {
|
||||||
wantErr: aghnet.ErrNoHostsPaths,
|
wantErr: ErrNoHostsPaths,
|
||||||
name: "non-existent_file",
|
name: "non-existent_file",
|
||||||
paths: []string{path.Join(dirname, filename+"2")},
|
paths: []string{path.Join(dirname, filename+"2")},
|
||||||
}, {
|
}, {
|
||||||
@@ -201,7 +77,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||||||
return eventsCh
|
return eventsCh
|
||||||
}
|
}
|
||||||
|
|
||||||
hc, err := aghnet.NewHostsContainer(testFS, &aghtest.FSWatcher{
|
hc, err := NewHostsContainer(0, testFS, &aghtest.FSWatcher{
|
||||||
OnEvents: onEvents,
|
OnEvents: onEvents,
|
||||||
OnAdd: onAdd,
|
OnAdd: onAdd,
|
||||||
OnClose: func() (err error) { return nil },
|
OnClose: func() (err error) { return nil },
|
||||||
@@ -227,7 +103,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("nil_fs", func(t *testing.T) {
|
t.Run("nil_fs", func(t *testing.T) {
|
||||||
require.Panics(t, func() {
|
require.Panics(t, func() {
|
||||||
_, _ = aghnet.NewHostsContainer(nil, &aghtest.FSWatcher{
|
_, _ = NewHostsContainer(0, nil, &aghtest.FSWatcher{
|
||||||
// Those shouldn't panic.
|
// Those shouldn't panic.
|
||||||
OnEvents: func() (e <-chan struct{}) { return nil },
|
OnEvents: func() (e <-chan struct{}) { return nil },
|
||||||
OnAdd: func(name string) (err error) { return nil },
|
OnAdd: func(name string) (err error) { return nil },
|
||||||
@@ -238,7 +114,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("nil_watcher", func(t *testing.T) {
|
t.Run("nil_watcher", func(t *testing.T) {
|
||||||
require.Panics(t, func() {
|
require.Panics(t, func() {
|
||||||
_, _ = aghnet.NewHostsContainer(testFS, nil, p)
|
_, _ = NewHostsContainer(0, testFS, nil, p)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -251,7 +127,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||||||
OnClose: func() (err error) { return nil },
|
OnClose: func() (err error) { return nil },
|
||||||
}
|
}
|
||||||
|
|
||||||
hc, err := aghnet.NewHostsContainer(testFS, errWatcher, p)
|
hc, err := NewHostsContainer(0, testFS, errWatcher, p)
|
||||||
require.ErrorIs(t, err, errOnAdd)
|
require.ErrorIs(t, err, errOnAdd)
|
||||||
|
|
||||||
assert.Nil(t, hc)
|
assert.Nil(t, hc)
|
||||||
@@ -264,9 +140,6 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||||||
ip := netutil.IPv4Localhost()
|
ip := netutil.IPv4Localhost()
|
||||||
ipStr := ip.String()
|
ipStr := ip.String()
|
||||||
|
|
||||||
anotherIPStr := "1.2.3.4"
|
|
||||||
anotherIP := netip.MustParseAddr(anotherIPStr)
|
|
||||||
|
|
||||||
testFS := fstest.MapFS{"dir/file1": &fstest.MapFile{Data: []byte(ipStr + ` hostname` + nl)}}
|
testFS := fstest.MapFS{"dir/file1": &fstest.MapFile{Data: []byte(ipStr + ` hostname` + nl)}}
|
||||||
|
|
||||||
// event is a convenient alias for an empty struct{} to emit test events.
|
// event is a convenient alias for an empty struct{} to emit test events.
|
||||||
@@ -285,44 +158,40 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||||||
OnClose: func() (err error) { return nil },
|
OnClose: func() (err error) { return nil },
|
||||||
}
|
}
|
||||||
|
|
||||||
hc, err := aghnet.NewHostsContainer(testFS, w, "dir")
|
hc, err := NewHostsContainer(0, testFS, w, "dir")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
||||||
|
|
||||||
checkRefresh := func(t *testing.T, want aghnet.Hosts) {
|
checkRefresh := func(t *testing.T, want *HostsRecord) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
upd, ok := aghchan.MustReceive(hc.Upd(), 1*time.Second)
|
upd, ok := aghchan.MustReceive(hc.Upd(), 1*time.Second)
|
||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
|
require.NotNil(t, upd)
|
||||||
|
|
||||||
assert.Equal(t, want, upd)
|
assert.Len(t, upd, 1)
|
||||||
|
|
||||||
|
rec, ok := upd[ip]
|
||||||
|
require.True(t, ok)
|
||||||
|
require.NotNil(t, rec)
|
||||||
|
|
||||||
|
assert.Truef(t, rec.equal(want), "%+v != %+v", rec, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("initial_refresh", func(t *testing.T) {
|
t.Run("initial_refresh", func(t *testing.T) {
|
||||||
checkRefresh(t, aghnet.Hosts{
|
checkRefresh(t, &HostsRecord{
|
||||||
ip: {{
|
Aliases: stringutil.NewSet(),
|
||||||
Addr: ip,
|
Canonical: "hostname",
|
||||||
Source: "file1",
|
|
||||||
Names: []string{"hostname"},
|
|
||||||
}},
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("second_refresh", func(t *testing.T) {
|
t.Run("second_refresh", func(t *testing.T) {
|
||||||
testFS["dir/file2"] = &fstest.MapFile{Data: []byte(anotherIPStr + ` alias` + nl)}
|
testFS["dir/file2"] = &fstest.MapFile{Data: []byte(ipStr + ` alias` + nl)}
|
||||||
eventsCh <- event{}
|
eventsCh <- event{}
|
||||||
|
|
||||||
checkRefresh(t, aghnet.Hosts{
|
checkRefresh(t, &HostsRecord{
|
||||||
ip: {{
|
Aliases: stringutil.NewSet("alias"),
|
||||||
Addr: ip,
|
Canonical: "hostname",
|
||||||
Source: "file1",
|
|
||||||
Names: []string{"hostname"},
|
|
||||||
}},
|
|
||||||
anotherIP: {{
|
|
||||||
Addr: anotherIP,
|
|
||||||
Source: "file2",
|
|
||||||
Names: []string{"alias"},
|
|
||||||
}},
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -333,9 +202,12 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||||||
|
|
||||||
// Require the changes are written.
|
// Require the changes are written.
|
||||||
require.Eventually(t, func() bool {
|
require.Eventually(t, func() bool {
|
||||||
ips := hc.MatchName("hostname")
|
res, ok := hc.MatchRequest(&urlfilter.DNSRequest{
|
||||||
|
Hostname: "hostname",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
})
|
||||||
|
|
||||||
return len(ips) == 0
|
return !ok && res.DNSRewrites() == nil
|
||||||
}, 5*time.Second, time.Second/2)
|
}, 5*time.Second, time.Second/2)
|
||||||
|
|
||||||
// Make a change again.
|
// Make a change again.
|
||||||
@@ -344,117 +216,411 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||||||
|
|
||||||
// Require the changes are written.
|
// Require the changes are written.
|
||||||
require.Eventually(t, func() bool {
|
require.Eventually(t, func() bool {
|
||||||
ips := hc.MatchName("hostname")
|
res, ok := hc.MatchRequest(&urlfilter.DNSRequest{
|
||||||
|
Hostname: "hostname",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
})
|
||||||
|
|
||||||
return len(ips) > 0
|
return !ok && res.DNSRewrites() != nil
|
||||||
}, 5*time.Second, time.Second/2)
|
}, 5*time.Second, time.Second/2)
|
||||||
|
|
||||||
assert.Len(t, hc.Upd(), 1)
|
assert.Len(t, hc.Upd(), 1)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHostsContainer_MatchName(t *testing.T) {
|
func TestHostsContainer_PathsToPatterns(t *testing.T) {
|
||||||
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
gsfs := fstest.MapFS{
|
||||||
|
"dir_0/file_1": &fstest.MapFile{Data: []byte{1}},
|
||||||
stubWatcher := aghtest.FSWatcher{
|
"dir_0/file_2": &fstest.MapFile{Data: []byte{2}},
|
||||||
OnEvents: func() (e <-chan struct{}) { return nil },
|
"dir_0/dir_1/file_3": &fstest.MapFile{Data: []byte{3}},
|
||||||
OnAdd: func(name string) (err error) { return nil },
|
|
||||||
OnClose: func() (err error) { return nil },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
req string
|
|
||||||
name string
|
name string
|
||||||
want []*hostsfile.Record
|
paths []string
|
||||||
|
want []string
|
||||||
}{{
|
}{{
|
||||||
req: "simplehost",
|
name: "no_paths",
|
||||||
name: "simple",
|
paths: nil,
|
||||||
want: append(testHosts[addr1001], testHosts[addr1]...),
|
|
||||||
}, {
|
|
||||||
req: "hello.world",
|
|
||||||
name: "hello_alias",
|
|
||||||
want: []*hostsfile.Record{
|
|
||||||
testHosts[addr1000][0],
|
|
||||||
testHosts[addr1000][2],
|
|
||||||
testHosts[addr0][0],
|
|
||||||
testHosts[addr0][2],
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
req: "hello.world.again",
|
|
||||||
name: "other_line_alias",
|
|
||||||
want: []*hostsfile.Record{
|
|
||||||
testHosts[addr1000][1],
|
|
||||||
testHosts[addr0][1],
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
req: "say.hello",
|
|
||||||
name: "hello_subdomain",
|
|
||||||
want: nil,
|
want: nil,
|
||||||
}, {
|
}, {
|
||||||
req: "say.hello.world",
|
name: "single_file",
|
||||||
name: "hello_alias_subdomain",
|
paths: []string{"dir_0/file_1"},
|
||||||
want: nil,
|
want: []string{"dir_0/file_1"},
|
||||||
}, {
|
}, {
|
||||||
req: "for.testing",
|
name: "several_files",
|
||||||
name: "lots_of_aliases",
|
paths: []string{"dir_0/file_1", "dir_0/file_2"},
|
||||||
want: append(testHosts[addr1002], testHosts[addr2]...),
|
want: []string{"dir_0/file_1", "dir_0/file_2"},
|
||||||
|
}, {
|
||||||
|
name: "whole_dir",
|
||||||
|
paths: []string{"dir_0"},
|
||||||
|
want: []string{"dir_0/*"},
|
||||||
|
}, {
|
||||||
|
name: "file_and_dir",
|
||||||
|
paths: []string{"dir_0/file_1", "dir_0/dir_1"},
|
||||||
|
want: []string{"dir_0/file_1", "dir_0/dir_1/*"},
|
||||||
}, {
|
}, {
|
||||||
req: "nonexistent.example",
|
|
||||||
name: "non-existing",
|
name: "non-existing",
|
||||||
|
paths: []string{path.Join("dir_0", "file_3")},
|
||||||
want: nil,
|
want: nil,
|
||||||
}, {
|
|
||||||
req: "domain",
|
|
||||||
name: "issue_4216_4_6",
|
|
||||||
want: append(testHosts[addr4216], testHosts[addr42]...),
|
|
||||||
}, {
|
|
||||||
req: "domain4",
|
|
||||||
name: "issue_4216_4",
|
|
||||||
want: append(testHosts[addr1357], testHosts[addr7531]...),
|
|
||||||
}, {
|
|
||||||
req: "domain6",
|
|
||||||
name: "issue_4216_6",
|
|
||||||
want: append(testHosts[addr13], testHosts[addr31]...),
|
|
||||||
}}
|
}}
|
||||||
|
|
||||||
hc, err := aghnet.NewHostsContainer(testdata, &stubWatcher, "etc_hosts")
|
|
||||||
require.NoError(t, err)
|
|
||||||
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
recs := hc.MatchName(tc.req)
|
patterns, err := pathsToPatterns(gsfs, tc.paths)
|
||||||
assert.Equal(t, tc.want, recs)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, tc.want, patterns)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("bad_file", func(t *testing.T) {
|
||||||
|
const errStat errors.Error = "bad file"
|
||||||
|
|
||||||
|
badFS := &aghtest.StatFS{
|
||||||
|
OnStat: func(name string) (fs.FileInfo, error) {
|
||||||
|
return nil, errStat
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := pathsToPatterns(badFS, []string{""})
|
||||||
|
assert.ErrorIs(t, err, errStat)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHostsContainer_Translate(t *testing.T) {
|
||||||
|
stubWatcher := aghtest.FSWatcher{
|
||||||
|
OnEvents: func() (e <-chan struct{}) { return nil },
|
||||||
|
OnAdd: func(name string) (err error) { return nil },
|
||||||
|
OnClose: func() (err error) { return nil },
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
||||||
|
|
||||||
|
hc, err := NewHostsContainer(0, testdata, &stubWatcher, "etc_hosts")
|
||||||
|
require.NoError(t, err)
|
||||||
|
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
rule string
|
||||||
|
wantTrans []string
|
||||||
|
}{{
|
||||||
|
name: "simplehost",
|
||||||
|
rule: "|simplehost^$dnsrewrite=NOERROR;A;1.0.0.1",
|
||||||
|
wantTrans: []string{"1.0.0.1", "simplehost"},
|
||||||
|
}, {
|
||||||
|
name: "hello",
|
||||||
|
rule: "|hello^$dnsrewrite=NOERROR;A;1.0.0.0",
|
||||||
|
wantTrans: []string{"1.0.0.0", "hello", "hello.world"},
|
||||||
|
}, {
|
||||||
|
name: "hello-alias",
|
||||||
|
rule: "|hello.world.again^$dnsrewrite=NOERROR;A;1.0.0.0",
|
||||||
|
wantTrans: []string{"1.0.0.0", "hello.world.again"},
|
||||||
|
}, {
|
||||||
|
name: "simplehost_v6",
|
||||||
|
rule: "|simplehost^$dnsrewrite=NOERROR;AAAA;::1",
|
||||||
|
wantTrans: []string{"::1", "simplehost"},
|
||||||
|
}, {
|
||||||
|
name: "hello_v6",
|
||||||
|
rule: "|hello^$dnsrewrite=NOERROR;AAAA;::",
|
||||||
|
wantTrans: []string{"::", "hello", "hello.world"},
|
||||||
|
}, {
|
||||||
|
name: "hello_v6-alias",
|
||||||
|
rule: "|hello.world.again^$dnsrewrite=NOERROR;AAAA;::",
|
||||||
|
wantTrans: []string{"::", "hello.world.again"},
|
||||||
|
}, {
|
||||||
|
name: "simplehost_ptr",
|
||||||
|
rule: "|1.0.0.1.in-addr.arpa^$dnsrewrite=NOERROR;PTR;simplehost.",
|
||||||
|
wantTrans: []string{"1.0.0.1", "simplehost"},
|
||||||
|
}, {
|
||||||
|
name: "hello_ptr",
|
||||||
|
rule: "|0.0.0.1.in-addr.arpa^$dnsrewrite=NOERROR;PTR;hello.",
|
||||||
|
wantTrans: []string{"1.0.0.0", "hello", "hello.world"},
|
||||||
|
}, {
|
||||||
|
name: "hello_ptr-alias",
|
||||||
|
rule: "|0.0.0.1.in-addr.arpa^$dnsrewrite=NOERROR;PTR;hello.world.again.",
|
||||||
|
wantTrans: []string{"1.0.0.0", "hello.world.again"},
|
||||||
|
}, {
|
||||||
|
name: "simplehost_ptr_v6",
|
||||||
|
rule: "|1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" +
|
||||||
|
"^$dnsrewrite=NOERROR;PTR;simplehost.",
|
||||||
|
wantTrans: []string{"::1", "simplehost"},
|
||||||
|
}, {
|
||||||
|
name: "hello_ptr_v6",
|
||||||
|
rule: "|0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" +
|
||||||
|
"^$dnsrewrite=NOERROR;PTR;hello.",
|
||||||
|
wantTrans: []string{"::", "hello", "hello.world"},
|
||||||
|
}, {
|
||||||
|
name: "hello_ptr_v6-alias",
|
||||||
|
rule: "|0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" +
|
||||||
|
"^$dnsrewrite=NOERROR;PTR;hello.world.again.",
|
||||||
|
wantTrans: []string{"::", "hello.world.again"},
|
||||||
|
}}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
got := stringutil.NewSet(strings.Fields(hc.Translate(tc.rule))...)
|
||||||
|
assert.True(t, stringutil.NewSet(tc.wantTrans...).Equal(got))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHostsContainer_MatchAddr(t *testing.T) {
|
func TestHostsContainer(t *testing.T) {
|
||||||
|
const listID = 1234
|
||||||
|
|
||||||
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
req *urlfilter.DNSRequest
|
||||||
|
name string
|
||||||
|
want []*rules.DNSRewrite
|
||||||
|
}{{
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "simplehost",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "simple",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
Value: net.IPv4(1, 0, 0, 1),
|
||||||
|
RRType: dns.TypeA,
|
||||||
|
}, {
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
Value: net.ParseIP("::1"),
|
||||||
|
RRType: dns.TypeAAAA,
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "hello.world",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "hello_alias",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
Value: net.IPv4(1, 0, 0, 0),
|
||||||
|
RRType: dns.TypeA,
|
||||||
|
}, {
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
Value: net.ParseIP("::"),
|
||||||
|
RRType: dns.TypeAAAA,
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "hello.world.again",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "other_line_alias",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
Value: net.IPv4(1, 0, 0, 0),
|
||||||
|
RRType: dns.TypeA,
|
||||||
|
}, {
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
Value: net.ParseIP("::"),
|
||||||
|
RRType: dns.TypeAAAA,
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "say.hello",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "hello_subdomain",
|
||||||
|
want: []*rules.DNSRewrite{},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "say.hello.world",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "hello_alias_subdomain",
|
||||||
|
want: []*rules.DNSRewrite{},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "for.testing",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "lots_of_aliases",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeA,
|
||||||
|
Value: net.IPv4(1, 0, 0, 2),
|
||||||
|
}, {
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeAAAA,
|
||||||
|
Value: net.ParseIP("::2"),
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "1.0.0.1.in-addr.arpa",
|
||||||
|
DNSType: dns.TypePTR,
|
||||||
|
},
|
||||||
|
name: "reverse",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypePTR,
|
||||||
|
Value: "simplehost.",
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "nonexistent.example",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "non-existing",
|
||||||
|
want: []*rules.DNSRewrite{},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "1.0.0.1.in-addr.arpa",
|
||||||
|
DNSType: dns.TypeSRV,
|
||||||
|
},
|
||||||
|
name: "bad_type",
|
||||||
|
want: nil,
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "domain",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "issue_4216_4_6",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeA,
|
||||||
|
Value: net.IPv4(4, 2, 1, 6),
|
||||||
|
}, {
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeAAAA,
|
||||||
|
Value: net.ParseIP("::42"),
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "domain4",
|
||||||
|
DNSType: dns.TypeA,
|
||||||
|
},
|
||||||
|
name: "issue_4216_4",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeA,
|
||||||
|
Value: net.IPv4(7, 5, 3, 1),
|
||||||
|
}, {
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeA,
|
||||||
|
Value: net.IPv4(1, 3, 5, 7),
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
req: &urlfilter.DNSRequest{
|
||||||
|
Hostname: "domain6",
|
||||||
|
DNSType: dns.TypeAAAA,
|
||||||
|
},
|
||||||
|
name: "issue_4216_6",
|
||||||
|
want: []*rules.DNSRewrite{{
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeAAAA,
|
||||||
|
Value: net.ParseIP("::13"),
|
||||||
|
}, {
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeAAAA,
|
||||||
|
Value: net.ParseIP("::31"),
|
||||||
|
}},
|
||||||
|
}}
|
||||||
|
|
||||||
stubWatcher := aghtest.FSWatcher{
|
stubWatcher := aghtest.FSWatcher{
|
||||||
OnEvents: func() (e <-chan struct{}) { return nil },
|
OnEvents: func() (e <-chan struct{}) { return nil },
|
||||||
OnAdd: func(name string) (err error) { return nil },
|
OnAdd: func(name string) (err error) { return nil },
|
||||||
OnClose: func() (err error) { return nil },
|
OnClose: func() (err error) { return nil },
|
||||||
}
|
}
|
||||||
|
|
||||||
hc, err := aghnet.NewHostsContainer(testdata, &stubWatcher, "etc_hosts")
|
hc, err := NewHostsContainer(listID, testdata, &stubWatcher, "etc_hosts")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
||||||
|
|
||||||
testCases := []struct {
|
|
||||||
req netip.Addr
|
|
||||||
name string
|
|
||||||
want []*hostsfile.Record
|
|
||||||
}{{
|
|
||||||
req: netip.AddrFrom4([4]byte{1, 0, 0, 1}),
|
|
||||||
name: "reverse",
|
|
||||||
want: testHosts[addr1001],
|
|
||||||
}}
|
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
recs := hc.MatchAddr(tc.req)
|
res, ok := hc.MatchRequest(tc.req)
|
||||||
assert.Equal(t, tc.want, recs)
|
require.False(t, ok)
|
||||||
|
|
||||||
|
if tc.want == nil {
|
||||||
|
assert.Nil(t, res)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NotNil(t, res)
|
||||||
|
|
||||||
|
rewrites := res.DNSRewrites()
|
||||||
|
require.Len(t, rewrites, len(tc.want))
|
||||||
|
|
||||||
|
for i, rewrite := range rewrites {
|
||||||
|
require.Equal(t, listID, rewrite.FilterListID)
|
||||||
|
|
||||||
|
rw := rewrite.DNSRewrite
|
||||||
|
require.NotNil(t, rw)
|
||||||
|
|
||||||
|
assert.Equal(t, tc.want[i], rw)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUniqueRules_ParseLine(t *testing.T) {
|
||||||
|
ip := netutil.IPv4Localhost()
|
||||||
|
ipStr := ip.String()
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
line string
|
||||||
|
wantIP netip.Addr
|
||||||
|
wantHosts []string
|
||||||
|
}{{
|
||||||
|
name: "simple",
|
||||||
|
line: ipStr + ` hostname`,
|
||||||
|
wantIP: ip,
|
||||||
|
wantHosts: []string{"hostname"},
|
||||||
|
}, {
|
||||||
|
name: "aliases",
|
||||||
|
line: ipStr + ` hostname alias`,
|
||||||
|
wantIP: ip,
|
||||||
|
wantHosts: []string{"hostname", "alias"},
|
||||||
|
}, {
|
||||||
|
name: "invalid_line",
|
||||||
|
line: ipStr,
|
||||||
|
wantIP: netip.Addr{},
|
||||||
|
wantHosts: nil,
|
||||||
|
}, {
|
||||||
|
name: "invalid_line_hostname",
|
||||||
|
line: ipStr + ` # hostname`,
|
||||||
|
wantIP: ip,
|
||||||
|
wantHosts: nil,
|
||||||
|
}, {
|
||||||
|
name: "commented_aliases",
|
||||||
|
line: ipStr + ` hostname # alias`,
|
||||||
|
wantIP: ip,
|
||||||
|
wantHosts: []string{"hostname"},
|
||||||
|
}, {
|
||||||
|
name: "whole_comment",
|
||||||
|
line: `# ` + ipStr + ` hostname`,
|
||||||
|
wantIP: netip.Addr{},
|
||||||
|
wantHosts: nil,
|
||||||
|
}, {
|
||||||
|
name: "partial_comment",
|
||||||
|
line: ipStr + ` host#name`,
|
||||||
|
wantIP: ip,
|
||||||
|
wantHosts: []string{"host"},
|
||||||
|
}, {
|
||||||
|
name: "empty",
|
||||||
|
line: ``,
|
||||||
|
wantIP: netip.Addr{},
|
||||||
|
wantHosts: nil,
|
||||||
|
}, {
|
||||||
|
name: "bad_hosts",
|
||||||
|
line: ipStr + ` bad..host bad._tld empty.tld. ok.host`,
|
||||||
|
wantIP: ip,
|
||||||
|
wantHosts: []string{"ok.host"},
|
||||||
|
}}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
hp := hostsParser{}
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
got, hosts := hp.parseLine(tc.line)
|
||||||
|
assert.Equal(t, tc.wantIP, got)
|
||||||
|
assert.Equal(t, tc.wantHosts, hosts)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user