Prepare, configure, and manage Firecracker microVMs in seconds!
virtualization linux microvm firecracker

Merge pull request #9 from tsirysndr/feat/server

feat: add HTTP API for MicroVM management

authored by tsiry-sandratraina.com and committed by

GitHub 8ba99086 efc8952f

+2021 -39
+1 -1
.github/workflows/ci.yml
··· 8 8 - main 9 9 jobs: 10 10 tests: 11 - runs-on: ubuntu-latest 11 + runs-on: ubuntu-22.04 12 12 steps: 13 13 - uses: actions/checkout@v2 14 14 - name: Setup Fluent CI
+5
.github/workflows/release.yml
··· 13 13 - x86_64-unknown-linux-gnu 14 14 steps: 15 15 - uses: actions/checkout@v3 16 + - name: Install deps 17 + run: | 18 + sudo apt-get install libssl-dev pkg-config 19 + wget https://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb 20 + sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb 16 21 - uses: fluentci-io/setup-fluentci@v5 17 22 - name: Set env 18 23 run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
+1380 -24
Cargo.lock
··· 3 3 version = 4 4 4 5 5 [[package]] 6 + name = "actix-codec" 7 + version = "0.5.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" 10 + dependencies = [ 11 + "bitflags 2.9.1", 12 + "bytes", 13 + "futures-core", 14 + "futures-sink", 15 + "memchr", 16 + "pin-project-lite", 17 + "tokio", 18 + "tokio-util", 19 + "tracing", 20 + ] 21 + 22 + [[package]] 23 + name = "actix-http" 24 + version = "3.11.1" 25 + source = "registry+https://github.com/rust-lang/crates.io-index" 26 + checksum = "44cceded2fb55f3c4b67068fa64962e2ca59614edc5b03167de9ff82ae803da0" 27 + dependencies = [ 28 + "actix-codec", 29 + "actix-rt", 30 + "actix-service", 31 + "actix-utils", 32 + "base64", 33 + "bitflags 2.9.1", 34 + "brotli", 35 + "bytes", 36 + "bytestring", 37 + "derive_more", 38 + "encoding_rs", 39 + "flate2", 40 + "foldhash", 41 + "futures-core", 42 + "h2 0.3.27", 43 + "http 0.2.12", 44 + "httparse", 45 + "httpdate", 46 + "itoa", 47 + "language-tags", 48 + "local-channel", 49 + "mime", 50 + "percent-encoding", 51 + "pin-project-lite", 52 + "rand 0.9.2", 53 + "sha1", 54 + "smallvec", 55 + "tokio", 56 + "tokio-util", 57 + "tracing", 58 + "zstd", 59 + ] 60 + 61 + [[package]] 62 + name = "actix-macros" 63 + version = "0.2.4" 64 + source = "registry+https://github.com/rust-lang/crates.io-index" 65 + checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" 66 + dependencies = [ 67 + "quote", 68 + "syn 2.0.104", 69 + ] 70 + 71 + [[package]] 72 + name = "actix-router" 73 + version = "0.5.3" 74 + source = "registry+https://github.com/rust-lang/crates.io-index" 75 + checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" 76 + dependencies = [ 77 + "bytestring", 78 + "cfg-if", 79 + "http 0.2.12", 80 + "regex", 81 + "regex-lite", 82 + "serde", 83 + "tracing", 84 + ] 85 + 86 + [[package]] 87 + name = "actix-rt" 88 + version = "2.11.0" 89 + source = "registry+https://github.com/rust-lang/crates.io-index" 90 + checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" 91 + dependencies = [ 92 + "futures-core", 93 + "tokio", 94 + ] 95 + 96 + [[package]] 97 + name = "actix-server" 98 + version = "2.6.0" 99 + source = "registry+https://github.com/rust-lang/crates.io-index" 100 + checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" 101 + dependencies = [ 102 + "actix-rt", 103 + "actix-service", 104 + "actix-utils", 105 + "futures-core", 106 + "futures-util", 107 + "mio", 108 + "socket2 0.5.10", 109 + "tokio", 110 + "tracing", 111 + ] 112 + 113 + [[package]] 114 + name = "actix-service" 115 + version = "2.0.3" 116 + source = "registry+https://github.com/rust-lang/crates.io-index" 117 + checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" 118 + dependencies = [ 119 + "futures-core", 120 + "pin-project-lite", 121 + ] 122 + 123 + [[package]] 124 + name = "actix-utils" 125 + version = "3.0.1" 126 + source = "registry+https://github.com/rust-lang/crates.io-index" 127 + checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" 128 + dependencies = [ 129 + "local-waker", 130 + "pin-project-lite", 131 + ] 132 + 133 + [[package]] 134 + name = "actix-web" 135 + version = "4.11.0" 136 + source = "registry+https://github.com/rust-lang/crates.io-index" 137 + checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" 138 + dependencies = [ 139 + "actix-codec", 140 + "actix-http", 141 + "actix-macros", 142 + "actix-router", 143 + "actix-rt", 144 + "actix-server", 145 + "actix-service", 146 + "actix-utils", 147 + "actix-web-codegen", 148 + "bytes", 149 + "bytestring", 150 + "cfg-if", 151 + "cookie", 152 + "derive_more", 153 + "encoding_rs", 154 + "foldhash", 155 + "futures-core", 156 + "futures-util", 157 + "impl-more", 158 + "itoa", 159 + "language-tags", 160 + "log", 161 + "mime", 162 + "once_cell", 163 + "pin-project-lite", 164 + "regex", 165 + "regex-lite", 166 + "serde", 167 + "serde_json", 168 + "serde_urlencoded", 169 + "smallvec", 170 + "socket2 0.5.10", 171 + "time", 172 + "tracing", 173 + "url", 174 + ] 175 + 176 + [[package]] 177 + name = "actix-web-codegen" 178 + version = "4.3.0" 179 + source = "registry+https://github.com/rust-lang/crates.io-index" 180 + checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" 181 + dependencies = [ 182 + "actix-router", 183 + "proc-macro2", 184 + "quote", 185 + "syn 2.0.104", 186 + ] 187 + 188 + [[package]] 6 189 name = "addr2line" 7 190 version = "0.24.2" 8 191 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 24 207 checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 208 dependencies = [ 26 209 "memchr", 210 + ] 211 + 212 + [[package]] 213 + name = "alloc-no-stdlib" 214 + version = "2.0.4" 215 + source = "registry+https://github.com/rust-lang/crates.io-index" 216 + checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 217 + 218 + [[package]] 219 + name = "alloc-stdlib" 220 + version = "0.2.2" 221 + source = "registry+https://github.com/rust-lang/crates.io-index" 222 + checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 223 + dependencies = [ 224 + "alloc-no-stdlib", 27 225 ] 28 226 29 227 [[package]] ··· 93 291 94 292 [[package]] 95 293 name = "anyhow" 96 - version = "1.0.98" 294 + version = "1.0.99" 97 295 source = "registry+https://github.com/rust-lang/crates.io-index" 98 - checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 296 + checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 297 + 298 + [[package]] 299 + name = "arbitrary" 300 + version = "1.4.2" 301 + source = "registry+https://github.com/rust-lang/crates.io-index" 302 + checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" 303 + dependencies = [ 304 + "derive_arbitrary", 305 + ] 99 306 100 307 [[package]] 101 308 name = "atoi" ··· 105 312 dependencies = [ 106 313 "num-traits", 107 314 ] 315 + 316 + [[package]] 317 + name = "atomic-waker" 318 + version = "1.1.2" 319 + source = "registry+https://github.com/rust-lang/crates.io-index" 320 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 108 321 109 322 [[package]] 110 323 name = "atty" ··· 218 431 ] 219 432 220 433 [[package]] 434 + name = "brotli" 435 + version = "8.0.2" 436 + source = "registry+https://github.com/rust-lang/crates.io-index" 437 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 438 + dependencies = [ 439 + "alloc-no-stdlib", 440 + "alloc-stdlib", 441 + "brotli-decompressor", 442 + ] 443 + 444 + [[package]] 445 + name = "brotli-decompressor" 446 + version = "5.0.0" 447 + source = "registry+https://github.com/rust-lang/crates.io-index" 448 + checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" 449 + dependencies = [ 450 + "alloc-no-stdlib", 451 + "alloc-stdlib", 452 + ] 453 + 454 + [[package]] 221 455 name = "bumpalo" 222 456 version = "3.19.0" 223 457 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 236 470 checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 237 471 238 472 [[package]] 473 + name = "bytestring" 474 + version = "1.5.0" 475 + source = "registry+https://github.com/rust-lang/crates.io-index" 476 + checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" 477 + dependencies = [ 478 + "bytes", 479 + ] 480 + 481 + [[package]] 239 482 name = "cc" 240 483 version = "1.2.30" 241 484 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 260 503 version = "1.0.1" 261 504 source = "registry+https://github.com/rust-lang/crates.io-index" 262 505 checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 506 + 507 + [[package]] 508 + name = "cfg_aliases" 509 + version = "0.2.1" 510 + source = "registry+https://github.com/rust-lang/crates.io-index" 511 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 263 512 264 513 [[package]] 265 514 name = "chrono" ··· 381 630 version = "0.9.6" 382 631 source = "registry+https://github.com/rust-lang/crates.io-index" 383 632 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 633 + 634 + [[package]] 635 + name = "cookie" 636 + version = "0.16.2" 637 + source = "registry+https://github.com/rust-lang/crates.io-index" 638 + checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" 639 + dependencies = [ 640 + "percent-encoding", 641 + "time", 642 + "version_check", 643 + ] 644 + 645 + [[package]] 646 + name = "core-foundation" 647 + version = "0.9.4" 648 + source = "registry+https://github.com/rust-lang/crates.io-index" 649 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 650 + dependencies = [ 651 + "core-foundation-sys", 652 + "libc", 653 + ] 384 654 385 655 [[package]] 386 656 name = "core-foundation" ··· 468 738 ] 469 739 470 740 [[package]] 741 + name = "deranged" 742 + version = "0.5.3" 743 + source = "registry+https://github.com/rust-lang/crates.io-index" 744 + checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" 745 + dependencies = [ 746 + "powerfmt", 747 + ] 748 + 749 + [[package]] 750 + name = "derive_arbitrary" 751 + version = "1.4.2" 752 + source = "registry+https://github.com/rust-lang/crates.io-index" 753 + checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" 754 + dependencies = [ 755 + "proc-macro2", 756 + "quote", 757 + "syn 2.0.104", 758 + ] 759 + 760 + [[package]] 761 + name = "derive_more" 762 + version = "2.0.1" 763 + source = "registry+https://github.com/rust-lang/crates.io-index" 764 + checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" 765 + dependencies = [ 766 + "derive_more-impl", 767 + ] 768 + 769 + [[package]] 770 + name = "derive_more-impl" 771 + version = "2.0.1" 772 + source = "registry+https://github.com/rust-lang/crates.io-index" 773 + checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" 774 + dependencies = [ 775 + "proc-macro2", 776 + "quote", 777 + "syn 2.0.104", 778 + "unicode-xid", 779 + ] 780 + 781 + [[package]] 471 782 name = "digest" 472 783 version = "0.10.7" 473 784 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 533 844 ] 534 845 535 846 [[package]] 847 + name = "encoding_rs" 848 + version = "0.8.35" 849 + source = "registry+https://github.com/rust-lang/crates.io-index" 850 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 851 + dependencies = [ 852 + "cfg-if", 853 + ] 854 + 855 + [[package]] 856 + name = "env_filter" 857 + version = "0.1.3" 858 + source = "registry+https://github.com/rust-lang/crates.io-index" 859 + checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 860 + dependencies = [ 861 + "log", 862 + "regex", 863 + ] 864 + 865 + [[package]] 866 + name = "env_logger" 867 + version = "0.11.8" 868 + source = "registry+https://github.com/rust-lang/crates.io-index" 869 + checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 870 + dependencies = [ 871 + "anstream", 872 + "anstyle", 873 + "env_filter", 874 + "jiff", 875 + "log", 876 + ] 877 + 878 + [[package]] 536 879 name = "equivalent" 537 880 version = "1.0.2" 538 881 source = "registry+https://github.com/rust-lang/crates.io-index" 539 882 checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 540 883 541 884 [[package]] 885 + name = "errno" 886 + version = "0.3.14" 887 + source = "registry+https://github.com/rust-lang/crates.io-index" 888 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 889 + dependencies = [ 890 + "libc", 891 + "windows-sys 0.61.0", 892 + ] 893 + 894 + [[package]] 542 895 name = "etcetera" 543 896 version = "0.8.0" 544 897 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 561 914 ] 562 915 563 916 [[package]] 917 + name = "fastrand" 918 + version = "2.3.0" 919 + source = "registry+https://github.com/rust-lang/crates.io-index" 920 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 921 + 922 + [[package]] 923 + name = "fire-client" 924 + version = "0.1.0" 925 + dependencies = [ 926 + "anyhow", 927 + "reqwest", 928 + ] 929 + 930 + [[package]] 564 931 name = "fire-config" 565 932 version = "0.1.0" 566 933 dependencies = [ ··· 571 938 "serde", 572 939 "serde_yml", 573 940 "toml", 941 + ] 942 + 943 + [[package]] 944 + name = "fire-server" 945 + version = "0.1.0" 946 + dependencies = [ 947 + "actix-web", 948 + "anyhow", 949 + "env_logger", 950 + "firecracker-prepare", 951 + "firecracker-process", 952 + "firecracker-state", 953 + "firecracker-vm", 954 + "names", 955 + "owo-colors", 956 + "serde", 957 + "serde_json", 958 + "sqlx", 959 + "tokio-stream", 960 + "utoipa", 961 + "utoipa-actix-web", 962 + "utoipa-rapidoc", 963 + "utoipa-redoc", 964 + "utoipa-swagger-ui", 574 965 ] 575 966 576 967 [[package]] ··· 624 1015 "names", 625 1016 "num_cpus", 626 1017 "owo-colors", 627 - "rand", 1018 + "rand 0.8.5", 628 1019 "rumqttc", 629 1020 "serde_json", 630 1021 "tokio", ··· 638 1029 "chrono", 639 1030 "clap 4.5.41", 640 1031 "dirs", 1032 + "fire-client", 641 1033 "fire-config", 1034 + "fire-server", 642 1035 "firecracker-prepare", 643 1036 "firecracker-process", 644 1037 "firecracker-state", ··· 658 1051 checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 659 1052 660 1053 [[package]] 1054 + name = "flate2" 1055 + version = "1.1.2" 1056 + source = "registry+https://github.com/rust-lang/crates.io-index" 1057 + checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1058 + dependencies = [ 1059 + "crc32fast", 1060 + "libz-rs-sys", 1061 + "miniz_oxide", 1062 + ] 1063 + 1064 + [[package]] 661 1065 name = "flume" 662 1066 version = "0.11.1" 663 1067 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 669 1073 ] 670 1074 671 1075 [[package]] 1076 + name = "fnv" 1077 + version = "1.0.7" 1078 + source = "registry+https://github.com/rust-lang/crates.io-index" 1079 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1080 + 1081 + [[package]] 672 1082 name = "foldhash" 673 1083 version = "0.1.5" 674 1084 source = "registry+https://github.com/rust-lang/crates.io-index" 675 1085 checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 676 1086 677 1087 [[package]] 1088 + name = "foreign-types" 1089 + version = "0.3.2" 1090 + source = "registry+https://github.com/rust-lang/crates.io-index" 1091 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1092 + dependencies = [ 1093 + "foreign-types-shared", 1094 + ] 1095 + 1096 + [[package]] 1097 + name = "foreign-types-shared" 1098 + version = "0.1.1" 1099 + source = "registry+https://github.com/rust-lang/crates.io-index" 1100 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1101 + 1102 + [[package]] 678 1103 name = "form_urlencoded" 679 1104 version = "1.2.1" 680 1105 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 778 1203 checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 779 1204 dependencies = [ 780 1205 "cfg-if", 1206 + "js-sys", 781 1207 "libc", 782 1208 "wasi 0.11.1+wasi-snapshot-preview1", 1209 + "wasm-bindgen", 783 1210 ] 784 1211 785 1212 [[package]] ··· 789 1216 checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 790 1217 dependencies = [ 791 1218 "cfg-if", 1219 + "js-sys", 792 1220 "libc", 793 1221 "r-efi", 794 1222 "wasi 0.14.5+wasi-0.2.4", 1223 + "wasm-bindgen", 795 1224 ] 796 1225 797 1226 [[package]] ··· 802 1231 803 1232 [[package]] 804 1233 name = "glob" 805 - version = "0.3.2" 1234 + version = "0.3.3" 806 1235 source = "registry+https://github.com/rust-lang/crates.io-index" 807 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1236 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1237 + 1238 + [[package]] 1239 + name = "h2" 1240 + version = "0.3.27" 1241 + source = "registry+https://github.com/rust-lang/crates.io-index" 1242 + checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" 1243 + dependencies = [ 1244 + "bytes", 1245 + "fnv", 1246 + "futures-core", 1247 + "futures-sink", 1248 + "futures-util", 1249 + "http 0.2.12", 1250 + "indexmap 2.10.0", 1251 + "slab", 1252 + "tokio", 1253 + "tokio-util", 1254 + "tracing", 1255 + ] 1256 + 1257 + [[package]] 1258 + name = "h2" 1259 + version = "0.4.12" 1260 + source = "registry+https://github.com/rust-lang/crates.io-index" 1261 + checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 1262 + dependencies = [ 1263 + "atomic-waker", 1264 + "bytes", 1265 + "fnv", 1266 + "futures-core", 1267 + "futures-sink", 1268 + "http 1.3.1", 1269 + "indexmap 2.10.0", 1270 + "slab", 1271 + "tokio", 1272 + "tokio-util", 1273 + "tracing", 1274 + ] 808 1275 809 1276 [[package]] 810 1277 name = "hashbrown" ··· 904 1371 ] 905 1372 906 1373 [[package]] 1374 + name = "http" 1375 + version = "0.2.12" 1376 + source = "registry+https://github.com/rust-lang/crates.io-index" 1377 + checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1378 + dependencies = [ 1379 + "bytes", 1380 + "fnv", 1381 + "itoa", 1382 + ] 1383 + 1384 + [[package]] 1385 + name = "http" 1386 + version = "1.3.1" 1387 + source = "registry+https://github.com/rust-lang/crates.io-index" 1388 + checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1389 + dependencies = [ 1390 + "bytes", 1391 + "fnv", 1392 + "itoa", 1393 + ] 1394 + 1395 + [[package]] 1396 + name = "http-body" 1397 + version = "1.0.1" 1398 + source = "registry+https://github.com/rust-lang/crates.io-index" 1399 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1400 + dependencies = [ 1401 + "bytes", 1402 + "http 1.3.1", 1403 + ] 1404 + 1405 + [[package]] 1406 + name = "http-body-util" 1407 + version = "0.1.3" 1408 + source = "registry+https://github.com/rust-lang/crates.io-index" 1409 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1410 + dependencies = [ 1411 + "bytes", 1412 + "futures-core", 1413 + "http 1.3.1", 1414 + "http-body", 1415 + "pin-project-lite", 1416 + ] 1417 + 1418 + [[package]] 1419 + name = "httparse" 1420 + version = "1.10.1" 1421 + source = "registry+https://github.com/rust-lang/crates.io-index" 1422 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1423 + 1424 + [[package]] 1425 + name = "httpdate" 1426 + version = "1.0.3" 1427 + source = "registry+https://github.com/rust-lang/crates.io-index" 1428 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1429 + 1430 + [[package]] 1431 + name = "hyper" 1432 + version = "1.7.0" 1433 + source = "registry+https://github.com/rust-lang/crates.io-index" 1434 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1435 + dependencies = [ 1436 + "atomic-waker", 1437 + "bytes", 1438 + "futures-channel", 1439 + "futures-core", 1440 + "h2 0.4.12", 1441 + "http 1.3.1", 1442 + "http-body", 1443 + "httparse", 1444 + "itoa", 1445 + "pin-project-lite", 1446 + "pin-utils", 1447 + "smallvec", 1448 + "tokio", 1449 + "want", 1450 + ] 1451 + 1452 + [[package]] 1453 + name = "hyper-rustls" 1454 + version = "0.27.7" 1455 + source = "registry+https://github.com/rust-lang/crates.io-index" 1456 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 1457 + dependencies = [ 1458 + "http 1.3.1", 1459 + "hyper", 1460 + "hyper-util", 1461 + "rustls", 1462 + "rustls-pki-types", 1463 + "tokio", 1464 + "tokio-rustls", 1465 + "tower-service", 1466 + "webpki-roots 1.0.2", 1467 + ] 1468 + 1469 + [[package]] 1470 + name = "hyper-tls" 1471 + version = "0.6.0" 1472 + source = "registry+https://github.com/rust-lang/crates.io-index" 1473 + checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 1474 + dependencies = [ 1475 + "bytes", 1476 + "http-body-util", 1477 + "hyper", 1478 + "hyper-util", 1479 + "native-tls", 1480 + "tokio", 1481 + "tokio-native-tls", 1482 + "tower-service", 1483 + ] 1484 + 1485 + [[package]] 1486 + name = "hyper-util" 1487 + version = "0.1.17" 1488 + source = "registry+https://github.com/rust-lang/crates.io-index" 1489 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1490 + dependencies = [ 1491 + "base64", 1492 + "bytes", 1493 + "futures-channel", 1494 + "futures-core", 1495 + "futures-util", 1496 + "http 1.3.1", 1497 + "http-body", 1498 + "hyper", 1499 + "ipnet", 1500 + "libc", 1501 + "percent-encoding", 1502 + "pin-project-lite", 1503 + "socket2 0.6.0", 1504 + "system-configuration", 1505 + "tokio", 1506 + "tower-service", 1507 + "tracing", 1508 + "windows-registry", 1509 + ] 1510 + 1511 + [[package]] 907 1512 name = "iana-time-zone" 908 1513 version = "0.1.63" 909 1514 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1035 1640 ] 1036 1641 1037 1642 [[package]] 1643 + name = "impl-more" 1644 + version = "0.1.9" 1645 + source = "registry+https://github.com/rust-lang/crates.io-index" 1646 + checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" 1647 + 1648 + [[package]] 1038 1649 name = "indexmap" 1039 1650 version = "1.9.3" 1040 1651 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1052 1663 dependencies = [ 1053 1664 "equivalent", 1054 1665 "hashbrown 0.15.4", 1666 + "serde", 1055 1667 ] 1056 1668 1057 1669 [[package]] ··· 1066 1678 ] 1067 1679 1068 1680 [[package]] 1681 + name = "ipnet" 1682 + version = "2.11.0" 1683 + source = "registry+https://github.com/rust-lang/crates.io-index" 1684 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1685 + 1686 + [[package]] 1687 + name = "iri-string" 1688 + version = "0.7.8" 1689 + source = "registry+https://github.com/rust-lang/crates.io-index" 1690 + checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1691 + dependencies = [ 1692 + "memchr", 1693 + "serde", 1694 + ] 1695 + 1696 + [[package]] 1069 1697 name = "is_terminal_polyfill" 1070 1698 version = "1.70.1" 1071 1699 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1087 1715 checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1088 1716 1089 1717 [[package]] 1718 + name = "jiff" 1719 + version = "0.2.15" 1720 + source = "registry+https://github.com/rust-lang/crates.io-index" 1721 + checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" 1722 + dependencies = [ 1723 + "jiff-static", 1724 + "log", 1725 + "portable-atomic", 1726 + "portable-atomic-util", 1727 + "serde", 1728 + ] 1729 + 1730 + [[package]] 1731 + name = "jiff-static" 1732 + version = "0.2.15" 1733 + source = "registry+https://github.com/rust-lang/crates.io-index" 1734 + checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" 1735 + dependencies = [ 1736 + "proc-macro2", 1737 + "quote", 1738 + "syn 2.0.104", 1739 + ] 1740 + 1741 + [[package]] 1090 1742 name = "jobserver" 1091 1743 version = "0.1.34" 1092 1744 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1105 1757 "once_cell", 1106 1758 "wasm-bindgen", 1107 1759 ] 1760 + 1761 + [[package]] 1762 + name = "language-tags" 1763 + version = "0.3.2" 1764 + source = "registry+https://github.com/rust-lang/crates.io-index" 1765 + checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 1108 1766 1109 1767 [[package]] 1110 1768 name = "lazy_static" ··· 1169 1827 ] 1170 1828 1171 1829 [[package]] 1830 + name = "libz-rs-sys" 1831 + version = "0.5.2" 1832 + source = "registry+https://github.com/rust-lang/crates.io-index" 1833 + checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" 1834 + dependencies = [ 1835 + "zlib-rs", 1836 + ] 1837 + 1838 + [[package]] 1839 + name = "linux-raw-sys" 1840 + version = "0.11.0" 1841 + source = "registry+https://github.com/rust-lang/crates.io-index" 1842 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 1843 + 1844 + [[package]] 1172 1845 name = "litemap" 1173 1846 version = "0.8.0" 1174 1847 source = "registry+https://github.com/rust-lang/crates.io-index" 1175 1848 checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1176 1849 1177 1850 [[package]] 1851 + name = "local-channel" 1852 + version = "0.1.5" 1853 + source = "registry+https://github.com/rust-lang/crates.io-index" 1854 + checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" 1855 + dependencies = [ 1856 + "futures-core", 1857 + "futures-sink", 1858 + "local-waker", 1859 + ] 1860 + 1861 + [[package]] 1862 + name = "local-waker" 1863 + version = "0.1.4" 1864 + source = "registry+https://github.com/rust-lang/crates.io-index" 1865 + checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" 1866 + 1867 + [[package]] 1178 1868 name = "lock_api" 1179 1869 version = "0.4.13" 1180 1870 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1191 1881 checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1192 1882 1193 1883 [[package]] 1884 + name = "lru-slab" 1885 + version = "0.1.2" 1886 + source = "registry+https://github.com/rust-lang/crates.io-index" 1887 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1888 + 1889 + [[package]] 1194 1890 name = "match_cfg" 1195 1891 version = "0.1.0" 1196 1892 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1219 1915 checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 1220 1916 1221 1917 [[package]] 1918 + name = "mime" 1919 + version = "0.3.17" 1920 + source = "registry+https://github.com/rust-lang/crates.io-index" 1921 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1922 + 1923 + [[package]] 1924 + name = "mime_guess" 1925 + version = "2.0.5" 1926 + source = "registry+https://github.com/rust-lang/crates.io-index" 1927 + checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 1928 + dependencies = [ 1929 + "mime", 1930 + "unicase", 1931 + ] 1932 + 1933 + [[package]] 1222 1934 name = "minimal-lexical" 1223 1935 version = "0.2.1" 1224 1936 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1240 1952 checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 1241 1953 dependencies = [ 1242 1954 "libc", 1955 + "log", 1243 1956 "wasi 0.11.1+wasi-snapshot-preview1", 1244 1957 "windows-sys 0.59.0", 1245 1958 ] ··· 1251 1964 checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc" 1252 1965 dependencies = [ 1253 1966 "clap 3.2.25", 1254 - "rand", 1967 + "rand 0.8.5", 1968 + ] 1969 + 1970 + [[package]] 1971 + name = "native-tls" 1972 + version = "0.2.14" 1973 + source = "registry+https://github.com/rust-lang/crates.io-index" 1974 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1975 + dependencies = [ 1976 + "libc", 1977 + "log", 1978 + "openssl", 1979 + "openssl-probe", 1980 + "openssl-sys", 1981 + "schannel", 1982 + "security-framework 2.11.1", 1983 + "security-framework-sys", 1984 + "tempfile", 1255 1985 ] 1256 1986 1257 1987 [[package]] ··· 1276 2006 "num-integer", 1277 2007 "num-iter", 1278 2008 "num-traits", 1279 - "rand", 2009 + "rand 0.8.5", 1280 2010 "smallvec", 1281 2011 "zeroize", 1282 2012 ] 1283 2013 1284 2014 [[package]] 2015 + name = "num-conv" 2016 + version = "0.1.0" 2017 + source = "registry+https://github.com/rust-lang/crates.io-index" 2018 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2019 + 2020 + [[package]] 1285 2021 name = "num-integer" 1286 2022 version = "0.1.46" 1287 2023 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1343 2079 checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 1344 2080 1345 2081 [[package]] 2082 + name = "openssl" 2083 + version = "0.10.73" 2084 + source = "registry+https://github.com/rust-lang/crates.io-index" 2085 + checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 2086 + dependencies = [ 2087 + "bitflags 2.9.1", 2088 + "cfg-if", 2089 + "foreign-types", 2090 + "libc", 2091 + "once_cell", 2092 + "openssl-macros", 2093 + "openssl-sys", 2094 + ] 2095 + 2096 + [[package]] 2097 + name = "openssl-macros" 2098 + version = "0.1.1" 2099 + source = "registry+https://github.com/rust-lang/crates.io-index" 2100 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 2101 + dependencies = [ 2102 + "proc-macro2", 2103 + "quote", 2104 + "syn 2.0.104", 2105 + ] 2106 + 2107 + [[package]] 1346 2108 name = "openssl-probe" 1347 2109 version = "0.1.6" 1348 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 1349 2111 checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 2112 + 2113 + [[package]] 2114 + name = "openssl-sys" 2115 + version = "0.9.109" 2116 + source = "registry+https://github.com/rust-lang/crates.io-index" 2117 + checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 2118 + dependencies = [ 2119 + "cc", 2120 + "libc", 2121 + "pkg-config", 2122 + "vcpkg", 2123 + ] 1350 2124 1351 2125 [[package]] 1352 2126 name = "option-ext" ··· 1450 2224 checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1451 2225 1452 2226 [[package]] 2227 + name = "portable-atomic" 2228 + version = "1.11.1" 2229 + source = "registry+https://github.com/rust-lang/crates.io-index" 2230 + checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 2231 + 2232 + [[package]] 2233 + name = "portable-atomic-util" 2234 + version = "0.2.4" 2235 + source = "registry+https://github.com/rust-lang/crates.io-index" 2236 + checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 2237 + dependencies = [ 2238 + "portable-atomic", 2239 + ] 2240 + 2241 + [[package]] 1453 2242 name = "potential_utf" 1454 2243 version = "0.1.2" 1455 2244 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1457 2246 dependencies = [ 1458 2247 "zerovec", 1459 2248 ] 2249 + 2250 + [[package]] 2251 + name = "powerfmt" 2252 + version = "0.2.0" 2253 + source = "registry+https://github.com/rust-lang/crates.io-index" 2254 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1460 2255 1461 2256 [[package]] 1462 2257 name = "ppv-lite86" ··· 1511 2306 ] 1512 2307 1513 2308 [[package]] 2309 + name = "quinn" 2310 + version = "0.11.9" 2311 + source = "registry+https://github.com/rust-lang/crates.io-index" 2312 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 2313 + dependencies = [ 2314 + "bytes", 2315 + "cfg_aliases", 2316 + "pin-project-lite", 2317 + "quinn-proto", 2318 + "quinn-udp", 2319 + "rustc-hash", 2320 + "rustls", 2321 + "socket2 0.6.0", 2322 + "thiserror 2.0.12", 2323 + "tokio", 2324 + "tracing", 2325 + "web-time", 2326 + ] 2327 + 2328 + [[package]] 2329 + name = "quinn-proto" 2330 + version = "0.11.13" 2331 + source = "registry+https://github.com/rust-lang/crates.io-index" 2332 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 2333 + dependencies = [ 2334 + "bytes", 2335 + "getrandom 0.3.3", 2336 + "lru-slab", 2337 + "rand 0.9.2", 2338 + "ring", 2339 + "rustc-hash", 2340 + "rustls", 2341 + "rustls-pki-types", 2342 + "slab", 2343 + "thiserror 2.0.12", 2344 + "tinyvec", 2345 + "tracing", 2346 + "web-time", 2347 + ] 2348 + 2349 + [[package]] 2350 + name = "quinn-udp" 2351 + version = "0.5.14" 2352 + source = "registry+https://github.com/rust-lang/crates.io-index" 2353 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 2354 + dependencies = [ 2355 + "cfg_aliases", 2356 + "libc", 2357 + "once_cell", 2358 + "socket2 0.6.0", 2359 + "tracing", 2360 + "windows-sys 0.59.0", 2361 + ] 2362 + 2363 + [[package]] 1514 2364 name = "quote" 1515 2365 version = "1.0.40" 1516 2366 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1532 2382 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1533 2383 dependencies = [ 1534 2384 "libc", 1535 - "rand_chacha", 1536 - "rand_core", 2385 + "rand_chacha 0.3.1", 2386 + "rand_core 0.6.4", 2387 + ] 2388 + 2389 + [[package]] 2390 + name = "rand" 2391 + version = "0.9.2" 2392 + source = "registry+https://github.com/rust-lang/crates.io-index" 2393 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 2394 + dependencies = [ 2395 + "rand_chacha 0.9.0", 2396 + "rand_core 0.9.3", 1537 2397 ] 1538 2398 1539 2399 [[package]] ··· 1543 2403 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1544 2404 dependencies = [ 1545 2405 "ppv-lite86", 1546 - "rand_core", 2406 + "rand_core 0.6.4", 2407 + ] 2408 + 2409 + [[package]] 2410 + name = "rand_chacha" 2411 + version = "0.9.0" 2412 + source = "registry+https://github.com/rust-lang/crates.io-index" 2413 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 2414 + dependencies = [ 2415 + "ppv-lite86", 2416 + "rand_core 0.9.3", 1547 2417 ] 1548 2418 1549 2419 [[package]] ··· 1553 2423 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1554 2424 dependencies = [ 1555 2425 "getrandom 0.2.16", 2426 + ] 2427 + 2428 + [[package]] 2429 + name = "rand_core" 2430 + version = "0.9.3" 2431 + source = "registry+https://github.com/rust-lang/crates.io-index" 2432 + checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2433 + dependencies = [ 2434 + "getrandom 0.3.3", 1556 2435 ] 1557 2436 1558 2437 [[package]] ··· 1599 2478 ] 1600 2479 1601 2480 [[package]] 2481 + name = "regex-lite" 2482 + version = "0.1.7" 2483 + source = "registry+https://github.com/rust-lang/crates.io-index" 2484 + checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" 2485 + 2486 + [[package]] 1602 2487 name = "regex-syntax" 1603 2488 version = "0.8.5" 1604 2489 source = "registry+https://github.com/rust-lang/crates.io-index" 1605 2490 checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1606 2491 1607 2492 [[package]] 2493 + name = "reqwest" 2494 + version = "0.12.23" 2495 + source = "registry+https://github.com/rust-lang/crates.io-index" 2496 + checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 2497 + dependencies = [ 2498 + "base64", 2499 + "bytes", 2500 + "encoding_rs", 2501 + "futures-channel", 2502 + "futures-core", 2503 + "futures-util", 2504 + "h2 0.4.12", 2505 + "http 1.3.1", 2506 + "http-body", 2507 + "http-body-util", 2508 + "hyper", 2509 + "hyper-rustls", 2510 + "hyper-tls", 2511 + "hyper-util", 2512 + "js-sys", 2513 + "log", 2514 + "mime", 2515 + "native-tls", 2516 + "percent-encoding", 2517 + "pin-project-lite", 2518 + "quinn", 2519 + "rustls", 2520 + "rustls-pki-types", 2521 + "serde", 2522 + "serde_json", 2523 + "serde_urlencoded", 2524 + "sync_wrapper", 2525 + "tokio", 2526 + "tokio-native-tls", 2527 + "tokio-rustls", 2528 + "tower", 2529 + "tower-http", 2530 + "tower-service", 2531 + "url", 2532 + "wasm-bindgen", 2533 + "wasm-bindgen-futures", 2534 + "web-sys", 2535 + "webpki-roots 1.0.2", 2536 + ] 2537 + 2538 + [[package]] 1608 2539 name = "ring" 1609 2540 version = "0.17.14" 1610 2541 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1631 2562 "num-traits", 1632 2563 "pkcs1", 1633 2564 "pkcs8", 1634 - "rand_core", 2565 + "rand_core 0.6.4", 1635 2566 "signature", 1636 2567 "spki", 1637 2568 "subtle", ··· 1660 2591 ] 1661 2592 1662 2593 [[package]] 2594 + name = "rust-embed" 2595 + version = "8.7.2" 2596 + source = "registry+https://github.com/rust-lang/crates.io-index" 2597 + checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" 2598 + dependencies = [ 2599 + "rust-embed-impl", 2600 + "rust-embed-utils", 2601 + "walkdir", 2602 + ] 2603 + 2604 + [[package]] 2605 + name = "rust-embed-impl" 2606 + version = "8.7.2" 2607 + source = "registry+https://github.com/rust-lang/crates.io-index" 2608 + checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" 2609 + dependencies = [ 2610 + "proc-macro2", 2611 + "quote", 2612 + "rust-embed-utils", 2613 + "syn 2.0.104", 2614 + "walkdir", 2615 + ] 2616 + 2617 + [[package]] 2618 + name = "rust-embed-utils" 2619 + version = "8.7.2" 2620 + source = "registry+https://github.com/rust-lang/crates.io-index" 2621 + checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" 2622 + dependencies = [ 2623 + "sha2", 2624 + "walkdir", 2625 + ] 2626 + 2627 + [[package]] 1663 2628 name = "rustc-demangle" 1664 2629 version = "0.1.26" 1665 2630 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1672 2637 checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1673 2638 1674 2639 [[package]] 2640 + name = "rustix" 2641 + version = "1.1.2" 2642 + source = "registry+https://github.com/rust-lang/crates.io-index" 2643 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 2644 + dependencies = [ 2645 + "bitflags 2.9.1", 2646 + "errno", 2647 + "libc", 2648 + "linux-raw-sys", 2649 + "windows-sys 0.61.0", 2650 + ] 2651 + 2652 + [[package]] 1675 2653 name = "rustls" 1676 2654 version = "0.23.29" 1677 2655 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1696 2674 "openssl-probe", 1697 2675 "rustls-pki-types", 1698 2676 "schannel", 1699 - "security-framework", 2677 + "security-framework 3.4.0", 1700 2678 ] 1701 2679 1702 2680 [[package]] ··· 1714 2692 source = "registry+https://github.com/rust-lang/crates.io-index" 1715 2693 checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 1716 2694 dependencies = [ 2695 + "web-time", 1717 2696 "zeroize", 1718 2697 ] 1719 2698 ··· 1778 2757 1779 2758 [[package]] 1780 2759 name = "security-framework" 2760 + version = "2.11.1" 2761 + source = "registry+https://github.com/rust-lang/crates.io-index" 2762 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 2763 + dependencies = [ 2764 + "bitflags 2.9.1", 2765 + "core-foundation 0.9.4", 2766 + "core-foundation-sys", 2767 + "libc", 2768 + "security-framework-sys", 2769 + ] 2770 + 2771 + [[package]] 2772 + name = "security-framework" 1781 2773 version = "3.4.0" 1782 2774 source = "registry+https://github.com/rust-lang/crates.io-index" 1783 2775 checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" 1784 2776 dependencies = [ 1785 2777 "bitflags 2.9.1", 1786 - "core-foundation", 2778 + "core-foundation 0.10.1", 1787 2779 "core-foundation-sys", 1788 2780 "libc", 1789 2781 "security-framework-sys", ··· 1801 2793 1802 2794 [[package]] 1803 2795 name = "serde" 1804 - version = "1.0.219" 2796 + version = "1.0.225" 1805 2797 source = "registry+https://github.com/rust-lang/crates.io-index" 1806 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 2798 + checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" 2799 + dependencies = [ 2800 + "serde_core", 2801 + "serde_derive", 2802 + ] 2803 + 2804 + [[package]] 2805 + name = "serde_core" 2806 + version = "1.0.225" 2807 + source = "registry+https://github.com/rust-lang/crates.io-index" 2808 + checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" 1807 2809 dependencies = [ 1808 2810 "serde_derive", 1809 2811 ] 1810 2812 1811 2813 [[package]] 1812 2814 name = "serde_derive" 1813 - version = "1.0.219" 2815 + version = "1.0.225" 1814 2816 source = "registry+https://github.com/rust-lang/crates.io-index" 1815 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 2817 + checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" 1816 2818 dependencies = [ 1817 2819 "proc-macro2", 1818 2820 "quote", ··· 1821 2823 1822 2824 [[package]] 1823 2825 name = "serde_json" 1824 - version = "1.0.141" 2826 + version = "1.0.145" 1825 2827 source = "registry+https://github.com/rust-lang/crates.io-index" 1826 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 2828 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 1827 2829 dependencies = [ 1828 2830 "itoa", 1829 2831 "memchr", 1830 2832 "ryu", 1831 2833 "serde", 2834 + "serde_core", 1832 2835 ] 1833 2836 1834 2837 [[package]] ··· 1911 2914 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1912 2915 dependencies = [ 1913 2916 "digest", 1914 - "rand_core", 2917 + "rand_core 0.6.4", 1915 2918 ] 2919 + 2920 + [[package]] 2921 + name = "simd-adler32" 2922 + version = "0.3.7" 2923 + source = "registry+https://github.com/rust-lang/crates.io-index" 2924 + checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 1916 2925 1917 2926 [[package]] 1918 2927 name = "slab" ··· 1931 2940 1932 2941 [[package]] 1933 2942 name = "socket2" 2943 + version = "0.5.10" 2944 + source = "registry+https://github.com/rust-lang/crates.io-index" 2945 + checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 2946 + dependencies = [ 2947 + "libc", 2948 + "windows-sys 0.52.0", 2949 + ] 2950 + 2951 + [[package]] 2952 + name = "socket2" 1934 2953 version = "0.6.0" 1935 2954 source = "registry+https://github.com/rust-lang/crates.io-index" 1936 2955 checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" ··· 2076 3095 "memchr", 2077 3096 "once_cell", 2078 3097 "percent-encoding", 2079 - "rand", 3098 + "rand 0.8.5", 2080 3099 "rsa", 2081 3100 "serde", 2082 3101 "sha1", ··· 2115 3134 "md-5", 2116 3135 "memchr", 2117 3136 "once_cell", 2118 - "rand", 3137 + "rand 0.8.5", 2119 3138 "serde", 2120 3139 "serde_json", 2121 3140 "sha2", ··· 2210 3229 ] 2211 3230 2212 3231 [[package]] 3232 + name = "sync_wrapper" 3233 + version = "1.0.2" 3234 + source = "registry+https://github.com/rust-lang/crates.io-index" 3235 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 3236 + dependencies = [ 3237 + "futures-core", 3238 + ] 3239 + 3240 + [[package]] 2213 3241 name = "synstructure" 2214 3242 version = "0.13.2" 2215 3243 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2234 3262 ] 2235 3263 2236 3264 [[package]] 3265 + name = "system-configuration" 3266 + version = "0.6.1" 3267 + source = "registry+https://github.com/rust-lang/crates.io-index" 3268 + checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 3269 + dependencies = [ 3270 + "bitflags 2.9.1", 3271 + "core-foundation 0.9.4", 3272 + "system-configuration-sys", 3273 + ] 3274 + 3275 + [[package]] 3276 + name = "system-configuration-sys" 3277 + version = "0.6.0" 3278 + source = "registry+https://github.com/rust-lang/crates.io-index" 3279 + checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 3280 + dependencies = [ 3281 + "core-foundation-sys", 3282 + "libc", 3283 + ] 3284 + 3285 + [[package]] 3286 + name = "tempfile" 3287 + version = "3.22.0" 3288 + source = "registry+https://github.com/rust-lang/crates.io-index" 3289 + checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" 3290 + dependencies = [ 3291 + "fastrand", 3292 + "getrandom 0.3.3", 3293 + "once_cell", 3294 + "rustix", 3295 + "windows-sys 0.61.0", 3296 + ] 3297 + 3298 + [[package]] 2237 3299 name = "termcolor" 2238 3300 version = "1.4.1" 2239 3301 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2289 3351 ] 2290 3352 2291 3353 [[package]] 3354 + name = "time" 3355 + version = "0.3.43" 3356 + source = "registry+https://github.com/rust-lang/crates.io-index" 3357 + checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" 3358 + dependencies = [ 3359 + "deranged", 3360 + "num-conv", 3361 + "powerfmt", 3362 + "serde", 3363 + "time-core", 3364 + "time-macros", 3365 + ] 3366 + 3367 + [[package]] 3368 + name = "time-core" 3369 + version = "0.1.6" 3370 + source = "registry+https://github.com/rust-lang/crates.io-index" 3371 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 3372 + 3373 + [[package]] 3374 + name = "time-macros" 3375 + version = "0.2.24" 3376 + source = "registry+https://github.com/rust-lang/crates.io-index" 3377 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 3378 + dependencies = [ 3379 + "num-conv", 3380 + "time-core", 3381 + ] 3382 + 3383 + [[package]] 2292 3384 name = "tinystr" 2293 3385 version = "0.8.1" 2294 3386 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2328 3420 "pin-project-lite", 2329 3421 "signal-hook-registry", 2330 3422 "slab", 2331 - "socket2", 3423 + "socket2 0.6.0", 2332 3424 "tokio-macros", 2333 3425 "windows-sys 0.59.0", 2334 3426 ] ··· 2345 3437 ] 2346 3438 2347 3439 [[package]] 3440 + name = "tokio-native-tls" 3441 + version = "0.3.1" 3442 + source = "registry+https://github.com/rust-lang/crates.io-index" 3443 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 3444 + dependencies = [ 3445 + "native-tls", 3446 + "tokio", 3447 + ] 3448 + 3449 + [[package]] 2348 3450 name = "tokio-rustls" 2349 3451 version = "0.26.2" 2350 3452 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2418 3520 checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 2419 3521 2420 3522 [[package]] 3523 + name = "tower" 3524 + version = "0.5.2" 3525 + source = "registry+https://github.com/rust-lang/crates.io-index" 3526 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 3527 + dependencies = [ 3528 + "futures-core", 3529 + "futures-util", 3530 + "pin-project-lite", 3531 + "sync_wrapper", 3532 + "tokio", 3533 + "tower-layer", 3534 + "tower-service", 3535 + ] 3536 + 3537 + [[package]] 3538 + name = "tower-http" 3539 + version = "0.6.6" 3540 + source = "registry+https://github.com/rust-lang/crates.io-index" 3541 + checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 3542 + dependencies = [ 3543 + "bitflags 2.9.1", 3544 + "bytes", 3545 + "futures-util", 3546 + "http 1.3.1", 3547 + "http-body", 3548 + "iri-string", 3549 + "pin-project-lite", 3550 + "tower", 3551 + "tower-layer", 3552 + "tower-service", 3553 + ] 3554 + 3555 + [[package]] 3556 + name = "tower-layer" 3557 + version = "0.3.3" 3558 + source = "registry+https://github.com/rust-lang/crates.io-index" 3559 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 3560 + 3561 + [[package]] 3562 + name = "tower-service" 3563 + version = "0.3.3" 3564 + source = "registry+https://github.com/rust-lang/crates.io-index" 3565 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 3566 + 3567 + [[package]] 2421 3568 name = "tracing" 2422 3569 version = "0.1.41" 2423 3570 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2450 3597 ] 2451 3598 2452 3599 [[package]] 3600 + name = "try-lock" 3601 + version = "0.2.5" 3602 + source = "registry+https://github.com/rust-lang/crates.io-index" 3603 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 3604 + 3605 + [[package]] 2453 3606 name = "typenum" 2454 3607 version = "1.18.0" 2455 3608 source = "registry+https://github.com/rust-lang/crates.io-index" 2456 3609 checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 3610 + 3611 + [[package]] 3612 + name = "unicase" 3613 + version = "2.8.1" 3614 + source = "registry+https://github.com/rust-lang/crates.io-index" 3615 + checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 2457 3616 2458 3617 [[package]] 2459 3618 name = "unicode-bidi" ··· 2483 3642 checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2484 3643 2485 3644 [[package]] 3645 + name = "unicode-xid" 3646 + version = "0.2.6" 3647 + source = "registry+https://github.com/rust-lang/crates.io-index" 3648 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 3649 + 3650 + [[package]] 2486 3651 name = "untrusted" 2487 3652 version = "0.9.0" 2488 3653 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2512 3677 checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2513 3678 2514 3679 [[package]] 3680 + name = "utoipa" 3681 + version = "5.4.0" 3682 + source = "registry+https://github.com/rust-lang/crates.io-index" 3683 + checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" 3684 + dependencies = [ 3685 + "indexmap 2.10.0", 3686 + "serde", 3687 + "serde_json", 3688 + "utoipa-gen", 3689 + ] 3690 + 3691 + [[package]] 3692 + name = "utoipa-actix-web" 3693 + version = "0.1.2" 3694 + source = "registry+https://github.com/rust-lang/crates.io-index" 3695 + checksum = "b7eda9c23c05af0fb812f6a177514047331dac4851a2c8e9c4b895d6d826967f" 3696 + dependencies = [ 3697 + "actix-service", 3698 + "actix-web", 3699 + "utoipa", 3700 + ] 3701 + 3702 + [[package]] 3703 + name = "utoipa-gen" 3704 + version = "5.4.0" 3705 + source = "registry+https://github.com/rust-lang/crates.io-index" 3706 + checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" 3707 + dependencies = [ 3708 + "proc-macro2", 3709 + "quote", 3710 + "regex", 3711 + "syn 2.0.104", 3712 + ] 3713 + 3714 + [[package]] 3715 + name = "utoipa-rapidoc" 3716 + version = "6.0.0" 3717 + source = "registry+https://github.com/rust-lang/crates.io-index" 3718 + checksum = "e5f8f5abd341cce16bb4f09a8bafc087d4884a004f25fb980e538d51d6501dab" 3719 + dependencies = [ 3720 + "actix-web", 3721 + "serde", 3722 + "serde_json", 3723 + "utoipa", 3724 + ] 3725 + 3726 + [[package]] 3727 + name = "utoipa-redoc" 3728 + version = "6.0.0" 3729 + source = "registry+https://github.com/rust-lang/crates.io-index" 3730 + checksum = "6427547f6db7ec006cbbef95f7565952a16f362e298b416d2d497d9706fef72d" 3731 + dependencies = [ 3732 + "actix-web", 3733 + "serde", 3734 + "serde_json", 3735 + "utoipa", 3736 + ] 3737 + 3738 + [[package]] 3739 + name = "utoipa-swagger-ui" 3740 + version = "9.0.2" 3741 + source = "registry+https://github.com/rust-lang/crates.io-index" 3742 + checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" 3743 + dependencies = [ 3744 + "actix-web", 3745 + "base64", 3746 + "mime_guess", 3747 + "regex", 3748 + "reqwest", 3749 + "rust-embed", 3750 + "serde", 3751 + "serde_json", 3752 + "url", 3753 + "utoipa", 3754 + "zip", 3755 + ] 3756 + 3757 + [[package]] 2515 3758 name = "vcpkg" 2516 3759 version = "0.2.15" 2517 3760 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2534 3777 ] 2535 3778 2536 3779 [[package]] 3780 + name = "want" 3781 + version = "0.3.1" 3782 + source = "registry+https://github.com/rust-lang/crates.io-index" 3783 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3784 + dependencies = [ 3785 + "try-lock", 3786 + ] 3787 + 3788 + [[package]] 2537 3789 name = "wasi" 2538 3790 version = "0.11.1+wasi-snapshot-preview1" 2539 3791 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2590 3842 ] 2591 3843 2592 3844 [[package]] 3845 + name = "wasm-bindgen-futures" 3846 + version = "0.4.50" 3847 + source = "registry+https://github.com/rust-lang/crates.io-index" 3848 + checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 3849 + dependencies = [ 3850 + "cfg-if", 3851 + "js-sys", 3852 + "once_cell", 3853 + "wasm-bindgen", 3854 + "web-sys", 3855 + ] 3856 + 3857 + [[package]] 2593 3858 name = "wasm-bindgen-macro" 2594 3859 version = "0.2.100" 2595 3860 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2622 3887 ] 2623 3888 2624 3889 [[package]] 3890 + name = "web-sys" 3891 + version = "0.3.77" 3892 + source = "registry+https://github.com/rust-lang/crates.io-index" 3893 + checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 3894 + dependencies = [ 3895 + "js-sys", 3896 + "wasm-bindgen", 3897 + ] 3898 + 3899 + [[package]] 3900 + name = "web-time" 3901 + version = "1.1.0" 3902 + source = "registry+https://github.com/rust-lang/crates.io-index" 3903 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 3904 + dependencies = [ 3905 + "js-sys", 3906 + "wasm-bindgen", 3907 + ] 3908 + 3909 + [[package]] 2625 3910 name = "webpki-roots" 2626 3911 version = "0.26.11" 2627 3912 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2728 4013 checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" 2729 4014 2730 4015 [[package]] 4016 + name = "windows-registry" 4017 + version = "0.5.3" 4018 + source = "registry+https://github.com/rust-lang/crates.io-index" 4019 + checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 4020 + dependencies = [ 4021 + "windows-link 0.1.3", 4022 + "windows-result", 4023 + "windows-strings", 4024 + ] 4025 + 4026 + [[package]] 2731 4027 name = "windows-result" 2732 4028 version = "0.3.4" 2733 4029 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2939 4235 "hostname", 2940 4236 "md5", 2941 4237 "once_cell", 2942 - "rand", 4238 + "rand 0.8.5", 2943 4239 "sysctl", 2944 4240 "thiserror 1.0.69", 2945 4241 "winreg", ··· 3048 4344 "quote", 3049 4345 "syn 2.0.104", 3050 4346 ] 4347 + 4348 + [[package]] 4349 + name = "zip" 4350 + version = "3.0.0" 4351 + source = "registry+https://github.com/rust-lang/crates.io-index" 4352 + checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" 4353 + dependencies = [ 4354 + "arbitrary", 4355 + "crc32fast", 4356 + "flate2", 4357 + "indexmap 2.10.0", 4358 + "memchr", 4359 + "zopfli", 4360 + ] 4361 + 4362 + [[package]] 4363 + name = "zlib-rs" 4364 + version = "0.5.2" 4365 + source = "registry+https://github.com/rust-lang/crates.io-index" 4366 + checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" 4367 + 4368 + [[package]] 4369 + name = "zopfli" 4370 + version = "0.8.2" 4371 + source = "registry+https://github.com/rust-lang/crates.io-index" 4372 + checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" 4373 + dependencies = [ 4374 + "bumpalo", 4375 + "crc32fast", 4376 + "log", 4377 + "simd-adler32", 4378 + ] 4379 + 4380 + [[package]] 4381 + name = "zstd" 4382 + version = "0.13.3" 4383 + source = "registry+https://github.com/rust-lang/crates.io-index" 4384 + checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" 4385 + dependencies = [ 4386 + "zstd-safe", 4387 + ] 4388 + 4389 + [[package]] 4390 + name = "zstd-safe" 4391 + version = "7.2.4" 4392 + source = "registry+https://github.com/rust-lang/crates.io-index" 4393 + checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" 4394 + dependencies = [ 4395 + "zstd-sys", 4396 + ] 4397 + 4398 + [[package]] 4399 + name = "zstd-sys" 4400 + version = "2.0.16+zstd.1.5.7" 4401 + source = "registry+https://github.com/rust-lang/crates.io-index" 4402 + checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" 4403 + dependencies = [ 4404 + "cc", 4405 + "pkg-config", 4406 + ]
+11
crates/fire-client/Cargo.toml
··· 1 + [package] 2 + name = "fire-client" 3 + version = "0.1.0" 4 + authors.workspace = true 5 + edition.workspace = true 6 + license.workspace = true 7 + repository.workspace = true 8 + 9 + [dependencies] 10 + anyhow = "1.0.99" 11 + reqwest = { version = "0.12.23", features = ["rustls-tls", "json"] }
+1
crates/fire-client/src/lib.rs
··· 1 +
+2
crates/fire-config/src/lib.rs
··· 25 25 pub tap: Option<String>, 26 26 pub api_socket: Option<String>, 27 27 pub mac: Option<String>, 28 + pub ssh_keys: Option<Vec<String>>, 28 29 } 29 30 30 31 #[derive(Debug, Serialize, Deserialize)] ··· 48 49 tap: None, 49 50 api_socket: None, 50 51 mac: None, 52 + ssh_keys: None, 51 53 }, 52 54 etcd: None, 53 55 }
+34
crates/fire-server/Cargo.toml
··· 1 + [package] 2 + name = "fire-server" 3 + version = "0.1.0" 4 + authors.workspace = true 5 + edition.workspace = true 6 + license.workspace = true 7 + repository.workspace = true 8 + 9 + [dependencies] 10 + actix-web = "4.11.0" 11 + anyhow = "1.0.99" 12 + env_logger = "0.11.8" 13 + owo-colors = "4.2.2" 14 + serde = { version = "1.0.225", features = ["serde_derive", "derive"] } 15 + tokio-stream = "0.1.17" 16 + utoipa = { version = "5.4.0", features = ["actix_extras"] } 17 + utoipa-actix-web = "0.1.2" 18 + utoipa-rapidoc = { version = "6.0.0", features = ["actix-web"] } 19 + utoipa-redoc = { version = "6.0.0", features = ["actix-web"] } 20 + utoipa-swagger-ui = { version = "9", features = ["actix-web", "reqwest"] } 21 + firecracker-state = { path = "../firecracker-state" } 22 + firecracker-vm = { path = "../firecracker-vm" } 23 + firecracker-prepare = { path = "../firecracker-prepare" } 24 + firecracker-process = { path = "../firecracker-process" } 25 + serde_json = "1.0.145" 26 + sqlx = { version = "0.8.6", features = [ 27 + "runtime-tokio", 28 + "tls-rustls", 29 + "sqlite", 30 + "chrono", 31 + "derive", 32 + "macros", 33 + ] } 34 + names = "0.14.0"
+192
crates/fire-server/src/api/microvm.rs
··· 1 + use std::sync::Arc; 2 + 3 + use actix_web::{delete, get, post, web, HttpResponse, Responder}; 4 + use firecracker_state::repo; 5 + use serde::{Deserialize, Serialize}; 6 + use sqlx::{Pool, Sqlite}; 7 + use tokio_stream::StreamExt; 8 + use utoipa::ToSchema; 9 + use utoipa_actix_web::service_config::ServiceConfig; 10 + 11 + use crate::{ 12 + read_payload, services, 13 + types::microvm::{CreateMicroVM, MicroVM}, 14 + }; 15 + 16 + const MICRO_VM: &str = "MicroVM"; 17 + 18 + #[derive(Serialize, Deserialize, Clone, ToSchema)] 19 + pub enum ErrorResponse { 20 + NotFound(String), 21 + Conflict(String), 22 + Unauthorized(String), 23 + } 24 + 25 + #[utoipa::path( 26 + tag = MICRO_VM, 27 + responses( 28 + (status = 201, description = "MicroVM created successfully", body = MicroVM), 29 + (status = 409, description = "MicroVM with id already exists", body = ErrorResponse, example = json!(ErrorResponse::Conflict(String::from("id = 1")))) 30 + ) 31 + )] 32 + #[post("")] 33 + async fn create_microvm( 34 + mut payload: web::Payload, 35 + pool: web::Data<Arc<Pool<Sqlite>>>, 36 + ) -> Result<impl Responder, actix_web::Error> { 37 + let body = read_payload!(payload); 38 + let params = match body.is_empty() { 39 + true => CreateMicroVM { 40 + name: None, 41 + vcpus: None, 42 + memory: None, 43 + image: None, 44 + vmlinux: None, 45 + rootfs: None, 46 + boot_args: None, 47 + ssh_keys: None, 48 + start: None, 49 + }, 50 + false => serde_json::from_slice::<CreateMicroVM>(&body)?, 51 + }; 52 + let pool = pool.get_ref().clone(); 53 + let vm = services::microvm::create_microvm(pool, params) 54 + .await 55 + .map_err(actix_web::error::ErrorInternalServerError)?; 56 + Ok(HttpResponse::Created().json(vm)) 57 + } 58 + 59 + #[utoipa::path( 60 + tag = MICRO_VM, 61 + responses( 62 + (status = 200, description = "MicroVM deleted successfully"), 63 + (status = 404, description = "MicroVM with id not found", body = ErrorResponse, example = json!(ErrorResponse::NotFound(String::from("id = 1")))) 64 + ), 65 + params( 66 + ("id", description = "The ID of the MicroVM to delete") 67 + ) 68 + )] 69 + #[delete("/{id}")] 70 + async fn delete_microvm( 71 + id: web::Path<String>, 72 + pool: web::Data<Arc<Pool<Sqlite>>>, 73 + ) -> Result<impl Responder, actix_web::Error> { 74 + let id = id.into_inner(); 75 + let pool = pool.get_ref().clone(); 76 + let vm = services::microvm::delete_microvm(pool, &id) 77 + .await 78 + .map_err(actix_web::error::ErrorInternalServerError)?; 79 + 80 + if vm.is_none() { 81 + return Ok(HttpResponse::NotFound().json(ErrorResponse::NotFound(id))); 82 + } 83 + 84 + Ok(HttpResponse::Ok().json(vm)) 85 + } 86 + 87 + #[utoipa::path( 88 + tag = MICRO_VM, 89 + responses( 90 + (status = 200, description = "MicroVM details retrieved successfully", body = MicroVM), 91 + (status = 404, description = "MicroVM with id not found", body = ErrorResponse, example = json!(ErrorResponse::NotFound(String::from("id = 1")))) 92 + ), 93 + params( 94 + ("id", description = "The ID of the MicroVM to retrieve") 95 + ) 96 + )] 97 + #[get("/{id}")] 98 + async fn get_microvm( 99 + id: web::Path<String>, 100 + pool: web::Data<Arc<Pool<Sqlite>>>, 101 + ) -> Result<impl Responder, actix_web::Error> { 102 + let id = id.into_inner(); 103 + let pool = pool.get_ref().clone(); 104 + let vm = repo::virtual_machine::find(&pool, &id) 105 + .await 106 + .map_err(actix_web::error::ErrorInternalServerError)?; 107 + 108 + Ok(match vm { 109 + Some(vm) => HttpResponse::Ok().json(vm), 110 + None => HttpResponse::NotFound().json(ErrorResponse::NotFound(id)), 111 + }) 112 + } 113 + 114 + #[utoipa::path( 115 + tag = MICRO_VM, 116 + responses( 117 + (status = 200, description = "List of MicroVMs retrieved successfully", body = [MicroVM]), 118 + ) 119 + )] 120 + #[get("")] 121 + async fn list_microvms( 122 + pool: web::Data<Arc<Pool<Sqlite>>>, 123 + ) -> Result<impl Responder, actix_web::Error> { 124 + let pool = pool.get_ref().clone(); 125 + let results = repo::virtual_machine::all(&pool) 126 + .await 127 + .map_err(actix_web::error::ErrorInternalServerError)?; 128 + Ok(HttpResponse::Ok().json(results)) 129 + } 130 + 131 + #[utoipa::path( 132 + tag = MICRO_VM, 133 + responses( 134 + (status = 200, description = "MicroVM started successfully"), 135 + (status = 404, description = "MicroVM with id not found", body = ErrorResponse, example = json!(ErrorResponse::NotFound(String::from("id = 1")))) 136 + ), 137 + params( 138 + ("id", description = "The ID of the MicroVM to start") 139 + ) 140 + )] 141 + #[post("/{id}/start")] 142 + async fn start_microvm( 143 + id: web::Path<String>, 144 + pool: web::Data<Arc<Pool<Sqlite>>>, 145 + ) -> Result<impl Responder, actix_web::Error> { 146 + let id = id.into_inner(); 147 + let pool = pool.get_ref().clone(); 148 + let vm = services::microvm::start_microvm(pool, &id) 149 + .await 150 + .map_err(actix_web::error::ErrorInternalServerError)?; 151 + Ok(HttpResponse::Ok().json(vm)) 152 + } 153 + 154 + #[utoipa::path( 155 + tag = MICRO_VM, 156 + responses( 157 + (status = 200, description = "MicroVM stopped successfully"), 158 + (status = 404, description = "MicroVM with id not found", body = ErrorResponse, example = json!(ErrorResponse::NotFound(String::from("id = 1")))) 159 + ), 160 + params( 161 + ("id", description = "The ID of the MicroVM to stop") 162 + ) 163 + )] 164 + #[post("/{id}/stop")] 165 + async fn stop_microvm( 166 + id: web::Path<String>, 167 + pool: web::Data<Arc<Pool<Sqlite>>>, 168 + ) -> Result<impl Responder, actix_web::Error> { 169 + let id = id.into_inner(); 170 + let pool = pool.get_ref().clone(); 171 + let vm = services::microvm::stop_microvm(pool, &id) 172 + .await 173 + .map_err(actix_web::error::ErrorInternalServerError)?; 174 + 175 + if vm.is_none() { 176 + return Ok(HttpResponse::NotFound().json(ErrorResponse::NotFound(id))); 177 + } 178 + 179 + Ok(HttpResponse::Ok().json(vm)) 180 + } 181 + 182 + pub fn configure() -> impl FnOnce(&mut ServiceConfig) { 183 + |config: &mut ServiceConfig| { 184 + config 185 + .service(create_microvm) 186 + .service(delete_microvm) 187 + .service(get_microvm) 188 + .service(list_microvms) 189 + .service(start_microvm) 190 + .service(stop_microvm); 191 + } 192 + }
+15
crates/fire-server/src/api/mod.rs
··· 1 + pub mod microvm; 2 + 3 + #[macro_export] 4 + macro_rules! read_payload { 5 + ($payload:expr) => {{ 6 + let mut body = Vec::new(); 7 + while let Some(chunk) = $payload.next().await { 8 + match chunk { 9 + Ok(bytes) => body.extend_from_slice(&bytes), 10 + Err(err) => return Err(err.into()), 11 + } 12 + } 13 + body 14 + }}; 15 + }
+4
crates/fire-server/src/lib.rs
··· 1 + pub mod api; 2 + pub mod server; 3 + pub mod services; 4 + pub mod types;
+58
crates/fire-server/src/server.rs
··· 1 + use std::{env, sync::Arc}; 2 + 3 + use actix_web::{middleware::Logger, web::Data, App, HttpServer}; 4 + use anyhow::Error; 5 + use firecracker_process::command::{is_root, run_command}; 6 + use owo_colors::OwoColorize; 7 + use utoipa::OpenApi; 8 + use utoipa_actix_web::AppExt; 9 + use utoipa_rapidoc::RapiDoc; 10 + use utoipa_swagger_ui::SwaggerUi; 11 + 12 + use crate::api::microvm; 13 + 14 + #[derive(OpenApi)] 15 + #[openapi( 16 + tags( 17 + (name = "fireup", description = "Firecracker MicroVM management API") 18 + ), 19 + )] 20 + struct ApiDoc; 21 + 22 + pub async fn run() -> Result<(), Error> { 23 + env_logger::init(); 24 + 25 + if !is_root() { 26 + run_command("sudo", &["-v"], false)?; 27 + } 28 + 29 + let port = env::var("FIREUP_PORT").unwrap_or_else(|_| "9090".to_string()); 30 + let host = env::var("FIREUP_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()); 31 + let addr = format!("{}:{}", host, port); 32 + 33 + let url = format!("http://{}", addr); 34 + println!("Starting server at {}", url.green()); 35 + 36 + let pool = firecracker_state::create_connection_pool().await?; 37 + let pool = Arc::new(pool); 38 + 39 + HttpServer::new(move || { 40 + App::new() 41 + .app_data(Data::new(pool.clone())) 42 + .into_utoipa_app() 43 + .map(|app| app.wrap(Logger::default())) 44 + .openapi(ApiDoc::openapi()) 45 + .service(utoipa_actix_web::scope("/v1/microvms").configure(microvm::configure())) 46 + .openapi_service(|api| { 47 + SwaggerUi::new("/swagger-ui/{_:.*}").url("/api-docs/openapi.json", api) 48 + }) 49 + .map(|app| app.service(RapiDoc::new("/api-docs/openapi.json").path("/rapidoc"))) 50 + .into_app() 51 + }) 52 + .bind(addr)? 53 + .run() 54 + .await 55 + .map_err(Error::new)?; 56 + 57 + Ok(()) 58 + }
+155
crates/fire-server/src/services/microvm.rs
··· 1 + use std::{sync::Arc, thread}; 2 + 3 + use crate::types::microvm::CreateMicroVM; 4 + use anyhow::Error; 5 + use firecracker_state::{entity::virtual_machine::VirtualMachine, repo}; 6 + use firecracker_vm::{constants::BRIDGE_DEV, types::VmOptions}; 7 + use owo_colors::OwoColorize; 8 + use sqlx::{Pool, Sqlite}; 9 + 10 + pub async fn create_microvm( 11 + pool: Arc<Pool<Sqlite>>, 12 + params: CreateMicroVM, 13 + ) -> Result<VirtualMachine, Error> { 14 + let mut options: VmOptions = params.into(); 15 + 16 + if options.api_socket.is_empty() { 17 + let vm_name = names::Generator::default().next().unwrap(); 18 + options.api_socket = format!("/tmp/firecracker-{}.sock", vm_name); 19 + } 20 + 21 + options.bridge = BRIDGE_DEV.into(); 22 + 23 + let vm = start(pool, options, None).await?; 24 + Ok(vm) 25 + } 26 + 27 + pub async fn delete_microvm( 28 + pool: Arc<Pool<Sqlite>>, 29 + id: &str, 30 + ) -> Result<Option<VirtualMachine>, Error> { 31 + let vm = repo::virtual_machine::find(&pool, id).await?; 32 + if vm.is_none() { 33 + println!("[!] No virtual machine found with the name: {}", id); 34 + return Ok(None); 35 + } 36 + 37 + let mut vm = vm.unwrap(); 38 + firecracker_process::stop(Some(vm.name.clone())).await?; 39 + repo::virtual_machine::delete(&pool, id).await?; 40 + vm.status = "DELETED".into(); 41 + Ok(Some(vm)) 42 + } 43 + 44 + pub async fn start_microvm(pool: Arc<Pool<Sqlite>>, id: &str) -> Result<VirtualMachine, Error> { 45 + let vm = repo::virtual_machine::find(&pool, id).await?; 46 + if vm.is_none() { 47 + println!("[!] No virtual machine found with the name: {}", id); 48 + return Err(Error::msg(format!( 49 + "No virtual machine found with the given id: {}", 50 + id 51 + ))); 52 + } 53 + 54 + let vm = vm.unwrap(); 55 + 56 + let options = VmOptions { 57 + debian: Some(vm.distro == "debian"), 58 + alpine: Some(vm.distro == "alpine"), 59 + ubuntu: Some(vm.distro == "ubuntu"), 60 + nixos: Some(vm.distro == "nixos"), 61 + fedora: Some(vm.distro == "fedora"), 62 + gentoo: Some(vm.distro == "gentoo"), 63 + slackware: Some(vm.distro == "slackware"), 64 + opensuse: Some(vm.distro == "opensuse"), 65 + opensuse_tumbleweed: Some(vm.distro == "opensuse-tumbleweed"), 66 + almalinux: Some(vm.distro == "almalinux"), 67 + rockylinux: Some(vm.distro == "rockylinux"), 68 + archlinux: Some(vm.distro == "archlinux"), 69 + vcpu: vm.vcpu, 70 + memory: vm.memory, 71 + vmlinux: vm.vmlinux.clone(), 72 + rootfs: vm.rootfs.clone(), 73 + bootargs: vm.bootargs.clone(), 74 + bridge: vm.bridge.clone(), 75 + tap: vm.tap.clone(), 76 + api_socket: vm.api_socket.clone(), 77 + mac_address: vm.mac_address.clone(), 78 + etcd: None, 79 + }; 80 + 81 + let vm = start(pool, options, Some(vm.id)).await?; 82 + 83 + Ok(vm) 84 + } 85 + 86 + pub async fn stop_microvm( 87 + pool: Arc<Pool<Sqlite>>, 88 + id: &str, 89 + ) -> Result<Option<VirtualMachine>, Error> { 90 + let vm = repo::virtual_machine::find(&pool, id).await?; 91 + if vm.is_none() { 92 + println!("[!] No virtual machine found with the name: {}", id); 93 + return Ok(None); 94 + } 95 + 96 + let mut vm = vm.unwrap(); 97 + firecracker_process::stop(Some(vm.name.clone())).await?; 98 + repo::virtual_machine::update_status(&pool, id, "STOPPED").await?; 99 + vm.status = "STOPPED".into(); 100 + Ok(Some(vm)) 101 + } 102 + 103 + async fn start( 104 + pool: Arc<Pool<Sqlite>>, 105 + mut options: VmOptions, 106 + vm_id: Option<String>, 107 + ) -> Result<VirtualMachine, Error> { 108 + let vms = repo::virtual_machine::all(&pool).await?; 109 + if options.tap.is_empty() { 110 + let vms = vms 111 + .into_iter() 112 + .filter(|vm| vm.tap.starts_with("tap")) 113 + .collect::<Vec<_>>(); 114 + options.tap = format!("tap{}", vms.len()); 115 + 116 + while vms.iter().any(|vm| vm.tap == options.tap) { 117 + let tap_num: u32 = options 118 + .tap 119 + .trim_start_matches("tap") 120 + .parse::<u32>() 121 + .unwrap_or(0) 122 + .checked_add(1) 123 + .unwrap_or(0); 124 + options.tap = format!("tap{}", tap_num); 125 + } 126 + } else { 127 + if vms 128 + .iter() 129 + .any(|vm| vm.tap == options.tap && vm.api_socket != options.api_socket) 130 + { 131 + println!( 132 + "[!] Tap device name {} is already in use. Please choose a different name.", 133 + options.tap.cyan() 134 + ); 135 + return Err(Error::msg("Tap device name already in use")); 136 + } 137 + } 138 + 139 + let pid = firecracker_process::start(&options).await?; 140 + 141 + loop { 142 + thread::sleep(std::time::Duration::from_secs(1)); 143 + if firecracker_process::is_running() { 144 + println!("[+] Firecracker is running."); 145 + break; 146 + } 147 + } 148 + 149 + firecracker_prepare::prepare(options.clone().into(), options.vmlinux.clone())?; 150 + let vm_id = firecracker_vm::setup(&options, pid, vm_id).await?; 151 + let vm = repo::virtual_machine::find(&pool, &vm_id) 152 + .await? 153 + .ok_or_else(|| Error::msg("Failed to retrieve the created VM"))?; 154 + Ok(vm) 155 + }
+1
crates/fire-server/src/services/mod.rs
··· 1 + pub mod microvm;
+116
crates/fire-server/src/types/microvm.rs
··· 1 + use firecracker_vm::{mac::generate_unique_mac, types::VmOptions}; 2 + use serde::{Deserialize, Serialize}; 3 + use utoipa::ToSchema; 4 + 5 + #[derive(Serialize, Deserialize, Clone, ToSchema)] 6 + pub struct MicroVM { 7 + pub id: String, 8 + pub name: String, 9 + pub image: String, 10 + pub vcpu: u8, 11 + pub memory: u32, 12 + pub vmlinux: String, 13 + pub rootfs: String, 14 + pub boot_args: String, 15 + pub status: String, 16 + pub ssh_keys: Vec<String>, 17 + } 18 + 19 + #[derive(Serialize, Deserialize, Clone, ToSchema)] 20 + pub struct CreateMicroVM { 21 + pub name: Option<String>, 22 + pub vcpus: Option<u8>, 23 + pub memory: Option<u16>, 24 + pub image: Option<String>, 25 + pub vmlinux: Option<String>, 26 + pub rootfs: Option<String>, 27 + pub boot_args: Option<String>, 28 + pub ssh_keys: Option<Vec<String>>, 29 + pub start: Option<bool>, 30 + } 31 + 32 + impl Into<VmOptions> for CreateMicroVM { 33 + fn into(self) -> VmOptions { 34 + VmOptions { 35 + debian: self 36 + .image 37 + .as_ref() 38 + .map(|img| img == "debian") 39 + .unwrap_or(false) 40 + .then_some(true), 41 + alpine: self 42 + .image 43 + .as_ref() 44 + .map(|img| img == "alpine") 45 + .unwrap_or(false) 46 + .then_some(true), 47 + ubuntu: self 48 + .image 49 + .as_ref() 50 + .map(|img| img == "ubuntu") 51 + .unwrap_or(false) 52 + .then_some(true), 53 + nixos: self 54 + .image 55 + .as_ref() 56 + .map(|img| img == "nixos") 57 + .unwrap_or(false) 58 + .then_some(true), 59 + fedora: self 60 + .image 61 + .as_ref() 62 + .map(|img| img == "fedora") 63 + .unwrap_or(false) 64 + .then_some(true), 65 + gentoo: self 66 + .image 67 + .as_ref() 68 + .map(|img| img == "gentoo") 69 + .unwrap_or(false) 70 + .then_some(true), 71 + slackware: self 72 + .image 73 + .as_ref() 74 + .map(|img| img == "slackware") 75 + .unwrap_or(false) 76 + .then_some(true), 77 + opensuse: self 78 + .image 79 + .as_ref() 80 + .map(|img| img == "opensuse") 81 + .unwrap_or(false) 82 + .then_some(true), 83 + opensuse_tumbleweed: self 84 + .image 85 + .as_ref() 86 + .map(|img| img == "opensuse-tumbleweed") 87 + .unwrap_or(false) 88 + .then_some(true), 89 + almalinux: self 90 + .image 91 + .as_ref() 92 + .map(|img| img == "almalinux") 93 + .unwrap_or(false) 94 + .then_some(true), 95 + rockylinux: self 96 + .image 97 + .as_ref() 98 + .map(|img| img == "rockylinux") 99 + .unwrap_or(false) 100 + .then_some(true), 101 + archlinux: self 102 + .image 103 + .as_ref() 104 + .map(|img| img == "archlinux") 105 + .unwrap_or(false) 106 + .then_some(true), 107 + vcpu: self.vcpus.unwrap_or(1) as u16, 108 + memory: self.memory.unwrap_or(512), 109 + vmlinux: self.vmlinux, 110 + rootfs: self.rootfs, 111 + bootargs: self.boot_args, 112 + mac_address: generate_unique_mac(), 113 + ..Default::default() 114 + } 115 + } 116 + }
+1
crates/fire-server/src/types/mod.rs
··· 1 + pub mod microvm;
+4 -4
crates/firecracker-process/src/lib.rs
··· 63 63 64 64 let vm = vm.unwrap(); 65 65 if let Some(pid) = vm.pid { 66 - run_command("kill", &["-s", "KILL", &pid.to_string()], true)?; 66 + if run_command("kill", &["-s", "KILL", &pid.to_string()], true).is_err() { 67 + println!("[!] Failed to kill process with PID {}.", pid); 68 + } 67 69 } 68 70 69 71 run_command("rm", &["-rf", &config.api_socket], true)?; ··· 82 84 if std::path::Path::new(&vm.api_socket).exists() { 83 85 return Ok(true); 84 86 } 85 - if vm.status == "RUNNING" { 86 - return Ok(true); 87 - } 87 + repo::virtual_machine::update_status(&pool, name, "STOPPED").await?; 88 88 } 89 89 90 90 Ok(false)
+3 -2
crates/firecracker-state/src/repo/virtual_machine.rs
··· 17 17 let result: Option<VirtualMachine> = 18 18 sqlx::query_as("SELECT * FROM virtual_machines WHERE name = ? OR id = ?") 19 19 .bind(name) 20 + .bind(name) 20 21 .fetch_optional(pool) 21 22 .await 22 23 .with_context(|| { ··· 40 41 Ok(result) 41 42 } 42 43 43 - pub async fn create(pool: &Pool<Sqlite>, vm: VirtualMachine) -> Result<(), Error> { 44 + pub async fn create(pool: &Pool<Sqlite>, vm: VirtualMachine) -> Result<String, Error> { 44 45 let id = xid::new().to_string(); 45 46 let project_dir = match Path::exists(Path::new("fire.toml")) { 46 47 true => Some(std::env::current_dir()?.display().to_string()), ··· 85 86 .execute(pool) 86 87 .await 87 88 .with_context(|| "Failed to create virtual machine")?; 88 - Ok(()) 89 + Ok(id) 89 90 } 90 91 91 92 pub async fn delete(pool: &Pool<Sqlite>, name: &str) -> Result<(), Error> {
+2
crates/firecracker-up/Cargo.toml
··· 13 13 firecracker-process = { path = "../firecracker-process" } 14 14 firecracker-state = { path = "../firecracker-state" } 15 15 fire-config = { path = "../fire-config" } 16 + fire-server = { path = "../fire-server" } 17 + fire-client = { path = "../fire-client" } 16 18 clap = "4.5.41" 17 19 owo-colors = "4.2.2" 18 20 glob = "0.3.2"
+1
crates/firecracker-up/src/cmd/mod.rs
··· 3 3 pub mod logs; 4 4 pub mod ps; 5 5 pub mod reset; 6 + pub mod serve; 6 7 pub mod ssh; 7 8 pub mod start; 8 9 pub mod status;
+7
crates/firecracker-up/src/cmd/serve.rs
··· 1 + use anyhow::Error; 2 + use fire_server::server; 3 + 4 + pub async fn serve() -> Result<(), Error> { 5 + server::run().await?; 6 + Ok(()) 7 + }
+22 -3
crates/firecracker-up/src/main.rs
··· 4 4 use owo_colors::OwoColorize; 5 5 6 6 use crate::cmd::{ 7 - down::down, init::init, logs::logs, ps::list_all_instances, reset::reset, ssh::ssh, 8 - start::start, status::status, stop::stop, up::up, 7 + down::down, init::init, logs::logs, ps::list_all_instances, reset::reset, serve::serve, 8 + ssh::ssh, start::start, status::status, stop::stop, up::up, 9 9 }; 10 10 11 11 pub mod cmd; ··· 96 96 .value_name("ARGS") 97 97 .help("Override boot arguments"), 98 98 ) 99 + .arg( 100 + Arg::new("ssh-keys") 101 + .long("ssh-keys") 102 + .value_name("SSH_KEYS") 103 + .help("Comma-separated list of SSH public keys to add to the VM"), 104 + ) 99 105 .about("Start a new Firecracker MicroVM"), 100 106 ) 101 107 .subcommand(Command::new("down").about("Stop Firecracker MicroVM")) ··· 107 113 .subcommand( 108 114 Command::new("logs") 109 115 .arg( 110 - arg!(--follow -f "Follow the logs") 116 + arg!(-f --follow "Follow the logs") 111 117 .short('f') 112 118 .long("follow") 113 119 .default_value("false"), ··· 124 130 .arg(arg!([name] "Name of the Firecracker MicroVM to reset").required(false)) 125 131 .about("Reset the Firecracker MicroVM"), 126 132 ) 133 + .subcommand( 134 + Command::new("serve") 135 + .about("Start fireup HTTP API server") 136 + .arg(arg!(--host <host> "Host to bind the server")) 137 + .arg(arg!(--port <port> "Port to bind the server")), 138 + ) 127 139 .arg(arg!(--debian "Prepare Debian MicroVM").default_value("false")) 128 140 .arg(arg!(--alpine "Prepare Alpine MicroVM").default_value("false")) 129 141 .arg(arg!(--nixos "Prepare NixOS MicroVM").default_value("false")) ··· 164 176 .long("boot-args") 165 177 .value_name("ARGS") 166 178 .help("Override boot arguments"), 179 + ) 180 + .arg( 181 + Arg::new("ssh-keys") 182 + .long("ssh-keys") 183 + .value_name("SSH_KEYS") 184 + .help("Comma-separated list of SSH public keys to add to the VM"), 167 185 ) 168 186 } 169 187 ··· 265 283 }) 266 284 .await? 267 285 } 286 + Some(("serve", _)) => serve().await?, 268 287 _ => { 269 288 let debian = matches.get_one::<bool>("debian").copied().unwrap_or(false); 270 289 let alpine = matches.get_one::<bool>("alpine").copied().unwrap_or(false);
+6 -5
crates/firecracker-vm/src/lib.rs
··· 19 19 mod network; 20 20 pub mod types; 21 21 22 - pub async fn setup(options: &VmOptions, pid: u32, vm_id: Option<String>) -> Result<()> { 22 + pub async fn setup(options: &VmOptions, pid: u32, vm_id: Option<String>) -> Result<String> { 23 23 let distro: Distro = options.clone().into(); 24 24 let app_dir = get_config_dir().with_context(|| "Failed to get configuration directory")?; 25 25 ··· 144 144 .display() 145 145 .to_string(); 146 146 147 - match vm_id { 147 + let vm_id = match vm_id { 148 148 Some(id) => { 149 149 repo::virtual_machine::update( 150 150 &pool, ··· 169 169 }, 170 170 ) 171 171 .await?; 172 + id 172 173 } 173 174 None => { 174 175 repo::virtual_machine::create( ··· 192 193 ..Default::default() 193 194 }, 194 195 ) 195 - .await?; 196 + .await? 196 197 } 197 - } 198 + }; 198 199 199 200 println!("[✓] MicroVM booted and network is configured 🎉"); 200 201 201 202 println!("SSH into the VM using the following command:"); 202 203 println!("{} {}", "fireup ssh".bright_green(), name.bright_green()); 203 204 204 - Ok(()) 205 + Ok(vm_id) 205 206 }