Skip to content

Commit 333d678

Browse files
authored
Merge pull request #6 from LeakIX/dannywillems/implement-bulk-export
Add bulk export
2 parents 8d58b85 + 2aac33a commit 333d678

3 files changed

Lines changed: 41 additions & 5 deletions

File tree

example/example_client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ def example_get_plugins():
9999
print(p.description)
100100

101101

102+
def example_bulk_export():
103+
raw_query = '+plugin:"SmbPlugin" +country:"Belgium"'
104+
query = RawQuery(raw_query)
105+
response = CLIENT.bulk_export([query])
106+
print(response.json())
107+
108+
102109
if __name__ == "__main__":
103110
example_get_host_filter_plugin()
104111
example_get_service_filter_plugin()
@@ -108,3 +115,4 @@ def example_get_plugins():
108115
example_get_leak_plugins_with_time()
109116
example_get_leak_raw_query()
110117
example_get_plugins()
118+
example_bulk_export()

leakix/client.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from abc import ABCMeta, abstractmethod
2-
import os
1+
import json
32
from typing import Optional, List
43
import requests
54
from l9format import l9format
@@ -52,7 +51,7 @@ def __get(self, url, params):
5251
headers=self.headers,
5352
)
5453
if r.status_code == 200:
55-
response_json = r.json() or []
54+
response_json = r.json() if r.content else []
5655
return SuccessResponse(response=r, response_json=response_json)
5756
elif r.status_code == 429:
5857
return RateLimitResponse(response=r)
@@ -153,3 +152,32 @@ def get_plugins(self):
153152
if r.is_success():
154153
r.response_json = [APIResult.from_dict(d) for d in r.json()]
155154
return r
155+
156+
def bulk_export(self, queries: Optional[List[Query]] = None):
157+
url = "%s/bulk/search" % (self.base_url)
158+
if queries is None or len(queries) == 0:
159+
serialized_query = EmptyQuery().serialize()
160+
else:
161+
serialized_query = [q.serialize() for q in queries]
162+
serialized_query = " ".join(serialized_query)
163+
serialized_query = "%s" % serialized_query
164+
params = {"q": serialized_query}
165+
r = requests.get(
166+
url,
167+
params=params,
168+
headers=self.headers,
169+
stream=True
170+
)
171+
if r.status_code == 200:
172+
response_json = []
173+
for line in r.iter_lines():
174+
json_event = json.loads(line)
175+
response_json.append(l9format.L9Aggregation.from_dict(json_event))
176+
return SuccessResponse(response=r, response_json=response_json)
177+
elif r.status_code == 429:
178+
return RateLimitResponse(response=r)
179+
elif r.status_code == 204:
180+
return ErrorResponse(response=r, response_json=[], status_code=200)
181+
else:
182+
return ErrorResponse(response=r, response_json=r.json())
183+
return r

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[tool.poetry]
22
name = "leakix"
3-
version = "0.1.6"
3+
version = "0.1.7"
44
description = "Official python client for LeakIX (https://leakix.net)"
55
authors = ["Danny Willems <danny@leakix.net>"]
66

77
[tool.poetry.dependencies]
88
python = "^3.7"
99
requests = "*"
10-
l9format = "=1.3.1a1"
10+
l9format = "=1.3.1a2"
1111

1212
[tool.poetry.dev-dependencies]
1313
python-decouple = "*"

0 commit comments

Comments
 (0)