see whether webhooks enabled

This commit is contained in:
mbecker20
2024-07-05 01:05:27 -07:00
parent af6193f83a
commit 878b9b55bb
15 changed files with 842 additions and 108 deletions

432
Cargo.lock generated
View File

@@ -26,10 +26,19 @@ dependencies = [
"cfg-if", "cfg-if",
"getrandom", "getrandom",
"once_cell", "once_cell",
"version_check", "version_check 0.9.4",
"zerocopy", "zerocopy",
] ]
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "alerter" name = "alerter"
version = "1.10.0" version = "1.10.0"
@@ -115,6 +124,17 @@ version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "async-recursion"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.64",
]
[[package]] [[package]]
name = "async-stream" name = "async-stream"
version = "0.3.5" version = "0.3.5"
@@ -196,7 +216,7 @@ dependencies = [
"hex", "hex",
"http 0.2.12", "http 0.2.12",
"hyper 0.14.28", "hyper 0.14.28",
"ring", "ring 0.17.8",
"time", "time",
"tokio", "tokio",
"tracing", "tracing",
@@ -838,6 +858,9 @@ name = "bytes"
version = "1.6.0" version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "bytes-utils" name = "bytes-utils"
@@ -1226,6 +1249,12 @@ version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
[[package]]
name = "dyn-clone"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
[[package]] [[package]]
name = "either" name = "either"
version = "1.12.0" version = "1.12.0"
@@ -1429,7 +1458,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [ dependencies = [
"typenum", "typenum",
"version_check", "version_check 0.9.4",
] ]
[[package]] [[package]]
@@ -1439,8 +1468,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"js-sys",
"libc", "libc",
"wasi", "wasi",
"wasm-bindgen",
] ]
[[package]] [[package]]
@@ -1918,6 +1949,18 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "instant"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
dependencies = [
"cfg-if",
"js-sys",
"wasm-bindgen",
"web-sys",
]
[[package]] [[package]]
name = "ipconfig" name = "ipconfig"
version = "0.3.2" version = "0.3.2"
@@ -1966,6 +2009,20 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "jsonwebtoken"
version = "8.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378"
dependencies = [
"base64 0.21.7",
"pem",
"ring 0.16.20",
"serde",
"serde_json",
"simple_asn1",
]
[[package]] [[package]]
name = "jwt" name = "jwt"
version = "0.16.0" version = "0.16.0"
@@ -2020,6 +2077,9 @@ name = "log"
version = "0.4.21" version = "0.4.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "logger" name = "logger"
@@ -2303,6 +2363,8 @@ dependencies = [
"mongo_indexed", "mongo_indexed",
"monitor_client", "monitor_client",
"mungos", "mungos",
"nom_pem",
"octorust",
"ordered_hash_map", "ordered_hash_map",
"parse_csl", "parse_csl",
"partial_derive2", "partial_derive2",
@@ -2394,6 +2456,25 @@ dependencies = [
"tempfile", "tempfile",
] ]
[[package]]
name = "nom"
version = "4.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
dependencies = [
"memchr",
"version_check 0.1.5",
]
[[package]]
name = "nom_pem"
version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46345232a84add363a2b3bf214777cf13443f6dab781161aafbdadb8b1f0bd2d"
dependencies = [
"nom",
]
[[package]] [[package]]
name = "ntapi" name = "ntapi"
version = "0.4.1" version = "0.4.1"
@@ -2413,6 +2494,16 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "num-bigint"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "num-conv" name = "num-conv"
version = "0.1.0" version = "0.1.0"
@@ -2456,6 +2547,39 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "octorust"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35a776c05d0cdd02480c12cf1484e0f3bf610eab717ba6fb2c51449b60c7a88f"
dependencies = [
"async-recursion",
"async-trait",
"bytes",
"chrono",
"http 0.2.12",
"jsonwebtoken",
"log",
"mime",
"parse_link_header",
"pem",
"percent-encoding",
"reqwest 0.11.27",
"reqwest-conditional-middleware",
"reqwest-middleware",
"reqwest-retry",
"reqwest-tracing",
"ring 0.16.20",
"schemars",
"serde",
"serde_json",
"serde_urlencoded",
"thiserror",
"tokio",
"url",
"uuid",
]
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.19.0" version = "1.19.0"
@@ -2603,6 +2727,17 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
name = "parking_lot"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
dependencies = [
"instant",
"lock_api",
"parking_lot_core 0.8.6",
]
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.2" version = "0.12.2"
@@ -2610,7 +2745,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
dependencies = [ dependencies = [
"lock_api", "lock_api",
"parking_lot_core", "parking_lot_core 0.9.10",
]
[[package]]
name = "parking_lot_core"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
dependencies = [
"cfg-if",
"instant",
"libc",
"redox_syscall 0.2.16",
"smallvec",
"winapi",
] ]
[[package]] [[package]]
@@ -2621,7 +2770,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"redox_syscall", "redox_syscall 0.5.1",
"smallvec", "smallvec",
"windows-targets 0.52.5", "windows-targets 0.52.5",
] ]
@@ -2632,6 +2781,17 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffa94c2e5674923c67d7f3dfce1279507b191e10eb064881b46ed3e1256e5ca6" checksum = "ffa94c2e5674923c67d7f3dfce1279507b191e10eb064881b46ed3e1256e5ca6"
[[package]]
name = "parse_link_header"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3687fe9debbbf2a019f381a8bc6b42049b22647449b39af54b3013985c0cf6de"
dependencies = [
"http 0.2.12",
"lazy_static",
"regex",
]
[[package]] [[package]]
name = "partial_derive2" name = "partial_derive2"
version = "0.4.3" version = "0.4.3"
@@ -2661,6 +2821,15 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "pem"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8"
dependencies = [
"base64 0.13.1",
]
[[package]] [[package]]
name = "percent-encoding" name = "percent-encoding"
version = "2.3.1" version = "2.3.1"
@@ -2834,6 +3003,15 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags 1.3.2",
]
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.5.1" version = "0.5.1"
@@ -2843,12 +3021,41 @@ dependencies = [
"bitflags 2.5.0", "bitflags 2.5.0",
] ]
[[package]]
name = "regex"
version = "1.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]] [[package]]
name = "regex-lite" name = "regex-lite"
version = "0.1.5" version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e"
[[package]]
name = "regex-syntax"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.27" version = "0.11.27"
@@ -2864,15 +3071,18 @@ dependencies = [
"http 0.2.12", "http 0.2.12",
"http-body 0.4.6", "http-body 0.4.6",
"hyper 0.14.28", "hyper 0.14.28",
"hyper-rustls 0.24.2",
"hyper-tls 0.5.0", "hyper-tls 0.5.0",
"ipnet", "ipnet",
"js-sys", "js-sys",
"log", "log",
"mime", "mime",
"mime_guess",
"native-tls", "native-tls",
"once_cell", "once_cell",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"rustls 0.21.12",
"rustls-pemfile 1.0.4", "rustls-pemfile 1.0.4",
"serde", "serde",
"serde_json", "serde_json",
@@ -2881,11 +3091,13 @@ dependencies = [
"system-configuration", "system-configuration",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
"tokio-rustls 0.24.1",
"tower-service", "tower-service",
"url", "url",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"web-sys", "web-sys",
"webpki-roots",
"winreg 0.50.0", "winreg 0.50.0",
] ]
@@ -2932,6 +3144,72 @@ dependencies = [
"winreg 0.52.0", "winreg 0.52.0",
] ]
[[package]]
name = "reqwest-conditional-middleware"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59e50a2e70970896c99d1b8f20ddc30a70b30d3ac6e619a03a8353b64a49b277"
dependencies = [
"async-trait",
"reqwest 0.11.27",
"reqwest-middleware",
"task-local-extensions",
]
[[package]]
name = "reqwest-middleware"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216"
dependencies = [
"anyhow",
"async-trait",
"http 0.2.12",
"reqwest 0.11.27",
"serde",
"task-local-extensions",
"thiserror",
]
[[package]]
name = "reqwest-retry"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c6a11c05102e5bec712c0619b8c7b7eda8b21a558a0bd981ceee15c38df8be4"
dependencies = [
"anyhow",
"async-trait",
"chrono",
"futures",
"getrandom",
"http 0.2.12",
"hyper 0.14.28",
"parking_lot 0.11.2",
"reqwest 0.11.27",
"reqwest-middleware",
"retry-policies",
"task-local-extensions",
"tokio",
"tracing",
"wasm-timer",
]
[[package]]
name = "reqwest-tracing"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "190838e54153d7a7e2ea98851304b3ce92daeabf14c54d32b01b84a3e636f683"
dependencies = [
"anyhow",
"async-trait",
"getrandom",
"matchit",
"reqwest 0.11.27",
"reqwest-middleware",
"task-local-extensions",
"tracing",
]
[[package]] [[package]]
name = "resolv-conf" name = "resolv-conf"
version = "0.7.0" version = "0.7.0"
@@ -2966,6 +3244,32 @@ dependencies = [
"syn 2.0.64", "syn 2.0.64",
] ]
[[package]]
name = "retry-policies"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e09bbcb5003282bcb688f0bae741b278e9c7e8f378f561522c9806c58e075d9b"
dependencies = [
"anyhow",
"chrono",
"rand",
]
[[package]]
name = "ring"
version = "0.16.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
dependencies = [
"cc",
"libc",
"once_cell",
"spin 0.5.2",
"untrusted 0.7.1",
"web-sys",
"winapi",
]
[[package]] [[package]]
name = "ring" name = "ring"
version = "0.17.8" version = "0.17.8"
@@ -2976,8 +3280,8 @@ dependencies = [
"cfg-if", "cfg-if",
"getrandom", "getrandom",
"libc", "libc",
"spin", "spin 0.9.8",
"untrusted", "untrusted 0.9.0",
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
@@ -3044,7 +3348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
dependencies = [ dependencies = [
"log", "log",
"ring", "ring 0.17.8",
"rustls-webpki 0.101.7", "rustls-webpki 0.101.7",
"sct", "sct",
] ]
@@ -3105,8 +3409,8 @@ version = "0.101.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
dependencies = [ dependencies = [
"ring", "ring 0.17.8",
"untrusted", "untrusted 0.9.0",
] ]
[[package]] [[package]]
@@ -3115,9 +3419,9 @@ version = "0.102.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e"
dependencies = [ dependencies = [
"ring", "ring 0.17.8",
"rustls-pki-types", "rustls-pki-types",
"untrusted", "untrusted 0.9.0",
] ]
[[package]] [[package]]
@@ -3141,6 +3445,34 @@ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "schemars"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92"
dependencies = [
"bytes",
"chrono",
"dyn-clone",
"schemars_derive",
"serde",
"serde_json",
"url",
"uuid",
]
[[package]]
name = "schemars_derive"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e"
dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
"syn 2.0.64",
]
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
version = "1.2.0" version = "1.2.0"
@@ -3153,8 +3485,8 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
dependencies = [ dependencies = [
"ring", "ring 0.17.8",
"untrusted", "untrusted 0.9.0",
] ]
[[package]] [[package]]
@@ -3230,6 +3562,17 @@ dependencies = [
"syn 2.0.64", "syn 2.0.64",
] ]
[[package]]
name = "serde_derive_internals"
version = "0.29.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.64",
]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.119" version = "1.0.119"
@@ -3386,6 +3729,18 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "simple_asn1"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085"
dependencies = [
"num-bigint",
"num-traits",
"thiserror",
"time",
]
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.9" version = "0.4.9"
@@ -3426,6 +3781,12 @@ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "spin"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]] [[package]]
name = "spin" name = "spin"
version = "0.9.8" version = "0.9.8"
@@ -3593,6 +3954,15 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "task-local-extensions"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8"
dependencies = [
"pin-utils",
]
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.10.1" version = "3.10.1"
@@ -3710,7 +4080,7 @@ dependencies = [
"libc", "libc",
"mio", "mio",
"num_cpus", "num_cpus",
"parking_lot", "parking_lot 0.12.2",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry", "signal-hook-registry",
"socket2", "socket2",
@@ -4075,7 +4445,7 @@ dependencies = [
"lazy_static", "lazy_static",
"log", "log",
"lru-cache", "lru-cache",
"parking_lot", "parking_lot 0.12.2",
"resolv-conf", "resolv-conf",
"smallvec", "smallvec",
"thiserror", "thiserror",
@@ -4171,7 +4541,7 @@ version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
dependencies = [ dependencies = [
"version_check", "version_check 0.9.4",
] ]
[[package]] [[package]]
@@ -4195,6 +4565,12 @@ dependencies = [
"tinyvec", "tinyvec",
] ]
[[package]]
name = "untrusted"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
[[package]] [[package]]
name = "untrusted" name = "untrusted"
version = "0.9.0" version = "0.9.0"
@@ -4221,6 +4597,7 @@ dependencies = [
"form_urlencoded", "form_urlencoded",
"idna 0.5.0", "idna 0.5.0",
"percent-encoding", "percent-encoding",
"serde",
] ]
[[package]] [[package]]
@@ -4264,6 +4641,12 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version_check"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.4" version = "0.9.4"
@@ -4357,6 +4740,21 @@ version = "0.2.92"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
[[package]]
name = "wasm-timer"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f"
dependencies = [
"futures",
"js-sys",
"parking_lot 0.11.2",
"pin-utils",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
]
[[package]] [[package]]
name = "web-sys" name = "web-sys"
version = "0.3.69" version = "0.3.69"

View File

@@ -80,6 +80,7 @@ envy = "0.4.2"
# CRYPTO # CRYPTO
uuid = { version = "1.9.1", features = ["v4", "fast-rng", "serde"] } uuid = { version = "1.9.1", features = ["v4", "fast-rng", "serde"] }
urlencoding = "2.1.3" urlencoding = "2.1.3"
nom_pem = "4.0.0"
bcrypt = "0.15.1" bcrypt = "0.15.1"
base64 = "0.22.1" base64 = "0.22.1"
hmac = "0.12.1" hmac = "0.12.1"
@@ -100,5 +101,7 @@ aws-sdk-ecr = "1.33.0"
# MISC # MISC
derive_builder = "0.20.0" derive_builder = "0.20.0"
typeshare = "1.0.3" typeshare = "1.0.3"
octorust = "0.7.0"
colored = "2.1.0" colored = "2.1.0"
bson = "2.11.0" bson = "2.11.0"

View File

@@ -45,9 +45,11 @@ axum-extra.workspace = true
tower-http.workspace = true tower-http.workspace = true
serde_json.workspace = true serde_json.workspace = true
typeshare.workspace = true typeshare.workspace = true
octorust.workspace = true
tracing.workspace = true tracing.workspace = true
reqwest.workspace = true reqwest.workspace = true
futures.workspace = true futures.workspace = true
nom_pem.workspace = true
anyhow.workspace = true anyhow.workspace = true
dotenv.workspace = true dotenv.workspace = true
bcrypt.workspace = true bcrypt.workspace = true

View File

@@ -3,13 +3,14 @@ use std::{
sync::OnceLock, sync::OnceLock,
}; };
use anyhow::Context; use anyhow::{anyhow, Context};
use async_timing_util::unix_timestamp_ms; use async_timing_util::unix_timestamp_ms;
use futures::TryStreamExt; use futures::TryStreamExt;
use monitor_client::{ use monitor_client::{
api::read::*, api::read::*,
entities::{ entities::{
build::{Build, BuildActionState, BuildListItem, BuildState}, build::{Build, BuildActionState, BuildListItem, BuildState},
config::core::CoreConfig,
permission::PermissionLevel, permission::PermissionLevel,
update::UpdateStatus, update::UpdateStatus,
user::User, user::User,
@@ -25,7 +26,9 @@ use resolver_api::{Resolve, ResolveToString};
use crate::{ use crate::{
config::core_config, config::core_config,
resource, resource,
state::{action_states, build_state_cache, db_client, State}, state::{
action_states, build_state_cache, db_client, github_client, State,
},
}; };
impl Resolve<GetBuild, User> for State { impl Resolve<GetBuild, User> for State {
@@ -307,3 +310,54 @@ impl Resolve<ListCommonBuildExtraArgs, User> for State {
Ok(res) Ok(res)
} }
} }
impl Resolve<GetBuildWebhookEnabled, User> for State {
async fn resolve(
&self,
GetBuildWebhookEnabled { build }: GetBuildWebhookEnabled,
user: User,
) -> anyhow::Result<GetBuildWebhookEnabledResponse> {
let Some(github) = github_client() else {
return Err(anyhow!("github_webhook_app is not configured"));
};
let build = resource::get_check_permissions::<Build>(
&build,
&user,
PermissionLevel::Read,
)
.await?;
if build.config.repo.is_empty() {
return Ok(GetBuildWebhookEnabledResponse { enabled: false });
}
let mut split = build.config.repo.split('/');
let owner = split.next().context("Build repo has no owner")?;
let repo =
split.next().context("Build repo has no repo after the /")?;
let github_repos = github.repos();
let webhooks = github_repos
.list_all_webhooks(owner, repo)
.await
.context("failed to list all webhooks on repo")?
.body;
let CoreConfig {
host,
github_webhook_base_url,
..
} = core_config();
let host = github_webhook_base_url.as_ref().unwrap_or(host);
let url = format!("{host}/listener/github/build/{}", build.id);
for webhook in webhooks {
if webhook.active && webhook.config.url == url {
return Ok(GetBuildWebhookEnabledResponse { enabled: true });
}
}
Ok(GetBuildWebhookEnabledResponse { enabled: false })
}
}

View File

@@ -42,12 +42,12 @@ enum ReadRequest {
GetAvailableAwsEcrLabels(GetAvailableAwsEcrLabels), GetAvailableAwsEcrLabels(GetAvailableAwsEcrLabels),
// ==== USER ==== // ==== USER ====
ListUsers(ListUsers),
GetUsername(GetUsername), GetUsername(GetUsername),
GetPermissionLevel(GetPermissionLevel),
ListUsers(ListUsers),
ListApiKeys(ListApiKeys), ListApiKeys(ListApiKeys),
ListApiKeysForServiceUser(ListApiKeysForServiceUser), ListApiKeysForServiceUser(ListApiKeysForServiceUser),
ListPermissions(ListPermissions), ListPermissions(ListPermissions),
GetPermissionLevel(GetPermissionLevel),
ListUserTargetPermissions(ListUserTargetPermissions), ListUserTargetPermissions(ListUserTargetPermissions),
// ==== USER GROUP ==== // ==== USER GROUP ====
@@ -66,15 +66,13 @@ enum ReadRequest {
// ==== SERVER TEMPLATE ==== // ==== SERVER TEMPLATE ====
GetServerTemplate(GetServerTemplate), GetServerTemplate(GetServerTemplate),
GetServerTemplatesSummary(GetServerTemplatesSummary),
ListServerTemplates(ListServerTemplates), ListServerTemplates(ListServerTemplates),
ListFullServerTemplates(ListFullServerTemplates), ListFullServerTemplates(ListFullServerTemplates),
GetServerTemplatesSummary(GetServerTemplatesSummary),
// ==== SERVER ==== // ==== SERVER ====
GetServersSummary(GetServersSummary), GetServersSummary(GetServersSummary),
GetServer(GetServer), GetServer(GetServer),
ListServers(ListServers),
ListFullServers(ListFullServers),
GetServerState(GetServerState), GetServerState(GetServerState),
GetPeripheryVersion(GetPeripheryVersion), GetPeripheryVersion(GetPeripheryVersion),
GetDockerContainers(GetDockerContainers), GetDockerContainers(GetDockerContainers),
@@ -84,27 +82,30 @@ enum ReadRequest {
GetHistoricalServerStats(GetHistoricalServerStats), GetHistoricalServerStats(GetHistoricalServerStats),
GetAvailableAccounts(GetAvailableAccounts), GetAvailableAccounts(GetAvailableAccounts),
GetAvailableSecrets(GetAvailableSecrets), GetAvailableSecrets(GetAvailableSecrets),
ListServers(ListServers),
ListFullServers(ListFullServers),
// ==== DEPLOYMENT ==== // ==== DEPLOYMENT ====
GetDeploymentsSummary(GetDeploymentsSummary), GetDeploymentsSummary(GetDeploymentsSummary),
GetDeployment(GetDeployment), GetDeployment(GetDeployment),
ListDeployments(ListDeployments),
ListFullDeployments(ListFullDeployments),
GetDeploymentContainer(GetDeploymentContainer), GetDeploymentContainer(GetDeploymentContainer),
GetDeploymentActionState(GetDeploymentActionState), GetDeploymentActionState(GetDeploymentActionState),
GetDeploymentStats(GetDeploymentStats), GetDeploymentStats(GetDeploymentStats),
GetLog(GetLog), GetLog(GetLog),
SearchLog(SearchLog), SearchLog(SearchLog),
ListDeployments(ListDeployments),
ListFullDeployments(ListFullDeployments),
ListCommonDeploymentExtraArgs(ListCommonDeploymentExtraArgs), ListCommonDeploymentExtraArgs(ListCommonDeploymentExtraArgs),
// ==== BUILD ==== // ==== BUILD ====
GetBuildsSummary(GetBuildsSummary), GetBuildsSummary(GetBuildsSummary),
GetBuild(GetBuild), GetBuild(GetBuild),
ListBuilds(ListBuilds),
ListFullBuilds(ListFullBuilds),
GetBuildActionState(GetBuildActionState), GetBuildActionState(GetBuildActionState),
GetBuildMonthlyStats(GetBuildMonthlyStats), GetBuildMonthlyStats(GetBuildMonthlyStats),
GetBuildVersions(GetBuildVersions), GetBuildVersions(GetBuildVersions),
GetBuildWebhookEnabled(GetBuildWebhookEnabled),
ListBuilds(ListBuilds),
ListFullBuilds(ListFullBuilds),
ListCommonBuildExtraArgs(ListCommonBuildExtraArgs), ListCommonBuildExtraArgs(ListCommonBuildExtraArgs),
#[to_string_resolver] #[to_string_resolver]
ListGithubOrganizations(ListGithubOrganizations), ListGithubOrganizations(ListGithubOrganizations),
@@ -114,23 +115,24 @@ enum ReadRequest {
// ==== REPO ==== // ==== REPO ====
GetReposSummary(GetReposSummary), GetReposSummary(GetReposSummary),
GetRepo(GetRepo), GetRepo(GetRepo),
GetRepoActionState(GetRepoActionState),
GetRepoWebhooksEnabled(GetRepoWebhooksEnabled),
ListRepos(ListRepos), ListRepos(ListRepos),
ListFullRepos(ListFullRepos), ListFullRepos(ListFullRepos),
GetRepoActionState(GetRepoActionState),
// ==== SYNC ==== // ==== SYNC ====
GetResourceSyncsSummary(GetResourceSyncsSummary), GetResourceSyncsSummary(GetResourceSyncsSummary),
GetResourceSync(GetResourceSync), GetResourceSync(GetResourceSync),
GetResourceSyncActionState(GetResourceSyncActionState),
ListResourceSyncs(ListResourceSyncs), ListResourceSyncs(ListResourceSyncs),
ListFullResourceSyncs(ListFullResourceSyncs), ListFullResourceSyncs(ListFullResourceSyncs),
GetResourceSyncActionState(GetResourceSyncActionState),
// ==== BUILDER ==== // ==== BUILDER ====
GetBuildersSummary(GetBuildersSummary), GetBuildersSummary(GetBuildersSummary),
GetBuilder(GetBuilder), GetBuilder(GetBuilder),
GetBuilderAvailableAccounts(GetBuilderAvailableAccounts),
ListBuilders(ListBuilders), ListBuilders(ListBuilders),
ListFullBuilders(ListFullBuilders), ListFullBuilders(ListFullBuilders),
GetBuilderAvailableAccounts(GetBuilderAvailableAccounts),
// ==== ALERTER ==== // ==== ALERTER ====
GetAlertersSummary(GetAlertersSummary), GetAlertersSummary(GetAlertersSummary),
@@ -229,6 +231,8 @@ impl Resolve<GetCoreInfo, User> for State {
.unwrap_or_else(|| config.host.clone()), .unwrap_or_else(|| config.host.clone()),
transparent_mode: config.transparent_mode, transparent_mode: config.transparent_mode,
ui_write_disabled: config.ui_write_disabled, ui_write_disabled: config.ui_write_disabled,
github_webhook_app: config.github_webhook_app.app_id != 0
&& config.github_webhook_app.installation_id != 0,
}) })
} }
} }

View File

@@ -1,7 +1,8 @@
use anyhow::Context; use anyhow::{anyhow, Context};
use monitor_client::{ use monitor_client::{
api::read::*, api::read::*,
entities::{ entities::{
config::core::CoreConfig,
permission::PermissionLevel, permission::PermissionLevel,
repo::{Repo, RepoActionState, RepoListItem, RepoState}, repo::{Repo, RepoActionState, RepoListItem, RepoState},
user::User, user::User,
@@ -10,8 +11,9 @@ use monitor_client::{
use resolver_api::Resolve; use resolver_api::Resolve;
use crate::{ use crate::{
config::core_config,
resource, resource,
state::{action_states, repo_state_cache, State}, state::{action_states, github_client, repo_state_cache, State},
}; };
impl Resolve<GetRepo, User> for State { impl Resolve<GetRepo, User> for State {
@@ -118,3 +120,69 @@ impl Resolve<GetReposSummary, User> for State {
Ok(res) Ok(res)
} }
} }
impl Resolve<GetRepoWebhooksEnabled, User> for State {
async fn resolve(
&self,
GetRepoWebhooksEnabled { repo }: GetRepoWebhooksEnabled,
user: User,
) -> anyhow::Result<GetRepoWebhooksEnabledResponse> {
let Some(github) = github_client() else {
return Err(anyhow!("github_webhook_app is not configured"));
};
let repo = resource::get_check_permissions::<Repo>(
&repo,
&user,
PermissionLevel::Read,
)
.await?;
if repo.config.repo.is_empty() {
return Ok(GetRepoWebhooksEnabledResponse {
clone_enabled: false,
pull_enabled: false,
});
}
let mut split = repo.config.repo.split('/');
let owner = split.next().context("Repo repo has no owner")?;
let repo_name =
split.next().context("Repo repo has no repo after the /")?;
let github_repos = github.repos();
let webhooks = github_repos
.list_all_webhooks(owner, repo_name)
.await
.context("failed to list all webhooks on repo")?
.body;
let CoreConfig {
host,
github_webhook_base_url,
..
} = core_config();
let host = github_webhook_base_url.as_ref().unwrap_or(host);
let clone_url =
format!("{host}/listener/github/repo/{}/clone", repo.id);
let pull_url =
format!("{host}/listener/github/repo/{}/pull", repo.id);
let mut clone_enabled = false;
let mut pull_enabled = false;
for webhook in webhooks {
if webhook.active && webhook.config.url == clone_url {
clone_enabled = true
}
if webhook.active && webhook.config.url == pull_url {
pull_enabled = true
}
}
Ok(GetRepoWebhooksEnabledResponse {
clone_enabled,
pull_enabled,
})
}
}

View File

@@ -4,8 +4,8 @@ use anyhow::Context;
use merge_config_files::parse_config_file; use merge_config_files::parse_config_file;
use monitor_client::entities::{ use monitor_client::entities::{
config::core::{ config::core::{
AwsCredentials, CoreConfig, Env, HetznerCredentials, MongoConfig, AwsCredentials, CoreConfig, Env, GithubWebhookAppConfig,
OauthCredentials, HetznerCredentials, MongoConfig, OauthCredentials,
}, },
logger::LogConfig, logger::LogConfig,
}; };
@@ -109,6 +109,17 @@ pub fn core_config() -> &'static CoreConfig {
.monitor_github_oauth_secret .monitor_github_oauth_secret
.unwrap_or(config.github_oauth.secret), .unwrap_or(config.github_oauth.secret),
}, },
github_webhook_app: GithubWebhookAppConfig {
app_id: env
.monitor_github_webhook_app_app_id
.unwrap_or(config.github_webhook_app.app_id),
installation_id: env
.monitor_github_webhook_app_installation_id
.unwrap_or(config.github_webhook_app.installation_id),
pk_path: env
.monitor_github_webhook_app_pk_path
.unwrap_or(config.github_webhook_app.pk_path),
},
aws: AwsCredentials { aws: AwsCredentials {
access_key_id: env access_key_id: env
.monitor_aws_access_key_id .monitor_aws_access_key_id

View File

@@ -1,10 +1,17 @@
use std::sync::{Arc, OnceLock}; use std::sync::{Arc, OnceLock};
use anyhow::{anyhow, Context};
use monitor_client::entities::{ use monitor_client::entities::{
build::BuildState, deployment::DeploymentState, build::BuildState,
procedure::ProcedureState, repo::RepoState, config::core::{CoreConfig, GithubWebhookAppConfig},
deployment::DeploymentState,
procedure::ProcedureState,
repo::RepoState,
sync::ResourceSyncState, sync::ResourceSyncState,
}; };
use octorust::auth::{
Credentials, InstallationTokenGenerator, JWTCredentials,
};
use tokio::sync::{Mutex, OnceCell}; use tokio::sync::{Mutex, OnceCell};
use crate::{ use crate::{
@@ -36,6 +43,53 @@ pub fn jwt_client() -> &'static JwtClient {
JWT_CLIENT.get_or_init(|| JwtClient::new(core_config())) JWT_CLIENT.get_or_init(|| JwtClient::new(core_config()))
} }
pub fn github_client() -> Option<&'static octorust::Client> {
static GITHUB_CLIENT: OnceLock<Option<octorust::Client>> =
OnceLock::new();
GITHUB_CLIENT
.get_or_init(|| {
let CoreConfig {
github_webhook_app:
GithubWebhookAppConfig {
app_id,
installation_id,
pk_path,
},
..
} = core_config();
if *app_id == 0 || *installation_id == 0 {
return None;
}
let private_key = std::fs::read(pk_path)
.context("github webhook app | failed to load private key")
.unwrap();
let private_key = nom_pem::decode_block(&private_key)
.map_err(|e| anyhow!("{e:?}"))
.context("github webhook app | failed to decode private key")
.unwrap();
let jwt = JWTCredentials::new(*app_id, private_key.data)
.context(
"github webhook app | failed to make github JWTCredentials",
)
.unwrap();
let token_generator =
InstallationTokenGenerator::new(*installation_id, jwt);
Some(
octorust::Client::new(
"github-app",
Credentials::InstallationToken(token_generator),
)
.context("failed to initialize github client")
.unwrap(),
)
})
.as_ref()
}
pub fn action_states() -> &'static ActionStates { pub fn action_states() -> &'static ActionStates {
static ACTION_STATES: OnceLock<ActionStates> = OnceLock::new(); static ACTION_STATES: OnceLock<ActionStates> = OnceLock::new();
ACTION_STATES.get_or_init(ActionStates::default) ACTION_STATES.get_or_init(ActionStates::default)

View File

@@ -258,3 +258,28 @@ pub struct ListCommonBuildExtraArgs {
#[typeshare] #[typeshare]
pub type ListCommonBuildExtraArgsResponse = Vec<String>; pub type ListCommonBuildExtraArgsResponse = Vec<String>;
//
/// Get whether a Build's target repo has a webhook for the build configured. Response: [GetBuildWebhookEnabledResponse].
///
/// Note. Will fail with 500 if `github_webhook_app` is not configured in core config.
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(GetBuildWebhookEnabledResponse)]
pub struct GetBuildWebhookEnabled {
/// Id or name
#[serde(alias = "id", alias = "name")]
pub build: String,
}
/// Response for [GetBuildWebhookEnabled]
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GetBuildWebhookEnabledResponse {
/// Whether pushes to branch trigger build
pub enabled: bool,
}

View File

@@ -91,6 +91,8 @@ pub struct GetCoreInfoResponse {
pub transparent_mode: bool, pub transparent_mode: bool,
/// Whether UI write access should be disabled /// Whether UI write access should be disabled
pub ui_write_disabled: bool, pub ui_write_disabled: bool,
/// Whether github webhook management api is available
pub github_webhook_app: bool,
} }
// //
@@ -106,4 +108,4 @@ pub struct GetCoreInfoResponse {
pub struct GetAvailableAwsEcrLabels {} pub struct GetAvailableAwsEcrLabels {}
#[typeshare] #[typeshare]
pub type GetAvailableAwsEcrLabelsResponse = Vec<String>; pub type GetAvailableAwsEcrLabelsResponse = Vec<String>;

View File

@@ -108,5 +108,3 @@ pub struct GetProceduresSummaryResponse {
/// The number of procedures with unknown state. /// The number of procedures with unknown state.
pub unknown: u32, pub unknown: u32,
} }
//

View File

@@ -110,3 +110,30 @@ pub struct GetReposSummaryResponse {
/// The number of repos with unknown state. /// The number of repos with unknown state.
pub unknown: u32, pub unknown: u32,
} }
//
/// Get a target Repo's configured webhooks. Response: [GetRepoWebhooksEnabledResponse].
///
/// Note. Will fail with 500 if `github_webhook_app` is not configured in core config.
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(GetRepoWebhooksEnabledResponse)]
pub struct GetRepoWebhooksEnabled {
/// Id or name
#[serde(alias = "id", alias = "name")]
pub repo: String,
}
/// Response for [GetRepoWebhooksEnabled]
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GetRepoWebhooksEnabledResponse {
/// Whether pushes to branch trigger clone
pub clone_enabled: bool,
/// Whether pushes to branch trigger pull
pub pull_enabled: bool,
}

View File

@@ -79,6 +79,13 @@ pub struct Env {
/// Override `local_auth` /// Override `local_auth`
pub monitor_local_auth: Option<bool>, pub monitor_local_auth: Option<bool>,
/// Override `google_oauth.enabled`
pub monitor_google_oauth_enabled: Option<bool>,
/// Override `google_oauth.id`
pub monitor_google_oauth_id: Option<String>,
/// Override `google_oauth.secret`
pub monitor_google_oauth_secret: Option<String>,
/// Override `github_oauth.enabled` /// Override `github_oauth.enabled`
pub monitor_github_oauth_enabled: Option<bool>, pub monitor_github_oauth_enabled: Option<bool>,
/// Override `github_oauth.id` /// Override `github_oauth.id`
@@ -86,12 +93,12 @@ pub struct Env {
/// Override `github_oauth.secret` /// Override `github_oauth.secret`
pub monitor_github_oauth_secret: Option<String>, pub monitor_github_oauth_secret: Option<String>,
/// Override `google_oauth.enabled` /// Override `github_webhook_app.app_id`
pub monitor_google_oauth_enabled: Option<bool>, pub monitor_github_webhook_app_app_id: Option<i64>,
/// Override `google_oauth.id` /// Override `github_webhook_app.installation_id`
pub monitor_google_oauth_id: Option<String>, pub monitor_github_webhook_app_installation_id: Option<i64>,
/// Override `google_oauth.secret` /// Override `github_webhook_app.pk_path`
pub monitor_google_oauth_secret: Option<String>, pub monitor_github_webhook_app_pk_path: Option<String>,
/// Override `mongo.uri` /// Override `mongo.uri`
pub monitor_mongo_uri: Option<String>, pub monitor_mongo_uri: Option<String>,
@@ -183,15 +190,6 @@ fn default_config_path() -> String {
/// ## default: 0 (pruning disabled) /// ## default: 0 (pruning disabled)
/// keep_stats_for_days = 0 /// keep_stats_for_days = 0
/// ///
/// ## token that has to be given to github during repo webhook config as the secret
/// ## default: empty (none)
/// github_webhook_secret = "your_random_webhook_secret"
///
/// ## an alternate base url that is used to recieve github webhook requests
/// ## if empty or not specified, will use 'host' address as base
/// ## default: empty (none)
/// # github_webhook_base_url = "https://github-webhook.monitor.dev"
///
/// ## these will be used by the GUI to attach to builds. /// ## these will be used by the GUI to attach to builds.
/// ## when attached to build, image will be pushed to repo under the specified organization. /// ## when attached to build, image will be pushed to repo under the specified organization.
/// ## if empty, the "docker organization" config option will not be shown. /// ## if empty, the "docker organization" config option will not be shown.
@@ -210,15 +208,33 @@ fn default_config_path() -> String {
/// ## default: false /// ## default: false
/// # local_auth = true /// # local_auth = true
/// ///
/// ## Use to configure google oauth
/// # google_oauth.enabled = true
/// # google_oauth.id = "your_google_client_id"
/// # google_oauth.secret = "your_google_client_secret"
///
/// ## Use to configure github oauth /// ## Use to configure github oauth
/// # github_oauth.enabled = true /// # github_oauth.enabled = true
/// # github_oauth.id = "your_github_client_id" /// # github_oauth.id = "your_github_client_id"
/// # github_oauth.secret = "your_github_client_secret" /// # github_oauth.secret = "your_github_client_secret"
/// ///
/// ## Use to configure google oauth /// ## an alternate base url that is used to recieve github webhook requests
/// # google_oauth.enabled = true /// ## if empty or not specified, will use 'host' address as base
/// # google_oauth.id = "your_google_client_id" /// ## default: empty (none)
/// # google_oauth.secret = "your_google_client_secret" /// # github_webhook_base_url = "https://github-webhook.monitor.dev"
///
/// ## token that has to be given to github during repo webhook config as the secret
/// ## default: empty (none)
/// github_webhook_secret = "your_random_webhook_secret"
///
/// ## Configure github webhook app. Enables webhook management apis.
/// # github_webhook_app.app_id = 1234455 # Find on the app page.
/// # github_webhook_app.installation_id = 1234455 # Get after installing the app to user / organization.
///
/// ## Path to github webhook app private key.
/// ## This is defaulted to `/github-private-key.pem`, and doesn't need to be changed if running in Docker.
/// ## Just mount the private key pem file on the host to `/github-private-key.pem` in the container.
/// # github_webhook_app.pk_path = "/path/to/pk.pem"
/// ///
/// ## MUST comment back in some way to configure mongo. /// ## MUST comment back in some way to configure mongo.
/// # mongo.uri = "mongodb://username:password@localhost:27017" /// # mongo.uri = "mongodb://username:password@localhost:27017"
@@ -315,25 +331,6 @@ pub struct CoreConfig {
#[serde(default)] #[serde(default)]
pub keep_alerts_for_days: u64, pub keep_alerts_for_days: u64,
/// Used to verify validity from github webhooks.
/// Should be some secure hash maybe 20-40 chars.
/// It needs to be given to github when configuring the webhook.
#[serde(default)]
pub github_webhook_secret: String,
/// Used to form the frontend listener url, if None will use 'host'.
///
/// This can be used if core sits on an internal network which is
/// unreachable directly from the open internet.
/// A reverse proxy in a public network (with its own DNS)
/// can forward webhooks to the internal monitor
pub github_webhook_base_url: Option<String>,
/// Allowed github orgs used with monitor.
/// Default: none.
#[serde(default)]
pub github_organizations: Vec<String>,
/// Allowed docker orgs used with monitor. /// Allowed docker orgs used with monitor.
/// Default: none. /// Default: none.
#[serde(default)] #[serde(default)]
@@ -355,13 +352,37 @@ pub struct CoreConfig {
#[serde(default)] #[serde(default)]
pub local_auth: bool, pub local_auth: bool,
/// Configure google oauth
#[serde(default)]
pub google_oauth: OauthCredentials,
/// Configure github oauth /// Configure github oauth
#[serde(default)] #[serde(default)]
pub github_oauth: OauthCredentials, pub github_oauth: OauthCredentials,
/// Configure google oauth /// Used to verify validity from github webhooks.
/// Should be some secure hash maybe 20-40 chars.
/// It needs to be given to github when configuring the webhook.
#[serde(default)] #[serde(default)]
pub google_oauth: OauthCredentials, pub github_webhook_secret: String,
/// Used to form the frontend listener url, if None will use 'host'.
///
/// This can be used if core sits on an internal network which is
/// unreachable directly from the open internet.
/// A reverse proxy in a public network (with its own DNS)
/// can forward webhooks to the internal monitor
pub github_webhook_base_url: Option<String>,
/// Configure a Github Webhook app.
/// Allows users to manage repo webhooks from within the Monitor UI.
#[serde(default)]
pub github_webhook_app: GithubWebhookAppConfig,
/// Allowed github orgs used with monitor.
/// Default: none.
#[serde(default)]
pub github_organizations: Vec<String>,
/// Configure core mongo connection. /// Configure core mongo connection.
/// ///
@@ -397,7 +418,8 @@ pub struct CoreConfig {
/// Configure aws ecr registries. /// Configure aws ecr registries.
#[serde(default, alias = "aws_ecr_registry")] #[serde(default, alias = "aws_ecr_registry")]
pub aws_ecr_registries: HashMap<String, AwsEcrConfigWithCredentials>, pub aws_ecr_registries:
HashMap<String, AwsEcrConfigWithCredentials>,
} }
fn default_title() -> String { fn default_title() -> String {
@@ -565,4 +587,30 @@ impl AwsEcrConfig {
account_id: config.account_id.to_string(), account_id: config.account_id.to_string(),
} }
} }
} }
/// Provide configuration for a Github Webhook app.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GithubWebhookAppConfig {
/// Github app id
pub app_id: i64,
/// Github app installation id
pub installation_id: i64,
/// Private key path. Default: /github-private-key.pem.
#[serde(default = "default_private_key_path")]
pub pk_path: String,
}
fn default_private_key_path() -> String {
String::from("/github-private-key.pem")
}
impl Default for GithubWebhookAppConfig {
fn default() -> Self {
GithubWebhookAppConfig {
app_id: 0,
installation_id: 0,
pk_path: default_private_key_path(),
}
}
}

View File

@@ -21,12 +21,12 @@ export type ReadResponses = {
GetAvailableAwsEcrLabels: Types.GetAvailableAwsEcrLabelsResponse; GetAvailableAwsEcrLabels: Types.GetAvailableAwsEcrLabelsResponse;
// ==== USER ==== // ==== USER ====
ListUsers: Types.ListUsersResponse;
GetUsername: Types.GetUsernameResponse; GetUsername: Types.GetUsernameResponse;
GetPermissionLevel: Types.GetPermissionLevelResponse;
ListUsers: Types.ListUsersResponse;
ListApiKeys: Types.ListApiKeysResponse; ListApiKeys: Types.ListApiKeysResponse;
ListApiKeysForServiceUser: Types.ListApiKeysForServiceUserResponse; ListApiKeysForServiceUser: Types.ListApiKeysForServiceUserResponse;
ListPermissions: Types.ListPermissionsResponse; ListPermissions: Types.ListPermissionsResponse;
GetPermissionLevel: Types.GetPermissionLevelResponse;
ListUserTargetPermissions: Types.ListUserTargetPermissionsResponse; ListUserTargetPermissions: Types.ListUserTargetPermissionsResponse;
// ==== USER GROUP ==== // ==== USER GROUP ====
@@ -45,15 +45,13 @@ export type ReadResponses = {
// ==== SERVER TEMPLATE ==== // ==== SERVER TEMPLATE ====
GetServerTemplate: Types.GetServerTemplateResponse; GetServerTemplate: Types.GetServerTemplateResponse;
GetServerTemplatesSummary: Types.GetServerTemplatesSummaryResponse;
ListServerTemplates: Types.ListServerTemplatesResponse; ListServerTemplates: Types.ListServerTemplatesResponse;
ListFullServerTemplates: Types.ListFullServerTemplatesResponse; ListFullServerTemplates: Types.ListFullServerTemplatesResponse;
GetServerTemplatesSummary: Types.GetServerTemplatesSummaryResponse;
// ==== SERVER ==== // ==== SERVER ====
GetServersSummary: Types.GetServersSummaryResponse; GetServersSummary: Types.GetServersSummaryResponse;
GetServer: Types.GetServerResponse; GetServer: Types.GetServerResponse;
ListServers: Types.ListServersResponse;
ListFullServers: Types.ListFullServersResponse;
GetServerState: Types.GetServerStateResponse; GetServerState: Types.GetServerStateResponse;
GetPeripheryVersion: Types.GetPeripheryVersionResponse; GetPeripheryVersion: Types.GetPeripheryVersionResponse;
GetSystemInformation: Types.GetSystemInformationResponse; GetSystemInformation: Types.GetSystemInformationResponse;
@@ -64,27 +62,30 @@ export type ReadResponses = {
GetHistoricalServerStats: Types.GetHistoricalServerStatsResponse; GetHistoricalServerStats: Types.GetHistoricalServerStatsResponse;
GetAvailableAccounts: Types.GetAvailableAccountsResponse; GetAvailableAccounts: Types.GetAvailableAccountsResponse;
GetAvailableSecrets: Types.GetAvailableSecretsResponse; GetAvailableSecrets: Types.GetAvailableSecretsResponse;
ListServers: Types.ListServersResponse;
ListFullServers: Types.ListFullServersResponse;
// ==== DEPLOYMENT ==== // ==== DEPLOYMENT ====
GetDeploymentsSummary: Types.GetDeploymentsSummaryResponse; GetDeploymentsSummary: Types.GetDeploymentsSummaryResponse;
GetDeployment: Types.GetDeploymentResponse; GetDeployment: Types.GetDeploymentResponse;
ListDeployments: Types.ListDeploymentsResponse;
ListFullDeployments: Types.ListFullDeploymentsResponse;
GetDeploymentContainer: Types.GetDeploymentContainerResponse; GetDeploymentContainer: Types.GetDeploymentContainerResponse;
GetDeploymentActionState: Types.GetDeploymentActionStateResponse; GetDeploymentActionState: Types.GetDeploymentActionStateResponse;
GetDeploymentStats: Types.GetDeploymentStatsResponse; GetDeploymentStats: Types.GetDeploymentStatsResponse;
GetLog: Types.GetLogResponse; GetLog: Types.GetLogResponse;
SearchLog: Types.SearchLogResponse; SearchLog: Types.SearchLogResponse;
ListDeployments: Types.ListDeploymentsResponse;
ListFullDeployments: Types.ListFullDeploymentsResponse;
ListCommonDeploymentExtraArgs: Types.ListCommonDeploymentExtraArgsResponse; ListCommonDeploymentExtraArgs: Types.ListCommonDeploymentExtraArgsResponse;
// ==== BUILD ==== // ==== BUILD ====
GetBuildsSummary: Types.GetBuildsSummaryResponse; GetBuildsSummary: Types.GetBuildsSummaryResponse;
GetBuild: Types.GetBuildResponse; GetBuild: Types.GetBuildResponse;
ListBuilds: Types.ListBuildsResponse;
ListFullBuilds: Types.ListFullBuildsResponse;
GetBuildActionState: Types.GetBuildActionStateResponse; GetBuildActionState: Types.GetBuildActionStateResponse;
GetBuildMonthlyStats: Types.GetBuildMonthlyStatsResponse; GetBuildMonthlyStats: Types.GetBuildMonthlyStatsResponse;
GetBuildVersions: Types.GetBuildVersionsResponse; GetBuildVersions: Types.GetBuildVersionsResponse;
GetBuildWebhookEnabled: Types.GetBuildWebhookEnabledResponse;
ListBuilds: Types.ListBuildsResponse;
ListFullBuilds: Types.ListFullBuildsResponse;
ListCommonBuildExtraArgs: Types.ListCommonBuildExtraArgsResponse; ListCommonBuildExtraArgs: Types.ListCommonBuildExtraArgsResponse;
ListGithubOrganizations: Types.ListGithubOrganizationsResponse; ListGithubOrganizations: Types.ListGithubOrganizationsResponse;
ListDockerOrganizations: Types.ListDockerOrganizationsResponse; ListDockerOrganizations: Types.ListDockerOrganizationsResponse;
@@ -92,16 +93,17 @@ export type ReadResponses = {
// ==== REPO ==== // ==== REPO ====
GetReposSummary: Types.GetReposSummaryResponse; GetReposSummary: Types.GetReposSummaryResponse;
GetRepo: Types.GetRepoResponse; GetRepo: Types.GetRepoResponse;
GetRepoActionState: Types.GetRepoActionStateResponse;
GetRepoWebhooksEnabled: Types.GetRepoWebhooksEnabledResponse;
ListRepos: Types.ListReposResponse; ListRepos: Types.ListReposResponse;
ListFullRepos: Types.ListFullReposResponse; ListFullRepos: Types.ListFullReposResponse;
GetRepoActionState: Types.GetRepoActionStateResponse;
// ==== BUILDER ==== // ==== BUILDER ====
GetBuildersSummary: Types.GetBuildersSummaryResponse; GetBuildersSummary: Types.GetBuildersSummaryResponse;
GetBuilder: Types.GetBuilderResponse; GetBuilder: Types.GetBuilderResponse;
GetBuilderAvailableAccounts: Types.GetBuilderAvailableAccountsResponse;
ListBuilders: Types.ListBuildersResponse; ListBuilders: Types.ListBuildersResponse;
ListFullBuilders: Types.ListFullBuildersResponse; ListFullBuilders: Types.ListFullBuildersResponse;
GetBuilderAvailableAccounts: Types.GetBuilderAvailableAccountsResponse;
// ==== ALERTER ==== // ==== ALERTER ====
GetAlertersSummary: Types.GetAlertersSummaryResponse; GetAlertersSummary: Types.GetAlertersSummaryResponse;
@@ -112,9 +114,9 @@ export type ReadResponses = {
// ==== SYNC ==== // ==== SYNC ====
GetResourceSyncsSummary: Types.GetResourceSyncsSummaryResponse; GetResourceSyncsSummary: Types.GetResourceSyncsSummaryResponse;
GetResourceSync: Types.GetResourceSyncResponse; GetResourceSync: Types.GetResourceSyncResponse;
GetResourceSyncActionState: Types.GetResourceSyncActionStateResponse;
ListResourceSyncs: Types.ListResourceSyncsResponse; ListResourceSyncs: Types.ListResourceSyncsResponse;
ListFullResourceSyncs: Types.ListFullResourceSyncsResponse; ListFullResourceSyncs: Types.ListFullResourceSyncsResponse;
GetResourceSyncActionState: Types.GetResourceSyncActionStateResponse;
// ==== TOML ==== // ==== TOML ====
ExportAllResourcesToToml: Types.ExportAllResourcesToTomlResponse; ExportAllResourcesToToml: Types.ExportAllResourcesToTomlResponse;

View File

@@ -399,10 +399,10 @@ export interface BuildConfig {
* These values remain hidden in the final image by using * These values remain hidden in the final image by using
* docker secret mounts. See `<https://docs.docker.com/build/building/secrets>`. * docker secret mounts. See `<https://docs.docker.com/build/building/secrets>`.
* *
* To use the values, add commands like this in the Dockerfile: * The values can be used in RUN commands:
* ``` * ```
* RUN --mount=type=secret,id=SECRET_KEY \ * RUN --mount=type=secret,id=SECRET_KEY \
* SECRET_VALUE=$(cat /run/secrets/SECRET_KEY) ... * SECRET_KEY=$(cat /run/secrets/SECRET_KEY) ...
* ``` * ```
*/ */
secret_args?: EnvironmentVar[] | string; secret_args?: EnvironmentVar[] | string;
@@ -2110,6 +2110,22 @@ export interface ListCommonBuildExtraArgs {
query?: BuildQuery; query?: BuildQuery;
} }
/**
* Get whether a Build's target repo has a webhook for the build configured. Response: [GetBuildWebhookEnabledResponse].
*
* Note. Will fail with 500 if `github_webhook_app` is not configured in core config.
*/
export interface GetBuildWebhookEnabled {
/** Id or name */
build: string;
}
/** Response for [GetBuildWebhookEnabled] */
export interface GetBuildWebhookEnabledResponse {
/** Whether pushes to branch trigger build */
enabled: boolean;
}
/** Get a specific builder by id or name. Response: [Builder]. */ /** Get a specific builder by id or name. Response: [Builder]. */
export interface GetBuilder { export interface GetBuilder {
/** Id or name */ /** Id or name */
@@ -2320,6 +2336,8 @@ export interface GetCoreInfoResponse {
transparent_mode: boolean; transparent_mode: boolean;
/** Whether UI write access should be disabled */ /** Whether UI write access should be disabled */
ui_write_disabled: boolean; ui_write_disabled: boolean;
/** Whether github webhook management api is available */
github_webhook_app: boolean;
} }
/** /**
@@ -2448,6 +2466,24 @@ export interface GetReposSummaryResponse {
unknown: number; unknown: number;
} }
/**
* Get a target Repo's configured webhooks. Response: [GetRepoWebhooksEnabledResponse].
*
* Note. Will fail with 500 if `github_webhook_app` is not configured in core config.
*/
export interface GetRepoWebhooksEnabled {
/** Id or name */
repo: string;
}
/** Response for [GetRepoWebhooksEnabled] */
export interface GetRepoWebhooksEnabledResponse {
/** Whether pushes to branch trigger clone */
clone_enabled: boolean;
/** Whether pushes to branch trigger pull */
pull_enabled: boolean;
}
/** Find resources matching a common query. Response: [FindResourcesResponse]. */ /** Find resources matching a common query. Response: [FindResourcesResponse]. */
export interface FindResources { export interface FindResources {
/** The mongo query as JSON */ /** The mongo query as JSON */
@@ -3946,12 +3982,12 @@ export type ReadRequest =
| { type: "GetVersion", params: GetVersion } | { type: "GetVersion", params: GetVersion }
| { type: "GetCoreInfo", params: GetCoreInfo } | { type: "GetCoreInfo", params: GetCoreInfo }
| { type: "GetAvailableAwsEcrLabels", params: GetAvailableAwsEcrLabels } | { type: "GetAvailableAwsEcrLabels", params: GetAvailableAwsEcrLabels }
| { type: "ListUsers", params: ListUsers }
| { type: "GetUsername", params: GetUsername } | { type: "GetUsername", params: GetUsername }
| { type: "GetPermissionLevel", params: GetPermissionLevel }
| { type: "ListUsers", params: ListUsers }
| { type: "ListApiKeys", params: ListApiKeys } | { type: "ListApiKeys", params: ListApiKeys }
| { type: "ListApiKeysForServiceUser", params: ListApiKeysForServiceUser } | { type: "ListApiKeysForServiceUser", params: ListApiKeysForServiceUser }
| { type: "ListPermissions", params: ListPermissions } | { type: "ListPermissions", params: ListPermissions }
| { type: "GetPermissionLevel", params: GetPermissionLevel }
| { type: "ListUserTargetPermissions", params: ListUserTargetPermissions } | { type: "ListUserTargetPermissions", params: ListUserTargetPermissions }
| { type: "GetUserGroup", params: GetUserGroup } | { type: "GetUserGroup", params: GetUserGroup }
| { type: "ListUserGroups", params: ListUserGroups } | { type: "ListUserGroups", params: ListUserGroups }
@@ -3962,13 +3998,11 @@ export type ReadRequest =
| { type: "ListProcedures", params: ListProcedures } | { type: "ListProcedures", params: ListProcedures }
| { type: "ListFullProcedures", params: ListFullProcedures } | { type: "ListFullProcedures", params: ListFullProcedures }
| { type: "GetServerTemplate", params: GetServerTemplate } | { type: "GetServerTemplate", params: GetServerTemplate }
| { type: "GetServerTemplatesSummary", params: GetServerTemplatesSummary }
| { type: "ListServerTemplates", params: ListServerTemplates } | { type: "ListServerTemplates", params: ListServerTemplates }
| { type: "ListFullServerTemplates", params: ListFullServerTemplates } | { type: "ListFullServerTemplates", params: ListFullServerTemplates }
| { type: "GetServerTemplatesSummary", params: GetServerTemplatesSummary }
| { type: "GetServersSummary", params: GetServersSummary } | { type: "GetServersSummary", params: GetServersSummary }
| { type: "GetServer", params: GetServer } | { type: "GetServer", params: GetServer }
| { type: "ListServers", params: ListServers }
| { type: "ListFullServers", params: ListFullServers }
| { type: "GetServerState", params: GetServerState } | { type: "GetServerState", params: GetServerState }
| { type: "GetPeripheryVersion", params: GetPeripheryVersion } | { type: "GetPeripheryVersion", params: GetPeripheryVersion }
| { type: "GetDockerContainers", params: GetDockerContainers } | { type: "GetDockerContainers", params: GetDockerContainers }
@@ -3978,41 +4012,45 @@ export type ReadRequest =
| { type: "GetHistoricalServerStats", params: GetHistoricalServerStats } | { type: "GetHistoricalServerStats", params: GetHistoricalServerStats }
| { type: "GetAvailableAccounts", params: GetAvailableAccounts } | { type: "GetAvailableAccounts", params: GetAvailableAccounts }
| { type: "GetAvailableSecrets", params: GetAvailableSecrets } | { type: "GetAvailableSecrets", params: GetAvailableSecrets }
| { type: "ListServers", params: ListServers }
| { type: "ListFullServers", params: ListFullServers }
| { type: "GetDeploymentsSummary", params: GetDeploymentsSummary } | { type: "GetDeploymentsSummary", params: GetDeploymentsSummary }
| { type: "GetDeployment", params: GetDeployment } | { type: "GetDeployment", params: GetDeployment }
| { type: "ListDeployments", params: ListDeployments }
| { type: "ListFullDeployments", params: ListFullDeployments }
| { type: "GetDeploymentContainer", params: GetDeploymentContainer } | { type: "GetDeploymentContainer", params: GetDeploymentContainer }
| { type: "GetDeploymentActionState", params: GetDeploymentActionState } | { type: "GetDeploymentActionState", params: GetDeploymentActionState }
| { type: "GetDeploymentStats", params: GetDeploymentStats } | { type: "GetDeploymentStats", params: GetDeploymentStats }
| { type: "GetLog", params: GetLog } | { type: "GetLog", params: GetLog }
| { type: "SearchLog", params: SearchLog } | { type: "SearchLog", params: SearchLog }
| { type: "ListDeployments", params: ListDeployments }
| { type: "ListFullDeployments", params: ListFullDeployments }
| { type: "ListCommonDeploymentExtraArgs", params: ListCommonDeploymentExtraArgs } | { type: "ListCommonDeploymentExtraArgs", params: ListCommonDeploymentExtraArgs }
| { type: "GetBuildsSummary", params: GetBuildsSummary } | { type: "GetBuildsSummary", params: GetBuildsSummary }
| { type: "GetBuild", params: GetBuild } | { type: "GetBuild", params: GetBuild }
| { type: "ListBuilds", params: ListBuilds }
| { type: "ListFullBuilds", params: ListFullBuilds }
| { type: "GetBuildActionState", params: GetBuildActionState } | { type: "GetBuildActionState", params: GetBuildActionState }
| { type: "GetBuildMonthlyStats", params: GetBuildMonthlyStats } | { type: "GetBuildMonthlyStats", params: GetBuildMonthlyStats }
| { type: "GetBuildVersions", params: GetBuildVersions } | { type: "GetBuildVersions", params: GetBuildVersions }
| { type: "GetBuildWebhookEnabled", params: GetBuildWebhookEnabled }
| { type: "ListBuilds", params: ListBuilds }
| { type: "ListFullBuilds", params: ListFullBuilds }
| { type: "ListCommonBuildExtraArgs", params: ListCommonBuildExtraArgs } | { type: "ListCommonBuildExtraArgs", params: ListCommonBuildExtraArgs }
| { type: "ListGithubOrganizations", params: ListGithubOrganizations } | { type: "ListGithubOrganizations", params: ListGithubOrganizations }
| { type: "ListDockerOrganizations", params: ListDockerOrganizations } | { type: "ListDockerOrganizations", params: ListDockerOrganizations }
| { type: "GetReposSummary", params: GetReposSummary } | { type: "GetReposSummary", params: GetReposSummary }
| { type: "GetRepo", params: GetRepo } | { type: "GetRepo", params: GetRepo }
| { type: "GetRepoActionState", params: GetRepoActionState }
| { type: "GetRepoWebhooksEnabled", params: GetRepoWebhooksEnabled }
| { type: "ListRepos", params: ListRepos } | { type: "ListRepos", params: ListRepos }
| { type: "ListFullRepos", params: ListFullRepos } | { type: "ListFullRepos", params: ListFullRepos }
| { type: "GetRepoActionState", params: GetRepoActionState }
| { type: "GetResourceSyncsSummary", params: GetResourceSyncsSummary } | { type: "GetResourceSyncsSummary", params: GetResourceSyncsSummary }
| { type: "GetResourceSync", params: GetResourceSync } | { type: "GetResourceSync", params: GetResourceSync }
| { type: "GetResourceSyncActionState", params: GetResourceSyncActionState }
| { type: "ListResourceSyncs", params: ListResourceSyncs } | { type: "ListResourceSyncs", params: ListResourceSyncs }
| { type: "ListFullResourceSyncs", params: ListFullResourceSyncs } | { type: "ListFullResourceSyncs", params: ListFullResourceSyncs }
| { type: "GetResourceSyncActionState", params: GetResourceSyncActionState }
| { type: "GetBuildersSummary", params: GetBuildersSummary } | { type: "GetBuildersSummary", params: GetBuildersSummary }
| { type: "GetBuilder", params: GetBuilder } | { type: "GetBuilder", params: GetBuilder }
| { type: "GetBuilderAvailableAccounts", params: GetBuilderAvailableAccounts }
| { type: "ListBuilders", params: ListBuilders } | { type: "ListBuilders", params: ListBuilders }
| { type: "ListFullBuilders", params: ListFullBuilders } | { type: "ListFullBuilders", params: ListFullBuilders }
| { type: "GetBuilderAvailableAccounts", params: GetBuilderAvailableAccounts }
| { type: "GetAlertersSummary", params: GetAlertersSummary } | { type: "GetAlertersSummary", params: GetAlertersSummary }
| { type: "GetAlerter", params: GetAlerter } | { type: "GetAlerter", params: GetAlerter }
| { type: "ListAlerters", params: ListAlerters } | { type: "ListAlerters", params: ListAlerters }