You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
3.0 KiB
85 lines
3.0 KiB
# Copyright (C) 2005-2024 Splunk Inc. All Rights Reserved.
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
|
|
class License(object):
|
|
|
|
UNEXPIRED_LICENSE_STATUS = 'VALID'
|
|
|
|
# ****************** WARNING: the FUTURE_LICENSE_STATUS variable is used elsewhere in the code *******************
|
|
# This variable is also defined in /apps/SA-ITOA/package/lib/feature_flagging/splunk_license_state_maintainer.py
|
|
# and should be kept in sync.
|
|
FUTURE_LICENSE_STATUS = 'FROM_THE_FUTURE'
|
|
|
|
def __init__(self,
|
|
guid=None,
|
|
name=None,
|
|
hash=None,
|
|
label=None,
|
|
body=None,
|
|
expiration_time=None,
|
|
status=None,
|
|
group_id=None,
|
|
subgroup_id=None,
|
|
add_ons=None):
|
|
self.guid = guid
|
|
self.name = name
|
|
self.hash = hash
|
|
self.label = label
|
|
self.body = body
|
|
self.expiration_time = expiration_time
|
|
self.status = status
|
|
self.group_id = group_id
|
|
self.subgroup_id = subgroup_id
|
|
self.add_ons = add_ons
|
|
|
|
if self.body is not None:
|
|
self._load_guid_from_body()
|
|
assert self.guid
|
|
|
|
assert self.guid or self.hash, "Either guid or hash should be set"
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, License):
|
|
if other.guid is not None and self.guid is not None:
|
|
return self.guid == other.guid
|
|
elif other.hash is not None and self.hash is not None:
|
|
return self.hash == other.hash
|
|
else:
|
|
assert False, \
|
|
"Either guid or hash should be set for both operands. "\
|
|
"self.guid: {}, other.guid: {}. "\
|
|
"self.hash: {}. other.hash: {}".format(self.guid, other.guid, self.hash, other.hash)
|
|
return False
|
|
|
|
def _load_guid_from_body(self):
|
|
root = ET.fromstring(self.body)
|
|
if self.guid is None:
|
|
self.guid = root.findall("./payload/guid")[0].text
|
|
|
|
def is_valid(self):
|
|
return self.status == self.UNEXPIRED_LICENSE_STATUS
|
|
|
|
def is_from_future(self):
|
|
return self.status == self.FUTURE_LICENSE_STATUS
|
|
|
|
def among_licenses(self, licenses):
|
|
return any(self == lic for lic in licenses)
|
|
|
|
def resolve_to_real_license(self, real_licenses):
|
|
"""
|
|
This method merges the information in this object with a matching real license.
|
|
Real license is the object that was created from the information we had retrieved from Splunk.
|
|
|
|
@type real_licenses: list
|
|
@param real_licenses: License objects created from license information in Splunk
|
|
|
|
@rtype: License
|
|
@return: License object with Splunk license data enhanced with the data in this object.
|
|
"""
|
|
real_license = next((lic for lic in real_licenses if lic == self), None)
|
|
if real_license is not None:
|
|
real_license.name = self.name
|
|
return real_license
|