Skip to content

Commit

Permalink
Merge pull request #320 from carbonblack/CBAPI-4433-replace-distutils
Browse files Browse the repository at this point in the history
Using packaging for python3.7+
  • Loading branch information
emitreva-cb committed Feb 1, 2023
2 parents 2853c82 + 2d2fc87 commit 70d2c22
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 45 deletions.
7 changes: 5 additions & 2 deletions examples/response/partition_operations.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import sys
from distutils.version import LooseVersion
if sys.version_info <= (3, 6):
from distutils.version import LooseVersion as parse
else:
from packaging.version import parse

from cbapi.response.models import StoragePartition
from cbapi.example_helpers import build_cli_parser, get_cb_response_object
Expand Down Expand Up @@ -73,7 +76,7 @@ def main():
args = parser.parse_args()
cb = get_cb_response_object(args)

if cb.cb_server_version < LooseVersion("6.1.0"):
if cb.cb_server_version < parse("6.1.0"):
parser.error("This script can only work with server versions >= 6.1.0; {0} is running {1}"
.format(cb.url, cb.cb_server_version))
return 1
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
install_requires.extend(['simplejson', 'total-ordering', 'ordereddict'])
if sys.version_info < (3, 0):
install_requires.extend(['futures'])

if sys.version_info > (3, 6):
install_requires.extend(['packaging'])
setup(
name='cbapi',
version='1.7.9',
Expand Down
24 changes: 14 additions & 10 deletions src/cbapi/protection/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
from ..oldmodels import BaseModel, immutable, MutableModel
from ..models import MutableBaseModel, CreatableModelMixin, NewBaseModel
from contextlib import closing
from distutils.version import LooseVersion
import sys
if sys.version_info <= (3, 6):
from distutils.version import LooseVersion as parse
else:
from packaging.version import parse

from zipfile import ZipFile
import cbapi.six as six
Expand Down Expand Up @@ -146,15 +150,15 @@ class DriftReport(NewBaseModel):

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


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

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


class Event(NewBaseModel):
Expand Down Expand Up @@ -280,7 +284,7 @@ class GrantedUserPolicyPermission(NewBaseModel):

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


@immutable
Expand Down Expand Up @@ -374,15 +378,15 @@ class PublisherCertificate(NewBaseModel):

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


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

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


@immutable
Expand Down Expand Up @@ -413,7 +417,7 @@ class TrustedDirectory(MutableBaseModel):

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


class TrustedUser(MutableBaseModel, CreatableModelMixin):
Expand All @@ -422,7 +426,7 @@ class TrustedUser(MutableBaseModel, CreatableModelMixin):

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


class User(MutableBaseModel, CreatableModelMixin):
Expand All @@ -431,7 +435,7 @@ class User(MutableBaseModel, CreatableModelMixin):

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")


class UserGroup(MutableBaseModel, CreatableModelMixin):
Expand All @@ -440,4 +444,4 @@ class UserGroup(MutableBaseModel, CreatableModelMixin):

@classmethod
def _minimum_server_version(cls):
return LooseVersion("8.0")
return parse("8.0")
8 changes: 6 additions & 2 deletions src/cbapi/protection/rest_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from ..utils import convert_query_params
from ..query import PaginatedQuery
from ..errors import UnauthorizedError, ApiError
from distutils.version import LooseVersion
import sys
if sys.version_info <= (3, 6):
from distutils.version import LooseVersion as parse
else:
from packaging.version import parse


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

log.debug('Connected to Cb server version %s at %s'
% (self._server_info['ParityServerVersion'], self.session.server))
self.cb_server_version = LooseVersion(self._server_info['ParityServerVersion'])
self.cb_server_version = parse(self._server_info['ParityServerVersion'])

def _perform_query(self, cls, **kwargs):
if hasattr(cls, "_query_implementation"):
Expand Down
52 changes: 28 additions & 24 deletions src/cbapi/response/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@

import copy
import json
from distutils.version import LooseVersion
import sys
if sys.version_info <= (3, 6):
from distutils.version import LooseVersion as parse
else:
from packaging.version import parse
from collections import namedtuple, defaultdict
import base64
from datetime import datetime, timedelta
Expand Down Expand Up @@ -656,7 +660,7 @@ def __init__(self, *args, **kwargs):
def _query_implementation(cls, cb):
# ** Disable the paginated query implementation for now **

# if cb.cb_server_version >= LooseVersion("5.2.0"):
# if cb.cb_server_version >= parse("5.2.0"):
# return SensorPaginatedQuery(cls, cb)
# else:
# return SensorQuery(cls, cb)
Expand Down Expand Up @@ -869,7 +873,7 @@ def _update_object(self):

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

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

@classmethod
def _query_implementation(cls, cb):
if cb.cb_server_version >= LooseVersion('5.1.0'):
if cb.cb_server_version >= parse('5.1.0'):
return ThreatReportQuery(cls, cb)
else:
return Query(cls, cb)
Expand Down Expand Up @@ -1524,7 +1528,7 @@ def group_by(self, field_name):
:return: Query object
:rtype: :py:class:`ProcessQuery`
"""
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
if self._cb.cb_server_version >= parse('6.0.0'):
nq = self._clone()
nq._default_args["cb.group"] = field_name
return nq
Expand Down Expand Up @@ -1573,7 +1577,7 @@ def min_last_update(self, v):
:return: Query object
:rtype: :py:class:`ProcessQuery`
"""
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
if self._cb.cb_server_version >= parse('6.0.0'):
nq = self._clone()
try:
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
Expand All @@ -1599,7 +1603,7 @@ def min_last_server_update(self, v):
:return: Query object
:rtype: :py:class:`ProcessQuery`
"""
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
if self._cb.cb_server_version >= parse('6.0.0'):
nq = self._clone()
try:
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
Expand All @@ -1625,7 +1629,7 @@ def max_last_update(self, v):
:return: Query object
:rtype: :py:class:`ProcessQuery`
"""
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
if self._cb.cb_server_version >= parse('6.0.0'):
nq = self._clone()
try:
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
Expand All @@ -1651,7 +1655,7 @@ def max_last_server_update(self, v):
:return: Query object
:rtype: :py:class:`ProcessQuery`
"""
if self._cb.cb_server_version >= LooseVersion('6.0.0'):
if self._cb.cb_server_version >= parse('6.0.0'):
nq = self._clone()
try:
v = v.strftime("%Y-%m-%dT%H:%M:%SZ")
Expand Down Expand Up @@ -2285,7 +2289,7 @@ def parse_guid(self, procguid):
# new 5.x process IDs are hex strings with optional segment IDs.
if len(procguid) == 45:
return procguid[:36], int(procguid[38:], 16)
elif len(procguid) == 49 and self._cb.cb_server_version >= LooseVersion('6.0.0'):
elif len(procguid) == 49 and self._cb.cb_server_version >= parse('6.0.0'):
return procguid[:36], int(procguid[38:], 16)
else:
return None, None
Expand All @@ -2309,7 +2313,7 @@ def __init__(self, cb, procguid, segment=None, max_children=15, initial_data=Non
self.__children_info = None
self.__sibling_info = None

if cb.cb_server_version < LooseVersion('6.0.0'):
if cb.cb_server_version < parse('6.0.0'):
self._default_segment = 1
else:
self._default_segment = 0
Expand All @@ -2322,7 +2326,7 @@ def __init__(self, cb, procguid, segment=None, max_children=15, initial_data=Non
if len(procguid) == 45:
self.id = procguid[:36]
self.current_segment = int(procguid[38:], 16)
elif len(procguid) == 49 and cb.cb_server_version >= LooseVersion('6.0.0'):
elif len(procguid) == 49 and cb.cb_server_version >= parse('6.0.0'):
self.id = procguid[:36]
self.current_segment = int(procguid[38:], 16)
else:
Expand All @@ -2339,14 +2343,14 @@ def __init__(self, cb, procguid, segment=None, max_children=15, initial_data=Non

self._process_summary_api = 'v1'

if cb.cb_server_version >= LooseVersion('6.0.0'):
if cb.cb_server_version >= parse('6.0.0'):
self._process_summary_api = 'v2'
self._process_event_api = 'v4'
self._event_parser = ProcessV4Parser(self)
elif cb.cb_server_version >= LooseVersion('5.2.0'):
elif cb.cb_server_version >= parse('5.2.0'):
self._process_event_api = 'v3'
self._event_parser = ProcessV3Parser(self)
elif cb.cb_server_version >= LooseVersion('5.1.0'):
elif cb.cb_server_version >= parse('5.1.0'):
# CbER 5.1.0 introduced an extended event API
self._process_event_api = 'v2'
self._event_parser = ProcessV2Parser(self)
Expand Down Expand Up @@ -2755,7 +2759,7 @@ def all_events_segment(self):

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

def all_childprocs(self):
if self._cb.cb_server_version < LooseVersion('6.0.0'):
if self._cb.cb_server_version < parse('6.0.0'):
self.get_segments()
segments = self._segments

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

def all_modloads(self):
if self._cb.cb_server_version < LooseVersion('6.0.0'):
if self._cb.cb_server_version < parse('6.0.0'):
self.get_segments()
segments = self._segments

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

def all_filemods(self):
if self._cb.cb_server_version < LooseVersion('6.0.0'):
if self._cb.cb_server_version < parse('6.0.0'):
self.get_segments()
segments = self._segments

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

def all_processblocks(self):
if self._cb.cb_server_version < LooseVersion('6.0.0'):
if self._cb.cb_server_version < parse('6.0.0'):
self.get_segments()
segments = self._segments

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

def all_regmods(self):
if self._cb.cb_server_version < LooseVersion('6.0.0'):
if self._cb.cb_server_version < parse('6.0.0'):
self.get_segments()
segments = self._segments

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

def all_crossprocs(self):
if self._cb.cb_server_version < LooseVersion('6.0.0'):
if self._cb.cb_server_version < parse('6.0.0'):
self.get_segments()
segments = self._segments

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

def all_netconns(self):
if self._cb.cb_server_version < LooseVersion('6.0.0'):
if self._cb.cb_server_version < parse('6.0.0'):
self.get_segments()
segments = self._segments

Expand Down
8 changes: 6 additions & 2 deletions src/cbapi/response/query.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from ..utils import convert_query_params
from ..query import PaginatedQuery
from cbapi.six.moves import urllib
from distutils.version import LooseVersion
import sys
if sys.version_info <= (3, 6):
from distutils.version import LooseVersion as parse
else:
from packaging.version import parse
from ..errors import ApiError
import copy

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

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

def _clone(self):
Expand Down

0 comments on commit 70d2c22

Please sign in to comment.