From 6e48d01aecf4b728fe3ec80d3ccc28967940ea57 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 6 Jan 2026 22:09:28 -0500 Subject: [PATCH 01/12] add more cloud providers --- README.md | 16 +- cloud_providers_v2.json | 2819 ++++++++++++++++++++++++++ cloudcheck/providers/baidu.py | 17 + cloudcheck/providers/cdnetworks.py | 14 + cloudcheck/providers/gabia.py | 12 + cloudcheck/providers/gcore.py | 27 + cloudcheck/providers/gocache.py | 47 + cloudcheck/providers/hostway.py | 13 + cloudcheck/providers/kinx.py | 14 + cloudcheck/providers/ktcloud.py | 14 + cloudcheck/providers/lgtelecom.py | 13 + cloudcheck/providers/microsoft365.py | 33 + cloudcheck/providers/navercloud.py | 15 + cloudcheck/providers/nhncloud.py | 15 + cloudcheck/providers/skbroadband.py | 13 + cloudcheck/providers/tencent.py | 2 +- cloudcheck/providers/zscaler.py | 25 + 17 files changed, 3107 insertions(+), 2 deletions(-) create mode 100644 cloudcheck/providers/baidu.py create mode 100644 cloudcheck/providers/cdnetworks.py create mode 100644 cloudcheck/providers/gabia.py create mode 100644 cloudcheck/providers/gcore.py create mode 100644 cloudcheck/providers/gocache.py create mode 100644 cloudcheck/providers/hostway.py create mode 100644 cloudcheck/providers/kinx.py create mode 100644 cloudcheck/providers/ktcloud.py create mode 100644 cloudcheck/providers/lgtelecom.py create mode 100644 cloudcheck/providers/microsoft365.py create mode 100644 cloudcheck/providers/navercloud.py create mode 100644 cloudcheck/providers/nhncloud.py create mode 100644 cloudcheck/providers/skbroadband.py create mode 100644 cloudcheck/providers/zscaler.py diff --git a/README.md b/README.md index 0ed57eb..f9cfd33 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ When adding a new cloud provider: In addition to the above attributes, if you have a custom source of CIDRs or domains, you can override the `fetch_cidrs()` or `fetch_domains()` methods (which by default return an empty list) to go fetch your custom TXT/JSON file, etc. -## Cloud Providers (41) +## Cloud Providers (55) | Name | Description | Tags | Domains | Subnets | |------|-------------|------|---------|----------| @@ -129,7 +129,9 @@ When adding a new cloud provider: | Amazon Web Services | A comprehensive cloud computing platform provided by Amazon, offering infrastructure services, storage, and computing power. | cloud | 231 | 14090 | | Arvancloud | An Iranian cloud computing and content delivery network provider offering cloud infrastructure and CDN services. | cdn | 1 | 20 | | Backblaze | A cloud storage and backup service provider offering data backup and cloud storage solutions. | cloud | 2 | 26 | +| Baidu Cloud Acceleration (百度云加速) | A Chinese content delivery network and cloud acceleration service provided by Baidu. | cdn | 134 | 0 | | CacheFly | A content delivery network provider offering global CDN services. | cdn | 0 | 23 | +| CDNetworks (씨디네트웍스) | A Korean content delivery network provider offering CDN and cloud services. | cdn | 0 | 3 | | Cisco | A multinational technology corporation that designs, manufactures, and sells networking hardware, software, and telecommunications equipment. | cloud | 121 | 629 | | Cloudflare | A web infrastructure and security company providing content delivery network services, DDoS mitigation, and web security solutions. | cdn | 60 | 2674 | | Amazon CloudFront | A content delivery network service provided by Amazon Web Services that delivers data, videos, applications, and APIs to customers globally. | cdn | 0 | 172 | @@ -139,17 +141,27 @@ When adding a new cloud provider: | Department of Defense | A U.S. government agency responsible for coordinating and supervising all agencies and functions of the government directly related to national security and the United States Armed Forces. | gov | 3 | 9226 | | Federal Bureau of Investigation | A U.S. government agency that serves as the domestic intelligence and security service, responsible for investigating federal crimes and protecting national security. | gov | 3 | 21 | | Fastly | A content delivery network and edge cloud platform that provides edge computing, security, and performance services. | cdn | 8 | 1026 | +| Gabia (가비아) | A Korean cloud hosting and infrastructure provider. | cloud | 0 | 48 | +| G-Core Labs | A content delivery network and cloud infrastructure provider offering CDN, cloud computing, and edge services. | cdn | 0 | 1405 | | GitHub | A web-based platform for version control and collaboration using Git, providing hosting for software development and code repositories. | cdn | 33 | 4277 | +| GoCache | A Brazilian content delivery network provider offering CDN services. | cdn | 0 | 28 | | Google Cloud | A suite of cloud computing services provided by Google, including infrastructure, platform, and software services for businesses and developers. | cloud | 1095 | 1863 | | Hewlett Packard Enterprise | A multinational enterprise information technology company that provides servers, storage, networking, and cloud services. | cloud | 16 | 38 | | Heroku | A cloud platform as a service that enables developers to build, run, and operate applications entirely in the cloud. | cloud | 12 | 0 | | Hetzner | A German cloud hosting provider offering dedicated servers, cloud instances, and storage solutions. | cloud | 14 | 126 | +| Hostway (호스트웨이) | A Korean cloud hosting and infrastructure provider. | cloud | 0 | 59 | | Huawei | A Chinese multinational technology corporation that designs, develops, and sells telecommunications equipment, consumer electronics, and cloud services. | cloud | 338 | 270 | | IBM | A multinational technology corporation that provides hardware, software, cloud computing, and consulting services. | cloud | 20 | 394 | | Imperva | A cybersecurity company that provides web application firewall, DDoS protection, and data security solutions. | waf | 1 | 23 | | Kamatera | A cloud infrastructure provider offering virtual private servers, cloud servers, and managed cloud services. | cloud | 1 | 163 | +| KINX (한국인터넷인프라) | A Korean content delivery network and cloud infrastructure provider. | cdn | 0 | 136 | +| KT Cloud (KT클라우드) | A Korean cloud computing service provided by KT Corporation. | cloud | 0 | 8 | | Leaseweb | A global hosting and cloud infrastructure provider offering dedicated servers, cloud hosting, and CDN services. | cloud | 0 | 1487 | +| LG U+ (LG유플러스) | A Korean telecommunications company offering CDN services. | cdn | 0 | 168 | | Microsoft | A multinational technology corporation that develops, manufactures, licenses, supports and sells computer software, consumer electronics and personal computers. Known for products like Windows, Office, Azure cloud services, and Xbox. | cloud | 689 | 2452 | +| Microsoft 365 | A cloud-based productivity suite provided by Microsoft, including Office applications and cloud services. | cloud | 0 | 82 | +| Naver Cloud Platform (네이버 클라우드 플랫폼) | A Korean cloud computing platform provided by Naver Corporation. | cloud | 0 | 73 | +| NHN Cloud (NHN클라우드) | A Korean cloud computing platform provided by NHN Corporation. | cloud | 0 | 122 | | OVHcloud | A French cloud computing company that provides web hosting, dedicated servers, and cloud infrastructure services. | cloud | 3 | 517 | | Oracle | A multinational technology corporation that provides database software, cloud engineering systems, and enterprise software products. | cloud | 18 | 2329 | | Qrator | A DDoS protection and content delivery network service provider. | cdn | 0 | 19 | @@ -158,6 +170,7 @@ When adding a new cloud provider: | Rackspace | A managed cloud computing company that provides hosting, cloud services, and managed infrastructure solutions. | cloud | 1 | 199 | | Salesforce | A cloud-based software company that provides customer relationship management services and enterprise cloud computing solutions. | cloud | 39 | 48 | | Scaleway | A French cloud computing company that provides virtual private servers, bare metal servers, and cloud infrastructure services. | cloud | 1 | 40 | +| SK Broadband (SK브로드밴드) | A Korean telecommunications company offering CDN services. | cdn | 0 | 22 | | StormWall | A DDoS protection and web application firewall service provider. | cdn | 0 | 20 | | Sucuri | A website security and web application firewall service provider. | waf | 0 | 16 | | Tencent Cloud | A Chinese cloud computing service provider and subsidiary of Tencent, offering cloud infrastructure and platform services. | cloud | 580 | 368 | @@ -165,4 +178,5 @@ When adding a new cloud provider: | Wasabi | A cloud storage provider offering hot cloud storage services with high performance and low cost. | cloud | 1 | 20 | | X4B | A DDoS protection and content delivery network service provider. | cdn | 0 | 3 | | Zoho | An Indian software company that provides cloud-based business software and productivity tools including CRM, email, and office suites. | cloud | 13 | 91 | +| Zscaler | A cloud security company providing secure internet access, cloud security, and zero trust network access services. | cloud | 0 | 247 | \ No newline at end of file diff --git a/cloud_providers_v2.json b/cloud_providers_v2.json index c50f3ac..fb41b6c 100644 --- a/cloud_providers_v2.json +++ b/cloud_providers_v2.json @@ -21506,6 +21506,164 @@ ], "v2fly_company": "" }, + "Baidu": { + "asns": [ + 63288, + 133746, + 199506 + ], + "cidrs": [], + "domains": [ + "91.com", + "adscdn.baidu.com", + "adx.xiaodutv.com", + "afd.baidu.com", + "afdconf.baidu.com", + "aipage.com", + "antpcdn.com", + "apollo.auto", + "baidu", + "baidu-cdn.cn", + "baidu-cdn.com", + "baidu-cdn.net", + "baidu.cn", + "baidu.com", + "baidu.com.cn", + "baiduapp.com", + "baidubce.com", + "baidubcr.com", + "baiducontent.com", + "baidupcs.com", + "baidustatic.com", + "baiduyuncdn.cn", + "baiduyuncdn.com", + "baiduyuncdn.net", + "baifae.com", + "baifen.music.baidu.com", + "baifubao.com", + "bce-cdn.cn", + "bce-cdn.com", + "bce-cdn.net", + "bcebos.com", + "bcelive.com", + "bdcloudapi.com", + "bdimg.com", + "bdstatic.com", + "bdtjrcv.com", + "bdurl.net", + "bdycdn.cn", + "bdycdn.net", + "bdydns.cn", + "bdydns.com", + "bdydns.net", + "bzclk.baidu.com", + "cb.baidu.com", + "cbjs.baidu.com", + "chuanke.com", + "cm.baidu.com", + "cpro.baidu.com", + "cpro.baidustatic.com", + "cpu.baidu.com", + "cstm.baidu.com", + "dlnel.com", + "dlnel.org", + "dlswbr.baidu.com", + "drmcmm.baidu.com", + "duapp.com", + "duapp.net", + "duapps.com", + "duiwai.baidu.com", + "dup.baidustatic.com", + "duurl.cn", + "duxiaoman-int.com", + "duxiaoman.com", + "duxiaomanfintech.com", + "duxiaomantech.com", + "dwz.cn", + "dxm-cdn.com", + "dxm-int.com", + "dxmjinr.com", + "dxmlcf.com", + "dxmlcfintech.com", + "dxmpay.com", + "dxmstatic.com", + "dxmyqh.com", + "eclick.baidu.com", + "ecma.bdimg.com", + "ecmb.bdimg.com", + "ecmc.bdimg.com", + "eduad.baidu.com", + "eiv.baidu.com", + "fclick.baidu.com", + "fclog.baidu.com", + "h2tcbox.baidu.com", + "hao123.com", + "hao123img.com", + "hao123union.baidu.com", + "hao222.com", + "haokan.com", + "hm.baidu.com", + "hmma.baidu.com", + "imgstat.baidu.com", + "iwanad.baidu.com", + "jomocdn.cn", + "jomocdn.net", + "jomodns.cn", + "jomodns.com", + "jomodns.net", + "jomoxc.com", + "miao.baidu.com", + "miaowu.baidu.com", + "mipcache.bdstatic.com", + "mipcdn.com", + "mobads-logs.baidu.com", + "mobads-pre-config.cdn.bcebos.com", + "mobads.baidu.com", + "mountain.zhidao.baidu.com", + "nsclick.baidu.com", + "nsclickvideo.baidu.com", + "nuomi.com", + "paydxm.com", + "pimlog.baidu.com", + "pos.baidu.com", + "quyaoya.com", + "sclick.baidu.com", + "shifen.com", + "smartapps.cn", + "spcode.baidu.com", + "syh.zybang.com", + "tcbox.baidu.com", + "tieba.com", + "tiebaimg.com", + "ubmcvideo.baidustatic.com", + "union.baidu.com", + "unionimage.baidu.com", + "wangmeng.baidu.com", + "wkctj.baidu.com", + "wm.baidu.com", + "xianfae.com", + "xiaodutv.com", + "yoojia.com", + "zuoyebang.cc", + "zuoyebang.com", + "zybang.com", + "zz.bdstatic.com" + ], + "last_updated": 1767754962.671269, + "long_description": "A Chinese content delivery network and cloud acceleration service provided by Baidu.", + "name": "Baidu", + "org_ids": [ + "BUL-5-ARIN", + "ORG-BKL1-AP-APNIC", + "ORG-BKL4-RIPE" + ], + "regexes": {}, + "short_description": "Baidu Cloud Acceleration (\u767e\u5ea6\u4e91\u52a0\u901f)", + "tags": [ + "cdn" + ], + "v2fly_company": "baidu" + }, "Cachefly": { "asns": [ 30081 @@ -21549,6 +21707,30 @@ ], "v2fly_company": "" }, + "Cdnetworks": { + "asns": [ + 36408, + 40366 + ], + "cidrs": [ + "174.35.124.0/22", + "208.80.251.0/24", + "211.43.147.0/24" + ], + "domains": [], + "last_updated": 1767754937.0498626, + "long_description": "A Korean content delivery network provider offering CDN and cloud services.", + "name": "Cdnetworks", + "org_ids": [ + "CDNET-ARIN" + ], + "regexes": {}, + "short_description": "CDNetworks (\uc528\ub514\ub124\ud2b8\uc6cd\uc2a4)", + "tags": [ + "cdn" + ], + "v2fly_company": "" + }, "Cisco": { "asns": [ 109, @@ -37412,6 +37594,1503 @@ ], "v2fly_company": "fastly" }, + "Gabia": { + "asns": [ + 17589 + ], + "cidrs": [ + "1.201.224.0/23", + "103.240.48.0/22", + "121.78.112.0/21", + "121.78.121.0/24", + "121.78.122.0/24", + "121.78.124.0/24", + "121.78.126.0/23", + "121.78.129.0/24", + "121.78.131.0/24", + "121.78.132.0/23", + "121.78.134.0/24", + "121.78.144.0/22", + "121.78.177.0/24", + "121.78.178.0/23", + "121.78.182.0/24", + "121.78.192.0/23", + "121.78.195.0/24", + "121.78.196.0/23", + "121.78.79.0/24", + "121.78.87.0/24", + "121.78.93.0/24", + "121.78.95.0/24", + "180.131.0.0/21", + "180.131.10.0/23", + "180.131.12.0/22", + "180.131.16.0/21", + "180.131.24.0/22", + "180.131.29.0/24", + "180.131.31.0/24", + "180.131.32.0/19", + "183.86.192.0/24", + "183.86.196.0/22", + "183.86.200.0/22", + "183.86.205.0/24", + "183.86.206.0/24", + "183.86.212.0/23", + "183.86.219.0/24", + "183.86.220.0/22", + "183.86.224.0/21", + "183.86.232.0/23", + "183.86.234.0/24", + "183.86.236.0/22", + "183.86.240.0/20", + "202.90.252.0/22", + "211.201.198.0/24", + "211.244.211.0/24", + "219.241.221.0/24", + "222.236.220.0/23" + ], + "domains": [], + "last_updated": 1767754937.0659213, + "long_description": "A Korean cloud hosting and infrastructure provider.", + "name": "Gabia", + "org_ids": [ + "@aut-17589-APNIC" + ], + "regexes": {}, + "short_description": "Gabia (\uac00\ube44\uc544)", + "tags": [ + "cloud" + ], + "v2fly_company": "" + }, + "Gcore": { + "asns": [ + 59245, + 199524, + 202422, + 210559 + ], + "cidrs": [ + "1.37.77.98/32", + "102.130.69.141/32", + "102.67.99.50/32", + "102.67.99.66/32", + "103.103.194.23/32", + "103.211.151.21/32", + "103.215.216.0/24", + "103.215.218.0/23", + "103.22.192.0/22", + "103.30.211.0/24", + "109.107.159.0/24", + "109.107.159.108/32", + "109.107.159.121/32", + "109.107.159.18/32", + "109.107.159.183/32", + "109.107.159.241/32", + "109.107.159.78/32", + "109.230.114.2/32", + "109.61.120.0/24", + "109.61.122.0/24", + "109.61.122.4/31", + "109.61.122.6/32", + "109.61.124.0/22", + "109.61.127.167/32", + "109.61.127.174/32", + "109.61.127.208/32", + "109.61.17.0/24", + "109.61.18.0/24", + "109.61.32.0/22", + "109.61.38.0/23", + "109.61.39.212/32", + "109.61.39.217/32", + "109.61.39.249/32", + "109.61.39.50/32", + "109.61.39.82/32", + "109.61.39.85/32", + "109.61.40.0/24", + "109.61.42.0/23", + "109.61.44.0/22", + "109.68.233.242/32", + "118.103.136.245/32", + "120.28.10.46/32", + "125.214.171.164/32", + "130.193.166.2/32", + "134.0.219.26/32", + "134.0.219.37/32", + "139.28.4.0/22", + "139.28.7.5/32", + "139.28.7.6/31", + "139.28.7.8/32", + "140.235.48.0/22", + "144.34.86.0/24", + "146.185.214.0/24", + "146.185.216.0/24", + "146.185.219.0/24", + "146.185.236.0/23", + "146.185.248.0/22", + "146.19.94.0/24", + "150.107.125.0/24", + "150.107.126.0/24", + "150.107.126.5/32", + "151.248.104.69/32", + "151.248.104.91/32", + "154.120.250.210/32", + "162.120.2.0/23", + "162.213.60.0/23", + "162.213.63.0/24", + "162.216.230.0/23", + "162.33.20.0/24", + "162.33.25.0/24", + "165.217.128.0/23", + "168.232.103.194/32", + "169.155.120.0/21", + "169.239.157.98/32", + "169.239.158.154/32", + "170.238.234.217/32", + "176.126.122.0/24", + "176.222.187.180/32", + "179.51.50.82/32", + "180.149.36.0/22", + "180.149.44.0/22", + "180.149.90.66/32", + "181.174.80.182/32", + "181.208.199.10/32", + "184.170.200.0/22", + "185.101.136.0/24", + "185.101.136.12/31", + "185.101.136.20/30", + "185.101.136.24/31", + "185.101.136.26/32", + "185.101.136.7/32", + "185.101.136.8/31", + "185.101.138.0/23", + "185.105.0.0/22", + "185.105.1.10/32", + "185.109.31.0/24", + "185.112.81.19/32", + "185.12.212.0/24", + "185.12.240.0/22", + "185.136.60.0/23", + "185.14.44.0/23", + "185.14.47.0/24", + "185.145.113.0/24", + "185.158.211.186/32", + "185.160.60.0/23", + "185.160.63.0/24", + "185.163.0.0/22", + "185.163.3.4/31", + "185.183.128.0/24", + "185.183.131.0/24", + "185.188.144.0/22", + "185.188.144.4/31", + "185.188.144.7/32", + "185.188.144.8/32", + "185.194.11.74/32", + "185.202.92.0/22", + "185.211.231.187/32", + "185.244.208.0/22", + "185.244.209.12/31", + "185.244.209.14/32", + "185.244.209.4/30", + "185.244.209.8/30", + "185.249.132.0/22", + "185.249.133.4/32", + "185.48.136.150/32", + "185.57.75.74/32", + "185.67.124.0/22", + "185.76.48.122/32", + "186.16.19.94/32", + "186.2.150.34/32", + "188.208.32.0/23", + "188.241.250.0/24", + "188.241.71.0/24", + "188.47.194.130/32", + "188.47.205.130/32", + "190.95.248.34/32", + "192.108.254.0/23", + "192.135.112.0/23", + "192.135.116.0/24", + "192.135.118.0/23", + "193.138.111.0/24", + "193.142.214.0/24", + "193.169.238.0/23", + "193.169.239.75/32", + "193.169.250.0/23", + "193.169.250.4/31", + "193.169.250.7/32", + "193.169.250.8/31", + "193.169.251.10/32", + "193.169.251.13/32", + "193.169.251.14/32", + "193.169.251.4/31", + "193.169.251.7/32", + "193.169.251.8/31", + "193.242.96.0/24", + "193.242.96.4/31", + "193.242.96.6/32", + "193.36.180.0/23", + "193.36.180.16/29", + "193.36.180.24/32", + "193.36.180.5/32", + "193.36.180.6/32", + "193.36.180.8/29", + "193.57.88.0/23", + "193.57.88.222/32", + "193.57.89.4/31", + "194.158.198.1/32", + "194.158.198.2/31", + "194.158.198.4/30", + "194.160.22.34/32", + "194.180.248.0/24", + "194.44.246.206/32", + "194.5.182.0/24", + "194.99.78.0/23", + "194.99.80.0/23", + "195.13.54.0/23", + "195.14.146.81/32", + "195.216.237.197/32", + "195.216.237.199/32", + "195.216.237.201/32", + "195.216.237.203/32", + "195.234.62.0/23", + "195.234.82.0/23", + "196.97.8.18/32", + "197.148.108.106/32", + "197.188.22.102/32", + "197.215.44.65/32", + "197.225.145.26/32", + "197.242.183.193/32", + "197.242.183.195/32", + "199.115.72.0/22", + "199.115.77.0/24", + "199.115.78.0/23", + "199.180.206.0/23", + "2.56.220.0/22", + "200.10.177.54/32", + "200.24.129.100/32", + "200.24.129.98/31", + "2001:1670::130:0:0:107/128", + "2001:1670::130:0:0:e2/128", + "2001:1a10:cd:9c01::2/128", + "2001:4118:0:2220::2/128", + "2001:4290:c:d::26/128", + "2001:fe0:4775::147/128", + "202.129.236.162/32", + "202.78.160.0/23", + "202.78.162.0/24", + "202.78.162.6/32", + "202.78.164.0/24", + "202.78.167.0/24", + "202.78.168.0/24", + "202.78.170.0/24", + "202.78.172.0/22", + "205.179.220.0/22", + "205.179.240.0/21", + "206.135.148.0/22", + "209.102.248.0/23", + "209.102.251.0/24", + "209.102.252.0/22", + "212.232.103.11/32", + "212.232.103.73/32", + "212.232.104.191/32", + "212.232.109.191/32", + "212.47.156.34/31", + "212.47.156.36/32", + "212.6.46.0/24", + "212.65.33.11/32", + "212.96.94.58/32", + "213.156.136.0/21", + "213.156.144.0/20", + "213.156.144.4/30", + "213.156.151.4/31", + "213.156.151.6/32", + "213.156.156.4/31", + "213.252.220.4/32", + "213.55.123.91/32", + "216.133.104.0/21", + "216.201.72.0/23", + "216.201.78.0/23", + "217.195.193.0/24", + "217.195.193.12/31", + "217.195.193.4/30", + "217.195.193.8/30", + "217.195.194.0/24", + "217.195.200.0/23", + "217.195.205.0/24", + "217.28.137.0/24", + "217.76.64.195/32", + "2400:1a00:4:151::21/128", + "2401:9700:22c0:2::162/128", + "2401:d600:0:1fff::31/128", + "2405:1340:1001:7::1/128", + "2405:1500:0:2::432/128", + "2405:ec00:fa02::245/128", + "2800:2a0:ffff:1b::a/128", + "2800:3a0:1:1::5e/128", + "2800:880:3:c00::2/128", + "2801:12:e800:4::2/128", + "2801:135:0:9::2/128", + "2801:1d:a001:7::2/128", + "2803:2540:f:13::100/128", + "2803:2540:f:13::98/127", + "2803:8100:3201:7::10/128", + "2803:c800:0:9a::2/128", + "2803:d700:0:c013::1002/128", + "2804:3674::400:42/128", + "2a00:1358:2000:e01::1/128", + "2a00:1760:6007:20::210/127", + "2a00:1760:6007:20::212/128", + "2a00:ab40:3000:15::226/128", + "2a00:d2c0:1e:20::15/128", + "2a00:f46:120::2/128", + "2a00:f46:12b::2/128", + "2a00:f500:c:3::34/128", + "2a00:fc00:1:1055::2/128", + "2a01:410:1:5024::1/128", + "2a01:4b40:1001:c::3/128", + "2a01:9c80:ada:5::202/128", + "2a01:c500:1:6::d4e8:670b/128", + "2a01:c500:1:6::d4e8:6749/128", + "2a01:c500:1:6::d4e8:68bf/128", + "2a01:c500:1:6::d4e8:6dbf/128", + "2a01:c9c0:c000:1001::/128", + "2a01:c9c0:c000:1002::/128", + "2a01:c9c0:c000:1003::/128", + "2a01:c9c0:c000:2001::/128", + "2a01:c9c0:c000:2002::/128", + "2a01:c9c0:c000:2003::/128", + "2a01:c9c0:c000:3001::/128", + "2a01:c9c0:c000:3002::/128", + "2a01:c9c0:c000:3003::/128", + "2a01:c9c0:c000:4001::/128", + "2a01:c9c0:c000:4002::/128", + "2a01:c9c0:c000:4003::/128", + "2a01:c9c0:c000:5001::/128", + "2a01:c9c0:c000:5002::/128", + "2a01:c9c0:c000:5003::/128", + "2a01:c9c0:c000:6001::/128", + "2a01:c9c0:c000:6002::/128", + "2a01:c9c0:c000:6003::/128", + "2a01:c9c0:c000:7001::/128", + "2a01:c9c0:c000:7002::/128", + "2a01:c9c0:c000:7003::/128", + "2a01:c9c0:c000:8001::/128", + "2a01:c9c0:c000:8002::/128", + "2a01:c9c0:c000:8003::/128", + "2a01:c9c0:c002:100::1/128", + "2a01:c9c0:c002::1/128", + "2a01:c9c0:c004:100::1/128", + "2a01:c9c0:c004:100::3/128", + "2a01:c9c0:c004:100::5/128", + "2a01:c9c0:c004:100::7/128", + "2a01:c9c0:c004:200::1/128", + "2a01:c9c0:c004:200::3/128", + "2a01:c9c0:c004:200::5/128", + "2a01:c9c0:c004:300::1/128", + "2a01:c9c0:c004:300::3/128", + "2a01:c9c0:c004::1/128", + "2a01:c9c0:c006:200::1/128", + "2a01:c9c0:c006:3000::1/128", + "2a01:c9c0:c006:500::1/128", + "2a01:c9c0:c006:500::3/128", + "2a01:c9c0:c006:500::5/128", + "2a01:c9c0:c006:500::7/128", + "2a01:c9c0:c006:600::1/128", + "2a01:c9c0:c006:600::3/128", + "2a01:c9c0:c006:600::5/128", + "2a01:c9c0:c006:600::7/128", + "2a01:c9c0:c012:100::5/128", + "2a01:c9c0:c012::5/128", + "2a01:c9c0:c014:100::5/128", + "2a01:c9c0:c014::5/128", + "2a01:c9c0:c016:100::1/128", + "2a01:c9c0:c016:100::3/128", + "2a01:c9c0:c016::1/128", + "2a01:c9c0:c016::3/128", + "2a01:c9c0:c018:100::1/128", + "2a01:c9c0:c018:100::3/128", + "2a01:c9c0:c018::1/128", + "2a01:c9c0:c018::3/128", + "2a01:c9c0:c01a::5/128", + "2a01:c9c0:c01c:100::1/128", + "2a01:c9c0:c01c:100::3/128", + "2a01:c9c0:c01c::1/128", + "2a01:c9c0:c01c::3/128", + "2a01:c9c0:c020::1/128", + "2a01:c9c0:c020::3/128", + "2a01:c9c0:c022::1/128", + "2a01:c9c0:c022::3/128", + "2a01:c9c0:c026::1/128", + "2a01:c9c0:c026::3/128", + "2a01:c9c0:c040::1/128", + "2a01:c9c0:c040::3/128", + "2a01:c9c0:c062:100::5/128", + "2a01:c9c0:c062:200::1/128", + "2a01:c9c0:c062:200::3/128", + "2a01:c9c0:c062::5/128", + "2a01:c9c0:c062::7/128", + "2a01:c9c0:c080::1/128", + "2a01:c9c0:c080::3/128", + "2a01:cd20::1a:65/128", + "2a02:2208:e:1c::1/128", + "2a02:2208:e:1c::2/127", + "2a02:2208:e:1c::4/126", + "2a02:2278:fffd:6::186/128", + "2a02:a58:10:30::2/128", + "2a02:a58:11:30::2/128", + "2a02:f040:7:2::6/128", + "2a02:f040:a::12/128", + "2a03:32c0:3008:4006::74/128", + "2a03:32c0:4008:4006::58/128", + "2a03:32c0:8:4006::195/128", + "2a03:90c0:100::/41", + "2a03:90c0:101:2801::22/127", + "2a03:90c0:101:2801::24/126", + "2a03:90c0:101:2801::28/128", + "2a03:90c0:10::/44", + "2a03:90c0:111:2801::10/127", + "2a03:90c0:111:2801::21/128", + "2a03:90c0:111:2801::22/127", + "2a03:90c0:111:2801::24/126", + "2a03:90c0:111:2801::28/127", + "2a03:90c0:111:2801::4/126", + "2a03:90c0:111:2801::8/127", + "2a03:90c0:11:2801::132/127", + "2a03:90c0:11:2801::134/126", + "2a03:90c0:11:2801::142/128", + "2a03:90c0:11:2801::144/126", + "2a03:90c0:11:2801::148/127", + "2a03:90c0:11:2801::151/128", + "2a03:90c0:11:2801::158/128", + "2a03:90c0:11:2801::160/128", + "2a03:90c0:11:2801::165/128", + "2a03:90c0:11:2801::166/127", + "2a03:90c0:11:2801::168/127", + "2a03:90c0:11:2801::170/128", + "2a03:90c0:11:2801::175/128", + "2a03:90c0:11:2801::176/127", + "2a03:90c0:11:2801::178/127", + "2a03:90c0:11:2801::180/126", + "2a03:90c0:11:2801::184/128", + "2a03:90c0:11:2801::186/127", + "2a03:90c0:11:2801::188/127", + "2a03:90c0:11:2801::190/126", + "2a03:90c0:11:2801::194/127", + "2a03:90c0:121:2801::21/128", + "2a03:90c0:121:2801::25/128", + "2a03:90c0:151:2801::4/127", + "2a03:90c0:161:2801::21/128", + "2a03:90c0:170:2801::5/128", + "2a03:90c0:170:2801::6/127", + "2a03:90c0:180:2801::10/125", + "2a03:90c0:180:2801::18/127", + "2a03:90c0:180:2801::20/128", + "2a03:90c0:180:2801::22/127", + "2a03:90c0:180:2801::24/126", + "2a03:90c0:180:2801::9/128", + "2a03:90c0:180::/42", + "2a03:90c0:191:2801::4/127", + "2a03:90c0:191:2801::7/128", + "2a03:90c0:191:2801::8/128", + "2a03:90c0:1a1:2801::10/128", + "2a03:90c0:1a1:2801::6/127", + "2a03:90c0:1a1:2801::8/128", + "2a03:90c0:1b1:2801::10/128", + "2a03:90c0:1b1:2801::16/127", + "2a03:90c0:1b1:2801::4/126", + "2a03:90c0:1b1:2801::8/127", + "2a03:90c0:1d0::/44", + "2a03:90c0:1e0::/43", + "2a03:90c0:1e1:2801::5/128", + "2a03:90c0:1f1:2801::10/127", + "2a03:90c0:1f1:2801::13/128", + "2a03:90c0:20::/43", + "2a03:90c0:210::/44", + "2a03:90c0:211:2801::4/126", + "2a03:90c0:21:2801::132/127", + "2a03:90c0:21:2801::134/126", + "2a03:90c0:21:2801::138/127", + "2a03:90c0:21:2801::140/128", + "2a03:90c0:21:2801::146/128", + "2a03:90c0:220::/43", + "2a03:90c0:221:2801::10/127", + "2a03:90c0:221:2801::4/126", + "2a03:90c0:221:2801::8/127", + "2a03:90c0:231:2801::6/128", + "2a03:90c0:240::/42", + "2a03:90c0:251:2801::12/127", + "2a03:90c0:251:2801::20/126", + "2a03:90c0:251:2801::24/127", + "2a03:90c0:251:2801::26/128", + "2a03:90c0:251:2801::7/128", + "2a03:90c0:251:2801::8/127", + "2a03:90c0:271:2801:1::13/128", + "2a03:90c0:271:2801:1::14/126", + "2a03:90c0:271:2801:1::23/128", + "2a03:90c0:271:2801:1::24/126", + "2a03:90c0:271:2801:1::28/127", + "2a03:90c0:271:2801:1::30/127", + "2a03:90c0:271:2801:1::32/128", + "2a03:90c0:271:2801:1::4/126", + "2a03:90c0:280::/43", + "2a03:90c0:281:2801::10/128", + "2a03:90c0:291:2801::37/128", + "2a03:90c0:2a0::/44", + "2a03:90c0:2c0::/42", + "2a03:90c0:2f1:2801::4/128", + "2a03:90c0:300::/41", + "2a03:90c0:311:2801::10/127", + "2a03:90c0:311:2801::12/128", + "2a03:90c0:311:2801::14/126", + "2a03:90c0:311:2801::4/126", + "2a03:90c0:311:2801::8/127", + "2a03:90c0:31:2801::12/127", + "2a03:90c0:31:2801::18/127", + "2a03:90c0:31:2801::196/127", + "2a03:90c0:31:2801::198/127", + "2a03:90c0:31:2801::20/125", + "2a03:90c0:31:2801::200/126", + "2a03:90c0:31:2801::205/128", + "2a03:90c0:31:2801::206/127", + "2a03:90c0:31:2801::28/127", + "2a03:90c0:31:2801::31/128", + "2a03:90c0:31:2801::4/127", + "2a03:90c0:31:2801::7/128", + "2a03:90c0:321:2803::200/127", + "2a03:90c0:321:2803::204/128", + "2a03:90c0:321:2803::210/125", + "2a03:90c0:321:2803::220/125", + "2a03:90c0:321:2803::229/128", + "2a03:90c0:321:2803::230/125", + "2a03:90c0:321:2803::238/127", + "2a03:90c0:321:2803::240/126", + "2a03:90c0:321:2803::244/128", + "2a03:90c0:331:2801::4/127", + "2a03:90c0:341:2801::10/126", + "2a03:90c0:341:2801::4/126", + "2a03:90c0:341:2801::8/127", + "2a03:90c0:371:2801::5/128", + "2a03:90c0:371:2801::6/127", + "2a03:90c0:371:2801::8/128", + "2a03:90c0:380::/42", + "2a03:90c0:381:2801::4/127", + "2a03:90c0:381:2801::6/128", + "2a03:90c0:391:2801::4/127", + "2a03:90c0:391:2801::6/128", + "2a03:90c0:3a1:2801::10/127", + "2a03:90c0:3a1:2801::6/127", + "2a03:90c0:3e0::/43", + "2a03:90c0:3f1:2801::4/127", + "2a03:90c0:3f1:2801::6/128", + "2a03:90c0:400::/44", + "2a03:90c0:40::/42", + "2a03:90c0:41:2801::10/126", + "2a03:90c0:41:2801::15/128", + "2a03:90c0:41:2801::16/127", + "2a03:90c0:41:2801::18/128", + "2a03:90c0:41:2801::22/127", + "2a03:90c0:41:2801::24/126", + "2a03:90c0:41:2801::28/127", + "2a03:90c0:41:2801::31/128", + "2a03:90c0:41:2801::32/128", + "2a03:90c0:41:2801::35/128", + "2a03:90c0:41:2801::37/128", + "2a03:90c0:41:2801::4/127", + "2a03:90c0:41:2801::43/128", + "2a03:90c0:41:2801::44/126", + "2a03:90c0:41:2801::48/127", + "2a03:90c0:41:2801::50/126", + "2a03:90c0:41:2801::54/127", + "2a03:90c0:41:2801::56/128", + "2a03:90c0:41:2801::6/128", + "2a03:90c0:41:2801::8/127", + "2a03:90c0:420::/43", + "2a03:90c0:421:2801::4/127", + "2a03:90c0:460:2801::10/127", + "2a03:90c0:460:2801::12/128", + "2a03:90c0:460:2801::4/126", + "2a03:90c0:460:2801::8/127", + "2a03:90c0:460::/43", + "2a03:90c0:470:2801::13/128", + "2a03:90c0:470:2801::14/126", + "2a03:90c0:470:2801::18/128", + "2a03:90c0:480::/43", + "2a03:90c0:491:2801::10/128", + "2a03:90c0:491:2801::12/128", + "2a03:90c0:491:2801::14/126", + "2a03:90c0:491:2801::18/128", + "2a03:90c0:491:2801::4/126", + "2a03:90c0:491:2801::8/127", + "2a03:90c0:4b0::/44", + "2a03:90c0:4b1:2801::5/128", + "2a03:90c0:4b1:2801::6/127", + "2a03:90c0:4b1:2801::8/128", + "2a03:90c0:4c0::/42", + "2a03:90c0:4c1:2801::4/126", + "2a03:90c0:4c1:2801::8/128", + "2a03:90c0:4d1:2801::10/128", + "2a03:90c0:4d1:2801::13/128", + "2a03:90c0:4d1:2801::14/128", + "2a03:90c0:4d1:2801::4/127", + "2a03:90c0:4d1:2801::7/128", + "2a03:90c0:4d1:2801::8/127", + "2a03:90c0:4e1:2801::10/128", + "2a03:90c0:4e1:2801::9/128", + "2a03:90c0:4f1:2801::4/126", + "2a03:90c0:4f1:2801::8/128", + "2a03:90c0:500::/41", + "2a03:90c0:501:2801::10/126", + "2a03:90c0:501:2801::14/128", + "2a03:90c0:501:2801::21/128", + "2a03:90c0:501:2801::22/128", + "2a03:90c0:501:2801::4/126", + "2a03:90c0:501:2801::8/127", + "2a03:90c0:51:2801::4/127", + "2a03:90c0:51:2801::7/128", + "2a03:90c0:51:2801::8/127", + "2a03:90c0:521:2801::11/128", + "2a03:90c0:521:2801::4/126", + "2a03:90c0:521:2801::8/127", + "2a03:90c0:541:2801::5/128", + "2a03:90c0:541:2801::6/127", + "2a03:90c0:551:2801::4/127", + "2a03:90c0:551:2801::6/128", + "2a03:90c0:571:2801::4/126", + "2a03:90c0:590::/44", + "2a03:90c0:591:2801::4/127", + "2a03:90c0:591:2801::6/128", + "2a03:90c0:591:2801::8/128", + "2a03:90c0:5a0::/43", + "2a03:90c0:5a1:2801::10/126", + "2a03:90c0:5a1:2801::14/128", + "2a03:90c0:5a1:2801::16/127", + "2a03:90c0:5a1:2801::18/127", + "2a03:90c0:5a1:2801::21/128", + "2a03:90c0:5a1:2801::22/127", + "2a03:90c0:5a1:2801::24/126", + "2a03:90c0:5a1:2801::8/127", + "2a03:90c0:5b1:2801::4/127", + "2a03:90c0:5c0::/42", + "2a03:90c0:5c1:2801::4/127", + "2a03:90c0:5d1:2801::4/126", + "2a03:90c0:5d1:2801::8/128", + "2a03:90c0:5e1:2801::5/128", + "2a03:90c0:5f1:2801::4/127", + "2a03:90c0:610::/44", + "2a03:90c0:611:2801::11/128", + "2a03:90c0:611:2801::12/127", + "2a03:90c0:611:2801::14/126", + "2a03:90c0:611:2801::18/127", + "2a03:90c0:611:2801::20/128", + "2a03:90c0:611:2801::5/128", + "2a03:90c0:611:2801::6/127", + "2a03:90c0:611:2801::8/128", + "2a03:90c0:640::/44", + "2a03:90c0:660::/43", + "2a03:90c0:661:2801::4/127", + "2a03:90c0:661:2801::6/128", + "2a03:90c0:690::/44", + "2a03:90c0:691:2801::4/127", + "2a03:90c0:6b0::/44", + "2a03:90c0:6b1:2801::4/127", + "2a03:90c0:6c0::/43", + "2a03:90c0:6d1:2801::10/125", + "2a03:90c0:6d1:2801::18/127", + "2a03:90c0:6d1:2801::20/125", + "2a03:90c0:6d1:2801::28/127", + "2a03:90c0:6d1:2801::30/127", + "2a03:90c0:6d1:2801::4/126", + "2a03:90c0:6d1:2801::8/127", + "2a03:90c0:6f0::/44", + "2a03:90c0:6f1:2801::10/126", + "2a03:90c0:6f1:2801::14/128", + "2a03:90c0:6f1:2801::4/126", + "2a03:90c0:6f1:2801::8/127", + "2a03:90c0:700::/44", + "2a03:90c0:70:2801::4/127", + "2a03:90c0:720::/43", + "2a03:90c0:721:2801::4/127", + "2a03:90c0:721:2801::6/128", + "2a03:90c0:731:2801::5/128", + "2a03:90c0:731:2801::6/127", + "2a03:90c0:731:2801::8/128", + "2a03:90c0:740::/43", + "2a03:90c0:751:2801::18/127", + "2a03:90c0:751:2801::20/127", + "2a03:90c0:751:2801::22/128", + "2a03:90c0:751:2801::4/127", + "2a03:90c0:751:2801::6/128", + "2a03:90c0:770::/44", + "2a03:90c0:771:2801::4/127", + "2a03:90c0:771:2801::6/128", + "2a03:90c0:780::/43", + "2a03:90c0:781:2801::10/125", + "2a03:90c0:781:2801::18/128", + "2a03:90c0:781:2801::8/127", + "2a03:90c0:797::/48", + "2a03:90c0:7c0::/44", + "2a03:90c0:80::/41", + "2a03:90c0:8885::/48", + "2a03:90c0:8886::/48", + "2a03:90c0:8888::/46", + "2a03:90c0:888c::/48", + "2a03:90c0:888e::/47", + "2a03:90c0:9990::/47", + "2a03:90c0:9992::/48", + "2a03:90c0:9994::/46", + "2a03:90c0:9998::/45", + "2a03:90c0:a1:2801::10/125", + "2a03:90c0:a1:2801::18/127", + "2a03:90c0:a1:2801::20/126", + "2a03:90c0:a1:2801::24/128", + "2a03:90c0:a1:2801::5/128", + "2a03:90c0:a1:2801::6/128", + "2a03:90c0:a1:2801::8/127", + "2a03:90c0:b1:2801::4/126", + "2a03:90c0:b1:2801::8/128", + "2a03:90c0:c1:2801::132/127", + "2a03:90c0:c1:2801::134/127", + "2a03:90c0:c1:2801::138/127", + "2a03:90c0:c1:2801::36/128", + "2a03:90c0:c1:2801::38/127", + "2a03:90c0:c1:2801::40/128", + "2a03:90c0:c1:2801::42/127", + "2a03:90c0:c1:2801::44/126", + "2a03:90c0:c1:2801::48/127", + "2a03:90c0:c1:2801::50/125", + "2a03:90c0:c1:2801::58/128", + "2a03:90c0:e1:2801::20/127", + "2a03:90c0:e1:2801::26/128", + "2a03:90c0:f1:2801::132/127", + "2a03:90c0:f1:2801::134/127", + "2a03:90c0:f1:2801::136/128", + "2a03:90c0:f1:2801::20/127", + "2a03:90c0:f1:2801::22/128", + "2a03:90c0:f1:2801::26/127", + "2a03:90c0:f1:2801::28/128", + "2a03:90c0:ffe0::/43", + "2a03:c343:1::12/128", + "2a04:2e80:5:7::162/127", + "2a05:8200::34/127", + "2a05:8200::36/128", + "2a0b:1880:0:8::3:74/128", + "2a0b:6200:60:f::229/128", + "2a0b:6200:60:f::231/128", + "2a0b:6bc0::32/128", + "2a0b:6e40:0:3::187/128", + "2a11:27c0:111:2801::5/128", + "2a11:27c0:111:2801::8/128", + "2a11:27c0:121:2801::13/128", + "2a11:27c0:121:2801::14/128", + "2a11:27c0:141:2801::5/128", + "2a11:27c0:161:2802::20/128", + "2a11:27c0:161:2802::32/128", + "2a11:27c0:161:2802::34/128", + "2a11:27c0:161:2802::45/128", + "2a11:27c0:161:2802::46/127", + "2a11:27c0:161:2802::48/128", + "2a11:27c0:161:2802::50/127", + "2a11:27c0:171:2801::14/127", + "2a11:27c0:171:2801::6/127", + "2a11:27c0:181:2801::12/128", + "2a11:27c0:181:2801::4/128", + "2a11:27c0:191:2801::4/128", + "2a11:27c0:1a1:2803::132/127", + "2a11:27c0:1a1:2803::135/128", + "2a11:27c0:1a1:2803::138/128", + "2a11:27c0:1a1:2803::161/128", + "2a11:27c0:1a1:2803::162/128", + "2a11:27c0:1a1:2803::165/128", + "2a11:27c0:1a1:2803::166/128", + "2a11:27c0:1a1:2803::181/128", + "2a11:27c0:1a1:2803::182/127", + "2a11:27c0:1a1:2803::184/127", + "2a11:27c0:1a1:2803::192/128", + "2a11:27c0:1b1:2801::184/126", + "2a11:27c0:1b1:2801::188/128", + "2a11:27c0:1e1:2801::13/128", + "2a11:27c0:1e1:2801::5/128", + "2a11:27c0:1f1:2801::4/127", + "2c0f:4280:6400:2::202/128", + "2c0f:ee00:1:acc1::2/128", + "2c0f:ee00:1:c0eb::50/128", + "2c0f:f578:0:c::106/128", + "2c0f:f828:2::114/128", + "2c0f:fe38:7:50::2/128", + "31.13.213.0/24", + "31.184.206.0/23", + "31.184.207.12/32", + "31.184.207.4/30", + "31.184.207.8/30", + "31.223.184.0/24", + "37.110.209.228/32", + "37.156.224.13/32", + "37.156.224.15/32", + "37.17.119.210/31", + "37.17.119.212/32", + "37.202.196.0/24", + "37.239.145.2/31", + "37.61.224.0/24", + "37.61.229.0/24", + "37.61.231.0/24", + "37.9.32.0/22", + "37.9.33.122/32", + "37.9.33.130/32", + "37.9.33.184/32", + "37.9.33.198/32", + "37.9.33.230/32", + "37.9.33.240/32", + "40.27.40.0/22", + "40.27.44.0/23", + "41.210.189.22/32", + "41.226.6.202/32", + "43.245.140.2/32", + "45.10.58.0/23", + "45.135.228.0/22", + "45.135.228.113/32", + "45.135.228.173/32", + "45.135.228.226/32", + "45.146.203.0/24", + "45.147.160.0/23", + "45.65.8.0/22", + "45.67.208.0/22", + "45.68.4.2/32", + "45.68.52.66/32", + "45.80.208.0/21", + "45.80.213.4/30", + "45.80.213.8/32", + "45.82.100.0/22", + "45.82.100.4/31", + "45.82.101.10/32", + "45.82.101.16/31", + "45.82.101.4/30", + "45.82.101.8/31", + "45.82.103.4/31", + "45.82.103.6/32", + "45.82.103.8/32", + "45.82.160.0/22", + "45.82.160.111/32", + "45.82.160.143/32", + "45.82.160.171/32", + "45.82.160.49/32", + "45.82.160.62/32", + "45.82.30.0/23", + "45.92.70.0/23", + "46.49.10.229/32", + "46.49.10.231/32", + "5.1.107.249/32", + "5.101.216.0/23", + "5.101.217.4/31", + "5.101.217.6/32", + "5.101.219.0/24", + "5.101.219.5/32", + "5.101.219.6/31", + "5.101.219.8/32", + "5.101.220.0/24", + "5.101.220.10/32", + "5.101.220.9/32", + "5.101.222.0/23", + "5.101.222.10/31", + "5.101.222.4/31", + "5.101.68.5/32", + "5.101.68.8/32", + "5.181.25.0/24", + "5.181.27.0/24", + "5.181.76.0/22", + "5.188.0.0/23", + "5.188.108.0/22", + "5.188.120.0/24", + "5.188.121.132/31", + "5.188.121.135/32", + "5.188.121.138/32", + "5.188.121.161/32", + "5.188.121.162/32", + "5.188.121.165/32", + "5.188.121.166/32", + "5.188.121.181/32", + "5.188.121.182/31", + "5.188.121.184/31", + "5.188.121.192/32", + "5.188.122.0/23", + "5.188.124.0/22", + "5.188.126.4/30", + "5.188.126.8/30", + "5.188.132.0/22", + "5.188.133.10/31", + "5.188.133.13/32", + "5.188.148.0/24", + "5.188.151.0/24", + "5.188.168.0/23", + "5.188.188.0/24", + "5.188.190.0/23", + "5.188.213.0/24", + "5.188.214.0/23", + "5.188.225.0/24", + "5.188.226.0/23", + "5.188.228.0/24", + "5.188.230.0/23", + "5.188.238.0/23", + "5.188.32.0/23", + "5.188.34.0/24", + "5.188.36.0/24", + "5.188.4.0/23", + "5.188.6.0/24", + "5.188.70.0/23", + "5.188.92.0/22", + "5.188.94.5/32", + "5.189.200.0/24", + "5.189.202.0/23", + "5.189.204.0/24", + "5.189.206.0/23", + "5.189.207.4/31", + "5.189.220.0/23", + "5.189.222.0/24", + "5.252.24.0/23", + "5.252.27.0/24", + "5.45.184.0/22", + "5.8.24.0/22", + "5.8.32.0/22", + "5.8.40.0/23", + "5.8.43.4/31", + "5.8.68.0/24", + "5.8.70.0/23", + "5.8.92.0/22", + "5.8.92.4/31", + "5.8.92.6/32", + "50.20.200.0/24", + "62.112.217.0/24", + "62.112.218.0/24", + "62.112.221.0/24", + "62.112.222.0/23", + "62.112.222.116/32", + "62.112.222.143/32", + "62.112.222.229/32", + "62.112.222.45/32", + "62.112.222.52/32", + "62.112.222.96/32", + "62.112.223.4/31", + "62.209.27.232/32", + "66.248.194.0/23", + "66.248.196.0/24", + "69.3.132.0/22", + "74.112.76.0/23", + "78.108.56.0/24", + "78.111.100.0/22", + "78.111.103.4/31", + "78.111.104.0/23", + "78.111.107.0/24", + "78.111.109.0/24", + "78.111.99.0/24", + "78.138.52.0/24", + "79.133.108.0/22", + "79.133.108.13/32", + "79.133.108.14/31", + "79.133.108.16/31", + "79.133.108.23/32", + "79.133.108.24/29", + "79.133.108.32/32", + "79.133.108.4/30", + "79.133.120.0/22", + "79.133.124.0/23", + "79.133.126.0/24", + "79.133.126.166/32", + "80.15.228.1/32", + "80.15.228.3/32", + "80.15.229.1/32", + "80.15.229.3/32", + "80.15.230.1/32", + "80.15.230.13/32", + "80.15.230.15/32", + "80.15.230.3/32", + "80.15.231.1/32", + "80.15.231.3/32", + "80.15.232.1/32", + "80.15.232.3/32", + "80.15.233.1/32", + "80.15.233.3/32", + "80.15.235.17/32", + "80.15.235.25/32", + "80.15.235.27/32", + "80.15.235.5/32", + "80.15.235.7/32", + "80.15.243.17/32", + "80.15.243.5/32", + "80.15.244.17/32", + "80.15.244.5/32", + "80.15.245.1/32", + "80.15.245.13/32", + "80.15.245.15/32", + "80.15.245.3/32", + "80.15.246.1/32", + "80.15.246.13/32", + "80.15.246.15/32", + "80.15.246.3/32", + "80.15.247.17/32", + "80.15.247.5/32", + "80.15.248.1/32", + "80.15.248.13/32", + "80.15.248.15/32", + "80.15.248.3/32", + "80.15.250.1/32", + "80.15.250.9/32", + "80.15.251.1/32", + "80.15.251.11/32", + "80.15.251.13/32", + "80.15.251.15/32", + "80.15.251.21/32", + "80.15.251.23/32", + "80.15.251.25/32", + "80.15.251.29/32", + "80.15.251.31/32", + "80.15.251.9/32", + "80.15.252.17/32", + "80.15.252.209/32", + "80.15.252.41/32", + "80.15.252.43/32", + "80.15.252.45/32", + "80.15.252.47/32", + "80.15.252.61/32", + "80.15.252.63/32", + "80.15.252.65/32", + "80.15.252.67/32", + "80.15.252.81/32", + "80.15.252.83/32", + "80.15.252.85/32", + "80.240.101.0/24", + "80.240.104.0/24", + "80.240.113.0/24", + "80.240.113.12/31", + "80.240.113.14/32", + "80.240.113.21/32", + "80.240.113.22/32", + "80.240.113.4/30", + "80.240.113.8/30", + "80.240.114.0/23", + "80.240.124.0/24", + "80.240.124.11/32", + "80.240.124.4/30", + "80.240.124.8/31", + "80.240.96.0/23", + "80.93.209.0/24", + "80.93.210.0/23", + "80.93.210.4/31", + "80.93.210.6/32", + "80.93.214.0/23", + "80.93.215.18/31", + "80.93.215.20/31", + "80.93.215.22/32", + "80.93.215.4/31", + "80.93.215.6/32", + "80.93.217.0/24", + "80.93.217.115/32", + "80.93.217.163/32", + "80.93.217.22/32", + "80.93.217.225/32", + "80.93.217.236/32", + "80.93.217.245/32", + "80.93.218.0/23", + "80.93.222.0/23", + "81.28.12.0/22", + "82.117.224.0/23", + "82.117.226.0/24", + "82.117.226.107/32", + "82.117.226.126/32", + "82.117.226.240/32", + "82.117.228.0/24", + "82.148.98.42/32", + "82.213.5.50/32", + "82.25.36.0/24", + "82.39.187.0/24", + "82.97.203.0/24", + "82.97.205.0/24", + "82.97.205.4/30", + "82.97.205.8/32", + "82.97.206.0/24", + "83.229.15.0/24", + "83.229.32.0/24", + "83.229.4.0/24", + "83.229.6.0/24", + "85.204.246.0/24", + "85.234.65.0/24", + "85.234.69.0/24", + "85.234.70.0/23", + "85.234.72.0/24", + "85.234.74.0/23", + "85.234.74.4/30", + "85.234.74.8/32", + "85.234.75.16/28", + "85.234.75.4/30", + "85.234.75.8/29", + "85.234.76.0/23", + "85.234.77.12/32", + "85.234.77.14/31", + "85.234.77.16/31", + "85.234.77.4/30", + "85.234.77.8/30", + "85.234.80.0/23", + "85.234.83.0/24", + "85.234.83.177/32", + "85.234.83.224/32", + "85.234.83.253/32", + "85.234.84.0/23", + "85.234.87.0/24", + "85.234.88.0/23", + "85.234.92.0/24", + "85.234.94.0/24", + "85.90.192.0/23", + "85.90.194.0/24", + "85.90.204.0/22", + "85.90.212.0/24", + "85.90.215.0/24", + "85.90.216.0/23", + "85.92.120.117/32", + "86.105.169.0/24", + "86.106.169.0/24", + "87.120.164.0/24", + "87.120.164.4/30", + "87.120.167.0/24", + "87.120.167.42/31", + "87.120.167.72/32", + "87.120.167.96/32", + "87.120.202.0/24", + "87.120.204.0/24", + "87.120.237.0/24", + "87.120.252.0/24", + "87.120.252.166/32", + "87.120.252.185/32", + "87.120.252.19/32", + "87.120.252.22/32", + "87.120.252.243/32", + "87.120.252.83/32", + "87.121.33.0/24", + "87.121.39.0/24", + "87.121.53.0/24", + "87.121.55.0/24", + "87.121.99.0/24", + "89.223.88.0/23", + "89.223.91.0/24", + "89.223.92.0/22", + "89.35.162.0/24", + "89.38.100.0/24", + "89.39.161.0/24", + "89.39.191.0/24", + "89.39.70.0/24", + "89.39.82.0/24", + "89.40.75.0/24", + "89.41.172.0/23", + "89.42.178.0/24", + "89.43.104.0/21", + "89.44.192.0/21", + "90.84.153.129/32", + "90.84.153.130/31", + "90.84.153.161/32", + "90.84.153.162/31", + "90.84.153.17/32", + "90.84.153.18/31", + "90.84.153.193/32", + "90.84.153.194/31", + "90.84.153.225/32", + "90.84.153.226/31", + "90.84.153.33/32", + "90.84.153.34/31", + "90.84.153.65/32", + "90.84.153.66/31", + "90.84.153.97/32", + "90.84.153.98/31", + "91.149.176.68/32", + "91.149.176.70/32", + "91.185.14.226/32", + "91.188.250.0/24", + "91.199.82.0/24", + "91.199.84.0/24", + "91.199.87.0/24", + "91.206.163.0/24", + "91.239.65.0/24", + "91.243.81.0/24", + "91.243.81.199/32", + "91.243.81.20/32", + "91.243.81.66/32", + "91.243.83.5/32", + "91.243.85.0/24", + "91.243.87.0/24", + "91.243.87.4/31", + "92.113.92.0/24", + "92.223.0.0/23", + "92.223.10.0/23", + "92.223.10.0/23", + "92.223.100.0/23", + "92.223.102.0/24", + "92.223.104.0/23", + "92.223.107.0/24", + "92.223.107.132/30", + "92.223.107.138/31", + "92.223.107.36/32", + "92.223.107.38/31", + "92.223.107.40/32", + "92.223.107.42/31", + "92.223.107.44/30", + "92.223.107.48/29", + "92.223.107.56/31", + "92.223.107.58/32", + "92.223.108.13/32", + "92.223.108.5/32", + "92.223.110.4/32", + "92.223.112.0/23", + "92.223.114.14/31", + "92.223.114.6/31", + "92.223.116.0/22", + "92.223.116.0/23", + "92.223.116.200/31", + "92.223.116.204/32", + "92.223.116.209/32", + "92.223.116.210/31", + "92.223.116.212/30", + "92.223.116.216/32", + "92.223.116.220/30", + "92.223.116.224/30", + "92.223.116.229/32", + "92.223.116.230/31", + "92.223.116.232/29", + "92.223.116.240/30", + "92.223.116.244/32", + "92.223.118.12/31", + "92.223.118.18/31", + "92.223.118.196/30", + "92.223.118.20/30", + "92.223.118.200/30", + "92.223.118.205/32", + "92.223.118.206/31", + "92.223.118.24/30", + "92.223.118.28/31", + "92.223.118.30/32", + "92.223.118.37/32", + "92.223.118.4/31", + "92.223.118.7/32", + "92.223.12.0/23", + "92.223.12.10/31", + "92.223.12.12/30", + "92.223.12.16/30", + "92.223.12.20/32", + "92.223.12.22/31", + "92.223.12.24/30", + "92.223.12.9/32", + "92.223.120.0/23", + "92.223.120.132/30", + "92.223.120.136/30", + "92.223.120.140/32", + "92.223.120.146/32", + "92.223.122.184/30", + "92.223.122.188/32", + "92.223.123.20/32", + "92.223.123.32/32", + "92.223.123.34/32", + "92.223.123.45/32", + "92.223.123.46/31", + "92.223.123.48/32", + "92.223.123.50/31", + "92.223.124.0/22", + "92.223.124.12/31", + "92.223.124.15/32", + "92.223.124.16/31", + "92.223.124.18/32", + "92.223.124.22/31", + "92.223.124.24/30", + "92.223.124.28/31", + "92.223.124.31/32", + "92.223.124.32/32", + "92.223.124.35/32", + "92.223.124.37/32", + "92.223.124.4/31", + "92.223.124.43/32", + "92.223.124.44/30", + "92.223.124.48/29", + "92.223.124.56/32", + "92.223.124.6/32", + "92.223.124.8/30", + "92.223.126.0/23", + "92.223.15.0/24", + "92.223.16.0/20", + "92.223.2.0/24", + "92.223.39.0/24", + "92.223.40.0/24", + "92.223.40.10/32", + "92.223.40.12/32", + "92.223.40.14/31", + "92.223.40.16/31", + "92.223.40.18/32", + "92.223.40.4/30", + "92.223.40.8/31", + "92.223.42.0/24", + "92.223.43.13/32", + "92.223.43.14/32", + "92.223.44.0/22", + "92.223.47.4/31", + "92.223.47.6/32", + "92.223.50.0/23", + "92.223.52.0/22", + "92.223.55.13/32", + "92.223.55.14/31", + "92.223.55.16/31", + "92.223.55.18/32", + "92.223.56.0/22", + "92.223.61.0/24", + "92.223.61.21/32", + "92.223.61.25/32", + "92.223.62.0/23", + "92.223.63.21/32", + "92.223.63.22/31", + "92.223.63.24/30", + "92.223.63.28/31", + "92.223.63.4/30", + "92.223.63.8/30", + "92.223.64.12/32", + "92.223.64.4/32", + "92.223.66.0/24", + "92.223.68.0/22", + "92.223.7.0/24", + "92.223.73.0/24", + "92.223.74.0/23", + "92.223.74.20/31", + "92.223.74.26/32", + "92.223.76.0/22", + "92.223.76.132/30", + "92.223.76.136/32", + "92.223.76.20/31", + "92.223.76.22/32", + "92.223.76.26/31", + "92.223.76.28/32", + "92.223.78.22/31", + "92.223.78.24/30", + "92.223.78.28/32", + "92.223.81.0/24", + "92.223.82.0/23", + "92.223.84.0/23", + "92.223.86.0/24", + "92.223.88.0/23", + "92.223.88.0/23", + "92.223.90.0/24", + "92.223.92.0/22", + "92.223.96.0/22", + "92.243.82.0/24", + "92.243.88.0/24", + "92.243.93.0/24", + "92.38.132.0/22", + "92.38.140.0/23", + "92.38.142.0/24", + "92.38.142.21/32", + "92.38.144.0/21", + "92.38.154.0/23", + "92.38.157.0/24", + "92.38.158.0/23", + "92.38.159.4/30", + "92.38.160.0/20", + "92.38.168.5/32", + "92.38.168.6/31", + "92.38.170.10/32", + "92.38.170.6/31", + "92.38.170.8/32", + "92.38.176.0/21", + "92.38.184.0/22", + "92.38.186.0/23", + "93.113.36.0/23", + "93.114.56.0/24", + "93.114.56.123/32", + "93.114.56.29/32", + "93.114.56.34/32", + "93.114.56.45/32", + "93.114.56.55/32", + "93.114.56.76/32", + "93.114.68.0/24", + "93.114.98.0/24", + "93.115.240.0/23", + "93.115.241.4/31", + "93.119.170.0/24", + "93.123.102.0/24", + "93.123.11.0/24", + "93.123.11.12/31", + "93.123.11.14/32", + "93.123.11.16/30", + "93.123.11.21/32", + "93.123.11.22/31", + "93.123.11.24/30", + "93.123.11.8/30", + "93.123.17.0/24", + "93.123.17.132/30", + "93.123.17.136/31", + "93.123.17.142/32", + "93.123.17.144/30", + "93.123.17.148/31", + "93.123.17.151/32", + "93.123.17.158/32", + "93.123.17.160/32", + "93.123.17.165/32", + "93.123.17.166/31", + "93.123.17.168/31", + "93.123.17.170/32", + "93.123.17.175/32", + "93.123.17.176/29", + "93.123.17.184/32", + "93.123.17.186/31", + "93.123.17.188/30", + "93.123.17.192/30", + "93.123.38.0/24", + "93.123.38.4/31", + "93.174.164.0/23", + "93.174.165.16/31", + "93.174.165.18/32", + "93.174.165.8/29", + "94.128.12.238/32", + "94.129.12.210/32", + "94.156.45.0/24", + "94.156.93.0/24", + "94.156.99.0/24", + "94.176.183.0/24", + "94.176.183.11/32", + "94.176.183.12/30", + "94.176.183.16/30", + "94.176.183.20/32", + "94.176.183.5/32", + "94.176.183.6/31", + "94.176.183.8/32", + "94.177.131.0/24", + "94.177.131.25/32", + "94.177.131.57/32", + "94.177.131.92/32", + "94.43.206.202/32", + "95.135.0.0/23", + "95.85.64.0/22", + "95.85.69.0/24", + "95.85.69.4/30", + "95.85.69.8/32", + "95.85.70.0/23", + "95.85.72.0/21", + "95.85.89.0/24", + "95.85.90.0/23", + "95.85.92.0/22", + "95.85.92.5/32", + "95.85.92.6/31", + "95.85.92.8/32", + "95.85.93.155/32", + "95.85.93.160/32", + "95.85.93.226/32", + "95.85.93.236/32", + "95.85.93.26/32", + "95.85.93.31/32" + ], + "domains": [], + "last_updated": 1767754963.8906722, + "long_description": "A content delivery network and cloud infrastructure provider offering CDN, cloud computing, and edge services.", + "name": "Gcore", + "org_ids": [ + "ORG-GLS1-AP-APNIC", + "ORG-WIG6-RIPE" + ], + "regexes": {}, + "short_description": "G-Core Labs", + "tags": [ + "cdn" + ], + "v2fly_company": "" + }, "GitHub": { "asns": [ 36459 @@ -41743,6 +43422,50 @@ ], "v2fly_company": "github" }, + "Gocache": { + "asns": [], + "cidrs": [ + "129.159.48.87/32", + "140.82.27.226/32", + "144.22.216.139/32", + "150.230.84.126/32", + "170.82.172.0/22", + "170.82.175.0/24", + "170.84.29.208/29", + "186.211.161.0/29", + "186.211.188.192/28", + "187.16.245.192/29", + "187.85.159.176/29", + "200.189.173.48/28", + "200.25.49.64/26", + "200.25.56.64/28", + "200.98.28.70/32", + "207.148.26.195/32", + "207.246.123.237/32", + "208.89.72.56/29", + "34.95.148.131/32", + "34.95.164.249/32", + "34.95.168.58/32", + "34.95.209.169/32", + "34.95.213.225/32", + "34.95.253.129/32", + "35.247.222.78/32", + "38.224.134.0/24", + "45.77.97.241/32", + "52.67.255.165/32" + ], + "domains": [], + "last_updated": 1767754937.770947, + "long_description": "A Brazilian content delivery network provider offering CDN services.", + "name": "Gocache", + "org_ids": [], + "regexes": {}, + "short_description": "GoCache", + "tags": [ + "cdn" + ], + "v2fly_company": "" + }, "Google": { "asns": [ 6432, @@ -45080,6 +46803,85 @@ ], "v2fly_company": "hetzner" }, + "Hostway": { + "asns": [ + 9952 + ], + "cidrs": [ + "103.24.8.0/22", + "150.107.68.0/22", + "203.248.16.0/20", + "210.109.96.0/21", + "210.109.96.0/21", + "210.122.0.0/23", + "210.122.40.0/24", + "210.122.6.0/24", + "210.122.9.0/24", + "211.115.202.0/23", + "211.115.202.0/23", + "211.115.204.0/22", + "211.115.204.0/22", + "211.115.208.0/22", + "211.115.212.0/23", + "211.115.214.0/24", + "211.115.216.0/21", + "211.238.0.0/23", + "211.238.3.0/24", + "211.238.5.0/24", + "211.238.6.0/23", + "211.238.8.0/21", + "211.239.112.0/20", + "211.239.112.0/20", + "211.239.150.0/23", + "211.239.152.0/21", + "211.239.152.0/21", + "211.239.160.0/21", + "211.239.160.0/21", + "211.239.168.0/22", + "211.239.168.0/22", + "211.239.172.0/23", + "211.239.172.0/23", + "211.43.176.0/20", + "211.43.176.0/20", + "61.100.0.0/20", + "61.100.0.0/20", + "61.100.180.0/22", + "61.100.180.0/22", + "61.100.184.0/22", + "61.100.184.0/22", + "61.100.188.0/24", + "61.100.191.0/24", + "61.109.244.0/22", + "61.109.244.0/22", + "61.109.250.0/24", + "61.109.252.0/22", + "61.109.252.0/22", + "61.250.84.0/22", + "61.250.84.0/22", + "61.250.88.0/24", + "61.250.91.0/24", + "61.250.92.0/23", + "61.250.92.0/23", + "64.23.67.0/24", + "64.23.68.0/24", + "64.23.71.0/24", + "66.232.136.0/21", + "66.232.144.0/22" + ], + "domains": [], + "last_updated": 1767754936.6570692, + "long_description": "A Korean cloud hosting and infrastructure provider.", + "name": "Hostway", + "org_ids": [ + "@aut-9952-APNIC" + ], + "regexes": {}, + "short_description": "Hostway (\ud638\uc2a4\ud2b8\uc6e8\uc774)", + "tags": [ + "cloud" + ], + "v2fly_company": "" + }, "Huawei": { "asns": [ 131444, @@ -46479,6 +48281,193 @@ ], "v2fly_company": "" }, + "Kinx": { + "asns": [ + 9286, + 9957, + 17604 + ], + "cidrs": [ + "1.201.0.0/16", + "1.201.127.0/24", + "1.201.128.0/24", + "1.201.136.0/22", + "1.201.151.0/24", + "1.201.152.0/21", + "1.201.65.0/24", + "103.131.164.0/24", + "103.230.59.0/24", + "103.6.100.0/22", + "103.6.101.0/24", + "103.6.102.0/24", + "103.60.124.0/22", + "121.50.64.0/18", + "121.78.0.0/16", + "121.78.0.0/22", + "121.78.128.0/21", + "121.78.135.0/24", + "121.78.137.0/24", + "121.78.138.0/23", + "121.78.141.0/24", + "121.78.142.0/24", + "121.78.144.0/21", + "121.78.151.0/24", + "121.78.153.0/24", + "121.78.155.0/24", + "121.78.156.0/23", + "121.78.168.0/22", + "121.78.172.0/23", + "121.78.174.0/24", + "121.78.176.0/24", + "121.78.185.0/24", + "121.78.199.0/24", + "121.78.20.0/23", + "121.78.216.0/23", + "121.78.221.0/24", + "121.78.222.0/23", + "121.78.224.0/19", + "121.78.224.0/23", + "121.78.226.0/24", + "121.78.228.0/22", + "121.78.233.0/24", + "121.78.236.0/23", + "121.78.240.0/24", + "121.78.242.0/23", + "121.78.244.0/24", + "121.78.246.0/24", + "121.78.31.0/24", + "121.78.35.0/24", + "121.78.38.0/24", + "121.78.40.0/24", + "121.78.42.0/24", + "121.78.5.0/24", + "121.78.51.0/24", + "121.78.53.0/24", + "121.78.54.0/23", + "121.78.56.0/24", + "121.78.59.0/24", + "121.78.62.0/24", + "121.78.66.0/23", + "121.78.68.0/24", + "121.78.70.0/23", + "121.78.72.0/21", + "121.78.72.0/24", + "121.78.75.0/24", + "121.78.80.0/20", + "121.78.81.0/24", + "121.78.85.0/24", + "121.78.89.0/24", + "121.78.92.0/24", + "121.78.96.0/20", + "122.49.104.0/23", + "122.49.106.0/24", + "122.49.64.0/19", + "122.49.64.0/20", + "122.49.96.0/20", + "122.49.96.0/21", + "139.150.128.0/17", + "139.150.152.0/21", + "139.150.154.0/24", + "139.150.248.0/22", + "139.150.8.0/22", + "139.150.81.0/24", + "139.150.82.0/24", + "139.150.91.0/24", + "14.129.1.0/24", + "14.129.110.0/23", + "14.129.112.0/21", + "14.129.120.0/24", + "14.129.140.0/24", + "14.129.15.0/24", + "14.129.166.0/23", + "14.129.168.0/23", + "14.129.18.0/24", + "14.129.2.0/23", + "14.129.200.0/23", + "14.129.211.0/24", + "14.129.212.0/23", + "14.129.214.0/24", + "14.129.31.0/24", + "14.129.4.0/23", + "14.129.46.0/24", + "14.129.6.0/24", + "14.129.73.0/24", + "14.129.74.0/23", + "14.129.76.0/24", + "14.129.80.0/20", + "14.129.96.0/23", + "182.161.112.0/21", + "182.161.120.0/22", + "182.161.124.0/23", + "182.161.96.0/19", + "182.161.96.0/20", + "182.161.96.0/21", + "203.236.192.0/18", + "203.238.176.0/20", + "203.238.176.0/22", + "203.238.181.0/24", + "203.238.182.0/23", + "203.238.184.0/21", + "203.238.184.0/24", + "203.238.186.0/23", + "203.246.160.0/20", + "203.246.160.0/21", + "203.246.168.0/22", + "203.246.169.0/24", + "203.246.170.0/23", + "203.84.240.0/20", + "203.84.240.0/20", + "210.97.240.0/20", + "2401:2700::/48", + "2401:2700:a::/48", + "61.106.224.0/20", + "61.106.232.0/21", + "61.251.16.0/20", + "63.105.192.0/20" + ], + "domains": [], + "last_updated": 1767754952.1961405, + "long_description": "A Korean content delivery network and cloud infrastructure provider.", + "name": "Kinx", + "org_ids": [ + "@aut-9286-APNIC" + ], + "regexes": {}, + "short_description": "KINX (\ud55c\uad6d\uc778\ud130\ub137\uc778\ud504\ub77c)", + "tags": [ + "cdn" + ], + "v2fly_company": "" + }, + "Ktcloud": { + "asns": [ + 9947, + 152232 + ], + "cidrs": [ + "110.14.170.0/24", + "14.63.187.0/24", + "14.63.188.0/24", + "210.180.83.0/24", + "210.180.94.0/23", + "211.56.126.0/23", + "61.100.71.0/24", + "61.100.72.0/24" + ], + "domains": [], + "last_updated": 1767754937.3556323, + "long_description": "A Korean cloud computing service provided by KT Corporation.", + "name": "Ktcloud", + "org_ids": [ + "@aut-152232-APNIC" + ], + "regexes": {}, + "short_description": "KT Cloud (KT\ud074\ub77c\uc6b0\ub4dc)", + "tags": [ + "cloud" + ], + "v2fly_company": "" + }, "Leaseweb": { "asns": [ 7203, @@ -48010,6 +49999,194 @@ ], "v2fly_company": "" }, + "Lgtelecom": { + "asns": [ + 17853 + ], + "cidrs": [ + "106.100.0.0/22", + "106.100.11.0/24", + "106.100.12.0/23", + "106.100.4.0/24", + "106.101.0.0/21", + "106.101.110.0/24", + "106.101.112.0/22", + "106.101.122.0/24", + "106.101.124.0/22", + "106.101.128.0/21", + "106.101.136.0/22", + "106.101.187.0/24", + "106.101.188.0/22", + "106.101.192.0/20", + "106.101.208.0/22", + "106.101.252.0/22", + "106.101.61.0/24", + "106.101.62.0/23", + "106.101.64.0/20", + "106.101.8.0/22", + "106.101.80.0/22", + "106.102.0.0/17", + "106.102.0.0/23", + "106.102.11.0/24", + "106.102.120.0/24", + "106.102.123.0/24", + "106.102.124.0/23", + "106.102.128.0/23", + "106.102.130.0/24", + "106.102.142.0/24", + "106.102.251.0/24", + "106.102.253.0/24", + "106.103.1.0/24", + "106.103.2.0/24", + "106.96.0.0/16", + "106.96.0.0/16", + "117.111.0.0/19", + "117.111.0.0/21", + "117.111.12.0/23", + "117.111.14.0/24", + "117.111.16.0/20", + "117.111.8.0/22", + "2001:4430:4000::/35", + "2001:4430:4020::/43", + "2001:4430:4060::/43", + "2001:4430:4080::/41", + "2001:4430:4100::/44", + "2001:4430:4110::/45", + "2001:4430:4120::/45", + "2001:4430:4130::/44", + "2001:4430:4140::/42", + "2001:4430:4180::/42", + "2001:4430:41c0::/43", + "2001:4430:41e0::/45", + "2001:4430:4f00::/45", + "2001:4430:5000::/41", + "2001:4430:5080::/43", + "2001:4430:50b0::/44", + "2001:4430:50c0::/42", + "2001:4430:5100::/44", + "2001:4430:5120::/45", + "2001:4430:5200::/44", + "2001:4430:5300::/44", + "2001:4430:6000::/36", + "2001:4430:6000::/36", + "2001:4430:6000::/41", + "2001:4430:6080::/44", + "2001:4430:6800::/42", + "2001:4430:c000::/35", + "2001:4430:c000::/43", + "2001:4430:c020::/45", + "2001:4430:c030::/44", + "2001:4430:c040::/42", + "2001:4430:c080::/41", + "2001:4430:c100::/42", + "2001:4430:c140::/45", + "2001:4430:c150::/44", + "2001:4430:c160::/43", + "2001:4430:c180::/42", + "2001:4430:c1c0::/43", + "2001:4430:c200::/41", + "2001:4430:c280::/42", + "2001:4430:c2c0::/44", + "2001:4430:c2f0::/44", + "2001:4430:c300::/44", + "2001:4430:c400::/43", + "2001:4430:c420::/44", + "2001:4430:c800::/44", + "2001:4430:d000::/45", + "2001:4430:d010::/44", + "2001:4430:d030::/44", + "2001:4430:d040::/43", + "2001:4430:d070::/44", + "2001:4430:d080::/42", + "2001:4430:d0c8::/45", + "2001:4430:d0d0::/44", + "2001:4430:d0e0::/43", + "2001:4430:d100::/41", + "2001:4430:d180::/42", + "2001:4430:d1c0::/43", + "2001:4430:d210::/44", + "2001:4430:d220::/43", + "2001:4430:d240::/44", + "2001:4430:d250::/45", + "2001:4430:d258::/47", + "2001:4430:d25c::/46", + "2001:4430:d260::/43", + "2001:4430:d280::/43", + "2001:4430:d2f0::/44", + "2001:4430:d430::/44", + "2001:4430:d440::/43", + "2001:4430:d800::/45", + "2001:4430:f:101::/64", + "2001:4430:f:102::/63", + "2001:4430:f:105::/64", + "2001:4430:f:113::/64", + "2001:4430:f:115::/64", + "2001:4430:f::/48", + "210.206.248.0/24", + "211.36.128.0/19", + "211.36.128.0/22", + "211.36.132.0/23", + "211.36.135.0/24", + "211.36.136.0/21", + "211.36.144.0/20", + "223.171.0.0/16", + "223.172.0.0/16", + "223.172.0.0/16", + "223.172.128.0/17", + "223.174.0.0/15", + "223.174.0.0/16", + "223.175.0.0/20", + "223.175.130.0/23", + "223.175.130.0/23", + "223.175.132.0/22", + "223.175.132.0/22", + "223.175.136.0/23", + "223.175.136.0/23", + "223.175.144.0/20", + "223.175.184.0/21", + "223.175.184.0/21", + "223.175.192.0/20", + "223.175.192.0/20", + "223.175.216.0/24", + "223.175.230.0/23", + "223.175.230.0/23", + "223.175.232.0/22", + "223.175.232.0/22", + "223.175.236.0/23", + "223.175.236.0/23", + "223.175.252.0/23", + "223.175.28.0/22", + "223.175.28.0/22", + "223.175.32.0/22", + "223.175.32.0/22", + "223.175.40.0/21", + "223.175.40.0/21", + "223.175.48.0/20", + "223.175.48.0/20", + "223.175.64.0/18", + "223.175.64.0/18", + "61.33.197.0/24", + "61.43.164.0/24", + "61.43.179.0/24", + "61.43.180.0/23", + "61.43.226.0/24", + "61.43.230.0/24", + "61.43.236.0/24" + ], + "domains": [], + "last_updated": 1767754937.29719, + "long_description": "A Korean telecommunications company offering CDN services.", + "name": "Lgtelecom", + "org_ids": [ + "@aut-17853-APNIC" + ], + "regexes": {}, + "short_description": "LG U+ (LG\uc720\ud50c\ub7ec\uc2a4)", + "tags": [ + "cdn" + ], + "v2fly_company": "" + }, "Microsoft": { "asns": [ 3598, @@ -51250,6 +53427,342 @@ ], "v2fly_company": "microsoft" }, + "Microsoft365": { + "asns": [], + "cidrs": [ + "104.146.128.0/17", + "104.47.0.0/17", + "13.107.128.0/22", + "13.107.136.0/22", + "13.107.140.6/32", + "13.107.18.10/31", + "13.107.18.15/32", + "13.107.6.152/31", + "13.107.6.171/32", + "13.107.6.192/32", + "13.107.9.192/32", + "131.253.33.215/32", + "132.245.0.0/16", + "150.171.32.0/22", + "150.171.40.0/22", + "20.190.128.0/18", + "20.20.32.0/19", + "20.231.128.0/19", + "204.79.197.215/32", + "23.103.160.0/20", + "2603:1006:1400::/40", + "2603:1006:2000::/48", + "2603:1006::/40", + "2603:1007:200::/48", + "2603:1016:1400::/48", + "2603:1016:2400::/40", + "2603:1016::/36", + "2603:1017::/48", + "2603:1026:2400::/40", + "2603:1026:3000::/48", + "2603:1026::/36", + "2603:1027::/47", + "2603:1036:2400::/40", + "2603:1036:3000::/48", + "2603:1036::/36", + "2603:1037::/47", + "2603:1046:1400::/40", + "2603:1046:2000::/48", + "2603:1046::/36", + "2603:1047::/47", + "2603:1056:1400::/40", + "2603:1056:2000::/48", + "2603:1056::/36", + "2603:1057:2::/48", + "2603:1057::/48", + "2603:1061:1300::/40", + "2603:1063:2000::/38", + "2603:1063:6000::/35", + "2603:1063::/38", + "2620:1ec:40::/42", + "2620:1ec:4::152/127", + "2620:1ec:4::192/128", + "2620:1ec:6::/48", + "2620:1ec:8f0::/46", + "2620:1ec:8f8::/46", + "2620:1ec:8fc::6/128", + "2620:1ec:900::/46", + "2620:1ec:908::/46", + "2620:1ec:a92::152/127", + "2620:1ec:a92::171/128", + "2620:1ec:a92::192/128", + "2620:1ec:c::10/127", + "2620:1ec:c::15/128", + "2620:1ec:d::10/127", + "2a01:111:f100:2000::a83e:3019/128", + "2a01:111:f100:2002::8975:2d79/128", + "2a01:111:f100:2002::8975:2da8/128", + "2a01:111:f100:7000::6fdd:6cd5/128", + "2a01:111:f100:a004::bfeb:88cf/128", + "2a01:111:f400::/48", + "2a01:111:f402::/47", + "40.104.0.0/15", + "40.107.0.0/16", + "40.108.128.0/17", + "40.126.0.0/18", + "40.92.0.0/15", + "40.96.0.0/13", + "52.112.0.0/14", + "52.122.0.0/15", + "52.238.78.88/32", + "52.244.37.168/32", + "52.96.0.0/12" + ], + "domains": [], + "last_updated": 1767754932.2223408, + "long_description": "A cloud-based productivity suite provided by Microsoft, including Office applications and cloud services.", + "name": "Microsoft365", + "org_ids": [], + "regexes": {}, + "short_description": "Microsoft 365", + "tags": [ + "cloud" + ], + "v2fly_company": "" + }, + "Navercloud": { + "asns": [ + 23576, + 23982 + ], + "cidrs": [ + "1.255.48.0/20", + "1.255.48.0/20", + "103.6.172.0/22", + "103.6.174.0/23", + "110.234.232.0/21", + "110.234.232.0/22", + "110.234.240.0/22", + "110.234.244.0/24", + "110.234.246.0/23", + "110.234.246.0/23", + "110.234.248.0/21", + "110.234.252.0/22", + "110.234.64.0/18", + "110.93.144.0/20", + "110.93.144.0/21", + "111.91.128.0/21", + "111.91.128.0/21", + "111.91.136.0/24", + "111.91.138.0/23", + "111.91.140.0/22", + "114.111.32.0/20", + "117.52.128.0/20", + "117.52.128.0/20", + "125.209.192.0/18", + "125.209.192.0/19", + "125.209.224.0/20", + "125.209.240.0/21", + "125.209.250.0/23", + "125.209.252.0/23", + "175.158.0.0/19", + "175.158.0.0/19", + "175.158.10.0/23", + "175.158.10.0/23", + "175.158.8.0/21", + "175.158.8.0/21", + "182.162.192.0/20", + "182.162.192.0/20", + "182.162.92.0/23", + "182.162.92.0/23", + "202.131.24.0/21", + "202.179.176.0/21", + "203.104.160.0/20", + "203.104.160.0/21", + "203.104.170.0/23", + "203.104.172.0/22", + "203.104.176.0/23", + "203.104.176.0/23", + "210.89.160.0/19", + "210.89.160.0/20", + "211.188.44.0/24", + "211.249.40.0/21", + "211.249.40.0/21", + "211.249.48.0/20", + "211.249.48.0/20", + "211.249.64.0/21", + "211.249.64.0/23", + "211.249.68.0/22", + "220.230.112.0/20", + "220.230.112.0/20", + "220.230.168.0/23", + "220.230.184.0/22", + "220.230.184.0/22", + "223.130.192.0/20", + "38.77.206.0/24", + "43.250.152.0/22", + "49.236.132.0/22", + "49.236.144.0/21", + "49.50.176.0/21", + "61.247.192.0/20", + "61.247.208.0/22", + "61.247.216.0/22", + "61.247.220.0/23", + "61.97.176.0/20" + ], + "domains": [], + "last_updated": 1767754937.2173371, + "long_description": "A Korean cloud computing platform provided by Naver Corporation.", + "name": "Navercloud", + "org_ids": [ + "@aut-23576-APNIC" + ], + "regexes": {}, + "short_description": "Naver Cloud Platform (\ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc)", + "tags": [ + "cloud" + ], + "v2fly_company": "" + }, + "Nhncloud": { + "asns": [ + 10038, + 45974, + 152291 + ], + "cidrs": [ + "1.209.199.0/24", + "101.79.68.0/22", + "101.79.80.0/21", + "101.79.92.0/22", + "103.132.32.0/22", + "103.194.108.0/22", + "103.194.108.0/22", + "103.218.156.0/22", + "103.218.156.0/22", + "103.243.200.0/22", + "103.87.116.0/22", + "106.249.18.0/23", + "106.249.18.0/23", + "106.249.20.0/22", + "106.249.20.0/22", + "106.249.24.0/21", + "106.249.24.0/23", + "106.249.30.0/23", + "106.249.32.0/23", + "106.249.32.0/23", + "110.45.212.0/22", + "114.110.128.0/21", + "114.110.136.0/22", + "114.110.140.0/23", + "114.110.143.0/24", + "114.110.144.0/22", + "114.110.150.0/24", + "114.110.152.0/24", + "114.110.160.0/22", + "114.110.164.0/24", + "114.110.177.0/24", + "114.110.178.0/24", + "114.110.180.0/22", + "114.110.184.0/21", + "114.110.184.0/22", + "114.110.190.0/23", + "115.88.123.0/24", + "115.88.132.0/24", + "115.89.203.0/24", + "115.89.67.0/24", + "115.89.74.0/24", + "115.92.64.0/24", + "117.52.122.0/23", + "117.52.154.0/23", + "117.52.20.0/24", + "117.52.5.0/24", + "121.254.219.0/24", + "125.6.32.0/24", + "125.6.36.0/22", + "125.6.40.0/21", + "125.6.48.0/21", + "125.6.57.0/24", + "125.6.58.0/23", + "125.6.60.0/22", + "133.186.128.0/17", + "133.186.128.0/20", + "133.186.144.0/21", + "133.186.152.0/22", + "133.186.156.0/24", + "133.186.158.0/23", + "133.186.160.0/22", + "133.186.165.0/24", + "133.186.166.0/23", + "133.186.168.0/21", + "133.186.176.0/21", + "133.186.184.0/22", + "133.186.188.0/23", + "133.186.191.0/24", + "133.186.192.0/19", + "133.186.225.0/24", + "133.186.228.0/23", + "133.186.232.0/24", + "133.186.236.0/23", + "133.186.239.0/24", + "133.186.240.0/21", + "133.186.250.0/23", + "133.186.252.0/23", + "133.186.255.0/24", + "180.210.100.0/22", + "180.210.104.0/21", + "180.210.112.0/20", + "180.210.64.0/22", + "180.210.68.0/24", + "180.210.70.0/23", + "180.210.74.0/23", + "180.210.76.0/22", + "180.210.80.0/22", + "180.210.84.0/24", + "180.210.87.0/24", + "180.210.88.0/22", + "180.210.92.0/24", + "180.210.95.0/24", + "180.210.96.0/24", + "210.124.216.0/24", + "210.206.88.0/24", + "211.168.237.0/24", + "211.170.184.0/24", + "211.172.144.0/23", + "211.180.235.0/24", + "211.188.100.0/23", + "211.188.103.0/24", + "211.188.96.0/22", + "211.255.136.0/21", + "211.32.155.0/24", + "211.50.32.0/24", + "211.50.58.0/24", + "211.56.0.0/21", + "223.255.200.0/23", + "223.255.202.0/24", + "223.255.204.0/23", + "223.255.207.0/24", + "43.227.116.0/22", + "43.227.116.0/22", + "43.254.244.0/24", + "45.125.232.0/22", + "45.125.232.0/22", + "45.249.160.0/22", + "45.249.160.0/22", + "59.150.32.0/22", + "59.150.36.0/23", + "61.111.36.0/22", + "61.42.226.0/24" + ], + "domains": [], + "last_updated": 1767754941.4651847, + "long_description": "A Korean cloud computing platform provided by NHN Corporation.", + "name": "Nhncloud", + "org_ids": [ + "@aut-10038-APNIC" + ], + "regexes": {}, + "short_description": "NHN Cloud (NHN\ud074\ub77c\uc6b0\ub4dc)", + "tags": [ + "cloud" + ], + "v2fly_company": "" + }, "OVH": { "asns": [ 16276, @@ -54911,6 +57424,49 @@ ], "v2fly_company": "" }, + "Skbroadband": { + "asns": [ + 9705, + 10049 + ], + "cidrs": [ + "124.66.176.0/20", + "124.66.178.0/24", + "124.66.185.0/24", + "168.154.0.0/16", + "168.154.231.0/24", + "182.50.32.0/19", + "203.235.192.0/21", + "203.235.208.0/20", + "203.235.224.0/19", + "203.242.120.0/21", + "203.242.64.0/19", + "210.211.64.0/19", + "211.45.32.0/19", + "211.45.32.0/19", + "211.45.51.0/24", + "211.45.60.0/23", + "211.45.60.0/23", + "211.45.62.0/24", + "49.50.32.0/19", + "49.50.35.0/24", + "49.50.62.0/24", + "61.97.0.0/20" + ], + "domains": [], + "last_updated": 1767754961.3570437, + "long_description": "A Korean telecommunications company offering CDN services.", + "name": "Skbroadband", + "org_ids": [ + "@aut-10049-APNIC" + ], + "regexes": {}, + "short_description": "SK Broadband (SK\ube0c\ub85c\ub4dc\ubc34\ub4dc)", + "tags": [ + "cdn" + ], + "v2fly_company": "" + }, "Stormwall": { "asns": [ 51558, @@ -56191,5 +58747,268 @@ "cloud" ], "v2fly_company": "zoho" + }, + "Zscaler": { + "asns": [], + "cidrs": [ + "101.2.202.0/23", + "101.2.204.0/23", + "101.2.212.0/23", + "101.2.222.0/23", + "101.2.224.0/20", + "103.215.126.0/24", + "104.129.192.0/21", + "104.129.200.0/23", + "104.129.204.0/22", + "112.137.170.0/24", + "128.177.125.0/24", + "136.226.0.0/22", + "136.226.100.0/22", + "136.226.104.0/21", + "136.226.112.0/22", + "136.226.116.0/23", + "136.226.122.0/23", + "136.226.124.0/22", + "136.226.128.0/21", + "136.226.138.0/23", + "136.226.140.0/23", + "136.226.162.0/23", + "136.226.164.0/22", + "136.226.168.0/22", + "136.226.172.0/23", + "136.226.186.0/23", + "136.226.188.0/22", + "136.226.192.0/23", + "136.226.198.0/23", + "136.226.200.0/21", + "136.226.208.0/21", + "136.226.216.0/23", + "136.226.228.0/22", + "136.226.232.0/21", + "136.226.240.0/22", + "136.226.244.0/23", + "136.226.248.0/21", + "136.226.48.0/20", + "136.226.64.0/20", + "136.226.80.0/21", + "136.226.90.0/23", + "137.83.154.0/24", + "140.210.152.0/23", + "147.161.128.0/20", + "147.161.144.0/21", + "147.161.152.0/22", + "147.161.156.0/23", + "147.161.160.0/19", + "147.161.192.0/21", + "147.161.212.0/22", + "147.161.216.0/22", + "147.161.224.0/21", + "147.161.232.0/22", + "147.161.236.0/23", + "147.161.244.0/22", + "147.161.248.0/22", + "147.161.254.0/23", + "154.113.23.0/24", + "159.254.176.0/21", + "159.254.184.0/23", + "159.254.192.0/21", + "159.254.30.0/23", + "159.254.32.0/20", + "159.254.48.0/22", + "159.254.56.0/23", + "159.254.60.0/23", + "159.254.64.0/23", + "159.254.72.0/21", + "159.254.88.0/23", + "165.225.0.0/23", + "165.225.102.0/24", + "165.225.104.0/24", + "165.225.106.0/23", + "165.225.108.0/22", + "165.225.112.0/22", + "165.225.116.0/23", + "165.225.120.0/22", + "165.225.124.0/23", + "165.225.192.0/19", + "165.225.2.0/24", + "165.225.20.0/22", + "165.225.226.0/23", + "165.225.228.0/22", + "165.225.232.0/22", + "165.225.240.0/22", + "165.225.246.0/23", + "165.225.248.0/23", + "165.225.26.0/23", + "165.225.32.0/23", + "165.225.36.0/22", + "165.225.48.0/24", + "165.225.50.0/23", + "165.225.56.0/21", + "165.225.66.0/23", + "165.225.72.0/22", + "165.225.76.0/23", + "165.225.8.0/21", + "165.225.80.0/22", + "165.225.92.0/22", + "165.225.96.0/23", + "167.103.0.0/20", + "167.103.104.0/22", + "167.103.118.0/23", + "167.103.120.0/22", + "167.103.126.0/23", + "167.103.128.0/21", + "167.103.136.0/22", + "167.103.140.0/23", + "167.103.156.0/23", + "167.103.16.0/21", + "167.103.160.0/22", + "167.103.186.0/23", + "167.103.188.0/23", + "167.103.196.0/22", + "167.103.200.0/21", + "167.103.208.0/22", + "167.103.214.0/23", + "167.103.218.0/23", + "167.103.222.0/23", + "167.103.226.0/23", + "167.103.230.0/23", + "167.103.232.0/22", + "167.103.24.0/22", + "167.103.248.0/21", + "167.103.28.0/23", + "167.103.42.0/23", + "167.103.44.0/22", + "167.103.54.0/23", + "167.103.56.0/21", + "167.103.64.0/20", + "167.103.80.0/22", + "167.103.88.0/23", + "167.103.96.0/21", + "170.85.0.0/19", + "170.85.112.0/22", + "170.85.128.0/21", + "170.85.136.0/22", + "170.85.142.0/23", + "170.85.144.0/21", + "170.85.152.0/22", + "170.85.182.0/23", + "170.85.188.0/22", + "170.85.200.0/21", + "170.85.228.0/22", + "170.85.232.0/22", + "170.85.238.0/23", + "170.85.240.0/22", + "170.85.244.0/23", + "170.85.54.0/23", + "170.85.56.0/22", + "170.85.62.0/23", + "170.85.64.0/20", + "170.85.84.0/22", + "170.85.88.0/21", + "170.85.96.0/20", + "175.107.132.0/23", + "175.107.136.0/21", + "175.107.144.0/20", + "175.107.160.0/21", + "175.107.168.0/23", + "185.46.212.0/23", + "194.9.112.0/22", + "194.9.96.0/20", + "198.14.68.0/23", + "198.14.80.0/22", + "198.14.88.0/22", + "205.220.0.0/21", + "205.220.16.0/20", + "205.220.32.0/21", + "205.220.40.0/22", + "205.220.46.0/23", + "205.220.48.0/22", + "205.220.58.0/23", + "205.220.60.0/22", + "205.220.64.0/22", + "205.220.70.0/23", + "205.220.72.0/21", + "205.220.8.0/23", + "205.220.80.0/23", + "205.220.84.0/22", + "211.144.19.0/24", + "220.243.154.0/23", + "221.122.91.0/24", + "2400:7aa0:1200::/39", + "2400:7aa0:1319::/48", + "2400:7aa0:131a::/48", + "2400:7aa0:1400::/38", + "2400:7aa0:1800::/37", + "2400:7aa0:1d13::/48", + "2400:7aa0:2200::/39", + "2400:7aa0:2400::/39", + "2400:7aa0:2600::/40", + "2400:7aa0:2900::/40", + "2400:7aa0:2b00::/40", + "2400:7aa0:2c00::/40", + "2605:4300:1200::/39", + "2605:4300:1400::/40", + "2605:4300:1b00::/40", + "2605:4300:1c00::/38", + "2605:4300:2200::/39", + "2605:4300:2400::/38", + "2605:4300:2800::/38", + "2605:4300:2d00::/40", + "2605:4300:2e00::/39", + "2605:4300:3200::/40", + "2605:4300:3700::/40", + "2605:4300:3800::/40", + "2605:4300:e200::/39", + "2605:4300:e400::/40", + "2605:4300:e700::/40", + "2a03:eec0:1200::/39", + "2a03:eec0:1400::/38", + "2a03:eec0:1800::/37", + "2a03:eec0:2200::/39", + "2a03:eec0:2500::/40", + "2a03:eec0:2600::/39", + "2a03:eec0:2800::/37", + "2a03:eec0:3000::/39", + "2a03:eec0:3210::/46", + "2a03:eec0:3215::/48", + "2a03:eec0:3216::/48", + "2a03:eec0:321d::/48", + "2a03:eec0:3222::/47", + "2a03:eec0:3225::/48", + "2a03:eec0:3227::/48", + "2a03:eec0:3229::/48", + "2a03:eec0:322b::/48", + "2a03:eec0:322d::/48", + "2a03:eec0:3300::/40", + "2a03:eec0:3400::/40", + "2a03:eec0:3800::/40", + "58.220.95.0/24", + "64.215.22.0/24", + "87.58.102.0/23", + "87.58.104.0/23", + "87.58.110.0/23", + "87.58.112.0/21", + "87.58.122.0/23", + "87.58.66.0/23", + "87.58.68.0/22", + "87.58.72.0/21", + "87.58.80.0/20", + "87.58.96.0/23", + "98.98.169.0/24", + "98.98.186.0/23", + "98.98.26.0/23", + "98.98.28.0/24" + ], + "domains": [], + "last_updated": 1767754939.775195, + "long_description": "A cloud security company providing secure internet access, cloud security, and zero trust network access services.", + "name": "Zscaler", + "org_ids": [], + "regexes": {}, + "short_description": "Zscaler", + "tags": [ + "cloud" + ], + "v2fly_company": "" } } \ No newline at end of file diff --git a/cloudcheck/providers/baidu.py b/cloudcheck/providers/baidu.py new file mode 100644 index 0000000..87b6a36 --- /dev/null +++ b/cloudcheck/providers/baidu.py @@ -0,0 +1,17 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Baidu(BaseProvider): + v2fly_company: str = "baidu" + tags: List[str] = ["cdn"] + short_description: str = "Baidu Cloud Acceleration (百度云加速)" + long_description: str = "A Chinese content delivery network and cloud acceleration service provided by Baidu." + # {"org_id": "BUL-5-ARIN", "org_name": "Baidu USA LLC", "country": "US", "asns": [63288]} + # {"org_id": "ORG-BKL1-AP-APNIC", "org_name": "Baidu (Hong Kong) Limited", "country": "HK", "asns": [133746]} + # {"org_id": "ORG-BKL4-RIPE", "org_name": "Baidu (Hong Kong) Limited", "country": "HK", "asns": [199506]} + org_ids: List[str] = [ + "BUL-5-ARIN", + "ORG-BKL1-AP-APNIC", + "ORG-BKL4-RIPE", + ] diff --git a/cloudcheck/providers/cdnetworks.py b/cloudcheck/providers/cdnetworks.py new file mode 100644 index 0000000..05654bf --- /dev/null +++ b/cloudcheck/providers/cdnetworks.py @@ -0,0 +1,14 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Cdnetworks(BaseProvider): + tags: List[str] = ["cdn"] + short_description: str = "CDNetworks (씨디네트웍스)" + long_description: str = ( + "A Korean content delivery network provider offering CDN and cloud services." + ) + # {"org_id": "CDNET-ARIN", "org_name": "CDNetworks Inc.", "country": "US", "asns": [36408,40366]} + org_ids: List[str] = [ + "CDNET-ARIN", + ] diff --git a/cloudcheck/providers/gabia.py b/cloudcheck/providers/gabia.py new file mode 100644 index 0000000..6449f05 --- /dev/null +++ b/cloudcheck/providers/gabia.py @@ -0,0 +1,12 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Gabia(BaseProvider): + tags: List[str] = ["cloud"] + short_description: str = "Gabia (가비아)" + long_description: str = "A Korean cloud hosting and infrastructure provider." + # {"org_id": "@aut-17589-APNIC", "org_name": null, "country": null, "asns": [17589]} + org_ids: List[str] = [ + "@aut-17589-APNIC", + ] diff --git a/cloudcheck/providers/gcore.py b/cloudcheck/providers/gcore.py new file mode 100644 index 0000000..ff3fa88 --- /dev/null +++ b/cloudcheck/providers/gcore.py @@ -0,0 +1,27 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Gcore(BaseProvider): + tags: List[str] = ["cdn"] + short_description: str = "G-Core Labs" + long_description: str = "A content delivery network and cloud infrastructure provider offering CDN, cloud computing, and edge services." + # {"org_id": "ORG-GLS1-AP-APNIC", "org_name": "G-Core Labs S.A", "country": "LU", "asns": [59245]} + # {"org_id": "ORG-WIG6-RIPE", "org_name": "G-Core Labs S.A.", "country": "LU", "asns": [199524,202422,210559]} + org_ids: List[str] = [ + "ORG-GLS1-AP-APNIC", + "ORG-WIG6-RIPE", + ] + + _ips_url = "https://api.gcore.com/cdn/public-ip-list" + + def fetch_cidrs(self): + response = self.request(self._ips_url) + ranges = set() + if getattr(response, "status_code", 0) == 200: + response_json = response.json() + if isinstance(response_json, dict): + for key in "addresses", "addresses_v6": + for ip_range in response_json.get(key, []): + ranges.add(ip_range) + return list(ranges) diff --git a/cloudcheck/providers/gocache.py b/cloudcheck/providers/gocache.py new file mode 100644 index 0000000..f54f671 --- /dev/null +++ b/cloudcheck/providers/gocache.py @@ -0,0 +1,47 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Gocache(BaseProvider): + tags: List[str] = ["cdn"] + short_description: str = "GoCache" + long_description: str = ( + "A Brazilian content delivery network provider offering CDN services." + ) + + _ips_url = "https://gocache.com.br/ips" + cidrs: List[str] = [ + "52.67.255.165/32", + "170.82.175.0/24", + "187.16.245.192/29", + "200.189.173.48/28", + "200.98.28.70/32", + "187.85.159.176/29", + "170.84.29.208/29", + "34.95.168.58/32", + "140.82.27.226/32", + "45.77.97.241/32", + "207.246.123.237/32", + "207.148.26.195/32", + "186.211.161.0/29", + "34.95.213.225/32", + "34.95.209.169/32", + "35.247.222.78/32", + "34.95.253.129/32", + "34.95.148.131/32", + "34.95.164.249/32", + "129.159.48.87/32", + "200.25.56.64/28", + "186.211.188.192/28", + "200.25.49.64/26", + "150.230.84.126/32", + "144.22.216.139/32", + "170.82.172.0/22", + ] + + def fetch_cidrs(self): + response = self.request(self._ips_url) + ranges = set() + if getattr(response, "status_code", 0) == 200: + ranges.update(response.text.splitlines()) + return list(ranges) diff --git a/cloudcheck/providers/hostway.py b/cloudcheck/providers/hostway.py new file mode 100644 index 0000000..d790f60 --- /dev/null +++ b/cloudcheck/providers/hostway.py @@ -0,0 +1,13 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Hostway(BaseProvider): + tags: List[str] = ["cloud"] + short_description: str = "Hostway (호스트웨이)" + long_description: str = "A Korean cloud hosting and infrastructure provider." + # {"org_id": "@aut-9952-APNIC", "org_name": null, "country": null, "asns": [9952]} + # {"asn":9952,"asn_name":"HOSTWAY-AS-KR","org_id":"@aut-9952-APNIC"} + org_ids: List[str] = [ + "@aut-9952-APNIC", + ] diff --git a/cloudcheck/providers/kinx.py b/cloudcheck/providers/kinx.py new file mode 100644 index 0000000..dacae42 --- /dev/null +++ b/cloudcheck/providers/kinx.py @@ -0,0 +1,14 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Kinx(BaseProvider): + tags: List[str] = ["cdn"] + short_description: str = "KINX (한국인터넷인프라)" + long_description: str = ( + "A Korean content delivery network and cloud infrastructure provider." + ) + # {"org_id": "@aut-9286-APNIC", "org_name": null, "country": null, "asns": [9286,9957,17604]} + org_ids: List[str] = [ + "@aut-9286-APNIC", + ] diff --git a/cloudcheck/providers/ktcloud.py b/cloudcheck/providers/ktcloud.py new file mode 100644 index 0000000..3f64074 --- /dev/null +++ b/cloudcheck/providers/ktcloud.py @@ -0,0 +1,14 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Ktcloud(BaseProvider): + tags: List[str] = ["cloud"] + short_description: str = "KT Cloud (KT클라우드)" + long_description: str = ( + "A Korean cloud computing service provided by KT Corporation." + ) + # {"asn":9947,"asn_name":"KTC-AS-KR","country":null,"org":null,"org_id":"@aut-152232-APNIC","rir":null,"subnets":["61.100.71.0/24","61.100.72.0/24"]} + org_ids: List[str] = [ + "@aut-152232-APNIC", + ] diff --git a/cloudcheck/providers/lgtelecom.py b/cloudcheck/providers/lgtelecom.py new file mode 100644 index 0000000..393ce6e --- /dev/null +++ b/cloudcheck/providers/lgtelecom.py @@ -0,0 +1,13 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Lgtelecom(BaseProvider): + tags: List[str] = ["cdn"] + short_description: str = "LG U+ (LG유플러스)" + long_description: str = "A Korean telecommunications company offering CDN services." + # {"org_id": "@aut-17853-APNIC", "org_name": null, "country": null, "asns": [17853]} + # {"asn":17853,"asn_name":"LGTELECOM-AS-KR","org_id":"@aut-17853-APNIC"} + org_ids: List[str] = [ + "@aut-17853-APNIC", + ] diff --git a/cloudcheck/providers/microsoft365.py b/cloudcheck/providers/microsoft365.py new file mode 100644 index 0000000..f33248a --- /dev/null +++ b/cloudcheck/providers/microsoft365.py @@ -0,0 +1,33 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Microsoft365(BaseProvider): + tags: List[str] = ["cloud"] + short_description: str = "Microsoft 365" + long_description: str = "A cloud-based productivity suite provided by Microsoft, including Office applications and cloud services." + + _ips_url = "https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7" + + def fetch_cidrs(self): + response = self.request(self._ips_url) + ranges = set() + if getattr(response, "status_code", 0) == 200: + response_json = response.json() + if isinstance(response_json, list): + for item in response_json: + if isinstance(item, dict): + ranges.update(item.get("ips", [])) + return list(ranges) + + def fetch_domains(self): + response = self.request(self._ips_url) + domains = set() + if getattr(response, "status_code", 0) == 200: + response_json = response.json() + if isinstance(response_json, list): + for item in response_json: + if isinstance(item, dict): + for domain in item.get("domains", []): + domains.add(domain.strip("*.")) + return list(domains) diff --git a/cloudcheck/providers/navercloud.py b/cloudcheck/providers/navercloud.py new file mode 100644 index 0000000..9a17c83 --- /dev/null +++ b/cloudcheck/providers/navercloud.py @@ -0,0 +1,15 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Navercloud(BaseProvider): + tags: List[str] = ["cloud"] + short_description: str = "Naver Cloud Platform (네이버 클라우드 플랫폼)" + long_description: str = ( + "A Korean cloud computing platform provided by Naver Corporation." + ) + # "org_id": "@aut-23576-APNIC", "org_name": null, "country": null, "asns": [23576,23982]} + # {"asn":23576,"asn_name":"nhn-AS-KR","org_id":"@aut-23576-APNIC"} + org_ids: List[str] = [ + "@aut-23576-APNIC", + ] diff --git a/cloudcheck/providers/nhncloud.py b/cloudcheck/providers/nhncloud.py new file mode 100644 index 0000000..c19aab0 --- /dev/null +++ b/cloudcheck/providers/nhncloud.py @@ -0,0 +1,15 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Nhncloud(BaseProvider): + tags: List[str] = ["cloud"] + short_description: str = "NHN Cloud (NHN클라우드)" + long_description: str = ( + "A Korean cloud computing platform provided by NHN Corporation." + ) + # {"org_id": "@aut-10038-APNIC", "org_name": null, "country": null, "asns": [10038,45974,152291]} + # {"asn":45974,"asn_name":"NHN-AS-KR","org_id":"@aut-10038-APNIC"} + org_ids: List[str] = [ + "@aut-10038-APNIC", + ] diff --git a/cloudcheck/providers/skbroadband.py b/cloudcheck/providers/skbroadband.py new file mode 100644 index 0000000..9a379ea --- /dev/null +++ b/cloudcheck/providers/skbroadband.py @@ -0,0 +1,13 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Skbroadband(BaseProvider): + tags: List[str] = ["cdn"] + short_description: str = "SK Broadband (SK브로드밴드)" + long_description: str = "A Korean telecommunications company offering CDN services." + # {"org_id": "@aut-10049-APNIC", "org_name": null, "country": null, "asns": [9705,10049]} + # {"asn":10049,"asn_name":"SKNET-AS","country":null,"ip":"203.242.64.0","org":null,"org_id":"@aut-10049-APNIC"} + org_ids: List[str] = [ + "@aut-10049-APNIC", + ] diff --git a/cloudcheck/providers/tencent.py b/cloudcheck/providers/tencent.py index ed72ce6..05eb405 100644 --- a/cloudcheck/providers/tencent.py +++ b/cloudcheck/providers/tencent.py @@ -5,7 +5,7 @@ class Tencent(BaseProvider): v2fly_company: str = "tencent" tags: List[str] = ["cloud"] - short_description: str = "Tencent Cloud" + short_description: str = "Tencent Cloud (腾讯云)" long_description: str = "A Chinese cloud computing service provider and subsidiary of Tencent, offering cloud infrastructure and platform services." # {"org_id": "ORG-STCS1-AP-APNIC", "org_name": "Shenzhen Tencent Computer Systems Company Limited", "country": "CN", "asns": [132203,132591]} # {"org_id": "ORG-TCCC1-AP-APNIC", "org_name": "Tencent Cloud Computing (Beijing) Co., Ltd", "country": "CN", "asns": [133478]} diff --git a/cloudcheck/providers/zscaler.py b/cloudcheck/providers/zscaler.py new file mode 100644 index 0000000..2714c0a --- /dev/null +++ b/cloudcheck/providers/zscaler.py @@ -0,0 +1,25 @@ +from cloudcheck.providers.base import BaseProvider +from typing import List + + +class Zscaler(BaseProvider): + tags: List[str] = ["cloud"] + short_description: str = "Zscaler" + long_description: str = "A cloud security company providing secure internet access, cloud security, and zero trust network access services." + + _ips_url = "https://api.config.zscaler.com/zscaler.net/cenr/json" + + def fetch_cidrs(self): + response = self.request(self._ips_url) + ranges = set() + if getattr(response, "status_code", 0) == 200: + response_json = response.json() + if isinstance(response_json, dict): + for domain, data in response_json.items(): + for continent, cities in data.items(): + for city, ranges_list in cities.items(): + for range_data in ranges_list: + range_str = range_data.get("range") + if range_str: + ranges.add(range_str) + return list(ranges) From 0b55986e95641426e6fdce801110fdfc9c4ffea2 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 6 Jan 2026 22:10:22 -0500 Subject: [PATCH 02/12] bump version --- Cargo.toml | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8d188b2..e9e861e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cloudcheck" -version = "8.6.1" +version = "8.6.2" edition = "2024" description = "CloudCheck is a simple Rust tool to check whether an IP address or hostname belongs to a cloud provider." license = "GPL-3.0" diff --git a/pyproject.toml b/pyproject.toml index 683c17e..29dedcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "cloudcheck" -version = "8.6.1" +version = "8.6.2" description = "Detailed database of cloud providers. Instantly look up a domain or IP address" readme = "README.md" requires-python = ">=3.9" From 956b6e21936166ec40d07c2b44b55e1685dd1532 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 6 Jan 2026 22:28:35 -0500 Subject: [PATCH 03/12] domains --- Cargo.lock | 2 +- cloud_providers_v2.json | 192 ++++++++++++++++++++++++++- cloudcheck/providers/base.py | 34 ++++- cloudcheck/providers/microsoft365.py | 2 +- cloudcheck/providers/skbroadband.py | 2 +- uv.lock | 2 +- 6 files changed, 226 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf5b6ed..9e9e806 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,7 +115,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cloudcheck" -version = "8.6.1" +version = "8.6.2" dependencies = [ "env_logger", "log", diff --git a/cloud_providers_v2.json b/cloud_providers_v2.json index fb41b6c..1295522 100644 --- a/cloud_providers_v2.json +++ b/cloud_providers_v2.json @@ -53513,7 +53513,197 @@ "52.244.37.168/32", "52.96.0.0/12" ], - "domains": [], + "domains": [ + "aadrm.com", + "account.activedirectory.windowsazure.com", + "account.live.com", + "accounts.accesscontrol.windows.net", + "acompli.net", + "activation.sls.microsoft.com", + "activity.windows.com", + "adl.windows.com", + "admin.microsoft.com", + "admin.onedrive.com", + "adminwebservice.microsoftonline.com", + "ajax.aspnetcdn.com", + "aka.ms", + "amp.azure.net", + "api.passwordreset.microsoftonline.com", + "apis.live.net", + "appex-rf.msn.com", + "appex.bing.com", + "appsforoffice.microsoft.com", + "aria.microsoft.com", + "assets-yammer.com", + "assets.onestore.ms", + "auth.gfx.ms", + "auth.microsoft.com", + "autodiscover.*.onmicrosoft.com", + "autologon.microsoftazuread-sso.com", + "azure-apim.net", + "azurerms.com", + "becws.microsoftonline.com", + "c.bing.com", + "c.bing.net", + "c.live.com", + "c1.microsoft.com", + "cacerts.digicert.com", + "ccs.login.microsoftonline.com", + "cdn.odc.officeapps.live.com", + "cdn.onenote.net", + "cdn.uci.officeapps.live.com", + "cert.int-x3.letsencrypt.org", + "clientconfig.microsoftonline-p.net", + "cloud.microsoft", + "companymanager.microsoftonline.com", + "compliance.microsoft.com", + "cortana.ai", + "crl.globalsign.com", + "crl.globalsign.net", + "crl.identrust.com", + "crl.microsoft.com", + "crl3.digicert.com", + "crl4.digicert.com", + "dc.services.visualstudio.com", + "defender.microsoft.com", + "device.login.microsoftonline.com", + "dgps.support.microsoft.com", + "docs.microsoft.com", + "ecn.dev.virtualearth.net", + "enterpriseregistration.windows.net", + "entrust.net", + "eus-www.sway-cdn.com", + "eus-www.sway-extensions.com", + "events.data.microsoft.com", + "flow.microsoft.com", + "g.live.com", + "geotrust.com", + "go.microsoft.com", + "graph.microsoft.com", + "graph.windows.net", + "hip.live.com", + "informationprotection.azure.com", + "informationprotection.hosting.portal.azure.net", + "isrg.trustid.ocsp.identrust.com", + "join.secure.skypeassets.com", + "keydelivery.mediaservices.windows.net", + "login-us.microsoftonline.com", + "login.live.com", + "login.microsoft.com", + "login.microsoftonline-p.com", + "login.microsoftonline.com", + "login.windows-ppe.net", + "login.windows.net", + "logincert.microsoftonline.com", + "loginex.microsoftonline.com", + "lync.com", + "mail.protection.outlook.com", + "mem.gfx.ms", + "microsoft.com", + "microsoftonline-p.com", + "microsoftonline.com", + "microsoftusercontent.com", + "mlccdnprod.azureedge.net", + "msauth.net", + "msauthimages.net", + "mscrl.microsoft.com", + "msdn.microsoft.com", + "msecnd.net", + "msftauth.net", + "msftauthimages.net", + "msftidentity.com", + "msidentity.com", + "msocdn.com", + "mx.microsoft", + "nexus.microsoftonline-p.com", + "o15.officeredir.microsoft.com", + "o365weve.com", + "ocos-office365-s2s.msedge.net", + "ocsp.digicert.com", + "ocsp.globalsign.com", + "ocsp.msocsp.com", + "ocsp2.globalsign.com", + "ocspx.digicert.com", + "office.com", + "office.live.com", + "office.net", + "office15client.microsoft.com", + "office365.com", + "officeapps.live.com", + "officecdn.microsoft.com", + "officecdn.microsoft.com.edgesuite.net", + "officeclient.microsoft.com", + "officepreviewredir.microsoft.com", + "officeredir.microsoft.com", + "officespeech.platform.bing.com", + "omniroot.com", + "oneclient.sfx.ms", + "onenote.com", + "oneocsp.microsoft.com", + "online.office.com", + "onmicrosoft.com", + "otelrules.azureedge.net", + "outlook.cloud.microsoft", + "outlook.com", + "outlook.office.com", + "outlook.office365.com", + "outlookmobile.com", + "partnerservices.getmicrosoftkey.com", + "passwordreset.microsoftonline.com", + "phonefactor.net", + "platform.linkedin.com", + "portal.cloudappsecurity.com", + "powerapps.com", + "powerautomate.com", + "prod.msocdn.com", + "protection.office.com", + "protection.outlook.com", + "provisioningapi.microsoftonline.com", + "public-trust.com", + "purview.microsoft.com", + "r.office.microsoft.com", + "search.production.apac.trafficmanager.net", + "search.production.emea.trafficmanager.net", + "search.production.us.trafficmanager.net", + "secure.globalsign.com", + "security.microsoft.com", + "sharepoint.com", + "sharepointonline.com", + "shellprod.msocdn.com", + "signup.live.com", + "skype.com", + "smtp.office365.com", + "spoprod-a.akamaihd.net", + "static.microsoft", + "storage.live.com", + "streaming.mediaservices.windows.net", + "support.microsoft.com", + "svc.ms", + "sway.com", + "symcb.com", + "symcd.com", + "teams.cloud.microsoft", + "teams.microsoft.com", + "technet.microsoft.com", + "tse1.mm.bing.net", + "usercontent.microsoft", + "verisign.com", + "verisign.net", + "virtualearth.net", + "wns.windows.com", + "wus-www.sway-cdn.com", + "wus-www.sway-extensions.com", + "www.acompli.com", + "www.bing.com", + "www.digicert.com", + "www.microsoft.com", + "www.microsoft365.com", + "www.onedrive.com", + "www.outlook.com", + "www.sway.com", + "yammer.com", + "yammerusercontent.com" + ], "last_updated": 1767754932.2223408, "long_description": "A cloud-based productivity suite provided by Microsoft, including Office applications and cloud services.", "name": "Microsoft365", diff --git a/cloudcheck/providers/base.py b/cloudcheck/providers/base.py index e5eef28..aac9c62 100644 --- a/cloudcheck/providers/base.py +++ b/cloudcheck/providers/base.py @@ -79,14 +79,42 @@ def update(self): def update_domains(self): # update dynamic domains errors = [] + domains = set() + + # fetch any dynamically-updated lists of domains + try: + dynamic_domains = self.fetch_domains() + print(f"Got {len(dynamic_domains)} dynamic domains for {self.name}") + domains.update(dynamic_domains) + except Exception as e: + errors.append( + f"Failed to fetch dynamic domains for {self.name}: {e}:\n{traceback.format_exc()}" + ) + if self.v2fly_company: - domains, errors = self.fetch_v2fly_domains() - if domains: - self.domains = sorted(list(set(self.domains + domains))) + _domains, _errors = self.fetch_v2fly_domains() + if _domains: + domains.update(_domains) else: errors.append( f"No v2fly domains were found for {self.name} (company name: {self.v2fly_company})" ) + errors.extend(_errors) + + # finally, put in any manually-specified domains + print(f"Adding {len(self.domains)} manually-specified domains for {self.name}") + if self.domains: + domains.update(self.domains) + + print(f"Total {len(domains)} domains for {self.name}") + + try: + self.domains = self.validate_domains(domains) + except Exception as e: + errors.append( + f"Error validating domains for {self.name}: {e}:\n{traceback.format_exc()}" + ) + return errors def update_cidrs(self): diff --git a/cloudcheck/providers/microsoft365.py b/cloudcheck/providers/microsoft365.py index f33248a..86cfa38 100644 --- a/cloudcheck/providers/microsoft365.py +++ b/cloudcheck/providers/microsoft365.py @@ -28,6 +28,6 @@ def fetch_domains(self): if isinstance(response_json, list): for item in response_json: if isinstance(item, dict): - for domain in item.get("domains", []): + for domain in item.get("urls", []): domains.add(domain.strip("*.")) return list(domains) diff --git a/cloudcheck/providers/skbroadband.py b/cloudcheck/providers/skbroadband.py index 9a379ea..676f1df 100644 --- a/cloudcheck/providers/skbroadband.py +++ b/cloudcheck/providers/skbroadband.py @@ -7,7 +7,7 @@ class Skbroadband(BaseProvider): short_description: str = "SK Broadband (SK브로드밴드)" long_description: str = "A Korean telecommunications company offering CDN services." # {"org_id": "@aut-10049-APNIC", "org_name": null, "country": null, "asns": [9705,10049]} - # {"asn":10049,"asn_name":"SKNET-AS","country":null,"ip":"203.242.64.0","org":null,"org_id":"@aut-10049-APNIC"} + # {"asn":10049,"asn_name":"SKNET-AS","country":null,"org":null,"org_id":"@aut-10049-APNIC"} org_ids: List[str] = [ "@aut-10049-APNIC", ] diff --git a/uv.lock b/uv.lock index fc5c610..42fdbea 100644 --- a/uv.lock +++ b/uv.lock @@ -140,7 +140,7 @@ wheels = [ [[package]] name = "cloudcheck" -version = "8.6.1" +version = "8.6.2" source = { editable = "." } [package.dev-dependencies] From 4e83cb696276d47318bfa347363206d898ad1832 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Dec 2025 00:09:11 +0000 Subject: [PATCH 04/12] Bump ruff from 0.14.9 to 0.14.10 Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.9 to 0.14.10. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.14.9...0.14.10) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.14.10 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- uv.lock | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/uv.lock b/uv.lock index 42fdbea..de3caf0 100644 --- a/uv.lock +++ b/uv.lock @@ -471,28 +471,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.9" +version = "0.14.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/1b/ab712a9d5044435be8e9a2beb17cbfa4c241aa9b5e4413febac2a8b79ef2/ruff-0.14.9.tar.gz", hash = "sha256:35f85b25dd586381c0cc053f48826109384c81c00ad7ef1bd977bfcc28119d5b", size = 5809165, upload-time = "2025-12-11T21:39:47.381Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/08/52232a877978dd8f9cf2aeddce3e611b40a63287dfca29b6b8da791f5e8d/ruff-0.14.10.tar.gz", hash = "sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4", size = 5859763, upload-time = "2025-12-18T19:28:57.98Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/1c/d1b1bba22cffec02351c78ab9ed4f7d7391876e12720298448b29b7229c1/ruff-0.14.9-py3-none-linux_armv6l.whl", hash = "sha256:f1ec5de1ce150ca6e43691f4a9ef5c04574ad9ca35c8b3b0e18877314aba7e75", size = 13576541, upload-time = "2025-12-11T21:39:14.806Z" }, - { url = "https://files.pythonhosted.org/packages/94/ab/ffe580e6ea1fca67f6337b0af59fc7e683344a43642d2d55d251ff83ceae/ruff-0.14.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ed9d7417a299fc6030b4f26333bf1117ed82a61ea91238558c0268c14e00d0c2", size = 13779363, upload-time = "2025-12-11T21:39:20.29Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f8/2be49047f929d6965401855461e697ab185e1a6a683d914c5c19c7962d9e/ruff-0.14.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d5dc3473c3f0e4a1008d0ef1d75cee24a48e254c8bed3a7afdd2b4392657ed2c", size = 12925292, upload-time = "2025-12-11T21:39:38.757Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e9/08840ff5127916bb989c86f18924fd568938b06f58b60e206176f327c0fe/ruff-0.14.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84bf7c698fc8f3cb8278830fb6b5a47f9bcc1ed8cb4f689b9dd02698fa840697", size = 13362894, upload-time = "2025-12-11T21:39:02.524Z" }, - { url = "https://files.pythonhosted.org/packages/31/1c/5b4e8e7750613ef43390bb58658eaf1d862c0cc3352d139cd718a2cea164/ruff-0.14.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa733093d1f9d88a5d98988d8834ef5d6f9828d03743bf5e338bf980a19fce27", size = 13311482, upload-time = "2025-12-11T21:39:17.51Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3a/459dce7a8cb35ba1ea3e9c88f19077667a7977234f3b5ab197fad240b404/ruff-0.14.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a1cfb04eda979b20c8c19550c8b5f498df64ff8da151283311ce3199e8b3648", size = 14016100, upload-time = "2025-12-11T21:39:41.948Z" }, - { url = "https://files.pythonhosted.org/packages/a6/31/f064f4ec32524f9956a0890fc6a944e5cf06c63c554e39957d208c0ffc45/ruff-0.14.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1e5cb521e5ccf0008bd74d5595a4580313844a42b9103b7388eca5a12c970743", size = 15477729, upload-time = "2025-12-11T21:39:23.279Z" }, - { url = "https://files.pythonhosted.org/packages/7a/6d/f364252aad36ccd443494bc5f02e41bf677f964b58902a17c0b16c53d890/ruff-0.14.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd429a8926be6bba4befa8cdcf3f4dd2591c413ea5066b1e99155ed245ae42bb", size = 15122386, upload-time = "2025-12-11T21:39:33.125Z" }, - { url = "https://files.pythonhosted.org/packages/20/02/e848787912d16209aba2799a4d5a1775660b6a3d0ab3944a4ccc13e64a02/ruff-0.14.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab208c1b7a492e37caeaf290b1378148f75e13c2225af5d44628b95fd7834273", size = 14497124, upload-time = "2025-12-11T21:38:59.33Z" }, - { url = "https://files.pythonhosted.org/packages/f3/51/0489a6a5595b7760b5dbac0dd82852b510326e7d88d51dbffcd2e07e3ff3/ruff-0.14.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72034534e5b11e8a593f517b2f2f2b273eb68a30978c6a2d40473ad0aaa4cb4a", size = 14195343, upload-time = "2025-12-11T21:39:44.866Z" }, - { url = "https://files.pythonhosted.org/packages/f6/53/3bb8d2fa73e4c2f80acc65213ee0830fa0c49c6479313f7a68a00f39e208/ruff-0.14.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:712ff04f44663f1b90a1195f51525836e3413c8a773574a7b7775554269c30ed", size = 14346425, upload-time = "2025-12-11T21:39:05.927Z" }, - { url = "https://files.pythonhosted.org/packages/ad/04/bdb1d0ab876372da3e983896481760867fc84f969c5c09d428e8f01b557f/ruff-0.14.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a111fee1db6f1d5d5810245295527cda1d367c5aa8f42e0fca9a78ede9b4498b", size = 13258768, upload-time = "2025-12-11T21:39:08.691Z" }, - { url = "https://files.pythonhosted.org/packages/40/d9/8bf8e1e41a311afd2abc8ad12be1b6c6c8b925506d9069b67bb5e9a04af3/ruff-0.14.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8769efc71558fecc25eb295ddec7d1030d41a51e9dcf127cbd63ec517f22d567", size = 13326939, upload-time = "2025-12-11T21:39:53.842Z" }, - { url = "https://files.pythonhosted.org/packages/f4/56/a213fa9edb6dd849f1cfbc236206ead10913693c72a67fb7ddc1833bf95d/ruff-0.14.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:347e3bf16197e8a2de17940cd75fd6491e25c0aa7edf7d61aa03f146a1aa885a", size = 13578888, upload-time = "2025-12-11T21:39:35.988Z" }, - { url = "https://files.pythonhosted.org/packages/33/09/6a4a67ffa4abae6bf44c972a4521337ffce9cbc7808faadede754ef7a79c/ruff-0.14.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7715d14e5bccf5b660f54516558aa94781d3eb0838f8e706fb60e3ff6eff03a8", size = 14314473, upload-time = "2025-12-11T21:39:50.78Z" }, - { url = "https://files.pythonhosted.org/packages/12/0d/15cc82da5d83f27a3c6b04f3a232d61bc8c50d38a6cd8da79228e5f8b8d6/ruff-0.14.9-py3-none-win32.whl", hash = "sha256:df0937f30aaabe83da172adaf8937003ff28172f59ca9f17883b4213783df197", size = 13202651, upload-time = "2025-12-11T21:39:26.628Z" }, - { url = "https://files.pythonhosted.org/packages/32/f7/c78b060388eefe0304d9d42e68fab8cffd049128ec466456cef9b8d4f06f/ruff-0.14.9-py3-none-win_amd64.whl", hash = "sha256:c0b53a10e61df15a42ed711ec0bda0c582039cf6c754c49c020084c55b5b0bc2", size = 14702079, upload-time = "2025-12-11T21:39:11.954Z" }, - { url = "https://files.pythonhosted.org/packages/26/09/7a9520315decd2334afa65ed258fed438f070e31f05a2e43dd480a5e5911/ruff-0.14.9-py3-none-win_arm64.whl", hash = "sha256:8e821c366517a074046d92f0e9213ed1c13dbc5b37a7fc20b07f79b64d62cc84", size = 13744730, upload-time = "2025-12-11T21:39:29.659Z" }, + { url = "https://files.pythonhosted.org/packages/60/01/933704d69f3f05ee16ef11406b78881733c186fe14b6a46b05cfcaf6d3b2/ruff-0.14.10-py3-none-linux_armv6l.whl", hash = "sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49", size = 13527080, upload-time = "2025-12-18T19:29:25.642Z" }, + { url = "https://files.pythonhosted.org/packages/df/58/a0349197a7dfa603ffb7f5b0470391efa79ddc327c1e29c4851e85b09cc5/ruff-0.14.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f", size = 13797320, upload-time = "2025-12-18T19:29:02.571Z" }, + { url = "https://files.pythonhosted.org/packages/7b/82/36be59f00a6082e38c23536df4e71cdbc6af8d7c707eade97fcad5c98235/ruff-0.14.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d", size = 12918434, upload-time = "2025-12-18T19:28:51.202Z" }, + { url = "https://files.pythonhosted.org/packages/a6/00/45c62a7f7e34da92a25804f813ebe05c88aa9e0c25e5cb5a7d23dd7450e3/ruff-0.14.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77", size = 13371961, upload-time = "2025-12-18T19:29:04.991Z" }, + { url = "https://files.pythonhosted.org/packages/40/31/a5906d60f0405f7e57045a70f2d57084a93ca7425f22e1d66904769d1628/ruff-0.14.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a", size = 13275629, upload-time = "2025-12-18T19:29:21.381Z" }, + { url = "https://files.pythonhosted.org/packages/3e/60/61c0087df21894cf9d928dc04bcd4fb10e8b2e8dca7b1a276ba2155b2002/ruff-0.14.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f", size = 14029234, upload-time = "2025-12-18T19:29:00.132Z" }, + { url = "https://files.pythonhosted.org/packages/44/84/77d911bee3b92348b6e5dab5a0c898d87084ea03ac5dc708f46d88407def/ruff-0.14.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935", size = 15449890, upload-time = "2025-12-18T19:28:53.573Z" }, + { url = "https://files.pythonhosted.org/packages/e9/36/480206eaefa24a7ec321582dda580443a8f0671fdbf6b1c80e9c3e93a16a/ruff-0.14.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e", size = 15123172, upload-time = "2025-12-18T19:29:23.453Z" }, + { url = "https://files.pythonhosted.org/packages/5c/38/68e414156015ba80cef5473d57919d27dfb62ec804b96180bafdeaf0e090/ruff-0.14.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d", size = 14460260, upload-time = "2025-12-18T19:29:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/b3/19/9e050c0dca8aba824d67cc0db69fb459c28d8cd3f6855b1405b3f29cc91d/ruff-0.14.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f", size = 14229978, upload-time = "2025-12-18T19:29:11.32Z" }, + { url = "https://files.pythonhosted.org/packages/51/eb/e8dd1dd6e05b9e695aa9dd420f4577debdd0f87a5ff2fedda33c09e9be8c/ruff-0.14.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f", size = 14338036, upload-time = "2025-12-18T19:29:09.184Z" }, + { url = "https://files.pythonhosted.org/packages/6a/12/f3e3a505db7c19303b70af370d137795fcfec136d670d5de5391e295c134/ruff-0.14.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d", size = 13264051, upload-time = "2025-12-18T19:29:13.431Z" }, + { url = "https://files.pythonhosted.org/packages/08/64/8c3a47eaccfef8ac20e0484e68e0772013eb85802f8a9f7603ca751eb166/ruff-0.14.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405", size = 13283998, upload-time = "2025-12-18T19:29:06.994Z" }, + { url = "https://files.pythonhosted.org/packages/12/84/534a5506f4074e5cc0529e5cd96cfc01bb480e460c7edf5af70d2bcae55e/ruff-0.14.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60", size = 13601891, upload-time = "2025-12-18T19:28:55.811Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1e/14c916087d8598917dbad9b2921d340f7884824ad6e9c55de948a93b106d/ruff-0.14.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830", size = 14336660, upload-time = "2025-12-18T19:29:16.531Z" }, + { url = "https://files.pythonhosted.org/packages/f2/1c/d7b67ab43f30013b47c12b42d1acd354c195351a3f7a1d67f59e54227ede/ruff-0.14.10-py3-none-win32.whl", hash = "sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6", size = 13196187, upload-time = "2025-12-18T19:29:19.006Z" }, + { url = "https://files.pythonhosted.org/packages/fb/9c/896c862e13886fae2af961bef3e6312db9ebc6adc2b156fe95e615dee8c1/ruff-0.14.10-py3-none-win_amd64.whl", hash = "sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154", size = 14661283, upload-time = "2025-12-18T19:29:30.16Z" }, + { url = "https://files.pythonhosted.org/packages/74/31/b0e29d572670dca3674eeee78e418f20bdf97fa8aa9ea71380885e175ca0/ruff-0.14.10-py3-none-win_arm64.whl", hash = "sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6", size = 13729839, upload-time = "2025-12-18T19:28:48.636Z" }, ] [[package]] From acb7f9feef31ae6f20dbaf6fd7c9c829208088e0 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 16:16:45 -0500 Subject: [PATCH 05/12] rest api, docker publishing --- .github/workflows/docker-tests.yml | 125 ++++++++ Cargo.lock | 499 +++++++++++++++++++++++++++++ Cargo.toml | 6 + Dockerfile | 36 +++ README.md | 102 +++++- src/api.rs | 134 ++++++++ src/lib.rs | 142 ++++++-- src/main.rs | 94 +++++- test_docker.py | 143 +++++++++ 9 files changed, 1225 insertions(+), 56 deletions(-) create mode 100644 .github/workflows/docker-tests.yml create mode 100644 Dockerfile create mode 100644 src/api.rs create mode 100644 test_docker.py diff --git a/.github/workflows/docker-tests.yml b/.github/workflows/docker-tests.yml new file mode 100644 index 0000000..105c8ba --- /dev/null +++ b/.github/workflows/docker-tests.yml @@ -0,0 +1,125 @@ +name: Docker Tests + +on: + push: + branches: [ stable ] + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + + - name: Cache cargo registry + target dir + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run clippy + run: cargo clippy --all-targets --all-features --locked -- -D warnings + + - name: Run tests + run: cargo test --all --locked --verbose + + docker-test: + runs-on: ubuntu-latest + needs: test + + steps: + - uses: actions/checkout@v6 + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.11" + + - name: Install dependencies + run: | + pip install requests + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Run Docker tests + run: | + python test_docker.py + + docker-publish: + runs-on: ubuntu-latest + needs: docker-test + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/stable' }} + + steps: + - name: Checkout code + uses: actions/checkout@v5 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: blacklanternsecurity + password: ${{ secrets.DOCKER_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: blacklanternsecurity/cloudcheck + tags: | + type=ref,event=branch + type=ref,event=pr + type=sha,prefix=sha- + type=raw,value=latest,enable={{is_default_branch}} + type=raw,value=v1 + type=raw,value=v1.0 + type=raw,value=v1.0.0 + + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Clean up old Docker Hub tags (up to 50 most recent tags plus 'latest') + run: | + # Install jq for JSON processing + sudo apt-get update && sudo apt-get install -y jq + + echo "Cleaning up blacklanternsecurity/cloudcheck tags..." + + tags_response=$(curl -s -H "Authorization: Bearer ${{ secrets.DOCKER_TOKEN }}" \ + "https://hub.docker.com/v2/repositories/blacklanternsecurity/cloudcheck/tags/?page_size=100") + + tags_to_delete=$(echo "$tags_response" | jq -r '.results[] | select(.name != "latest") | [.last_updated, .name] | @tsv' | \ + sort -r | tail -n +11 | cut -f2) + + for tag in $tags_to_delete; do + echo "Deleting blacklanternsecurity/cloudcheck tag: $tag" + curl -X DELETE -H "Authorization: Bearer ${{ secrets.DOCKER_TOKEN }}" \ + "https://hub.docker.com/v2/repositories/blacklanternsecurity/cloudcheck/tags/$tag/" + done + + echo "Cleanup completed for blacklanternsecurity/cloudcheck. Kept 50 most recent tags plus 'latest'." diff --git a/Cargo.lock b/Cargo.lock index 9e9e806..2c322f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "aho-corasick" version = "1.1.4" @@ -61,6 +67,30 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "assert_cmd" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcbb6924530aa9e0432442af08bbcafdad182db80d2e560da42a6d442535bf85" +dependencies = [ + "anstyle", + "bstr", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -73,6 +103,58 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "base64" version = "0.22.1" @@ -85,6 +167,26 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.19.1" @@ -113,10 +215,53 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "clap" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + [[package]] name = "cloudcheck" version = "8.6.2" dependencies = [ + "assert_cmd", + "axum", + "clap", "env_logger", "log", "openssl", @@ -127,6 +272,8 @@ dependencies = [ "serde", "serde_json", "tokio", + "utoipa", + "utoipa-swagger-ui", ] [[package]] @@ -151,6 +298,61 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -222,6 +424,17 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "libz-rs-sys", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -341,6 +554,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -434,6 +657,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.8.1" @@ -448,6 +677,7 @@ dependencies = [ "http", "http-body", "httparse", + "httpdate", "itoa", "pin-project-lite", "pin-utils", @@ -624,6 +854,8 @@ checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", "hashbrown", + "serde", + "serde_core", ] [[package]] @@ -703,6 +935,15 @@ version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +[[package]] +name = "libz-rs-sys" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10501e7805cee23da17c7790e59df2870c0d4043ec6d03f67d31e2b53e77415" +dependencies = [ + "zlib-rs", +] + [[package]] name = "linux-raw-sys" version = "0.11.0" @@ -730,6 +971,12 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.7.6" @@ -751,6 +998,26 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "mio" version = "1.1.1" @@ -916,6 +1183,33 @@ dependencies = [ "zerovec", ] +[[package]] +name = "predicates" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +dependencies = [ + "anstyle", + "difflib", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "proc-macro2" version = "1.0.103" @@ -1117,6 +1411,40 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rust-embed" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustix" version = "1.1.2" @@ -1175,6 +1503,15 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62049b2877bf12821e8f9ad256ee38fdc31db7387ec2d3b3f403024de2034aea" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.28" @@ -1262,6 +1599,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1274,6 +1622,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1289,6 +1648,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + [[package]] name = "slab" version = "0.4.11" @@ -1317,6 +1682,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" @@ -1394,6 +1765,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + [[package]] name = "tinystr" version = "0.8.2" @@ -1478,6 +1855,7 @@ dependencies = [ "tokio", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -1516,6 +1894,7 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", "tracing-core", ] @@ -1535,6 +1914,18 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + [[package]] name = "unicode-ident" version = "1.0.22" @@ -1577,12 +1968,79 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "utoipa" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" +dependencies = [ + "indexmap", + "serde", + "serde_json", + "utoipa-gen", +] + +[[package]] +name = "utoipa-gen" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "utoipa-swagger-ui" +version = "9.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" +dependencies = [ + "axum", + "base64", + "mime_guess", + "regex", + "rust-embed", + "serde", + "serde_json", + "url", + "utoipa", + "zip", +] + [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1675,6 +2133,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "windows-link" version = "0.2.1" @@ -1960,3 +2427,35 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zip" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" +dependencies = [ + "arbitrary", + "crc32fast", + "flate2", + "indexmap", + "memchr", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/Cargo.toml b/Cargo.toml index e9e861e..99797c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,11 +16,17 @@ pyo3-async-runtimes = { version = "0.27", features = ["tokio-runtime"], optional radixtarget = "4.2" log = "0.4" env_logger = "0.11" +clap = { version = "4.5", features = ["derive"] } +axum = "0.8" +utoipa = { version = "5.4", features = ["axum_extras", "chrono"] } +utoipa-swagger-ui = { version = "9.0", features = ["axum"] } [features] default = [] py = ["dep:pyo3", "dep:pyo3-async-runtimes"] +[dev-dependencies] +assert_cmd = "2.1" [[bin]] name = "cloudcheck" path = "src/main.rs" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1463df7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +FROM rust:1.92 AS builder + +WORKDIR /app + +# Copy dependency files +COPY Cargo.toml Cargo.lock ./ +COPY src ./src + +# Build the binary +RUN cargo build --release --bin cloudcheck + +FROM debian:trixie-slim + +# Install CA certificates for SSL verification +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* + +# Create non-root user with uid/gid 1000 +RUN groupadd -r -g 1000 cloudcheck && useradd -r -u 1000 -g cloudcheck cloudcheck + +WORKDIR /app + +# Copy the binary from builder +COPY --from=builder /app/target/release/cloudcheck /usr/local/bin/cloudcheck + +# Create cache directory with proper permissions +RUN mkdir -p /home/cloudcheck/.cache/cloudcheck && \ + chown -R cloudcheck:cloudcheck /home/cloudcheck/.cache + +# Switch to non-root user +USER cloudcheck + +ENV RUST_LOG=info + +EXPOSE 8080 + +CMD ["cloudcheck", "serve", "--host", "0.0.0.0", "--port", "8080"] diff --git a/README.md b/README.md index f9cfd33..3440ec7 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,9 @@ [![Rust Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/rust-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/rust-tests.yml) [![Python Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/python-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/python-tests.yml) [![Pipeline Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/pipeline-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/pipeline-tests.yml) +[![Docker Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/docker-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/docker-tests.yml) + +### UPDATE 01-2026: Now supports REST API! ### UPDATE 12-2025: Now supports government agencies (DoD, FBI, UK MoD, RU FSO)! @@ -32,24 +35,43 @@ Used by [BBOT](https://github.com/blacklanternsecurity/bbot) and [BBOT Server](h # installation cargo install cloudcheck -# usage -cloudcheck 8.8.8.8 +# lookup command +cloudcheck lookup 8.8.8.8 # output: -{ - "name": "Google", - "tags": [ - "cloud" - ] -} - -cloudcheck asdf.amazon.com +[ + { + "name": "Google", + "tags": ["cloud"], + "short_description": "A suite of cloud computing services provided by Google", + "long_description": "Google Cloud Platform provides infrastructure, platform, and software services for businesses and developers" + } +] + +cloudcheck lookup asdf.amazon.com # output: -{ - "name": "Amazon", - "tags": [ - "cloud" - ] -} +[ + { + "name": "Amazon", + "tags": ["cloud"], + "short_description": "A comprehensive cloud computing platform provided by Amazon", + "long_description": "Amazon Web Services offers infrastructure services, storage, and computing power" + } +] + +# serve command - start REST API server +cloudcheck serve +# Server listening on http://127.0.0.1:8080 +# Swagger UI available at http://127.0.0.1:8080/swagger-ui +# OpenAPI spec available at http://127.0.0.1:8080/api-docs/openapi.json + +# serve with custom host and port +cloudcheck serve --host 0.0.0.0 --port 3000 +``` + +## REST API + +```bash +curl http://127.0.0.1:8080/lookup/8.8.8.8 ``` ## Python Library Usage @@ -179,4 +201,50 @@ When adding a new cloud provider: | X4B | A DDoS protection and content delivery network service provider. | cdn | 0 | 3 | | Zoho | An Indian software company that provides cloud-based business software and productivity tools including CRM, email, and office suites. | cloud | 13 | 91 | | Zscaler | A cloud security company providing secure internet access, cloud security, and zero trust network access services. | cloud | 0 | 247 | - \ No newline at end of file + + +## Development + +### Python + +#### Setup +```bash +uv sync +uv run maturin develop --release +``` + +#### Running Tests +```bash +# python tests +uv run pytest test_cloudcheck.py -v + +# docker tests +python test_docker.py +``` + +#### Linting +```bash +# Check for linting issues +uv run ruff check && uv run ruff format . +``` + +### Rust + +#### Running Tests +```bash +cargo test --verbose --all-features +``` + +#### Formatting +```bash +# Check formatting +cargo fmt --all -- --check + +# Format code +cargo fmt --all +``` + +#### Linting +```bash +cargo clippy --all-targets --all-features -- -D warnings +``` \ No newline at end of file diff --git a/src/api.rs b/src/api.rs new file mode 100644 index 0000000..347608f --- /dev/null +++ b/src/api.rs @@ -0,0 +1,134 @@ +use axum::Router; +use axum::response::Redirect; +use cloudcheck::CloudCheck; +use std::sync::Arc; +use tokio::net::TcpListener; +use utoipa::OpenApi; +use utoipa_swagger_ui::SwaggerUi; + +#[derive(OpenApi)] +#[openapi( + paths(lookup), + components(schemas(cloudcheck::CloudProvider)), + tags( + (name = "cloudcheck", description = "Cloud provider lookup API") + ) +)] +struct ApiDoc; + +async fn root() -> Redirect { + Redirect::permanent("/swagger-ui") +} + +#[utoipa::path( + get, + path = "/lookup/{target}", + tag = "cloudcheck", + params( + ("target" = String, Path, description = "Domain or IP address to lookup") + ), + responses( + (status = 200, description = "Lookup results", body = Vec) + ) +)] +async fn lookup( + axum::extract::Path(target): axum::extract::Path, + axum::extract::State(cloudcheck): axum::extract::State>, +) -> Result>, axum::http::StatusCode> { + log::info!("API lookup request for: {}", target); + match cloudcheck.lookup(&target).await { + Ok(providers) => { + log::info!("Lookup succeeded, returning {} providers", providers.len()); + Ok(axum::Json(providers)) + } + Err(e) => { + log::error!("Lookup failed: {}", e); + Err(axum::http::StatusCode::INTERNAL_SERVER_ERROR) + } + } +} + +pub async fn serve( + host: String, + port: u16, +) -> Result<(), Box> { + let cloudcheck = Arc::new(CloudCheck::new()); + let app = Router::new() + .route("/", axum::routing::get(root)) + .route("/lookup/{target}", axum::routing::get(lookup)) + .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi())) + .with_state(cloudcheck); + + let addr = format!("{}:{}", host, port); + let listener = TcpListener::bind(&addr).await?; + + println!("Server listening on http://{}", addr); + println!("Swagger UI available at http://{}/swagger-ui", addr); + println!( + "OpenAPI spec available at http://{}/api-docs/openapi.json", + addr + ); + + axum::serve(listener, app) + .with_graceful_shutdown(async { + tokio::signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }) + .await?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + async fn start_test_server() -> String { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + let port = addr.port(); + + let cloudcheck = Arc::new(CloudCheck::new()); + let app = Router::new() + .route("/", axum::routing::get(root)) + .route("/lookup/{target}", axum::routing::get(lookup)) + .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi())) + .with_state(cloudcheck); + + tokio::spawn(async move { + axum::serve(listener, app).await.unwrap(); + }); + + // Give the server a moment to start + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + format!("http://127.0.0.1:{}", port) + } + + #[tokio::test] + async fn test_lookup_endpoint() { + let base_url = start_test_server().await; + let url = format!("{}/lookup/8.8.8.8", base_url); + + let client = reqwest::Client::new(); + let response = client.get(&url).send().await.unwrap(); + + assert!(response.status().is_success()); + + let json: serde_json::Value = response.json().await.unwrap(); + + // Verify response is an array + let providers = json.as_array().unwrap(); + let names: Vec = providers + .iter() + .filter_map(|p| p.get("name").and_then(|n| n.as_str())) + .map(|s| s.to_string()) + .collect(); + + assert!( + names.contains(&"Google".to_string()), + "Expected Google in response: {}", + json + ); + } +} diff --git a/src/lib.rs b/src/lib.rs index 2219ee4..e4758f4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ use log::debug; use radixtarget::{RadixTarget, ScopeMode}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use std::error::Error as StdError; use std::path::PathBuf; use std::sync::Arc; use std::time::{Duration, SystemTime}; @@ -12,7 +13,7 @@ mod python; const CLOUDCHECK_SIGNATURE_URL: &str = "https://raw.githubusercontent.com/blacklanternsecurity/cloudcheck/refs/heads/stable/cloud_providers_v2.json"; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] pub struct CloudProvider { pub name: String, pub tags: Vec, @@ -75,20 +76,103 @@ impl CloudCheck { async fn fetch_and_cache(cache_path: &PathBuf) -> Result { let url = Self::get_signature_url(); - debug!("Fetching data from URL: {}", url); - let response = reqwest::get(&url).await?; - let json_data = response.text().await?; - debug!("Fetched {} bytes from network", json_data.len()); - - if let Some(parent) = cache_path.parent() { - debug!("Creating cache directory: {:?}", parent); - tokio::fs::create_dir_all(parent).await?; + log::info!("Fetching data from URL: {}", url); + + const MAX_RETRIES: u32 = 10; + let mut last_error = None; + + for attempt in 0..=MAX_RETRIES { + log::info!("Fetch attempt {}/{}", attempt + 1, MAX_RETRIES + 1); + let result = match reqwest::get(&url).await { + Ok(response) => { + let status = response.status(); + log::info!( + "HTTP response received, status: {} {}", + status.as_u16(), + status + ); + if !status.is_success() { + let error_msg = format!("HTTP error: {} {}", status.as_u16(), status); + log::warn!("{}", error_msg); + Err( + Box::new(std::io::Error::other(error_msg)) + as Error, + ) + } else { + response.text().await.map_err(|e| { + let error_msg = format!("Failed to read response body: {}", e); + log::warn!("{}", error_msg); + Box::new(std::io::Error::other(error_msg)) + as Error + }) + } + } + Err(e) => { + let error_type = if e.is_timeout() { + "timeout" + } else if e.is_connect() { + "connection" + } else if e.is_request() { + "request" + } else { + "unknown" + }; + let mut error_details = format!("{}", e); + let mut current_source: Option<&(dyn StdError + 'static)> = + StdError::source(&e); + while let Some(source) = current_source { + error_details = format!("{}: {}", error_details, source); + current_source = source.source(); + } + log::warn!( + "HTTP request failed ({} error): {}", + error_type, + error_details + ); + Err(Box::new(e) as Error) + } + }; + + match result { + Ok(json_data) => { + log::info!("Fetched {} bytes from network", json_data.len()); + + if let Some(parent) = cache_path.parent() { + log::debug!("Creating cache directory: {:?}", parent); + tokio::fs::create_dir_all(parent).await?; + } + log::debug!("Writing cache file: {:?}", cache_path); + tokio::fs::write(cache_path, &json_data).await?; + log::info!("Cache file written successfully"); + + return Ok(json_data); + } + Err(e) => { + last_error = Some(e); + if attempt < MAX_RETRIES { + log::warn!( + "Failed to fetch (attempt {}/{}), retrying in 1 second: {}", + attempt + 1, + MAX_RETRIES + 1, + last_error.as_ref().unwrap() + ); + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + } else { + log::error!( + "Failed to fetch after {} attempts: {}", + MAX_RETRIES + 1, + last_error.as_ref().unwrap() + ); + } + } + } } - debug!("Writing cache file: {:?}", cache_path); - tokio::fs::write(cache_path, &json_data).await?; - debug!("Cache file written successfully"); - Ok(json_data) + Err(last_error.unwrap_or_else(|| { + Box::new(std::io::Error::other( + "Failed to fetch data after retries", + )) + })) } /// Gets the last fetch time, checking in-memory timestamp first. @@ -137,11 +221,11 @@ impl CloudCheck { needs_refresh: bool, ) -> Result<(String, bool), Error> { if needs_refresh { - debug!("Refresh needed, fetching from network"); + log::info!("Refresh needed, fetching from network"); let data = Self::fetch_and_cache(cache_path).await?; Ok((data, true)) } else { - debug!("No refresh needed, loading from cache: {:?}", cache_path); + log::info!("No refresh needed, loading from cache: {:?}", cache_path); match tokio::fs::read_to_string(cache_path).await { Ok(data) => { debug!("Successfully loaded {} bytes from cache", data.len()); @@ -159,7 +243,7 @@ impl CloudCheck { Ok((data, false)) } Err(e) => { - debug!( + log::warn!( "Failed to read cache file ({}), falling back to network fetch", e ); @@ -246,10 +330,7 @@ impl CloudCheck { let cache_valid_duration = Duration::from_secs(24 * 60 * 60); let now = SystemTime::now(); let cache_path = Self::get_cache_path()?; - debug!( - "ensure_loaded: cache_valid_duration={:?}, cache_path={:?}", - cache_valid_duration, cache_path - ); + log::info!("ensure_loaded: checking cache at {:?}", cache_path); // Check if we need refresh (uses in-memory timestamp, falls back to file stat) let last_fetch_time = self.get_last_fetch_time(&cache_path).await?; @@ -274,15 +355,15 @@ impl CloudCheck { { let radix_guard = self.radix.read().await; if radix_guard.is_some() && !needs_refresh { - debug!("Data already loaded and fresh, returning early"); + log::info!("Data already loaded and fresh, returning early"); return Ok(()); } - debug!("Data not loaded or needs refresh, proceeding to load"); + log::info!("Data not loaded or needs refresh, proceeding to load"); } // Load JSON data and build structures let (json_data, fetched_fresh) = self.load_json_data(&cache_path, needs_refresh).await?; - debug!( + log::info!( "Loaded JSON data, fetched_fresh={}, building data structures", fetched_fresh ); @@ -313,7 +394,14 @@ impl CloudCheck { } pub async fn lookup(&self, target: &str) -> Result, Error> { - self.ensure_loaded().await?; + log::info!("lookup called for target: {}", target); + match self.ensure_loaded().await { + Ok(()) => log::debug!("ensure_loaded succeeded"), + Err(e) => { + log::error!("ensure_loaded failed: {}", e); + return Err(e); + } + } let radix_guard = self.radix.read().await; let providers_guard = self.providers.read().await; @@ -322,8 +410,12 @@ impl CloudCheck { let providers = providers_guard.as_ref().unwrap(); if let Some(normalized) = radix.get(target) { - Ok(providers.get(&normalized).cloned().unwrap_or_default()) + debug!("Found normalized target: {} for {}", normalized, target); + let result = providers.get(&normalized).cloned().unwrap_or_default(); + debug!("Returning {} providers", result.len()); + Ok(result) } else { + debug!("No match found for target: {}", target); Ok(Vec::new()) } } diff --git a/src/main.rs b/src/main.rs index 839cf30..eb373c5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,90 @@ +mod api; + +use clap::{Parser, Subcommand}; use cloudcheck::CloudCheck; +#[derive(Parser)] +#[command(name = "cloudcheck")] +#[command(about = "CloudCheck - Check if an IP address or hostname belongs to a cloud provider")] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + /// Lookup a domain or IP address + Lookup { + /// The domain or IP address to lookup + target: String, + }, + /// Start the API server + Serve { + /// Host to bind to + #[arg(long, default_value = "127.0.0.1")] + host: String, + /// Port to bind to + #[arg(long, default_value = "8080")] + port: u16, + }, +} + #[tokio::main] async fn main() { env_logger::init(); - let args: Vec = std::env::args().collect(); - if args.len() != 2 { - eprintln!("Usage: cloudcheck "); - std::process::exit(1); - } + let cli = Cli::parse(); - let target = &args[1]; - let cloudcheck = CloudCheck::new(); - match cloudcheck.lookup(target).await { - Ok(results) => { - let json = serde_json::to_string(&results).unwrap(); - println!("{}", json); + match cli.command { + Commands::Lookup { target } => { + let cloudcheck = CloudCheck::new(); + match cloudcheck.lookup(&target).await { + Ok(results) => { + let json = serde_json::to_string(&results).unwrap(); + println!("{}", json); + } + Err(e) => { + eprintln!("Error: {}", e); + std::process::exit(1); + } + } } - Err(e) => { - eprintln!("Error: {}", e); - std::process::exit(1); + Commands::Serve { host, port } => { + if let Err(e) = api::serve(host, port).await { + eprintln!("Server error: {}", e); + std::process::exit(1); + } } } } + +#[cfg(test)] +mod tests { + use assert_cmd::Command; + + #[test] + fn test_lookup_command_output() { + let bin_path = std::env::var("CARGO_BIN_EXE_cloudcheck") + .unwrap_or_else(|_| "target/debug/cloudcheck".to_string()); + let mut cmd = Command::from_std(std::process::Command::new(bin_path)); + let output = cmd.args(["lookup", "8.8.8.8"]).output().unwrap(); + + assert!(output.status.success()); + + let stdout = String::from_utf8(output.stdout).unwrap(); + + // Verify output is valid JSON + let parsed: Vec = serde_json::from_str(&stdout).unwrap(); + + // Verify it contains expected provider + let names: Vec = parsed + .iter() + .filter_map(|v| v.get("name").and_then(|n| n.as_str())) + .map(|s| s.to_string()) + .collect(); + assert!( + names.contains(&"Google".to_string()), + "Expected Google in output JSON: {}", + stdout + ); + } +} diff --git a/test_docker.py b/test_docker.py new file mode 100644 index 0000000..99a69c0 --- /dev/null +++ b/test_docker.py @@ -0,0 +1,143 @@ +import unittest +import subprocess +import requests +import time +import sys + + +class TestDocker(unittest.TestCase): + @classmethod + def setUpClass(cls): + """Build and start the Docker container.""" + print("Building Docker image...", file=sys.stderr) + build_result = subprocess.run( + ["docker", "build", "-t", "cloudcheck:test", "."], + capture_output=True, + text=True, + timeout=300, + ) + if build_result.returncode != 0: + print(f"Build failed: {build_result.stderr}", file=sys.stderr) + raise Exception(f"Docker build failed: {build_result.stderr}") + print("Build successful", file=sys.stderr) + + # Clean up any existing container + subprocess.run(["docker", "rm", "-f", "cloudcheck-test"], capture_output=True) + + print("Starting container...", file=sys.stderr) + result = subprocess.run( + [ + "docker", + "run", + "-d", + "-p", + "8080:8080", + "--name", + "cloudcheck-test", + "cloudcheck:test", + ], + capture_output=True, + text=True, + timeout=30, + ) + if result.returncode != 0: + print(f"Container start failed: {result.stderr}", file=sys.stderr) + raise Exception(f"Failed to start container: {result.stderr}") + cls.container_id = result.stdout.strip() + print(f"Container started: {cls.container_id}", file=sys.stderr) + + # Show container logs + logs = subprocess.run( + ["docker", "logs", "cloudcheck-test"], + capture_output=True, + text=True, + timeout=10, + ) + if logs.stdout: + print("Container logs:", file=sys.stderr) + print(logs.stdout, file=sys.stderr) + if logs.stderr: + print("Container stderr:", file=sys.stderr) + print(logs.stderr, file=sys.stderr) + + # Wait for server to be ready and cache to populate + cls.base_url = "http://localhost:8080" + print("Waiting for server to be ready...", file=sys.stderr) + for i in range(5): + try: + print( + f"Attempt {i + 1}/60: Checking {cls.base_url}/lookup/8.8.8.8", + file=sys.stderr, + ) + response = requests.get(f"{cls.base_url}/lookup/8.8.8.8", timeout=10) + if response.status_code == 200: + data = response.json() + # Wait until we actually get providers (cache might be loading) + if isinstance(data, list) and len(data) > 0: + print("Server is ready with data!", file=sys.stderr) + break + print(f"Got response but no providers yet: {data}", file=sys.stderr) + else: + print(f"Got status code {response.status_code}", file=sys.stderr) + except requests.exceptions.RequestException as e: + print(f"Request failed: {e}", file=sys.stderr) + time.sleep(2) + else: + # Check container logs + logs = subprocess.run( + ["docker", "logs", "cloudcheck-test"], + capture_output=True, + text=True, + timeout=10, + ) + print("Container logs on failure:", file=sys.stderr) + if logs.stdout: + print(logs.stdout, file=sys.stderr) + if logs.stderr: + print(logs.stderr, file=sys.stderr) + cls.tearDownClass() + raise Exception( + "Container failed to start or server not ready after 60 attempts" + ) + + @classmethod + def tearDownClass(cls): + """Stop and remove the container.""" + print("Cleaning up container...", file=sys.stderr) + # Try to stop gracefully, but don't fail if it times out + try: + subprocess.run( + ["docker", "stop", "cloudcheck-test"], capture_output=True, timeout=5 + ) + except subprocess.TimeoutExpired: + # If stop times out, force kill it + print("Stop timed out, forcing kill...", file=sys.stderr) + subprocess.run( + ["docker", "kill", "cloudcheck-test"], capture_output=True, timeout=5 + ) + + # Force remove the container (works even if it's still running) + subprocess.run( + ["docker", "rm", "-f", "cloudcheck-test"], capture_output=True, timeout=5 + ) + + def test_lookup_endpoint(self): + """Test the /lookup/{target} endpoint.""" + print(f"Testing {self.base_url}/lookup/8.8.8.8", file=sys.stderr) + response = requests.get(f"{self.base_url}/lookup/8.8.8.8", timeout=10) + self.assertEqual( + response.status_code, 200, f"Expected 200, got {response.status_code}" + ) + + data = response.json() + self.assertIsInstance(data, list, "Response should be an array") + self.assertGreater( + len(data), 0, "Response should contain at least one provider" + ) + + names = [p["name"] for p in data] + self.assertIn("Google", names, f"Expected Google in providers: {names}") + + +if __name__ == "__main__": + unittest.main() From 3a23cdf1ca328225965f8de17521adc112768098 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 16:17:17 -0500 Subject: [PATCH 06/12] bump version --- Cargo.toml | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 99797c1..b155630 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cloudcheck" -version = "8.6.2" +version = "8.7.0" edition = "2024" description = "CloudCheck is a simple Rust tool to check whether an IP address or hostname belongs to a cloud provider." license = "GPL-3.0" diff --git a/pyproject.toml b/pyproject.toml index 29dedcb..7495275 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "cloudcheck" -version = "8.6.2" +version = "8.7.0" description = "Detailed database of cloud providers. Instantly look up a domain or IP address" readme = "README.md" requires-python = ">=3.9" From 8167b00dd3400a9088df65f1c2f15465f574ca9b Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 16:18:30 -0500 Subject: [PATCH 07/12] fmt --- .github/workflows/docker-tests.yml | 2 +- src/lib.rs | 12 +++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/docker-tests.yml b/.github/workflows/docker-tests.yml index 105c8ba..d532b3f 100644 --- a/.github/workflows/docker-tests.yml +++ b/.github/workflows/docker-tests.yml @@ -67,7 +67,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 diff --git a/src/lib.rs b/src/lib.rs index e4758f4..74caf75 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,16 +94,12 @@ impl CloudCheck { if !status.is_success() { let error_msg = format!("HTTP error: {} {}", status.as_u16(), status); log::warn!("{}", error_msg); - Err( - Box::new(std::io::Error::other(error_msg)) - as Error, - ) + Err(Box::new(std::io::Error::other(error_msg)) as Error) } else { response.text().await.map_err(|e| { let error_msg = format!("Failed to read response body: {}", e); log::warn!("{}", error_msg); - Box::new(std::io::Error::other(error_msg)) - as Error + Box::new(std::io::Error::other(error_msg)) as Error }) } } @@ -169,9 +165,7 @@ impl CloudCheck { } Err(last_error.unwrap_or_else(|| { - Box::new(std::io::Error::other( - "Failed to fetch data after retries", - )) + Box::new(std::io::Error::other("Failed to fetch data after retries")) })) } From 5800ad88f4998f6f92cdf91b58ff84c1724b8631 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 16:19:04 -0500 Subject: [PATCH 08/12] tests --- .github/workflows/docker-tests.yml | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/.github/workflows/docker-tests.yml b/.github/workflows/docker-tests.yml index d532b3f..111adfa 100644 --- a/.github/workflows/docker-tests.yml +++ b/.github/workflows/docker-tests.yml @@ -10,36 +10,8 @@ concurrency: cancel-in-progress: true jobs: - test: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v6 - - - name: Install Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 - - - name: Cache cargo registry + target dir - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Check formatting - run: cargo fmt --all -- --check - - - name: Run clippy - run: cargo clippy --all-targets --all-features --locked -- -D warnings - - - name: Run tests - run: cargo test --all --locked --verbose - docker-test: runs-on: ubuntu-latest - needs: test steps: - uses: actions/checkout@v6 From 6172b713be325c91ba0e433c3cc138f1a173d0b4 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 16:50:53 -0500 Subject: [PATCH 09/12] fix tests --- Cargo.lock | 77 +---------------------------------------------------- Cargo.toml | 1 - src/main.rs | 17 ++++++++---- 3 files changed, 13 insertions(+), 82 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c322f2..e8780e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,21 +76,6 @@ dependencies = [ "derive_arbitrary", ] -[[package]] -name = "assert_cmd" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbb6924530aa9e0432442af08bbcafdad182db80d2e560da42a6d442535bf85" -dependencies = [ - "anstyle", - "bstr", - "libc", - "predicates", - "predicates-core", - "predicates-tree", - "wait-timeout", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -176,17 +161,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bstr" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.19.1" @@ -257,9 +231,8 @@ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "cloudcheck" -version = "8.6.2" +version = "8.7.0" dependencies = [ - "assert_cmd", "axum", "clap", "env_logger", @@ -337,12 +310,6 @@ dependencies = [ "syn", ] -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - [[package]] name = "digest" version = "0.10.7" @@ -1183,33 +1150,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "predicates" -version = "3.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" -dependencies = [ - "anstyle", - "difflib", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" - -[[package]] -name = "predicates-tree" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" -dependencies = [ - "predicates-core", - "termtree", -] - [[package]] name = "proc-macro2" version = "1.0.103" @@ -1765,12 +1705,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "termtree" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" - [[package]] name = "tinystr" version = "0.8.2" @@ -2022,15 +1956,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index b155630..a4c011f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,6 @@ default = [] py = ["dep:pyo3", "dep:pyo3-async-runtimes"] [dev-dependencies] -assert_cmd = "2.1" [[bin]] name = "cloudcheck" path = "src/main.rs" diff --git a/src/main.rs b/src/main.rs index eb373c5..e5e2a39 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,14 +59,21 @@ async fn main() { #[cfg(test)] mod tests { - use assert_cmd::Command; + use std::process::Command; #[test] fn test_lookup_command_output() { - let bin_path = std::env::var("CARGO_BIN_EXE_cloudcheck") - .unwrap_or_else(|_| "target/debug/cloudcheck".to_string()); - let mut cmd = Command::from_std(std::process::Command::new(bin_path)); - let output = cmd.args(["lookup", "8.8.8.8"]).output().unwrap(); + let bin_path = std::env::var("CARGO_BIN_EXE_cloudcheck").unwrap_or_else(|_| { + let profile = std::env::var("PROFILE").unwrap_or_else(|_| "debug".to_string()); + let mut path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("target"); + path.push(&profile); + path.push("cloudcheck"); + path.to_string_lossy().to_string() + }); + let mut cmd = Command::new(bin_path); + cmd.args(["lookup", "8.8.8.8"]); + let output = cmd.output().unwrap(); assert!(output.status.success()); From 67753cdbb05149f03301ece6cf77222277b1332c Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 17:11:16 -0500 Subject: [PATCH 10/12] tests --- src/main.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index e5e2a39..192865e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -64,16 +64,15 @@ mod tests { #[test] fn test_lookup_command_output() { let bin_path = std::env::var("CARGO_BIN_EXE_cloudcheck").unwrap_or_else(|_| { - let profile = std::env::var("PROFILE").unwrap_or_else(|_| "debug".to_string()); let mut path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); path.push("target"); - path.push(&profile); + path.push("debug"); path.push("cloudcheck"); path.to_string_lossy().to_string() }); let mut cmd = Command::new(bin_path); cmd.args(["lookup", "8.8.8.8"]); - let output = cmd.output().unwrap(); + let output = cmd.output().expect("Failed to execute cloudcheck command"); assert!(output.status.success()); From a3cc5d7bc9ccc568d9e8c214cfb2ec6206cd2f1c Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 17:13:04 -0500 Subject: [PATCH 11/12] tests --- src/main.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 192865e..96947f8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,7 +68,17 @@ mod tests { path.push("target"); path.push("debug"); path.push("cloudcheck"); - path.to_string_lossy().to_string() + let bin_path = path.to_string_lossy().to_string(); + + if !std::path::Path::new(&bin_path).exists() { + let status = Command::new("cargo") + .args(["build", "--bin", "cloudcheck"]) + .status() + .expect("Failed to run cargo build"); + assert!(status.success(), "Failed to build cloudcheck binary"); + } + + bin_path }); let mut cmd = Command::new(bin_path); cmd.args(["lookup", "8.8.8.8"]); From 9b4d768c1758b65f398b8b8a0bf0a4cdd43cb95a Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Wed, 7 Jan 2026 20:29:49 -0500 Subject: [PATCH 12/12] fmt --- README.md | 9 +-------- cloudcheck/providers/gocache.py | 32 +------------------------------- src/main.rs | 4 ++-- 3 files changed, 4 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 3440ec7..f9e2d9d 100644 --- a/README.md +++ b/README.md @@ -237,14 +237,7 @@ cargo test --verbose --all-features #### Formatting ```bash -# Check formatting -cargo fmt --all -- --check - -# Format code cargo fmt --all -``` -#### Linting -```bash cargo clippy --all-targets --all-features -- -D warnings -``` \ No newline at end of file +``` diff --git a/cloudcheck/providers/gocache.py b/cloudcheck/providers/gocache.py index f54f671..dfb48ec 100644 --- a/cloudcheck/providers/gocache.py +++ b/cloudcheck/providers/gocache.py @@ -5,39 +5,9 @@ class Gocache(BaseProvider): tags: List[str] = ["cdn"] short_description: str = "GoCache" - long_description: str = ( - "A Brazilian content delivery network provider offering CDN services." - ) + long_description: str = "A Brazilian content delivery network provider offering CDN services." _ips_url = "https://gocache.com.br/ips" - cidrs: List[str] = [ - "52.67.255.165/32", - "170.82.175.0/24", - "187.16.245.192/29", - "200.189.173.48/28", - "200.98.28.70/32", - "187.85.159.176/29", - "170.84.29.208/29", - "34.95.168.58/32", - "140.82.27.226/32", - "45.77.97.241/32", - "207.246.123.237/32", - "207.148.26.195/32", - "186.211.161.0/29", - "34.95.213.225/32", - "34.95.209.169/32", - "35.247.222.78/32", - "34.95.253.129/32", - "34.95.148.131/32", - "34.95.164.249/32", - "129.159.48.87/32", - "200.25.56.64/28", - "186.211.188.192/28", - "200.25.49.64/26", - "150.230.84.126/32", - "144.22.216.139/32", - "170.82.172.0/22", - ] def fetch_cidrs(self): response = self.request(self._ips_url) diff --git a/src/main.rs b/src/main.rs index 96947f8..d05907e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,7 +69,7 @@ mod tests { path.push("debug"); path.push("cloudcheck"); let bin_path = path.to_string_lossy().to_string(); - + if !std::path::Path::new(&bin_path).exists() { let status = Command::new("cargo") .args(["build", "--bin", "cloudcheck"]) @@ -77,7 +77,7 @@ mod tests { .expect("Failed to run cargo build"); assert!(status.success(), "Failed to build cloudcheck binary"); } - + bin_path }); let mut cmd = Command::new(bin_path);