Server tools to backfill, tail, mirror, and verify PLC logs
49
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 }