├── .gitignore ├── src ├── frontend │ ├── mod.rs │ └── html │ │ ├── mod.rs │ │ ├── login.rs │ │ └── index.rs ├── main.rs ├── ldap.rs ├── lib.rs ├── cmd_args.rs ├── config.rs └── server.rs ├── img └── livy-manager.png ├── .travis.yml ├── conf └── livy-manager.toml.template ├── Cargo.toml ├── LICENSE-MIT ├── README.md ├── LICENSE-APACHE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | **/*.rs.bk 3 | /work 4 | -------------------------------------------------------------------------------- /src/frontend/mod.rs: -------------------------------------------------------------------------------- 1 | /// HTML resources 2 | pub mod html; 3 | -------------------------------------------------------------------------------- /src/frontend/html/mod.rs: -------------------------------------------------------------------------------- 1 | /// index 2 | pub mod index; 3 | /// login 4 | pub mod login; 5 | -------------------------------------------------------------------------------- /img/livy-manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjmrknsn/livy-manager/HEAD/img/livy-manager.png -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: rust 2 | rust: 3 | - stable 4 | - beta 5 | - nightly 6 | cache: cargo 7 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | extern crate livy_manager; 2 | 3 | use livy_manager::server; 4 | 5 | fn main() { 6 | server::run(); 7 | } 8 | -------------------------------------------------------------------------------- /conf/livy-manager.toml.template: -------------------------------------------------------------------------------- 1 | # Optional configuration for LDAP authentication 2 | # Please uncomment the following lines if you would like to use LDAP authentication. 3 | # [ldap] 4 | # url = "ldap://example.com:389" 5 | # user_dn = "uid={},ou=user,dc=company,dc=com" 6 | # admin_group_dn = "cn=admin_group,ou=group,dc=company,dc=com" 7 | 8 | # Configuration for the Livy REST API client 9 | [livy_client] 10 | url = "http://example.com:8998" 11 | # Please uncomment the following lines if you need to communicate with Kerberized Livy service. 12 | # gssnegotiate = true 13 | # username = "livy" 14 | 15 | # Configuration for the HTTP server. 16 | [http] 17 | addr = "localhost:9480" 18 | num_threads = 4 19 | -------------------------------------------------------------------------------- /src/ldap.rs: -------------------------------------------------------------------------------- 1 | use config::LDAP; 2 | use ldap3::{LdapConn, Scope}; 3 | use server::UserSession; 4 | use std::error::Error; 5 | 6 | pub fn auth(conf: &LDAP, uid: &str, password: &str) -> Result> { 7 | let ldap = LdapConn::new(conf.url.as_str())?; 8 | 9 | let user_dn = conf.user_dn.replace("{}", uid); 10 | 11 | ldap.simple_bind(user_dn.as_str(), password)?.success()?; 12 | 13 | let (res, _) = ldap.search(conf.admin_group_dn.as_str(), Scope::Subtree, format!("member={}", user_dn).as_str(), Vec::<&'static str>::new())?.success()?; 14 | 15 | let is_admin = res.len() == 1; 16 | 17 | let uid = String::from(uid); 18 | 19 | Ok(UserSession { 20 | uid, 21 | is_admin 22 | }) 23 | } 24 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | //! # livy_manager 2 | //! Web UI for Managing Apache Livy Sessions 3 | 4 | extern crate argparse; 5 | extern crate iron; 6 | extern crate ldap3; 7 | extern crate livy; 8 | extern crate params; 9 | extern crate persistent; 10 | extern crate router; 11 | extern crate serde; 12 | #[macro_use] 13 | extern crate serde_derive; 14 | extern crate serde_json; 15 | extern crate time; 16 | extern crate toml; 17 | extern crate uuid; 18 | 19 | /// Command-line arguments 20 | pub mod cmd_args; 21 | /// Configuration for Livy Manager 22 | pub mod config; 23 | /// Frontend resources 24 | pub mod frontend; 25 | /// LDAP client 26 | pub mod ldap; 27 | /// HTTP server 28 | pub mod server; 29 | 30 | #[cfg(test)] 31 | mod tests { 32 | #[test] 33 | fn it_works() { 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "livy_manager" 3 | version = "0.2.0" 4 | authors = ["Keiji Yoshida "] 5 | description = "Livy Manager - Web UI for Managing Apache Livy Sessions" 6 | license = "MIT/Apache-2.0" 7 | homepage = "https://crates.io/crates/livy_manager" 8 | repository = "https://github.com/kjmrknsn/livy-manager" 9 | documentation = "https://docs.rs/livy_manager" 10 | readme = "README.md" 11 | keywords = ["livy", "livy-manager"] 12 | categories = ["web-programming::http-server"] 13 | 14 | [badges] 15 | travis-ci = { repository = "kjmrknsn/livy-manager", branch = "master" } 16 | 17 | [dependencies] 18 | argparse = "0.2" 19 | iron = "0.6" 20 | ldap3 = "0.5" 21 | livy = "0.5" 22 | params = "0.8" 23 | persistent = "0.4" 24 | router = "0.6" 25 | serde = "1.0" 26 | serde_derive = "1.0" 27 | serde_json = "1.0" 28 | time = "0.1" 29 | toml = "0.4" 30 | uuid = { version = "0.5", features = ["v4"] } 31 | 32 | [[bin]] 33 | name = "livy-manager" 34 | path = "src/main.rs" 35 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /src/cmd_args.rs: -------------------------------------------------------------------------------- 1 | use argparse::{ArgumentParser, Store, StoreTrue}; 2 | 3 | /// Command-line arguments 4 | #[derive(Debug)] 5 | pub struct CmdArgs { 6 | pub conf_path: String, 7 | pub print_version: bool, 8 | } 9 | 10 | impl CmdArgs { 11 | /// Creates a new `CmdArgs`. 12 | pub fn new() -> CmdArgs { 13 | let mut conf_path = String::new(); 14 | let mut print_version = false; 15 | 16 | { 17 | let mut p = ArgumentParser::new(); 18 | p.set_description("Livy Manager - Web UI for Managing Apache Livy Sessions"); 19 | p.refer(&mut conf_path) 20 | .add_option(&["-c", "--conf-path"], 21 | Store, 22 | "Configuration file path"); 23 | p.refer(&mut print_version) 24 | .add_option(&["-V"], 25 | StoreTrue, 26 | "Print version info and exit"); 27 | p.parse_args_or_exit() 28 | } 29 | 30 | CmdArgs { 31 | conf_path, 32 | print_version, 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | use iron::typemap::Key; 2 | use std::fs::File; 3 | use std::io::prelude::*; 4 | use toml; 5 | 6 | /// Configuration for Livy Manager 7 | #[derive(Clone, Debug, Deserialize)] 8 | pub struct Config { 9 | pub ldap: Option, 10 | pub livy_client: LivyClient, 11 | pub http: HTTP, 12 | } 13 | 14 | impl Config { 15 | /// Creates a new `Config` from the file on `conf_path`. 16 | pub fn from(conf_path: &str) -> Config { 17 | let mut f = File::open(conf_path).unwrap(); 18 | let mut contents = String::new(); 19 | f.read_to_string(&mut contents).unwrap(); 20 | toml::from_str(contents.as_str()).unwrap() 21 | } 22 | } 23 | 24 | impl Key for Config { 25 | type Value = Self; 26 | } 27 | 28 | /// Configuration for the LDAP authentication 29 | #[derive(Clone, Debug, Deserialize)] 30 | pub struct LDAP { 31 | pub url: String, 32 | pub user_dn: String, 33 | pub admin_group_dn: String, 34 | } 35 | 36 | /// Configuration for the Livy client 37 | #[derive(Clone, Debug, Deserialize)] 38 | pub struct LivyClient { 39 | pub url: String, 40 | pub gssnegotiate: Option, 41 | pub username: Option, 42 | } 43 | 44 | /// Configuration for HTTP 45 | #[derive(Clone, Debug, Deserialize)] 46 | pub struct HTTP { 47 | pub addr: String, 48 | pub num_threads: usize, 49 | } 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Livy Manager 2 | [![Build Status](https://travis-ci.org/kjmrknsn/livy-manager.svg?branch=master)](https://travis-ci.org/kjmrknsn/livy-manager) 3 | 4 | ## Abstract 5 | Livy Manager is a Web UI for managing [Apache Livy](https://livy.incubator.apache.org/) sessions. 6 | 7 | ![](https://raw.githubusercontent.com/kjmrknsn/livy-manager/master/img/livy-manager.png) 8 | 9 | ## Issues Livy Manager Tackles with 10 | * It is difficult for non-developer Livy users to monitor or kill their Livy sessions and Spark applications. 11 | * They have to use an HTTP client tool like `curl` to call the Livy REST APIs. 12 | * Additionally, they have to manipulate machines on which a Kerberos client is installed if the Livy service is Kerberized. 13 | * In some services which use Livy, there's no way to kill a Livy session while a Spark application is running, so non-developer users cannot stop their Spark applications by themselves when they submitted a heavy and long running application accidentally. 14 | 15 | ## Solutions Livy Manager provides 16 | * Non-developer Livy users can see and kill their Livy sessions. 17 | * Optional LDAP authentication and authorization feature is included. 18 | * Admin users can see and kill all of the Livy sessions. 19 | * Non-admin users can see and kill only their Livy sessions. 20 | * This feature works well with Zeppelin with LDAP authentication and the Livy interpreter. 21 | 22 | ## Setup 23 | 1. Download an executable binary file from the [Releases](https://github.com/kjmrknsn/livy-manager/releases) page and deploy it to your server. 24 | 2. Deploy a Livy Manager configuration file to your server. Please see [conf/livy-manager.toml.template](https://github.com/kjmrknsn/livy-manager/blob/master/conf/livy-manager.toml.template) for its template. 25 | 3. Run Livy Manager by executing the following command: 26 | ```bash 27 | $ /path/to/livy-manager -c /path/to/livy-manager-configuration-file 28 | ``` 29 | -------------------------------------------------------------------------------- /src/frontend/html/login.rs: -------------------------------------------------------------------------------- 1 | pub const LOGIN: &'static str = r##" 2 | 3 | 4 | 5 | Livy Manager 6 | 7 | 8 | 9 | 10 | 11 | 12 | 23 | 24 | 25 | 28 | 29 |
30 |
31 |

Log In

32 |
33 |
34 |
35 |
36 | 37 | 38 |
39 |
40 | 41 | 42 |
43 | 44 |
45 |
46 |
47 | 48 | 50 | 51 | 52 | 67 | 68 | 69 | "##; 70 | -------------------------------------------------------------------------------- /src/frontend/html/index.rs: -------------------------------------------------------------------------------- 1 | pub const INDEX: &'static str = r##" 2 | 3 | 4 | 5 | Livy Manager 6 | 7 | 8 | 9 | 10 | 11 | 12 | 27 | 28 | 29 | 38 | 39 |
40 |
41 |

Active Sessions

42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |
IDApp IDProxy UserKindStateOperation
57 |
58 |
59 | 60 | 62 | 63 | 64 | 162 | 163 | 164 | "##; 165 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | use cmd_args::CmdArgs; 2 | use config::Config; 3 | use frontend::html::index::INDEX; 4 | use frontend::html::login::LOGIN; 5 | use iron::BeforeMiddleware; 6 | use iron::headers::{CacheControl, CacheDirective, Connection, ContentType, Headers, Location, SetCookie}; 7 | use iron::mime; 8 | use iron::mime::{Attr, Mime, TopLevel, SubLevel}; 9 | use iron::modifiers::Header; 10 | use iron::prelude::*; 11 | use iron::status; 12 | use iron::status::Status; 13 | use iron::Timeouts; 14 | use iron::typemap::Key; 15 | use ldap; 16 | use livy::client::Client; 17 | use params; 18 | use params::Params; 19 | use persistent::{Read, State}; 20 | use router::Router; 21 | use serde_json; 22 | use std::collections::HashMap; 23 | use std::error::Error; 24 | use std::fmt::{self, Debug}; 25 | use time; 26 | use time::Duration; 27 | use uuid::Uuid; 28 | 29 | const COOKIE_NAME: &'static str = "_lmsid"; 30 | 31 | pub fn run() { 32 | let args = CmdArgs::new(); 33 | 34 | if args.print_version { 35 | println!("Livy Manager {}", env!("CARGO_PKG_VERSION")); 36 | return; 37 | } 38 | 39 | let conf = Config::from(&args.conf_path); 40 | let user_sessions = UserSessions::new(); 41 | 42 | let mut router = Router::new(); 43 | router.get("/", index, "index"); 44 | router.get("/login", login, "login"); 45 | router.post("/login", auth, "auth"); 46 | router.get("/logout", logout, "logout"); 47 | router.get("/api/user_session", get_user_session, "get_user_session"); 48 | router.get("/api/sessions", get_sessions, "get_sessions"); 49 | router.delete("/api/sessions/:id", kill_session, "kill_session"); 50 | 51 | eprintln!("Livy Manager {}", env!("CARGO_PKG_VERSION")); 52 | eprintln!("Listening on {}.", conf.http.addr); 53 | 54 | let mut chain = Chain::new(router); 55 | chain.link(Read::::both(conf.clone())); 56 | chain.link(State::::both(user_sessions)); 57 | chain.link_before(UserSessionBeforeMiddleware); 58 | 59 | let iron = Iron { 60 | handler: chain, 61 | timeouts: Timeouts::default(), 62 | threads: conf.http.num_threads, 63 | }; 64 | iron.http(conf.http.addr).unwrap(); 65 | } 66 | 67 | fn index(req: &mut Request) -> IronResult { 68 | if auth_required(req) && req.extensions.get::().is_none() { 69 | return Ok(redirect(status::TemporaryRedirect, "/login", None)); 70 | } 71 | 72 | Ok(response(status::Ok, INDEX, text_html())) 73 | } 74 | 75 | fn login(req: &mut Request) -> IronResult { 76 | if !auth_required(req) { 77 | return Ok(redirect(status::TemporaryRedirect, "/", None)); 78 | } 79 | 80 | if req.extensions.get::().is_some() { 81 | return Ok(redirect(status::TemporaryRedirect, "/", get_uuid(&req.headers).as_ref().map(String::as_str))); 82 | } 83 | 84 | Ok(response(status::Ok, LOGIN, text_html())) 85 | } 86 | 87 | fn auth(req: &mut Request) -> IronResult { 88 | if !auth_required(req) { 89 | return Ok(redirect(status::SeeOther, "/", None)); 90 | } 91 | 92 | if req.extensions.get::().is_some() { 93 | return Ok(redirect(status::SeeOther, "/", get_uuid(&req.headers).as_ref().map(String::as_str))); 94 | } 95 | 96 | let params = match req.get_ref::() { 97 | Ok(params) => params.clone(), 98 | Err(err) => return Err(IronError::new(StringError(format!("{}", err)), status::BadRequest)), 99 | }; 100 | 101 | match (params.find(&["uid"]), params.find(&["password"])) { 102 | (Some(¶ms::Value::String(ref uid)), Some(¶ms::Value::String(ref password))) => { 103 | let arc = req.get::>().unwrap(); 104 | let conf = match arc.as_ref().ldap.clone() { 105 | Some(conf) => conf, 106 | None => return Err(IronError::new(StringError("invalid request".to_string()), status::BadRequest)) 107 | }; 108 | 109 | match ldap::auth(&conf, uid.as_str(), password.as_str()) { 110 | Ok(user_session) => { 111 | let uuid = Uuid::new_v4().to_string(); 112 | let arc = req.get::>().unwrap(); 113 | let lock = arc.as_ref(); 114 | let mut user_sessions = lock.write().unwrap(); 115 | if user_sessions.map.contains_key(&uuid) { 116 | return Ok(redirect(status::SeeOther, "/login?result=failed", None)); 117 | } 118 | user_sessions.map.insert(uuid.clone(), user_session); 119 | return Ok(redirect(status::SeeOther, "/", Some(&uuid))); 120 | }, 121 | Err(_) => Ok(redirect(status::SeeOther, "/login?result=failed", None)) 122 | } 123 | }, 124 | _ => Err(IronError::new(StringError("invalid parameters".to_string()), status::BadRequest)), 125 | } 126 | } 127 | 128 | fn logout(req: &mut Request) -> IronResult { 129 | if !auth_required(req) { 130 | return Ok(redirect(status::TemporaryRedirect, "/", None)); 131 | } 132 | 133 | if let (Some(_), Some(uuid)) = (req.extensions.get::(), get_uuid(&req.headers)) { 134 | let arc = req.get::>().unwrap(); 135 | let lock = arc.as_ref(); 136 | let mut user_sessions = lock.write().unwrap(); 137 | user_sessions.map.remove(&uuid); 138 | } 139 | 140 | Ok(redirect(status::TemporaryRedirect, "/login", None)) 141 | } 142 | 143 | fn get_user_session(req: &mut Request) -> IronResult { 144 | let user_session = req.extensions.get::(); 145 | 146 | match serde_json::to_string(&user_session) { 147 | Ok(user_session) => Ok(response(status::Ok, &user_session, application_json())), 148 | Err(err) => Err(IronError::new(StringError(format!("{}", err)), status::InternalServerError)), 149 | } 150 | } 151 | 152 | fn get_sessions(req: &mut Request) -> IronResult { 153 | let auth_required = auth_required(req); 154 | let user_session = match req.extensions.get::() { 155 | Some(user_session) => Some(user_session.clone()), 156 | None => None, 157 | }; 158 | 159 | if auth_required && user_session.is_none() { 160 | return Err(IronError::new(StringError(String::new()), status::Unauthorized)); 161 | } 162 | 163 | let client = livy_client(req); 164 | 165 | let sessions = match client.get_sessions(None, None) { 166 | Ok(sessions) => sessions, 167 | Err(err) => { 168 | return Err(IronError::new(StringError(format!("{}", err)), status::InternalServerError)) 169 | }, 170 | }; 171 | 172 | let mut sessions = match sessions.sessions { 173 | Some(sessions) => sessions, 174 | None => Vec::new(), 175 | }; 176 | 177 | let (uid, is_admin) = match user_session { 178 | Some(user_session) => (user_session.uid.clone(), user_session.is_admin), 179 | None => (String::new(), false), 180 | }; 181 | 182 | let sessions = sessions.iter_mut().filter(|ref session| { 183 | if !auth_required || is_admin { 184 | return true; 185 | } 186 | 187 | match session.proxy_user { 188 | Some(ref proxy_user) => proxy_user == uid.as_str(), 189 | None => false, 190 | } 191 | }).map(|session| { 192 | session.log = None; 193 | session 194 | }).collect::>(); 195 | 196 | let sessions = match serde_json::to_string(&sessions) { 197 | Ok(sessions) => sessions, 198 | Err(err) => return Err(IronError::new(StringError(format!("{}", err)), status::InternalServerError)), 199 | }; 200 | 201 | Ok(response(status::Ok, &sessions, application_json())) 202 | } 203 | 204 | fn kill_session(req: &mut Request) -> IronResult { 205 | let id = req.extensions.get::().unwrap() 206 | .find("id").unwrap().to_string(); 207 | 208 | let id = match id.parse() { 209 | Ok(id) => id, 210 | Err(err) => return Err(IronError::new(StringError(format!("{}", err)), status::InternalServerError)), 211 | }; 212 | 213 | let client = livy_client(req); 214 | 215 | let user_session = match req.extensions.get::() { 216 | Some(user_session) => Some(user_session.clone()), 217 | None => None, 218 | }; 219 | 220 | if !has_kill_session_authority(&client, id, auth_required(req), user_session.as_ref()) { 221 | return Err(IronError::new(StringError(String::new()), status::Unauthorized)); 222 | } 223 | 224 | match client.kill_session(id) { 225 | Ok(_) => Ok(response(status::Ok, "{}", application_json())), 226 | Err(err) => return Err(IronError::new(StringError(format!("{}", err)), status::InternalServerError)), 227 | } 228 | } 229 | 230 | fn has_kill_session_authority(client: &Client, id: i64, auth_required: bool, user_session: Option<&UserSession>) -> bool { 231 | if !auth_required { 232 | return true; 233 | } 234 | 235 | if user_session.is_none() { 236 | return false; 237 | } 238 | 239 | let user_session = user_session.unwrap(); 240 | 241 | if user_session.is_admin { 242 | return true; 243 | } 244 | 245 | match client.get_session(id) { 246 | Ok(session) => { 247 | match session.proxy_user { 248 | Some(proxy_user) => { 249 | proxy_user == user_session.uid 250 | }, 251 | None => false 252 | } 253 | }, 254 | Err(_) => false, 255 | } 256 | } 257 | 258 | fn text_html() -> Header { 259 | Header(ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![(Attr::Charset, mime::Value::Utf8)]))) 260 | } 261 | 262 | fn application_json() -> Header { 263 | Header(ContentType(Mime(TopLevel::Application, SubLevel::Json, vec![(Attr::Charset, mime::Value::Utf8)]))) 264 | } 265 | 266 | fn cache_control() -> Header { 267 | Header(CacheControl(vec![ 268 | CacheDirective::MustRevalidate, 269 | CacheDirective::NoCache, 270 | CacheDirective::NoStore, 271 | CacheDirective::Private, 272 | ])) 273 | } 274 | 275 | fn connection() -> Header { 276 | Header(Connection::keep_alive()) 277 | } 278 | 279 | fn response(status_code: Status, body: &str, content_type: Header) -> Response { 280 | Response::with((status_code, body, cache_control(), connection(), content_type)) 281 | } 282 | 283 | fn redirect(status_code: Status, path: &str, uuid: Option<&str>) -> Response { 284 | Response::with(( 285 | status_code, 286 | cache_control(), 287 | connection(), 288 | text_html(), 289 | Header(Location(path.to_owned())), 290 | set_cookie(uuid), 291 | )) 292 | } 293 | 294 | fn set_cookie(uuid: Option<&str>) -> Header { 295 | match uuid { 296 | Some(uuid) => { 297 | let expires = time::now_utc() + Duration::days(7); 298 | Header(SetCookie(vec![format!("{}={}; expires={}; path=/", COOKIE_NAME, uuid, expires.rfc822())])) 299 | }, 300 | None => { 301 | let expires = time::now_utc() - Duration::seconds(1); 302 | Header(SetCookie(vec![format!("{}=; expires={}; path=/", COOKIE_NAME, expires.rfc822())])) 303 | }, 304 | } 305 | } 306 | 307 | fn livy_client(req: &mut Request) -> Client { 308 | let arc = req.get::>().unwrap(); 309 | let conf = arc.as_ref().livy_client.clone(); 310 | 311 | Client::new( 312 | &conf.url, 313 | conf.gssnegotiate, 314 | conf.username 315 | ) 316 | } 317 | 318 | /// User session 319 | #[derive(Clone, Debug, Serialize)] 320 | pub struct UserSession { 321 | pub uid: String, 322 | pub is_admin: bool, 323 | } 324 | 325 | pub struct UserSessionBeforeMiddleware; 326 | 327 | impl Key for UserSessionBeforeMiddleware { 328 | type Value = UserSession; 329 | } 330 | 331 | impl BeforeMiddleware for UserSessionBeforeMiddleware { 332 | fn before(&self, req: &mut Request) -> IronResult<()> { 333 | if auth_required(req) { 334 | match get_uuid(&req.headers) { 335 | Some(uuid) => { 336 | let arc = req.get::>().unwrap(); 337 | let lock = arc.as_ref(); 338 | let user_sessions = lock.read().unwrap(); 339 | match user_sessions.map.get(&uuid) { 340 | Some(user_session) => { 341 | req.extensions.insert::(user_session.clone()); 342 | }, 343 | None => (), 344 | } 345 | } 346 | None => (), 347 | } 348 | } 349 | Ok(()) 350 | } 351 | } 352 | 353 | fn auth_required(req: &mut Request) -> bool { 354 | let arc = req.get::>().unwrap(); 355 | arc.as_ref().ldap.is_some() 356 | } 357 | 358 | pub fn get_uuid(headers: &Headers) -> Option { 359 | for header in headers.iter() { 360 | if header.name() == "Cookie" { 361 | for kv in header.value_string().split(";") { 362 | let kv = kv.trim().split("=").collect::>(); 363 | if kv.len() == 2 && kv[0] == COOKIE_NAME { 364 | return Some(String::from(kv[1])); 365 | } 366 | } 367 | } 368 | } 369 | 370 | None 371 | } 372 | 373 | pub struct UserSessions { 374 | pub map: HashMap 375 | } 376 | 377 | impl UserSessions { 378 | pub fn new() -> UserSessions { 379 | UserSessions { 380 | map: HashMap::new(), 381 | } 382 | } 383 | } 384 | 385 | impl Key for UserSessions { 386 | type Value = Self; 387 | } 388 | 389 | #[derive(Debug)] 390 | struct StringError(String); 391 | 392 | impl fmt::Display for StringError { 393 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 394 | Debug::fmt(self, f) 395 | } 396 | } 397 | 398 | impl Error for StringError { 399 | fn description(&self) -> &str { &*self.0 } 400 | } 401 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "advapi32-sys" 3 | version = "0.2.0" 4 | source = "registry+https://github.com/rust-lang/crates.io-index" 5 | dependencies = [ 6 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 7 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 8 | ] 9 | 10 | [[package]] 11 | name = "argparse" 12 | version = "0.2.1" 13 | source = "registry+https://github.com/rust-lang/crates.io-index" 14 | 15 | [[package]] 16 | name = "base64" 17 | version = "0.6.0" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | dependencies = [ 20 | "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 21 | "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 22 | ] 23 | 24 | [[package]] 25 | name = "bitflags" 26 | version = "0.7.0" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | 29 | [[package]] 30 | name = "bitflags" 31 | version = "0.9.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | 34 | [[package]] 35 | name = "bodyparser" 36 | version = "0.8.0" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | dependencies = [ 39 | "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 40 | "persistent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 41 | "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 42 | "serde 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", 43 | "serde_json 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 44 | ] 45 | 46 | [[package]] 47 | name = "buf_redux" 48 | version = "0.6.1" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | dependencies = [ 51 | "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 52 | "safemem 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 53 | ] 54 | 55 | [[package]] 56 | name = "byteorder" 57 | version = "1.2.1" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | 60 | [[package]] 61 | name = "bytes" 62 | version = "0.4.5" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | dependencies = [ 65 | "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 66 | "iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 67 | ] 68 | 69 | [[package]] 70 | name = "cc" 71 | version = "1.0.3" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | 74 | [[package]] 75 | name = "cfg-if" 76 | version = "0.1.2" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | 79 | [[package]] 80 | name = "core-foundation" 81 | version = "0.2.3" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | dependencies = [ 84 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 85 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 86 | ] 87 | 88 | [[package]] 89 | name = "core-foundation-sys" 90 | version = "0.2.3" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | dependencies = [ 93 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 94 | ] 95 | 96 | [[package]] 97 | name = "crypt32-sys" 98 | version = "0.2.0" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | dependencies = [ 101 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 102 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 103 | ] 104 | 105 | [[package]] 106 | name = "curl" 107 | version = "0.4.8" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | dependencies = [ 110 | "curl-sys 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", 111 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 112 | "openssl-probe 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 113 | "openssl-sys 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)", 114 | "socket2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", 115 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 116 | ] 117 | 118 | [[package]] 119 | name = "curl-sys" 120 | version = "0.3.15" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | dependencies = [ 123 | "cc 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 124 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 125 | "libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", 126 | "openssl-sys 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)", 127 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 128 | "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 129 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 130 | ] 131 | 132 | [[package]] 133 | name = "dtoa" 134 | version = "0.4.2" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | 137 | [[package]] 138 | name = "foreign-types" 139 | version = "0.3.2" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | dependencies = [ 142 | "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 143 | ] 144 | 145 | [[package]] 146 | name = "foreign-types-shared" 147 | version = "0.1.1" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | 150 | [[package]] 151 | name = "fuchsia-zircon" 152 | version = "0.2.1" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | dependencies = [ 155 | "fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 156 | ] 157 | 158 | [[package]] 159 | name = "fuchsia-zircon-sys" 160 | version = "0.2.0" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | dependencies = [ 163 | "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 164 | ] 165 | 166 | [[package]] 167 | name = "futures" 168 | version = "0.1.17" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | 171 | [[package]] 172 | name = "httparse" 173 | version = "1.2.3" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | 176 | [[package]] 177 | name = "hyper" 178 | version = "0.10.13" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | dependencies = [ 181 | "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 182 | "httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 183 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 184 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 185 | "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 186 | "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 187 | "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", 188 | "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 189 | "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 190 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 191 | "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 192 | ] 193 | 194 | [[package]] 195 | name = "idna" 196 | version = "0.1.4" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | dependencies = [ 199 | "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 200 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 201 | "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 202 | ] 203 | 204 | [[package]] 205 | name = "iovec" 206 | version = "0.1.1" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | dependencies = [ 209 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 210 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 211 | ] 212 | 213 | [[package]] 214 | name = "iron" 215 | version = "0.6.0" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | dependencies = [ 218 | "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", 219 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 220 | "mime_guess 1.8.3 (registry+https://github.com/rust-lang/crates.io-index)", 221 | "modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 222 | "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 223 | "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 224 | "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 225 | "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 226 | ] 227 | 228 | [[package]] 229 | name = "itoa" 230 | version = "0.3.4" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | 233 | [[package]] 234 | name = "kernel32-sys" 235 | version = "0.2.2" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | dependencies = [ 238 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 239 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 240 | ] 241 | 242 | [[package]] 243 | name = "language-tags" 244 | version = "0.2.2" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | 247 | [[package]] 248 | name = "lazy_static" 249 | version = "0.2.11" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | 252 | [[package]] 253 | name = "lazy_static" 254 | version = "1.0.0" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | 257 | [[package]] 258 | name = "lazycell" 259 | version = "0.5.1" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | 262 | [[package]] 263 | name = "lber" 264 | version = "0.1.5" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | dependencies = [ 267 | "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 268 | "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 269 | "nom 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 270 | ] 271 | 272 | [[package]] 273 | name = "ldap3" 274 | version = "0.5.1" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | dependencies = [ 277 | "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 278 | "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 279 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 280 | "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 281 | "lber 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 282 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 283 | "native-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 284 | "nom 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 285 | "tokio-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 286 | "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 287 | "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 288 | "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 289 | "tokio-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 290 | "tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 291 | "tokio-uds-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 292 | "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 293 | ] 294 | 295 | [[package]] 296 | name = "libc" 297 | version = "0.2.34" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | 300 | [[package]] 301 | name = "libz-sys" 302 | version = "1.0.18" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | dependencies = [ 305 | "cc 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 306 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 307 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 308 | "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 309 | ] 310 | 311 | [[package]] 312 | name = "livy" 313 | version = "0.5.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | dependencies = [ 316 | "curl 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 317 | "serde 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", 318 | "serde_derive 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", 319 | "serde_json 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 320 | ] 321 | 322 | [[package]] 323 | name = "livy_manager" 324 | version = "0.2.0" 325 | dependencies = [ 326 | "argparse 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 327 | "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 328 | "ldap3 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 329 | "livy 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 330 | "params 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 331 | "persistent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 332 | "router 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 333 | "serde 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", 334 | "serde_derive 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", 335 | "serde_json 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 336 | "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", 337 | "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 338 | "uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 339 | ] 340 | 341 | [[package]] 342 | name = "log" 343 | version = "0.3.8" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | 346 | [[package]] 347 | name = "matches" 348 | version = "0.1.6" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | 351 | [[package]] 352 | name = "memchr" 353 | version = "0.1.11" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | dependencies = [ 356 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 357 | ] 358 | 359 | [[package]] 360 | name = "memchr" 361 | version = "2.0.1" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | dependencies = [ 364 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 365 | ] 366 | 367 | [[package]] 368 | name = "mime" 369 | version = "0.2.6" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | dependencies = [ 372 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 373 | ] 374 | 375 | [[package]] 376 | name = "mime_guess" 377 | version = "1.8.3" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | dependencies = [ 380 | "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 381 | "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", 382 | "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", 383 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 384 | ] 385 | 386 | [[package]] 387 | name = "mio" 388 | version = "0.6.11" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | dependencies = [ 391 | "fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 392 | "fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 393 | "iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 394 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 395 | "lazycell 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 396 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 397 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 398 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 399 | "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", 400 | "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 401 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 402 | ] 403 | 404 | [[package]] 405 | name = "mio-uds" 406 | version = "0.6.4" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | dependencies = [ 409 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 410 | "mio 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 411 | ] 412 | 413 | [[package]] 414 | name = "miow" 415 | version = "0.2.1" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | dependencies = [ 418 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 419 | "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", 420 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 421 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 422 | ] 423 | 424 | [[package]] 425 | name = "modifier" 426 | version = "0.1.0" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | 429 | [[package]] 430 | name = "multipart" 431 | version = "0.13.5" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | dependencies = [ 434 | "buf_redux 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 435 | "httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 436 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 437 | "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 438 | "mime_guess 1.8.3 (registry+https://github.com/rust-lang/crates.io-index)", 439 | "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", 440 | "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 441 | "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", 442 | "twoway 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 443 | ] 444 | 445 | [[package]] 446 | name = "native-tls" 447 | version = "0.1.4" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | dependencies = [ 450 | "openssl 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)", 451 | "schannel 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 452 | "security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 453 | "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 454 | "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", 455 | ] 456 | 457 | [[package]] 458 | name = "net2" 459 | version = "0.2.31" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | dependencies = [ 462 | "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 463 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 464 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 465 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 467 | ] 468 | 469 | [[package]] 470 | name = "nom" 471 | version = "2.2.1" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | 474 | [[package]] 475 | name = "num" 476 | version = "0.1.41" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | dependencies = [ 479 | "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 480 | "num-complex 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 481 | "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 482 | "num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", 483 | "num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", 484 | "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 485 | ] 486 | 487 | [[package]] 488 | name = "num-bigint" 489 | version = "0.1.41" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | dependencies = [ 492 | "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 493 | "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 494 | "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", 495 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 496 | ] 497 | 498 | [[package]] 499 | name = "num-complex" 500 | version = "0.1.41" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | dependencies = [ 503 | "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 504 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 505 | ] 506 | 507 | [[package]] 508 | name = "num-integer" 509 | version = "0.1.35" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | dependencies = [ 512 | "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 513 | ] 514 | 515 | [[package]] 516 | name = "num-iter" 517 | version = "0.1.34" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | dependencies = [ 520 | "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 521 | "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 522 | ] 523 | 524 | [[package]] 525 | name = "num-rational" 526 | version = "0.1.40" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | dependencies = [ 529 | "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 530 | "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 531 | "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 532 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 533 | ] 534 | 535 | [[package]] 536 | name = "num-traits" 537 | version = "0.1.41" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | 540 | [[package]] 541 | name = "num_cpus" 542 | version = "1.7.0" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | dependencies = [ 545 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 546 | ] 547 | 548 | [[package]] 549 | name = "openssl" 550 | version = "0.9.23" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | dependencies = [ 553 | "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 554 | "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 555 | "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 556 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 557 | "openssl-sys 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)", 558 | ] 559 | 560 | [[package]] 561 | name = "openssl-probe" 562 | version = "0.1.1" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | 565 | [[package]] 566 | name = "openssl-sys" 567 | version = "0.9.23" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | dependencies = [ 570 | "cc 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 571 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 572 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 573 | "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 574 | ] 575 | 576 | [[package]] 577 | name = "params" 578 | version = "0.8.0" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | dependencies = [ 581 | "bodyparser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 582 | "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 583 | "multipart 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", 584 | "num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 585 | "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 586 | "serde_json 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 587 | "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", 588 | "urlencoded 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 589 | ] 590 | 591 | [[package]] 592 | name = "percent-encoding" 593 | version = "1.0.1" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | 596 | [[package]] 597 | name = "persistent" 598 | version = "0.4.0" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | dependencies = [ 601 | "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 602 | "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 603 | ] 604 | 605 | [[package]] 606 | name = "phf" 607 | version = "0.7.21" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | dependencies = [ 610 | "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", 611 | ] 612 | 613 | [[package]] 614 | name = "phf_codegen" 615 | version = "0.7.21" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | dependencies = [ 618 | "phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", 619 | "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", 620 | ] 621 | 622 | [[package]] 623 | name = "phf_generator" 624 | version = "0.7.21" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | dependencies = [ 627 | "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", 628 | "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", 629 | ] 630 | 631 | [[package]] 632 | name = "phf_shared" 633 | version = "0.7.21" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | dependencies = [ 636 | "siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 637 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 638 | ] 639 | 640 | [[package]] 641 | name = "pkg-config" 642 | version = "0.3.9" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | 645 | [[package]] 646 | name = "plugin" 647 | version = "0.2.6" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | dependencies = [ 650 | "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 651 | ] 652 | 653 | [[package]] 654 | name = "quote" 655 | version = "0.3.15" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | 658 | [[package]] 659 | name = "rand" 660 | version = "0.3.18" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | dependencies = [ 663 | "fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 664 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 665 | ] 666 | 667 | [[package]] 668 | name = "redox_syscall" 669 | version = "0.1.32" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | 672 | [[package]] 673 | name = "route-recognizer" 674 | version = "0.1.12" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | 677 | [[package]] 678 | name = "router" 679 | version = "0.6.0" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | dependencies = [ 682 | "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 683 | "route-recognizer 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 684 | "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 685 | ] 686 | 687 | [[package]] 688 | name = "rustc-serialize" 689 | version = "0.3.24" 690 | source = "registry+https://github.com/rust-lang/crates.io-index" 691 | 692 | [[package]] 693 | name = "safemem" 694 | version = "0.1.1" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | 697 | [[package]] 698 | name = "safemem" 699 | version = "0.2.0" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | 702 | [[package]] 703 | name = "schannel" 704 | version = "0.1.9" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | dependencies = [ 707 | "advapi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 708 | "crypt32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 709 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 710 | "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 711 | "secur32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 712 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 713 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 714 | ] 715 | 716 | [[package]] 717 | name = "scoped-tls" 718 | version = "0.1.0" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | 721 | [[package]] 722 | name = "secur32-sys" 723 | version = "0.2.0" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | dependencies = [ 726 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 727 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 728 | ] 729 | 730 | [[package]] 731 | name = "security-framework" 732 | version = "0.1.16" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | dependencies = [ 735 | "core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 736 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 737 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 738 | "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 739 | ] 740 | 741 | [[package]] 742 | name = "security-framework-sys" 743 | version = "0.1.16" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | dependencies = [ 746 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 747 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 748 | ] 749 | 750 | [[package]] 751 | name = "serde" 752 | version = "1.0.23" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | 755 | [[package]] 756 | name = "serde_derive" 757 | version = "1.0.23" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | dependencies = [ 760 | "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", 761 | "serde_derive_internals 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", 762 | "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", 763 | ] 764 | 765 | [[package]] 766 | name = "serde_derive_internals" 767 | version = "0.17.0" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | dependencies = [ 770 | "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", 771 | "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", 772 | ] 773 | 774 | [[package]] 775 | name = "serde_json" 776 | version = "1.0.7" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | dependencies = [ 779 | "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 780 | "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 781 | "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 782 | "serde 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", 783 | ] 784 | 785 | [[package]] 786 | name = "siphasher" 787 | version = "0.2.2" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | 790 | [[package]] 791 | name = "slab" 792 | version = "0.3.0" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | 795 | [[package]] 796 | name = "slab" 797 | version = "0.4.0" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | 800 | [[package]] 801 | name = "smallvec" 802 | version = "0.2.1" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | 805 | [[package]] 806 | name = "socket2" 807 | version = "0.2.4" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | dependencies = [ 810 | "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 811 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 812 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 813 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 814 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 815 | ] 816 | 817 | [[package]] 818 | name = "syn" 819 | version = "0.11.11" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | dependencies = [ 822 | "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", 823 | "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", 824 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 825 | ] 826 | 827 | [[package]] 828 | name = "synom" 829 | version = "0.11.3" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | dependencies = [ 832 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 833 | ] 834 | 835 | [[package]] 836 | name = "take" 837 | version = "0.1.0" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | 840 | [[package]] 841 | name = "tempdir" 842 | version = "0.3.5" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | dependencies = [ 845 | "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", 846 | ] 847 | 848 | [[package]] 849 | name = "time" 850 | version = "0.1.38" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | dependencies = [ 853 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 854 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 855 | "redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 856 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 857 | ] 858 | 859 | [[package]] 860 | name = "tokio-core" 861 | version = "0.1.10" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | dependencies = [ 864 | "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 865 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 866 | "iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 867 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 868 | "mio 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 869 | "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 870 | "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 871 | "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 872 | ] 873 | 874 | [[package]] 875 | name = "tokio-io" 876 | version = "0.1.4" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | dependencies = [ 879 | "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 880 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 881 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 882 | ] 883 | 884 | [[package]] 885 | name = "tokio-proto" 886 | version = "0.1.1" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | dependencies = [ 889 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 890 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 891 | "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", 892 | "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", 893 | "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 894 | "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 895 | "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 896 | "tokio-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 897 | "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 898 | "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 899 | ] 900 | 901 | [[package]] 902 | name = "tokio-service" 903 | version = "0.1.0" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | dependencies = [ 906 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 907 | ] 908 | 909 | [[package]] 910 | name = "tokio-tls" 911 | version = "0.1.3" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | dependencies = [ 914 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 915 | "native-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 916 | "tokio-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 917 | "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 918 | "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 919 | ] 920 | 921 | [[package]] 922 | name = "tokio-uds" 923 | version = "0.1.7" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | dependencies = [ 926 | "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 927 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 928 | "iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 929 | "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", 930 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 931 | "mio 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", 932 | "mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", 933 | "tokio-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 934 | "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 935 | ] 936 | 937 | [[package]] 938 | name = "tokio-uds-proto" 939 | version = "0.1.1" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | dependencies = [ 942 | "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 943 | "tokio-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 944 | "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 945 | "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 946 | "tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 947 | ] 948 | 949 | [[package]] 950 | name = "toml" 951 | version = "0.4.5" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | dependencies = [ 954 | "serde 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", 955 | ] 956 | 957 | [[package]] 958 | name = "traitobject" 959 | version = "0.1.0" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | 962 | [[package]] 963 | name = "twoway" 964 | version = "0.1.7" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | dependencies = [ 967 | "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 968 | ] 969 | 970 | [[package]] 971 | name = "typeable" 972 | version = "0.1.2" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | 975 | [[package]] 976 | name = "typemap" 977 | version = "0.3.3" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | dependencies = [ 980 | "unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 981 | ] 982 | 983 | [[package]] 984 | name = "unicase" 985 | version = "1.4.2" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | dependencies = [ 988 | "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 989 | ] 990 | 991 | [[package]] 992 | name = "unicode-bidi" 993 | version = "0.3.4" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | dependencies = [ 996 | "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 997 | ] 998 | 999 | [[package]] 1000 | name = "unicode-normalization" 1001 | version = "0.1.5" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | 1004 | [[package]] 1005 | name = "unicode-xid" 1006 | version = "0.0.4" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | 1009 | [[package]] 1010 | name = "unsafe-any" 1011 | version = "0.4.2" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | dependencies = [ 1014 | "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "url" 1019 | version = "1.6.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | dependencies = [ 1022 | "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1023 | "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1024 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "urlencoded" 1029 | version = "0.6.0" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | dependencies = [ 1032 | "bodyparser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 1033 | "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 1034 | "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 1035 | "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "uuid" 1040 | version = "0.5.1" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | dependencies = [ 1043 | "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "vcpkg" 1048 | version = "0.2.2" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | 1051 | [[package]] 1052 | name = "version_check" 1053 | version = "0.1.3" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | 1056 | [[package]] 1057 | name = "winapi" 1058 | version = "0.2.8" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | 1061 | [[package]] 1062 | name = "winapi-build" 1063 | version = "0.1.1" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | 1066 | [[package]] 1067 | name = "ws2_32-sys" 1068 | version = "0.2.1" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | dependencies = [ 1071 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1072 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1073 | ] 1074 | 1075 | [metadata] 1076 | "checksum advapi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e06588080cb19d0acb6739808aafa5f26bfb2ca015b2b6370028b44cf7cb8a9a" 1077 | "checksum argparse 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37bb99f5e39ee8b23b6e227f5b8f024207e8616f44aa4b8c76ecd828011667ef" 1078 | "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" 1079 | "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" 1080 | "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" 1081 | "checksum bodyparser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f023abfa58aad6f6bc4ae0630799e24d5ee0ab8bb2e49f651d9b1f9aa4f52f30" 1082 | "checksum buf_redux 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e1497634c131ba13483b6e8123f69e219253b018bb32949eefd55c6b5051585d" 1083 | "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" 1084 | "checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6" 1085 | "checksum cc 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a9b13a57efd6b30ecd6598ebdb302cca617930b5470647570468a65d12ef9719" 1086 | "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" 1087 | "checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" 1088 | "checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" 1089 | "checksum crypt32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e34988f7e069e0b2f3bfc064295161e489b2d4e04a2e4248fb94360cdf00b4ec" 1090 | "checksum curl 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7034c534a1d7d22f7971d6088aa9d281d219ef724026c3428092500f41ae9c2c" 1091 | "checksum curl-sys 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "4bee31aa3a079d5f3ff9579ea4dcfb1b1a17a40886f5f467436d383e78134b55" 1092 | "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" 1093 | "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1094 | "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1095 | "checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159" 1096 | "checksum fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43f3795b4bae048dc6123a6b972cadde2e676f9ded08aef6bb77f5f157684a82" 1097 | "checksum futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "118b49cac82e04121117cbd3121ede3147e885627d82c4546b87c702debb90c1" 1098 | "checksum httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "af2f2dd97457e8fb1ae7c5a420db346af389926e36f43768b96f101546b04a07" 1099 | "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" 1100 | "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" 1101 | "checksum iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6e8b9c2247fcf6c6a1151f1156932be5606c9fd6f55a2d7f9fc1cb29386b2f7" 1102 | "checksum iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8e17268922834707e1c29e8badbf9c712c9c43378e1b6a3388946baff10be2" 1103 | "checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" 1104 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1105 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 1106 | "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" 1107 | "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" 1108 | "checksum lazycell 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3b585b7a6811fb03aa10e74b278a0f00f8dd9b45dc681f148bb29fa5cb61859b" 1109 | "checksum lber 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b2ba3d9e03604fda60029cb5b2aa77bbcf8d7dd68a47592b3ff1f1df268c8d5e" 1110 | "checksum ldap3 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3bd15c8100d9f6a77aa421b7955e1bf074f079732d36405bea3ba6ab113ac7f0" 1111 | "checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0" 1112 | "checksum libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "87f737ad6cc6fd6eefe3d9dc5412f1573865bded441300904d2f42269e140f16" 1113 | "checksum livy 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "573f22e1f8709da61292282279651b2718289b998e8cb357866d118ac27f6a7f" 1114 | "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" 1115 | "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" 1116 | "checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" 1117 | "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" 1118 | "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" 1119 | "checksum mime_guess 1.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dc7e82a15629bb4ecd9e72365bf33d1382be91e030f820edb8e2a21c02430da8" 1120 | "checksum mio 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0e8411968194c7b139e9105bc4ae7db0bae232af087147e72f0616ebf5fdb9cb" 1121 | "checksum mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1731a873077147b626d89cc6c2a0db6288d607496c5d10c0cfcf3adc697ec673" 1122 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1123 | "checksum modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" 1124 | "checksum multipart 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c56d9b43dccdc056a41616abdd6934fe889339f5f10c07bfbec0c3ffa6c58c1f" 1125 | "checksum native-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04b781c9134a954c84f0594b9ab3f5606abc516030388e8511887ef4c204a1e5" 1126 | "checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" 1127 | "checksum nom 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf51a729ecf40266a2368ad335a5fdde43471f545a967109cd62146ecf8b66ff" 1128 | "checksum num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cc4083e14b542ea3eb9b5f33ff48bd373a92d78687e74f4cc0a30caeb754f0ca" 1129 | "checksum num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "bdc1494b5912f088f260b775799468d9b9209ac60885d8186a547a0476289e23" 1130 | "checksum num-complex 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "58de7b4bf7cf5dbecb635a5797d489864eadd03b107930cbccf9e0fd7428b47c" 1131 | "checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba" 1132 | "checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01" 1133 | "checksum num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "0c7cb72a95250d8a370105c828f388932373e0e94414919891a0f945222310fe" 1134 | "checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070" 1135 | "checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d" 1136 | "checksum openssl 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)" = "169a4b9160baf9b9b1ab975418c673686638995ba921683a7f1e01470dcb8854" 1137 | "checksum openssl-probe 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d98df0270d404ccd3c050a41d579c52d1db15375168bb3471e04ec0f5f378daf" 1138 | "checksum openssl-sys 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)" = "2200ffec628e3f14c39fc0131a301db214f1a7d584e36507ee8700b0c7fb7a46" 1139 | "checksum params 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c789fdad2cfdaa551ea0e3a9eadb74c5d634968a9fb3a8c767d89be470d21589" 1140 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 1141 | "checksum persistent 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e8fa0009c4f3d350281309909c618abddf10bb7e3145f28410782f6a5ec74c5" 1142 | "checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc" 1143 | "checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f" 1144 | "checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03" 1145 | "checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2" 1146 | "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" 1147 | "checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" 1148 | "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" 1149 | "checksum rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6475140dfd8655aeb72e1fd4b7a1cc1c202be65d71669476e392fe62532b9edd" 1150 | "checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0" 1151 | "checksum route-recognizer 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3255338088df8146ba63d60a9b8e3556f1146ce2973bc05a75181a42ce2256" 1152 | "checksum router 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc63b6f3b8895b0d04e816b2b1aa58fdba2d5acca3cbb8f0ab8e017347d57397" 1153 | "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" 1154 | "checksum safemem 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "725b3bf47ae40b4abcd27b5f0a9540369426a29f7b905649b3e1468e13e22009" 1155 | "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" 1156 | "checksum schannel 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "4330c2e874379fbd28fa67ba43239dbe8c7fb00662ceb1078bd37474f08bf5ce" 1157 | "checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d" 1158 | "checksum secur32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f412dfa83308d893101dd59c10d6fda8283465976c28c287c5c855bf8d216bc" 1159 | "checksum security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332" 1160 | "checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead" 1161 | "checksum serde 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "6a7c37d7f192f00041e8a613e936717923a71bc0c9051fc4425a49b104140f05" 1162 | "checksum serde_derive 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "0672de7300b02bac3f3689f8faea813c4a1ea9fe0cb49e80f714231d267518a2" 1163 | "checksum serde_derive_internals 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32f1926285523b2db55df263d2aa4eb69ddcfa7a7eade6430323637866b513ab" 1164 | "checksum serde_json 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ea28ea0cca944668919bec6af209864a8dfe769fd2b0b723f36b22e20c1bf69f" 1165 | "checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" 1166 | "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" 1167 | "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" 1168 | "checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" 1169 | "checksum socket2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36b4896961171cd3317c7e9603d88f379f8c6e45342212235d356496680c68fd" 1170 | "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" 1171 | "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" 1172 | "checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" 1173 | "checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6" 1174 | "checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520" 1175 | "checksum tokio-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "c843a027f7c1df5f81e7734a0df3f67bf329411781ebf36393ce67beef6071e3" 1176 | "checksum tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "514aae203178929dbf03318ad7c683126672d4d96eccb77b29603d33c9e25743" 1177 | "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" 1178 | "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" 1179 | "checksum tokio-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d88e411cac1c87e405e4090be004493c5d8072a370661033b1a64ea205ec2e13" 1180 | "checksum tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "65ae5d255ce739e8537221ed2942e0445f4b3b813daebac1c0050ddaaa3587f9" 1181 | "checksum tokio-uds-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "93842f83f760d2a48eb54225f819d05549e69c481f56be4a1b1f51decf99da5b" 1182 | "checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e" 1183 | "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" 1184 | "checksum twoway 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "db65ddf5811ef1964163e55df0b0b8171e4afc8a53a606dcdb5df87be3dcc302" 1185 | "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" 1186 | "checksum typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" 1187 | "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 1188 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1189 | "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" 1190 | "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" 1191 | "checksum unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" 1192 | "checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2" 1193 | "checksum urlencoded 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a52f50139118b60ae91af08bf15ed158817d34b91b9d24c11ffbe21195d33e3" 1194 | "checksum uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc7e3b898aa6f6c08e5295b6c89258d1331e9ac578cc992fb818759951bdc22" 1195 | "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b" 1196 | "checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d" 1197 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1198 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1199 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1200 | --------------------------------------------------------------------------------