diff --git a/Cargo.lock b/Cargo.lock index 54f6397d..96c3c45f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,7 +34,7 @@ checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if 1.0.0", "cipher", - "cpufeatures", + "cpufeatures 0.2.5", "opaque-debug", ] @@ -90,18 +90,73 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle 1.0.0", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + [[package]] name = "anstyle" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle 1.0.0", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "askama" version = "0.11.1" @@ -156,7 +211,7 @@ version = "2.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0b2340f55d9661d76793b2bfc2eb0e62689bd79d067a95707ea762afd5e9dd" dependencies = [ - "anstyle", + "anstyle 0.3.5", "bstr", "doc-comment", "predicates", @@ -171,6 +226,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.12", +] + [[package]] name = "atty" version = "0.2.14" @@ -227,6 +293,12 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + [[package]] name = "bitflags" version = "1.3.2" @@ -309,21 +381,21 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chacha20" -version = "0.7.3" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08493fa7707effc63254c66c6ea908675912493cd67952eda23c09fae2610b1" +checksum = "fee7ad89dc1128635074c268ee661f90c3f7e83d9fd12910608c36b47d6c3412" dependencies = [ "cfg-if 1.0.0", "cipher", - "cpufeatures", + "cpufeatures 0.1.5", "zeroize", ] [[package]] name = "chacha20poly1305" -version = "0.8.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6547abe025f4027edacd9edaa357aded014eecec42a5070d9b885c3c334aba2" +checksum = "1580317203210c517b6d44794abfbe600698276db18127e37ad3e69bf5e848e5" dependencies = [ "aead", "chacha20", @@ -342,7 +414,8 @@ dependencies = [ "js-sys", "num-integer", "num-traits", - "time", + "serde", + "time 0.1.45", "wasm-bindgen", "winapi 0.3.9", ] @@ -353,7 +426,16 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24f638c70e8c5753795cc9a8c07c44da91554a09e4cf11a7326e8161b0a3c45e" dependencies = [ - "envmnt", + "envmnt 0.8.4", +] + +[[package]] +name = "ci_info" +version = "0.14.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2870ea3dda7e0f991e98712fc8e45d402b9a96ce32f8908d851a6d683729722d" +dependencies = [ + "envmnt 0.10.4", ] [[package]] @@ -374,7 +456,7 @@ dependencies = [ "ansi_term", "atty", "bitflags", - "strsim", + "strsim 0.8.0", "textwrap 0.11.0", "unicode-width", "vec_map", @@ -382,21 +464,33 @@ dependencies = [ [[package]] name = "clap" -version = "4.1.13" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c911b090850d79fc64fe9ea01e28e465f65e821e08813ced95bced72f7a8a9b" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" dependencies = [ - "bitflags", + "clap_builder", "clap_derive", - "clap_lex", "once_cell", ] +[[package]] +name = "clap_builder" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +dependencies = [ + "anstream", + "anstyle 1.0.0", + "bitflags", + "clap_lex", + "strsim 0.10.0", +] + [[package]] name = "clap_derive" -version = "4.1.12" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a932373bab67b984c790ddf2c9ca295d8e3af3b7ef92de5a5bacdccdee4b09b" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" dependencies = [ "heck", "proc-macro2", @@ -406,12 +500,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646" -dependencies = [ - "os_str_bytes", -] +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" [[package]] name = "cloudabi" @@ -434,7 +525,7 @@ dependencies = [ "cloudtruth-config", "cloudtruth-installer", "cloudtruth-restapi", - "color-eyre 0.5.11", + "color-eyre", "const_format", "csv", "directories 3.0.2", @@ -445,10 +536,10 @@ dependencies = [ "indoc 1.0.9", "integration-test-harness", "once_cell", - "powershell_script 0.2.1", + "powershell_script", "prettytable-rs", "rand_core 0.6.4", - "reqwest", + "reqwest 0.9.24", "rpassword", "rusty-hook", "serde", @@ -473,7 +564,7 @@ dependencies = [ "assert_matches", "chrono", "cloudtruth-restapi", - "color-eyre 0.6.2", + "color-eyre", "directories 5.0.0", "indoc 2.0.1", "once_cell", @@ -486,17 +577,30 @@ dependencies = [ name = "cloudtruth-installer" version = "1.2.3" dependencies = [ - "powershell_script 1.0.4", - "reqwest", + "bytes 1.4.0", + "ci_info 0.14.10", + "clap 4.2.7", + "color-eyre", + "derive_more", + "flate2", + "futures-core", + "futures-util", + "is-terminal", + "octocrab", + "once_cell", + "reqwest 0.11.18", "serde_json", + "tar", "tempfile", + "tokio 1.28.2", + "which", ] [[package]] name = "cloudtruth-restapi" version = "1.0.0" dependencies = [ - "reqwest", + "reqwest 0.9.24", "serde", "serde_derive", "serde_json", @@ -513,21 +617,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "color-eyre" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1885697ee8a177096d42f158922251a41973117f6d8a234cee94b9509157b7" -dependencies = [ - "backtrace", - "color-spantrace 0.1.6", - "eyre", - "indenter", - "once_cell", - "owo-colors 1.3.0", - "tracing-error 0.1.2", -] - [[package]] name = "color-eyre" version = "0.6.2" @@ -535,37 +624,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" dependencies = [ "backtrace", - "color-spantrace 0.2.0", + "color-spantrace", "eyre", "indenter", "once_cell", - "owo-colors 3.5.0", - "tracing-error 0.2.0", + "owo-colors", + "tracing-error", ] [[package]] name = "color-spantrace" -version = "0.1.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6eee477a4a8a72f4addd4de416eb56d54bc307b284d6601bafdee1f4ea462d1" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" dependencies = [ "once_cell", - "owo-colors 1.3.0", + "owo-colors", "tracing-core", - "tracing-error 0.1.2", + "tracing-error", ] [[package]] -name = "color-spantrace" -version = "0.2.0" +name = "colorchoice" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" -dependencies = [ - "once_cell", - "owo-colors 3.5.0", - "tracing-core", - "tracing-error 0.2.0", -] +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "combine" @@ -635,7 +718,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" dependencies = [ - "time", + "time 0.1.45", "url 1.7.2", ] @@ -652,7 +735,7 @@ dependencies = [ "publicsuffix", "serde", "serde_json", - "time", + "time 0.1.45", "try_from", "url 1.7.2", ] @@ -673,6 +756,15 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "cpufeatures" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.5" @@ -1063,19 +1155,18 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2d328fc287c61314c4a61af7cfdcbd7e678e39778488c7cb13ec133ce0f4059" dependencies = [ - "fsio", + "fsio 0.1.3", "indexmap", ] [[package]] -name = "errno" -version = "0.2.8" +name = "envmnt" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +checksum = "d73999a2b8871e74c8b8bc23759ee9f3d85011b24fafc91a4b3b5c8cc8185501" dependencies = [ - "errno-dragonfly", - "libc", - "winapi 0.3.9", + "fsio 0.4.0", + "indexmap", ] [[package]] @@ -1207,6 +1298,15 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1fd087255f739f4f1aeea69f11b72f8080e9c2e7645cd06955dad4a178a49e3" +[[package]] +name = "fsio" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad0ce30be0cc441b325c5d705c8b613a0ca0d92b6a8953d41bd236dc09a36d0" +dependencies = [ + "dunce", +] + [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -1396,7 +1496,7 @@ dependencies = [ "bytes 0.4.12", "fnv", "futures 0.1.31", - "http", + "http 0.1.21", "indexmap", "log", "slab", @@ -1404,6 +1504,25 @@ dependencies = [ "tokio-io", ] +[[package]] +name = "h2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +dependencies = [ + "bytes 1.4.0", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.9", + "indexmap", + "slab", + "tokio 1.28.2", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1480,6 +1599,17 @@ dependencies = [ "itoa 0.4.8", ] +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes 1.4.0", + "fnv", + "itoa 1.0.5", +] + [[package]] name = "http-body" version = "0.1.0" @@ -1488,16 +1618,39 @@ checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" dependencies = [ "bytes 0.4.12", "futures 0.1.31", - "http", + "http 0.1.21", "tokio-buf", ] +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes 1.4.0", + "http 0.2.9", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + [[package]] name = "httparse" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + [[package]] name = "humansize" version = "1.1.1" @@ -1529,16 +1682,16 @@ dependencies = [ "bytes 0.4.12", "futures 0.1.31", "futures-cpupool", - "h2", - "http", - "http-body", + "h2 0.1.26", + "http 0.1.21", + "http-body 0.1.0", "httparse", "iovec", "itoa 0.4.8", "log", "net2", "rustc_version 0.2.3", - "time", + "time 0.1.45", "tokio 0.1.22", "tokio-buf", "tokio-executor", @@ -1547,7 +1700,58 @@ dependencies = [ "tokio-tcp", "tokio-threadpool", "tokio-timer", - "want", + "want 0.2.0", +] + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes 1.4.0", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.19", + "http 0.2.9", + "http-body 0.4.5", + "httparse", + "httpdate", + "itoa 1.0.5", + "pin-project-lite", + "socket2", + "tokio 1.28.2", + "tower-service", + "tracing", + "want 0.3.0", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" +dependencies = [ + "http 0.2.9", + "hyper 0.14.26", + "log", + "rustls", + "rustls-native-certs", + "tokio 1.28.2", + "tokio-rustls", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper 0.14.26", + "pin-project-lite", + "tokio 1.28.2", + "tokio-io-timeout", ] [[package]] @@ -1558,7 +1762,7 @@ checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" dependencies = [ "bytes 0.4.12", "futures 0.1.31", - "hyper", + "hyper 0.12.36", "native-tls", "tokio-io", ] @@ -1669,7 +1873,7 @@ dependencies = [ "integration-test-macros", "miette", "once_cell", - "owo-colors 3.5.0", + "owo-colors", "predicates", "serde_json", "shlex", @@ -1706,16 +1910,22 @@ dependencies = [ "libc", ] +[[package]] +name = "ipnet" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" + [[package]] name = "is-terminal" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.36.8", - "windows-sys 0.45.0", + "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -1774,6 +1984,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.0", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -1811,12 +2035,6 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - [[package]] name = "linux-raw-sys" version = "0.3.1" @@ -1906,7 +2124,7 @@ dependencies = [ "is-terminal", "miette-derive", "once_cell", - "owo-colors 3.5.0", + "owo-colors", "supports-color", "supports-hyperlinks", "supports-unicode", @@ -1977,6 +2195,18 @@ dependencies = [ "winapi 0.2.8", ] +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.45.0", +] + [[package]] name = "miow" version = "0.2.2" @@ -2046,6 +2276,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg 1.1.0", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -2093,6 +2334,43 @@ dependencies = [ "memchr", ] +[[package]] +name = "octocrab" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d786e42ca4d4d8b297d17fc22ec85e50aa55799a433a9a9e30308381c78830" +dependencies = [ + "arc-swap", + "async-trait", + "base64 0.21.0", + "bytes 1.4.0", + "cfg-if 1.0.0", + "chrono", + "either", + "futures 0.3.27", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.26", + "hyper-rustls", + "hyper-timeout", + "jsonwebtoken", + "once_cell", + "percent-encoding 2.2.0", + "pin-project", + "secrecy", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded 0.7.1", + "snafu", + "tokio 1.28.2", + "tower", + "tower-http", + "tracing", + "url 2.3.1", +] + [[package]] name = "once_cell" version = "1.17.1" @@ -2170,18 +2448,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "os_str_bytes" -version = "6.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "owo-colors" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2386b4ebe91c2f7f51082d4cefa145d030e33a1842a96b12e4885cc3c01f7a55" - [[package]] name = "owo-colors" version = "3.5.0" @@ -2263,8 +2529,17 @@ dependencies = [ ] [[package]] -name = "percent-encoding" -version = "1.0.1" +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" @@ -2274,6 +2549,26 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -2298,7 +2593,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.5", "opaque-debug", "universal-hash", ] @@ -2310,7 +2605,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ "cfg-if 1.0.0", - "cpufeatures", + "cpufeatures 0.2.5", "opaque-debug", "universal-hash", ] @@ -2321,12 +2616,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36d62894f5590e88d99d0d82918742ba8e5bff1985af15d4906b6a65f635adb2" -[[package]] -name = "powershell_script" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54bde2e1a395c0aee9423072d781610da37b7b120edf17d4da99f83d04f2cd54" - [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2339,7 +2628,7 @@ version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c575290b64d24745b6c57a12a31465f0a66f3a4799686a6921526a33b0797965" dependencies = [ - "anstyle", + "anstyle 0.3.5", "difflib", "float-cmp", "itertools", @@ -2653,8 +2942,8 @@ dependencies = [ "encoding_rs", "flate2", "futures 0.1.31", - "http", - "hyper", + "http 0.1.21", + "hyper 0.12.36", "hyper-tls", "log", "mime", @@ -2662,8 +2951,8 @@ dependencies = [ "native-tls", "serde", "serde_json", - "serde_urlencoded", - "time", + "serde_urlencoded 0.5.5", + "time 0.1.45", "tokio 0.1.22", "tokio-executor", "tokio-io", @@ -2671,7 +2960,63 @@ dependencies = [ "tokio-timer", "url 1.7.2", "uuid 0.7.4", - "winreg", + "winreg 0.6.2", +] + +[[package]] +name = "reqwest" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +dependencies = [ + "base64 0.21.0", + "bytes 1.4.0", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.19", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.26", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding 2.2.0", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded 0.7.1", + "tokio 1.28.2", + "tokio-rustls", + "tokio-util", + "tower-service", + "url 2.3.1", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "winreg 0.10.1", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi 0.3.9", ] [[package]] @@ -2710,30 +3055,59 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.8" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" +checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" dependencies = [ "bitflags", - "errno 0.2.8", + "errno", "io-lifetimes", "libc", - "linux-raw-sys 0.1.4", + "linux-raw-sys", "windows-sys 0.45.0", ] [[package]] -name = "rustix" -version = "0.37.3" +name = "rustls" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e" dependencies = [ - "bitflags", - "errno 0.3.1", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.1", - "windows-sys 0.45.0", + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64 0.21.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", ] [[package]] @@ -2748,7 +3122,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96cee9be61be7e1cbadd851e58ed7449c29c620f00b23df937cb9cbc04ac21a3" dependencies = [ - "ci_info", + "ci_info 0.10.2", "getopts", "nias", "toml", @@ -2790,6 +3164,25 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + [[package]] name = "security-framework" version = "2.8.2" @@ -2865,6 +3258,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0" +dependencies = [ + "serde", +] + [[package]] name = "serde_plain" version = "1.0.1" @@ -2895,6 +3297,18 @@ dependencies = [ "url 1.7.2", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.5", + "ryu", + "serde", +] + [[package]] name = "serde_yaml" version = "0.8.26" @@ -2975,7 +3389,7 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer", "cfg-if 1.0.0", - "cpufeatures", + "cpufeatures 0.2.5", "digest", "opaque-debug", ] @@ -3005,12 +3419,33 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "similar" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf" +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time 0.3.20", +] + [[package]] name = "slab" version = "0.4.7" @@ -3041,6 +3476,29 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" +[[package]] +name = "snafu" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0656e7e3ffb70f6c39b3c2a86332bb74aa3c679da781642590f3c1118c5045" +dependencies = [ + "backtrace", + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "475b3bbe5245c26f2d8a6f62d67c1f30eb9fffeccee721c45d162c3ebbdf81b2" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 1.0.107", +] + [[package]] name = "snapbox" version = "0.4.8" @@ -3069,6 +3527,22 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaaf09df9f0eeae82be96290918520214530e738a7fe5a351b0f24cf77c0ca31" +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "string" version = "0.2.1" @@ -3084,6 +3558,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "subprocess" version = "0.1.20" @@ -3163,6 +3643,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "tempfile" version = "3.5.0" @@ -3172,7 +3663,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.3", + "rustix", "windows-sys 0.45.0", ] @@ -3273,6 +3764,33 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa 1.0.5", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -3296,7 +3814,7 @@ checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" dependencies = [ "bytes 0.4.12", "futures 0.1.31", - "mio", + "mio 0.6.23", "num_cpus", "tokio-current-thread", "tokio-executor", @@ -3309,15 +3827,21 @@ dependencies = [ [[package]] name = "tokio" -version = "1.26.0" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg 1.1.0", + "bytes 1.4.0", + "libc", + "mio 0.8.6", "num_cpus", + "parking_lot 0.12.1", "pin-project-lite", + "signal-hook-registry", + "socket2", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -3362,15 +3886,25 @@ dependencies = [ "log", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio 1.28.2", +] + [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.12", ] [[package]] @@ -3383,7 +3917,7 @@ dependencies = [ "futures 0.1.31", "lazy_static", "log", - "mio", + "mio 0.6.23", "num_cpus", "parking_lot 0.9.0", "slab", @@ -3392,6 +3926,16 @@ dependencies = [ "tokio-sync", ] +[[package]] +name = "tokio-rustls" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0d409377ff5b1e3ca6437aa86c1eb7d40c134bfec254e44c830defa92669db5" +dependencies = [ + "rustls", + "tokio 1.28.2", +] + [[package]] name = "tokio-stream" version = "0.1.12" @@ -3400,7 +3944,7 @@ checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" dependencies = [ "futures-core", "pin-project-lite", - "tokio 1.26.0", + "tokio 1.28.2", ] [[package]] @@ -3422,7 +3966,7 @@ dependencies = [ "bytes 0.4.12", "futures 0.1.31", "iovec", - "mio", + "mio 0.6.23", "tokio-io", "tokio-reactor", ] @@ -3456,6 +4000,20 @@ dependencies = [ "tokio-executor", ] +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes 1.4.0", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio 1.28.2", + "tracing", +] + [[package]] name = "toml" version = "0.5.11" @@ -3487,6 +4045,54 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio 1.28.2", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658" +dependencies = [ + "bitflags", + "bytes 1.4.0", + "futures-core", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "http-range-header", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + [[package]] name = "tracing" version = "0.1.37" @@ -3494,6 +4100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3520,16 +4127,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-error" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" -dependencies = [ - "tracing", - "tracing-subscriber 0.2.25", -] - [[package]] name = "tracing-error" version = "0.2.0" @@ -3537,18 +4134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ "tracing", - "tracing-subscriber 0.3.16", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", + "tracing-subscriber", ] [[package]] @@ -3667,6 +4253,12 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad2024452afd3874bf539695e04af6732ba06517424dbf958fdb16a01f3bef6c" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "1.7.2" @@ -3687,6 +4279,7 @@ dependencies = [ "form_urlencoded", "idna 0.3.0", "percent-encoding 2.2.0", + "serde", ] [[package]] @@ -3695,6 +4288,12 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" version = "0.7.4" @@ -3775,6 +4374,16 @@ dependencies = [ "try-lock", ] +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" @@ -3812,6 +4421,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -3841,6 +4462,19 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +[[package]] +name = "wasm-streams" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.61" @@ -4087,6 +4721,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -4097,13 +4740,22 @@ dependencies = [ "winapi-build", ] +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + [[package]] name = "xtask" version = "0.1.0" dependencies = [ "anyhow", "askama", - "clap 4.1.13", + "clap 4.2.7", "duct", "futures 0.3.27", "itertools", @@ -4112,7 +4764,7 @@ dependencies = [ "serde_json", "serde_plain", "serde_yaml 0.9.19", - "tokio 1.26.0", + "tokio 1.28.2", "tokio-stream", ] @@ -4133,6 +4785,6 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.3.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/Cargo.toml b/Cargo.toml index a80a80fa..901219c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,7 +55,7 @@ clap = "2.33.3" cloudtruth-config = { path = "crates/cloudtruth-config", version = "1.2.3" } cloudtruth-installer = { path = "crates/cloudtruth-installer", version = "1.2.3" } cloudtruth-restapi = { path = "crates/cloudtruth-restapi" } -color-eyre = "0.5" +color-eyre = "0.6" csv = "1.1.6" directories = "3.0" edit = "0.1.2" diff --git a/crates/cloudtruth-config/Cargo.toml b/crates/cloudtruth-config/Cargo.toml index 3c927ab6..58e0e977 100644 --- a/crates/cloudtruth-config/Cargo.toml +++ b/crates/cloudtruth-config/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" [dependencies] chrono = "0.4.24" cloudtruth-restapi = { path = "../cloudtruth-restapi" } -color-eyre = "0.6.2" +color-eyre = "0.6" directories = "5.0.0" indoc = "2.0.1" once_cell = "1.17.1" diff --git a/crates/cloudtruth-installer/Cargo.toml b/crates/cloudtruth-installer/Cargo.toml index bdb8fdd6..728d0ba1 100644 --- a/crates/cloudtruth-installer/Cargo.toml +++ b/crates/cloudtruth-installer/Cargo.toml @@ -1,13 +1,25 @@ [package] name = "cloudtruth-installer" +description = "Local installation manager for CloudTruth" version = "1.2.3" edition = "2021" license = "Apache-2.0" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] -powershell_script = "1.0.4" -reqwest = { version = "~0.9", default-features = false, features = ["default-tls-vendored"] } -serde_json = "1.0.94" -tempfile = "3.4.0" +bytes = "1.4" +ci_info = "0.14" +clap = { version = "4.0.0", features = ["derive", "env"] } +color-eyre = "0.6" +derive_more = "0.99" +flate2 = "1.0" +futures-core = "0.3" +futures-util = "0.3" +is-terminal = "0.4" +octocrab = { version = ">=0.22.0" } +once_cell = "1.17" +reqwest = { version = "~0.11", default-features = false, features = ["stream", "rustls-tls-native-roots"] } +serde_json = "1.0" +tar = "0.4" +tempfile = "3.4" +tokio = { version = "1.28", features = ["full"] } +which = "4.4" diff --git a/crates/cloudtruth-installer/build.rs b/crates/cloudtruth-installer/build.rs new file mode 100644 index 00000000..35763916 --- /dev/null +++ b/crates/cloudtruth-installer/build.rs @@ -0,0 +1,7 @@ +fn main() { + // Make TARGET environment variable available to code at build-time + println!( + "cargo:rustc-env=TARGET={}", + std::env::var("TARGET").unwrap() + ); +} diff --git a/crates/cloudtruth-installer/src/cli.rs b/crates/cloudtruth-installer/src/cli.rs new file mode 100644 index 00000000..723cf493 --- /dev/null +++ b/crates/cloudtruth-installer/src/cli.rs @@ -0,0 +1,115 @@ +use clap::Parser; +use is_terminal::IsTerminal; +use once_cell::sync::OnceCell; + +static GLOBALS: OnceCell = OnceCell::new(); + +#[derive(Debug)] +struct Globals { + verbose: bool, + interactive: bool, +} + +/// Global verbose flag. +/// Initialized after CLI parsing, and set to false otherwise. +pub fn verbose() -> bool { + match GLOBALS.get() { + Some(globals) => globals.verbose, + _ => false, + } +} + +/// Global non-interactive flag. Indicates that we should not prompt the user for input. +/// Initialized after CLI parsing, and set to false otherwise. +pub fn interactive() -> bool { + match GLOBALS.get() { + Some(globals) => globals.interactive, + _ => false, + } +} + +pub fn parse() -> Cli { + let cli = Cli::parse(); + init_globals(&cli); + cli +} + +/// initialize global statics (verbosity, non-interactive, etc) +/// this funciton will panic if called twice +fn init_globals(cli: &Cli) { + GLOBALS + .set(Globals { + verbose: cli.verbose, + interactive: cli.is_interactive(), + }) + .expect("CLI globals were initialized twice") +} + +#[derive(Debug, clap::Parser)] +/// CloudTruth installer CLI +/// #[command(author, version, about, long_about)] +pub struct Cli { + /// Subcommands + #[command(subcommand)] + pub command: Subcommand, + /// Show verbose information + #[arg(global = true, short, long, default_value_t = false)] + verbose: bool, + /// Force interactive mode, always prompt and ask for confirmations + #[arg(global = true, short = 'i', long, overrides_with = "non_interactive")] + interactive: bool, + /// Force non-interactive mode, do not prompt or ask for confirmations + #[arg(global = true, short = 'n', long, overrides_with = "interactive")] + non_interactive: bool, +} + +impl Cli { + pub fn is_interactive(&self) -> bool { + !self.non_interactive + && (self.interactive + || !is_ci() && std::io::stdin().is_terminal() && std::io::stdout().is_terminal()) + } +} + +#[derive(Debug, clap::Subcommand)] +pub enum Subcommand { + #[command(about = "Install a Cloudtruth CLI ")] + Install(InstallCommand), +} + +#[derive(Debug, clap::Args)] +pub struct InstallCommand { + /// Version of the program to install (defaults to latest) + pub version: Option, + #[command(flatten)] + github_opts: GitHubOptions, +} + +/// Options for GitHub API (for internal release workflows) +#[derive(Debug, clap::Args)] +#[group(multiple = true, required = false)] +pub struct GitHubOptions { + #[arg( + help_heading = "GitHub API Options (for internal CloudTruth release pipeline)", + long, + env = "CLOUDTRUTH_INSTALLER_GITHUB_AUTH_TOKEN", + requires = "release_id" + )] + /// GitHub API Auth Token + auth_token: Option, + #[arg( + help_heading = "GitHub API Options (for internal CloudTruth release pipeline)", + long, + env = "CLOUDTRUTH_INSTALLER_GITHUB_RELEASE_ID", + requires = "auth_token" + )] + /// GitHub API Release ID + release_id: Option, +} + +/// Helper to detect common CI environment variables +fn is_ci() -> bool { + /// List is from watson/ci-info + static IS_CI: OnceCell = OnceCell::new(); + *IS_CI.get_or_init(ci_info::is_ci) +} diff --git a/crates/cloudtruth-installer/src/github.rs b/crates/cloudtruth-installer/src/github.rs new file mode 100644 index 00000000..088c513a --- /dev/null +++ b/crates/cloudtruth-installer/src/github.rs @@ -0,0 +1,54 @@ +use bytes::Bytes; +use color_eyre::{eyre::eyre, Result}; +use futures_core::Stream; +use futures_util::StreamExt; +use std::path::Path; +use tokio::{fs::File, io::AsyncWriteExt}; + +/// Get tag name of latest GitHub release +pub async fn get_latest_version() -> Result { + Ok(octocrab::instance() + .repos("cloudtruth", "cloudtruth-cli") + .releases() + .get_latest() + .await? + .tag_name) +} + +/// Download asset from GitHub +async fn get_release_asset( + version: &str, + asset_name: &str, +) -> Result>> { + let github = octocrab::instance(); + let download_url = github + .repos("cloudtruth", "cloudtruth-cli") + .releases() + .get_by_tag(version) + .await? + .assets + .into_iter() + .find(|asset| asset.name == asset_name) + .map(|asset| asset.browser_download_url) + .ok_or_else(|| eyre!("Could not find release asset {asset_name} in release {version}"))?; + Ok(reqwest::get(download_url).await?.bytes_stream()) +} + +pub async fn download_release_asset( + version: &str, + asset_name: &str, + download_path: &Path, +) -> Result<()> { + let mut f = File::create(download_path).await?; + let mut stream = get_release_asset(version, asset_name).await?; + while let Some(chunk) = stream.next().await { + f.write_all(&chunk?).await?; + } + Ok(()) +} + +// Get package name for the current build target, version, and file extension +pub fn asset_name(version: &str, ext: &str) -> String { + const TARGET: &str = env!("TARGET"); + format!("cloudtruth-{version}-{TARGET}.{ext}") +} diff --git a/crates/cloudtruth-installer/src/install.rs b/crates/cloudtruth-installer/src/install.rs index 77dc67a1..e60bd9ba 100644 --- a/crates/cloudtruth-installer/src/install.rs +++ b/crates/cloudtruth-installer/src/install.rs @@ -1,65 +1,43 @@ -use crate::InstallError; -use std::io; -use std::io::Write; -#[cfg(not(target_os = "windows"))] -#[rustfmt::skip] -use { - crate::version::binary_version, - std::fs, - std::process::Command, - std::str, - tempfile::tempdir, -}; +use crate::{cli::InstallCommand, github, package_manager::choose_package_manager}; -#[cfg(target_os = "windows")] -pub fn install_latest_version(quiet: bool) -> Result<(), InstallError> { - let text = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../install.ps1")); - let result = powershell_script::run(text); - match result { - Ok(output) => { - if !quiet { - if let Some(stdout_str) = output.stdout() { - io::stdout().write_all(stdout_str.as_bytes())?; - } - } - Ok(()) - } - Err(err) => Err(InstallError::InstallFailed(err.to_string())), - } -} - -#[cfg(not(target_os = "windows"))] -pub fn install_latest_version(quiet: bool) -> Result<(), InstallError> { - let filename = format!("cloudtruth-cli-install-{}.sh", binary_version()); - let tempdir = tempdir()?; - let fullpath = tempdir.path().join(filename); - let fullname = fullpath.to_str().unwrap(); - let text = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../install.sh")); +use color_eyre::Result; +use flate2::read::GzDecoder; +use std::{fs::File, path::Path}; +use tar::Archive; +use tempfile::tempdir; - // write the install script to a file to a temporary directory - fs::write(fullname, text)?; - - // attempt the chmod, and hope for success -- ignore failure - let _ = Command::new("chmod").arg("a+x").arg(fullname).output(); +pub fn unpack_tar_gz(src_file_path: &Path, dest_file_path: &Path) -> Result<()> { + let tar_gz = File::open(src_file_path)?; + let tar = GzDecoder::new(tar_gz); + let mut archive = Archive::new(tar); + archive.unpack(dest_file_path)?; + Ok(()) +} - // now, actually run the installation script - let result = Command::new(fullname).output(); - match result { - Ok(output) => match output.status.success() { - true => { - if !quiet { - io::stdout().write_all(&output.stdout)?; - } - Ok(()) - } - false => { - if !quiet { - io::stdout().write_all(&output.stdout)?; - } - let stderr = str::from_utf8(&output.stderr)?; - Err(InstallError::InstallFailed(stderr.to_string())) - } - }, - Err(err) => Err(InstallError::FailedToRunInstall(err.to_string())), - } +pub async fn install(cmd: InstallCommand) -> Result<()> { + let pkg_manager = choose_package_manager(); + let version = match cmd.version { + Some(version) => version, + None => github::get_latest_version().await?, + }; + let tmp_dir = tempdir()?; + let ext = if let Some(pkg_manager) = &pkg_manager { + pkg_manager.package_ext() + } else if cfg!(target_os = "windows") { + "zip" + } else { + "tar.gz" + }; + let asset_name = github::asset_name(&version, ext); + let download_path = tmp_dir.path().join(&asset_name); + github::download_release_asset(&version, &asset_name, &download_path).await?; + if let Some(pkg_manager) = pkg_manager { + pkg_manager.install(&download_path)? + } else if cfg!(target_os = "windows") { + todo!() + } else { + unpack_tar_gz(&download_path, tmp_dir.path())?; + println!("{:?}", tmp_dir.path()); + }; + Ok(()) } diff --git a/crates/cloudtruth-installer/src/install_errors.rs b/crates/cloudtruth-installer/src/install_errors.rs deleted file mode 100644 index 78903620..00000000 --- a/crates/cloudtruth-installer/src/install_errors.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::error; -use std::fmt; -use std::fmt::Formatter; -use std::io::Error; -use std::str::Utf8Error; - -#[derive(Clone, Debug)] -pub enum InstallError { - #[cfg_attr(target_os = "windows", allow(dead_code))] - FailedToRunInstall(String), - InstallFailed(String), - Filesystem(String), - Conversion(String), -} - -impl error::Error for InstallError {} - -impl fmt::Display for InstallError { - fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> { - match self { - InstallError::FailedToRunInstall(msg) => { - write!(f, "Failed to run install script: {msg}") - } - InstallError::InstallFailed(msg) => write!(f, "Installation failed: {msg}",), - InstallError::Filesystem(msg) => write!(f, "File error: {msg}"), - InstallError::Conversion(msg) => write!(f, "File error: {msg}"), - } - } -} - -impl From for InstallError { - fn from(err: Error) -> Self { - Self::Filesystem(err.to_string()) - } -} - -impl From for InstallError { - fn from(err: Utf8Error) -> Self { - Self::Conversion(err.to_string()) - } -} diff --git a/crates/cloudtruth-installer/src/lib.rs b/crates/cloudtruth-installer/src/lib.rs index 08d9087d..f81d5603 100644 --- a/crates/cloudtruth-installer/src/lib.rs +++ b/crates/cloudtruth-installer/src/lib.rs @@ -1,7 +1,22 @@ +mod cli; +mod github; mod install; -mod install_errors; -mod version; +mod package_manager; -pub use install::install_latest_version; -pub use install_errors::InstallError; -pub use version::{binary_version, get_latest_version}; +use cli::Subcommand; +use color_eyre::Result; +use install::install; + +macro_rules! verbose { + ($($expr:tt)*) => { if $crate::cli::verbose() { println!($($expr)*)}} +} +pub(crate) use verbose; + +pub async fn cloudtruth_installer_cli() -> Result<()> { + let cli = cli::parse(); + #[allow(irrefutable_let_patterns)] + if let Subcommand::Install(install_cmd) = cli.command { + install(install_cmd).await?; + } + Ok(()) +} diff --git a/crates/cloudtruth-installer/src/main.rs b/crates/cloudtruth-installer/src/main.rs new file mode 100644 index 00000000..68454d44 --- /dev/null +++ b/crates/cloudtruth-installer/src/main.rs @@ -0,0 +1,8 @@ +use cloudtruth_installer::cloudtruth_installer_cli; + +#[tokio::main] +pub async fn main() -> color_eyre::Result<()> { + color_eyre::install()?; + cloudtruth_installer_cli().await?; + Ok(()) +} diff --git a/crates/cloudtruth-installer/src/package_manager.rs b/crates/cloudtruth-installer/src/package_manager.rs new file mode 100644 index 00000000..c063be02 --- /dev/null +++ b/crates/cloudtruth-installer/src/package_manager.rs @@ -0,0 +1,242 @@ +use color_eyre::Result; +use core::fmt; + +use std::{ + path::{Path, PathBuf}, + process::{Command, Stdio}, +}; +use which::which; + +use crate::{cli, verbose}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)] +pub enum PackageManager { + Apt, + Apk, + Yum, + Zypper, + // Brew, +} + +impl PackageManager { + #[cfg(not(target_os = "macos"))] + pub const LIST: &[PackageManager] = &[ + PackageManager::Apt, + PackageManager::Apk, + PackageManager::Yum, + PackageManager::Zypper, + // PackageManager::Brew, + ]; + #[cfg(target_os = "macos")] + pub const LIST: &[PackageManager] = &[ + // PackageManager::Brew, + PackageManager::Apt, + PackageManager::Apk, + PackageManager::Yum, + PackageManager::Zypper, + ]; + + /// Iterator over list of possible package managers. + /// Ordering is platform-specific based on which package managers + /// are commonly used on those systems. + pub fn iter() -> impl Iterator { + Self::LIST.iter().copied() + } + + pub fn cmd_name(&self) -> &'static str { + match self { + PackageManager::Apt => "apt", + PackageManager::Apk => "apk", + PackageManager::Yum => "yum", + PackageManager::Zypper => "zypper", + // PackageManager::Brew => "brew", + } + } + + pub fn package_ext(&self) -> &'static str { + match self { + PackageManager::Apt => "deb", + PackageManager::Apk => "apk", + PackageManager::Yum => "rpm", + PackageManager::Zypper => "rpm", + // PackageManager::Brew => "bottle.tar.gz", + } + } + + pub fn find_bin_path(&self) -> Option { + which(self.cmd_name()).ok() + } +} + +impl fmt::Display for PackageManager { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.cmd_name()) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, derive_more::Display)] +#[display(fmt = "{} ({:?})", package_manager, bin_path)] +pub struct PackageManagerBin { + package_manager: PackageManager, + bin_path: PathBuf, +} + +impl PackageManagerBin { + pub fn find(package_manager: PackageManager) -> Option { + package_manager + .find_bin_path() + .map(|bin_path| PackageManagerBin { + package_manager, + bin_path, + }) + } + + #[allow(dead_code)] + pub fn package_manager(&self) -> PackageManager { + self.package_manager + } + + pub fn cmd_name(&self) -> &'static str { + self.package_manager.cmd_name() + } + + pub fn package_ext(&self) -> &'static str { + self.package_manager.package_ext() + } + + pub fn bin_path(&self) -> &Path { + &self.bin_path + } + + pub fn install(&self, package: &Path) -> Result<()> { + match self.package_manager { + PackageManager::Apt => apt::install(self, package), + PackageManager::Apk => apk::install(self, package), + PackageManager::Yum => yum::install(self, package), + PackageManager::Zypper => zypper::install(self, package), + // PackageManager::Brew => brew::install(self, package), + } + } + + pub fn check_status(&self) -> bool { + match self.package_manager { + PackageManager::Apt => apt::status(self), + PackageManager::Apk => apk::status(self), + PackageManager::Yum => yum::status(self), + PackageManager::Zypper => zypper::status(self), + // PackageManager::Brew => brew::status(self), + } + } +} + +pub fn find_package_managers() -> impl Iterator { + PackageManager::iter() + .inspect(|pm| verbose!("Searching for {pm}")) + .filter_map(PackageManagerBin::find) + .inspect(|pm| verbose!("Found {pm}")) + .filter(PackageManagerBin::check_status) +} + +pub fn choose_package_manager() -> Option { + if !cli::interactive() { + // When running non-interactive, take first available package manager + find_package_managers().next() + } else { + let mut pkg_managers: Vec = find_package_managers().collect(); + if pkg_managers.len() == 1 { + Some(pkg_managers.swap_remove(0)) + } else { + // TODO: Prompt user for package manager choice + pkg_managers.first().map(PackageManagerBin::clone) + } + } +} + +mod apt { + use color_eyre::Result; + use std::{path::Path, process::Command}; + + use super::PackageManagerBin; + + pub fn install(_pm: &PackageManagerBin, _package: &Path) -> Result<()> { + todo!() + } + + pub fn status(pm: &PackageManagerBin) -> bool { + super::check_status(pm.cmd_name(), &mut Command::new(pm.bin_path())) + } +} + +mod apk { + use color_eyre::Result; + use std::{path::Path, process::Command}; + + use super::PackageManagerBin; + + pub fn install(_pm: &PackageManagerBin, _package: &Path) -> Result<()> { + todo!() + } + + pub fn status(pm: &PackageManagerBin) -> bool { + super::check_status(pm.cmd_name(), &mut Command::new(pm.bin_path())) + } +} + +mod yum { + use color_eyre::Result; + use std::{path::Path, process::Command}; + + use super::{check_status, PackageManagerBin}; + + pub fn install(_pm: &PackageManagerBin, _package: &Path) -> Result<()> { + todo!() + } + + pub fn status(pm: &PackageManagerBin) -> bool { + check_status(pm.cmd_name(), &mut Command::new(pm.bin_path())) + } +} + +mod zypper { + use color_eyre::Result; + use std::{path::Path, process::Command}; + + use super::{check_status, PackageManagerBin}; + + pub fn install(_pm: &PackageManagerBin, _package: &Path) -> Result<()> { + todo!() + } + + pub fn status(pm: &PackageManagerBin) -> bool { + check_status(pm.cmd_name(), &mut Command::new(pm.bin_path())) + } +} + +// mod brew { +// use color_eyre::Result; +// use std::{path::Path, process::Command}; + +// use super::{check_status, PackageManagerBin}; + +// pub fn install(_pm: &PackageManagerBin, _package: &Path) -> Result<()> { +// todo!() +// } + +// pub fn status(pm: &PackageManagerBin) -> bool { +// check_status(pm.cmd_name(), Command::new(pm.bin_path()).arg("commands")) +// } +// } + +fn check_status(cmd_name: &str, cmd: &mut Command) -> bool { + verbose!("Checking status of {cmd_name}"); + match cmd.stderr(Stdio::null()).stdout(Stdio::null()).status() { + Ok(status) => { + verbose!("{cmd_name} {status}"); + status.success() + } + Err(err) => { + verbose!("{cmd_name} ERROR: {err}"); + false + } + } +} diff --git a/crates/cloudtruth-installer/src/version.rs b/crates/cloudtruth-installer/src/version.rs deleted file mode 100644 index eccde16c..00000000 --- a/crates/cloudtruth-installer/src/version.rs +++ /dev/null @@ -1,35 +0,0 @@ -const LATEST_CHECK_URL: &str = - "https://api.github.com/repos/cloudtruth/cloudtruth-cli/releases/latest"; -const BINARY_VERSION: &str = env!("CARGO_PKG_VERSION"); - -fn get_latest_version_from_server() -> String { - let client = reqwest::Client::builder().build().unwrap(); - let request = client - .request(reqwest::Method::GET, LATEST_CHECK_URL) - .build() - .unwrap(); - let mut response = client.execute(request).unwrap(); - let status = response.status(); - let content = response.text().unwrap(); - - if !status.is_client_error() && !status.is_server_error() { - let value: serde_json::Value = serde_json::from_str(&content).unwrap(); - if let Some(dict) = value.as_object() { - if let Some(tag_value) = dict.get("tag_name") { - if let Some(tag_str) = tag_value.as_str() { - return tag_str.to_string(); - } - } - } - } - - "0.0.0".to_string() -} - -pub fn get_latest_version() -> String { - get_latest_version_from_server() -} - -pub fn binary_version() -> String { - BINARY_VERSION.to_string() -} diff --git a/new-install.sh b/new-install.sh new file mode 100644 index 00000000..4b512b15 --- /dev/null +++ b/new-install.sh @@ -0,0 +1,188 @@ +#!/usr/bin/env sh +# shellcheck shell=dash +# +# Copyright (C) 2023 CloudTruth, Inc. +# + +set -u + +usage() { + cat < use a specific version + +These options are only used for testing during the CloudTruth release workflow: + + -a | --auth-token authorization token to access draft release + -r | --release-id identity of draft release + +EOF +} + +parse_opts() { + while true; do + case $1 in + (-v|--verbose) + shift;; + (-h|--help) + usage + exit 1 + ;; + (--) + shift; + break + ;; + (*) + if [ -n "$1" ]; then + fail "invalid parameter: ${1}" + fi + break + ;; + esac + done +} + +main() { + require_download_cmd + require_cmd uname + require_cmd mktemp + # require_cmd chmod + # require_cmd mkdir + require_cmd rm + + parse_opts "$@" + + ORIG_DIR=$(pwd) + TMP_DIR=$(mktemp -d) + trap cleanup EXIT + cd "${TMP_DIR}" || fail "Could not enter temp directory: ${TMP_DIR}" + + get_target_info + download_latest_installer +} + +get_target_info() { + ARCH=$(uname -m) + if [ -z "${ARCH}" ]; then + fail "Cannot determine system architecture." + fi + case "$ARCH" in + aarch64 | arm64) + ARCH=aarch64 + ;; + x86_64 | x86-64 | x64 | amd64) + ARCH=x86_64 + ;; + *) + fail "unknown architecture: $ARCH" + ;; + esac + + OS=$(uname -s) + if [ -z "${OS}" ]; then + fail "Cannot determine operating system." + fi + case "$OS" in + Linux) + case "$ARCH" in + aarch64) + TARGET="unknown-linux-gnu" + ;; + x86_64) + TARGET="unknown-linux-musl" + ;; + esac + ;; + + Darwin) + TARGET="apple-darwin" + ;; + + *) + fail "unrecognized OS: $OS" + ;; + esac +} + +download_latest_installer() { + local latest_installer_version + local base_url + local package_dir + local package + local download_url + latest_installer_version=$(\ + download https://api.github.com/repos/cloudtruth/cloudtruth-cli/releases/latest | \ + grep "tag_name" | \ + sed -E 's/.*"([^"]+)".*/\1/'\ + ) + echo "[cloudtruth] found latest installer version: ${latest_installer_version}" + base_url="https://github.com/cloudtruth/cloudtruth-cli/releases/download" + package_dir="cloudtruth-${latest_installer_version}-${ARCH}-${TARGET}" + package="${package_dir}.tar.gz" + download_url="${base_url}/${latest_installer_version}/${package}" + download "$download_url" "$package" +} + +download() { + local dl_cmd + local err + local status + + if check_cmd curl; then + dl_cmd=curl + elif check_cmd wget; then + dl_cmd=wget + fi + if [ "$dl_cmd" = curl ]; then + err=$(curl --retry 3 --proto '=https' --tlsv1.2 --silent --show-error --fail --location "$1" ${2:+ --output "$2"} 2>&1) + status=$? + elif [ "$dl_cmd" = wget ]; then + if [ "$(wget -V 2>&1|head -2|tail -1|cut -f1 -d" ")" = "BusyBox" ]; then + echo "Warning: using the BusyBox version of wget. Not enforcing strong cipher suites for TLS or TLS v1.2, this is potentially less secure" + err=$(wget "$1" -O "$2" 2>&1) + status=$? + else + err=$(wget --https-only --secure-protocol=TLSv1_2 "$1" ${2:+ -O "$2" } 2>&1) + status=$? + fi + else + fail "Could not find download command '$dl_cmd'" + fi + if [ -n "$err" ]; then + echo "$err" + fi + return $status +} + +fail() { + echo "[error] $1" >&2 + exit 1 +} + +require_cmd() { + if ! check_cmd "$1"; then + fail "This install script requires the '$1' command, but it was not found." + fi +} + +check_cmd() { + command -v "$1" > /dev/null 2>&1 +} + +require_download_cmd() { + if ! check_cmd curl && ! check_cmd wget ; then + fail "This install script requires either the curl or wget command, but neither were found." + fi +} + +cleanup() { + cd "${ORIG_DIR}" || fail "Could not return to original directory: ${ORIG_DIR}" + rm -r "${TMP_DIR}" +} + +main "$@" || exit 1 diff --git a/src/lib.rs b/src/lib.rs index f3f65dd1..f0b4db5a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,13 +50,11 @@ use chrono::Utc; use clap::ArgMatches; use cli::binary_name; use cloudtruth_config::env::ConfigEnv; -use cloudtruth_config::{Action, Config, Updates, CT_PROFILE, DEFAULT_ENV_NAME}; -use cloudtruth_installer::{binary_version, get_latest_version, install_latest_version}; +use cloudtruth_config::{Config, Updates, CT_PROFILE, DEFAULT_ENV_NAME}; use color_eyre::eyre::Result; use std::io; use std::process; use utils::default; -use version_compare::Version; /// Process the 'completion' sub-command fn process_completion_command(subcmd_args: &ArgMatches) { @@ -102,35 +100,37 @@ fn check_updates(updates: &Updates) -> Result<()> { if let Some(next_update) = updates.next_update() { let today = Utc::now().date_naive(); if today >= next_update { - let latest_str = get_latest_version(); - let latest_ver = Version::from(&latest_str).unwrap(); - let bin_str = binary_version(); - let bin_ver = Version::from(&bin_str).unwrap(); - - if bin_ver < latest_ver { - // NOTE: do not update last_checked date after we detect we're behind... - match updates.action.unwrap_or_default() { - Action::Warn => { - warning_message(format!( - "Version {latest_ver} is available, running {bin_ver}" - )); - } - Action::Update => { - println!("Installing version {latest_ver}"); - install_latest_version(false)?; - } - Action::Error => { - error_message(format!( - "Version {latest_ver} is available, running {bin_ver}" - )); - process::exit(50); - } - } - } else { - let mut updated = *updates; - updated.last_checked = Some(today); - Config::set_updates(&updated)?; - } + todo!(); + // let latest_str = get_latest_version(); + // let latest_ver = Version::from(&latest_str).unwrap(); + // let bin_str = binary_version(); + // let bin_ver = Version::from(&bin_str).unwrap(); + + // if bin_ver < latest_ver { + // // NOTE: do not update last_checked date after we detect we're behind... + // match updates.action.unwrap_or_default() { + // Action::Warn => { + // warning_message(format!( + // "Version {latest_ver} is available, running {bin_ver}" + // )); + // } + // Action::Update => { + // println!("Installing version {latest_ver}"); + // todo!(); + // // install_latest_version(false)?; + // } + // Action::Error => { + // error_message(format!( + // "Version {latest_ver} is available, running {bin_ver}" + // )); + // process::exit(50); + // } + // } + // } else { + // let mut updated = *updates; + // updated.last_checked = Some(today); + // Config::set_updates(&updated)?; + // } } } Ok(()) diff --git a/src/versions.rs b/src/versions.rs index 761e8927..b95f2ad4 100644 --- a/src/versions.rs +++ b/src/versions.rs @@ -1,71 +1,74 @@ use crate::cli::GET_SUBCMD; -use crate::utils::{error_message, warn_missing_subcommand, warning_message}; +use crate::utils::warn_missing_subcommand; use clap::ArgMatches; -use cloudtruth_installer::{binary_version, get_latest_version, install_latest_version}; use color_eyre::eyre::Result; -use std::process; -use version_compare::Version; +// use std::process; +// use version_compare::Version; fn proc_version_check(subcmd_args: &ArgMatches) -> Result<()> { - let quiet = subcmd_args.is_present("quiet"); - let latest_str = get_latest_version(); - let latest_ver = Version::from(&latest_str).unwrap(); - let bin_str = binary_version(); - let bin_ver = Version::from(&bin_str).unwrap(); - - if bin_ver < latest_ver { - if !quiet { - error_message(format!( - "Version {latest_ver} is available, running {bin_ver}" - )); - } - process::exit(45) - } else if !quiet { - let ver = if bin_ver > latest_ver { - format!("{bin_ver} (future)") - } else { - latest_ver.to_string() - }; - println!("Running latest {ver}"); - } - - Ok(()) + let _quiet = subcmd_args.is_present("quiet"); + todo!(); + // let latest_str = get_latest_version(); + // let latest_ver = Version::from(&latest_str).unwrap(); + // let bin_str = binary_version(); + // let bin_ver = Version::from(&bin_str).unwrap(); + // if bin_ver < latest_ver { + // if !quiet { + // error_message(format!( + // "Version {latest_ver} is available, running {bin_ver}" + // )); + // } + // process::exit(45) + // } else if !quiet { + // let ver = if bin_ver > latest_ver { + // format!("{bin_ver} (future)") + // } else { + // latest_ver.to_string() + // }; + // println!("Running latest {ver}"); + // } + // Ok(()) } fn proc_version_install(subcmd_args: &ArgMatches) -> Result<()> { let force = subcmd_args.is_present("force"); - let quiet = subcmd_args.is_present("quiet"); - let bin_str = binary_version(); - let bin_ver = Version::from(&bin_str).unwrap(); - let mut install = force; + let _quiet = subcmd_args.is_present("quiet"); + // let bin_str = binary_version(); + // let bin_ver = Version::from(&bin_str).unwrap(); + let install = force; if !install { - let latest_str = get_latest_version(); - let latest_ver = Version::from(&latest_str).unwrap(); - install = latest_ver > bin_ver; + todo!() + // let latest_str = get_latest_version(); + // let latest_ver = Version::from(&latest_str).unwrap(); + // install = latest_ver > bin_ver; } if install { - install_latest_version(quiet)?; - println!("Installed the latest CLI.") + todo!() + // install_latest_version(quiet)?; + // println!("Installed the latest CLI.") } else { - warning_message(format!( - "Already running latest version ({bin_str}). You can use --force to re-install.", - )) + todo!() + // warning_message(format!( + // "Already running latest version ({bin_str}). You can use --force to re-install.", + // )) } - Ok(()) + // Ok(()) } fn proc_version_get(subcmd_args: &ArgMatches) -> Result<()> { let latest = subcmd_args.is_present("latest"); if latest { - let ver = get_latest_version(); - println!("Latest CLI version {ver}"); + todo!(); + // let ver = get_latest_version(); + // println!("Latest CLI version {ver}"); } else { - let ver = binary_version(); - println!("Current CLI version {ver}") + todo!() + // let ver = binary_version(); + // println!("Current CLI version {ver}") } - Ok(()) + // Ok(()) } pub fn process_version_command(subcmd_args: &ArgMatches) -> Result<()> {