From 023e693831e84df066aab77b305f5a0c6de78a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Wed, 7 Mar 2018 09:27:19 +0100 Subject: [PATCH] start implementing resolver --- Cargo.lock | 246 ++++++++++++++++++++++----- Cargo.toml | 4 + data/Makefile | 6 + data/root-hint.txt | 39 +++++ lib/dnsbox-base/Cargo.toml | 2 +- src/bin/resolver/cache/mod.rs | 179 +++++++++++++++++++ src/bin/resolver/cache/root_hints.rs | 40 +++++ src/bin/resolver/main.rs | 11 ++ src/main.rs | 5 - 9 files changed, 482 insertions(+), 50 deletions(-) create mode 100644 data/Makefile create mode 100644 data/root-hint.txt create mode 100644 src/bin/resolver/cache/mod.rs create mode 100644 src/bin/resolver/cache/root_hints.rs create mode 100644 src/bin/resolver/main.rs delete mode 100644 src/main.rs diff --git a/Cargo.lock b/Cargo.lock index df61858..f45f9eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,43 +1,46 @@ [[package]] name = "backtrace" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "bitflags" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byteorder" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bytes" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -47,36 +50,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "data-encoding" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "dbghelp-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "dnsbox" version = "0.1.0" dependencies = [ "dnsbox-base 0.1.0", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "dnsbox-base" version = "0.1.0" dependencies = [ - "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "data-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "dnsbox-derive 0.1.0", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -93,7 +90,7 @@ name = "failure" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -108,11 +105,30 @@ dependencies = [ ] [[package]] -name = "iovec" -version = "0.1.0" +name = "fuchsia-zircon" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "iovec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -130,15 +146,72 @@ name = "lazy_static" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazycell" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" -version = "0.2.31" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "log" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "net2" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "quote" @@ -150,6 +223,21 @@ name = "rustc-demangle" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "scoped-tls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "smallvec" version = "0.4.4" @@ -182,6 +270,31 @@ dependencies = [ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-core" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-io" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "unicode-xid" version = "0.0.4" @@ -192,33 +305,78 @@ name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] -"checksum backtrace 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99f2ce94e22b8e664d95c57fff45b98a966c2252b60691d0b7aeeccd88d70983" -"checksum backtrace-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "c63ea141ef8fdb10409d0f5daf30ac51f84ef43bff66f16627773d2a292cd189" -"checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d" -"checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6" -"checksum cc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7db2f146208d7e0fbee761b09cd65a7f51ccc38705d4e7262dad4d73b12a76b1" +"checksum backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbbf59b1c43eefa8c3ede390fcc36820b4999f7914104015be25025e0d62af2" +"checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661" +"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" +"checksum bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7db437d718977f6dc9b2e3fd6fc343c02ac6b899b73fdd2179163447bd9ce9" +"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum data-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "099d2591f809713931cd770f2bdf4b8a4d2eb7314bc762da4c375ecaa74af80f" -"checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" +"checksum data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67df0571a74bf0d97fb8b2ed22abdd9a48475c96bd327db968b7d9cace99655e" "checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" "checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" -"checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0bab5b5e94f5c31fc764ba5dd9ad16568aae5d4825538c01d6bca680c9bf94a7" +"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" -"checksum libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d1419b2939a0bc44b77feb34661583c7546b532b192feab36249ab584b86856c" -"checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" +"checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" +"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "7da01a5e23070d92d99b1ecd1cd0af36447c6fd44b0fe283c2db199fa136724f" +"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aee45432acc62f7b9a108cc054142dac51f979e69e71ddce7d6fc7adf29e817e" +"checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d" +"checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" +"checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum smallvec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ee4f357e8cd37bf8822e1b964e96fd39e2cb5a0424f8aaa284ccaccc2162411c" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" +"checksum tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "52b4e32d8edbf29501aabb3570f027c6ceb00ccef6538f4bddba0200503e74e8" +"checksum tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b9532748772222bf70297ec0e2ad0f17213b4a7dd0e6afb68e0a0768f69f4e4f" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/Cargo.toml b/Cargo.toml index 2feedad..503a300 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,8 @@ authors = ["Stefan Bühler "] [dependencies] dnsbox-base = { path = "lib/dnsbox-base" } +futures = "0.1.18" +tokio-core = "0.1.12" +tokio-io = "0.1.5" + [workspace] diff --git a/data/Makefile b/data/Makefile new file mode 100644 index 0000000..705b1eb --- /dev/null +++ b/data/Makefile @@ -0,0 +1,6 @@ +all: root-hint.txt +.PHONY: all + +root-hint.txt: + dig +nocomment +noquestion +nocmd +nostat NS . @a.root-servers.net. | column -t | sort > root-hint.txt +.PHONY: root-hint.txt diff --git a/data/root-hint.txt b/data/root-hint.txt new file mode 100644 index 0000000..6d8b27a --- /dev/null +++ b/data/root-hint.txt @@ -0,0 +1,39 @@ +. 518400 IN NS a.root-servers.net. +. 518400 IN NS b.root-servers.net. +. 518400 IN NS c.root-servers.net. +. 518400 IN NS d.root-servers.net. +. 518400 IN NS e.root-servers.net. +. 518400 IN NS f.root-servers.net. +. 518400 IN NS g.root-servers.net. +. 518400 IN NS h.root-servers.net. +. 518400 IN NS i.root-servers.net. +. 518400 IN NS j.root-servers.net. +. 518400 IN NS k.root-servers.net. +. 518400 IN NS l.root-servers.net. +. 518400 IN NS m.root-servers.net. +a.root-servers.net. 518400 IN A 198.41.0.4 +a.root-servers.net. 518400 IN AAAA 2001:503:ba3e::2:30 +b.root-servers.net. 518400 IN A 199.9.14.201 +b.root-servers.net. 518400 IN AAAA 2001:500:200::b +c.root-servers.net. 518400 IN A 192.33.4.12 +c.root-servers.net. 518400 IN AAAA 2001:500:2::c +d.root-servers.net. 518400 IN A 199.7.91.13 +d.root-servers.net. 518400 IN AAAA 2001:500:2d::d +e.root-servers.net. 518400 IN A 192.203.230.10 +e.root-servers.net. 518400 IN AAAA 2001:500:a8::e +f.root-servers.net. 518400 IN A 192.5.5.241 +f.root-servers.net. 518400 IN AAAA 2001:500:2f::f +g.root-servers.net. 518400 IN A 192.112.36.4 +g.root-servers.net. 518400 IN AAAA 2001:500:12::d0d +h.root-servers.net. 518400 IN A 198.97.190.53 +h.root-servers.net. 518400 IN AAAA 2001:500:1::53 +i.root-servers.net. 518400 IN A 192.36.148.17 +i.root-servers.net. 518400 IN AAAA 2001:7fe::53 +j.root-servers.net. 518400 IN A 192.58.128.30 +j.root-servers.net. 518400 IN AAAA 2001:503:c27::2:30 +k.root-servers.net. 518400 IN A 193.0.14.129 +k.root-servers.net. 518400 IN AAAA 2001:7fd::1 +l.root-servers.net. 518400 IN A 199.7.83.42 +l.root-servers.net. 518400 IN AAAA 2001:500:9f::42 +m.root-servers.net. 518400 IN A 202.12.27.33 +m.root-servers.net. 518400 IN AAAA 2001:dc3::35 diff --git a/lib/dnsbox-base/Cargo.toml b/lib/dnsbox-base/Cargo.toml index 036bd4d..8d3dcc7 100644 --- a/lib/dnsbox-base/Cargo.toml +++ b/lib/dnsbox-base/Cargo.toml @@ -9,7 +9,7 @@ bytes = "0.4" dnsbox-derive = { path = "../dnsbox-derive" } failure = "0.1.1" lazy_static = "1.0.0" -log = "0.3" +log = "0.4" smallvec = "0.4.4" data-encoding = "2.1.0" diff --git a/src/bin/resolver/cache/mod.rs b/src/bin/resolver/cache/mod.rs new file mode 100644 index 0000000..4eab35d --- /dev/null +++ b/src/bin/resolver/cache/mod.rs @@ -0,0 +1,179 @@ +use dnsbox_base::common_types::{Type, DnsName}; +use dnsbox_base::failure::Error; +use dnsbox_base::packet::Resource; +use dnsbox_base::ser::RRData; +use futures::{Future, Poll, Async}; +use futures::unsync::oneshot; +use std::cell::RefCell; +use std::collections::HashMap; +use std::mem::replace; +use std::net::{Ipv4Addr, Ipv6Addr}; +use std::rc::Rc; +use std::time::Duration; + +mod root_hints; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub enum Source { + Hint, + Glue, + Authority, +} + +#[derive(Clone, Debug)] +pub struct Entry { + rrset: Vec>, + source: Source, + ttl: u32, +} + +impl Entry { + pub fn new(rrset: Vec>, source: Source) -> Self { + unimplemented!() + } + + /// whether TTL not reached yet. might also check DNSSEC stamps + pub fn alive(&self) -> bool { + true + } + + pub fn needs_refresh(&self) -> bool { + // TTL > 60 and only 25% ttl left before getting invalid + false + } +} + +enum InnerEntry { + Missing, + Hit(Rc), + Refreshing(Rc), + Pending(Vec>>), +} + +impl InnerEntry { + fn restart(&mut self) -> (bool, CacheResult) { + // start new lookup + let (tx, rx) = oneshot::channel(); + replace(self, InnerEntry::Pending(vec![tx])); + (true, CacheResult(InnerResult::Waiting(rx))) + } + + fn get(&mut self) -> (bool, CacheResult) { + match replace(self, InnerEntry::Missing) { + InnerEntry::Missing => self.restart(), + InnerEntry::Hit(e) => { + if !e.alive() { + self.restart(); + } + let res = CacheResult(InnerResult::Ready(e.clone())); + let start_lookup = if e.needs_refresh() { + replace(self, InnerEntry::Refreshing(e)); + true + } else { + replace(self, InnerEntry::Hit(e)); + false + }; + (start_lookup, res) + }, + InnerEntry::Refreshing(e) => { + if !e.alive() { + // new request already pending; but need new wait queue + (false, self.restart().1) + } else { + let res = CacheResult(InnerResult::Ready(e.clone())); + replace(self, InnerEntry::Refreshing(e)); + (false, res) + } + } + InnerEntry::Pending(mut queue) => { + let (tx, rx) = oneshot::channel(); + queue.push(tx); + replace(self, InnerEntry::Pending(queue)); + (false, CacheResult(InnerResult::Waiting(rx))) + } + } + } +} + +type NameEntry = HashMap; + +pub type LookupFunction = Box Box>>; + +pub struct Cache { + names: Rc>>, + timeout: Duration, + lookup: RefCell, +} + +impl Cache { + pub fn new(timeout: Duration, lookup: LookupFunction) -> Self { + Cache { + names: Rc::new(RefCell::new(HashMap::new())), + timeout: timeout, + lookup: RefCell::new(lookup), + } + } + + fn start_lookup(&self, name: DnsName, rrtype: Type) { + unimplemented!() + } + + pub fn lookup(&self, name: DnsName, rrtype: Type) -> CacheResult { + let mut name_str = format!("{}", name); + name_str.make_ascii_lowercase(); + + let (start_lookup, res) = { + let mut names = self.names.borrow_mut(); + let types = names.entry(name_str).or_insert_with(|| HashMap::new()); + let entry = types.entry(rrtype).or_insert(InnerEntry::Missing); + entry.get() + }; + + if start_lookup { + self.start_lookup(name, rrtype); + } + + res + } + + /// Insert hints + /// + /// # Panics + /// + /// Panics when the `rrset` entries don't match `rrtype`. + pub fn insert_hint(&self, name: DnsName, rrtype: Type, rrset: Vec>) { + for e in &rrset { + assert_eq!(rrtype, e.rr_type()); + } + } +} + +pub struct CacheResult(InnerResult); + +enum InnerResult { + Ready(Rc), + Waiting(oneshot::Receiver>), + Finished, +} + +impl Future for CacheResult { + type Item = Rc; + type Error = Error; + + fn poll(&mut self) -> Poll { + match replace(&mut self.0, InnerResult::Finished) { + InnerResult::Ready(res) => Ok(Async::Ready(res)), + InnerResult::Waiting(mut rc) => { + match rc.poll()? { + Async::Ready(res) => Ok(Async::Ready(res)), + Async::NotReady => { + // keep waiting + replace(&mut self.0, InnerResult::Waiting(rc)); + Ok(Async::NotReady) + } + } + }, + InnerResult::Finished => Ok(Async::NotReady), + } + } +} diff --git a/src/bin/resolver/cache/root_hints.rs b/src/bin/resolver/cache/root_hints.rs new file mode 100644 index 0000000..e533d18 --- /dev/null +++ b/src/bin/resolver/cache/root_hints.rs @@ -0,0 +1,40 @@ +use dnsbox_base::common_types::{types, classes}; +use dnsbox_base::common_types::{DnsName, DnsCompressedName}; +use dnsbox_base::packet::Resource; +use dnsbox_base::records::{NS, A, AAAA}; +use dnsbox_base::ser::RRData; +use std::net::{Ipv4Addr, Ipv6Addr}; + +static DATA: [(&str, &str, &str); 13] = [ + ("a.root-servers.net.", "198.41.0.4", "2001:503:ba3e::2:30"), + ("b.root-servers.net.", "199.9.14.201", "2001:500:200::b"), + ("c.root-servers.net.", "192.33.4.12", "2001:500:2::c"), + ("d.root-servers.net.", "199.7.91.13", "2001:500:2d::d"), + ("e.root-servers.net.", "192.203.230.10", "2001:500:a8::e"), + ("f.root-servers.net.", "192.5.5.241", "2001:500:2f::f"), + ("g.root-servers.net.", "192.112.36.4", "2001:500:12::d0d"), + ("h.root-servers.net.", "198.97.190.53", "2001:500:1::53"), + ("i.root-servers.net.", "192.36.148.17", "2001:7fe::53"), + ("j.root-servers.net.", "192.58.128.30", "2001:503:c27::2:30"), + ("k.root-servers.net.", "193.0.14.129", "2001:7fd::1"), + ("l.root-servers.net.", "199.7.83.42", "2001:500:9f::42"), + ("m.root-servers.net.", "202.12.27.33", "2001:dc3::35"), +]; + +pub fn load_hints(cache: &super::Cache) { + let mut root_ns_set: Vec> = Vec::new(); + + for &(name, ipv4, ipv6) in &DATA { + let name = name.parse::().expect("invalid root hint name"); + let ipv4 = ipv4.parse::().expect("invalid root hint ipv4 addr"); + let ipv6 = ipv6.parse::().expect("invalid root hint ipv6 addr"); + root_ns_set.push(Box::new(NS { + nsdname: DnsCompressedName(name.clone()), + })); + cache.insert_hint(name.clone(), types::A, vec![Box::new(A { addr: ipv4 })]); + cache.insert_hint(name.clone(), types::AAAA, vec![Box::new(AAAA { addr: ipv6 })]); + } + cache.insert_hint(DnsName::new_root(), types::NS, root_ns_set); + + unimplemented!() +} diff --git a/src/bin/resolver/main.rs b/src/bin/resolver/main.rs new file mode 100644 index 0000000..cb250f2 --- /dev/null +++ b/src/bin/resolver/main.rs @@ -0,0 +1,11 @@ +extern crate dnsbox_base; + +extern crate futures; +extern crate tokio_core; +extern crate tokio_io; + +pub mod cache; + +fn main() { + println!("Test"); +} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 445bf42..0000000 --- a/src/main.rs +++ /dev/null @@ -1,5 +0,0 @@ -extern crate dnsbox_base; - -fn main() { - println!("Test"); -}