Server tools to backfill, tail, mirror, and verify PLC logs
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

acme time

phil 63a8310e 59cad5c3

+559 -16
+472 -5
Cargo.lock
··· 42 42 "reqwest", 43 43 "reqwest-middleware", 44 44 "reqwest-retry", 45 + "rustls", 45 46 "serde", 46 47 "serde_json", 47 48 "thiserror 2.0.16", ··· 139 140 checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 140 141 141 142 [[package]] 143 + name = "asn1-rs" 144 + version = "0.7.1" 145 + source = "registry+https://github.com/rust-lang/crates.io-index" 146 + checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" 147 + dependencies = [ 148 + "asn1-rs-derive", 149 + "asn1-rs-impl", 150 + "displaydoc", 151 + "nom", 152 + "num-traits", 153 + "rusticata-macros", 154 + "thiserror 2.0.16", 155 + "time", 156 + ] 157 + 158 + [[package]] 159 + name = "asn1-rs-derive" 160 + version = "0.6.0" 161 + source = "registry+https://github.com/rust-lang/crates.io-index" 162 + checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" 163 + dependencies = [ 164 + "proc-macro2", 165 + "quote", 166 + "syn", 167 + "synstructure", 168 + ] 169 + 170 + [[package]] 171 + name = "asn1-rs-impl" 172 + version = "0.2.0" 173 + source = "registry+https://github.com/rust-lang/crates.io-index" 174 + checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" 175 + dependencies = [ 176 + "proc-macro2", 177 + "quote", 178 + "syn", 179 + ] 180 + 181 + [[package]] 142 182 name = "async-compression" 143 183 version = "0.4.30" 144 184 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 176 216 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 177 217 178 218 [[package]] 219 + name = "aws-lc-rs" 220 + version = "1.14.0" 221 + source = "registry+https://github.com/rust-lang/crates.io-index" 222 + checksum = "94b8ff6c09cd57b16da53641caa860168b88c172a5ee163b0288d3d6eea12786" 223 + dependencies = [ 224 + "aws-lc-sys", 225 + "zeroize", 226 + ] 227 + 228 + [[package]] 229 + name = "aws-lc-sys" 230 + version = "0.31.0" 231 + source = "registry+https://github.com/rust-lang/crates.io-index" 232 + checksum = "0e44d16778acaf6a9ec9899b92cebd65580b83f685446bf2e1f5d3d732f99dcd" 233 + dependencies = [ 234 + "bindgen", 235 + "cc", 236 + "cmake", 237 + "dunce", 238 + "fs_extra", 239 + ] 240 + 241 + [[package]] 179 242 name = "backtrace" 180 243 version = "0.3.75" 181 244 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 195 258 version = "0.22.1" 196 259 source = "registry+https://github.com/rust-lang/crates.io-index" 197 260 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 261 + 262 + [[package]] 263 + name = "bindgen" 264 + version = "0.72.1" 265 + source = "registry+https://github.com/rust-lang/crates.io-index" 266 + checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" 267 + dependencies = [ 268 + "bitflags 2.9.4", 269 + "cexpr", 270 + "clang-sys", 271 + "itertools", 272 + "log", 273 + "prettyplease", 274 + "proc-macro2", 275 + "quote", 276 + "regex", 277 + "rustc-hash", 278 + "shlex", 279 + "syn", 280 + ] 198 281 199 282 [[package]] 200 283 name = "bitflags" ··· 269 352 ] 270 353 271 354 [[package]] 355 + name = "cexpr" 356 + version = "0.6.0" 357 + source = "registry+https://github.com/rust-lang/crates.io-index" 358 + checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 359 + dependencies = [ 360 + "nom", 361 + ] 362 + 363 + [[package]] 272 364 name = "cfg-if" 273 365 version = "1.0.3" 274 366 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 292 384 "serde", 293 385 "wasm-bindgen", 294 386 "windows-link 0.2.0", 387 + ] 388 + 389 + [[package]] 390 + name = "clang-sys" 391 + version = "1.8.1" 392 + source = "registry+https://github.com/rust-lang/crates.io-index" 393 + checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 394 + dependencies = [ 395 + "glob", 396 + "libc", 397 + "libloading", 295 398 ] 296 399 297 400 [[package]] ··· 335 438 checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" 336 439 337 440 [[package]] 441 + name = "cmake" 442 + version = "0.1.54" 443 + source = "registry+https://github.com/rust-lang/crates.io-index" 444 + checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" 445 + dependencies = [ 446 + "cc", 447 + ] 448 + 449 + [[package]] 338 450 name = "colorchoice" 339 451 version = "1.0.4" 340 452 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 371 483 ] 372 484 373 485 [[package]] 486 + name = "core-foundation" 487 + version = "0.10.1" 488 + source = "registry+https://github.com/rust-lang/crates.io-index" 489 + checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" 490 + dependencies = [ 491 + "core-foundation-sys", 492 + "libc", 493 + ] 494 + 495 + [[package]] 374 496 name = "core-foundation-sys" 375 497 version = "0.8.7" 376 498 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 425 547 ] 426 548 427 549 [[package]] 550 + name = "data-encoding" 551 + version = "2.9.0" 552 + source = "registry+https://github.com/rust-lang/crates.io-index" 553 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 554 + 555 + [[package]] 556 + name = "der-parser" 557 + version = "10.0.0" 558 + source = "registry+https://github.com/rust-lang/crates.io-index" 559 + checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" 560 + dependencies = [ 561 + "asn1-rs", 562 + "displaydoc", 563 + "nom", 564 + "num-bigint", 565 + "num-traits", 566 + "rusticata-macros", 567 + ] 568 + 569 + [[package]] 570 + name = "deranged" 571 + version = "0.5.3" 572 + source = "registry+https://github.com/rust-lang/crates.io-index" 573 + checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" 574 + dependencies = [ 575 + "powerfmt", 576 + ] 577 + 578 + [[package]] 428 579 name = "digest" 429 580 version = "0.10.7" 430 581 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 445 596 "quote", 446 597 "syn", 447 598 ] 599 + 600 + [[package]] 601 + name = "dunce" 602 + version = "1.0.5" 603 + source = "registry+https://github.com/rust-lang/crates.io-index" 604 + checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 605 + 606 + [[package]] 607 + name = "either" 608 + version = "1.15.0" 609 + source = "registry+https://github.com/rust-lang/crates.io-index" 610 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 448 611 449 612 [[package]] 450 613 name = "encoding_rs" ··· 536 699 ] 537 700 538 701 [[package]] 702 + name = "fs_extra" 703 + version = "1.3.0" 704 + source = "registry+https://github.com/rust-lang/crates.io-index" 705 + checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 706 + 707 + [[package]] 539 708 name = "futures" 540 709 version = "0.3.31" 541 710 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 674 843 checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 675 844 676 845 [[package]] 846 + name = "glob" 847 + version = "0.3.3" 848 + source = "registry+https://github.com/rust-lang/crates.io-index" 849 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 850 + 851 + [[package]] 677 852 name = "governor" 678 853 version = "0.10.1" 679 854 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 850 1025 "hyper", 851 1026 "hyper-util", 852 1027 "rustls", 1028 + "rustls-native-certs", 853 1029 "rustls-pki-types", 854 1030 "tokio", 855 1031 "tokio-rustls", ··· 1085 1261 checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1086 1262 1087 1263 [[package]] 1264 + name = "itertools" 1265 + version = "0.13.0" 1266 + source = "registry+https://github.com/rust-lang/crates.io-index" 1267 + checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 1268 + dependencies = [ 1269 + "either", 1270 + ] 1271 + 1272 + [[package]] 1088 1273 name = "itoa" 1089 1274 version = "1.0.15" 1090 1275 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1121 1306 version = "0.2.175" 1122 1307 source = "registry+https://github.com/rust-lang/crates.io-index" 1123 1308 checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 1309 + 1310 + [[package]] 1311 + name = "libloading" 1312 + version = "0.8.9" 1313 + source = "registry+https://github.com/rust-lang/crates.io-index" 1314 + checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" 1315 + dependencies = [ 1316 + "cfg-if", 1317 + "windows-link 0.2.0", 1318 + ] 1124 1319 1125 1320 [[package]] 1126 1321 name = "libredox" ··· 1162 1357 checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1163 1358 1164 1359 [[package]] 1360 + name = "lru-slab" 1361 + version = "0.1.2" 1362 + source = "registry+https://github.com/rust-lang/crates.io-index" 1363 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1364 + 1365 + [[package]] 1165 1366 name = "matchers" 1166 1367 version = "0.2.0" 1167 1368 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1193 1394 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1194 1395 1195 1396 [[package]] 1397 + name = "minimal-lexical" 1398 + version = "0.2.1" 1399 + source = "registry+https://github.com/rust-lang/crates.io-index" 1400 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1401 + 1402 + [[package]] 1196 1403 name = "miniz_oxide" 1197 1404 version = "0.8.9" 1198 1405 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1224 1431 "openssl-probe", 1225 1432 "openssl-sys", 1226 1433 "schannel", 1227 - "security-framework", 1434 + "security-framework 2.11.1", 1228 1435 "security-framework-sys", 1229 1436 "tempfile", 1230 1437 ] ··· 1242 1449 ] 1243 1450 1244 1451 [[package]] 1452 + name = "nom" 1453 + version = "7.1.3" 1454 + source = "registry+https://github.com/rust-lang/crates.io-index" 1455 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1456 + dependencies = [ 1457 + "memchr", 1458 + "minimal-lexical", 1459 + ] 1460 + 1461 + [[package]] 1245 1462 name = "nonzero_ext" 1246 1463 version = "0.3.0" 1247 1464 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1257 1474 ] 1258 1475 1259 1476 [[package]] 1477 + name = "num-bigint" 1478 + version = "0.4.6" 1479 + source = "registry+https://github.com/rust-lang/crates.io-index" 1480 + checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1481 + dependencies = [ 1482 + "num-integer", 1483 + "num-traits", 1484 + ] 1485 + 1486 + [[package]] 1487 + name = "num-conv" 1488 + version = "0.1.0" 1489 + source = "registry+https://github.com/rust-lang/crates.io-index" 1490 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1491 + 1492 + [[package]] 1493 + name = "num-integer" 1494 + version = "0.1.46" 1495 + source = "registry+https://github.com/rust-lang/crates.io-index" 1496 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1497 + dependencies = [ 1498 + "num-traits", 1499 + ] 1500 + 1501 + [[package]] 1260 1502 name = "num-traits" 1261 1503 version = "0.2.19" 1262 1504 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1272 1514 checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1273 1515 dependencies = [ 1274 1516 "memchr", 1517 + ] 1518 + 1519 + [[package]] 1520 + name = "oid-registry" 1521 + version = "0.8.1" 1522 + source = "registry+https://github.com/rust-lang/crates.io-index" 1523 + checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" 1524 + dependencies = [ 1525 + "asn1-rs", 1275 1526 ] 1276 1527 1277 1528 [[package]] ··· 1379 1630 ] 1380 1631 1381 1632 [[package]] 1633 + name = "pem" 1634 + version = "3.0.5" 1635 + source = "registry+https://github.com/rust-lang/crates.io-index" 1636 + checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" 1637 + dependencies = [ 1638 + "base64", 1639 + "serde", 1640 + ] 1641 + 1642 + [[package]] 1382 1643 name = "percent-encoding" 1383 1644 version = "2.3.2" 1384 1645 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1427 1688 checksum = "9f977080932c87287147dca052951c3e2696f8759863f6b4e4c0c9ffe7a4cc8b" 1428 1689 dependencies = [ 1429 1690 "async-compression", 1691 + "base64", 1430 1692 "bytes", 1693 + "chrono", 1431 1694 "futures-util", 1432 1695 "headers", 1433 1696 "http", ··· 1440 1703 "percent-encoding", 1441 1704 "pin-project-lite", 1442 1705 "poem-derive", 1706 + "rcgen", 1443 1707 "regex", 1708 + "reqwest", 1444 1709 "rfc7239", 1710 + "ring", 1711 + "rustls-pemfile", 1445 1712 "serde", 1446 1713 "serde_json", 1447 1714 "serde_urlencoded", ··· 1449 1716 "sync_wrapper", 1450 1717 "thiserror 2.0.16", 1451 1718 "tokio", 1719 + "tokio-rustls", 1452 1720 "tokio-util", 1453 1721 "tracing", 1454 1722 "wildmatch", 1723 + "x509-parser", 1455 1724 ] 1456 1725 1457 1726 [[package]] ··· 1514 1783 ] 1515 1784 1516 1785 [[package]] 1786 + name = "powerfmt" 1787 + version = "0.2.0" 1788 + source = "registry+https://github.com/rust-lang/crates.io-index" 1789 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1790 + 1791 + [[package]] 1517 1792 name = "ppv-lite86" 1518 1793 version = "0.2.21" 1519 1794 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1523 1798 ] 1524 1799 1525 1800 [[package]] 1801 + name = "prettyplease" 1802 + version = "0.2.37" 1803 + source = "registry+https://github.com/rust-lang/crates.io-index" 1804 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 1805 + dependencies = [ 1806 + "proc-macro2", 1807 + "syn", 1808 + ] 1809 + 1810 + [[package]] 1526 1811 name = "proc-macro-crate" 1527 1812 version = "3.4.0" 1528 1813 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1556 1841 ] 1557 1842 1558 1843 [[package]] 1844 + name = "quinn" 1845 + version = "0.11.9" 1846 + source = "registry+https://github.com/rust-lang/crates.io-index" 1847 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 1848 + dependencies = [ 1849 + "bytes", 1850 + "cfg_aliases", 1851 + "pin-project-lite", 1852 + "quinn-proto", 1853 + "quinn-udp", 1854 + "rustc-hash", 1855 + "rustls", 1856 + "socket2 0.6.0", 1857 + "thiserror 2.0.16", 1858 + "tokio", 1859 + "tracing", 1860 + "web-time", 1861 + ] 1862 + 1863 + [[package]] 1864 + name = "quinn-proto" 1865 + version = "0.11.13" 1866 + source = "registry+https://github.com/rust-lang/crates.io-index" 1867 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 1868 + dependencies = [ 1869 + "bytes", 1870 + "getrandom 0.3.3", 1871 + "lru-slab", 1872 + "rand 0.9.2", 1873 + "ring", 1874 + "rustc-hash", 1875 + "rustls", 1876 + "rustls-pki-types", 1877 + "slab", 1878 + "thiserror 2.0.16", 1879 + "tinyvec", 1880 + "tracing", 1881 + "web-time", 1882 + ] 1883 + 1884 + [[package]] 1885 + name = "quinn-udp" 1886 + version = "0.5.14" 1887 + source = "registry+https://github.com/rust-lang/crates.io-index" 1888 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 1889 + dependencies = [ 1890 + "cfg_aliases", 1891 + "libc", 1892 + "once_cell", 1893 + "socket2 0.6.0", 1894 + "tracing", 1895 + "windows-sys 0.60.2", 1896 + ] 1897 + 1898 + [[package]] 1559 1899 name = "quote" 1560 1900 version = "1.0.40" 1561 1901 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1639 1979 ] 1640 1980 1641 1981 [[package]] 1982 + name = "rcgen" 1983 + version = "0.12.1" 1984 + source = "registry+https://github.com/rust-lang/crates.io-index" 1985 + checksum = "48406db8ac1f3cbc7dcdb56ec355343817958a356ff430259bb07baf7607e1e1" 1986 + dependencies = [ 1987 + "pem", 1988 + "ring", 1989 + "time", 1990 + "yasna", 1991 + ] 1992 + 1993 + [[package]] 1642 1994 name = "redox_syscall" 1643 1995 version = "0.2.16" 1644 1996 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1710 2062 "native-tls", 1711 2063 "percent-encoding", 1712 2064 "pin-project-lite", 2065 + "quinn", 2066 + "rustls", 2067 + "rustls-native-certs", 1713 2068 "rustls-pki-types", 1714 2069 "serde", 1715 2070 "serde_json", ··· 1717 2072 "sync_wrapper", 1718 2073 "tokio", 1719 2074 "tokio-native-tls", 2075 + "tokio-rustls", 1720 2076 "tokio-util", 1721 2077 "tower", 1722 2078 "tower-http", ··· 1804 2160 checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1805 2161 1806 2162 [[package]] 2163 + name = "rustc-hash" 2164 + version = "2.1.1" 2165 + source = "registry+https://github.com/rust-lang/crates.io-index" 2166 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 2167 + 2168 + [[package]] 2169 + name = "rusticata-macros" 2170 + version = "4.1.0" 2171 + source = "registry+https://github.com/rust-lang/crates.io-index" 2172 + checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" 2173 + dependencies = [ 2174 + "nom", 2175 + ] 2176 + 2177 + [[package]] 1807 2178 name = "rustix" 1808 2179 version = "1.1.2" 1809 2180 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1818 2189 1819 2190 [[package]] 1820 2191 name = "rustls" 1821 - version = "0.23.31" 2192 + version = "0.23.32" 1822 2193 source = "registry+https://github.com/rust-lang/crates.io-index" 1823 - checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" 2194 + checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" 1824 2195 dependencies = [ 2196 + "aws-lc-rs", 2197 + "log", 1825 2198 "once_cell", 2199 + "ring", 1826 2200 "rustls-pki-types", 1827 2201 "rustls-webpki", 1828 2202 "subtle", ··· 1830 2204 ] 1831 2205 1832 2206 [[package]] 2207 + name = "rustls-native-certs" 2208 + version = "0.8.1" 2209 + source = "registry+https://github.com/rust-lang/crates.io-index" 2210 + checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" 2211 + dependencies = [ 2212 + "openssl-probe", 2213 + "rustls-pki-types", 2214 + "schannel", 2215 + "security-framework 3.5.0", 2216 + ] 2217 + 2218 + [[package]] 2219 + name = "rustls-pemfile" 2220 + version = "2.2.0" 2221 + source = "registry+https://github.com/rust-lang/crates.io-index" 2222 + checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 2223 + dependencies = [ 2224 + "rustls-pki-types", 2225 + ] 2226 + 2227 + [[package]] 1833 2228 name = "rustls-pki-types" 1834 2229 version = "1.12.0" 1835 2230 source = "registry+https://github.com/rust-lang/crates.io-index" 1836 2231 checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 1837 2232 dependencies = [ 2233 + "web-time", 1838 2234 "zeroize", 1839 2235 ] 1840 2236 ··· 1844 2240 source = "registry+https://github.com/rust-lang/crates.io-index" 1845 2241 checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8" 1846 2242 dependencies = [ 2243 + "aws-lc-rs", 1847 2244 "ring", 1848 2245 "rustls-pki-types", 1849 2246 "untrusted", ··· 1883 2280 checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1884 2281 dependencies = [ 1885 2282 "bitflags 2.9.4", 1886 - "core-foundation", 2283 + "core-foundation 0.9.4", 2284 + "core-foundation-sys", 2285 + "libc", 2286 + "security-framework-sys", 2287 + ] 2288 + 2289 + [[package]] 2290 + name = "security-framework" 2291 + version = "3.5.0" 2292 + source = "registry+https://github.com/rust-lang/crates.io-index" 2293 + checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" 2294 + dependencies = [ 2295 + "bitflags 2.9.4", 2296 + "core-foundation 0.10.1", 1887 2297 "core-foundation-sys", 1888 2298 "libc", 1889 2299 "security-framework-sys", ··· 2113 2523 checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 2114 2524 dependencies = [ 2115 2525 "bitflags 2.9.4", 2116 - "core-foundation", 2526 + "core-foundation 0.9.4", 2117 2527 "system-configuration-sys", 2118 2528 ] 2119 2529 ··· 2187 2597 checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 2188 2598 dependencies = [ 2189 2599 "cfg-if", 2600 + ] 2601 + 2602 + [[package]] 2603 + name = "time" 2604 + version = "0.3.44" 2605 + source = "registry+https://github.com/rust-lang/crates.io-index" 2606 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 2607 + dependencies = [ 2608 + "deranged", 2609 + "itoa", 2610 + "num-conv", 2611 + "powerfmt", 2612 + "serde", 2613 + "time-core", 2614 + "time-macros", 2615 + ] 2616 + 2617 + [[package]] 2618 + name = "time-core" 2619 + version = "0.1.6" 2620 + source = "registry+https://github.com/rust-lang/crates.io-index" 2621 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 2622 + 2623 + [[package]] 2624 + name = "time-macros" 2625 + version = "0.2.24" 2626 + source = "registry+https://github.com/rust-lang/crates.io-index" 2627 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 2628 + dependencies = [ 2629 + "num-conv", 2630 + "time-core", 2190 2631 ] 2191 2632 2192 2633 [[package]] ··· 3007 3448 version = "0.6.1" 3008 3449 source = "registry+https://github.com/rust-lang/crates.io-index" 3009 3450 checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 3451 + 3452 + [[package]] 3453 + name = "x509-parser" 3454 + version = "0.17.0" 3455 + source = "registry+https://github.com/rust-lang/crates.io-index" 3456 + checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460" 3457 + dependencies = [ 3458 + "asn1-rs", 3459 + "data-encoding", 3460 + "der-parser", 3461 + "lazy_static", 3462 + "nom", 3463 + "oid-registry", 3464 + "rusticata-macros", 3465 + "thiserror 2.0.16", 3466 + "time", 3467 + ] 3468 + 3469 + [[package]] 3470 + name = "yasna" 3471 + version = "0.5.2" 3472 + source = "registry+https://github.com/rust-lang/crates.io-index" 3473 + checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" 3474 + dependencies = [ 3475 + "time", 3476 + ] 3010 3477 3011 3478 [[package]] 3012 3479 name = "yoke"
+2 -1
Cargo.toml
··· 15 15 governor = "0.10.1" 16 16 http-body-util = "0.1.3" 17 17 log = "0.4.28" 18 - poem = { version = "3.1.12", features = ["compression"] } 18 + poem = { version = "3.1.12", features = ["acme", "compression"] } 19 19 reqwest = { version = "0.12.23", features = ["stream", "json"] } 20 20 reqwest-middleware = "0.4.2" 21 21 reqwest-retry = "0.7.0" 22 + rustls = "0.23.32" 22 23 serde = "1.0.219" 23 24 serde_json = { version = "1.0.143", features = ["raw_value"] } 24 25 thiserror = "2.0.16"
+37 -4
src/bin/allegedly.rs
··· 1 1 use allegedly::{ 2 - Db, Dt, ExportPage, FolderSource, HttpSource, PageBoundaryState, backfill, backfill_to_pg, 3 - bin_init, pages_to_pg, pages_to_weeks, poll_upstream, serve, 2 + Db, Dt, ExportPage, FolderSource, HttpSource, ListenConf, PageBoundaryState, backfill, 3 + backfill_to_pg, bin_init, pages_to_pg, pages_to_weeks, poll_upstream, serve, 4 4 }; 5 5 use clap::{CommandFactory, Parser, Subcommand}; 6 6 use reqwest::Url; ··· 10 10 #[derive(Debug, Parser)] 11 11 struct Cli { 12 12 /// Upstream PLC server 13 - #[arg(short, long, env = "ALLEGEDLY_UPSTREAM")] 13 + #[arg(short, long, global = true, env = "ALLEGEDLY_UPSTREAM")] 14 14 #[clap(default_value = "https://plc.directory")] 15 15 upstream: Url, 16 16 #[command(subcommand)] ··· 83 83 #[arg(short, long, env = "ALLEGEDLY_BIND")] 84 84 #[clap(default_value = "127.0.0.1:8000")] 85 85 bind: SocketAddr, 86 + /// obtain a certificate from letsencrypt 87 + /// 88 + /// for now this will force listening on all interfaces at :80 and :443 89 + /// (:80 will serve an "https required" error, *will not* redirect) 90 + #[arg( 91 + long, 92 + conflicts_with("bind"), 93 + requires("acme_cache_path"), 94 + env = "ALLEGEDLY_ACME_DOMAIN" 95 + )] 96 + acme_domain: Vec<String>, 97 + /// which local directory to keep the letsencrypt certs in 98 + #[arg(long, requires("acme_domain"), env = "ALLEGEDLY_ACME_CACHE_PATH")] 99 + acme_cache_path: Option<PathBuf>, 100 + /// which public acme directory to use 101 + /// 102 + /// eg. letsencrypt staging: "https://acme-staging-v02.api.letsencrypt.org/directory" 103 + #[arg(long, requires("acme_domain"), env = "ALLEGEDLY_ACME_DIRECTORY_URL")] 104 + #[clap(default_value = "https://acme-v02.api.letsencrypt.org/directory")] 105 + acme_directory_url: Url, 86 106 }, 87 107 /// Poll an upstream PLC server and log new ops to stdout 88 108 Tail { ··· 224 244 wrap, 225 245 wrap_pg, 226 246 bind, 247 + acme_domain, 248 + acme_cache_path, 249 + acme_directory_url, 227 250 } => { 228 251 let db = Db::new(wrap_pg.as_str()).await.unwrap(); 229 252 let latest = db ··· 249 272 pages_to_pg(poll_db, rx).await.unwrap(); 250 273 }); 251 274 252 - serve(&args.upstream, wrap, bind).await.unwrap(); 275 + let listen_conf = match (bind, acme_domain.is_empty(), acme_cache_path) { 276 + (_, false, Some(cache_path)) => ListenConf::Acme { 277 + domains: acme_domain, 278 + cache_path, 279 + directory_url: acme_directory_url.to_string(), 280 + }, 281 + (bind, true, None) => ListenConf::Bind(bind), 282 + (_, _, _) => unreachable!(), 283 + }; 284 + 285 + serve(&args.upstream, wrap, listen_conf).await.unwrap(); 253 286 } 254 287 Commands::Tail { after } => { 255 288 let mut url = args.upstream;
+1 -1
src/lib.rs
··· 10 10 11 11 pub use backfill::backfill; 12 12 pub use client::{CLIENT, UA}; 13 - pub use mirror::serve; 13 + pub use mirror::{ListenConf, serve}; 14 14 pub use plc_pg::{Db, backfill_to_pg, pages_to_pg}; 15 15 pub use poll::{PageBoundaryState, get_page, poll_upstream}; 16 16 pub use ratelimit::GovernorMiddleware;
+47 -5
src/mirror.rs
··· 2 2 use futures::TryStreamExt; 3 3 use governor::Quota; 4 4 use poem::{ 5 - EndpointExt, Error, IntoResponse, Request, Response, Result, Route, Server, get, handler, 5 + Endpoint, EndpointExt, Error, IntoResponse, Request, Response, Result, Route, Server, get, 6 + handler, 6 7 http::StatusCode, 7 - listener::TcpListener, 8 + listener::{Listener, TcpListener, acme::AutoCert}, 8 9 middleware::{AddData, CatchPanic, Compression, Cors, Tracing}, 9 10 web::{Data, Json}, 10 11 }; 11 12 use reqwest::{Client, Url}; 12 - use std::{net::SocketAddr, time::Duration}; 13 + use std::{net::SocketAddr, path::PathBuf, time::Duration}; 13 14 14 15 #[derive(Debug, Clone)] 15 16 struct State { ··· 175 176 ) 176 177 } 177 178 178 - pub async fn serve(upstream: &Url, plc: Url, bind: SocketAddr) -> std::io::Result<()> { 179 + #[derive(Debug)] 180 + pub enum ListenConf { 181 + Acme { 182 + domains: Vec<String>, 183 + cache_path: PathBuf, 184 + directory_url: String, 185 + }, 186 + Bind(SocketAddr), 187 + } 188 + 189 + pub async fn serve(upstream: &Url, plc: Url, listen: ListenConf) -> std::io::Result<()> { 179 190 // not using crate CLIENT: don't want the retries etc 180 191 let client = Client::builder() 181 192 .user_agent(UA) ··· 202 213 .with(CatchPanic::new()) 203 214 .with(Tracing); 204 215 205 - Server::new(TcpListener::bind(bind)).run(app).await 216 + match listen { 217 + ListenConf::Acme { 218 + domains, 219 + cache_path, 220 + directory_url, 221 + } => { 222 + rustls::crypto::aws_lc_rs::default_provider() 223 + .install_default() 224 + .expect("crypto provider to be installable"); 225 + 226 + let mut auto_cert = AutoCert::builder() 227 + .directory_url(directory_url) 228 + .cache_path(cache_path); 229 + for domain in domains { 230 + auto_cert = auto_cert.domain(domain); 231 + } 232 + let auto_cert = auto_cert.build().expect("acme config to build"); 233 + run(app, TcpListener::bind("0.0.0.0:443").acme(auto_cert)).await 234 + } 235 + ListenConf::Bind(addr) => run(app, TcpListener::bind(addr)).await, 236 + } 237 + } 238 + 239 + async fn run<A, L>(app: A, listener: L) -> std::io::Result<()> 240 + where 241 + A: Endpoint + 'static, 242 + L: Listener + 'static, 243 + { 244 + Server::new(listener) 245 + .name("allegedly (mirror)") 246 + .run(app) 247 + .await 206 248 }