cloudbase-init/cloudbaseinit/plugins/windows/licensing.py

99 lines
3.8 KiB
Python

# Copyright 2014 Cloudbase Solutions Srl
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_log import log as oslo_logging
from cloudbaseinit import conf as cloudbaseinit_conf
from cloudbaseinit import constant
from cloudbaseinit.osutils import factory as osutils_factory
from cloudbaseinit.plugins.common import base
from cloudbaseinit.utils.windows import licensing
CONF = cloudbaseinit_conf.CONF
LOG = oslo_logging.getLogger(__name__)
class WindowsLicensingPlugin(base.BasePlugin):
def _set_product_key(self, service, manager):
if not CONF.set_kms_product_key and not CONF.set_avma_product_key:
return
description, license_family, is_current = manager.get_kms_product()
if is_current:
LOG.info('Product "%s" is already the current one, no need to set '
'a product key', description)
else:
use_avma = service.get_use_avma_licensing()
if use_avma is None:
use_avma = CONF.set_avma_product_key
LOG.debug("Use AVMA: %s", use_avma)
product_key = None
if use_avma:
product_key = manager.get_volume_activation_product_key(
license_family, constant.VOL_ACT_AVMA)
if not product_key:
LOG.error("AVMA product key not found for this OS")
if not product_key and CONF.set_kms_product_key:
product_key = manager.get_volume_activation_product_key(
license_family, constant.VOL_ACT_KMS)
if not product_key:
LOG.error("KMS product key not found for this OS")
if product_key:
LOG.info("Setting product key: %s", product_key)
manager.set_product_key(product_key)
def _set_kms_host(self, service, manager):
kms_host = service.get_kms_host() or CONF.kms_host
if kms_host:
LOG.info("Setting KMS host: %s", kms_host)
manager.set_kms_host(*kms_host.split(':'))
def _activate_windows(self, service, manager):
# note(alexpilotti): KMS clients activate themselves
# so this could be skipped if a KMS host is set
LOG.info("Activating Windows")
activation_result = manager.activate_windows()
LOG.debug("Activation result:\n%s" % activation_result)
def _log_licensing_info(self, manager):
license_info = manager.get_licensing_info()
LOG.info('Microsoft Windows license info:\n%s' % license_info)
def execute(self, service, shared_data):
osutils = osutils_factory.get_os_utils()
if osutils.is_nano_server():
LOG.info("Licensing info and activation are not available on "
"Nano Server")
return base.PLUGIN_EXECUTION_DONE, False
manager = licensing.get_licensing_manager()
# set kms / avma product keys and kms hosts if any
self._set_product_key(service, manager)
self._set_kms_host(service, manager)
if CONF.activate_windows:
self._activate_windows(service, manager)
if CONF.log_licensing_info:
manager.refresh_status()
self._log_licensing_info(manager)
return base.PLUGIN_EXECUTION_DONE, False