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.
116 lines
5.3 KiB
116 lines
5.3 KiB
# Copyright (C) 2005-2024 Splunk Inc. All Rights Reserved.
|
|
|
|
from splunk_message_handler import SplunkMessageHandler
|
|
from utils import setup_logging
|
|
|
|
|
|
class LicenseManager:
|
|
"""
|
|
Installs and updates ITSI built-in sourcetype licenses.
|
|
Also installs/uninstalls ITSI built-in licenses for suitification signaling to license peers.
|
|
This class is designed to run on LM or self-licensed instance.
|
|
"""
|
|
|
|
def __init__(self, license_api, license_group):
|
|
self.license_api = license_api
|
|
self.license_group = license_group
|
|
self.itsi_licenses = self.license_api.get_itsi_licenses()
|
|
self.log = setup_logging(log_file='itsi_license_checker.log', logger_name='itsi.license_checker.LicenseManager')
|
|
|
|
def internal_license_installed(self):
|
|
return self.license_group.get_itsi_internal_license().among_licenses(self.itsi_licenses)
|
|
|
|
def install_internal_license(self):
|
|
try:
|
|
self._delete_old_internal_license()
|
|
except Exception:
|
|
# we should continue even if the removal of the old license fails
|
|
self.log.exception("Failed to delete old license")
|
|
|
|
self._install_new_internal_license()
|
|
|
|
def _delete_old_internal_license(self):
|
|
"""
|
|
In ITSI 4.6.0, we're updating the license (that ITSI had shipped since ITSI 4.0.0) to a new license
|
|
that uses a new sourcetype. Before we do that, we need to make sure we remove the old license (which
|
|
still uses the old sourcetype).
|
|
"""
|
|
old_license = self.license_group.get_old_itsi_internal_ea_license().resolve_to_real_license(self.itsi_licenses)
|
|
|
|
if old_license is None:
|
|
return
|
|
|
|
self.license_api.remove_license(old_license.name)
|
|
|
|
def _install_new_internal_license(self):
|
|
"""
|
|
For Hulk release (aka 4.0.0) and above, we want to automatically upload our new license
|
|
|
|
As of ITSI 4.6.0, license updated to use a generic "itsi*" sourcetype to accommodate more ITSI sourcetypes
|
|
@return:
|
|
"""
|
|
|
|
self.license_api.install_license(self.license_group.get_itsi_internal_license())
|
|
|
|
def manage_plus_license_marker(self):
|
|
if self._itsi_license_installed():
|
|
if self._plus_suite_signaling_license_installed():
|
|
return
|
|
else:
|
|
self.log.info("ITSI license is installed, but Plus marker is not installed. Installing Plus marker")
|
|
self._install_plus_suite_signaling_license()
|
|
elif self._plus_suite_signaling_license_installed():
|
|
self.log.info("ITSI license is not installed, but Plus marker is installed. Removing Plus marker")
|
|
self._remove_plus_suite_signaling_license()
|
|
|
|
def _itsi_license_installed(self):
|
|
return any(not lic.among_licenses(self.license_group.get_licenses()) for lic in self.itsi_licenses)
|
|
|
|
def _plus_suite_signaling_license_installed(self):
|
|
return self.license_group.get_plus_suite_signaling_license().among_licenses(self.itsi_licenses)
|
|
|
|
def _install_plus_suite_signaling_license(self):
|
|
self.license_api.install_license(self.license_group.get_plus_suite_signaling_license())
|
|
self._notify_plus_suite_activation_delay()
|
|
|
|
def _remove_plus_suite_signaling_license(self):
|
|
plus_license = self.license_group.get_plus_suite_signaling_license().resolve_to_real_license(self.itsi_licenses)
|
|
self.license_api.remove_license(plus_license)
|
|
|
|
def manage_license_expiration_signaling_license(self):
|
|
real_itsi_licenses = list(
|
|
[lic for lic in self.itsi_licenses if not lic.among_licenses(self.license_group.get_licenses())])
|
|
if not real_itsi_licenses:
|
|
self.log.info('No real ITSI license is installed')
|
|
self._remove_license_expiration_signaling_license()
|
|
return
|
|
|
|
# Some Real ITSI licenses are installed
|
|
|
|
if all(not lic.is_valid() for lic in real_itsi_licenses):
|
|
self.log.info('All real ITSI licenses are expired')
|
|
self._install_license_expiration_signaling_license()
|
|
else:
|
|
self.log.info('There are some real ITSI unexpired licenses')
|
|
self._remove_license_expiration_signaling_license()
|
|
|
|
def _remove_license_expiration_signaling_license(self):
|
|
expire_license = self.license_group.get_license_expiration_signaling_license().resolve_to_real_license(
|
|
self.itsi_licenses)
|
|
if expire_license is None:
|
|
return
|
|
self.license_api.remove_license(expire_license)
|
|
|
|
def _install_license_expiration_signaling_license(self):
|
|
expire_license = self.license_group.get_license_expiration_signaling_license().resolve_to_real_license(
|
|
self.itsi_licenses)
|
|
if expire_license is not None:
|
|
return
|
|
self.license_api.install_license(self.license_group.get_license_expiration_signaling_license())
|
|
|
|
def _notify_plus_suite_activation_delay(self):
|
|
message_text = _("An ITSI license has been detected. It can take up to 3 minutes to upgrade to ITSI.") # noqa
|
|
msg_id = 'plus_notification'
|
|
message_handler = SplunkMessageHandler(self.license_api.session_key, self.log)
|
|
message_handler.post_or_update_message(msg_id, SplunkMessageHandler.INFO, message_text)
|