Skip to content

Commit 70d2c22

Browse files
authored
Merge pull request #320 from carbonblack/CBAPI-4433-replace-distutils
Using packaging for python3.7+
2 parents 2853c82 + 2d2fc87 commit 70d2c22

File tree

7 files changed

+69
-45
lines changed

7 files changed

+69
-45
lines changed

examples/response/partition_operations.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import sys
2-
from distutils.version import LooseVersion
2+
if sys.version_info <= (3, 6):
3+
from distutils.version import LooseVersion as parse
4+
else:
5+
from packaging.version import parse
36

47
from cbapi.response.models import StoragePartition
58
from cbapi.example_helpers import build_cli_parser, get_cb_response_object
@@ -73,7 +76,7 @@ def main():
7376
args = parser.parse_args()
7477
cb = get_cb_response_object(args)
7578

76-
if cb.cb_server_version < LooseVersion("6.1.0"):
79+
if cb.cb_server_version < parse("6.1.0"):
7780
parser.error("This script can only work with server versions >= 6.1.0; {0} is running {1}"
7881
.format(cb.url, cb.cb_server_version))
7982
return 1

setup.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
install_requires.extend(['simplejson', 'total-ordering', 'ordereddict'])
3838
if sys.version_info < (3, 0):
3939
install_requires.extend(['futures'])
40-
40+
if sys.version_info > (3, 6):
41+
install_requires.extend(['packaging'])
4142
setup(
4243
name='cbapi',
4344
version='1.7.9',

src/cbapi/protection/models.py

+14-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
from ..oldmodels import BaseModel, immutable, MutableModel
44
from ..models import MutableBaseModel, CreatableModelMixin, NewBaseModel
55
from contextlib import closing
6-
from distutils.version import LooseVersion
6+
import sys
7+
if sys.version_info <= (3, 6):
8+
from distutils.version import LooseVersion as parse
9+
else:
10+
from packaging.version import parse
711

812
from zipfile import ZipFile
913
import cbapi.six as six
@@ -146,15 +150,15 @@ class DriftReport(NewBaseModel):
146150

147151
@classmethod
148152
def _minimum_server_version(cls):
149-
return LooseVersion("8.0")
153+
return parse("8.0")
150154

151155

152156
class DriftReportContents(NewBaseModel):
153157
urlobject = "/api/bit9platform/v1/driftReportContents"
154158

155159
@classmethod
156160
def _minimum_server_version(cls):
157-
return LooseVersion("8.0")
161+
return parse("8.0")
158162

159163

160164
class Event(NewBaseModel):
@@ -280,7 +284,7 @@ class GrantedUserPolicyPermission(NewBaseModel):
280284

281285
@classmethod
282286
def _minimum_server_version(cls):
283-
return LooseVersion("8.0")
287+
return parse("8.0")
284288

285289

286290
@immutable
@@ -374,15 +378,15 @@ class PublisherCertificate(NewBaseModel):
374378

375379
@classmethod
376380
def _minimum_server_version(cls):
377-
return LooseVersion("8.0")
381+
return parse("8.0")
378382

379383

380384
class ScriptRule(MutableBaseModel):
381385
urlobject = "/api/bit9platform/v1/scriptRule"
382386

383387
@classmethod
384388
def _minimum_server_version(cls):
385-
return LooseVersion("8.0")
389+
return parse("8.0")
386390

387391

388392
@immutable
@@ -413,7 +417,7 @@ class TrustedDirectory(MutableBaseModel):
413417

414418
@classmethod
415419
def _minimum_server_version(cls):
416-
return LooseVersion("8.0")
420+
return parse("8.0")
417421

418422

419423
class TrustedUser(MutableBaseModel, CreatableModelMixin):
@@ -422,7 +426,7 @@ class TrustedUser(MutableBaseModel, CreatableModelMixin):
422426

423427
@classmethod
424428
def _minimum_server_version(cls):
425-
return LooseVersion("8.0")
429+
return parse("8.0")
426430

427431

428432
class User(MutableBaseModel, CreatableModelMixin):
@@ -431,7 +435,7 @@ class User(MutableBaseModel, CreatableModelMixin):
431435

432436
@classmethod
433437
def _minimum_server_version(cls):
434-
return LooseVersion("8.0")
438+
return parse("8.0")
435439

436440

437441
class UserGroup(MutableBaseModel, CreatableModelMixin):
@@ -440,4 +444,4 @@ class UserGroup(MutableBaseModel, CreatableModelMixin):
440444

441445
@classmethod
442446
def _minimum_server_version(cls):
443-
return LooseVersion("8.0")
447+
return parse("8.0")

src/cbapi/protection/rest_api.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
from ..utils import convert_query_params
22
from ..query import PaginatedQuery
33
from ..errors import UnauthorizedError, ApiError
4-
from distutils.version import LooseVersion
4+
import sys
5+
if sys.version_info <= (3, 6):
6+
from distutils.version import LooseVersion as parse
7+
else:
8+
from packaging.version import parse
59

610

711
from cbapi.connection import BaseAPI
@@ -32,7 +36,7 @@ def __init__(self, *args, **kwargs):
3236

3337
log.debug('Connected to Cb server version %s at %s'
3438
% (self._server_info['ParityServerVersion'], self.session.server))
35-
self.cb_server_version = LooseVersion(self._server_info['ParityServerVersion'])
39+
self.cb_server_version = parse(self._server_info['ParityServerVersion'])
3640

3741
def _perform_query(self, cls, **kwargs):
3842
if hasattr(cls, "_query_implementation"):

src/cbapi/response/models.py

+28-24
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
import copy
55
import json
6-
from distutils.version import LooseVersion
6+
import sys
7+
if sys.version_info <= (3, 6):
8+
from distutils.version import LooseVersion as parse
9+
else:
10+
from packaging.version import parse
711
from collections import namedtuple, defaultdict
812
import base64
913
from datetime import datetime, timedelta
@@ -656,7 +660,7 @@ def __init__(self, *args, **kwargs):
656660
def _query_implementation(cls, cb):
657661
# ** Disable the paginated query implementation for now **
658662

659-
# if cb.cb_server_version >= LooseVersion("5.2.0"):
663+
# if cb.cb_server_version >= parse("5.2.0"):
660664
# return SensorPaginatedQuery(cls, cb)
661665
# else:
662666
# return SensorQuery(cls, cb)
@@ -869,7 +873,7 @@ def _update_object(self):
869873

870874
if "event_log_flush_time" in self._dirty_attributes and self._info.get("event_log_flush_time",
871875
None) is not None:
872-
if self._cb.cb_server_version > LooseVersion("6.0.0"):
876+
if self._cb.cb_server_version > parse("6.0.0"):
873877
# since the date/time stamp just needs to be far in the future, we just fake a GMT timezone.
874878
try:
875879
self._info["event_log_flush_time"] = self.event_log_flush_time.strftime("%a, %d %b %Y %H:%M:%S GMT")
@@ -1070,7 +1074,7 @@ def _retrieve_cb_info(self):
10701074
return info
10711075

10721076
def _update_object(self):
1073-
if self._cb.cb_server_version < LooseVersion("6.1.0") or self._info.get("id", None) is None:
1077+
if self._cb.cb_server_version < parse("6.1.0") or self._info.get("id", None) is None:
10741078
# only include IDs of the teams and not the entire dictionary
10751079
# - applies to Cb Response server < 6.0 as well as Cb Response servers >= 6.0 where the user hasn't
10761080
# been created yet.
@@ -1394,7 +1398,7 @@ class ThreatReport(MutableBaseModel):
13941398

13951399
@classmethod
13961400
def _query_implementation(cls, cb):
1397-
if cb.cb_server_version >= LooseVersion('5.1.0'):
1401+
if cb.cb_server_version >= parse('5.1.0'):
13981402
return ThreatReportQuery(cls, cb)
13991403
else:
14001404
return Query(cls, cb)
@@ -1524,7 +1528,7 @@ def group_by(self, field_name):
15241528
:return: Query object
15251529
:rtype: :py:class:`ProcessQuery`
15261530
"""
1527-
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
1531+
if self._cb.cb_server_version >= parse('6.0.0'):
15281532
nq = self._clone()
15291533
nq._default_args["cb.group"] = field_name
15301534
return nq
@@ -1573,7 +1577,7 @@ def min_last_update(self, v):
15731577
:return: Query object
15741578
:rtype: :py:class:`ProcessQuery`
15751579
"""
1576-
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
1580+
if self._cb.cb_server_version >= parse('6.0.0'):
15771581
nq = self._clone()
15781582
try:
15791583
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
@@ -1599,7 +1603,7 @@ def min_last_server_update(self, v):
15991603
:return: Query object
16001604
:rtype: :py:class:`ProcessQuery`
16011605
"""
1602-
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
1606+
if self._cb.cb_server_version >= parse('6.0.0'):
16031607
nq = self._clone()
16041608
try:
16051609
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
@@ -1625,7 +1629,7 @@ def max_last_update(self, v):
16251629
:return: Query object
16261630
:rtype: :py:class:`ProcessQuery`
16271631
"""
1628-
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
1632+
if self._cb.cb_server_version >= parse('6.0.0'):
16291633
nq = self._clone()
16301634
try:
16311635
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
@@ -1651,7 +1655,7 @@ def max_last_server_update(self, v):
16511655
:return: Query object
16521656
:rtype: :py:class:`ProcessQuery`
16531657
"""
1654-
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
1658+
if self._cb.cb_server_version >= parse('6.0.0'):
16551659
nq = self._clone()
16561660
try:
16571661
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
@@ -2285,7 +2289,7 @@ def parse_guid(self, procguid):
22852289
# new 5.x process IDs are hex strings with optional segment IDs.
22862290
if len(procguid) == 45:
22872291
return procguid[:36], int(procguid[38:], 16)
2288-
elif len(procguid) == 49 and self._cb.cb_server_version >= LooseVersion('6.0.0'):
2292+
elif len(procguid) == 49 and self._cb.cb_server_version >= parse('6.0.0'):
22892293
return procguid[:36], int(procguid[38:], 16)
22902294
else:
22912295
return None, None
@@ -2309,7 +2313,7 @@ def __init__(self, cb, procguid, segment=None, max_children=15, initial_data=Non
23092313
self.__children_info = None
23102314
self.__sibling_info = None
23112315

2312-
if cb.cb_server_version < LooseVersion('6.0.0'):
2316+
if cb.cb_server_version < parse('6.0.0'):
23132317
self._default_segment = 1
23142318
else:
23152319
self._default_segment = 0
@@ -2322,7 +2326,7 @@ def __init__(self, cb, procguid, segment=None, max_children=15, initial_data=Non
23222326
if len(procguid) == 45:
23232327
self.id = procguid[:36]
23242328
self.current_segment = int(procguid[38:], 16)
2325-
elif len(procguid) == 49 and cb.cb_server_version >= LooseVersion('6.0.0'):
2329+
elif len(procguid) == 49 and cb.cb_server_version >= parse('6.0.0'):
23262330
self.id = procguid[:36]
23272331
self.current_segment = int(procguid[38:], 16)
23282332
else:
@@ -2339,14 +2343,14 @@ def __init__(self, cb, procguid, segment=None, max_children=15, initial_data=Non
23392343

23402344
self._process_summary_api = 'v1'
23412345

2342-
if cb.cb_server_version >= LooseVersion('6.0.0'):
2346+
if cb.cb_server_version >= parse('6.0.0'):
23432347
self._process_summary_api = 'v2'
23442348
self._process_event_api = 'v4'
23452349
self._event_parser = ProcessV4Parser(self)
2346-
elif cb.cb_server_version >= LooseVersion('5.2.0'):
2350+
elif cb.cb_server_version >= parse('5.2.0'):
23472351
self._process_event_api = 'v3'
23482352
self._event_parser = ProcessV3Parser(self)
2349-
elif cb.cb_server_version >= LooseVersion('5.1.0'):
2353+
elif cb.cb_server_version >= parse('5.1.0'):
23502354
# CbER 5.1.0 introduced an extended event API
23512355
self._process_event_api = 'v2'
23522356
self._event_parser = ProcessV2Parser(self)
@@ -2755,7 +2759,7 @@ def all_events_segment(self):
27552759

27562760
def get_segments(self):
27572761
if not self._segments:
2758-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
2762+
if self._cb.cb_server_version < parse('6.0.0'):
27592763
log.debug("using process_id search for cb response server < 6.0")
27602764
segment_query = Query(Process, self._cb, query="process_id:{0}".format(self.id)).sort("")
27612765
proclist = sorted([res["segment_id"] for res in segment_query._search()])
@@ -3066,7 +3070,7 @@ def require_all_events(self):
30663070
self.all_events_loaded = True
30673071

30683072
def all_childprocs(self):
3069-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
3073+
if self._cb.cb_server_version < parse('6.0.0'):
30703074
self.get_segments()
30713075
segments = self._segments
30723076

@@ -3088,7 +3092,7 @@ def all_childprocs(self):
30883092
i += 1
30893093

30903094
def all_modloads(self):
3091-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
3095+
if self._cb.cb_server_version < parse('6.0.0'):
30923096
self.get_segments()
30933097
segments = self._segments
30943098

@@ -3110,7 +3114,7 @@ def all_modloads(self):
31103114
i += 1
31113115

31123116
def all_filemods(self):
3113-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
3117+
if self._cb.cb_server_version < parse('6.0.0'):
31143118
self.get_segments()
31153119
segments = self._segments
31163120

@@ -3132,7 +3136,7 @@ def all_filemods(self):
31323136
i += 1
31333137

31343138
def all_processblocks(self):
3135-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
3139+
if self._cb.cb_server_version < parse('6.0.0'):
31363140
self.get_segments()
31373141
segments = self._segments
31383142

@@ -3154,7 +3158,7 @@ def all_processblocks(self):
31543158
i += 1
31553159

31563160
def all_regmods(self):
3157-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
3161+
if self._cb.cb_server_version < parse('6.0.0'):
31583162
self.get_segments()
31593163
segments = self._segments
31603164

@@ -3176,7 +3180,7 @@ def all_regmods(self):
31763180
i += 1
31773181

31783182
def all_crossprocs(self):
3179-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
3183+
if self._cb.cb_server_version < parse('6.0.0'):
31803184
self.get_segments()
31813185
segments = self._segments
31823186

@@ -3198,7 +3202,7 @@ def all_crossprocs(self):
31983202
i += 1
31993203

32003204
def all_netconns(self):
3201-
if self._cb.cb_server_version < LooseVersion('6.0.0'):
3205+
if self._cb.cb_server_version < parse('6.0.0'):
32023206
self.get_segments()
32033207
segments = self._segments
32043208

src/cbapi/response/query.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
from ..utils import convert_query_params
22
from ..query import PaginatedQuery
33
from cbapi.six.moves import urllib
4-
from distutils.version import LooseVersion
4+
import sys
5+
if sys.version_info <= (3, 6):
6+
from distutils.version import LooseVersion as parse
7+
else:
8+
from packaging.version import parse
59
from ..errors import ApiError
610
import copy
711

@@ -56,7 +60,7 @@ def __init__(self, doc_class, cb, query=None, raw_query=None):
5660

5761
# FIX: Cb Response server version 5.1.0-3 throws an exception after returning HTTP 504 when facet=false in the
5862
# HTTP request. Work around this by only setting facet=false on 5.1.1 and above server versions.
59-
if self._cb.cb_server_version >= LooseVersion('5.1.1'):
63+
if self._cb.cb_server_version >= parse('5.1.1'):
6064
self._default_args["facet"] = "false"
6165

6266
def _clone(self):

0 commit comments

Comments
 (0)