├── .circleci └── config.yml ├── .dockerignore ├── .editorconfig ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── LICENSE.txt ├── README.md ├── etc ├── certbot-inwx-auth ├── certbot-inwx-cleanup └── docker-entrypoint.sh └── src ├── cli.rs ├── config.rs ├── dns.rs ├── inwx.rs ├── main.rs └── rpc.rs /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | docker: 5 | - image: circleci/buildpack-deps:latest 6 | steps: 7 | - checkout 8 | - setup_remote_docker 9 | - run: 10 | name: Build Docker image 11 | command: | 12 | docker build --target builder -t letsencrypt-inwx-builder . 13 | docker build -t kegato/letsencrypt-inwx:latest . 14 | - run: 15 | name: Extract Artifacts 16 | command: | 17 | mkdir artifacts 18 | docker save -o image.tar kegato/letsencrypt-inwx:latest 19 | docker create --name builder letsencrypt-inwx-builder 20 | docker cp builder:/home/rust/src/target/x86_64-unknown-linux-musl/release/letsencrypt-inwx . 21 | docker cp builder:/home/rust/src/target/x86_64-unknown-linux-musl/debian . 22 | mv debian/*.deb artifacts/letsencrypt-inwx-x86_64-linux.deb 23 | zip artifacts/letsencrypt-inwx-x86_64-linux.zip letsencrypt-inwx 24 | - persist_to_workspace: 25 | root: . 26 | paths: 27 | - ./artifacts 28 | - ./image.tar 29 | 30 | publish-docker-image: 31 | docker: 32 | - image: circleci/buildpack-deps:latest 33 | steps: 34 | - attach_workspace: 35 | at: ./workspace 36 | - setup_remote_docker 37 | - run: 38 | name: Load archived Docker image 39 | command: docker load -i ./workspace/image.tar 40 | - run: 41 | name: Publish Docker Image to Docker Hub 42 | command: | 43 | echo "$DOCKERHUB_PASSWORD" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin 44 | docker push kegato/letsencrypt-inwx:latest 45 | 46 | publish-github-release: 47 | docker: 48 | - image: circleci/golang:latest 49 | steps: 50 | - attach_workspace: 51 | at: ./workspace 52 | - run: 53 | name: "Publish Release on GitHub" 54 | command: | 55 | go get github.com/tcnksm/ghr 56 | ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${CIRCLE_TAG} ./workspace/artifacts/ 57 | 58 | publish-crate: 59 | docker: 60 | - image: circleci/rust:latest 61 | steps: 62 | - checkout 63 | - run: 64 | name: "Publish crate to crates.io" 65 | command: | 66 | cargo login ${CRATES_IO_TOKEN} 67 | cargo publish 68 | 69 | workflows: 70 | version: 2 71 | main: 72 | jobs: 73 | - build: 74 | filters: 75 | tags: 76 | only: /^[0-9]+\.[0-9]+\.[0-9]+$/ 77 | - publish-docker-image: 78 | requires: 79 | - build 80 | filters: 81 | tags: 82 | only: /^[0-9]+\.[0-9]+\.[0-9]+$/ 83 | branches: 84 | ignore: /.*/ 85 | - publish-github-release: 86 | requires: 87 | - build 88 | filters: 89 | tags: 90 | only: /^[0-9]+\.[0-9]+\.[0-9]+$/ 91 | branches: 92 | ignore: /.*/ 93 | - publish-crate: 94 | filters: 95 | tags: 96 | only: /^[0-9]+\.[0-9]+\.[0-9]+$/ 97 | branches: 98 | ignore: /.*/ 99 | rebuild-docker-image: 100 | triggers: 101 | - schedule: 102 | cron: "0 2 * * 1" 103 | filters: 104 | branches: 105 | only: latest 106 | jobs: 107 | - build 108 | - publish-docker-image: 109 | requires: 110 | - build 111 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | /.vscode 2 | /.git 3 | /.gitignore 4 | /.circleci 5 | /target 6 | /LICENSE.txt 7 | /README.md 8 | /config.json 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.yml] 12 | indent_size = 2 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.vscode/ 2 | /target/ 3 | **/*.rs.bk 4 | **/*.rs.fmt 5 | /deploy/ 6 | /config.json 7 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "MacTypes-sys" 5 | version = "2.1.0" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 9 | ] 10 | 11 | [[package]] 12 | name = "adler32" 13 | version = "1.0.3" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | 16 | [[package]] 17 | name = "aho-corasick" 18 | version = "0.7.3" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | dependencies = [ 21 | "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 22 | ] 23 | 24 | [[package]] 25 | name = "ansi_term" 26 | version = "0.11.0" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | dependencies = [ 29 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 30 | ] 31 | 32 | [[package]] 33 | name = "arrayvec" 34 | version = "0.4.10" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | dependencies = [ 37 | "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 38 | ] 39 | 40 | [[package]] 41 | name = "atty" 42 | version = "0.2.11" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | dependencies = [ 45 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 46 | "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 47 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 48 | ] 49 | 50 | [[package]] 51 | name = "autocfg" 52 | version = "0.1.2" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | 55 | [[package]] 56 | name = "backtrace" 57 | version = "0.3.14" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | dependencies = [ 60 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 61 | "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", 62 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 63 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 64 | "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 65 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 66 | ] 67 | 68 | [[package]] 69 | name = "backtrace-sys" 70 | version = "0.1.28" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | dependencies = [ 73 | "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", 74 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 75 | ] 76 | 77 | [[package]] 78 | name = "base64" 79 | version = "0.10.1" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | dependencies = [ 82 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 83 | ] 84 | 85 | [[package]] 86 | name = "bitflags" 87 | version = "1.0.4" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | 90 | [[package]] 91 | name = "byteorder" 92 | version = "1.3.1" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | 95 | [[package]] 96 | name = "bytes" 97 | version = "0.4.11" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | dependencies = [ 100 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 101 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 102 | ] 103 | 104 | [[package]] 105 | name = "c2-chacha" 106 | version = "0.2.2" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | dependencies = [ 109 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 110 | "ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 111 | ] 112 | 113 | [[package]] 114 | name = "cc" 115 | version = "1.0.29" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | 118 | [[package]] 119 | name = "cfg-if" 120 | version = "0.1.6" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | 123 | [[package]] 124 | name = "chrono" 125 | version = "0.4.6" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | dependencies = [ 128 | "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", 129 | "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 130 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 131 | ] 132 | 133 | [[package]] 134 | name = "clap" 135 | version = "2.33.0" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | dependencies = [ 138 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 139 | "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 140 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 141 | "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 142 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 143 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 144 | "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 145 | ] 146 | 147 | [[package]] 148 | name = "cloudabi" 149 | version = "0.0.3" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | dependencies = [ 152 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 153 | ] 154 | 155 | [[package]] 156 | name = "cookie" 157 | version = "0.12.0" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | dependencies = [ 160 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 161 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 162 | ] 163 | 164 | [[package]] 165 | name = "cookie_store" 166 | version = "0.7.0" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | dependencies = [ 169 | "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 170 | "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 171 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 172 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 173 | "publicsuffix 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 174 | "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", 175 | "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", 176 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 177 | "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 178 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 179 | ] 180 | 181 | [[package]] 182 | name = "core-foundation" 183 | version = "0.5.1" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | dependencies = [ 186 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 187 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 188 | ] 189 | 190 | [[package]] 191 | name = "core-foundation-sys" 192 | version = "0.5.1" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | dependencies = [ 195 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 196 | ] 197 | 198 | [[package]] 199 | name = "crc32fast" 200 | version = "1.1.2" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | dependencies = [ 203 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 204 | ] 205 | 206 | [[package]] 207 | name = "crossbeam-deque" 208 | version = "0.7.1" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | dependencies = [ 211 | "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 212 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 213 | ] 214 | 215 | [[package]] 216 | name = "crossbeam-epoch" 217 | version = "0.7.1" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | dependencies = [ 220 | "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 221 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 222 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 223 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 224 | "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 225 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 226 | ] 227 | 228 | [[package]] 229 | name = "crossbeam-queue" 230 | version = "0.1.2" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | dependencies = [ 233 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 234 | ] 235 | 236 | [[package]] 237 | name = "crossbeam-utils" 238 | version = "0.6.5" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | dependencies = [ 241 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 242 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 243 | ] 244 | 245 | [[package]] 246 | name = "data-encoding" 247 | version = "2.1.2" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | 250 | [[package]] 251 | name = "data-encoding-macro" 252 | version = "0.1.7" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | dependencies = [ 255 | "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 256 | "data-encoding-macro-internal 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 257 | "proc-macro-hack 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", 258 | ] 259 | 260 | [[package]] 261 | name = "data-encoding-macro-internal" 262 | version = "0.1.7" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | dependencies = [ 265 | "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 266 | "proc-macro-hack 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", 267 | "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", 268 | ] 269 | 270 | [[package]] 271 | name = "dtoa" 272 | version = "0.4.3" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | 275 | [[package]] 276 | name = "encoding_rs" 277 | version = "0.8.16" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | dependencies = [ 280 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 281 | ] 282 | 283 | [[package]] 284 | name = "endian-type" 285 | version = "0.1.2" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | 288 | [[package]] 289 | name = "enum-as-inner" 290 | version = "0.2.1" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | dependencies = [ 293 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 294 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 295 | "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", 296 | ] 297 | 298 | [[package]] 299 | name = "env_logger" 300 | version = "0.7.0" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | dependencies = [ 303 | "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 304 | "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 305 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 306 | "regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 307 | "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 308 | ] 309 | 310 | [[package]] 311 | name = "error-chain" 312 | version = "0.12.1" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | dependencies = [ 315 | "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 316 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 317 | ] 318 | 319 | [[package]] 320 | name = "failure" 321 | version = "0.1.5" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | dependencies = [ 324 | "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 325 | "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 326 | ] 327 | 328 | [[package]] 329 | name = "failure_derive" 330 | version = "0.1.5" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | dependencies = [ 333 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 334 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 335 | "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", 336 | "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 337 | ] 338 | 339 | [[package]] 340 | name = "flate2" 341 | version = "1.0.12" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | dependencies = [ 344 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 345 | "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 346 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 347 | "miniz_oxide 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 348 | ] 349 | 350 | [[package]] 351 | name = "fnv" 352 | version = "1.0.6" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | 355 | [[package]] 356 | name = "foreign-types" 357 | version = "0.3.2" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | dependencies = [ 360 | "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 361 | ] 362 | 363 | [[package]] 364 | name = "foreign-types-shared" 365 | version = "0.1.1" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | 368 | [[package]] 369 | name = "fuchsia-cprng" 370 | version = "0.1.1" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | 373 | [[package]] 374 | name = "fuchsia-zircon" 375 | version = "0.3.3" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | dependencies = [ 378 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 379 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 380 | ] 381 | 382 | [[package]] 383 | name = "fuchsia-zircon-sys" 384 | version = "0.3.3" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | 387 | [[package]] 388 | name = "futures" 389 | version = "0.1.29" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | 392 | [[package]] 393 | name = "futures-cpupool" 394 | version = "0.1.8" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | dependencies = [ 397 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 398 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 399 | ] 400 | 401 | [[package]] 402 | name = "getrandom" 403 | version = "0.1.12" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | dependencies = [ 406 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 407 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 408 | "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 409 | ] 410 | 411 | [[package]] 412 | name = "h2" 413 | version = "0.1.16" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | dependencies = [ 416 | "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 417 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 418 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 419 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 420 | "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 421 | "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 422 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 423 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 424 | "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 425 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 426 | ] 427 | 428 | [[package]] 429 | name = "http" 430 | version = "0.1.15" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | dependencies = [ 433 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 434 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 435 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 436 | ] 437 | 438 | [[package]] 439 | name = "httparse" 440 | version = "1.3.3" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | 443 | [[package]] 444 | name = "humantime" 445 | version = "1.3.0" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | dependencies = [ 448 | "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 449 | ] 450 | 451 | [[package]] 452 | name = "hyper" 453 | version = "0.12.24" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | dependencies = [ 456 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 457 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 458 | "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 459 | "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 460 | "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 461 | "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 462 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 463 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 464 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 465 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 467 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 468 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 469 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 470 | "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 471 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 472 | "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 473 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 474 | "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 475 | ] 476 | 477 | [[package]] 478 | name = "hyper-tls" 479 | version = "0.3.2" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | dependencies = [ 482 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 483 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 484 | "hyper 0.12.24 (registry+https://github.com/rust-lang/crates.io-index)", 485 | "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 486 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 487 | ] 488 | 489 | [[package]] 490 | name = "idna" 491 | version = "0.1.5" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | dependencies = [ 494 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 495 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 496 | "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 497 | ] 498 | 499 | [[package]] 500 | name = "idna" 501 | version = "0.2.0" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | dependencies = [ 504 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 505 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 506 | "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 507 | ] 508 | 509 | [[package]] 510 | name = "indexmap" 511 | version = "1.0.2" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | 514 | [[package]] 515 | name = "iovec" 516 | version = "0.1.2" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | dependencies = [ 519 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 520 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 521 | ] 522 | 523 | [[package]] 524 | name = "itoa" 525 | version = "0.4.3" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | 528 | [[package]] 529 | name = "kernel32-sys" 530 | version = "0.2.2" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | dependencies = [ 533 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 534 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 535 | ] 536 | 537 | [[package]] 538 | name = "lazy_static" 539 | version = "1.2.0" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | 542 | [[package]] 543 | name = "lazycell" 544 | version = "1.2.1" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | 547 | [[package]] 548 | name = "letsencrypt-inwx" 549 | version = "2.0.2" 550 | dependencies = [ 551 | "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", 552 | "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 553 | "env_logger 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 554 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 555 | "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 556 | "reqwest 0.9.21 (registry+https://github.com/rust-lang/crates.io-index)", 557 | "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", 558 | "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", 559 | "sxd-document 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 560 | "sxd-xpath 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 561 | "trust-dns 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", 562 | ] 563 | 564 | [[package]] 565 | name = "libc" 566 | version = "0.2.62" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | 569 | [[package]] 570 | name = "lock_api" 571 | version = "0.1.5" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | dependencies = [ 574 | "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 575 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 576 | ] 577 | 578 | [[package]] 579 | name = "log" 580 | version = "0.4.8" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | dependencies = [ 583 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 584 | ] 585 | 586 | [[package]] 587 | name = "matches" 588 | version = "0.1.8" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | 591 | [[package]] 592 | name = "memchr" 593 | version = "2.2.0" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | 596 | [[package]] 597 | name = "memoffset" 598 | version = "0.2.1" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | 601 | [[package]] 602 | name = "mime" 603 | version = "0.3.13" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | dependencies = [ 606 | "unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 607 | ] 608 | 609 | [[package]] 610 | name = "mime_guess" 611 | version = "2.0.1" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | dependencies = [ 614 | "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 615 | "unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 616 | ] 617 | 618 | [[package]] 619 | name = "miniz_oxide" 620 | version = "0.3.3" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | dependencies = [ 623 | "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 624 | ] 625 | 626 | [[package]] 627 | name = "mio" 628 | version = "0.6.16" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | dependencies = [ 631 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 632 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 633 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 634 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 635 | "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 636 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 637 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 638 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 639 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 640 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 641 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 642 | ] 643 | 644 | [[package]] 645 | name = "mio-uds" 646 | version = "0.6.7" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | dependencies = [ 649 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 650 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 651 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 652 | ] 653 | 654 | [[package]] 655 | name = "miow" 656 | version = "0.2.1" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | dependencies = [ 659 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 660 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 661 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 662 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 663 | ] 664 | 665 | [[package]] 666 | name = "native-tls" 667 | version = "0.2.2" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | dependencies = [ 670 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 671 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 672 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 673 | "openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", 674 | "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 675 | "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", 676 | "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 677 | "security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 678 | "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 679 | "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 680 | ] 681 | 682 | [[package]] 683 | name = "net2" 684 | version = "0.2.33" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | dependencies = [ 687 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 688 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 689 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 690 | ] 691 | 692 | [[package]] 693 | name = "nibble_vec" 694 | version = "0.0.4" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | 697 | [[package]] 698 | name = "nodrop" 699 | version = "0.1.13" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | 702 | [[package]] 703 | name = "num-integer" 704 | version = "0.1.39" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | dependencies = [ 707 | "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 708 | ] 709 | 710 | [[package]] 711 | name = "num-traits" 712 | version = "0.2.6" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | 715 | [[package]] 716 | name = "num_cpus" 717 | version = "1.10.0" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | dependencies = [ 720 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 721 | ] 722 | 723 | [[package]] 724 | name = "openssl" 725 | version = "0.10.16" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | dependencies = [ 728 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 729 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 730 | "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 731 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 732 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 733 | "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", 734 | ] 735 | 736 | [[package]] 737 | name = "openssl-probe" 738 | version = "0.1.2" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | 741 | [[package]] 742 | name = "openssl-sys" 743 | version = "0.9.40" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | dependencies = [ 746 | "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", 747 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 748 | "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 749 | "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 750 | ] 751 | 752 | [[package]] 753 | name = "owning_ref" 754 | version = "0.4.0" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | dependencies = [ 757 | "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 758 | ] 759 | 760 | [[package]] 761 | name = "parking_lot" 762 | version = "0.7.1" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | dependencies = [ 765 | "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 766 | "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 767 | ] 768 | 769 | [[package]] 770 | name = "parking_lot_core" 771 | version = "0.4.0" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | dependencies = [ 774 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 775 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 776 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 777 | "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 778 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 779 | ] 780 | 781 | [[package]] 782 | name = "percent-encoding" 783 | version = "1.0.1" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | 786 | [[package]] 787 | name = "percent-encoding" 788 | version = "2.1.0" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | 791 | [[package]] 792 | name = "peresil" 793 | version = "0.3.0" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | 796 | [[package]] 797 | name = "pkg-config" 798 | version = "0.3.14" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | 801 | [[package]] 802 | name = "ppv-lite86" 803 | version = "0.2.5" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | 806 | [[package]] 807 | name = "proc-macro-hack" 808 | version = "0.5.10" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | dependencies = [ 811 | "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 812 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 813 | "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 814 | ] 815 | 816 | [[package]] 817 | name = "proc-macro2" 818 | version = "0.4.27" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | dependencies = [ 821 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 822 | ] 823 | 824 | [[package]] 825 | name = "proc-macro2" 826 | version = "1.0.5" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | dependencies = [ 829 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 830 | ] 831 | 832 | [[package]] 833 | name = "publicsuffix" 834 | version = "1.5.3" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | dependencies = [ 837 | "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", 838 | "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 839 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 840 | "regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 841 | "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 842 | ] 843 | 844 | [[package]] 845 | name = "quick-error" 846 | version = "1.2.2" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | 849 | [[package]] 850 | name = "quote" 851 | version = "0.6.11" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | dependencies = [ 854 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 855 | ] 856 | 857 | [[package]] 858 | name = "quote" 859 | version = "1.0.2" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | dependencies = [ 862 | "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 863 | ] 864 | 865 | [[package]] 866 | name = "radix_trie" 867 | version = "0.1.4" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | dependencies = [ 870 | "endian-type 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 871 | "nibble_vec 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 872 | ] 873 | 874 | [[package]] 875 | name = "rand" 876 | version = "0.6.5" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | dependencies = [ 879 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 880 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 881 | "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 882 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 883 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 884 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 885 | "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 886 | "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 887 | "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 888 | "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 889 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 890 | ] 891 | 892 | [[package]] 893 | name = "rand" 894 | version = "0.7.2" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | dependencies = [ 897 | "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 898 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 899 | "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 900 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 901 | "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 902 | ] 903 | 904 | [[package]] 905 | name = "rand_chacha" 906 | version = "0.1.1" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | dependencies = [ 909 | "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 910 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 911 | ] 912 | 913 | [[package]] 914 | name = "rand_chacha" 915 | version = "0.2.1" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | dependencies = [ 918 | "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 919 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 920 | ] 921 | 922 | [[package]] 923 | name = "rand_core" 924 | version = "0.3.1" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | dependencies = [ 927 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 928 | ] 929 | 930 | [[package]] 931 | name = "rand_core" 932 | version = "0.4.0" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | 935 | [[package]] 936 | name = "rand_core" 937 | version = "0.5.1" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | dependencies = [ 940 | "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 941 | ] 942 | 943 | [[package]] 944 | name = "rand_hc" 945 | version = "0.1.0" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | dependencies = [ 948 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 949 | ] 950 | 951 | [[package]] 952 | name = "rand_hc" 953 | version = "0.2.0" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | dependencies = [ 956 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 957 | ] 958 | 959 | [[package]] 960 | name = "rand_isaac" 961 | version = "0.1.1" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | dependencies = [ 964 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 965 | ] 966 | 967 | [[package]] 968 | name = "rand_jitter" 969 | version = "0.1.3" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | dependencies = [ 972 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 973 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 974 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 975 | ] 976 | 977 | [[package]] 978 | name = "rand_os" 979 | version = "0.1.2" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | dependencies = [ 982 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 983 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 984 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 985 | "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 986 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 987 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 988 | ] 989 | 990 | [[package]] 991 | name = "rand_pcg" 992 | version = "0.1.1" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | dependencies = [ 995 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 996 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 997 | ] 998 | 999 | [[package]] 1000 | name = "rand_xorshift" 1001 | version = "0.1.1" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | dependencies = [ 1004 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "rdrand" 1009 | version = "0.4.0" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | dependencies = [ 1012 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1013 | ] 1014 | 1015 | [[package]] 1016 | name = "redox_syscall" 1017 | version = "0.1.51" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | 1020 | [[package]] 1021 | name = "redox_termios" 1022 | version = "0.1.1" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | dependencies = [ 1025 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "regex" 1030 | version = "1.1.5" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | dependencies = [ 1033 | "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1034 | "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1035 | "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1036 | "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1037 | "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "regex-syntax" 1042 | version = "0.6.6" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | dependencies = [ 1045 | "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "remove_dir_all" 1050 | version = "0.5.1" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | dependencies = [ 1053 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "reqwest" 1058 | version = "0.9.21" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | dependencies = [ 1061 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 1062 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1063 | "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 1064 | "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1065 | "encoding_rs 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)", 1066 | "flate2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)", 1067 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1068 | "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 1069 | "hyper 0.12.24 (registry+https://github.com/rust-lang/crates.io-index)", 1070 | "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1071 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1072 | "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 1073 | "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1074 | "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1075 | "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", 1076 | "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", 1077 | "serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1078 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 1079 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 1080 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1081 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1082 | "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1083 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 1084 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1085 | "uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1086 | "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "rustc-demangle" 1091 | version = "0.1.13" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | 1094 | [[package]] 1095 | name = "rustc_version" 1096 | version = "0.2.3" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | dependencies = [ 1099 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "ryu" 1104 | version = "1.0.0" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | 1107 | [[package]] 1108 | name = "schannel" 1109 | version = "0.1.14" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | dependencies = [ 1112 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1113 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "scopeguard" 1118 | version = "0.3.3" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | 1121 | [[package]] 1122 | name = "security-framework" 1123 | version = "0.2.2" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | dependencies = [ 1126 | "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1127 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1128 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 1129 | "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "security-framework-sys" 1134 | version = "0.2.3" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | dependencies = [ 1137 | "MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1138 | "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1139 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "semver" 1144 | version = "0.9.0" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | dependencies = [ 1147 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "semver-parser" 1152 | version = "0.7.0" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | 1155 | [[package]] 1156 | name = "serde" 1157 | version = "1.0.101" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | dependencies = [ 1160 | "serde_derive 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "serde_derive" 1165 | version = "1.0.88" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | dependencies = [ 1168 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1169 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 1170 | "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", 1171 | ] 1172 | 1173 | [[package]] 1174 | name = "serde_json" 1175 | version = "1.0.41" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | dependencies = [ 1178 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1179 | "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1180 | "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "serde_urlencoded" 1185 | version = "0.5.4" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | dependencies = [ 1188 | "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1189 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1190 | "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", 1191 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "slab" 1196 | version = "0.4.2" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | 1199 | [[package]] 1200 | name = "smallvec" 1201 | version = "0.6.9" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | 1204 | [[package]] 1205 | name = "socket2" 1206 | version = "0.3.11" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | dependencies = [ 1209 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1210 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 1211 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1212 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "stable_deref_trait" 1217 | version = "1.1.1" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | 1220 | [[package]] 1221 | name = "string" 1222 | version = "0.1.3" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | 1225 | [[package]] 1226 | name = "strsim" 1227 | version = "0.8.0" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | 1230 | [[package]] 1231 | name = "sxd-document" 1232 | version = "0.3.2" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | dependencies = [ 1235 | "peresil 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1236 | "typed-arena 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1237 | ] 1238 | 1239 | [[package]] 1240 | name = "sxd-xpath" 1241 | version = "0.4.2" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | dependencies = [ 1244 | "peresil 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1245 | "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1246 | "sxd-document 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "syn" 1251 | version = "0.15.26" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | dependencies = [ 1254 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1255 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 1256 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "syn" 1261 | version = "1.0.5" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | dependencies = [ 1264 | "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 1265 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1266 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "synstructure" 1271 | version = "0.10.1" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | dependencies = [ 1274 | "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1275 | "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 1276 | "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", 1277 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "tempfile" 1282 | version = "3.0.7" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | dependencies = [ 1285 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1286 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 1287 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1288 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1289 | "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1290 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "termcolor" 1295 | version = "1.0.4" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | dependencies = [ 1298 | "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1299 | ] 1300 | 1301 | [[package]] 1302 | name = "termion" 1303 | version = "1.5.1" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | dependencies = [ 1306 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 1307 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1308 | "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1309 | ] 1310 | 1311 | [[package]] 1312 | name = "textwrap" 1313 | version = "0.11.0" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | dependencies = [ 1316 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "thread_local" 1321 | version = "0.3.6" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | dependencies = [ 1324 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "time" 1329 | version = "0.1.42" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | dependencies = [ 1332 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 1333 | "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", 1334 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "tokio" 1339 | version = "0.1.22" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | dependencies = [ 1342 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1343 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1344 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1345 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1346 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1347 | "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1348 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1349 | "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1350 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1351 | "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1352 | "tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1353 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1354 | "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1355 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 1356 | "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1357 | "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "tokio-codec" 1362 | version = "0.1.1" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | dependencies = [ 1365 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1366 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1367 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "tokio-current-thread" 1372 | version = "0.1.6" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | dependencies = [ 1375 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1376 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1377 | ] 1378 | 1379 | [[package]] 1380 | name = "tokio-executor" 1381 | version = "0.1.8" 1382 | source = "registry+https://github.com/rust-lang/crates.io-index" 1383 | dependencies = [ 1384 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1385 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "tokio-fs" 1390 | version = "0.1.6" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | dependencies = [ 1393 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1394 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1395 | "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "tokio-io" 1400 | version = "0.1.11" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | dependencies = [ 1403 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1404 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1405 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1406 | ] 1407 | 1408 | [[package]] 1409 | name = "tokio-reactor" 1410 | version = "0.1.8" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | dependencies = [ 1413 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1414 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1415 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1416 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1417 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1418 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1419 | "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1420 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1421 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1422 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "tokio-sync" 1427 | version = "0.1.6" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | dependencies = [ 1430 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1431 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1432 | ] 1433 | 1434 | [[package]] 1435 | name = "tokio-tcp" 1436 | version = "0.1.3" 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" 1438 | dependencies = [ 1439 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1440 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1441 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1442 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1443 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1444 | "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1445 | ] 1446 | 1447 | [[package]] 1448 | name = "tokio-threadpool" 1449 | version = "0.1.16" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | dependencies = [ 1452 | "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1453 | "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1454 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1455 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1456 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1457 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1458 | "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1459 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1460 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "tokio-timer" 1465 | version = "0.2.10" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | dependencies = [ 1468 | "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1469 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1470 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1471 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "tokio-udp" 1476 | version = "0.1.3" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | dependencies = [ 1479 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1480 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1481 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1482 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1483 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1484 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1485 | "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "tokio-uds" 1490 | version = "0.2.5" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | dependencies = [ 1493 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1494 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1495 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1496 | "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", 1497 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1498 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1499 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1500 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1501 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1502 | "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1503 | ] 1504 | 1505 | [[package]] 1506 | name = "trust-dns" 1507 | version = "0.17.0" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | dependencies = [ 1510 | "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1511 | "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1512 | "data-encoding-macro 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1513 | "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1514 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1515 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1516 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1517 | "radix_trie 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1518 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1519 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 1520 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1521 | "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1522 | "trust-dns-proto 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 1523 | ] 1524 | 1525 | [[package]] 1526 | name = "trust-dns-proto" 1527 | version = "0.8.0" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | dependencies = [ 1530 | "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1531 | "enum-as-inner 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1532 | "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1533 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1534 | "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1535 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1536 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1537 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1538 | "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 1539 | "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", 1540 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1541 | "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1542 | "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1543 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1544 | "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 1545 | "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1546 | "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1547 | ] 1548 | 1549 | [[package]] 1550 | name = "try-lock" 1551 | version = "0.2.2" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | 1554 | [[package]] 1555 | name = "try_from" 1556 | version = "0.3.2" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | dependencies = [ 1559 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1560 | ] 1561 | 1562 | [[package]] 1563 | name = "typed-arena" 1564 | version = "1.4.1" 1565 | source = "registry+https://github.com/rust-lang/crates.io-index" 1566 | 1567 | [[package]] 1568 | name = "ucd-util" 1569 | version = "0.1.3" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | 1572 | [[package]] 1573 | name = "unicase" 1574 | version = "2.5.1" 1575 | source = "registry+https://github.com/rust-lang/crates.io-index" 1576 | dependencies = [ 1577 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1578 | ] 1579 | 1580 | [[package]] 1581 | name = "unicode-bidi" 1582 | version = "0.3.4" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | dependencies = [ 1585 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1586 | ] 1587 | 1588 | [[package]] 1589 | name = "unicode-normalization" 1590 | version = "0.1.8" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | dependencies = [ 1593 | "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 1594 | ] 1595 | 1596 | [[package]] 1597 | name = "unicode-width" 1598 | version = "0.1.5" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | 1601 | [[package]] 1602 | name = "unicode-xid" 1603 | version = "0.1.0" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | 1606 | [[package]] 1607 | name = "unicode-xid" 1608 | version = "0.2.0" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | 1611 | [[package]] 1612 | name = "url" 1613 | version = "1.7.2" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | dependencies = [ 1616 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1617 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1618 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1619 | ] 1620 | 1621 | [[package]] 1622 | name = "url" 1623 | version = "2.1.0" 1624 | source = "registry+https://github.com/rust-lang/crates.io-index" 1625 | dependencies = [ 1626 | "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1627 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1628 | "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1629 | ] 1630 | 1631 | [[package]] 1632 | name = "utf8-ranges" 1633 | version = "1.0.2" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | 1636 | [[package]] 1637 | name = "uuid" 1638 | version = "0.7.2" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | dependencies = [ 1641 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "vcpkg" 1646 | version = "0.2.6" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | 1649 | [[package]] 1650 | name = "vec_map" 1651 | version = "0.8.1" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | 1654 | [[package]] 1655 | name = "version_check" 1656 | version = "0.1.5" 1657 | source = "registry+https://github.com/rust-lang/crates.io-index" 1658 | 1659 | [[package]] 1660 | name = "want" 1661 | version = "0.0.6" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | dependencies = [ 1664 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1665 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1666 | "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1667 | ] 1668 | 1669 | [[package]] 1670 | name = "wasi" 1671 | version = "0.7.0" 1672 | source = "registry+https://github.com/rust-lang/crates.io-index" 1673 | 1674 | [[package]] 1675 | name = "winapi" 1676 | version = "0.2.8" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | 1679 | [[package]] 1680 | name = "winapi" 1681 | version = "0.3.8" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | dependencies = [ 1684 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1685 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1686 | ] 1687 | 1688 | [[package]] 1689 | name = "winapi-build" 1690 | version = "0.1.1" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | 1693 | [[package]] 1694 | name = "winapi-i686-pc-windows-gnu" 1695 | version = "0.4.0" 1696 | source = "registry+https://github.com/rust-lang/crates.io-index" 1697 | 1698 | [[package]] 1699 | name = "winapi-util" 1700 | version = "0.1.2" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | dependencies = [ 1703 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "winapi-x86_64-pc-windows-gnu" 1708 | version = "0.4.0" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | 1711 | [[package]] 1712 | name = "wincolor" 1713 | version = "1.0.1" 1714 | source = "registry+https://github.com/rust-lang/crates.io-index" 1715 | dependencies = [ 1716 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1717 | "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1718 | ] 1719 | 1720 | [[package]] 1721 | name = "winreg" 1722 | version = "0.6.2" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | dependencies = [ 1725 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1726 | ] 1727 | 1728 | [[package]] 1729 | name = "ws2_32-sys" 1730 | version = "0.2.1" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | dependencies = [ 1733 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1734 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1735 | ] 1736 | 1737 | [metadata] 1738 | "checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" 1739 | "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" 1740 | "checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" 1741 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 1742 | "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" 1743 | "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" 1744 | "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" 1745 | "checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" 1746 | "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" 1747 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1748 | "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" 1749 | "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" 1750 | "checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa" 1751 | "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" 1752 | "checksum cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)" = "4390a3b5f4f6bce9c1d0c00128379df433e53777fdd30e92f16a529332baec4e" 1753 | "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" 1754 | "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" 1755 | "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" 1756 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1757 | "checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" 1758 | "checksum cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" 1759 | "checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" 1760 | "checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" 1761 | "checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192" 1762 | "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" 1763 | "checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" 1764 | "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" 1765 | "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" 1766 | "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" 1767 | "checksum data-encoding-macro 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1995a2e32b5306e4f49cf55ffcf4365a4dab2c7ca3a97163a4f099ec2fee3453" 1768 | "checksum data-encoding-macro-internal 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "dd41a6f6a292f3d5be0cd1562bd6007652279d6afe3246f2722749e927338f7a" 1769 | "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" 1770 | "checksum encoding_rs 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0535f350c60aac0b87ccf28319abc749391e912192255b0c00a2c12c6917bd73" 1771 | "checksum endian-type 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" 1772 | "checksum enum-as-inner 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3d58266c97445680766be408285e798d3401c6d4c378ec5552e78737e681e37d" 1773 | "checksum env_logger 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39ecdb7dd54465526f0a56d666e3b2dd5f3a218665a030b6e4ad9e70fa95d8fa" 1774 | "checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" 1775 | "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" 1776 | "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" 1777 | "checksum flate2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ad3c5233c9a940c8719031b423d7e6c16af66e031cb0420b0896f5245bf181d3" 1778 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1779 | "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1780 | "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1781 | "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 1782 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1783 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1784 | "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" 1785 | "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" 1786 | "checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571" 1787 | "checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" 1788 | "checksum http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5" 1789 | "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" 1790 | "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 1791 | "checksum hyper 0.12.24 (registry+https://github.com/rust-lang/crates.io-index)" = "fdfa9b401ef6c4229745bb6e9b2529192d07b920eed624cdee2a82348cd550af" 1792 | "checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" 1793 | "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 1794 | "checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" 1795 | "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" 1796 | "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" 1797 | "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" 1798 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1799 | "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" 1800 | "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" 1801 | "checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba" 1802 | "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" 1803 | "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" 1804 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1805 | "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" 1806 | "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" 1807 | "checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425" 1808 | "checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" 1809 | "checksum miniz_oxide 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "304f66c19be2afa56530fa7c39796192eef38618da8d19df725ad7c6d6b2aaae" 1810 | "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" 1811 | "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" 1812 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1813 | "checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" 1814 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 1815 | "checksum nibble_vec 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c8d77f3db4bce033f4d04db08079b2ef1c3d02b44e86f25d08886fafa7756ffa" 1816 | "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" 1817 | "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" 1818 | "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" 1819 | "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" 1820 | "checksum openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ec7bd7ca4cce6dbdc77e7c1230682740d307d1218a87fb0349a571272be749f9" 1821 | "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 1822 | "checksum openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)" = "1bb974e77de925ef426b6bc82fce15fd45bdcbeb5728bffcfc7cdeeb7ce1c2d6" 1823 | "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" 1824 | "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" 1825 | "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" 1826 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 1827 | "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1828 | "checksum peresil 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f658886ed52e196e850cfbbfddab9eaa7f6d90dd0929e264c31e5cec07e09e57" 1829 | "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" 1830 | "checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" 1831 | "checksum proc-macro-hack 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "114cdf1f426eb7f550f01af5f53a33c0946156f6814aec939b3bd77e844f9a9d" 1832 | "checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" 1833 | "checksum proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0" 1834 | "checksum publicsuffix 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9bf259a81de2b2eb9850ec990ec78e6a25319715584fd7652b9b26f96fcb1510" 1835 | "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" 1836 | "checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" 1837 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 1838 | "checksum radix_trie 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcf72e767017c1aa4b63d4dd0b0b836a243b648fd81d41c6bf6e850ef7a95c7" 1839 | "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1840 | "checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" 1841 | "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1842 | "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" 1843 | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1844 | "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" 1845 | "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1846 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1847 | "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1848 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1849 | "checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" 1850 | "checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" 1851 | "checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" 1852 | "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 1853 | "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 1854 | "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" 1855 | "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" 1856 | "checksum regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "559008764a17de49a3146b234641644ed37d118d1ef641a0bb573d146edc6ce0" 1857 | "checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" 1858 | "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" 1859 | "checksum reqwest 0.9.21 (registry+https://github.com/rust-lang/crates.io-index)" = "02b7e953e14c6f3102b7e8d1f1ee3abf5ecee80b427f5565c9389835cecae95c" 1860 | "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" 1861 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1862 | "checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" 1863 | "checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" 1864 | "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" 1865 | "checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05" 1866 | "checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" 1867 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1868 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1869 | "checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd" 1870 | "checksum serde_derive 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)" = "beed18e6f5175aef3ba670e57c60ef3b1b74d250d962a26604bff4c80e970dd4" 1871 | "checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" 1872 | "checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" 1873 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1874 | "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" 1875 | "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" 1876 | "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" 1877 | "checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" 1878 | "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 1879 | "checksum sxd-document 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "94d82f37be9faf1b10a82c4bd492b74f698e40082f0f40de38ab275f31d42078" 1880 | "checksum sxd-xpath 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "36e39da5d30887b5690e29de4c5ebb8ddff64ebd9933f98a01daaa4fd11b36ea" 1881 | "checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" 1882 | "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" 1883 | "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" 1884 | "checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" 1885 | "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" 1886 | "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" 1887 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1888 | "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" 1889 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1890 | "checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" 1891 | "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" 1892 | "checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" 1893 | "checksum tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f27ee0e6db01c5f0b2973824547ce7e637b2ed79b891a9677b0de9bd532b6ac" 1894 | "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" 1895 | "checksum tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f" 1896 | "checksum tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f" 1897 | "checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7" 1898 | "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" 1899 | "checksum tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd2c6a3885302581f4401c82af70d792bb9df1700e7437b0aeb4ada94d5388c" 1900 | "checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" 1901 | "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" 1902 | "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" 1903 | "checksum trust-dns 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f006aceba2c2dedfccede277aa03f74b25ff89ab53ceb1cc5889aea29d7e55f" 1904 | "checksum trust-dns-proto 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05457ece29839d056d8cb66ec080209d34492b3d2e7e00641b486977be973db9" 1905 | "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" 1906 | "checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" 1907 | "checksum typed-arena 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c6c06a92aef38bb4dc5b0df00d68496fc31307c5344c867bb61678c6e1671ec5" 1908 | "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" 1909 | "checksum unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2e2e6bd1e59e56598518beb94fd6db628ded570326f0a98c679a304bd9f00150" 1910 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1911 | "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" 1912 | "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" 1913 | "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 1914 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 1915 | "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 1916 | "checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61" 1917 | "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" 1918 | "checksum uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0238db0c5b605dd1cf51de0f21766f97fba2645897024461d6a00c036819a768" 1919 | "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" 1920 | "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" 1921 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 1922 | "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" 1923 | "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" 1924 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1925 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 1926 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1927 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1928 | "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" 1929 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1930 | "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" 1931 | "checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" 1932 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1933 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "letsencrypt-inwx" 3 | version = "2.0.2" 4 | description = "A small cli utility for automating the letsencrypt dns-01 challenge for domains hosted by inwx" 5 | authors = ["Matthias Herzog"] 6 | readme = "README.md" 7 | license = "MIT" 8 | repository = "https://github.com/kegato/letsencrypt-inwx" 9 | edition = "2018" 10 | 11 | [package.metadata.deb] 12 | depends = "" 13 | extended-description = "A small cli utility for automating the letsencrypt dns-01 challenge for domains hosted by inwx. The dns-01 challenge is required for obtaining wildcard certificates from letsencrypt." 14 | assets = [ 15 | ["target/release/letsencrypt-inwx", "usr/bin/", "755"], 16 | ["etc/certbot-inwx-auth", "usr/lib/letsencrypt-inwx/", "755"], 17 | ["etc/certbot-inwx-cleanup", "usr/lib/letsencrypt-inwx/", "755"] 18 | ] 19 | 20 | [dependencies] 21 | sxd-xpath = "0.4.2" 22 | sxd-document = "0.3.2" 23 | reqwest = "0.9.21" 24 | trust-dns = "0.17.0" 25 | clap = "2.33.0" 26 | openssl-probe = "0.1.2" 27 | serde = { version = "1.0.101", features = ["derive"] } 28 | serde_json = "1.0.41" 29 | cookie = { version = "0.12.0", features = ["percent-encode"] } 30 | env_logger = "0.7.0" 31 | log = "0.4.8" 32 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ekidd/rust-musl-builder:stable as builder 2 | COPY . . 3 | RUN cargo install cargo-deb 4 | RUN cargo deb --target x86_64-unknown-linux-musl 5 | 6 | FROM certbot/certbot:latest 7 | VOLUME /etc/letsencrypt 8 | COPY --from=builder /home/rust/src/target/x86_64-unknown-linux-musl/release/letsencrypt-inwx /usr/bin/ 9 | COPY etc/* /usr/lib/letsencrypt-inwx/ 10 | RUN chmod +x /usr/lib/letsencrypt-inwx/* 11 | 12 | ENTRYPOINT ["/usr/lib/letsencrypt-inwx/docker-entrypoint.sh"] 13 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Matthias Herzog 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # letsencrypt-inwx [![CircleCI](https://circleci.com/gh/kegato/letsencrypt-inwx.svg?style=svg)](https://circleci.com/gh/kegato/letsencrypt-inwx) [![Docker Pulls](https://img.shields.io/docker/pulls/kegato/letsencrypt-inwx.svg)](https://hub.docker.com/r/kegato/letsencrypt-inwx/) [![Crates.io](https://img.shields.io/crates/v/letsencrypt-inwx.svg)](https://crates.io/crates/letsencrypt-inwx) 2 | 3 | A small cli utility for automating the letsencrypt dns-01 challenge for domains hosted by inwx. This allows you to obtain wildcard certificates from letsencrypt. 4 | 5 | ## Installation 6 | ### Ubuntu / Debian 7 | - Build the .deb package or download it from [releases](https://github.com/kegato/letsencrypt-inwx/releases/latest) and install it with `sudo dpkg -i ` 8 | 9 | ### Other linux 10 | - Build the executable or download it from [releases](https://github.com/kegato/letsencrypt-inwx/releases/latest) and copy it to `/usr/bin/` 11 | - Copy both certbot scripts from `./etc/` to `/usr/lib/letsencrypt-inwx/` 12 | 13 | ### With cargo 14 | - Run `cargo install letsencrypt-inwx` 15 | 16 | ## Configuration 17 | You can store the configuration file at `/etc/letsencrypt-inwx.json` or at `~/.config/letsencrypt-inwx.json` when used with certbot or specify it's path with the `-c` option. 18 | The configuration file should look like this (without the comments): 19 | ```js 20 | { 21 | "accounts": [ 22 | { 23 | "username": "user", 24 | "password": "pass", 25 | // optional, if the domain is not configured all accounts will be tried 26 | "domains": [ 27 | "example.com" 28 | ], 29 | // optional, if true the public inwx test server will be used 30 | "ote": false 31 | } 32 | ], 33 | // optional 34 | "options": { 35 | // optional, if true letsencrypt-inwx will not wait until the created record is publicly visible, default: false 36 | "no_dns_check": false, 37 | // optional, the amount of time in seconds to wait after creating a record, default: 5 seconds 38 | "wait_interval": 5, 39 | // optional: the dns server to use, default: the google public dns server 40 | "dns_server": "8.8.8.8" 41 | } 42 | } 43 | ``` 44 | 45 | ## Usage 46 | ### With Docker and certbot 47 | - Generate your certificate by running `docker run --rm -it -v /etc/letsencrypt-inwx.json:/etc/letsencrypt-inwx.json -v /etc/letsencrypt:/etc/letsencrypt kegato/letsencrypt-inwx certonly --email --preferred-challenges=dns-01 --manual --manual-auth-hook /usr/lib/letsencrypt-inwx/certbot-inwx-auth --manual-cleanup-hook /usr/lib/letsencrypt-inwx/certbot-inwx-cleanup --manual-public-ip-logging-ok -d ` 48 | - You can find your certificate in `/etc/letsencrypt/live//` 49 | - You can renew your certificate by running `docker run --rm -it -v /etc/letsencrypt-inwx.json:/etc/letsencrypt-inwx.json -v /etc/letsencrypt:/etc/letsencrypt kegato/letsencrypt-inwx renew` 50 | 51 | ### With certbot 52 | - You can get certificates from [certbot](https://certbot.eff.org/) by running `sudo certbot certonly -n --agree-tos --email --preferred-challenges=dns-01 --manual --manual-auth-hook /usr/lib/letsencrypt-inwx/certbot-inwx-auth --manual-cleanup-hook /usr/lib/letsencrypt-inwx/certbot-inwx-cleanup --manual-public-ip-logging-ok -d ` 53 | 54 | ### Manually 55 | - Create a txt record with `letsencrypt-inwx create -c -d _acme-challenge. -v ` 56 | - Delete it with `letsencrypt-inwx delete -c -d _acme-challenge.` 57 | 58 | ## Building 59 | ### Requirements 60 | `libssl-dev` and `pkg-config` are required when building on Ubuntu / Debian see [here](https://github.com/sfackler/rust-openssl). 61 | 62 | ### .deb package 63 | - Install [cargo-deb](https://github.com/mmstick/cargo-deb) by running `cargo install cargo-deb` 64 | - Run `cargo deb` to build the package 65 | 66 | ### only the executable 67 | - Run `cargo build --release` to build the `letsencrypt-inwx` executable 68 | -------------------------------------------------------------------------------- /etc/certbot-inwx-auth: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | CONFIG_PATH=/etc/letsencrypt-inwx.json 4 | 5 | if [ -f ~/.config/letsencrypt-inwx.json ]; then 6 | CONFIG_PATH=~/.config/letsencrypt-inwx.json 7 | fi 8 | 9 | /usr/bin/letsencrypt-inwx create -c $CONFIG_PATH -d "_acme-challenge.$CERTBOT_DOMAIN" -v "$CERTBOT_VALIDATION" 10 | -------------------------------------------------------------------------------- /etc/certbot-inwx-cleanup: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | CONFIG_PATH=/etc/letsencrypt-inwx.json 4 | 5 | if [ -f ~/.config/letsencrypt-inwx.json ]; then 6 | CONFIG_PATH=~/.config/letsencrypt-inwx.json 7 | fi 8 | 9 | /usr/bin/letsencrypt-inwx delete -c $CONFIG_PATH -d "_acme-challenge.$CERTBOT_DOMAIN" 10 | -------------------------------------------------------------------------------- /etc/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | CONF_CREATED=false 4 | 5 | if [ ! -z "$INWX_USER" -a ! -z "$INWX_PASSWD" ]; then 6 | CONF_CREATED=true 7 | >&2 echo "\ 8 | !!! WARNING !!! 9 | PASSING INWX_USER AND INWX_PASSWD AS ENV VARIABLES IS DEPRECATED AND WILL BE REMOVED IN THE FUTURE! 10 | You should mount a config file into the container instead. See https://github.com/kegato/letsencrypt-inwx for details. 11 | " 12 | cat << EOF > /etc/letsencrypt-inwx.json 13 | { 14 | "accounts": [{ 15 | "username": "$INWX_USER", 16 | "password": "$INWX_PASSWD" 17 | }] 18 | } 19 | EOF 20 | chmod 600 /etc/letsencrypt-inwx.json 21 | fi 22 | 23 | set -x 24 | certbot -n --agree-tos $@ 25 | set +x 26 | 27 | if [ $CONF_CREATED = true ]; then 28 | rm /etc/letsencrypt-inwx.json 29 | fi 30 | -------------------------------------------------------------------------------- /src/cli.rs: -------------------------------------------------------------------------------- 1 | use crate::config::Config; 2 | use crate::dns::{check_txt_record, lookup_real_domain}; 3 | use crate::inwx::{Inwx, InwxError}; 4 | use clap::{App, Arg, SubCommand}; 5 | use std::fs::File; 6 | use std::io::BufReader; 7 | use std::thread::sleep; 8 | use std::time::{Duration, Instant}; 9 | 10 | fn execute_api_commands(config: &Config, domain: &str, op: F) -> Result 11 | where 12 | F: Fn(&mut Inwx) -> Result<(), InwxError>, 13 | { 14 | if config.accounts.len() == 0 { 15 | error!("No accounts configured"); 16 | return Err(()); 17 | } 18 | 19 | let mut filtered_accounts = Vec::new(); 20 | 21 | match config.accounts.iter().find(|account| { 22 | account 23 | .domains 24 | .iter() 25 | .any(|d| domain == d || domain.ends_with(&format!(".{}", d))) 26 | }) { 27 | Some(account) => { 28 | info!("Using account {}", account.username); 29 | filtered_accounts.push(account); 30 | } 31 | None => { 32 | warn!( 33 | "Domain not configured: Trying {} configured accounts", 34 | config.accounts.len() 35 | ); 36 | filtered_accounts.extend(config.accounts.iter()); 37 | } 38 | }; 39 | 40 | for account in filtered_accounts { 41 | let mut success = false; 42 | let mut api = Inwx::new(&account).map_err(|e| error!("{}", e))?; 43 | 44 | match op(&mut api) { 45 | Err(InwxError::DomainNotFound) => {} 46 | Err(e) => { 47 | error!("{}", e); 48 | return Err(()); 49 | } 50 | _ => { 51 | success = true; 52 | } 53 | } 54 | 55 | if let Err(e) = api.logout() { 56 | error!("{}", e); 57 | } 58 | 59 | if success { 60 | return Ok(account.ote); 61 | } 62 | } 63 | 64 | error!("{}", InwxError::DomainNotFound); 65 | Err(()) 66 | } 67 | 68 | fn read_config(path: &str) -> Result { 69 | let file = File::open(path).map_err(|e| error!("Failed to open config file: {}", e))?; 70 | let reader = BufReader::new(file); 71 | Ok( 72 | serde_json::from_reader(reader) 73 | .map_err(|e| error!("Failed to parse config file: {}", e))?, 74 | ) 75 | } 76 | 77 | fn create(config: &Config, domain: &str, value: &str) -> Result<(), ()> { 78 | info!("Creating TXT record..."); 79 | 80 | let is_ote = execute_api_commands(&config, &domain, |api| { 81 | api.create_txt_record(&domain, &value)?; 82 | Ok(()) 83 | })?; 84 | 85 | info!("=> done!"); 86 | 87 | if !is_ote && !config.options.no_dns_check { 88 | info!("Waiting for the dns record to be publicly visible..."); 89 | 90 | let start = Instant::now(); 91 | let mut wait_secs = 5; 92 | 93 | loop { 94 | // timeout after 10 minutes 95 | if start.elapsed() > Duration::from_secs(60 * 10) { 96 | error!("=> timeout!"); 97 | return Err(()); 98 | } 99 | 100 | if check_txt_record(&config.options.dns_server, &domain, value) { 101 | break; 102 | } 103 | 104 | wait_secs *= 2; 105 | 106 | sleep(Duration::from_secs(wait_secs)); 107 | } 108 | 109 | info!("=> done!"); 110 | } 111 | 112 | if config.options.wait_interval > 0 { 113 | info!( 114 | "Waiting {} additional seconds...", 115 | &config.options.wait_interval 116 | ); 117 | 118 | sleep(Duration::from_secs(config.options.wait_interval)); 119 | 120 | info!("=> done!"); 121 | } 122 | 123 | Ok(()) 124 | } 125 | 126 | fn delete(config: &Config, domain: &str) -> Result<(), ()> { 127 | info!("Deleting TXT record..."); 128 | 129 | execute_api_commands(&config, &domain, |api| { 130 | api.delete_txt_record(&domain)?; 131 | Ok(()) 132 | })?; 133 | 134 | info!("=> done!"); 135 | 136 | Ok(()) 137 | } 138 | 139 | pub fn run() -> Result<(), ()> { 140 | let mut app = App::new("letsencrypt-inwx") 141 | .version(env!("CARGO_PKG_VERSION")) 142 | .about("A small cli utility for automating the letsencrypt dns-01 challenge for domains hosted by inwx") 143 | .subcommand(SubCommand::with_name("create") 144 | .about("create a TXT record") 145 | .arg(Arg::with_name("configfile") 146 | .short("c") 147 | .value_name("CONFIG_FILE") 148 | .help("specify the path to the configfile") 149 | .takes_value(true) 150 | .required(true) 151 | ) 152 | .arg(Arg::with_name("domain") 153 | .short("d") 154 | .value_name("DOMAIN") 155 | .help("the domain of the record (i.e. \"_acme-challenge.example.com\"") 156 | .takes_value(true) 157 | .required(true) 158 | ) 159 | .arg(Arg::with_name("value") 160 | .short("v") 161 | .value_name("VALUE") 162 | .help("the value of the record") 163 | .takes_value(true) 164 | .required(true) 165 | ) 166 | ) 167 | .subcommand(SubCommand::with_name("delete") 168 | .about("delete a TXT record") 169 | .arg(Arg::with_name("configfile") 170 | .short("c") 171 | .value_name("CONFIG_FILE") 172 | .help("specify the path to the configfile") 173 | .takes_value(true) 174 | .required(true) 175 | ) 176 | .arg(Arg::with_name("domain") 177 | .short("d") 178 | .value_name("DOMAIN") 179 | .help("the domain of the record (i.e. \"_acme-challenge.example.com\"") 180 | .takes_value(true) 181 | .required(true) 182 | ) 183 | ); 184 | 185 | let matches = app.clone().get_matches(); 186 | 187 | if let Some(matches) = matches.subcommand_matches("create") { 188 | let config = read_config(matches.value_of("configfile").unwrap())?; 189 | let domain = lookup_real_domain( 190 | &config.options.dns_server, 191 | matches.value_of("domain").unwrap(), 192 | ); 193 | let value = matches.value_of("value").unwrap(); 194 | 195 | create(&config, &domain, &value)?; 196 | } else if let Some(matches) = matches.subcommand_matches("delete") { 197 | let config = read_config(matches.value_of("configfile").unwrap())?; 198 | let domain = lookup_real_domain( 199 | &config.options.dns_server, 200 | matches.value_of("domain").unwrap(), 201 | ); 202 | 203 | delete(&config, &domain)?; 204 | } else { 205 | app.print_help().unwrap(); 206 | std::process::exit(1); 207 | } 208 | 209 | Ok(()) 210 | } 211 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | use serde::Deserialize; 2 | 3 | #[derive(Deserialize, Debug, Clone)] 4 | #[serde(default)] 5 | pub struct Config { 6 | pub accounts: Vec, 7 | pub options: Options, 8 | } 9 | 10 | impl Default for Config { 11 | fn default() -> Config { 12 | Config { 13 | accounts: vec![], 14 | options: Options::default(), 15 | } 16 | } 17 | } 18 | 19 | #[derive(Deserialize, Debug, Clone)] 20 | pub struct Account { 21 | pub username: String, 22 | pub password: String, 23 | #[serde(default)] 24 | pub domains: Vec, 25 | #[serde(default)] 26 | pub ote: bool, 27 | } 28 | 29 | #[derive(Deserialize, Debug, Clone)] 30 | #[serde(default)] 31 | pub struct Options { 32 | pub no_dns_check: bool, 33 | pub wait_interval: u64, 34 | pub dns_server: String, 35 | } 36 | 37 | impl Default for Options { 38 | fn default() -> Options { 39 | Options { 40 | no_dns_check: false, 41 | wait_interval: 5, 42 | dns_server: "8.8.8.8".to_owned(), 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/dns.rs: -------------------------------------------------------------------------------- 1 | use std::str::FromStr; 2 | use trust_dns::client::{Client, SyncClient}; 3 | use trust_dns::op::DnsResponse; 4 | use trust_dns::rr::{DNSClass, Name, RData, Record, RecordType}; 5 | use trust_dns::udp::UdpClientConnection; 6 | 7 | fn dns_client(dns_server: &str) -> SyncClient { 8 | let address = format!("{}:53", dns_server).parse().unwrap(); 9 | let conn = UdpClientConnection::new(address).unwrap(); 10 | SyncClient::new(conn) 11 | } 12 | 13 | pub fn add_trailing_dot(domain: &str) -> String { 14 | let mut domain = domain.to_owned(); 15 | 16 | if !domain.ends_with(".") { 17 | domain += "."; 18 | } 19 | 20 | domain 21 | } 22 | 23 | pub fn remove_trailing_dot(domain: &str) -> String { 24 | let mut domain = domain.to_owned(); 25 | 26 | if domain.ends_with(".") { 27 | domain.pop(); 28 | } 29 | 30 | domain 31 | } 32 | 33 | fn check_cname(dns_server: &str, domain: &str) -> Option { 34 | let client = dns_client(dns_server); 35 | let name = Name::from_str(&add_trailing_dot(domain)).ok()?; 36 | let response: DnsResponse = client.query(&name, DNSClass::IN, RecordType::CNAME).ok()?; 37 | let answers: &[Record] = response.answers(); 38 | 39 | for record in answers { 40 | if let RData::CNAME(ref cname) = record.rdata() { 41 | return Some(remove_trailing_dot(&cname.to_utf8())); 42 | } 43 | } 44 | 45 | None 46 | } 47 | 48 | pub fn lookup_real_domain(dns_server: &str, domain: &str) -> String { 49 | let mut depth = 0; 50 | 51 | let mut domain = domain.to_owned(); 52 | while let Some(real_name) = check_cname(dns_server, &domain) { 53 | debug!("Using {} for {}", real_name, domain); 54 | domain = real_name; 55 | 56 | if depth >= 10 { 57 | break; 58 | } 59 | 60 | depth += 1; 61 | } 62 | 63 | domain 64 | } 65 | 66 | pub fn check_txt_record(dns_server: &str, domain: &str, value: &str) -> bool { 67 | let client = dns_client(dns_server); 68 | let name = match Name::from_str(&add_trailing_dot(domain)) { 69 | Ok(name) => name, 70 | Err(_) => return false, 71 | }; 72 | 73 | if let Ok(response) = client.query(&name, DNSClass::IN, RecordType::TXT) { 74 | for record in response.answers() { 75 | if record.name().to_utf8().to_lowercase() == name.to_utf8().to_lowercase() { 76 | if let RData::TXT(data) = record.rdata() { 77 | for data in data.txt_data().iter() { 78 | let data = String::from_utf8_lossy(data); 79 | 80 | if data == value { 81 | return true; 82 | } 83 | } 84 | } 85 | } 86 | } 87 | } 88 | 89 | false 90 | } 91 | -------------------------------------------------------------------------------- /src/inwx.rs: -------------------------------------------------------------------------------- 1 | use super::config::Account; 2 | use super::rpc::{ 3 | RpcError, RpcRequest, RpcRequestParameter, RpcRequestParameterValue, RpcResponse, 4 | }; 5 | use cookie::CookieJar; 6 | use std::fmt; 7 | use sxd_xpath::{evaluate_xpath, Value}; 8 | 9 | const API_URL: &str = "https://api.domrobot.com/xmlrpc/"; 10 | const OTE_API_URL: &str = "https://api.ote.domrobot.com/xmlrpc/"; 11 | 12 | #[derive(Debug)] 13 | pub enum InwxError { 14 | RpcError(RpcError), 15 | DomainNotFound, 16 | RecordNotFound, 17 | } 18 | 19 | impl fmt::Display for InwxError { 20 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 21 | match self { 22 | &InwxError::RpcError(ref e) => write!(f, "An inwx api call failed: {}", e), 23 | &InwxError::DomainNotFound => { 24 | write!(f, "There is no nameserver for the specified domain") 25 | } 26 | &InwxError::RecordNotFound => write!(f, "The specified record does not exist"), 27 | } 28 | } 29 | } 30 | 31 | impl From for InwxError { 32 | fn from(rpc_error: RpcError) -> InwxError { 33 | InwxError::RpcError(rpc_error) 34 | } 35 | } 36 | 37 | pub struct Inwx<'a> { 38 | cookies: CookieJar, 39 | account: &'a Account, 40 | } 41 | 42 | impl<'a> Inwx<'a> { 43 | fn send_request(&mut self, request: RpcRequest) -> Result { 44 | let url = match self.account.ote { 45 | true => OTE_API_URL, 46 | false => API_URL, 47 | }; 48 | let response = request.send(url, &mut self.cookies)?; 49 | 50 | Ok(response) 51 | } 52 | 53 | fn login(&mut self) -> Result<(), InwxError> { 54 | let request = RpcRequest::new( 55 | "account.login", 56 | &[ 57 | RpcRequestParameter { 58 | name: "user", 59 | value: RpcRequestParameterValue::String(self.account.username.to_owned()), 60 | }, 61 | RpcRequestParameter { 62 | name: "pass", 63 | value: RpcRequestParameterValue::String(self.account.password.to_owned()), 64 | }, 65 | ], 66 | ); 67 | 68 | debug!("Logging into account {}", self.account.username); 69 | 70 | self.send_request(request)?; 71 | 72 | Ok(()) 73 | } 74 | 75 | pub fn new(account: &'a Account) -> Result, InwxError> { 76 | let mut api = Inwx { 77 | cookies: CookieJar::new(), 78 | account, 79 | }; 80 | 81 | api.login()?; 82 | 83 | Ok(api) 84 | } 85 | 86 | fn split_domain(&mut self, domain: &str) -> Result<(String, String), InwxError> { 87 | debug!("Splitting domain {}", domain); 88 | let page_size = 20; 89 | let mut page = 1; 90 | 91 | loop { 92 | debug!("Requesting page {} of nameserver.list", page); 93 | let request = RpcRequest::new( 94 | "nameserver.list", 95 | &[ 96 | RpcRequestParameter { 97 | name: "pagelimit", 98 | value: RpcRequestParameterValue::Int(page_size), 99 | }, 100 | RpcRequestParameter { 101 | name: "page", 102 | value: RpcRequestParameterValue::Int(page), 103 | }, 104 | ], 105 | ); 106 | 107 | let response = self.send_request(request)?; 108 | 109 | let total: i32 = evaluate_xpath( 110 | &response.get_document(), 111 | "/methodResponse/params/param/value/struct/member[name/text()=\"resData\"]/value/struct/member[name/text()=\"count\"]/value/int" 112 | ) 113 | .ok() 114 | .and_then(|value| value.string().parse().ok()) 115 | .ok_or_else(|| InwxError::DomainNotFound)?; 116 | 117 | if let Ok(Value::Nodeset(ref nodes)) = evaluate_xpath(&response.get_document(), "/methodResponse/params/param/value/struct/member[name/text()=\"resData\"]/value/struct/member[name/text()=\"domains\"]/value/array/data/value/struct/member[name/text()=\"domain\"]/value/string/text()") { 118 | for node in nodes { 119 | if let Some(ref text) = node.text() { 120 | let domain_root = text.text(); 121 | debug!("Checking domain {}", domain_root); 122 | 123 | if domain.ends_with(&format!(".{}", domain_root)) { 124 | let name = &domain[0..domain.len() - domain_root.len() - 1]; 125 | debug!("Found domain root {}", domain_root); 126 | 127 | return Ok((domain_root.to_owned(), name.to_owned())); 128 | } else if domain == domain_root { 129 | debug!("Found domain root {}", domain_root); 130 | 131 | return Ok((domain_root.to_owned(), "".to_owned())); 132 | } 133 | 134 | debug!("{} is not the domain root of {}", domain_root, domain); 135 | } 136 | } 137 | } 138 | 139 | if total > page * page_size { 140 | page += 1; 141 | } else { 142 | return Err(InwxError::DomainNotFound); 143 | } 144 | } 145 | } 146 | 147 | pub fn create_txt_record(&mut self, domain: &str, content: &str) -> Result<(), InwxError> { 148 | let (domain, name) = self.split_domain(domain)?; 149 | 150 | let request = RpcRequest::new( 151 | "nameserver.createRecord", 152 | &[ 153 | RpcRequestParameter { 154 | name: "type", 155 | value: RpcRequestParameterValue::String("TXT".to_owned()), 156 | }, 157 | RpcRequestParameter { 158 | name: "name", 159 | value: RpcRequestParameterValue::String(name), 160 | }, 161 | RpcRequestParameter { 162 | name: "content", 163 | value: RpcRequestParameterValue::String(content.to_owned()), 164 | }, 165 | RpcRequestParameter { 166 | name: "domain", 167 | value: RpcRequestParameterValue::String(domain), 168 | }, 169 | ], 170 | ); 171 | 172 | self.send_request(request)?; 173 | 174 | Ok(()) 175 | } 176 | 177 | pub fn get_record_id(&mut self, domain: &str) -> Result { 178 | let (domain, name) = self.split_domain(domain)?; 179 | 180 | let request = RpcRequest::new( 181 | "nameserver.info", 182 | &[ 183 | RpcRequestParameter { 184 | name: "type", 185 | value: RpcRequestParameterValue::String("TXT".to_owned()), 186 | }, 187 | RpcRequestParameter { 188 | name: "name", 189 | value: RpcRequestParameterValue::String(name.to_owned()), 190 | }, 191 | RpcRequestParameter { 192 | name: "domain", 193 | value: RpcRequestParameterValue::String(domain.to_owned()), 194 | }, 195 | ], 196 | ); 197 | 198 | let response = self.send_request(request)?; 199 | 200 | let id = match evaluate_xpath(&response.get_document(), "/methodResponse/params/param/value/struct/member[name/text()=\"resData\"]/value/struct/member[name/text()=\"record\"]/value/array/data/value[1]/struct/member[name/text()=\"id\"]/value/int/text()") { 201 | Ok(ref id) => id.string().parse::().ok(), 202 | Err(_) => None 203 | }; 204 | 205 | id.ok_or_else(|| InwxError::RecordNotFound) 206 | } 207 | 208 | pub fn delete_txt_record(&mut self, domain: &str) -> Result<(), InwxError> { 209 | let id = self.get_record_id(domain)?; 210 | 211 | let request = RpcRequest::new( 212 | "nameserver.deleteRecord", 213 | &[RpcRequestParameter { 214 | name: "id", 215 | value: RpcRequestParameterValue::Int(id), 216 | }], 217 | ); 218 | 219 | self.send_request(request)?; 220 | 221 | Ok(()) 222 | } 223 | 224 | pub fn logout(mut self) -> Result<(), InwxError> { 225 | let request = RpcRequest::new("account.logout", &[]); 226 | 227 | self.send_request(request)?; 228 | 229 | Ok(()) 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate log; 3 | use env_logger; 4 | use env_logger::Env; 5 | mod cli; 6 | mod config; 7 | mod dns; 8 | mod inwx; 9 | mod rpc; 10 | 11 | use std::process::exit; 12 | 13 | fn main() { 14 | let env = Env::new().filter_or("LOG", "letsencrypt_inwx=info"); 15 | env_logger::init_from_env(env); 16 | openssl_probe::init_ssl_cert_env_vars(); 17 | 18 | if cli::run().is_err() { 19 | exit(1); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/rpc.rs: -------------------------------------------------------------------------------- 1 | use cookie::{Cookie, CookieJar}; 2 | use reqwest; 3 | use reqwest::{Client, Response, StatusCode}; 4 | use std::fmt; 5 | use sxd_document::dom::Document; 6 | use sxd_document::writer::format_document; 7 | use sxd_document::{parser, Package}; 8 | use sxd_xpath::evaluate_xpath; 9 | 10 | #[derive(Debug)] 11 | pub enum RpcError { 12 | ConnectionError(reqwest::Error), 13 | InvalidResponse, 14 | ApiError { 15 | method: String, 16 | reason: String, 17 | msg: String, 18 | }, 19 | } 20 | 21 | impl fmt::Display for RpcError { 22 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 23 | match self { 24 | &RpcError::InvalidResponse => write!(f, "The inwx api did not return a valid response"), 25 | &RpcError::ConnectionError(ref e) => { 26 | write!(f, "Could not connect to the inwx api: {}", e) 27 | } 28 | &RpcError::ApiError { 29 | ref method, 30 | ref msg, 31 | ref reason, 32 | } => write!( 33 | f, 34 | "The inwx api did return an error: method={}, msg={}, reason={}", 35 | method, msg, reason 36 | ), 37 | } 38 | } 39 | } 40 | 41 | pub struct RpcRequestParameter { 42 | pub name: &'static str, 43 | pub value: RpcRequestParameterValue, 44 | } 45 | 46 | pub enum RpcRequestParameterValue { 47 | String(String), 48 | Int(i32), 49 | } 50 | 51 | pub struct RpcRequest { 52 | body: Vec, 53 | method: String, 54 | } 55 | 56 | impl RpcRequest { 57 | pub fn new(method: &str, parameters: &[RpcRequestParameter]) -> RpcRequest { 58 | let package = Package::new(); 59 | let doc = package.as_document(); 60 | 61 | let method_call = doc.create_element("methodCall"); 62 | doc.root().append_child(method_call); 63 | 64 | let method_name = doc.create_element("methodName"); 65 | method_name.append_child(doc.create_text(method)); 66 | method_call.append_child(method_name); 67 | 68 | let params = doc.create_element("params"); 69 | method_call.append_child(params); 70 | let param = doc.create_element("param"); 71 | params.append_child(param); 72 | let value = doc.create_element("value"); 73 | param.append_child(value); 74 | let s = doc.create_element("struct"); 75 | value.append_child(s); 76 | 77 | for param in parameters { 78 | let member = doc.create_element("member"); 79 | 80 | let name = doc.create_element("name"); 81 | name.append_child(doc.create_text(¶m.name)); 82 | member.append_child(name); 83 | 84 | let value = doc.create_element("value"); 85 | member.append_child(value); 86 | match param.value { 87 | RpcRequestParameterValue::String(ref val) => { 88 | let string = doc.create_element("string"); 89 | string.append_child(doc.create_text(val)); 90 | value.append_child(string); 91 | } 92 | RpcRequestParameterValue::Int(ref val) => { 93 | let string = doc.create_element("int"); 94 | string.append_child(doc.create_text(&val.to_string())); 95 | value.append_child(string); 96 | } 97 | } 98 | 99 | s.append_child(member); 100 | } 101 | 102 | let mut body = Vec::new(); 103 | format_document(&doc, &mut body).unwrap(); 104 | 105 | RpcRequest { 106 | body: body, 107 | method: method.to_owned(), 108 | } 109 | } 110 | 111 | pub fn send(self, url: &str, cookies: &mut CookieJar) -> Result { 112 | let client = Client::new(); 113 | 114 | if let Ok(body) = std::str::from_utf8(&self.body) { 115 | trace!("Sending request {}", body); 116 | } 117 | 118 | let mut request = client.post(url).body(self.body); 119 | 120 | let cookie_values: Vec = cookies 121 | .iter() 122 | .map(|cookie| format!("{}", cookie.encoded())) 123 | .collect(); 124 | 125 | if cookie_values.len() > 0 { 126 | let cookie_values = cookie_values.join(";"); 127 | request = request.header(reqwest::header::COOKIE, cookie_values); 128 | } 129 | 130 | let response = request.send().map_err(|e| RpcError::ConnectionError(e))?; 131 | 132 | RpcResponse::new(response, self.method, cookies) 133 | } 134 | } 135 | 136 | pub struct RpcResponse { 137 | package: Package, 138 | } 139 | 140 | impl RpcResponse { 141 | fn new( 142 | mut response: Response, 143 | method: String, 144 | cookies: &mut CookieJar, 145 | ) -> Result { 146 | if response.status() == StatusCode::OK { 147 | if let Ok(ref response_text) = response.text() { 148 | trace!("Received response {:?}", response_text); 149 | 150 | if let Ok(package) = parser::parse(response_text) { 151 | let mut success = false; 152 | 153 | for header in response.headers().get_all(reqwest::header::SET_COOKIE) { 154 | if let Ok(value) = header.to_str() { 155 | if let Ok(cookie) = Cookie::parse(value.to_owned()) { 156 | cookies.add(cookie); 157 | } 158 | } 159 | } 160 | 161 | if let Ok(code) = evaluate_xpath(&package.as_document(), "/methodResponse/params/param/value/struct/member[name/text()=\"code\"]/value/int/text()") { 162 | if let Ok(code) = code.string().parse::() { 163 | if code < 2000 { 164 | success = true; 165 | } 166 | } 167 | } 168 | 169 | let mut msg = String::new(); 170 | let mut reason = String::new(); 171 | 172 | if !success { 173 | if let Ok(value) = evaluate_xpath( 174 | &package.as_document(), 175 | "/methodResponse/params/param/value/struct/member[name/text()=\"msg\"]/value/string/text()" 176 | ) { 177 | msg = value.string(); 178 | } 179 | 180 | if let Ok(value) = evaluate_xpath( 181 | &package.as_document(), 182 | "/methodResponse/params/param/value/struct/member[name/text()=\"reason\"]/value/string/text()" 183 | ) { 184 | reason = value.string(); 185 | } 186 | 187 | return Err(RpcError::ApiError { 188 | method, 189 | msg, 190 | reason, 191 | }); 192 | } 193 | 194 | return Ok(RpcResponse { package }); 195 | } 196 | } 197 | } 198 | 199 | Err(RpcError::InvalidResponse) 200 | } 201 | 202 | pub fn get_document(&self) -> Document { 203 | self.package.as_document() 204 | } 205 | } 206 | --------------------------------------------------------------------------------