diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 180a6fe..4e9b0d8 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,25 +1,25 @@ lockVersion: 2.0.0 id: 5ca2c9b7-aea6-4a23-a631-998fcc6c18a8 management: - docChecksum: d6a5aa81dd7b887528be46ee0bf93613 - docVersion: 1.0.107 - speakeasyVersion: 1.777.1 - generationVersion: 2.903.2 - releaseVersion: 0.14.3 - configChecksum: bf06c9495b3e1f32fcb236cddf5c7299 + docChecksum: 0f6eaea1c6adf763fb986f7c98144b99 + docVersion: 1.0.109 + speakeasyVersion: 1.784.0 + generationVersion: 2.911.0 + releaseVersion: 0.14.4 + configChecksum: 3d018075ee7c357dc9807f85b1f2022f repoURL: https://github.com/censys/censys-sdk-python.git installationURL: https://github.com/censys/censys-sdk-python.git published: true persistentEdits: - generation_id: 866c6ce2-4512-48e2-be62-1bb5b18a03ae - pristine_commit_hash: 9e9e866a225e6ac195951da5a402f2aa0dc82193 - pristine_tree_hash: c45fa29ac8f854325d7a3ef20388b4c5114ad5cd + generation_id: 2cfbca42-76f0-4213-8ee5-915d39dba7b1 + pristine_commit_hash: 4f39300cc5e5d7a2077bb5c7853f9eaded65dd15 + pristine_tree_hash: bbb5a75073ed01a7433c719e753d8f63162104d1 features: python: acceptHeaders: 3.0.0 additionalDependencies: 1.1.0 constsAndDefaults: 1.0.7 - core: 6.0.29 + core: 6.0.30 defaultEnabledRetries: 0.2.0 downloadStreams: 1.0.1 enumUnions: 0.1.1 @@ -36,8 +36,8 @@ features: nameOverrides: 3.0.3 nullables: 1.0.2 responseFormat: 1.1.0 - retries: 3.0.5 - sdkHooks: 1.2.1 + retries: 3.0.7 + sdkHooks: 1.2.2 unions: 3.1.6 trackedFiles: .gitattributes: @@ -280,6 +280,22 @@ trackedFiles: id: f63e114040a7 last_write_checksum: sha1:e1e88b016631192303b4535e729640e25cd375da pristine_git_object: 4b132d2283c3cc97457da74c63ab0cc133a2c620 + docs/models/clickhousehttp.md: + id: ab39ef967549 + last_write_checksum: sha1:7fbb46e806bfbcf0e78bd80c219eed1f8e18ff01 + pristine_git_object: 89382b53ff4153e424af55aafd815e640532e3c0 + docs/models/clickhousehttperror.md: + id: 917fad17a1e9 + last_write_checksum: sha1:12b69a6b9c572edc56f0637881f9dfb97a162e97 + pristine_git_object: 23227072c20c08fe9c0747c19751e08acaa8c31d + docs/models/clickhousenative.md: + id: 0a050160f72f + last_write_checksum: sha1:b0b61d9da6144ff6e3b15bd492fbb5b6e2e5a64e + pristine_git_object: ca5192920ffdf16ea1fea82785131bbebe3a4994 + docs/models/clickhousenativeerror.md: + id: 82ff5fdba2d7 + last_write_checksum: sha1:f5e80147fab227b08fc83ed98893e4ed2d8026c3 + pristine_git_object: d9c291b5c4f3163a46ed6bf96a3badd6b6e1ba1d docs/models/cmore.md: id: 684b0e25b113 last_write_checksum: sha1:085d0908252b65e72c74f780c7d362bae9f035ad @@ -754,16 +770,16 @@ trackedFiles: pristine_git_object: 9c735895110f3b56d5e26c570d15cf143747c533 docs/models/endpointscan.md: id: 74c09badb875 - last_write_checksum: sha1:c6425d8b7988f5792f5304c57c9c8f948bb74828 - pristine_git_object: fd99838b0673b518e7e506256d6ca6cb1bb4c389 + last_write_checksum: sha1:0cee8d36a37dfb7612a1a2b7dc8bd7bb6b8a1b80 + pristine_git_object: 86448e77d7b6686e0dd466108477d2d69cce5c00 docs/models/endpointscanned.md: id: 3ea99f65fa10 last_write_checksum: sha1:ac0e3f51e3b56992018881630868f2145f006767 pristine_git_object: 329a0199b23767a9ae036c09997ed2899f9ddda7 docs/models/endpointscanstate.md: id: e2ee34e6abd2 - last_write_checksum: sha1:1d0c78d3d0222bdc7434c484a98dd99a8a036cd7 - pristine_git_object: 434ea07b8b4cd580b938af0f4a569dfa9f6fc7cd + last_write_checksum: sha1:c21d1e191945918ab51cecd0b7178297a29a4e31 + pristine_git_object: 465932b9a9f15a83fa0376ffc263ab0e0c3cc106 docs/models/endpointscanstatetransportprotocol.md: id: 70cde6881504 last_write_checksum: sha1:90077eafdf227363cbd2905d0a204ef01a53e16b @@ -912,6 +928,14 @@ trackedFiles: id: 1b8c75f0d35c last_write_checksum: sha1:c3cec4ce493ff21cfc26427ad6d1642a31981506 pristine_git_object: 2efbc40918fabbccce034c15b6a4c22158f7ffd1 + docs/models/gopher.md: + id: 1a97bac7ab41 + last_write_checksum: sha1:8617d11bf3f49f046e70d82639bbe049494a0096 + pristine_git_object: 30748625ce157d359ba80968028c742c23994bc4 + docs/models/gopheritem.md: + id: 8dcb591a2e3a + last_write_checksum: sha1:8badd8d6de4e028b91c539ff61393912be1e1ede + pristine_git_object: a4581b87bfe3c5daedc05ca38a0a576c3b7a185b docs/models/granularity.md: id: 3cee51c03dea last_write_checksum: sha1:5f43cd835ed8d1ae9641d288f795feab301500bc @@ -972,6 +996,18 @@ trackedFiles: id: 59877d4ca144 last_write_checksum: sha1:a71c4d7c55ab2b459d878afd97eeb1d7fc281b60 pristine_git_object: 1c0b3433dd61d54161c0e257dbf85536029aee58 + docs/models/hostenrichment.md: + id: ccefd65293aa + last_write_checksum: sha1:036c114d6bf49d24c2a503d8bfcc3c3d4c9642a9 + pristine_git_object: c36f53d5e157b0a01c5c2438ee2feada8a1b80f7 + docs/models/hostenrichmentasset.md: + id: "928151057873" + last_write_checksum: sha1:de727c11d7861d48ec3587d3f6f5fa3fa7a3af3f + pristine_git_object: a5e325ad83ab639804e5b28409b46d2f3a9594cc + docs/models/hostenrichmentservice.md: + id: 8f9f50391cbb + last_write_checksum: sha1:8688978edb45049e8abab3666958e607a3d392c2 + pristine_git_object: 123892be5bf3dae6ea2be6af5ffb6cdc0cfca903 docs/models/hostnameport.md: id: 14aafa969ab8 last_write_checksum: sha1:7669ffb60792d12cecc3884c29cf07dccb34bf53 @@ -1288,6 +1324,26 @@ trackedFiles: id: a3c21c182bf8 last_write_checksum: sha1:117ba0062fddb9725c95551d488374f9cdc78a38 pristine_git_object: ac6665971ddaab09a823b4b3f9f50114d134b020 + docs/models/malloryai.md: + id: 6dd469e68781 + last_write_checksum: sha1:5d48e2e31aaa3bacbed1473572d98ce11745a581 + pristine_git_object: 07fe8cf7a3de1a24eb69ccfe6e9905623862d002 + docs/models/malloryaiobservable.md: + id: f2e715171caf + last_write_checksum: sha1:d39c99c477c7b7c839815f9094426fbfa8db9520 + pristine_git_object: a6e99a970f8ede7a262118b4907f7aa508b81a4b + docs/models/malloryaiopinion.md: + id: a027f2962d53 + last_write_checksum: sha1:812986044cf92a187d6173bd7b034f103cc77b2d + pristine_git_object: 390ecc8885389ba0be69708a4c4d2091518836d7 + docs/models/malloryaiopinionattributes.md: + id: b008e67d8870 + last_write_checksum: sha1:88e3f803bad61e6ac03ef171c51973a88294d47c + pristine_git_object: afc7d03b9b04714d2b172cc0e3cd16d16ba6b2fb + docs/models/malloryaiverdictsummary.md: + id: 0958a8709eb8 + last_write_checksum: sha1:456342b98212d6e9abe17734d108b18aa3a9894c + pristine_git_object: e943926f93c8a9d428959ac0ea144a414f660d2c docs/models/matchedservice.md: id: d4515aa8453a last_write_checksum: sha1:06d4d27dd8a8678723dd7114e015f624ca754fa1 @@ -1616,6 +1672,14 @@ trackedFiles: id: c238abc1fd4f last_write_checksum: sha1:a0e65fb2f2c9c5f310aa46a9a5501b6233094feb pristine_git_object: c9df44dec9d6fb8f99826b2c310a7846658d4890 + docs/models/openflow.md: + id: e983aa41e36f + last_write_checksum: sha1:de2cd890ff4ea4c18ee267c41949ea9fcac933fc + pristine_git_object: a4e26eedaeccc278c895442e4269b52f22259b48 + docs/models/openflowhelloelement.md: + id: e5e2facfb985 + last_write_checksum: sha1:1bc232433058373ef405f4490ae5ffc75427c3be + pristine_git_object: ef75d8abcbbfeda59d69cd68dfd86687c1d7b7cd docs/models/openvpn.md: id: 78daf757fc35 last_write_checksum: sha1:379955771acb5b5584e917cdb2bc609092221693 @@ -1952,6 +2016,14 @@ trackedFiles: id: a706da091200 last_write_checksum: sha1:012547703296a6c341613f2c73d42e0ce3c28335 pristine_git_object: 65d56dce3b47037e8d808a12153b4f99c0843b26 + docs/models/reolinkbaichuan.md: + id: 513066719e7b + last_write_checksum: sha1:55c8e039371f9c7b2019e55012a89ebd24e0143c + pristine_git_object: 49fee3b255bf380894337cdf28f3720dd45a0c6f + docs/models/reolinkbaichuanalarmchannel.md: + id: 0156915600aa + last_write_checksum: sha1:54b6592531359cdd018527e0e322af0fceae3f4e + pristine_git_object: 4f87702d347c482b7ad80bd161f9574cbdf3f3ee docs/models/replaycapabilities.md: id: dc46cb1280c5 last_write_checksum: sha1:2caca5c4f70330b3a2361d5cc007b1e303a979c0 @@ -2040,6 +2112,10 @@ trackedFiles: id: 3a27c86f15fd last_write_checksum: sha1:9c564116ca0e4c06f3cc752dc1d2a71888b73f78 pristine_git_object: a56fb96d14eec396912f48fbace33417d058c7b1 + docs/models/responseenvelopehostenrichmentasset.md: + id: ef20797fd98f + last_write_checksum: sha1:60a0ab3e3d7c55c7b805a02517c2a0eb289bd552 + pristine_git_object: 104bc24bd1fe7f775763466278ba1f835297ea84 docs/models/responseenvelopehostobservationresponse.md: id: 754a542de7b1 last_write_checksum: sha1:77476405819cba49ebefbddb3a08ffa6debf85a4 @@ -2220,6 +2296,14 @@ trackedFiles: id: 43e5235424c8 last_write_checksum: sha1:3407a338189668781826bc04d0d4bbc2163a56e0 pristine_git_object: 26aa1ef5b7ef91bed7aa9ffae302584d46dd2bb6 + docs/models/rtmp.md: + id: 6e522dc381d9 + last_write_checksum: sha1:c8b5dd2f5099203a7c6db4b7bee90535709f1977 + pristine_git_object: d57a5d9fc92e9beedd71473ba64ecd462376fba1 + docs/models/rtmpconnectstatus.md: + id: f9315c84fa19 + last_write_checksum: sha1:bc735f17f98145e41bdfaacb7cc256114783b683 + pristine_git_object: 1daf9cba878dda2a57bcfc117c89fa14c68b54e2 docs/models/rtsp.md: id: 54f0194570d7 last_write_checksum: sha1:4f9ed5f792358ccafbcfb6707026adf3e0acdb15 @@ -2402,8 +2486,8 @@ trackedFiles: pristine_git_object: 61ab9835916f66983134f42416d3c9c860c00420 docs/models/service.md: id: d38041323049 - last_write_checksum: sha1:72c4d681d97cae2ad0004a2113b40a5fdddab94e - pristine_git_object: 72d9a2d3b662e03e682642925fcb3e26f54e5db4 + last_write_checksum: sha1:d0116ae5591d90050e6f631b1b0aca085cb52457 + pristine_git_object: 7b9e416b7be63cc2292c8ca1ff58008058d252b0 docs/models/serviceid.md: id: 78670c733096 last_write_checksum: sha1:4388c75f08f99206fc758d5d47396f1a13fd37e1 @@ -2418,8 +2502,8 @@ trackedFiles: pristine_git_object: bc2f400913efe8d7b2e01c2f6ed70f84b7937915 docs/models/servicescan.md: id: 5079b5eb4109 - last_write_checksum: sha1:0bbad062e425782c9a8ca4ab5c96624f4d4e308b - pristine_git_object: cc450cfdec0c0002fff4e9391248b0e21013a05f + last_write_checksum: sha1:0e202d7753a72f6c23834946f60b5321bdb01072 + pristine_git_object: 11fe587495e6f77db298827e33d008cc458a08f9 docs/models/servicescanned.md: id: 8783aac64d52 last_write_checksum: sha1:95fa8c18ec2267c5969827ee2576a45c793fc904 @@ -2612,6 +2696,10 @@ trackedFiles: id: a1bb299d5525 last_write_checksum: sha1:bdb44a9dd40553e9a66919cac1973d6fa110dae6 pristine_git_object: e9a37d31cecd2e1805c3d8ae89049cef2e9f7754 + docs/models/synergy.md: + id: bbad33d4cde4 + last_write_checksum: sha1:bc132a9e37e4f2b4ca436ea671ccf7a7ee8cdef5 + pristine_git_object: 43f2b996fa664c5aaf37870168fa19ba5496ee82 docs/models/systemcapabilities.md: id: cffaed2afe8b last_write_checksum: sha1:1d714145d1cd8f1f2c9f72ed11ce9a6263b9d4af @@ -2684,6 +2772,10 @@ trackedFiles: id: 5b5c1e2b5480 last_write_checksum: sha1:9be9b4b02e58bad5f5faee649edd1482ea26e0e9 pristine_git_object: 2f8c4442e493101d51e56f36f9b278a444342c0a + docs/models/thirdparty.md: + id: cc133818907a + last_write_checksum: sha1:65197437b1459093c4b6996e611e3e00dac8b51a + pristine_git_object: e005a995bd8a0100e163ea4945b615604e71ab34 docs/models/threat.md: id: 7fe91844e634 last_write_checksum: sha1:4fc05a1d268a80b5a832804169b9291ab62ff5fe @@ -3116,6 +3208,18 @@ trackedFiles: id: 05a955c20203 last_write_checksum: sha1:87c461d8b8e8ded06b7d40352e927b40f3ef2957 pristine_git_object: ca5ed383bba1a0205f9ab79dba6ab792e7793c4c + docs/models/v3globaldataassethostenrichmentglobals.md: + id: ca54cf1dd0e5 + last_write_checksum: sha1:f2fd38bdf475fce77afd53b48882731690429aa9 + pristine_git_object: 693fc687726e56fb1b60c31a56f64eb5681cffc4 + docs/models/v3globaldataassethostenrichmentrequest.md: + id: f729fb528f42 + last_write_checksum: sha1:71ebf61d2e352692c75956a66ac08a11554c1da4 + pristine_git_object: 20cfbafef2a99a190510c0a3f8fc1584ce737962 + docs/models/v3globaldataassethostenrichmentresponse.md: + id: 92d2b56c5416 + last_write_checksum: sha1:a7fd09c686e49ab51fc4ee35ead56158e2698496 + pristine_git_object: 03983d518a2483e74693f8bea0d29240d3f8eb1a docs/models/v3globaldataassethostglobals.md: id: 4e68df65e9ed last_write_checksum: sha1:20f1e2ef95c15fa3d2ecbd3d463b962c9c761bff @@ -3608,10 +3712,18 @@ trackedFiles: id: 0b52220600aa last_write_checksum: sha1:6db90fa2eccf0c7416c50d6bae36067f71f2293c pristine_git_object: 5af83cad3ea51fb5c90f0787fa3ffe95f1eded31 + docs/models/wincecerdisp.md: + id: e24169a49678 + last_write_checksum: sha1:7c7793fdc55482f654c7d083fdd8c983256d0457 + pristine_git_object: ae284facf410aff118d4b097285b68fa4001a5aa docs/models/winrm.md: id: 65d1bf097000 last_write_checksum: sha1:bc6408384348efbea3a57ac915fc72c3b4f000fc pristine_git_object: a281c103e41277b7dee5d321ef61680622863f71 + docs/models/wordpress.md: + id: dc7054c45fea + last_write_checksum: sha1:f39bdae258f5e3c3de8ec889d9ffe3c948af251d + pristine_git_object: f3477c247253fd31f98da1af5a3928b2c717dda5 docs/models/worker.md: id: 159a9ce13573 last_write_checksum: sha1:f844ac637835a4b029281f62d2500b7f54053fa8 @@ -3654,8 +3766,8 @@ trackedFiles: pristine_git_object: 7c00028bb7ac927b2a2a51c23903759c44d6207c docs/sdks/globaldata/README.md: id: 0c68886632e6 - last_write_checksum: sha1:689acccd3ce95031c529fae5f56634888e3ecc39 - pristine_git_object: b1095525259e7d09028dea2fa0069efaeb069689 + last_write_checksum: sha1:f33437f41944923bef3eb2f3303d27807d8c61cb + pristine_git_object: 4412fe377b910b71bcfe8d0eb8d0fd0cd7e4a709 docs/sdks/tagsandcomments/README.md: id: 092d693513d0 last_write_checksum: sha1:b55277bc96e17b34da0b308dd923aadb9f69b7db @@ -3678,8 +3790,8 @@ trackedFiles: pristine_git_object: bfd8691be4b4b5ee9f2c4baf849970d807ade207 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:4e03642cdc2b00b7537d46ccafc0dcc6dcb6ad2c - pristine_git_object: a928e4354af32d65249d49226295b1beb199374e + last_write_checksum: sha1:711de8d0515952109196dd47d7e7ab56ba5c98ef + pristine_git_object: 242c34a5746d3a59adb998b87859237496b60812 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:10d6ae008b24c68e99d7e8ba9c2e747070685ead @@ -3706,8 +3818,8 @@ trackedFiles: pristine_git_object: 352d3691d91c2d0ba0f05b48b56d4df5ce520098 src/censys_platform/_version.py: id: d2dc39704c23 - last_write_checksum: sha1:0ff3fa3cccc9afe833a990881c701e5f7bf3d47e - pristine_git_object: 22057bc0aea611a0710c991f4a28647c0891e16e + last_write_checksum: sha1:75cea1701b29fa40fd4bd73a1f0b36454b9b67f4 + pristine_git_object: d3aea592e05be5e17fe7987bb6855cb6062b476d src/censys_platform/account_management.py: id: 09993862b047 last_write_checksum: sha1:09f4a14d8ae7684622d2d8633656f043c3ae9bef @@ -3726,16 +3838,16 @@ trackedFiles: pristine_git_object: b4c0522c33e5d68f3335930c11d21ec93fbf2c56 src/censys_platform/global_data.py: id: 0eedbf9a2038 - last_write_checksum: sha1:9041016f3cafc9826264accf81dc9c84b808ebef - pristine_git_object: 2bee92e444caa9292d36277e66d654950bd9c0f0 + last_write_checksum: sha1:59441e31a5cea38f7ab939d7bce41dc8a950a535 + pristine_git_object: ca06df28512eebf9cabbe5a0b9eb0a0333fc8768 src/censys_platform/httpclient.py: id: 9378a19c2de6 last_write_checksum: sha1:5e55338d6ee9f01ab648cad4380201a8a3da7dd7 pristine_git_object: 89560b566073785535643e694c112bedbd3db13d src/censys_platform/models/__init__.py: id: 4c65ae1e4fed - last_write_checksum: sha1:3fdb7fc4ee23012df8a8a8c547af98fda6c99e32 - pristine_git_object: 7815035bf29a8f8b2d509b712cdb54ed527682a1 + last_write_checksum: sha1:3abfd1e3e090b54f5cb149ec4b245d2b5b22ee34 + pristine_git_object: e7313f6147c24e7273db7909923919e4ddf8c896 src/censys_platform/models/activemq.py: id: c852b87bc559 last_write_checksum: sha1:a754dc1ce0647be6304994e4c598c533e0db974e @@ -3924,6 +4036,22 @@ trackedFiles: id: 2171ffb94e91 last_write_checksum: sha1:e59c0bc73a16af719e2f82962f57176d13d52411 pristine_git_object: da9e8d75c2b65f0a8d5ddc6864707c61c8e87d64 + src/censys_platform/models/clickhousehttp.py: + id: 7cbbc9eeb0b4 + last_write_checksum: sha1:df39af59cbca3c6851585db95b90554cc22fcb26 + pristine_git_object: 2a50f16c5f8b36363d5d2e9c9d9ac6bfa130a9fc + src/censys_platform/models/clickhousehttp_error.py: + id: 1832723e6c5f + last_write_checksum: sha1:59612f8102a9ee0567407a34a5cab551f37dd7e3 + pristine_git_object: 0d89d6d155dfc22f93634a5c64456e4f10b6f618 + src/censys_platform/models/clickhousenative.py: + id: 209344b0696a + last_write_checksum: sha1:78f5f83386775d8b4bad8390152ba606985ac7a9 + pristine_git_object: 07b77b286f86edfab11a374cede5a042dc6399e1 + src/censys_platform/models/clickhousenative_error.py: + id: 4b6f01caac75 + last_write_checksum: sha1:b0d2d8c28e603d7cf342fa083c99bd733aa2f674 + pristine_git_object: 940ce3cc2dc5a1560485a6905138ac9aceccb614 src/censys_platform/models/cmore.py: id: e2a00b9c7132 last_write_checksum: sha1:95f23da7a621b81c2dc081f10cbb7ea162ecff15 @@ -4334,16 +4462,16 @@ trackedFiles: pristine_git_object: d3af93915b99c62422a93dbc7f9dae79417c546b src/censys_platform/models/endpointscan.py: id: e9034f3e14f9 - last_write_checksum: sha1:7f5a5fe76f98990be54ec528bc7be3c2dd0c93e9 - pristine_git_object: 8f71d8713e263f957c020701693840e12c9afb1c + last_write_checksum: sha1:f1283d08dbca3ebd2a47f94e2fff864fb9f678eb + pristine_git_object: e05a0c4b388eebd07d6e756d038e4a4f29f818c2 src/censys_platform/models/endpointscanned.py: id: 62ea4d26c40d last_write_checksum: sha1:2afb8006679248fb848b4d2ef87caa4e143f892b pristine_git_object: a9984383bd95fc929bbf9ae60a98068b10155e5f src/censys_platform/models/endpointscanstate.py: id: 7b8f1fb78573 - last_write_checksum: sha1:ef9973765713cf28ac37311a9ae4004452be5089 - pristine_git_object: d6125241c7a4a9f1a76d0b1a240fc22bbf19fba2 + last_write_checksum: sha1:a39bc1f522f35a7f6d391b39cbd3806d9da544c6 + pristine_git_object: 56cb6e257f9741859f67e70c2ceaced727c97daf src/censys_platform/models/epmd.py: id: 8088ccd12b02 last_write_checksum: sha1:418687e71656a7120501c2af1043db1dfc0b7109 @@ -4484,6 +4612,14 @@ trackedFiles: id: 3d859a5f9356 last_write_checksum: sha1:7dfdaa94ebb883829258583b23ca38957b739049 pristine_git_object: 6dd8dd9150459ab60f80ea9b50e88d0cddb80dbf + src/censys_platform/models/gopher.py: + id: 82b5287122c4 + last_write_checksum: sha1:34d549e139068eb39cbfcfc26c25bdcd71f94e14 + pristine_git_object: 1e402a6478331f8bc90eaf89f8ba309db41d374b + src/censys_platform/models/gopher_item.py: + id: b977924a396c + last_write_checksum: sha1:6badcb284b4b172186200280cddce3ed00ff0a21 + pristine_git_object: 9b018afa8362f25d9a2306f2136f8772c4226372 src/censys_platform/models/graphql.py: id: e91c41786b5a last_write_checksum: sha1:ce8b36dad7f7437001421d38692de5769d02c554 @@ -4540,6 +4676,18 @@ trackedFiles: id: a0b22d1e690d last_write_checksum: sha1:d8f57f12f63ed46560cdc6ab0f26e3701f5c563b pristine_git_object: d1b774ea75d32c613bad1e6fe147ae5ebe5f1dbe + src/censys_platform/models/hostenrichment.py: + id: 500665f5218c + last_write_checksum: sha1:dcd95c2077223e2a40d4f9c00386443d547d5ad2 + pristine_git_object: ece96502db5c2df38d86539febd756c6924a9894 + src/censys_platform/models/hostenrichmentasset.py: + id: 6845bb7ae3e6 + last_write_checksum: sha1:af72a4225014d12c0db1226283f7d1f83bdb2a5c + pristine_git_object: 7e923cc948db006d5908532a296ebbaef76af330 + src/censys_platform/models/hostenrichmentservice.py: + id: aba13ecfb790 + last_write_checksum: sha1:a5ced1f7e35881119c56f2791792d85c53460c26 + pristine_git_object: baee49c87826dfc7b9351ab22bedc6d16d1faab4 src/censys_platform/models/hostobservationrange.py: id: aa288339619a last_write_checksum: sha1:110ea596733baefa3cc3b0330ad98b043ea18a0c @@ -4832,6 +4980,26 @@ trackedFiles: id: e755afe2e4ac last_write_checksum: sha1:059d451235f2d4180e97da989b04ed356a5e8bda pristine_git_object: ef096ed69a7a6117f76be63bf7c3a872228ccd45 + src/censys_platform/models/malloryai.py: + id: 31dde0200321 + last_write_checksum: sha1:e3dff96f8eb819f98b274d3a211a729be1a216d1 + pristine_git_object: c0dc1cb088ef11e3fb463b9a793ed0be81990bc8 + src/censys_platform/models/malloryai_observable.py: + id: 0abd0b360653 + last_write_checksum: sha1:bc0398df013e38a323e63a847c44f34c15aa7d51 + pristine_git_object: 7df26a9eed21f60a093e45d523efe61214a978bd + src/censys_platform/models/malloryai_opinion.py: + id: 6b9e2d83f6ce + last_write_checksum: sha1:0465a5d5b6c1170ff65e7fa184d6481be7d858d1 + pristine_git_object: 20c6727dbf3bb7dcd14117c89f79ef547327b1d1 + src/censys_platform/models/malloryai_opinion_attributes.py: + id: a02cdd4c6e20 + last_write_checksum: sha1:2dcb2a500108223fa0506d2427f30ca99cad1f2d + pristine_git_object: c11c39ed7f7182aaf12602341bb295f3db4210ed + src/censys_platform/models/malloryai_verdictsummary.py: + id: 4b1a23274962 + last_write_checksum: sha1:13b29425e7176cb41f5f721910243e7b990f4871 + pristine_git_object: 4b9b0a689d88d08fde1e8d23595b66ff8a4e97fc src/censys_platform/models/matchedservice.py: id: 8ac9ef9d68c0 last_write_checksum: sha1:3a505cae85add02756dc3c5a6c6b6a0fc83a963b @@ -5152,6 +5320,14 @@ trackedFiles: id: eb8ac3ebfa26 last_write_checksum: sha1:669f523b10892bf600e5e888832393f0bb91f49e pristine_git_object: d989e6423e7629424eb507b6ca38ba2af8144c96 + src/censys_platform/models/openflow.py: + id: 43ec8eb33192 + last_write_checksum: sha1:8cc0b55fec15bf4812f12220f23b590f9b9a532f + pristine_git_object: 55ce93ce53c12bd69942d3df55384e0a266e08ae + src/censys_platform/models/openflow_helloelement.py: + id: 53f629e8c60d + last_write_checksum: sha1:0633d54666f630a73ff65aa81d0f4c3664a02c54 + pristine_git_object: 4fb67492153350e46e36af58cfbadba0a31de065 src/censys_platform/models/openvpn.py: id: fd2d4424ef7c last_write_checksum: sha1:d95119c5303fb25a5e6fdc836f987fd866d7badc @@ -5424,6 +5600,14 @@ trackedFiles: id: e3227f28ecbd last_write_checksum: sha1:a00d65885b5d1794a03dc5a31370470472f2d3e6 pristine_git_object: 9273280a5e8d7e081e866a0eb5ac47c77ecdfa42 + src/censys_platform/models/reolinkbaichuan.py: + id: 44cfe24b7245 + last_write_checksum: sha1:26c7c508f1344b9f55b472c959cfbdada0bdc6e0 + pristine_git_object: bf8723177288443e6ea4c68b68e52a794e60d1b3 + src/censys_platform/models/reolinkbaichuan_alarmchannel.py: + id: c8de56d49165 + last_write_checksum: sha1:021b7cf7f8f480c78a55ee1cf61d3d43cd168d61 + pristine_git_object: ec75b48bb140fbf12421151d8485c1de016015f4 src/censys_platform/models/replaycapabilities.py: id: 2dec08a9f8c4 last_write_checksum: sha1:37f93199ee069f471c0dd81e61aba2dbc32c5f47 @@ -5508,6 +5692,10 @@ trackedFiles: id: 992a65c9b63c last_write_checksum: sha1:7f7b5f3d77e1c82ff8941d689cd89f01677f7acb pristine_git_object: 83cc56c96ec66998fda26307e8c3629242ece2e1 + src/censys_platform/models/responseenvelopehostenrichmentasset.py: + id: 0dd1a1b7a431 + last_write_checksum: sha1:f09c058419a08010fd096293deac3813877393d9 + pristine_git_object: 93594e7368e73b90551a8f29cca275003d331fbb src/censys_platform/models/responseenvelopehostobservationresponse.py: id: 05554f165d80 last_write_checksum: sha1:2ee8e4f4dda279b8b74da3501d80c8ff30cc00a3 @@ -5680,6 +5868,14 @@ trackedFiles: id: c622437705b4 last_write_checksum: sha1:400a370f9e841439ee71d3e2400e72486c5cb344 pristine_git_object: b407a246fa3d8c088ac7189df519da6b179a8c37 + src/censys_platform/models/rtmp.py: + id: 441382f9be57 + last_write_checksum: sha1:cc3ab7a083349761c927c4c7718c9df91e6d124d + pristine_git_object: a85b7a5ac888b8b21affa995e019b80ae5d28fa6 + src/censys_platform/models/rtmp_connectstatus.py: + id: cfdc8987f1f0 + last_write_checksum: sha1:a347d9ee22090bd19f89c0ca1b6588920a498f71 + pristine_git_object: 7da64d20538666727d2c6cee1131804e0bcb89c3 src/censys_platform/models/rtsp.py: id: ef3576bdc22f last_write_checksum: sha1:ca153a17d2a12840afbc502a3f2abf64bcf5eddd @@ -5842,8 +6038,8 @@ trackedFiles: pristine_git_object: 88a109718356961a048e8c8c432885e6191e5292 src/censys_platform/models/service.py: id: 25dc1044897b - last_write_checksum: sha1:89f1540d752c39ea6b77d7a0470b68ac7c340132 - pristine_git_object: f780a8789b1cfb55b46fdae5d196dd62ac939f6b + last_write_checksum: sha1:1c3b99c28f55e91f66f7637a1748c6ebf64dbe16 + pristine_git_object: dbb27b28399b4e5728cb61a97e856a51fef8eb85 src/censys_platform/models/serviceid.py: id: 52a5b098ac72 last_write_checksum: sha1:a179ab2be8d3b5670d9f0e2174c807f96d3560cb @@ -5854,8 +6050,8 @@ trackedFiles: pristine_git_object: ee6e0658c1552e310381fdcdb70cbcc974189e85 src/censys_platform/models/servicescan.py: id: 24c47a42f886 - last_write_checksum: sha1:36324e720caeb1f70067864eab6a7f4b9dfcfe5e - pristine_git_object: eafa8512f384a5f6f37d639775c4a63b546086d8 + last_write_checksum: sha1:dc96e3d6bc1613dcec746c0a38b273682ba2e432 + pristine_git_object: 5ec09810d527174db74a4dd04c80f957076770c9 src/censys_platform/models/servicescanned.py: id: 7a118692950e last_write_checksum: sha1:a59c5fead929828e5130c6ee43818cb9d0db9f9d @@ -6020,6 +6216,10 @@ trackedFiles: id: 228de191a4ee last_write_checksum: sha1:f1a94b0abc98bee681e95a69ecf766f354fc4f23 pristine_git_object: 13da387d173067a261008076642ea37886a4a922 + src/censys_platform/models/synergy.py: + id: 093cb88ca4b7 + last_write_checksum: sha1:ab6565238a184d4809c1866500960004f353302f + pristine_git_object: 70442f85fc680ce37456fe6365533ac32f2ecc26 src/censys_platform/models/systemcapabilities.py: id: f5e6cedda63f last_write_checksum: sha1:5b51a77b0b5750cd892582a34416c3b35514f833 @@ -6060,6 +6260,10 @@ trackedFiles: id: 7047642afcc7 last_write_checksum: sha1:361a09b2e7257704fe6b91f53ce101320b88008a pristine_git_object: f9bd53751d12fc5958eab6a962113ecb29602a3b + src/censys_platform/models/thirdparty.py: + id: 3dc02257dbf6 + last_write_checksum: sha1:888fac849ce93048dcf1020b3277a146ac1b3761 + pristine_git_object: 4a5aa7969740c1d08fcd8ca3650ce65993df506c src/censys_platform/models/threat.py: id: 6e8ab6e20796 last_write_checksum: sha1:ed20a50b6b3c5bc167983cb95a76b075693c6b81 @@ -6284,6 +6488,10 @@ trackedFiles: id: 5ba0c7970383 last_write_checksum: sha1:a94680dfff2f6db79a6f5531809165ce298c7241 pristine_git_object: 96d29986b479a9b37eb132456a48a8fd9313477c + src/censys_platform/models/v3_globaldata_asset_host_enrichmentop.py: + id: 8287b8608cd9 + last_write_checksum: sha1:f496f84e6121a05b483ee9559fc3cdf641b75043 + pristine_git_object: 370a30149f776b1d112a4433806cd589ba1fdd6f src/censys_platform/models/v3_globaldata_asset_host_list_postop.py: id: 642c2e63ff60 last_write_checksum: sha1:ba3b995db93a6b56d4735e373030a7312ba4a6c3 @@ -6472,10 +6680,18 @@ trackedFiles: id: b32a21ffa7f6 last_write_checksum: sha1:10176f6cb141341c2a58bd5abf0b8bcb7cb973e6 pristine_git_object: 7e3df7b17c7916ead098a21b968ff82f61a7826a + src/censys_platform/models/wincecerdisp.py: + id: 0b0fad576baf + last_write_checksum: sha1:7c416453592d47933e7df025a2b8c0bc00e22faa + pristine_git_object: c17379dbec5b9956722a2bdc140527a34c091aa3 src/censys_platform/models/winrm.py: id: aad01f19c66b last_write_checksum: sha1:c2d77e908ac194556f6e428fbf2cd8319fa7b5ff pristine_git_object: 7e62192db12366a389823ead8486a163eb40f385 + src/censys_platform/models/wordpress.py: + id: e6e816c0f619 + last_write_checksum: sha1:422a0c3c1597592ade2f7f822fbdac08e4cece1a + pristine_git_object: 3a4f3f0a3b496b7485d33b9c998ffcffeb4a3a1a src/censys_platform/models/worker.py: id: 04e55a63084e last_write_checksum: sha1:ca5859b6484c11b4cf71c45f6f4ebf1603dc0234 @@ -6530,8 +6746,8 @@ trackedFiles: pristine_git_object: faa268137bc01c9d08cfadc4797017db48747a96 src/censys_platform/types/base64fileinput.py: id: ccba2556f533 - last_write_checksum: sha1:4780e893d3853b5a6e28d9a6ca3ee102ce0f502d - pristine_git_object: 25fc53989ed497649363f983219fc58705c8bf87 + last_write_checksum: sha1:1522687ae3398374c35710cad993a6e82b5ab99d + pristine_git_object: 862566fe2b1db830276b390e136e65090e5963d2 src/censys_platform/types/basemodel.py: id: 0cf83f7ce28c last_write_checksum: sha1:10d84aedeb9d35edfdadf2c3020caa1d24d8b584 @@ -6558,12 +6774,12 @@ trackedFiles: pristine_git_object: 3324e1bc2668c54c4d5f5a1a845675319757a828 src/censys_platform/utils/eventstreaming.py: id: 79888c9b9f71 - last_write_checksum: sha1:cad7e4feff4f1b2824afd0d30f2b1964a604f4dd - pristine_git_object: 1c189bf6fcad7ba90e0ec6d2f36ca7329d33bb99 + last_write_checksum: sha1:7d1dc68f8b48486ab646653aa05cc38752e1f912 + pristine_git_object: a8d4fe5cc88d3c7337339e1b36a61bbf7ca8c4eb src/censys_platform/utils/forms.py: id: e6173af8260d - last_write_checksum: sha1:15fa7e9ab1611e062a9984cf06cb20969713d295 - pristine_git_object: f961e76beaf0a8b1fe0dda44754a74eebd3608e7 + last_write_checksum: sha1:a971cdb120ad3d416d296d5d0ad89e4808350a7f + pristine_git_object: fdf0dc9b2a67bca773eefe6b471498cccaa83424 src/censys_platform/utils/headers.py: id: 8b7139bcc5c1 last_write_checksum: sha1:7c6df233ee006332b566a8afa9ce9a245941d935 @@ -6586,8 +6802,8 @@ trackedFiles: pristine_git_object: 591415af8e64baa410627b507d2740afb5387d13 src/censys_platform/utils/retries.py: id: d5aceef1f0a1 - last_write_checksum: sha1:471372f5c5d1dd5583239c9cf3c75f1b636e5d87 - pristine_git_object: af07d4e941007af4213c5ec9047ef8a2fca04e5e + last_write_checksum: sha1:3585b891142f30a597fbf7a2f0340700babef8e4 + pristine_git_object: ca7b59efebbbd9545744d0207ef42725c4cc5143 src/censys_platform/utils/security.py: id: 1559cefe0793 last_write_checksum: sha1:c11eef495b6aaa249178c24c796940cc540b7a00 @@ -7712,6 +7928,22 @@ examples: application/problem+json: {"detail": "Property foo is required but is missing.", "instance": "https://example.com/error-log/abc123", "status": 400, "title": "Bad Request", "type": "https://example.com/errors/example"} "500": application/problem+json: {"detail": "Property foo is required but is missing.", "instance": "https://example.com/error-log/abc123", "status": 400, "title": "Bad Request", "type": "https://example.com/errors/example"} + v3-globaldata-asset-host-enrichment: + speakeasy-default-v3-globaldata-asset-host-enrichment: + parameters: + path: + host_ip: "8.8.8.8" + query: + organization_id: "" + responses: + "200": + application/vnd.censys.api.v3.host-enrichment.v1+json: {} + "401": + application/json: {"error": {"code": 401, "message": "Access credentials are invalid", "reason": "Access token is not active", "status": "Unauthorized"}} + "400": + application/problem+json: {"detail": "Property foo is required but is missing.", "instance": "https://example.com/error-log/abc123", "status": 400, "title": "Bad Request", "type": "https://example.com/errors/example"} + "500": + application/problem+json: {"detail": "Property foo is required but is missing.", "instance": "https://example.com/error-log/abc123", "status": 400, "title": "Bad Request", "type": "https://example.com/errors/example"} examplesVersion: 1.0.2 generatedTests: {} generatedFiles: diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index d088ba4..00692fd 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false python: - version: 0.14.3 + version: 0.14.4 additionalDependencies: dev: {} main: {} @@ -47,6 +47,7 @@ python: description: Python Client SDK Generated by Speakeasy. enableCustomCodeRegions: false enumFormat: enum + errorSchemaValidation: true eventStreamClassNames: async: EventStreamAsync sync: EventStream @@ -87,6 +88,7 @@ python: pytestTimeout: 0 rawResponseHelpers: false responseFormat: flat + responseSchemaValidation: true sseFlatResponse: false templateVersion: v2 useAsyncHooks: false diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 2f4e053..a70cdab 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,20 +1,20 @@ -speakeasyVersion: 1.777.1 +speakeasyVersion: 1.784.0 sources: converge-source: sourceNamespace: converge-source - sourceRevisionDigest: sha256:5db2b1f0584d9707b7d1e63346dfa16dc264cbd6c19da9d610538e10b5817ba1 - sourceBlobDigest: sha256:e17252e4a3992c9b8d88e29dd91e829d55d25dfe01cb509155adcb81b2c32ce5 + sourceRevisionDigest: sha256:d646763b45111ed16071b7796e19c5130d085fc5b923118f740c3c4ab544be0a + sourceBlobDigest: sha256:1be666a0e8fe9a4217c2dea1110101bcf027cf48df8508b6c8810081db1c6068 tags: - latest - - 1.0.107 + - 1.0.109 targets: censys-sdk-python: source: converge-source sourceNamespace: converge-source - sourceRevisionDigest: sha256:5db2b1f0584d9707b7d1e63346dfa16dc264cbd6c19da9d610538e10b5817ba1 - sourceBlobDigest: sha256:e17252e4a3992c9b8d88e29dd91e829d55d25dfe01cb509155adcb81b2c32ce5 + sourceRevisionDigest: sha256:d646763b45111ed16071b7796e19c5130d085fc5b923118f740c3c4ab544be0a + sourceBlobDigest: sha256:1be666a0e8fe9a4217c2dea1110101bcf027cf48df8508b6c8810081db1c6068 codeSamplesNamespace: converge-source-python-code-samples - codeSamplesRevisionDigest: sha256:33499d9fb0def70474649974ed631c43cc7a6d82954bf243aa4fb99b5e9e8914 + codeSamplesRevisionDigest: sha256:c2d6f81533098dac6738f7868318914822df4cd807bbd25810a904715407da17 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README-PYPI.md b/README-PYPI.md index 3238a08..bc73013 100644 --- a/README-PYPI.md +++ b/README-PYPI.md @@ -218,6 +218,7 @@ asyncio.run(main()) * [get_certificates_raw](https://github.com/censys/censys-sdk-python/blob/master/docs/sdks/globaldata/README.md#get_certificates_raw) - Retrieve multiple certificates in PEM format * [get_certificate](https://github.com/censys/censys-sdk-python/blob/master/docs/sdks/globaldata/README.md#get_certificate) - Get a certificate * [get_certificate_raw](https://github.com/censys/censys-sdk-python/blob/master/docs/sdks/globaldata/README.md#get_certificate_raw) - Get a certificate in PEM format +* [get_host_enrichment](https://github.com/censys/censys-sdk-python/blob/master/docs/sdks/globaldata/README.md#get_host_enrichment) - Get host enrichment * [get_hosts](https://github.com/censys/censys-sdk-python/blob/master/docs/sdks/globaldata/README.md#get_hosts) - Retrieve multiple hosts * [get_host](https://github.com/censys/censys-sdk-python/blob/master/docs/sdks/globaldata/README.md#get_host) - Get a host * [list_services_on_host](https://github.com/censys/censys-sdk-python/blob/master/docs/sdks/globaldata/README.md#list_services_on_host) - Get service history for a host diff --git a/README.md b/README.md index 3bbb6fb..964da1a 100644 --- a/README.md +++ b/README.md @@ -218,6 +218,7 @@ asyncio.run(main()) * [get_certificates_raw](docs/sdks/globaldata/README.md#get_certificates_raw) - Retrieve multiple certificates in PEM format * [get_certificate](docs/sdks/globaldata/README.md#get_certificate) - Get a certificate * [get_certificate_raw](docs/sdks/globaldata/README.md#get_certificate_raw) - Get a certificate in PEM format +* [get_host_enrichment](docs/sdks/globaldata/README.md#get_host_enrichment) - Get host enrichment * [get_hosts](docs/sdks/globaldata/README.md#get_hosts) - Retrieve multiple hosts * [get_host](docs/sdks/globaldata/README.md#get_host) - Get a host * [list_services_on_host](docs/sdks/globaldata/README.md#list_services_on_host) - Get service history for a host diff --git a/RELEASES.md b/RELEASES.md index 2a19e0e..b07a966 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -316,4 +316,14 @@ Based on: ### Generated - [python v0.14.3] . ### Releases -- [PyPI v0.14.3] https://pypi.org/project/censys-platform/0.14.3 - . \ No newline at end of file +- [PyPI v0.14.3] https://pypi.org/project/censys-platform/0.14.3 - . + +## 2026-06-19 01:12:28 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.784.0 (2.911.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.14.4] . +### Releases +- [PyPI v0.14.4] https://pypi.org/project/censys-platform/0.14.4 - . \ No newline at end of file diff --git a/docs/models/clickhousehttp.md b/docs/models/clickhousehttp.md new file mode 100644 index 0000000..89382b5 --- /dev/null +++ b/docs/models/clickhousehttp.md @@ -0,0 +1,13 @@ +# ClickHouseHTTP + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| `databases` | List[*str*] | :heavy_minus_sign: | N/A | +| `databases_exposed` | *Optional[bool]* | :heavy_minus_sign: | N/A | +| `display_name` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `error` | [Optional[models.ClickHouseHTTPError]](../models/clickhousehttperror.md) | :heavy_minus_sign: | N/A | +| `timezone` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `version` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/clickhousehttperror.md b/docs/models/clickhousehttperror.md new file mode 100644 index 0000000..2322707 --- /dev/null +++ b/docs/models/clickhousehttperror.md @@ -0,0 +1,9 @@ +# ClickHouseHTTPError + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `code` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `message` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/clickhousenative.md b/docs/models/clickhousenative.md new file mode 100644 index 0000000..ca51929 --- /dev/null +++ b/docs/models/clickhousenative.md @@ -0,0 +1,16 @@ +# ClickHouseNative + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| `display_name` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `error` | [Optional[models.ClickHouseNativeError]](../models/clickhousenativeerror.md) | :heavy_minus_sign: | N/A | +| `revision` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `server_name` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `timezone` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `version` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `version_major` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `version_minor` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `version_patch` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/clickhousenativeerror.md b/docs/models/clickhousenativeerror.md new file mode 100644 index 0000000..d9c291b --- /dev/null +++ b/docs/models/clickhousenativeerror.md @@ -0,0 +1,10 @@ +# ClickHouseNativeError + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `code` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `message` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `name` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/endpointscan.md b/docs/models/endpointscan.md index fd99838..86448e7 100644 --- a/docs/models/endpointscan.md +++ b/docs/models/endpointscan.md @@ -8,6 +8,7 @@ | `banner` | *Optional[str]* | :heavy_minus_sign: | N/A | | `banner_hash_sha256` | *Optional[str]* | :heavy_minus_sign: | N/A | | `chrome_devtools` | [Optional[models.ChromeDevtools]](../models/chromedevtools.md) | :heavy_minus_sign: | N/A | +| `clickhouse_http` | [Optional[models.ClickHouseHTTP]](../models/clickhousehttp.md) | :heavy_minus_sign: | N/A | | `cobalt_strike` | [Optional[models.CobaltStrike]](../models/cobaltstrike.md) | :heavy_minus_sign: | N/A | | `elasticsearch` | [Optional[models.ElasticSearch]](../models/elasticsearch.md) | :heavy_minus_sign: | N/A | | `endpoint_type` | *Optional[str]* | :heavy_minus_sign: | N/A | @@ -34,4 +35,5 @@ | `scan_time` | *Optional[str]* | :heavy_minus_sign: | N/A | | `screenshots` | List[[models.Screenshot](../models/screenshot.md)] | :heavy_minus_sign: | N/A | | `tls` | [Optional[models.TLS]](../models/tls.md) | :heavy_minus_sign: | N/A | -| `transport_protocol` | [Optional[models.EndpointScanTransportProtocol]](../models/endpointscantransportprotocol.md) | :heavy_minus_sign: | N/A | \ No newline at end of file +| `transport_protocol` | [Optional[models.EndpointScanTransportProtocol]](../models/endpointscantransportprotocol.md) | :heavy_minus_sign: | N/A | +| `wordpress` | [Optional[models.Wordpress]](../models/wordpress.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/endpointscanstate.md b/docs/models/endpointscanstate.md index 434ea07..465932b 100644 --- a/docs/models/endpointscanstate.md +++ b/docs/models/endpointscanstate.md @@ -8,6 +8,7 @@ | `banner` | *Optional[str]* | :heavy_minus_sign: | N/A | | `banner_hash_sha256` | *Optional[str]* | :heavy_minus_sign: | N/A | | `chrome_devtools` | [Optional[models.ChromeDevtools]](../models/chromedevtools.md) | :heavy_minus_sign: | N/A | +| `clickhouse_http` | [Optional[models.ClickHouseHTTP]](../models/clickhousehttp.md) | :heavy_minus_sign: | N/A | | `cobalt_strike` | [Optional[models.CobaltStrike]](../models/cobaltstrike.md) | :heavy_minus_sign: | N/A | | `elasticsearch` | [Optional[models.ElasticSearch]](../models/elasticsearch.md) | :heavy_minus_sign: | N/A | | `endpoint_type` | *Optional[str]* | :heavy_minus_sign: | N/A | @@ -33,4 +34,5 @@ | `scada_view` | [Optional[models.ScadaView]](../models/scadaview.md) | :heavy_minus_sign: | N/A | | `scan_time` | *Optional[str]* | :heavy_minus_sign: | N/A | | `screenshots` | List[[models.Screenshot](../models/screenshot.md)] | :heavy_minus_sign: | N/A | -| `transport_protocol` | [Optional[models.EndpointScanStateTransportProtocol]](../models/endpointscanstatetransportprotocol.md) | :heavy_minus_sign: | N/A | \ No newline at end of file +| `transport_protocol` | [Optional[models.EndpointScanStateTransportProtocol]](../models/endpointscanstatetransportprotocol.md) | :heavy_minus_sign: | N/A | +| `wordpress` | [Optional[models.Wordpress]](../models/wordpress.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/gopher.md b/docs/models/gopher.md new file mode 100644 index 0000000..3074862 --- /dev/null +++ b/docs/models/gopher.md @@ -0,0 +1,10 @@ +# Gopher + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | +| `body` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `items` | List[[models.GopherItem](../models/gopheritem.md)] | :heavy_minus_sign: | N/A | +| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/gopheritem.md b/docs/models/gopheritem.md new file mode 100644 index 0000000..a4581b8 --- /dev/null +++ b/docs/models/gopheritem.md @@ -0,0 +1,12 @@ +# GopherItem + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `display_string` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `hostname` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `item_type` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `port` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `selector` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/hostenrichment.md b/docs/models/hostenrichment.md new file mode 100644 index 0000000..c36f53d --- /dev/null +++ b/docs/models/hostenrichment.md @@ -0,0 +1,20 @@ +# HostEnrichment + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | +| `autonomous_system` | [Optional[models.Routing]](../models/routing.md) | :heavy_minus_sign: | N/A | +| `dns` | [Optional[models.HostDNS]](../models/hostdns.md) | :heavy_minus_sign: | N/A | +| `greynoise` | [Optional[models.Greynoise]](../models/greynoise.md) | :heavy_minus_sign: | N/A | +| `ip` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `labels` | List[[models.Label](../models/label.md)] | :heavy_minus_sign: | N/A | +| `location` | [Optional[models.Location]](../models/location.md) | :heavy_minus_sign: | N/A | +| `network` | List[[models.NetworkClassification](../models/networkclassification.md)] | :heavy_minus_sign: | Information about what type of network the host belongs to. | +| `privacy` | List[[models.Privacy](../models/privacy.md)] | :heavy_minus_sign: | Information about privacy services used by the IP, such as VPNs, Proxies, or Tor. | +| `reputation` | [Optional[models.Reputation]](../models/reputation.md) | :heavy_minus_sign: | N/A | +| `service_count` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `services` | List[[models.HostEnrichmentService](../models/hostenrichmentservice.md)] | :heavy_minus_sign: | N/A | +| `third_party` | [Optional[models.ThirdParty]](../models/thirdparty.md) | :heavy_minus_sign: | N/A | +| `whois` | [Optional[models.Whois]](../models/whois.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/hostenrichmentasset.md b/docs/models/hostenrichmentasset.md new file mode 100644 index 0000000..a5e325a --- /dev/null +++ b/docs/models/hostenrichmentasset.md @@ -0,0 +1,9 @@ +# HostEnrichmentAsset + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | +| `extensions` | Dict[str, *Any*] | :heavy_check_mark: | N/A | +| `resource` | [models.HostEnrichment](../models/hostenrichment.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/hostenrichmentservice.md b/docs/models/hostenrichmentservice.md new file mode 100644 index 0000000..123892b --- /dev/null +++ b/docs/models/hostenrichmentservice.md @@ -0,0 +1,11 @@ +# HostEnrichmentService + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------ | ------------------------------------------ | ------------------------------------------ | ------------------------------------------ | +| `labels` | List[[models.Label](../models/label.md)] | :heavy_minus_sign: | N/A | +| `port` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `protocol` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `threats` | List[[models.Threat](../models/threat.md)] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/malloryai.md b/docs/models/malloryai.md new file mode 100644 index 0000000..07fe8cf --- /dev/null +++ b/docs/models/malloryai.md @@ -0,0 +1,16 @@ +# MalloryAI + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `created_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `first_seen_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `last_seen_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `observable` | [Optional[models.MalloryAIObservable]](../models/malloryaiobservable.md) | :heavy_minus_sign: | N/A | +| `opinions` | List[[models.MalloryAIOpinion](../models/malloryaiopinion.md)] | :heavy_minus_sign: | N/A | +| `source_count` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `updated_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `uuid` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `verdict_summary` | [Optional[models.MalloryAIVerdictSummary]](../models/malloryaiverdictsummary.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/malloryaiobservable.md b/docs/models/malloryaiobservable.md new file mode 100644 index 0000000..a6e99a9 --- /dev/null +++ b/docs/models/malloryaiobservable.md @@ -0,0 +1,14 @@ +# MalloryAIObservable + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `attributes` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `created_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `description` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `name` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `updated_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `uuid` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/malloryaiopinion.md b/docs/models/malloryaiopinion.md new file mode 100644 index 0000000..390ecc8 --- /dev/null +++ b/docs/models/malloryaiopinion.md @@ -0,0 +1,19 @@ +# MalloryAIOpinion + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `attributes` | [Optional[models.MalloryAIOpinionAttributes]](../models/malloryaiopinionattributes.md) | :heavy_minus_sign: | N/A | +| `confidence` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `created_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `description` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `published_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `reference_source_slug` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `reference_url` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `reference_uuid` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `source` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `updated_at` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `uuid` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `verdict` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/malloryaiopinionattributes.md b/docs/models/malloryaiopinionattributes.md new file mode 100644 index 0000000..afc7d03 --- /dev/null +++ b/docs/models/malloryaiopinionattributes.md @@ -0,0 +1,11 @@ +# MalloryAIOpinionAttributes + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------- | ---------------------------- | ---------------------------- | ---------------------------- | +| `associated_malware` | List[*str*] | :heavy_minus_sign: | N/A | +| `associated_threat_actors` | List[*str*] | :heavy_minus_sign: | N/A | +| `associated_vulnerabilities` | List[*str*] | :heavy_minus_sign: | N/A | +| `tags` | List[*str*] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/malloryaiverdictsummary.md b/docs/models/malloryaiverdictsummary.md new file mode 100644 index 0000000..e943926 --- /dev/null +++ b/docs/models/malloryaiverdictsummary.md @@ -0,0 +1,9 @@ +# MalloryAIVerdictSummary + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `malicious` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `suspicious` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/openflow.md b/docs/models/openflow.md new file mode 100644 index 0000000..a4e26ee --- /dev/null +++ b/docs/models/openflow.md @@ -0,0 +1,24 @@ +# Openflow + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `auxiliary_id` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `bare_hello` | *Optional[bool]* | :heavy_minus_sign: | N/A | +| `capabilities` | List[*str*] | :heavy_minus_sign: | N/A | +| `datapath_id` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `datapath_mac` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `dp_desc` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `hello_elements` | List[[models.OpenflowHelloElement](../models/openflowhelloelement.md)] | :heavy_minus_sign: | N/A | +| `hw_desc` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `mfr_desc` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `n_buffers` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `n_tables` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `peer_role` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `protocol_version` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `protocol_version_raw` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `serial_num` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `sw_desc` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `xid` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/openflowhelloelement.md b/docs/models/openflowhelloelement.md new file mode 100644 index 0000000..ef75d8a --- /dev/null +++ b/docs/models/openflowhelloelement.md @@ -0,0 +1,9 @@ +# OpenflowHelloElement + + +## Fields + +| Field | Type | Required | Description | +| -------------------- | -------------------- | -------------------- | -------------------- | +| `element_type` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `supported_versions` | List[*str*] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/reolinkbaichuan.md b/docs/models/reolinkbaichuan.md new file mode 100644 index 0000000..49fee3b --- /dev/null +++ b/docs/models/reolinkbaichuan.md @@ -0,0 +1,14 @@ +# ReolinkBaichuan + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `ai_types_observed` | List[*str*] | :heavy_minus_sign: | N/A | +| `body_length` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `channel_count` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `channels` | List[[models.ReolinkBaichuanAlarmChannel](../models/reolinkbaichuanalarmchannel.md)] | :heavy_minus_sign: | N/A | +| `command_id` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `raw_xml` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `status_code` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/reolinkbaichuanalarmchannel.md b/docs/models/reolinkbaichuanalarmchannel.md new file mode 100644 index 0000000..4f87702 --- /dev/null +++ b/docs/models/reolinkbaichuanalarmchannel.md @@ -0,0 +1,12 @@ +# ReolinkBaichuanAlarmChannel + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `ai_type` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `channel_id` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `recording` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `status` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `timestamp` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/responseenvelopehostenrichmentasset.md b/docs/models/responseenvelopehostenrichmentasset.md new file mode 100644 index 0000000..104bc24 --- /dev/null +++ b/docs/models/responseenvelopehostenrichmentasset.md @@ -0,0 +1,8 @@ +# ResponseEnvelopeHostEnrichmentAsset + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| `result` | [Optional[models.HostEnrichmentAsset]](../models/hostenrichmentasset.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/rtmp.md b/docs/models/rtmp.md new file mode 100644 index 0000000..d57a5d9 --- /dev/null +++ b/docs/models/rtmp.md @@ -0,0 +1,14 @@ +# Rtmp + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `capabilities` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `mode` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `peer_bandwidth` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `protocol_version` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `server_software` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `status` | [Optional[models.RtmpConnectStatus]](../models/rtmpconnectstatus.md) | :heavy_minus_sign: | N/A | +| `window_acknowledgement_size` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/rtmpconnectstatus.md b/docs/models/rtmpconnectstatus.md new file mode 100644 index 0000000..1daf9cb --- /dev/null +++ b/docs/models/rtmpconnectstatus.md @@ -0,0 +1,11 @@ +# RtmpConnectStatus + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `code` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `description` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `level` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `object_encoding` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/service.md b/docs/models/service.md index 72d9a2d..7b9e416 100644 --- a/docs/models/service.md +++ b/docs/models/service.md @@ -18,6 +18,7 @@ | `checkpoint_topology` | [Optional[models.CheckpointTopology]](../models/checkpointtopology.md) | :heavy_minus_sign: | N/A | | `chromecast` | [Optional[models.Chromecast]](../models/chromecast.md) | :heavy_minus_sign: | N/A | | `cisco_ipsla` | [Optional[models.CiscoIpsla]](../models/ciscoipsla.md) | :heavy_minus_sign: | N/A | +| `clickhouse_native` | [Optional[models.ClickHouseNative]](../models/clickhousenative.md) | :heavy_minus_sign: | N/A | | `cmore` | [Optional[models.Cmore]](../models/cmore.md) | :heavy_minus_sign: | N/A | | `coap` | [Optional[models.Coap]](../models/coap.md) | :heavy_minus_sign: | N/A | | `compromises` | List[[models.Risk](../models/risk.md)] | :heavy_minus_sign: | N/A | @@ -46,6 +47,7 @@ | `ftp` | [Optional[models.Ftp]](../models/ftp.md) | :heavy_minus_sign: | N/A | | `gearman` | [Optional[models.Gearman]](../models/gearman.md) | :heavy_minus_sign: | N/A | | `gemini` | [Optional[models.Gemini]](../models/gemini.md) | :heavy_minus_sign: | N/A | +| `gopher` | [Optional[models.Gopher]](../models/gopher.md) | :heavy_minus_sign: | N/A | | `hajime` | [Optional[models.Hajime]](../models/hajime.md) | :heavy_minus_sign: | N/A | | `hardware` | List[[models.Attribute](../models/attribute.md)] | :heavy_minus_sign: | N/A | | `hid_vertx` | [Optional[models.HidVertx]](../models/hidvertx.md) | :heavy_minus_sign: | N/A | @@ -91,6 +93,7 @@ | `onc` | [Optional[models.Onc]](../models/onc.md) | :heavy_minus_sign: | N/A | | `onvif` | [Optional[models.Onvif]](../models/onvif.md) | :heavy_minus_sign: | N/A | | `opc_ua` | [Optional[models.OpcUa]](../models/opcua.md) | :heavy_minus_sign: | N/A | +| `openflow` | [Optional[models.Openflow]](../models/openflow.md) | :heavy_minus_sign: | N/A | | `openvpn` | [Optional[models.Openvpn]](../models/openvpn.md) | :heavy_minus_sign: | N/A | | `openvpn_mgmt` | [Optional[models.OpenvpnMgmt]](../models/openvpnmgmt.md) | :heavy_minus_sign: | N/A | | `operating_systems` | List[[models.Attribute](../models/attribute.md)] | :heavy_minus_sign: | N/A | @@ -110,12 +113,14 @@ | `redis` | [Optional[models.Redis]](../models/redis.md) | :heavy_minus_sign: | N/A | | `redline` | [Optional[models.Redline]](../models/redline.md) | :heavy_minus_sign: | N/A | | `redlion_crimson` | [Optional[models.RedlionCrimson]](../models/redlioncrimson.md) | :heavy_minus_sign: | N/A | +| `reolink_baichuan` | [Optional[models.ReolinkBaichuan]](../models/reolinkbaichuan.md) | :heavy_minus_sign: | N/A | | `representative_info` | [Optional[models.RepresentativeInfo]](../models/representativeinfo.md) | :heavy_minus_sign: | N/A | | `rifatron` | [Optional[models.Rifatron]](../models/rifatron.md) | :heavy_minus_sign: | N/A | | `ripple` | [Optional[models.Ripple]](../models/ripple.md) | :heavy_minus_sign: | N/A | | `rlogin` | [Optional[models.Rlogin]](../models/rlogin.md) | :heavy_minus_sign: | N/A | | `rocketmq` | [Optional[models.Rocketmq]](../models/rocketmq.md) | :heavy_minus_sign: | N/A | | `routeros_api` | [Optional[models.RouterosAPI]](../models/routerosapi.md) | :heavy_minus_sign: | N/A | +| `rtmp` | [Optional[models.Rtmp]](../models/rtmp.md) | :heavy_minus_sign: | N/A | | `rtsp` | [Optional[models.Rtsp]](../models/rtsp.md) | :heavy_minus_sign: | N/A | | `rustdesk_heartbeat` | [Optional[models.RustdeskHeartbeat]](../models/rustdeskheartbeat.md) | :heavy_minus_sign: | N/A | | `rustdesk_relay` | [Optional[models.RustdeskRelay]](../models/rustdeskrelay.md) | :heavy_minus_sign: | N/A | @@ -140,6 +145,7 @@ | `ssh` | [Optional[models.SSH]](../models/ssh.md) | :heavy_minus_sign: | N/A | | `steam` | [Optional[models.Steam]](../models/steam.md) | :heavy_minus_sign: | N/A | | `stun` | [Optional[models.Stun]](../models/stun.md) | :heavy_minus_sign: | N/A | +| `synergy` | [Optional[models.Synergy]](../models/synergy.md) | :heavy_minus_sign: | N/A | | `tacacs_plus` | [Optional[models.TacacsPlus]](../models/tacacsplus.md) | :heavy_minus_sign: | N/A | | `team_viewer` | [Optional[models.TeamViewer]](../models/teamviewer.md) | :heavy_minus_sign: | N/A | | `telnet` | [Optional[models.Telnet]](../models/telnet.md) | :heavy_minus_sign: | N/A | @@ -154,6 +160,7 @@ | `vnc` | [Optional[models.Vnc]](../models/vnc.md) | :heavy_minus_sign: | N/A | | `vulns` | List[[models.Vuln](../models/vuln.md)] | :heavy_minus_sign: | N/A | | `weblogic_t3` | [Optional[models.WeblogicT3]](../models/weblogict3.md) | :heavy_minus_sign: | N/A | +| `wince_cerdisp` | [Optional[models.WinceCerdisp]](../models/wincecerdisp.md) | :heavy_minus_sign: | N/A | | `winrm` | [Optional[models.Winrm]](../models/winrm.md) | :heavy_minus_sign: | N/A | | `ws_discovery` | [Optional[models.WsDiscovery]](../models/wsdiscovery.md) | :heavy_minus_sign: | N/A | | `x11` | [Optional[models.X11]](../models/x11.md) | :heavy_minus_sign: | N/A | diff --git a/docs/models/servicescan.md b/docs/models/servicescan.md index cc450cf..11fe587 100644 --- a/docs/models/servicescan.md +++ b/docs/models/servicescan.md @@ -16,6 +16,7 @@ | `checkpoint_topology` | [Optional[models.CheckpointTopology]](../models/checkpointtopology.md) | :heavy_minus_sign: | N/A | | `chromecast` | [Optional[models.Chromecast]](../models/chromecast.md) | :heavy_minus_sign: | N/A | | `cisco_ipsla` | [Optional[models.CiscoIpsla]](../models/ciscoipsla.md) | :heavy_minus_sign: | N/A | +| `clickhouse_native` | [Optional[models.ClickHouseNative]](../models/clickhousenative.md) | :heavy_minus_sign: | N/A | | `cmore` | [Optional[models.Cmore]](../models/cmore.md) | :heavy_minus_sign: | N/A | | `coap` | [Optional[models.Coap]](../models/coap.md) | :heavy_minus_sign: | N/A | | `crestron_cp3` | [Optional[models.CrestronCp3]](../models/crestroncp3.md) | :heavy_minus_sign: | N/A | @@ -41,6 +42,7 @@ | `ftp` | [Optional[models.Ftp]](../models/ftp.md) | :heavy_minus_sign: | N/A | | `gearman` | [Optional[models.Gearman]](../models/gearman.md) | :heavy_minus_sign: | N/A | | `gemini` | [Optional[models.Gemini]](../models/gemini.md) | :heavy_minus_sign: | N/A | +| `gopher` | [Optional[models.Gopher]](../models/gopher.md) | :heavy_minus_sign: | N/A | | `hajime` | [Optional[models.Hajime]](../models/hajime.md) | :heavy_minus_sign: | N/A | | `hid_vertx` | [Optional[models.HidVertx]](../models/hidvertx.md) | :heavy_minus_sign: | N/A | | `hikvision` | [Optional[models.Hikvision]](../models/hikvision.md) | :heavy_minus_sign: | N/A | @@ -82,6 +84,7 @@ | `onc` | [Optional[models.Onc]](../models/onc.md) | :heavy_minus_sign: | N/A | | `onvif` | [Optional[models.Onvif]](../models/onvif.md) | :heavy_minus_sign: | N/A | | `opc_ua` | [Optional[models.OpcUa]](../models/opcua.md) | :heavy_minus_sign: | N/A | +| `openflow` | [Optional[models.Openflow]](../models/openflow.md) | :heavy_minus_sign: | N/A | | `openvpn` | [Optional[models.Openvpn]](../models/openvpn.md) | :heavy_minus_sign: | N/A | | `openvpn_mgmt` | [Optional[models.OpenvpnMgmt]](../models/openvpnmgmt.md) | :heavy_minus_sign: | N/A | | `oracle` | [Optional[models.Oracle]](../models/oracle.md) | :heavy_minus_sign: | N/A | @@ -100,12 +103,14 @@ | `redis` | [Optional[models.Redis]](../models/redis.md) | :heavy_minus_sign: | N/A | | `redline` | [Optional[models.Redline]](../models/redline.md) | :heavy_minus_sign: | N/A | | `redlion_crimson` | [Optional[models.RedlionCrimson]](../models/redlioncrimson.md) | :heavy_minus_sign: | N/A | +| `reolink_baichuan` | [Optional[models.ReolinkBaichuan]](../models/reolinkbaichuan.md) | :heavy_minus_sign: | N/A | | `representative_info` | [Optional[models.RepresentativeInfo]](../models/representativeinfo.md) | :heavy_minus_sign: | N/A | | `rifatron` | [Optional[models.Rifatron]](../models/rifatron.md) | :heavy_minus_sign: | N/A | | `ripple` | [Optional[models.Ripple]](../models/ripple.md) | :heavy_minus_sign: | N/A | | `rlogin` | [Optional[models.Rlogin]](../models/rlogin.md) | :heavy_minus_sign: | N/A | | `rocketmq` | [Optional[models.Rocketmq]](../models/rocketmq.md) | :heavy_minus_sign: | N/A | | `routeros_api` | [Optional[models.RouterosAPI]](../models/routerosapi.md) | :heavy_minus_sign: | N/A | +| `rtmp` | [Optional[models.Rtmp]](../models/rtmp.md) | :heavy_minus_sign: | N/A | | `rtsp` | [Optional[models.Rtsp]](../models/rtsp.md) | :heavy_minus_sign: | N/A | | `rustdesk_heartbeat` | [Optional[models.RustdeskHeartbeat]](../models/rustdeskheartbeat.md) | :heavy_minus_sign: | N/A | | `rustdesk_relay` | [Optional[models.RustdeskRelay]](../models/rustdeskrelay.md) | :heavy_minus_sign: | N/A | @@ -129,6 +134,7 @@ | `ssh` | [Optional[models.SSH]](../models/ssh.md) | :heavy_minus_sign: | N/A | | `steam` | [Optional[models.Steam]](../models/steam.md) | :heavy_minus_sign: | N/A | | `stun` | [Optional[models.Stun]](../models/stun.md) | :heavy_minus_sign: | N/A | +| `synergy` | [Optional[models.Synergy]](../models/synergy.md) | :heavy_minus_sign: | N/A | | `tacacs_plus` | [Optional[models.TacacsPlus]](../models/tacacsplus.md) | :heavy_minus_sign: | N/A | | `team_viewer` | [Optional[models.TeamViewer]](../models/teamviewer.md) | :heavy_minus_sign: | N/A | | `telnet` | [Optional[models.Telnet]](../models/telnet.md) | :heavy_minus_sign: | N/A | @@ -141,6 +147,7 @@ | `ventrilo` | [Optional[models.Ventrilo]](../models/ventrilo.md) | :heavy_minus_sign: | N/A | | `vnc` | [Optional[models.Vnc]](../models/vnc.md) | :heavy_minus_sign: | N/A | | `weblogic_t3` | [Optional[models.WeblogicT3]](../models/weblogict3.md) | :heavy_minus_sign: | N/A | +| `wince_cerdisp` | [Optional[models.WinceCerdisp]](../models/wincecerdisp.md) | :heavy_minus_sign: | N/A | | `winrm` | [Optional[models.Winrm]](../models/winrm.md) | :heavy_minus_sign: | N/A | | `ws_discovery` | [Optional[models.WsDiscovery]](../models/wsdiscovery.md) | :heavy_minus_sign: | N/A | | `x11` | [Optional[models.X11]](../models/x11.md) | :heavy_minus_sign: | N/A | diff --git a/docs/models/synergy.md b/docs/models/synergy.md new file mode 100644 index 0000000..43f2b99 --- /dev/null +++ b/docs/models/synergy.md @@ -0,0 +1,10 @@ +# Synergy + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `protocol_major` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `protocol_minor` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `protocol_version` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/thirdparty.md b/docs/models/thirdparty.md new file mode 100644 index 0000000..e005a99 --- /dev/null +++ b/docs/models/thirdparty.md @@ -0,0 +1,8 @@ +# ThirdParty + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | +| `mallory` | List[[models.MalloryAI](../models/malloryai.md)] | :heavy_minus_sign: | Threat intelligence records from MalloryAI. | \ No newline at end of file diff --git a/docs/models/v3globaldataassethostenrichmentglobals.md b/docs/models/v3globaldataassethostenrichmentglobals.md new file mode 100644 index 0000000..693fc68 --- /dev/null +++ b/docs/models/v3globaldataassethostenrichmentglobals.md @@ -0,0 +1,8 @@ +# V3GlobaldataAssetHostEnrichmentGlobals + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `organization_id` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/v3globaldataassethostenrichmentrequest.md b/docs/models/v3globaldataassethostenrichmentrequest.md new file mode 100644 index 0000000..20cfbaf --- /dev/null +++ b/docs/models/v3globaldataassethostenrichmentrequest.md @@ -0,0 +1,9 @@ +# V3GlobaldataAssetHostEnrichmentRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `organization_id` | *Optional[str]* | :heavy_minus_sign: | The ID of a Censys organization to associate the request with. See the [Getting Started docs](https://docs.censys.com/reference/get-started#step-3-find-and-use-your-organization-id-optional) for more information. | | +| `host_ip` | *str* | :heavy_check_mark: | The IP address of a host. | 8.8.8.8 | \ No newline at end of file diff --git a/docs/models/v3globaldataassethostenrichmentresponse.md b/docs/models/v3globaldataassethostenrichmentresponse.md new file mode 100644 index 0000000..03983d5 --- /dev/null +++ b/docs/models/v3globaldataassethostenrichmentresponse.md @@ -0,0 +1,9 @@ +# V3GlobaldataAssetHostEnrichmentResponse + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `headers` | Dict[str, List[*str*]] | :heavy_check_mark: | N/A | +| `result` | [models.ResponseEnvelopeHostEnrichmentAsset](../models/responseenvelopehostenrichmentasset.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/wincecerdisp.md b/docs/models/wincecerdisp.md new file mode 100644 index 0000000..ae284fa --- /dev/null +++ b/docs/models/wincecerdisp.md @@ -0,0 +1,15 @@ +# WinceCerdisp + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `color_depth_bpp` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `device_family` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `device_id` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `flags` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `manufacturer` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `screen_height` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `screen_width` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `selector` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/wordpress.md b/docs/models/wordpress.md new file mode 100644 index 0000000..f3477c2 --- /dev/null +++ b/docs/models/wordpress.md @@ -0,0 +1,13 @@ +# Wordpress + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `description` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `gmt_offset` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `home` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `name` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `namespaces` | List[*str*] | :heavy_minus_sign: | N/A | +| `timezone_string` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/sdks/globaldata/README.md b/docs/sdks/globaldata/README.md index b109552..4412fe3 100644 --- a/docs/sdks/globaldata/README.md +++ b/docs/sdks/globaldata/README.md @@ -10,6 +10,7 @@ Endpoints related to the Global Data product * [get_certificates_raw](#get_certificates_raw) - Retrieve multiple certificates in PEM format * [get_certificate](#get_certificate) - Get a certificate * [get_certificate_raw](#get_certificate_raw) - Get a certificate in PEM format +* [get_host_enrichment](#get_host_enrichment) - Get host enrichment * [get_hosts](#get_hosts) - Retrieve multiple hosts * [get_host](#get_host) - Get a host * [list_services_on_host](#list_services_on_host) - Get service history for a host @@ -210,6 +211,50 @@ with SDK( | models.ErrorModel | 500 | application/problem+json | | models.SDKError | 4XX, 5XX | \*/\* | +## get_host_enrichment + +Retrieve enrichment data for a single host, optimized for high-volume SOC enrichment use cases. A host IP is its IP address. + +### Example Usage + + +```python +from censys_platform import SDK + + +with SDK( + organization_id="11111111-2222-3333-4444-555555555555", + personal_access_token="", +) as sdk: + + res = sdk.global_data.get_host_enrichment(host_ip="8.8.8.8") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `host_ip` | *str* | :heavy_check_mark: | The IP address of a host. | 8.8.8.8 | +| `organization_id` | *Optional[str]* | :heavy_minus_sign: | The ID of a Censys organization to associate the request with. See the [Getting Started docs](https://docs.censys.com/reference/get-started#step-3-find-and-use-your-organization-id-optional) for more information. | | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | + +### Response + +**[models.V3GlobaldataAssetHostEnrichmentResponse](../../models/v3globaldataassethostenrichmentresponse.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| -------------------------- | -------------------------- | -------------------------- | +| models.AuthenticationError | 401 | application/json | +| models.ErrorModel | 400, 403, 404, 409, 429 | application/problem+json | +| models.ErrorModel | 500 | application/problem+json | +| models.SDKError | 4XX, 5XX | \*/\* | + ## get_hosts Retrieve information about multiple hosts. You can retrieve up to 100 hosts per call. A host ID is its IP address. diff --git a/pyproject.toml b/pyproject.toml index a928e43..242c34a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "censys-platform" -version = "0.14.3" +version = "0.14.4" description = "Python Client SDK Generated by Speakeasy." authors = [{ name = "Speakeasy" },] readme = "README-PYPI.md" diff --git a/src/censys_platform/_version.py b/src/censys_platform/_version.py index 22057bc..d3aea59 100644 --- a/src/censys_platform/_version.py +++ b/src/censys_platform/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "censys-platform" -__version__: str = "0.14.3" -__openapi_doc_version__: str = "1.0.107" -__gen_version__: str = "2.903.2" -__user_agent__: str = "speakeasy-sdk/python 0.14.3 2.903.2 1.0.107 censys-platform" +__version__: str = "0.14.4" +__openapi_doc_version__: str = "1.0.109" +__gen_version__: str = "2.911.0" +__user_agent__: str = "speakeasy-sdk/python 0.14.4 2.911.0 1.0.109 censys-platform" try: if __package__ is not None: diff --git a/src/censys_platform/global_data.py b/src/censys_platform/global_data.py index 2bee92e..ca06df2 100644 --- a/src/censys_platform/global_data.py +++ b/src/censys_platform/global_data.py @@ -936,6 +936,224 @@ async def get_certificate_raw_async( http_res_text = await utils.stream_to_text_async(http_res) raise models.SDKError("Unexpected response received", http_res, http_res_text) + def get_host_enrichment( + self, + *, + host_ip: str, + organization_id: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.V3GlobaldataAssetHostEnrichmentResponse: + r"""Get host enrichment + + Retrieve enrichment data for a single host, optimized for high-volume SOC enrichment use cases. A host IP is its IP address. + + :param host_ip: The IP address of a host. + :param organization_id: The ID of a Censys organization to associate the request with. See the [Getting Started docs](https://docs.censys.com/reference/get-started#step-3-find-and-use-your-organization-id-optional) for more information. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.V3GlobaldataAssetHostEnrichmentRequest( + organization_id=organization_id, + host_ip=host_ip, + ) + + req = self._build_request( + method="GET", + path="/v3/global/asset/enrichment/host/{host_ip}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/vnd.censys.api.v3.host-enrichment.v1+json", + http_headers=http_headers, + _globals=models.V3GlobaldataAssetHostEnrichmentGlobals( + organization_id=self.sdk_configuration.globals.organization_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="v3-globaldata-asset-host-enrichment", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response( + http_res, "200", "application/vnd.censys.api.v3.host-enrichment.v1+json" + ): + return models.V3GlobaldataAssetHostEnrichmentResponse( + result=unmarshal_json_response( + models.ResponseEnvelopeHostEnrichmentAsset, http_res + ), + headers=utils.get_response_headers(http_res.headers), + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + models.AuthenticationErrorData, http_res + ) + raise models.AuthenticationError(response_data, http_res) + if utils.match_response( + http_res, ["400", "403", "404", "409", "429"], "application/problem+json" + ): + response_data = unmarshal_json_response(models.ErrorModelData, http_res) + raise models.ErrorModel(response_data, http_res) + if utils.match_response(http_res, "500", "application/problem+json"): + response_data = unmarshal_json_response(models.ErrorModelData, http_res) + raise models.ErrorModel(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def get_host_enrichment_async( + self, + *, + host_ip: str, + organization_id: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.V3GlobaldataAssetHostEnrichmentResponse: + r"""Get host enrichment + + Retrieve enrichment data for a single host, optimized for high-volume SOC enrichment use cases. A host IP is its IP address. + + :param host_ip: The IP address of a host. + :param organization_id: The ID of a Censys organization to associate the request with. See the [Getting Started docs](https://docs.censys.com/reference/get-started#step-3-find-and-use-your-organization-id-optional) for more information. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.V3GlobaldataAssetHostEnrichmentRequest( + organization_id=organization_id, + host_ip=host_ip, + ) + + req = self._build_request_async( + method="GET", + path="/v3/global/asset/enrichment/host/{host_ip}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/vnd.censys.api.v3.host-enrichment.v1+json", + http_headers=http_headers, + _globals=models.V3GlobaldataAssetHostEnrichmentGlobals( + organization_id=self.sdk_configuration.globals.organization_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="v3-globaldata-asset-host-enrichment", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response( + http_res, "200", "application/vnd.censys.api.v3.host-enrichment.v1+json" + ): + return models.V3GlobaldataAssetHostEnrichmentResponse( + result=unmarshal_json_response( + models.ResponseEnvelopeHostEnrichmentAsset, http_res + ), + headers=utils.get_response_headers(http_res.headers), + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + models.AuthenticationErrorData, http_res + ) + raise models.AuthenticationError(response_data, http_res) + if utils.match_response( + http_res, ["400", "403", "404", "409", "429"], "application/problem+json" + ): + response_data = unmarshal_json_response(models.ErrorModelData, http_res) + raise models.ErrorModel(response_data, http_res) + if utils.match_response(http_res, "500", "application/problem+json"): + response_data = unmarshal_json_response(models.ErrorModelData, http_res) + raise models.ErrorModel(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + def get_hosts( self, *, diff --git a/src/censys_platform/models/__init__.py b/src/censys_platform/models/__init__.py index 7815035..e7313f6 100644 --- a/src/censys_platform/models/__init__.py +++ b/src/censys_platform/models/__init__.py @@ -107,6 +107,13 @@ CiscoIpslaMeasureResponse, CiscoIpslaMeasureResponseTypedDict, ) + from .clickhousehttp import ClickHouseHTTP, ClickHouseHTTPTypedDict + from .clickhousehttp_error import ClickHouseHTTPError, ClickHouseHTTPErrorTypedDict + from .clickhousenative import ClickHouseNative, ClickHouseNativeTypedDict + from .clickhousenative_error import ( + ClickHouseNativeError, + ClickHouseNativeErrorTypedDict, + ) from .cmore import Cmore, CmoreTypedDict from .coap import Coap, CoapTypedDict from .cobaltstrike import CobaltStrike, CobaltStrikeTypedDict @@ -448,6 +455,8 @@ from .gemini import Gemini, GeminiTypedDict from .generalnames import GeneralNames, GeneralNamesTypedDict from .generalsubtreeip import GeneralSubtreeIP, GeneralSubtreeIPTypedDict + from .gopher import Gopher, GopherTypedDict + from .gopher_item import GopherItem, GopherItemTypedDict from .graphql import Graphql, GraphqlTypedDict from .greynoise import Greynoise, GreynoiseTypedDict from .greynoise_tag import GreynoiseTag, GreynoiseTagTypedDict @@ -475,6 +484,12 @@ HostDNSReverseResolution, HostDNSReverseResolutionTypedDict, ) + from .hostenrichment import HostEnrichment, HostEnrichmentTypedDict + from .hostenrichmentasset import HostEnrichmentAsset, HostEnrichmentAssetTypedDict + from .hostenrichmentservice import ( + HostEnrichmentService, + HostEnrichmentServiceTypedDict, + ) from .hostobservationrange import ( HostObservationRange, HostObservationRangeTypedDict, @@ -610,6 +625,17 @@ from .locationupdated import LocationUpdated, LocationUpdatedTypedDict from .lpd import Lpd, LpdTypedDict from .lpdmessage import LpdMessage, LpdMessageTypedDict + from .malloryai import MalloryAI, MalloryAITypedDict + from .malloryai_observable import MalloryAIObservable, MalloryAIObservableTypedDict + from .malloryai_opinion import MalloryAIOpinion, MalloryAIOpinionTypedDict + from .malloryai_opinion_attributes import ( + MalloryAIOpinionAttributes, + MalloryAIOpinionAttributesTypedDict, + ) + from .malloryai_verdictsummary import ( + MalloryAIVerdictSummary, + MalloryAIVerdictSummaryTypedDict, + ) from .matchedservice import ( MatchedService, MatchedServiceTypedDict, @@ -735,6 +761,11 @@ ) from .opendirectory import OpenDirectory, OpenDirectoryTypedDict from .opendirectory_file import OpenDirectoryFile, OpenDirectoryFileTypedDict + from .openflow import Openflow, OpenflowTypedDict + from .openflow_helloelement import ( + OpenflowHelloElement, + OpenflowHelloElementTypedDict, + ) from .openvpn import Openvpn, OpenvpnTypedDict from .openvpnmgmt import OpenvpnMgmt, OpenvpnMgmtTypedDict from .oracle import Oracle, OracleTypedDict @@ -854,6 +885,11 @@ from .redlioncrimson import RedlionCrimson, RedlionCrimsonTypedDict from .redlionweb import RedlionWeb, RedlionWebTypedDict from .reject import Reject, RejectType, RejectTypedDict + from .reolinkbaichuan import ReolinkBaichuan, ReolinkBaichuanTypedDict + from .reolinkbaichuan_alarmchannel import ( + ReolinkBaichuanAlarmChannel, + ReolinkBaichuanAlarmChannelTypedDict, + ) from .replaycapabilities import ReplayCapabilities, ReplayCapabilitiesTypedDict from .representativeinfo import ( RepresentativeInfo, @@ -931,6 +967,10 @@ ResponseEnvelopeHostAsset, ResponseEnvelopeHostAssetTypedDict, ) + from .responseenvelopehostenrichmentasset import ( + ResponseEnvelopeHostEnrichmentAsset, + ResponseEnvelopeHostEnrichmentAssetTypedDict, + ) from .responseenvelopehostobservationresponse import ( ResponseEnvelopeHostObservationResponse, ResponseEnvelopeHostObservationResponseTypedDict, @@ -1046,6 +1086,8 @@ from .routing import Routing, RoutingTypedDict from .rsacryptographickey import RSACryptographicKey, RSACryptographicKeyTypedDict from .rsapublickey import RsaPublicKey, RsaPublicKeyTypedDict + from .rtmp import Rtmp, RtmpTypedDict + from .rtmp_connectstatus import RtmpConnectStatus, RtmpConnectStatusTypedDict from .rtsp import Rtsp, RtspTypedDict from .rustdeskheartbeat import RustdeskHeartbeat, RustdeskHeartbeatTypedDict from .rustdeskheartbeat_registerpeerresponse import ( @@ -1237,6 +1279,7 @@ StunTurnAllocateSuccessResponseTypedDict, ) from .subjectkeyinfo import SubjectKeyInfo, SubjectKeyInfoTypedDict + from .synergy import Synergy, SynergyTypedDict from .systemcapabilities import SystemCapabilities, SystemCapabilitiesTypedDict from .tacacsplus import TacacsPlus, TacacsPlusTypedDict from .tag import Tag, TagPrivacy, TagTypedDict @@ -1251,6 +1294,7 @@ from .teamviewer import TeamViewer, TeamViewerTypedDict from .telnet import Telnet, TelnetTypedDict from .textmessage import TextMessage, TextMessageTypedDict + from .thirdparty import ThirdParty, ThirdPartyTypedDict from .threat import Threat, ThreatSource, ThreatTypedDict from .threat_actor import ThreatActor, ThreatActorTypedDict from .threat_details import ThreatDetails, ThreatDetailsTypedDict @@ -1505,6 +1549,14 @@ V3GlobaldataAssetCertificateResponse, V3GlobaldataAssetCertificateResponseTypedDict, ) + from .v3_globaldata_asset_host_enrichmentop import ( + V3GlobaldataAssetHostEnrichmentGlobals, + V3GlobaldataAssetHostEnrichmentGlobalsTypedDict, + V3GlobaldataAssetHostEnrichmentRequest, + V3GlobaldataAssetHostEnrichmentRequestTypedDict, + V3GlobaldataAssetHostEnrichmentResponse, + V3GlobaldataAssetHostEnrichmentResponseTypedDict, + ) from .v3_globaldata_asset_host_list_postop import ( V3GlobaldataAssetHostListPostGlobals, V3GlobaldataAssetHostListPostGlobalsTypedDict, @@ -1786,7 +1838,9 @@ from .webpropertyasset import WebpropertyAsset, WebpropertyAssetTypedDict from .whois import Whois, WhoisTypedDict from .whoisupdated import WhoisUpdated, WhoisUpdatedTypedDict + from .wincecerdisp import WinceCerdisp, WinceCerdispTypedDict from .winrm import Winrm, WinrmTypedDict + from .wordpress import Wordpress, WordpressTypedDict from .worker import Worker, WorkerTypedDict from .wsdiscovery import WsDiscovery, WsDiscoveryTypedDict from .x11 import X11, X11TypedDict @@ -1917,6 +1971,14 @@ "CiscoIpslaMeasureResponse", "CiscoIpslaMeasureResponseTypedDict", "CiscoIpslaTypedDict", + "ClickHouseHTTP", + "ClickHouseHTTPError", + "ClickHouseHTTPErrorTypedDict", + "ClickHouseHTTPTypedDict", + "ClickHouseNative", + "ClickHouseNativeError", + "ClickHouseNativeErrorTypedDict", + "ClickHouseNativeTypedDict", "Cmore", "CmoreTypedDict", "Coap", @@ -2200,6 +2262,10 @@ "GeneralNamesTypedDict", "GeneralSubtreeIP", "GeneralSubtreeIPTypedDict", + "Gopher", + "GopherItem", + "GopherItemTypedDict", + "GopherTypedDict", "Granularity", "Graphql", "GraphqlTypedDict", @@ -2237,6 +2303,12 @@ "HostDNSReverseResolution", "HostDNSReverseResolutionTypedDict", "HostDNSTypedDict", + "HostEnrichment", + "HostEnrichmentAsset", + "HostEnrichmentAssetTypedDict", + "HostEnrichmentService", + "HostEnrichmentServiceTypedDict", + "HostEnrichmentTypedDict", "HostObservationRange", "HostObservationRangeTypedDict", "HostObservationResponse", @@ -2380,6 +2452,16 @@ "LpdMessage", "LpdMessageTypedDict", "LpdTypedDict", + "MalloryAI", + "MalloryAIObservable", + "MalloryAIObservableTypedDict", + "MalloryAIOpinion", + "MalloryAIOpinionAttributes", + "MalloryAIOpinionAttributesTypedDict", + "MalloryAIOpinionTypedDict", + "MalloryAITypedDict", + "MalloryAIVerdictSummary", + "MalloryAIVerdictSummaryTypedDict", "MatchedService", "MatchedServiceTypedDict", "Mavlink", @@ -2543,6 +2625,10 @@ "OpenDirectoryFile", "OpenDirectoryFileTypedDict", "OpenDirectoryTypedDict", + "Openflow", + "OpenflowHelloElement", + "OpenflowHelloElementTypedDict", + "OpenflowTypedDict", "Openvpn", "OpenvpnMgmt", "OpenvpnMgmtTypedDict", @@ -2697,6 +2783,10 @@ "Reject", "RejectType", "RejectTypedDict", + "ReolinkBaichuan", + "ReolinkBaichuanAlarmChannel", + "ReolinkBaichuanAlarmChannelTypedDict", + "ReolinkBaichuanTypedDict", "ReplayCapabilities", "ReplayCapabilitiesTypedDict", "RepresentativeInfo", @@ -2740,6 +2830,8 @@ "ResponseEnvelopeDNSNameResolutionRangeResponseTypedDict", "ResponseEnvelopeHostAsset", "ResponseEnvelopeHostAssetTypedDict", + "ResponseEnvelopeHostEnrichmentAsset", + "ResponseEnvelopeHostEnrichmentAssetTypedDict", "ResponseEnvelopeHostObservationResponse", "ResponseEnvelopeHostObservationResponseTypedDict", "ResponseEnvelopeHostTimeline", @@ -2826,6 +2918,10 @@ "RoutingTypedDict", "RsaPublicKey", "RsaPublicKeyTypedDict", + "Rtmp", + "RtmpConnectStatus", + "RtmpConnectStatusTypedDict", + "RtmpTypedDict", "Rtsp", "RtspTypedDict", "RustdeskHeartbeat", @@ -3011,6 +3107,8 @@ "StunTypedDict", "SubjectKeyInfo", "SubjectKeyInfoTypedDict", + "Synergy", + "SynergyTypedDict", "SystemCapabilities", "SystemCapabilitiesTypedDict", "TLS", @@ -3049,6 +3147,8 @@ "TelnetTypedDict", "TextMessage", "TextMessageTypedDict", + "ThirdParty", + "ThirdPartyTypedDict", "Threat", "ThreatActor", "ThreatActorTypedDict", @@ -3248,6 +3348,12 @@ "V3GlobaldataAssetCertificateRequestTypedDict", "V3GlobaldataAssetCertificateResponse", "V3GlobaldataAssetCertificateResponseTypedDict", + "V3GlobaldataAssetHostEnrichmentGlobals", + "V3GlobaldataAssetHostEnrichmentGlobalsTypedDict", + "V3GlobaldataAssetHostEnrichmentRequest", + "V3GlobaldataAssetHostEnrichmentRequestTypedDict", + "V3GlobaldataAssetHostEnrichmentResponse", + "V3GlobaldataAssetHostEnrichmentResponseTypedDict", "V3GlobaldataAssetHostGlobals", "V3GlobaldataAssetHostGlobalsTypedDict", "V3GlobaldataAssetHostListPostGlobals", @@ -3482,8 +3588,12 @@ "WhoisTypedDict", "WhoisUpdated", "WhoisUpdatedTypedDict", + "WinceCerdisp", + "WinceCerdispTypedDict", "Winrm", "WinrmTypedDict", + "Wordpress", + "WordpressTypedDict", "Worker", "WorkerTypedDict", "WsDiscovery", @@ -3601,6 +3711,14 @@ "CiscoIpslaHandshakeMessageTypedDict": ".ciscoipsla_handshake_message", "CiscoIpslaMeasureResponse": ".ciscoipsla_measureresponse", "CiscoIpslaMeasureResponseTypedDict": ".ciscoipsla_measureresponse", + "ClickHouseHTTP": ".clickhousehttp", + "ClickHouseHTTPTypedDict": ".clickhousehttp", + "ClickHouseHTTPError": ".clickhousehttp_error", + "ClickHouseHTTPErrorTypedDict": ".clickhousehttp_error", + "ClickHouseNative": ".clickhousenative", + "ClickHouseNativeTypedDict": ".clickhousenative", + "ClickHouseNativeError": ".clickhousenative_error", + "ClickHouseNativeErrorTypedDict": ".clickhousenative_error", "Cmore": ".cmore", "CmoreTypedDict": ".cmore", "Coap": ".coap", @@ -3920,6 +4038,10 @@ "GeneralNamesTypedDict": ".generalnames", "GeneralSubtreeIP": ".generalsubtreeip", "GeneralSubtreeIPTypedDict": ".generalsubtreeip", + "Gopher": ".gopher", + "GopherTypedDict": ".gopher", + "GopherItem": ".gopher_item", + "GopherItemTypedDict": ".gopher_item", "Graphql": ".graphql", "GraphqlTypedDict": ".graphql", "Greynoise": ".greynoise", @@ -3949,6 +4071,12 @@ "RecordType": ".hostdns_forwardresolution", "HostDNSReverseResolution": ".hostdns_reverseresolution", "HostDNSReverseResolutionTypedDict": ".hostdns_reverseresolution", + "HostEnrichment": ".hostenrichment", + "HostEnrichmentTypedDict": ".hostenrichment", + "HostEnrichmentAsset": ".hostenrichmentasset", + "HostEnrichmentAssetTypedDict": ".hostenrichmentasset", + "HostEnrichmentService": ".hostenrichmentservice", + "HostEnrichmentServiceTypedDict": ".hostenrichmentservice", "HostObservationRange": ".hostobservationrange", "HostObservationRangeTypedDict": ".hostobservationrange", "HostObservationResponse": ".hostobservationresponse", @@ -4095,6 +4223,16 @@ "LpdTypedDict": ".lpd", "LpdMessage": ".lpdmessage", "LpdMessageTypedDict": ".lpdmessage", + "MalloryAI": ".malloryai", + "MalloryAITypedDict": ".malloryai", + "MalloryAIObservable": ".malloryai_observable", + "MalloryAIObservableTypedDict": ".malloryai_observable", + "MalloryAIOpinion": ".malloryai_opinion", + "MalloryAIOpinionTypedDict": ".malloryai_opinion", + "MalloryAIOpinionAttributes": ".malloryai_opinion_attributes", + "MalloryAIOpinionAttributesTypedDict": ".malloryai_opinion_attributes", + "MalloryAIVerdictSummary": ".malloryai_verdictsummary", + "MalloryAIVerdictSummaryTypedDict": ".malloryai_verdictsummary", "MatchedService": ".matchedservice", "MatchedServiceTypedDict": ".matchedservice", "TransportProtocol": ".matchedservice", @@ -4257,6 +4395,10 @@ "OpenDirectoryTypedDict": ".opendirectory", "OpenDirectoryFile": ".opendirectory_file", "OpenDirectoryFileTypedDict": ".opendirectory_file", + "Openflow": ".openflow", + "OpenflowTypedDict": ".openflow", + "OpenflowHelloElement": ".openflow_helloelement", + "OpenflowHelloElementTypedDict": ".openflow_helloelement", "Openvpn": ".openvpn", "OpenvpnTypedDict": ".openvpn", "OpenvpnMgmt": ".openvpnmgmt", @@ -4394,6 +4536,10 @@ "Reject": ".reject", "RejectType": ".reject", "RejectTypedDict": ".reject", + "ReolinkBaichuan": ".reolinkbaichuan", + "ReolinkBaichuanTypedDict": ".reolinkbaichuan", + "ReolinkBaichuanAlarmChannel": ".reolinkbaichuan_alarmchannel", + "ReolinkBaichuanAlarmChannelTypedDict": ".reolinkbaichuan_alarmchannel", "ReplayCapabilities": ".replaycapabilities", "ReplayCapabilitiesTypedDict": ".replaycapabilities", "RepresentativeInfo": ".representativeinfo", @@ -4439,6 +4585,8 @@ "ResponseEnvelopeDNSNameResolutionRangeResponseTypedDict": ".responseenvelopednsnameresolutionrangeresponse", "ResponseEnvelopeHostAsset": ".responseenvelopehostasset", "ResponseEnvelopeHostAssetTypedDict": ".responseenvelopehostasset", + "ResponseEnvelopeHostEnrichmentAsset": ".responseenvelopehostenrichmentasset", + "ResponseEnvelopeHostEnrichmentAssetTypedDict": ".responseenvelopehostenrichmentasset", "ResponseEnvelopeHostObservationResponse": ".responseenvelopehostobservationresponse", "ResponseEnvelopeHostObservationResponseTypedDict": ".responseenvelopehostobservationresponse", "ResponseEnvelopeHostTimeline": ".responseenvelopehosttimeline", @@ -4528,6 +4676,10 @@ "RSACryptographicKeyTypedDict": ".rsacryptographickey", "RsaPublicKey": ".rsapublickey", "RsaPublicKeyTypedDict": ".rsapublickey", + "Rtmp": ".rtmp", + "RtmpTypedDict": ".rtmp", + "RtmpConnectStatus": ".rtmp_connectstatus", + "RtmpConnectStatusTypedDict": ".rtmp_connectstatus", "Rtsp": ".rtsp", "RtspTypedDict": ".rtsp", "RustdeskHeartbeat": ".rustdeskheartbeat", @@ -4720,6 +4872,8 @@ "StunTurnAllocateSuccessResponseTypedDict": ".stun_turn_allocatesuccessresponse", "SubjectKeyInfo": ".subjectkeyinfo", "SubjectKeyInfoTypedDict": ".subjectkeyinfo", + "Synergy": ".synergy", + "SynergyTypedDict": ".synergy", "SystemCapabilities": ".systemcapabilities", "SystemCapabilitiesTypedDict": ".systemcapabilities", "TacacsPlus": ".tacacsplus", @@ -4742,6 +4896,8 @@ "TelnetTypedDict": ".telnet", "TextMessage": ".textmessage", "TextMessageTypedDict": ".textmessage", + "ThirdParty": ".thirdparty", + "ThirdPartyTypedDict": ".thirdparty", "Threat": ".threat", "ThreatSource": ".threat", "ThreatTypedDict": ".threat", @@ -4950,6 +5106,12 @@ "V3GlobaldataAssetCertificateRequestTypedDict": ".v3_globaldata_asset_certificateop", "V3GlobaldataAssetCertificateResponse": ".v3_globaldata_asset_certificateop", "V3GlobaldataAssetCertificateResponseTypedDict": ".v3_globaldata_asset_certificateop", + "V3GlobaldataAssetHostEnrichmentGlobals": ".v3_globaldata_asset_host_enrichmentop", + "V3GlobaldataAssetHostEnrichmentGlobalsTypedDict": ".v3_globaldata_asset_host_enrichmentop", + "V3GlobaldataAssetHostEnrichmentRequest": ".v3_globaldata_asset_host_enrichmentop", + "V3GlobaldataAssetHostEnrichmentRequestTypedDict": ".v3_globaldata_asset_host_enrichmentop", + "V3GlobaldataAssetHostEnrichmentResponse": ".v3_globaldata_asset_host_enrichmentop", + "V3GlobaldataAssetHostEnrichmentResponseTypedDict": ".v3_globaldata_asset_host_enrichmentop", "V3GlobaldataAssetHostListPostGlobals": ".v3_globaldata_asset_host_list_postop", "V3GlobaldataAssetHostListPostGlobalsTypedDict": ".v3_globaldata_asset_host_list_postop", "V3GlobaldataAssetHostListPostRequest": ".v3_globaldata_asset_host_list_postop", @@ -5185,8 +5347,12 @@ "WhoisTypedDict": ".whois", "WhoisUpdated": ".whoisupdated", "WhoisUpdatedTypedDict": ".whoisupdated", + "WinceCerdisp": ".wincecerdisp", + "WinceCerdispTypedDict": ".wincecerdisp", "Winrm": ".winrm", "WinrmTypedDict": ".winrm", + "Wordpress": ".wordpress", + "WordpressTypedDict": ".wordpress", "Worker": ".worker", "WorkerTypedDict": ".worker", "WsDiscovery": ".wsdiscovery", diff --git a/src/censys_platform/models/clickhousehttp.py b/src/censys_platform/models/clickhousehttp.py new file mode 100644 index 0000000..2a50f16 --- /dev/null +++ b/src/censys_platform/models/clickhousehttp.py @@ -0,0 +1,71 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .clickhousehttp_error import ClickHouseHTTPError, ClickHouseHTTPErrorTypedDict +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class ClickHouseHTTPTypedDict(TypedDict): + databases: NotRequired[Nullable[List[str]]] + databases_exposed: NotRequired[bool] + display_name: NotRequired[str] + error: NotRequired[ClickHouseHTTPErrorTypedDict] + timezone: NotRequired[str] + version: NotRequired[str] + + +class ClickHouseHTTP(BaseModel): + databases: OptionalNullable[List[str]] = UNSET + + databases_exposed: Optional[bool] = None + + display_name: Optional[str] = None + + error: Optional[ClickHouseHTTPError] = None + + timezone: Optional[str] = None + + version: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "databases", + "databases_exposed", + "display_name", + "error", + "timezone", + "version", + ] + ) + nullable_fields = set(["databases"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/clickhousehttp_error.py b/src/censys_platform/models/clickhousehttp_error.py new file mode 100644 index 0000000..0d89d6d --- /dev/null +++ b/src/censys_platform/models/clickhousehttp_error.py @@ -0,0 +1,34 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class ClickHouseHTTPErrorTypedDict(TypedDict): + code: NotRequired[str] + message: NotRequired[str] + + +class ClickHouseHTTPError(BaseModel): + code: Optional[str] = None + + message: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["code", "message"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/clickhousenative.py b/src/censys_platform/models/clickhousenative.py new file mode 100644 index 0000000..07b77b2 --- /dev/null +++ b/src/censys_platform/models/clickhousenative.py @@ -0,0 +1,71 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .clickhousenative_error import ( + ClickHouseNativeError, + ClickHouseNativeErrorTypedDict, +) +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class ClickHouseNativeTypedDict(TypedDict): + display_name: NotRequired[str] + error: NotRequired[ClickHouseNativeErrorTypedDict] + revision: NotRequired[int] + server_name: NotRequired[str] + timezone: NotRequired[str] + version: NotRequired[str] + version_major: NotRequired[int] + version_minor: NotRequired[int] + version_patch: NotRequired[int] + + +class ClickHouseNative(BaseModel): + display_name: Optional[str] = None + + error: Optional[ClickHouseNativeError] = None + + revision: Optional[int] = None + + server_name: Optional[str] = None + + timezone: Optional[str] = None + + version: Optional[str] = None + + version_major: Optional[int] = None + + version_minor: Optional[int] = None + + version_patch: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "display_name", + "error", + "revision", + "server_name", + "timezone", + "version", + "version_major", + "version_minor", + "version_patch", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/clickhousenative_error.py b/src/censys_platform/models/clickhousenative_error.py new file mode 100644 index 0000000..940ce3c --- /dev/null +++ b/src/censys_platform/models/clickhousenative_error.py @@ -0,0 +1,37 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class ClickHouseNativeErrorTypedDict(TypedDict): + code: NotRequired[int] + message: NotRequired[str] + name: NotRequired[str] + + +class ClickHouseNativeError(BaseModel): + code: Optional[int] = None + + message: Optional[str] = None + + name: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["code", "message", "name"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/endpointscan.py b/src/censys_platform/models/endpointscan.py index 8f71d87..e05a0c4 100644 --- a/src/censys_platform/models/endpointscan.py +++ b/src/censys_platform/models/endpointscan.py @@ -2,6 +2,7 @@ from __future__ import annotations from .chromedevtools import ChromeDevtools, ChromeDevtoolsTypedDict +from .clickhousehttp import ClickHouseHTTP, ClickHouseHTTPTypedDict from .cobaltstrike import CobaltStrike, CobaltStrikeTypedDict from .elasticsearch import ElasticSearch, ElasticSearchTypedDict from .fortigate import Fortigate, FortigateTypedDict @@ -21,6 +22,7 @@ from .scadaview import ScadaView, ScadaViewTypedDict from .screenshot import Screenshot, ScreenshotTypedDict from .tls import TLS, TLSTypedDict +from .wordpress import Wordpress, WordpressTypedDict from censys_platform import models, utils from censys_platform.types import ( BaseModel, @@ -47,6 +49,7 @@ class EndpointScanTypedDict(TypedDict): banner: NotRequired[str] banner_hash_sha256: NotRequired[str] chrome_devtools: NotRequired[ChromeDevtoolsTypedDict] + clickhouse_http: NotRequired[ClickHouseHTTPTypedDict] cobalt_strike: NotRequired[CobaltStrikeTypedDict] elasticsearch: NotRequired[ElasticSearchTypedDict] endpoint_type: NotRequired[str] @@ -74,6 +77,7 @@ class EndpointScanTypedDict(TypedDict): screenshots: NotRequired[Nullable[List[ScreenshotTypedDict]]] tls: NotRequired[TLSTypedDict] transport_protocol: NotRequired[EndpointScanTransportProtocol] + wordpress: NotRequired[WordpressTypedDict] class EndpointScan(BaseModel): @@ -83,6 +87,8 @@ class EndpointScan(BaseModel): chrome_devtools: Optional[ChromeDevtools] = None + clickhouse_http: Optional[ClickHouseHTTP] = None + cobalt_strike: Optional[CobaltStrike] = None elasticsearch: Optional[ElasticSearch] = None @@ -137,6 +143,8 @@ class EndpointScan(BaseModel): transport_protocol: Optional[EndpointScanTransportProtocol] = None + wordpress: Optional[Wordpress] = None + @field_serializer("transport_protocol") def serialize_transport_protocol(self, value): if isinstance(value, str): @@ -153,6 +161,7 @@ def serialize_model(self, handler): "banner", "banner_hash_sha256", "chrome_devtools", + "clickhouse_http", "cobalt_strike", "elasticsearch", "endpoint_type", @@ -180,6 +189,7 @@ def serialize_model(self, handler): "screenshots", "tls", "transport_protocol", + "wordpress", ] ) nullable_fields = set(["screenshots"]) diff --git a/src/censys_platform/models/endpointscanstate.py b/src/censys_platform/models/endpointscanstate.py index d612524..56cb6e2 100644 --- a/src/censys_platform/models/endpointscanstate.py +++ b/src/censys_platform/models/endpointscanstate.py @@ -2,6 +2,7 @@ from __future__ import annotations from .chromedevtools import ChromeDevtools, ChromeDevtoolsTypedDict +from .clickhousehttp import ClickHouseHTTP, ClickHouseHTTPTypedDict from .cobaltstrike import CobaltStrike, CobaltStrikeTypedDict from .elasticsearch import ElasticSearch, ElasticSearchTypedDict from .extractedendpointdata import ExtractedEndpointData, ExtractedEndpointDataTypedDict @@ -21,6 +22,7 @@ from .redlionweb import RedlionWeb, RedlionWebTypedDict from .scadaview import ScadaView, ScadaViewTypedDict from .screenshot import Screenshot, ScreenshotTypedDict +from .wordpress import Wordpress, WordpressTypedDict from censys_platform import models, utils from censys_platform.types import ( BaseModel, @@ -47,6 +49,7 @@ class EndpointScanStateTypedDict(TypedDict): banner: NotRequired[str] banner_hash_sha256: NotRequired[str] chrome_devtools: NotRequired[ChromeDevtoolsTypedDict] + clickhouse_http: NotRequired[ClickHouseHTTPTypedDict] cobalt_strike: NotRequired[CobaltStrikeTypedDict] elasticsearch: NotRequired[ElasticSearchTypedDict] endpoint_type: NotRequired[str] @@ -73,6 +76,7 @@ class EndpointScanStateTypedDict(TypedDict): scan_time: NotRequired[str] screenshots: NotRequired[Nullable[List[ScreenshotTypedDict]]] transport_protocol: NotRequired[EndpointScanStateTransportProtocol] + wordpress: NotRequired[WordpressTypedDict] class EndpointScanState(BaseModel): @@ -82,6 +86,8 @@ class EndpointScanState(BaseModel): chrome_devtools: Optional[ChromeDevtools] = None + clickhouse_http: Optional[ClickHouseHTTP] = None + cobalt_strike: Optional[CobaltStrike] = None elasticsearch: Optional[ElasticSearch] = None @@ -134,6 +140,8 @@ class EndpointScanState(BaseModel): transport_protocol: Optional[EndpointScanStateTransportProtocol] = None + wordpress: Optional[Wordpress] = None + @field_serializer("transport_protocol") def serialize_transport_protocol(self, value): if isinstance(value, str): @@ -150,6 +158,7 @@ def serialize_model(self, handler): "banner", "banner_hash_sha256", "chrome_devtools", + "clickhouse_http", "cobalt_strike", "elasticsearch", "endpoint_type", @@ -176,6 +185,7 @@ def serialize_model(self, handler): "scan_time", "screenshots", "transport_protocol", + "wordpress", ] ) nullable_fields = set(["screenshots"]) diff --git a/src/censys_platform/models/gopher.py b/src/censys_platform/models/gopher.py new file mode 100644 index 0000000..1e402a6 --- /dev/null +++ b/src/censys_platform/models/gopher.py @@ -0,0 +1,53 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .gopher_item import GopherItem, GopherItemTypedDict +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class GopherTypedDict(TypedDict): + body: NotRequired[str] + items: NotRequired[Nullable[List[GopherItemTypedDict]]] + title: NotRequired[str] + + +class Gopher(BaseModel): + body: Optional[str] = None + + items: OptionalNullable[List[GopherItem]] = UNSET + + title: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["body", "items", "title"]) + nullable_fields = set(["items"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/gopher_item.py b/src/censys_platform/models/gopher_item.py new file mode 100644 index 0000000..9b018af --- /dev/null +++ b/src/censys_platform/models/gopher_item.py @@ -0,0 +1,45 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class GopherItemTypedDict(TypedDict): + display_string: NotRequired[str] + hostname: NotRequired[str] + item_type: NotRequired[str] + port: NotRequired[int] + selector: NotRequired[str] + + +class GopherItem(BaseModel): + display_string: Optional[str] = None + + hostname: Optional[str] = None + + item_type: Optional[str] = None + + port: Optional[int] = None + + selector: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["display_string", "hostname", "item_type", "port", "selector"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/hostenrichment.py b/src/censys_platform/models/hostenrichment.py new file mode 100644 index 0000000..ece9650 --- /dev/null +++ b/src/censys_platform/models/hostenrichment.py @@ -0,0 +1,113 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .greynoise import Greynoise, GreynoiseTypedDict +from .hostdns import HostDNS, HostDNSTypedDict +from .hostenrichmentservice import HostEnrichmentService, HostEnrichmentServiceTypedDict +from .label import Label, LabelTypedDict +from .location import Location, LocationTypedDict +from .networkclassification import NetworkClassification, NetworkClassificationTypedDict +from .privacy import Privacy, PrivacyTypedDict +from .reputation import Reputation, ReputationTypedDict +from .routing import Routing, RoutingTypedDict +from .thirdparty import ThirdParty, ThirdPartyTypedDict +from .whois import Whois, WhoisTypedDict +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class HostEnrichmentTypedDict(TypedDict): + autonomous_system: NotRequired[RoutingTypedDict] + dns: NotRequired[HostDNSTypedDict] + greynoise: NotRequired[GreynoiseTypedDict] + ip: NotRequired[str] + labels: NotRequired[Nullable[List[LabelTypedDict]]] + location: NotRequired[LocationTypedDict] + network: NotRequired[Nullable[List[NetworkClassificationTypedDict]]] + r"""Information about what type of network the host belongs to.""" + privacy: NotRequired[Nullable[List[PrivacyTypedDict]]] + r"""Information about privacy services used by the IP, such as VPNs, Proxies, or Tor.""" + reputation: NotRequired[ReputationTypedDict] + service_count: NotRequired[int] + services: NotRequired[Nullable[List[HostEnrichmentServiceTypedDict]]] + third_party: NotRequired[ThirdPartyTypedDict] + whois: NotRequired[WhoisTypedDict] + + +class HostEnrichment(BaseModel): + autonomous_system: Optional[Routing] = None + + dns: Optional[HostDNS] = None + + greynoise: Optional[Greynoise] = None + + ip: Optional[str] = None + + labels: OptionalNullable[List[Label]] = UNSET + + location: Optional[Location] = None + + network: OptionalNullable[List[NetworkClassification]] = UNSET + r"""Information about what type of network the host belongs to.""" + + privacy: OptionalNullable[List[Privacy]] = UNSET + r"""Information about privacy services used by the IP, such as VPNs, Proxies, or Tor.""" + + reputation: Optional[Reputation] = None + + service_count: Optional[int] = None + + services: OptionalNullable[List[HostEnrichmentService]] = UNSET + + third_party: Optional[ThirdParty] = None + + whois: Optional[Whois] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "autonomous_system", + "dns", + "greynoise", + "ip", + "labels", + "location", + "network", + "privacy", + "reputation", + "service_count", + "services", + "third_party", + "whois", + ] + ) + nullable_fields = set(["labels", "network", "privacy", "services"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/hostenrichmentasset.py b/src/censys_platform/models/hostenrichmentasset.py new file mode 100644 index 0000000..7e923cc --- /dev/null +++ b/src/censys_platform/models/hostenrichmentasset.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .hostenrichment import HostEnrichment, HostEnrichmentTypedDict +from censys_platform.types import BaseModel +from typing import Any, Dict +from typing_extensions import TypedDict + + +class HostEnrichmentAssetTypedDict(TypedDict): + extensions: Dict[str, Any] + resource: HostEnrichmentTypedDict + + +class HostEnrichmentAsset(BaseModel): + extensions: Dict[str, Any] + + resource: HostEnrichment diff --git a/src/censys_platform/models/hostenrichmentservice.py b/src/censys_platform/models/hostenrichmentservice.py new file mode 100644 index 0000000..baee49c --- /dev/null +++ b/src/censys_platform/models/hostenrichmentservice.py @@ -0,0 +1,57 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .label import Label, LabelTypedDict +from .threat import Threat, ThreatTypedDict +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class HostEnrichmentServiceTypedDict(TypedDict): + labels: NotRequired[Nullable[List[LabelTypedDict]]] + port: NotRequired[int] + protocol: NotRequired[str] + threats: NotRequired[Nullable[List[ThreatTypedDict]]] + + +class HostEnrichmentService(BaseModel): + labels: OptionalNullable[List[Label]] = UNSET + + port: Optional[int] = None + + protocol: Optional[str] = None + + threats: OptionalNullable[List[Threat]] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["labels", "port", "protocol", "threats"]) + nullable_fields = set(["labels", "threats"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/malloryai.py b/src/censys_platform/models/malloryai.py new file mode 100644 index 0000000..c0dc1cb --- /dev/null +++ b/src/censys_platform/models/malloryai.py @@ -0,0 +1,88 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .malloryai_observable import MalloryAIObservable, MalloryAIObservableTypedDict +from .malloryai_opinion import MalloryAIOpinion, MalloryAIOpinionTypedDict +from .malloryai_verdictsummary import ( + MalloryAIVerdictSummary, + MalloryAIVerdictSummaryTypedDict, +) +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class MalloryAITypedDict(TypedDict): + created_at: NotRequired[str] + first_seen_at: NotRequired[str] + last_seen_at: NotRequired[str] + observable: NotRequired[MalloryAIObservableTypedDict] + opinions: NotRequired[Nullable[List[MalloryAIOpinionTypedDict]]] + source_count: NotRequired[int] + updated_at: NotRequired[str] + uuid: NotRequired[str] + verdict_summary: NotRequired[MalloryAIVerdictSummaryTypedDict] + + +class MalloryAI(BaseModel): + created_at: Optional[str] = None + + first_seen_at: Optional[str] = None + + last_seen_at: Optional[str] = None + + observable: Optional[MalloryAIObservable] = None + + opinions: OptionalNullable[List[MalloryAIOpinion]] = UNSET + + source_count: Optional[int] = None + + updated_at: Optional[str] = None + + uuid: Optional[str] = None + + verdict_summary: Optional[MalloryAIVerdictSummary] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "created_at", + "first_seen_at", + "last_seen_at", + "observable", + "opinions", + "source_count", + "updated_at", + "uuid", + "verdict_summary", + ] + ) + nullable_fields = set(["opinions"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/malloryai_observable.py b/src/censys_platform/models/malloryai_observable.py new file mode 100644 index 0000000..7df26a9 --- /dev/null +++ b/src/censys_platform/models/malloryai_observable.py @@ -0,0 +1,59 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class MalloryAIObservableTypedDict(TypedDict): + attributes: NotRequired[str] + created_at: NotRequired[str] + description: NotRequired[str] + name: NotRequired[str] + type: NotRequired[str] + updated_at: NotRequired[str] + uuid: NotRequired[str] + + +class MalloryAIObservable(BaseModel): + attributes: Optional[str] = None + + created_at: Optional[str] = None + + description: Optional[str] = None + + name: Optional[str] = None + + type: Optional[str] = None + + updated_at: Optional[str] = None + + uuid: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "attributes", + "created_at", + "description", + "name", + "type", + "updated_at", + "uuid", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/malloryai_opinion.py b/src/censys_platform/models/malloryai_opinion.py new file mode 100644 index 0000000..20c6727 --- /dev/null +++ b/src/censys_platform/models/malloryai_opinion.py @@ -0,0 +1,83 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .malloryai_opinion_attributes import ( + MalloryAIOpinionAttributes, + MalloryAIOpinionAttributesTypedDict, +) +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class MalloryAIOpinionTypedDict(TypedDict): + attributes: NotRequired[MalloryAIOpinionAttributesTypedDict] + confidence: NotRequired[str] + created_at: NotRequired[str] + description: NotRequired[str] + published_at: NotRequired[str] + reference_source_slug: NotRequired[str] + reference_url: NotRequired[str] + reference_uuid: NotRequired[str] + source: NotRequired[str] + updated_at: NotRequired[str] + uuid: NotRequired[str] + verdict: NotRequired[str] + + +class MalloryAIOpinion(BaseModel): + attributes: Optional[MalloryAIOpinionAttributes] = None + + confidence: Optional[str] = None + + created_at: Optional[str] = None + + description: Optional[str] = None + + published_at: Optional[str] = None + + reference_source_slug: Optional[str] = None + + reference_url: Optional[str] = None + + reference_uuid: Optional[str] = None + + source: Optional[str] = None + + updated_at: Optional[str] = None + + uuid: Optional[str] = None + + verdict: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "attributes", + "confidence", + "created_at", + "description", + "published_at", + "reference_source_slug", + "reference_url", + "reference_uuid", + "source", + "updated_at", + "uuid", + "verdict", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/malloryai_opinion_attributes.py b/src/censys_platform/models/malloryai_opinion_attributes.py new file mode 100644 index 0000000..c11c39e --- /dev/null +++ b/src/censys_platform/models/malloryai_opinion_attributes.py @@ -0,0 +1,69 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List +from typing_extensions import NotRequired, TypedDict + + +class MalloryAIOpinionAttributesTypedDict(TypedDict): + associated_malware: NotRequired[Nullable[List[str]]] + associated_threat_actors: NotRequired[Nullable[List[str]]] + associated_vulnerabilities: NotRequired[Nullable[List[str]]] + tags: NotRequired[Nullable[List[str]]] + + +class MalloryAIOpinionAttributes(BaseModel): + associated_malware: OptionalNullable[List[str]] = UNSET + + associated_threat_actors: OptionalNullable[List[str]] = UNSET + + associated_vulnerabilities: OptionalNullable[List[str]] = UNSET + + tags: OptionalNullable[List[str]] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "associated_malware", + "associated_threat_actors", + "associated_vulnerabilities", + "tags", + ] + ) + nullable_fields = set( + [ + "associated_malware", + "associated_threat_actors", + "associated_vulnerabilities", + "tags", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/malloryai_verdictsummary.py b/src/censys_platform/models/malloryai_verdictsummary.py new file mode 100644 index 0000000..4b9b0a6 --- /dev/null +++ b/src/censys_platform/models/malloryai_verdictsummary.py @@ -0,0 +1,34 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class MalloryAIVerdictSummaryTypedDict(TypedDict): + malicious: NotRequired[int] + suspicious: NotRequired[int] + + +class MalloryAIVerdictSummary(BaseModel): + malicious: Optional[int] = None + + suspicious: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["malicious", "suspicious"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/openflow.py b/src/censys_platform/models/openflow.py new file mode 100644 index 0000000..55ce93c --- /dev/null +++ b/src/censys_platform/models/openflow.py @@ -0,0 +1,115 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .openflow_helloelement import OpenflowHelloElement, OpenflowHelloElementTypedDict +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class OpenflowTypedDict(TypedDict): + auxiliary_id: NotRequired[int] + bare_hello: NotRequired[bool] + capabilities: NotRequired[Nullable[List[str]]] + datapath_id: NotRequired[int] + datapath_mac: NotRequired[str] + dp_desc: NotRequired[str] + hello_elements: NotRequired[Nullable[List[OpenflowHelloElementTypedDict]]] + hw_desc: NotRequired[str] + mfr_desc: NotRequired[str] + n_buffers: NotRequired[int] + n_tables: NotRequired[int] + peer_role: NotRequired[str] + protocol_version: NotRequired[str] + protocol_version_raw: NotRequired[str] + serial_num: NotRequired[str] + sw_desc: NotRequired[str] + xid: NotRequired[int] + + +class Openflow(BaseModel): + auxiliary_id: Optional[int] = None + + bare_hello: Optional[bool] = None + + capabilities: OptionalNullable[List[str]] = UNSET + + datapath_id: Optional[int] = None + + datapath_mac: Optional[str] = None + + dp_desc: Optional[str] = None + + hello_elements: OptionalNullable[List[OpenflowHelloElement]] = UNSET + + hw_desc: Optional[str] = None + + mfr_desc: Optional[str] = None + + n_buffers: Optional[int] = None + + n_tables: Optional[int] = None + + peer_role: Optional[str] = None + + protocol_version: Optional[str] = None + + protocol_version_raw: Optional[str] = None + + serial_num: Optional[str] = None + + sw_desc: Optional[str] = None + + xid: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "auxiliary_id", + "bare_hello", + "capabilities", + "datapath_id", + "datapath_mac", + "dp_desc", + "hello_elements", + "hw_desc", + "mfr_desc", + "n_buffers", + "n_tables", + "peer_role", + "protocol_version", + "protocol_version_raw", + "serial_num", + "sw_desc", + "xid", + ] + ) + nullable_fields = set(["capabilities", "hello_elements"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/openflow_helloelement.py b/src/censys_platform/models/openflow_helloelement.py new file mode 100644 index 0000000..4fb6749 --- /dev/null +++ b/src/censys_platform/models/openflow_helloelement.py @@ -0,0 +1,49 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class OpenflowHelloElementTypedDict(TypedDict): + element_type: NotRequired[str] + supported_versions: NotRequired[Nullable[List[str]]] + + +class OpenflowHelloElement(BaseModel): + element_type: Optional[str] = None + + supported_versions: OptionalNullable[List[str]] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["element_type", "supported_versions"]) + nullable_fields = set(["supported_versions"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/reolinkbaichuan.py b/src/censys_platform/models/reolinkbaichuan.py new file mode 100644 index 0000000..bf87231 --- /dev/null +++ b/src/censys_platform/models/reolinkbaichuan.py @@ -0,0 +1,78 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .reolinkbaichuan_alarmchannel import ( + ReolinkBaichuanAlarmChannel, + ReolinkBaichuanAlarmChannelTypedDict, +) +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class ReolinkBaichuanTypedDict(TypedDict): + ai_types_observed: NotRequired[Nullable[List[str]]] + body_length: NotRequired[int] + channel_count: NotRequired[int] + channels: NotRequired[Nullable[List[ReolinkBaichuanAlarmChannelTypedDict]]] + command_id: NotRequired[int] + raw_xml: NotRequired[str] + status_code: NotRequired[int] + + +class ReolinkBaichuan(BaseModel): + ai_types_observed: OptionalNullable[List[str]] = UNSET + + body_length: Optional[int] = None + + channel_count: Optional[int] = None + + channels: OptionalNullable[List[ReolinkBaichuanAlarmChannel]] = UNSET + + command_id: Optional[int] = None + + raw_xml: Optional[str] = None + + status_code: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "ai_types_observed", + "body_length", + "channel_count", + "channels", + "command_id", + "raw_xml", + "status_code", + ] + ) + nullable_fields = set(["ai_types_observed", "channels"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/reolinkbaichuan_alarmchannel.py b/src/censys_platform/models/reolinkbaichuan_alarmchannel.py new file mode 100644 index 0000000..ec75b48 --- /dev/null +++ b/src/censys_platform/models/reolinkbaichuan_alarmchannel.py @@ -0,0 +1,45 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class ReolinkBaichuanAlarmChannelTypedDict(TypedDict): + ai_type: NotRequired[str] + channel_id: NotRequired[int] + recording: NotRequired[int] + status: NotRequired[str] + timestamp: NotRequired[int] + + +class ReolinkBaichuanAlarmChannel(BaseModel): + ai_type: Optional[str] = None + + channel_id: Optional[int] = None + + recording: Optional[int] = None + + status: Optional[str] = None + + timestamp: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["ai_type", "channel_id", "recording", "status", "timestamp"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/responseenvelopehostenrichmentasset.py b/src/censys_platform/models/responseenvelopehostenrichmentasset.py new file mode 100644 index 0000000..93594e7 --- /dev/null +++ b/src/censys_platform/models/responseenvelopehostenrichmentasset.py @@ -0,0 +1,32 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .hostenrichmentasset import HostEnrichmentAsset, HostEnrichmentAssetTypedDict +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class ResponseEnvelopeHostEnrichmentAssetTypedDict(TypedDict): + result: NotRequired[HostEnrichmentAssetTypedDict] + + +class ResponseEnvelopeHostEnrichmentAsset(BaseModel): + result: Optional[HostEnrichmentAsset] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["result"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/rtmp.py b/src/censys_platform/models/rtmp.py new file mode 100644 index 0000000..a85b7a5 --- /dev/null +++ b/src/censys_platform/models/rtmp.py @@ -0,0 +1,60 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .rtmp_connectstatus import RtmpConnectStatus, RtmpConnectStatusTypedDict +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class RtmpTypedDict(TypedDict): + capabilities: NotRequired[int] + mode: NotRequired[int] + peer_bandwidth: NotRequired[int] + protocol_version: NotRequired[int] + server_software: NotRequired[str] + status: NotRequired[RtmpConnectStatusTypedDict] + window_acknowledgement_size: NotRequired[int] + + +class Rtmp(BaseModel): + capabilities: Optional[int] = None + + mode: Optional[int] = None + + peer_bandwidth: Optional[int] = None + + protocol_version: Optional[int] = None + + server_software: Optional[str] = None + + status: Optional[RtmpConnectStatus] = None + + window_acknowledgement_size: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "capabilities", + "mode", + "peer_bandwidth", + "protocol_version", + "server_software", + "status", + "window_acknowledgement_size", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/rtmp_connectstatus.py b/src/censys_platform/models/rtmp_connectstatus.py new file mode 100644 index 0000000..7da64d2 --- /dev/null +++ b/src/censys_platform/models/rtmp_connectstatus.py @@ -0,0 +1,40 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class RtmpConnectStatusTypedDict(TypedDict): + code: NotRequired[str] + description: NotRequired[str] + level: NotRequired[str] + object_encoding: NotRequired[int] + + +class RtmpConnectStatus(BaseModel): + code: Optional[str] = None + + description: Optional[str] = None + + level: Optional[str] = None + + object_encoding: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["code", "description", "level", "object_encoding"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/service.py b/src/censys_platform/models/service.py index f780a87..dbb27b2 100644 --- a/src/censys_platform/models/service.py +++ b/src/censys_platform/models/service.py @@ -15,6 +15,7 @@ from .checkpointtopology import CheckpointTopology, CheckpointTopologyTypedDict from .chromecast import Chromecast, ChromecastTypedDict from .ciscoipsla import CiscoIpsla, CiscoIpslaTypedDict +from .clickhousenative import ClickHouseNative, ClickHouseNativeTypedDict from .cmore import Cmore, CmoreTypedDict from .coap import Coap, CoapTypedDict from .crestroncp3 import CrestronCp3, CrestronCp3TypedDict @@ -41,6 +42,7 @@ from .ftp import Ftp, FtpTypedDict from .gearman import Gearman, GearmanTypedDict from .gemini import Gemini, GeminiTypedDict +from .gopher import Gopher, GopherTypedDict from .hajime import Hajime, HajimeTypedDict from .hidvertx import HidVertx, HidVertxTypedDict from .hikvision import Hikvision, HikvisionTypedDict @@ -83,6 +85,7 @@ from .onc import Onc, OncTypedDict from .onvif import Onvif, OnvifTypedDict from .opcua import OpcUa, OpcUaTypedDict +from .openflow import Openflow, OpenflowTypedDict from .openvpn import Openvpn, OpenvpnTypedDict from .openvpnmgmt import OpenvpnMgmt, OpenvpnMgmtTypedDict from .oracle import Oracle, OracleTypedDict @@ -99,6 +102,7 @@ from .redis import Redis, RedisTypedDict from .redline import Redline, RedlineTypedDict from .redlioncrimson import RedlionCrimson, RedlionCrimsonTypedDict +from .reolinkbaichuan import ReolinkBaichuan, ReolinkBaichuanTypedDict from .representativeinfo import RepresentativeInfo, RepresentativeInfoTypedDict from .rifatron import Rifatron, RifatronTypedDict from .ripple import Ripple, RippleTypedDict @@ -106,6 +110,7 @@ from .rlogin import Rlogin, RloginTypedDict from .rocketmq import Rocketmq, RocketmqTypedDict from .routerosapi import RouterosAPI, RouterosAPITypedDict +from .rtmp import Rtmp, RtmpTypedDict from .rtsp import Rtsp, RtspTypedDict from .rustdeskheartbeat import RustdeskHeartbeat, RustdeskHeartbeatTypedDict from .rustdeskrelay import RustdeskRelay, RustdeskRelayTypedDict @@ -128,6 +133,7 @@ from .ssh import SSH, SSHTypedDict from .steam import Steam, SteamTypedDict from .stun import Stun, StunTypedDict +from .synergy import Synergy, SynergyTypedDict from .tacacsplus import TacacsPlus, TacacsPlusTypedDict from .teamviewer import TeamViewer, TeamViewerTypedDict from .telnet import Telnet, TelnetTypedDict @@ -141,6 +147,7 @@ from .vnc import Vnc, VncTypedDict from .vuln import Vuln, VulnTypedDict from .weblogict3 import WeblogicT3, WeblogicT3TypedDict +from .wincecerdisp import WinceCerdisp, WinceCerdispTypedDict from .winrm import Winrm, WinrmTypedDict from .wsdiscovery import WsDiscovery, WsDiscoveryTypedDict from .x11 import X11, X11TypedDict @@ -181,6 +188,7 @@ class ServiceTypedDict(TypedDict): checkpoint_topology: NotRequired[CheckpointTopologyTypedDict] chromecast: NotRequired[ChromecastTypedDict] cisco_ipsla: NotRequired[CiscoIpslaTypedDict] + clickhouse_native: NotRequired[ClickHouseNativeTypedDict] cmore: NotRequired[CmoreTypedDict] coap: NotRequired[CoapTypedDict] compromises: NotRequired[Nullable[List[RiskTypedDict]]] @@ -209,6 +217,7 @@ class ServiceTypedDict(TypedDict): ftp: NotRequired[FtpTypedDict] gearman: NotRequired[GearmanTypedDict] gemini: NotRequired[GeminiTypedDict] + gopher: NotRequired[GopherTypedDict] hajime: NotRequired[HajimeTypedDict] hardware: NotRequired[Nullable[List[AttributeTypedDict]]] hid_vertx: NotRequired[HidVertxTypedDict] @@ -254,6 +263,7 @@ class ServiceTypedDict(TypedDict): onc: NotRequired[OncTypedDict] onvif: NotRequired[OnvifTypedDict] opc_ua: NotRequired[OpcUaTypedDict] + openflow: NotRequired[OpenflowTypedDict] openvpn: NotRequired[OpenvpnTypedDict] openvpn_mgmt: NotRequired[OpenvpnMgmtTypedDict] operating_systems: NotRequired[Nullable[List[AttributeTypedDict]]] @@ -273,12 +283,14 @@ class ServiceTypedDict(TypedDict): redis: NotRequired[RedisTypedDict] redline: NotRequired[RedlineTypedDict] redlion_crimson: NotRequired[RedlionCrimsonTypedDict] + reolink_baichuan: NotRequired[ReolinkBaichuanTypedDict] representative_info: NotRequired[RepresentativeInfoTypedDict] rifatron: NotRequired[RifatronTypedDict] ripple: NotRequired[RippleTypedDict] rlogin: NotRequired[RloginTypedDict] rocketmq: NotRequired[RocketmqTypedDict] routeros_api: NotRequired[RouterosAPITypedDict] + rtmp: NotRequired[RtmpTypedDict] rtsp: NotRequired[RtspTypedDict] rustdesk_heartbeat: NotRequired[RustdeskHeartbeatTypedDict] rustdesk_relay: NotRequired[RustdeskRelayTypedDict] @@ -303,6 +315,7 @@ class ServiceTypedDict(TypedDict): ssh: NotRequired[SSHTypedDict] steam: NotRequired[SteamTypedDict] stun: NotRequired[StunTypedDict] + synergy: NotRequired[SynergyTypedDict] tacacs_plus: NotRequired[TacacsPlusTypedDict] team_viewer: NotRequired[TeamViewerTypedDict] telnet: NotRequired[TelnetTypedDict] @@ -317,6 +330,7 @@ class ServiceTypedDict(TypedDict): vnc: NotRequired[VncTypedDict] vulns: NotRequired[Nullable[List[VulnTypedDict]]] weblogic_t3: NotRequired[WeblogicT3TypedDict] + wince_cerdisp: NotRequired[WinceCerdispTypedDict] winrm: NotRequired[WinrmTypedDict] ws_discovery: NotRequired[WsDiscoveryTypedDict] x11: NotRequired[X11TypedDict] @@ -350,6 +364,8 @@ class Service(BaseModel): cisco_ipsla: Optional[CiscoIpsla] = None + clickhouse_native: Optional[ClickHouseNative] = None + cmore: Optional[Cmore] = None coap: Optional[Coap] = None @@ -406,6 +422,8 @@ class Service(BaseModel): gemini: Optional[Gemini] = None + gopher: Optional[Gopher] = None + hajime: Optional[Hajime] = None hardware: OptionalNullable[List[Attribute]] = UNSET @@ -496,6 +514,8 @@ class Service(BaseModel): opc_ua: Optional[OpcUa] = None + openflow: Optional[Openflow] = None + openvpn: Optional[Openvpn] = None openvpn_mgmt: Optional[OpenvpnMgmt] = None @@ -534,6 +554,8 @@ class Service(BaseModel): redlion_crimson: Optional[RedlionCrimson] = None + reolink_baichuan: Optional[ReolinkBaichuan] = None + representative_info: Optional[RepresentativeInfo] = None rifatron: Optional[Rifatron] = None @@ -546,6 +568,8 @@ class Service(BaseModel): routeros_api: Optional[RouterosAPI] = None + rtmp: Optional[Rtmp] = None + rtsp: Optional[Rtsp] = None rustdesk_heartbeat: Optional[RustdeskHeartbeat] = None @@ -594,6 +618,8 @@ class Service(BaseModel): stun: Optional[Stun] = None + synergy: Optional[Synergy] = None + tacacs_plus: Optional[TacacsPlus] = None team_viewer: Optional[TeamViewer] = None @@ -622,6 +648,8 @@ class Service(BaseModel): weblogic_t3: Optional[WeblogicT3] = None + wince_cerdisp: Optional[WinceCerdisp] = None + winrm: Optional[Winrm] = None ws_discovery: Optional[WsDiscovery] = None @@ -656,6 +684,7 @@ def serialize_model(self, handler): "checkpoint_topology", "chromecast", "cisco_ipsla", + "clickhouse_native", "cmore", "coap", "compromises", @@ -684,6 +713,7 @@ def serialize_model(self, handler): "ftp", "gearman", "gemini", + "gopher", "hajime", "hardware", "hid_vertx", @@ -729,6 +759,7 @@ def serialize_model(self, handler): "onc", "onvif", "opc_ua", + "openflow", "openvpn", "openvpn_mgmt", "operating_systems", @@ -748,12 +779,14 @@ def serialize_model(self, handler): "redis", "redline", "redlion_crimson", + "reolink_baichuan", "representative_info", "rifatron", "ripple", "rlogin", "rocketmq", "routeros_api", + "rtmp", "rtsp", "rustdesk_heartbeat", "rustdesk_relay", @@ -778,6 +811,7 @@ def serialize_model(self, handler): "ssh", "steam", "stun", + "synergy", "tacacs_plus", "team_viewer", "telnet", @@ -792,6 +826,7 @@ def serialize_model(self, handler): "vnc", "vulns", "weblogic_t3", + "wince_cerdisp", "winrm", "ws_discovery", "x11", diff --git a/src/censys_platform/models/servicescan.py b/src/censys_platform/models/servicescan.py index eafa851..5ec0981 100644 --- a/src/censys_platform/models/servicescan.py +++ b/src/censys_platform/models/servicescan.py @@ -13,6 +13,7 @@ from .checkpointtopology import CheckpointTopology, CheckpointTopologyTypedDict from .chromecast import Chromecast, ChromecastTypedDict from .ciscoipsla import CiscoIpsla, CiscoIpslaTypedDict +from .clickhousenative import ClickHouseNative, ClickHouseNativeTypedDict from .cmore import Cmore, CmoreTypedDict from .coap import Coap, CoapTypedDict from .crestroncp3 import CrestronCp3, CrestronCp3TypedDict @@ -38,6 +39,7 @@ from .ftp import Ftp, FtpTypedDict from .gearman import Gearman, GearmanTypedDict from .gemini import Gemini, GeminiTypedDict +from .gopher import Gopher, GopherTypedDict from .hajime import Hajime, HajimeTypedDict from .hidvertx import HidVertx, HidVertxTypedDict from .hikvision import Hikvision, HikvisionTypedDict @@ -77,6 +79,7 @@ from .onc import Onc, OncTypedDict from .onvif import Onvif, OnvifTypedDict from .opcua import OpcUa, OpcUaTypedDict +from .openflow import Openflow, OpenflowTypedDict from .openvpn import Openvpn, OpenvpnTypedDict from .openvpnmgmt import OpenvpnMgmt, OpenvpnMgmtTypedDict from .oracle import Oracle, OracleTypedDict @@ -93,12 +96,14 @@ from .redis import Redis, RedisTypedDict from .redline import Redline, RedlineTypedDict from .redlioncrimson import RedlionCrimson, RedlionCrimsonTypedDict +from .reolinkbaichuan import ReolinkBaichuan, ReolinkBaichuanTypedDict from .representativeinfo import RepresentativeInfo, RepresentativeInfoTypedDict from .rifatron import Rifatron, RifatronTypedDict from .ripple import Ripple, RippleTypedDict from .rlogin import Rlogin, RloginTypedDict from .rocketmq import Rocketmq, RocketmqTypedDict from .routerosapi import RouterosAPI, RouterosAPITypedDict +from .rtmp import Rtmp, RtmpTypedDict from .rtsp import Rtsp, RtspTypedDict from .rustdeskheartbeat import RustdeskHeartbeat, RustdeskHeartbeatTypedDict from .rustdeskrelay import RustdeskRelay, RustdeskRelayTypedDict @@ -121,6 +126,7 @@ from .ssh import SSH, SSHTypedDict from .steam import Steam, SteamTypedDict from .stun import Stun, StunTypedDict +from .synergy import Synergy, SynergyTypedDict from .tacacsplus import TacacsPlus, TacacsPlusTypedDict from .teamviewer import TeamViewer, TeamViewerTypedDict from .telnet import Telnet, TelnetTypedDict @@ -132,6 +138,7 @@ from .ventrilo import Ventrilo, VentriloTypedDict from .vnc import Vnc, VncTypedDict from .weblogict3 import WeblogicT3, WeblogicT3TypedDict +from .wincecerdisp import WinceCerdisp, WinceCerdispTypedDict from .winrm import Winrm, WinrmTypedDict from .wsdiscovery import WsDiscovery, WsDiscoveryTypedDict from .x11 import X11, X11TypedDict @@ -170,6 +177,7 @@ class ServiceScanTypedDict(TypedDict): checkpoint_topology: NotRequired[CheckpointTopologyTypedDict] chromecast: NotRequired[ChromecastTypedDict] cisco_ipsla: NotRequired[CiscoIpslaTypedDict] + clickhouse_native: NotRequired[ClickHouseNativeTypedDict] cmore: NotRequired[CmoreTypedDict] coap: NotRequired[CoapTypedDict] crestron_cp3: NotRequired[CrestronCp3TypedDict] @@ -195,6 +203,7 @@ class ServiceScanTypedDict(TypedDict): ftp: NotRequired[FtpTypedDict] gearman: NotRequired[GearmanTypedDict] gemini: NotRequired[GeminiTypedDict] + gopher: NotRequired[GopherTypedDict] hajime: NotRequired[HajimeTypedDict] hid_vertx: NotRequired[HidVertxTypedDict] hikvision: NotRequired[HikvisionTypedDict] @@ -236,6 +245,7 @@ class ServiceScanTypedDict(TypedDict): onc: NotRequired[OncTypedDict] onvif: NotRequired[OnvifTypedDict] opc_ua: NotRequired[OpcUaTypedDict] + openflow: NotRequired[OpenflowTypedDict] openvpn: NotRequired[OpenvpnTypedDict] openvpn_mgmt: NotRequired[OpenvpnMgmtTypedDict] oracle: NotRequired[OracleTypedDict] @@ -254,12 +264,14 @@ class ServiceScanTypedDict(TypedDict): redis: NotRequired[RedisTypedDict] redline: NotRequired[RedlineTypedDict] redlion_crimson: NotRequired[RedlionCrimsonTypedDict] + reolink_baichuan: NotRequired[ReolinkBaichuanTypedDict] representative_info: NotRequired[RepresentativeInfoTypedDict] rifatron: NotRequired[RifatronTypedDict] ripple: NotRequired[RippleTypedDict] rlogin: NotRequired[RloginTypedDict] rocketmq: NotRequired[RocketmqTypedDict] routeros_api: NotRequired[RouterosAPITypedDict] + rtmp: NotRequired[RtmpTypedDict] rtsp: NotRequired[RtspTypedDict] rustdesk_heartbeat: NotRequired[RustdeskHeartbeatTypedDict] rustdesk_relay: NotRequired[RustdeskRelayTypedDict] @@ -283,6 +295,7 @@ class ServiceScanTypedDict(TypedDict): ssh: NotRequired[SSHTypedDict] steam: NotRequired[SteamTypedDict] stun: NotRequired[StunTypedDict] + synergy: NotRequired[SynergyTypedDict] tacacs_plus: NotRequired[TacacsPlusTypedDict] team_viewer: NotRequired[TeamViewerTypedDict] telnet: NotRequired[TelnetTypedDict] @@ -295,6 +308,7 @@ class ServiceScanTypedDict(TypedDict): ventrilo: NotRequired[VentriloTypedDict] vnc: NotRequired[VncTypedDict] weblogic_t3: NotRequired[WeblogicT3TypedDict] + wince_cerdisp: NotRequired[WinceCerdispTypedDict] winrm: NotRequired[WinrmTypedDict] ws_discovery: NotRequired[WsDiscoveryTypedDict] x11: NotRequired[X11TypedDict] @@ -324,6 +338,8 @@ class ServiceScan(BaseModel): cisco_ipsla: Optional[CiscoIpsla] = None + clickhouse_native: Optional[ClickHouseNative] = None + cmore: Optional[Cmore] = None coap: Optional[Coap] = None @@ -374,6 +390,8 @@ class ServiceScan(BaseModel): gemini: Optional[Gemini] = None + gopher: Optional[Gopher] = None + hajime: Optional[Hajime] = None hid_vertx: Optional[HidVertx] = None @@ -456,6 +474,8 @@ class ServiceScan(BaseModel): opc_ua: Optional[OpcUa] = None + openflow: Optional[Openflow] = None + openvpn: Optional[Openvpn] = None openvpn_mgmt: Optional[OpenvpnMgmt] = None @@ -492,6 +512,8 @@ class ServiceScan(BaseModel): redlion_crimson: Optional[RedlionCrimson] = None + reolink_baichuan: Optional[ReolinkBaichuan] = None + representative_info: Optional[RepresentativeInfo] = None rifatron: Optional[Rifatron] = None @@ -504,6 +526,8 @@ class ServiceScan(BaseModel): routeros_api: Optional[RouterosAPI] = None + rtmp: Optional[Rtmp] = None + rtsp: Optional[Rtsp] = None rustdesk_heartbeat: Optional[RustdeskHeartbeat] = None @@ -550,6 +574,8 @@ class ServiceScan(BaseModel): stun: Optional[Stun] = None + synergy: Optional[Synergy] = None + tacacs_plus: Optional[TacacsPlus] = None team_viewer: Optional[TeamViewer] = None @@ -574,6 +600,8 @@ class ServiceScan(BaseModel): weblogic_t3: Optional[WeblogicT3] = None + wince_cerdisp: Optional[WinceCerdisp] = None + winrm: Optional[Winrm] = None ws_discovery: Optional[WsDiscovery] = None @@ -606,6 +634,7 @@ def serialize_model(self, handler): "checkpoint_topology", "chromecast", "cisco_ipsla", + "clickhouse_native", "cmore", "coap", "crestron_cp3", @@ -631,6 +660,7 @@ def serialize_model(self, handler): "ftp", "gearman", "gemini", + "gopher", "hajime", "hid_vertx", "hikvision", @@ -672,6 +702,7 @@ def serialize_model(self, handler): "onc", "onvif", "opc_ua", + "openflow", "openvpn", "openvpn_mgmt", "oracle", @@ -690,12 +721,14 @@ def serialize_model(self, handler): "redis", "redline", "redlion_crimson", + "reolink_baichuan", "representative_info", "rifatron", "ripple", "rlogin", "rocketmq", "routeros_api", + "rtmp", "rtsp", "rustdesk_heartbeat", "rustdesk_relay", @@ -719,6 +752,7 @@ def serialize_model(self, handler): "ssh", "steam", "stun", + "synergy", "tacacs_plus", "team_viewer", "telnet", @@ -731,6 +765,7 @@ def serialize_model(self, handler): "ventrilo", "vnc", "weblogic_t3", + "wince_cerdisp", "winrm", "ws_discovery", "x11", diff --git a/src/censys_platform/models/synergy.py b/src/censys_platform/models/synergy.py new file mode 100644 index 0000000..70442f8 --- /dev/null +++ b/src/censys_platform/models/synergy.py @@ -0,0 +1,37 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class SynergyTypedDict(TypedDict): + protocol_major: NotRequired[int] + protocol_minor: NotRequired[int] + protocol_version: NotRequired[str] + + +class Synergy(BaseModel): + protocol_major: Optional[int] = None + + protocol_minor: Optional[int] = None + + protocol_version: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["protocol_major", "protocol_minor", "protocol_version"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/thirdparty.py b/src/censys_platform/models/thirdparty.py new file mode 100644 index 0000000..4a5aa79 --- /dev/null +++ b/src/censys_platform/models/thirdparty.py @@ -0,0 +1,49 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .malloryai import MalloryAI, MalloryAITypedDict +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List +from typing_extensions import NotRequired, TypedDict + + +class ThirdPartyTypedDict(TypedDict): + mallory: NotRequired[Nullable[List[MalloryAITypedDict]]] + r"""Threat intelligence records from MalloryAI.""" + + +class ThirdParty(BaseModel): + mallory: OptionalNullable[List[MalloryAI]] = UNSET + r"""Threat intelligence records from MalloryAI.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["mallory"]) + nullable_fields = set(["mallory"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/models/v3_globaldata_asset_host_enrichmentop.py b/src/censys_platform/models/v3_globaldata_asset_host_enrichmentop.py new file mode 100644 index 0000000..370a301 --- /dev/null +++ b/src/censys_platform/models/v3_globaldata_asset_host_enrichmentop.py @@ -0,0 +1,86 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .responseenvelopehostenrichmentasset import ( + ResponseEnvelopeHostEnrichmentAsset, + ResponseEnvelopeHostEnrichmentAssetTypedDict, +) +from censys_platform.types import BaseModel, UNSET_SENTINEL +from censys_platform.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer +from typing import Dict, List, Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class V3GlobaldataAssetHostEnrichmentGlobalsTypedDict(TypedDict): + organization_id: NotRequired[str] + + +class V3GlobaldataAssetHostEnrichmentGlobals(BaseModel): + organization_id: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["organization_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class V3GlobaldataAssetHostEnrichmentRequestTypedDict(TypedDict): + host_ip: str + r"""The IP address of a host.""" + organization_id: NotRequired[str] + r"""The ID of a Censys organization to associate the request with. See the [Getting Started docs](https://docs.censys.com/reference/get-started#step-3-find-and-use-your-organization-id-optional) for more information.""" + + +class V3GlobaldataAssetHostEnrichmentRequest(BaseModel): + host_ip: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The IP address of a host.""" + + organization_id: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""The ID of a Censys organization to associate the request with. See the [Getting Started docs](https://docs.censys.com/reference/get-started#step-3-find-and-use-your-organization-id-optional) for more information.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["organization_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class V3GlobaldataAssetHostEnrichmentResponseTypedDict(TypedDict): + headers: Dict[str, List[str]] + result: ResponseEnvelopeHostEnrichmentAssetTypedDict + + +class V3GlobaldataAssetHostEnrichmentResponse(BaseModel): + headers: Dict[str, List[str]] + + result: ResponseEnvelopeHostEnrichmentAsset diff --git a/src/censys_platform/models/wincecerdisp.py b/src/censys_platform/models/wincecerdisp.py new file mode 100644 index 0000000..c17379d --- /dev/null +++ b/src/censys_platform/models/wincecerdisp.py @@ -0,0 +1,63 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Optional +from typing_extensions import NotRequired, TypedDict + + +class WinceCerdispTypedDict(TypedDict): + color_depth_bpp: NotRequired[int] + device_family: NotRequired[str] + device_id: NotRequired[str] + flags: NotRequired[int] + manufacturer: NotRequired[str] + screen_height: NotRequired[int] + screen_width: NotRequired[int] + selector: NotRequired[int] + + +class WinceCerdisp(BaseModel): + color_depth_bpp: Optional[int] = None + + device_family: Optional[str] = None + + device_id: Optional[str] = None + + flags: Optional[int] = None + + manufacturer: Optional[str] = None + + screen_height: Optional[int] = None + + screen_width: Optional[int] = None + + selector: Optional[int] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "color_depth_bpp", + "device_family", + "device_id", + "flags", + "manufacturer", + "screen_height", + "screen_width", + "selector", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/censys_platform/models/wordpress.py b/src/censys_platform/models/wordpress.py new file mode 100644 index 0000000..3a4f3f0 --- /dev/null +++ b/src/censys_platform/models/wordpress.py @@ -0,0 +1,70 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from censys_platform.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class WordpressTypedDict(TypedDict): + description: NotRequired[str] + gmt_offset: NotRequired[str] + home: NotRequired[str] + name: NotRequired[str] + namespaces: NotRequired[Nullable[List[str]]] + timezone_string: NotRequired[str] + + +class Wordpress(BaseModel): + description: Optional[str] = None + + gmt_offset: Optional[str] = None + + home: Optional[str] = None + + name: Optional[str] = None + + namespaces: OptionalNullable[List[str]] = UNSET + + timezone_string: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "description", + "gmt_offset", + "home", + "name", + "namespaces", + "timezone_string", + ] + ) + nullable_fields = set(["namespaces"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/censys_platform/types/base64fileinput.py b/src/censys_platform/types/base64fileinput.py index 25fc539..862566f 100644 --- a/src/censys_platform/types/base64fileinput.py +++ b/src/censys_platform/types/base64fileinput.py @@ -23,7 +23,11 @@ def encode_base64_file_input(value: Any) -> Any: with open(value, "rb") as fh: binary = fh.read() else: + # Restore position after reading: pydantic may validate the same stream more than once. + position = value.tell() if value.seekable() else None binary = value.read() + if position is not None: + value.seek(position) if isinstance(binary, str): binary = binary.encode() if not isinstance(binary, (bytes, bytearray)): diff --git a/src/censys_platform/utils/eventstreaming.py b/src/censys_platform/utils/eventstreaming.py index 1c189bf..a8d4fe5 100644 --- a/src/censys_platform/utils/eventstreaming.py +++ b/src/censys_platform/utils/eventstreaming.py @@ -7,6 +7,7 @@ Any, Callable, Generic, + List, TypeVar, Optional, Generator, @@ -120,6 +121,7 @@ class ServerEvent: b"\n\r", b"\n\n", ] +MAX_BOUNDARY_LEN = max(len(b) for b in MESSAGE_BOUNDARIES) UTF8_BOM = b"\xef\xbb\xbf" @@ -137,8 +139,10 @@ async def stream_events_async( async for chunk in response.aiter_bytes(): if len(buffer) == 0 and chunk.startswith(UTF8_BOM): chunk = chunk[len(UTF8_BOM) :] + old_len = len(buffer) buffer += chunk - for i in range(position, len(buffer)): + search_start = max(position, old_len - MAX_BOUNDARY_LEN + 1) + for i in range(search_start, len(buffer)): char = buffer[i : i + 1] seq: Optional[bytes] = None if char in [b"\r", b"\n"]: @@ -193,8 +197,10 @@ def stream_events( for chunk in response.iter_bytes(): if len(buffer) == 0 and chunk.startswith(UTF8_BOM): chunk = chunk[len(UTF8_BOM) :] + old_len = len(buffer) buffer += chunk - for i in range(position, len(buffer)): + search_start = max(position, old_len - MAX_BOUNDARY_LEN + 1) + for i in range(search_start, len(buffer)): char = buffer[i : i + 1] seq: Optional[bytes] = None if char in [b"\r", b"\n"]: @@ -248,7 +254,7 @@ def _parse_event( lines = re.split(r"\r?\n|\r", block) publish = False event = ServerEvent() - data = "" + data_parts: List[str] = [] for line in lines: if not line: continue @@ -269,7 +275,7 @@ def _parse_event( event.event = value publish = True elif field == "data": - data += value + "\n" + data_parts.append(value) publish = True elif field == "id": publish = True @@ -281,16 +287,17 @@ def _parse_event( publish = True event.id = event_id + has_data = bool(data_parts) + data = "\n".join(data_parts) - if sentinel and data == f"{sentinel}\n": + if sentinel and has_data and data == sentinel: return None, True, event_id # Skip data-less events when data is required - if not data and publish and data_required: + if not has_data and publish and data_required: return None, False, event_id - if data: - data = data[:-1] + if has_data: try: event.data = json.loads(data) except json.JSONDecodeError: @@ -301,7 +308,7 @@ def _parse_event( out_dict = { k: v for k, v in asdict(event).items() - if v is not None or (k == "data" and data) + if v is not None or (k == "data" and has_data) } out = decoder(json.dumps(out_dict)) diff --git a/src/censys_platform/utils/forms.py b/src/censys_platform/utils/forms.py index f961e76..fdf0dc9 100644 --- a/src/censys_platform/utils/forms.py +++ b/src/censys_platform/utils/forms.py @@ -1,5 +1,6 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" +import io from typing import ( Any, Dict, @@ -103,6 +104,10 @@ def _extract_file_properties(file_obj: Any) -> Tuple[str, Any, Any]: if file_metadata.content: content = getattr(file_obj, file_field_name, None) + if isinstance(content, io.TextIOBase): + content = content.read().encode( + getattr(content, "encoding", None) or "utf-8" + ) elif file_field_name == "content_type": content_type = getattr(file_obj, file_field_name, None) else: diff --git a/src/censys_platform/utils/retries.py b/src/censys_platform/utils/retries.py index af07d4e..ca7b59e 100644 --- a/src/censys_platform/utils/retries.py +++ b/src/censys_platform/utils/retries.py @@ -11,10 +11,13 @@ class BackoffStrategy: + """Exponential backoff strategy configuration.""" + initial_interval: int max_interval: int exponent: float max_elapsed_time: int + jitter_ms: Optional[int] def __init__( self, @@ -22,24 +25,63 @@ def __init__( max_interval: int, exponent: float, max_elapsed_time: int, + jitter_ms: Optional[int] = None, ): + """Initialize a backoff strategy. + + Args: + initial_interval: Initial retry interval in milliseconds. + max_interval: Maximum retry interval in milliseconds. + exponent: Base of the exponential backoff; the interval grows as + ``initial_interval * exponent ** retries``. + max_elapsed_time: Maximum total elapsed time in milliseconds. + jitter_ms: Additive jitter bound in milliseconds. When set, adds a random + value in ``[0, jitter_ms]`` to each computed backoff interval (default + ``+[0, 1s]``). + + Note: + When a response carries a ``Retry-After`` or ``retry-after-ms`` header, + that delay is used as-is and the sleep-shaping parameters + (``initial_interval``, ``max_interval``, ``exponent``, ``jitter_ms``) are + ignored for that attempt. + """ + if jitter_ms is not None and jitter_ms < 0: + raise ValueError("jitter_ms must be >= 0") self.initial_interval = initial_interval self.max_interval = max_interval self.exponent = exponent self.max_elapsed_time = max_elapsed_time + self.jitter_ms = jitter_ms class RetryConfig: + """Runtime retry configuration.""" + strategy: str backoff: BackoffStrategy retry_connection_errors: bool + status_codes_override: Optional[List[str]] def __init__( - self, strategy: str, backoff: BackoffStrategy, retry_connection_errors: bool + self, + strategy: str, + backoff: BackoffStrategy, + retry_connection_errors: bool, + status_codes_override: Optional[List[str]] = None, ): + """Initialize a retry configuration. + + Args: + strategy: Retry strategy: ``"none"`` or ``"backoff"``. + backoff: Backoff parameters. + retry_connection_errors: Whether to also retry transport-level connection errors. + status_codes_override: Retryable HTTP status codes that take precedence over the + per-operation defaults when non-empty. + """ self.strategy = strategy self.backoff = backoff self.retry_connection_errors = retry_connection_errors + self.status_codes_override = status_codes_override class Retries: @@ -48,7 +90,7 @@ class Retries: def __init__(self, config: RetryConfig, status_codes: List[str]): self.config = config - self.status_codes = status_codes + self.status_codes = config.status_codes_override or status_codes class TemporaryError(Exception): @@ -93,12 +135,28 @@ def _parse_retry_after_header(response: httpx.Response) -> Optional[int]: return None +def _parse_retry_after_ms_header(response: httpx.Response) -> Optional[int]: + retry_after_ms_header = response.headers.get("retry-after-ms") + if not retry_after_ms_header: + return None + + try: + milliseconds = float(retry_after_ms_header) + if milliseconds >= 0: + return round(milliseconds) + except (OverflowError, ValueError): + pass + + return None + + def _get_sleep_interval( exception: Exception, initial_interval: int, max_interval: int, exponent: float, retries: int, + jitter_ms: Optional[int] = None, ) -> float: """Get sleep interval for retry with exponential backoff. @@ -108,6 +166,7 @@ def _get_sleep_interval( max_interval: Maximum retry interval in milliseconds. exponent: Base for exponential backoff calculation. retries: Current retry attempt count. + jitter_ms: Additive jitter bound in ms; see ``BackoffStrategy.jitter_ms``. Returns: Sleep interval in seconds. @@ -119,7 +178,11 @@ def _get_sleep_interval( ): return exception.retry_after / 1000 - sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1) + sleep = (initial_interval / 1000) * exponent**retries + if jitter_ms is not None: + sleep += random.uniform(0, jitter_ms / 1000) + else: + sleep += random.uniform(0, 1) return min(sleep, max_interval / 1000) @@ -162,6 +225,7 @@ def do_request() -> httpx.Response: retries.config.backoff.max_interval, retries.config.backoff.exponent, retries.config.backoff.max_elapsed_time, + retries.config.backoff.jitter_ms, ) return func() @@ -206,6 +270,7 @@ async def do_request() -> httpx.Response: retries.config.backoff.max_interval, retries.config.backoff.exponent, retries.config.backoff.max_elapsed_time, + retries.config.backoff.jitter_ms, ) return await func() @@ -217,6 +282,7 @@ def retry_with_backoff( max_interval=60000, exponent=1.5, max_elapsed_time=3600000, + jitter_ms=None, ): start = round(time.time() * 1000) retries = 0 @@ -234,8 +300,17 @@ def retry_with_backoff( raise + if isinstance(exception, TemporaryError): + retry_after_ms = _parse_retry_after_ms_header(exception.response) + if retry_after_ms is not None: + exception.retry_after = retry_after_ms sleep = _get_sleep_interval( - exception, initial_interval, max_interval, exponent, retries + exception, + initial_interval, + max_interval, + exponent, + retries, + jitter_ms=jitter_ms, ) time.sleep(sleep) retries += 1 @@ -247,6 +322,7 @@ async def retry_with_backoff_async( max_interval=60000, exponent=1.5, max_elapsed_time=3600000, + jitter_ms=None, ): start = round(time.time() * 1000) retries = 0 @@ -264,8 +340,17 @@ async def retry_with_backoff_async( raise + if isinstance(exception, TemporaryError): + retry_after_ms = _parse_retry_after_ms_header(exception.response) + if retry_after_ms is not None: + exception.retry_after = retry_after_ms sleep = _get_sleep_interval( - exception, initial_interval, max_interval, exponent, retries + exception, + initial_interval, + max_interval, + exponent, + retries, + jitter_ms=jitter_ms, ) await asyncio.sleep(sleep) retries += 1