#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Copyright 2015-2022 Univention GmbH
#
# https://www.univention.de/
#
# All rights reserved.
#
# The source code of this program is made available
# under the terms of the GNU Affero General Public License version 3
# (GNU AGPL V3) as published by the Free Software Foundation.
#
# Binary versions of this program provided by Univention to you as
# well as other copyrighted, protected or trademarked materials like
# Logos, graphics, fonts, specific documentations and configurations,
# cryptographic keys etc. are subject to a license agreement between
# you and Univention and not subject to the GNU AGPL V3.
#
# In the case you use this program under the terms of the GNU AGPL V3,
# the program is provided in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License with the Debian GNU/Linux or Univention distribution in file
# /usr/share/common-licenses/AGPL-3; if not, see
# <https://www.gnu.org/licenses/>.
from __future__ import print_function
import sys
import datetime
from argparse import ArgumentParser, RawDescriptionHelpFormatter
from typing import Optional # noqa: F401
import univention.uldap
[docs]class LicenseCheckError(Exception):
"""Generic error during license check"""
[docs]class LicenseExpired(LicenseCheckError):
"""The license is expired"""
[docs]class LicenseNotFound(LicenseCheckError):
"""The license cannot be found in LDAP"""
[docs]def is_CSP_license(lo=None):
# type: (Optional[univention.uldap.acceess]) -> bool
"""
Function to detect if installed license is a cloud service provider license (CSP).
:param univention.uldap.acceess lo: Optional |LDAP| connection to re-use. Otherwise a new |LDAP| connection with machine credentials is created.
:returns: `True` if a valid CSP license has been found or `False` if a valid non-CSP license has been found.
:raises LicenseNotFound: if no license was found.
:raises LicenseExpired: if the license has expired.
"""
if not lo:
lo = univention.uldap.getMachineConnection()
result = lo.search(filter='(&(objectClass=univentionLicense)(cn=admin))', attr=['univentionLicenseEndDate', 'univentionLicenseOEMProduct'])
if not result:
raise LicenseNotFound()
attrs = result[0][1]
now = datetime.date.today()
enddate = attrs.get('univentionLicenseEndDate', [b'01.01.1970'])[0].decode('ASCII', 'replace')
if not enddate == u'unlimited':
(day, month, year) = enddate.split(u'.', 2)
then = datetime.date(int(year), int(month), int(day))
if now > then:
raise LicenseExpired('endDate = %s' % (enddate,))
return b'CSP' in attrs.get('univentionLicenseOEMProduct', [])
if __name__ == '__main__':
description = '''Checks the installed UCS license and returns an appropriate
exitcode depending on the license status and license type.
Possible exitcodes:
0: UCS license is valid and contains 'CSP' in the list of OEM products
10: UCS license is valid and does not contain 'CSP' in the list of OEM products
11: UCS license is expired
12: UCS license is invalid or not found'''
parser = ArgumentParser(
description=description,
formatter_class=RawDescriptionHelpFormatter
)
parser.parse_args()
try:
result = is_CSP_license()
except LicenseExpired:
print('License expired')
sys.exit(11)
except LicenseNotFound:
print('License not found')
sys.exit(12)
except LicenseCheckError:
print('License verification error')
sys.exit(12)
print('CSP=%s' % (result,))
if not result:
sys.exit(10)
sys.exit(0)