cloudcheck 6.0.0.686__py3-none-any.whl → 7.0.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cloudcheck might be problematic. Click here for more details.
- cloud_providers.json +1 -30629
- cloudcheck/cloudcheck.py +1 -3
- cloudcheck/helpers.py +1 -1
- cloudcheck/providers/__init__.py +6 -14
- cloudcheck/providers/amazon.py +1 -5
- cloudcheck/providers/azure.py +4 -4
- cloudcheck/providers/base.py +2 -6
- cloudcheck/providers/digitalocean.py +1 -5
- cloudcheck/test/test_cloudcheck.py +1 -2
- {cloudcheck-6.0.0.686.dist-info → cloudcheck-7.0.4.dist-info}/METADATA +2 -2
- {cloudcheck-6.0.0.686.dist-info → cloudcheck-7.0.4.dist-info}/RECORD +13 -13
- {cloudcheck-6.0.0.686.dist-info → cloudcheck-7.0.4.dist-info}/WHEEL +0 -0
- {cloudcheck-6.0.0.686.dist-info → cloudcheck-7.0.4.dist-info}/entry_points.txt +0 -0
cloudcheck/cloudcheck.py
CHANGED
|
@@ -8,9 +8,7 @@ from cloudcheck.providers import cloud_providers
|
|
|
8
8
|
async def _main():
|
|
9
9
|
ips = sys.argv[1:]
|
|
10
10
|
if not ips:
|
|
11
|
-
print(
|
|
12
|
-
"usage: cloudcheck 1.2.3.4 [update | forceupdate | [ips...] | [domains...]]"
|
|
13
|
-
)
|
|
11
|
+
print("usage: cloudcheck 1.2.3.4 [update | forceupdate | [ips...] | [domains...]]")
|
|
14
12
|
elif len(ips) == 1 and ips[0].lower() == "update":
|
|
15
13
|
await cloud_providers.update()
|
|
16
14
|
return
|
cloudcheck/helpers.py
CHANGED
cloudcheck/providers/__init__.py
CHANGED
|
@@ -23,11 +23,7 @@ for file in Path(__file__).parent.glob("*.py"):
|
|
|
23
23
|
module_variables = importlib.import_module(import_path, "cloudcheck")
|
|
24
24
|
for variable in module_variables.__dict__.keys():
|
|
25
25
|
value = getattr(module_variables, variable)
|
|
26
|
-
if (
|
|
27
|
-
hasattr(value, "__mro__")
|
|
28
|
-
and not value == BaseCloudProvider
|
|
29
|
-
and BaseCloudProvider in value.__mro__
|
|
30
|
-
):
|
|
26
|
+
if hasattr(value, "__mro__") and not value == BaseCloudProvider and BaseCloudProvider in value.__mro__:
|
|
31
27
|
provider_name = value.__name__.lower()
|
|
32
28
|
providers[provider_name] = value
|
|
33
29
|
|
|
@@ -103,9 +99,7 @@ class CloudProviders:
|
|
|
103
99
|
if self.last_updated > oldest_allowed and not force:
|
|
104
100
|
return
|
|
105
101
|
try:
|
|
106
|
-
async with httpx.AsyncClient(
|
|
107
|
-
transport=httpx.AsyncHTTPTransport(verify=False)
|
|
108
|
-
) as client:
|
|
102
|
+
async with httpx.AsyncClient(transport=httpx.AsyncHTTPTransport(verify=False)) as client:
|
|
109
103
|
response = await client.get(self.json_url)
|
|
110
104
|
except Exception as e:
|
|
111
105
|
error = e
|
|
@@ -113,10 +107,10 @@ class CloudProviders:
|
|
|
113
107
|
with open(self.json_path, "wb") as f:
|
|
114
108
|
f.write(response.content)
|
|
115
109
|
self.load_from_json(force=True)
|
|
110
|
+
for provider in self:
|
|
111
|
+
provider.radix.defrag()
|
|
116
112
|
else:
|
|
117
|
-
log.warning(
|
|
118
|
-
f"Failed to retrieve update from {self.json_url} (response: {response}, error: {error})"
|
|
119
|
-
)
|
|
113
|
+
log.warning(f"Failed to retrieve update from {self.json_url} (response: {response}, error: {error})")
|
|
120
114
|
|
|
121
115
|
async def update_from_sources(self):
|
|
122
116
|
tasks = [asyncio.create_task(p.update()) for p in self]
|
|
@@ -124,9 +118,7 @@ class CloudProviders:
|
|
|
124
118
|
j = self.to_json()
|
|
125
119
|
if j:
|
|
126
120
|
with open(self.json_path, "w") as f:
|
|
127
|
-
json.dump(
|
|
128
|
-
self.to_json(), f, sort_keys=True, indent=4, cls=CustomJSONEncoder
|
|
129
|
-
)
|
|
121
|
+
json.dump(self.to_json(), f, sort_keys=True, cls=CustomJSONEncoder)
|
|
130
122
|
self.load_from_json(force=True)
|
|
131
123
|
|
|
132
124
|
def to_json(self):
|
cloudcheck/providers/amazon.py
CHANGED
|
@@ -47,11 +47,7 @@ class Amazon(BaseCloudProvider):
|
|
|
47
47
|
"thinkboxsoftware.com",
|
|
48
48
|
]
|
|
49
49
|
bucket_name_regex = r"[a-z0-9_][a-z0-9-\.]{1,61}[a-z0-9]"
|
|
50
|
-
regexes = {
|
|
51
|
-
"STORAGE_BUCKET": [
|
|
52
|
-
r"(" + bucket_name_regex + r")\.(s3-?(?:[a-z0-9-]*\.){1,2}amazonaws\.com)"
|
|
53
|
-
]
|
|
54
|
-
}
|
|
50
|
+
regexes = {"STORAGE_BUCKET": [r"(" + bucket_name_regex + r")\.(s3-?(?:[a-z0-9-]*\.){1,2}amazonaws\.com)"]}
|
|
55
51
|
|
|
56
52
|
ips_url = "https://ip-ranges.amazonaws.com/ip-ranges.json"
|
|
57
53
|
|
cloudcheck/providers/azure.py
CHANGED
|
@@ -144,11 +144,11 @@ class Azure(BaseCloudProvider):
|
|
|
144
144
|
"windowsazurestatus.cn",
|
|
145
145
|
]
|
|
146
146
|
bucket_name_regex = r"[a-z0-9][a-z0-9-_\.]{1,61}[a-z0-9]"
|
|
147
|
-
regexes = {
|
|
148
|
-
"STORAGE_BUCKET": [r"(" + bucket_name_regex + r")\.(blob\.core\.windows\.net)"]
|
|
149
|
-
}
|
|
147
|
+
regexes = {"STORAGE_BUCKET": [r"(" + bucket_name_regex + r")\.(blob\.core\.windows\.net)"]}
|
|
150
148
|
|
|
151
|
-
ips_url =
|
|
149
|
+
ips_url = (
|
|
150
|
+
"https://download.microsoft.com/download/0/1/8/018E208D-54F8-44CD-AA26-CD7BC9524A8C/PublicIPs_20200824.xml"
|
|
151
|
+
)
|
|
152
152
|
|
|
153
153
|
def parse_response(self, response):
|
|
154
154
|
ranges = set()
|
cloudcheck/providers/base.py
CHANGED
|
@@ -66,9 +66,7 @@ class BaseCloudProvider:
|
|
|
66
66
|
self.radix = Target()
|
|
67
67
|
if j is not None:
|
|
68
68
|
p = CloudProviderJSON(**j)
|
|
69
|
-
self.update_domains(
|
|
70
|
-
[d.lower() for d in set(list(self.domains) + list(p.domains))]
|
|
71
|
-
)
|
|
69
|
+
self.update_domains([d.lower() for d in set(list(self.domains) + list(p.domains))])
|
|
72
70
|
self.update_ranges(p.cidrs)
|
|
73
71
|
self.last_updated = p.last_updated
|
|
74
72
|
|
|
@@ -95,9 +93,7 @@ class BaseCloudProvider:
|
|
|
95
93
|
try:
|
|
96
94
|
self.ranges = self.get_subnets()
|
|
97
95
|
if self.ips_url:
|
|
98
|
-
async with httpx.AsyncClient(
|
|
99
|
-
transport=httpx.AsyncHTTPTransport(verify=False)
|
|
100
|
-
) as client:
|
|
96
|
+
async with httpx.AsyncClient(transport=httpx.AsyncHTTPTransport(verify=False)) as client:
|
|
101
97
|
response = await client.get(
|
|
102
98
|
self.ips_url,
|
|
103
99
|
follow_redirects=True,
|
|
@@ -12,11 +12,7 @@ class DigitalOcean(BaseCloudProvider):
|
|
|
12
12
|
]
|
|
13
13
|
|
|
14
14
|
bucket_name_regex = r"[a-z0-9][a-z0-9-]{2,62}"
|
|
15
|
-
regexes = {
|
|
16
|
-
"STORAGE_BUCKET": [
|
|
17
|
-
r"(" + bucket_name_regex + r")\.([a-z]{3}[\d]{1}\.digitaloceanspaces\.com)"
|
|
18
|
-
]
|
|
19
|
-
}
|
|
15
|
+
regexes = {"STORAGE_BUCKET": [r"(" + bucket_name_regex + r")\.([a-z]{3}[\d]{1}\.digitaloceanspaces\.com)"]}
|
|
20
16
|
|
|
21
17
|
ips_url = "https://digitalocean.com/geo/google.csv"
|
|
22
18
|
|
|
@@ -31,7 +31,7 @@ async def test_cloudcheck():
|
|
|
31
31
|
|
|
32
32
|
google = cloud_providers.providers["google"]
|
|
33
33
|
assert google.check("test.asdf.google") == "google"
|
|
34
|
-
assert google.check("test.asdf.google.asdf")
|
|
34
|
+
assert google.check("test.asdf.google.asdf") is None
|
|
35
35
|
|
|
36
36
|
assert cloud_providers.check("asdf.google") == [("Google", "cloud", "google")]
|
|
37
37
|
assert cloud_providers.check("asdf.googles") == []
|
|
@@ -72,7 +72,6 @@ async def test_cloudcheck():
|
|
|
72
72
|
|
|
73
73
|
@pytest.mark.asyncio
|
|
74
74
|
async def test_cloudcheck_cli(monkeypatch, capsys):
|
|
75
|
-
|
|
76
75
|
from cloudcheck.cloudcheck import _main
|
|
77
76
|
|
|
78
77
|
monkeypatch.setattr(sys, "exit", lambda *args, **kwargs: True)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: cloudcheck
|
|
3
|
-
Version:
|
|
3
|
+
Version: 7.0.4
|
|
4
4
|
Summary: Check whether an IP address belongs to a cloud provider
|
|
5
5
|
Home-page: https://github.com/blacklanternsecurity/cloudcheck
|
|
6
6
|
License: GPL-3.0
|
|
@@ -15,7 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
16
|
Requires-Dist: httpx (>=0.26,<0.29)
|
|
17
17
|
Requires-Dist: pydantic (>=2.4.2,<3.0.0)
|
|
18
|
-
Requires-Dist: radixtarget (>=
|
|
18
|
+
Requires-Dist: radixtarget (>=3.0.13,<4.0.0)
|
|
19
19
|
Requires-Dist: regex (>=2024.4.16,<2025.0.0)
|
|
20
20
|
Project-URL: Discord, https://discord.com/invite/PZqkgxu5SA
|
|
21
21
|
Project-URL: PyPi, https://pypi.org/project/cloudcheck/
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
cloud_providers.json,sha256=
|
|
1
|
+
cloud_providers.json,sha256=CIO8P_RkpoElSkzf7uHGxDDTOPMr0LKAZHJJZ1wpPEc,586419
|
|
2
2
|
cloudcheck/__init__.py,sha256=FuxQNWSWrhThXVwhuaevh57mUQNtVS-KQ_HCIkfnE0M,416
|
|
3
|
-
cloudcheck/cloudcheck.py,sha256=
|
|
4
|
-
cloudcheck/helpers.py,sha256=
|
|
5
|
-
cloudcheck/providers/__init__.py,sha256=
|
|
3
|
+
cloudcheck/cloudcheck.py,sha256=U9kiSiRYS6SXPDQMrFJcZDyMPvmkmgvAPLNOViVYDXw,902
|
|
4
|
+
cloudcheck/helpers.py,sha256=Qw_dyJQ_HF71-1j6-9X1hZu1beA8UvnVj7i4Alrgumw,604
|
|
5
|
+
cloudcheck/providers/__init__.py,sha256=XHPNfvK7uL-8ziGAoaL6fz-is3IY2TDuy5RYlJr-3fQ,5267
|
|
6
6
|
cloudcheck/providers/akamai.py,sha256=UzuuAq_V9GwlIWMkOJ56Jfv2vdjQN0umiafAyRAW5aw,3591
|
|
7
|
-
cloudcheck/providers/amazon.py,sha256=
|
|
7
|
+
cloudcheck/providers/amazon.py,sha256=fkDOOQLhlasXQcLywlh-VfQbcjHeNCUXBKFYFhfNfwc,1667
|
|
8
8
|
cloudcheck/providers/arvancloud.py,sha256=ModvIi15JVLYiqEqIJtq89oXQ0l03MZrkLaW0Sf_1I4,479
|
|
9
|
-
cloudcheck/providers/azure.py,sha256=
|
|
10
|
-
cloudcheck/providers/base.py,sha256=
|
|
9
|
+
cloudcheck/providers/azure.py,sha256=Sk3ZhfdFJ2PciXVKRCRUiH8ht_yNdwzXNSMIO72dw-U,4704
|
|
10
|
+
cloudcheck/providers/base.py,sha256=9ay5NmOi4K1OoxS1q9rqPVIMpIHRYXxzHC6CXwh9cvg,5378
|
|
11
11
|
cloudcheck/providers/cloudflare.py,sha256=lsinVyEVLXcKRBCuNnhTv3I99dq5lp3sol6RJcNp63Q,1725
|
|
12
12
|
cloudcheck/providers/cloudfront.py,sha256=Lk894kwiFwqi2C1tU-0pRHDMx3N7r_VVHqCJEW-Bvdg,680
|
|
13
|
-
cloudcheck/providers/digitalocean.py,sha256=
|
|
13
|
+
cloudcheck/providers/digitalocean.py,sha256=m_uurDwkdZMSXR2pUSNwNJaJYTHmXjUGuSYSPyExhZw,726
|
|
14
14
|
cloudcheck/providers/fastly.py,sha256=c3Y5cm5R0PMRXGSWDxAiij50X9Mh9ga2xrbHO6RTfKU,575
|
|
15
15
|
cloudcheck/providers/github.py,sha256=iUqdoVQkQbp6lYMzajHCNKgRAIlPrvYEBbWlK6Oj5gM,600
|
|
16
16
|
cloudcheck/providers/google.py,sha256=Digp6ONhLQHT3HDkTEyhHoljoygFQmUm6SW2EPMTv6s,929
|
|
@@ -19,8 +19,8 @@ cloudcheck/providers/imperva.py,sha256=3RxumRb5Ye5V_3STMWSI2JcAVtb_gijkb-y3wSe_3
|
|
|
19
19
|
cloudcheck/providers/oracle.py,sha256=Xbi9M0dJf6jlGZuZe6vKCyGFQJNBKopQkyBnwEdjb0I,667
|
|
20
20
|
cloudcheck/providers/zoho.py,sha256=4fo0unvG-oVgsKPz5Xa3viq5P5sf69VNu-v0kt1aQK4,477
|
|
21
21
|
cloudcheck/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
-
cloudcheck/test/test_cloudcheck.py,sha256=
|
|
23
|
-
cloudcheck-
|
|
24
|
-
cloudcheck-
|
|
25
|
-
cloudcheck-
|
|
26
|
-
cloudcheck-
|
|
22
|
+
cloudcheck/test/test_cloudcheck.py,sha256=BaTwFFcr4vO9U7yhCTaXJXbWE_DUpCtN_x59j_CEHwU,2279
|
|
23
|
+
cloudcheck-7.0.4.dist-info/METADATA,sha256=KEX3z1hpdSEpSJ67E34xNWg-WTe1xbmoV4Tx3m2gDnA,2872
|
|
24
|
+
cloudcheck-7.0.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
25
|
+
cloudcheck-7.0.4.dist-info/entry_points.txt,sha256=SzYzxS8FPIBJdwNT4pQhhSostZyrQMxLqzpyuKkJxDU,57
|
|
26
|
+
cloudcheck-7.0.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|