Current File : //opt/cloudlinux/venv/lib/python3.11/site-packages/clconfigure/watcher.py |
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2018 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# https://cloudlinux.com/docs/LICENCE.TXT
#
import logging
import os
import re
import subprocess
import time
from clcommon.lib.cledition import (
CLEditions,
CLEditionDetectionError
)
from lve_utils import PKG_VERSION
PKG_VERSION_TINY = re.sub(r'\.el\w(h?)\.', '.elX.', PKG_VERSION)
# https://cl.sentry.cloudlinux.com/settings/cloudlinux_os/projects/userland
SENTRY_DSN = 'https://9713d1296f804031b058b8f2d789d7ac:' \
'8ddacae32d8246cf8b25cf826bf3fc0a@cl.sentry.cloudlinux.com/12'
LAST_KNOWN_EDITION_CACHE_PATH = '/var/lve/.edition.previous'
SYSTEMID_FILE_PATH = '/etc/sysconfig/rhn/systemid'
# how much time should past after registration
# before we assume that server is "old"
_SECONDS_IN_DAY = 24 * 60 * 60
SYSTEMID_NEW_TIME = 3 * _SECONDS_IN_DAY
def _reconfigure_server(current_edition):
"""
Run reconfiguration script
"""
subprocess.run([
'cloudlinux-customizer',
'reconfigure',
'-t', current_edition], check=True,
text=True, stderr=subprocess.STDOUT
)
# _on_* handlers below are different for the future additional actions
# that will be added with edition switch support
def _on_edition_changed(previous_edition, current_edition):
"""
Called when saved edition does not match current one.
"""
if current_edition in ('shared_pro', 'admin', 'solo'):
_reconfigure_server(current_edition)
def _on_server_newly_registered(current_edition):
"""
Called when saved server id detected as one registered recently
"""
if current_edition in ('shared_pro', 'admin', 'solo'):
_reconfigure_server(current_edition)
def _get_registration_time():
"""
Assume that last registration time is
the date of systemid modification.
"""
try:
return os.path.getmtime(SYSTEMID_FILE_PATH)
except FileNotFoundError:
return None
def _get_last_check_time():
"""
Assume that last check time is equal
to the date of last cache modification.
"""
try:
return os.path.getmtime(LAST_KNOWN_EDITION_CACHE_PATH)
except FileNotFoundError:
return None
def check():
"""
Compares current edition with latest saved in file and
"""
try:
with open(LAST_KNOWN_EDITION_CACHE_PATH) as f:
last_edition = f.read()
except FileNotFoundError:
last_edition = None
registration_time = _get_registration_time()
is_registration_fresh = \
registration_time is not None \
and registration_time >= (time.time() - SYSTEMID_NEW_TIME)
last_check_time = _get_last_check_time()
is_last_check_before_registration = \
(last_check_time is None) or (
registration_time is not None
and last_check_time < registration_time)
current_edition = CLEditions.get_cl_edition()
if is_last_check_before_registration and is_registration_fresh:
_on_server_newly_registered(current_edition)
elif last_edition and last_edition != current_edition:
_on_edition_changed(last_edition, current_edition)
save_edition()
def save_edition():
"""
Stores current edition value in cache file
"""
try:
with open(LAST_KNOWN_EDITION_CACHE_PATH, 'w') as f:
f.write(CLEditions.get_cl_edition(verify_exp=False))
except CLEditionDetectionError as e:
logging.warning('Unable to detect current edition, error=%s', e)