#!/opt/alt/python37/bin/python3 -bb
# -*- coding: utf-8 -*-
"""
This script used for apply cpanel package changes to lve config
"""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import os
import sys
import time

from clcommon.utils import is_root_or_exit

import cldetectlib as detect
import lvectllib

LIBDIR = "/usr/share/l.v.e-manager/cpanel/lib"
SCRIPT_NAME = __file__.split("/")[-1]

sys.path.append(LIBDIR)
from packages import save_package, LVE_CONFIG, PKG_DIR, QUOTA_CONFIG
from clcommon.lib.cledition import lve_supported_or_exit
import logging
import logging.handlers

def setup_system_log():
    """
    Sets syslog logger and returns its handler
    """
    logger = logging.getLogger(SCRIPT_NAME)
    logger.setLevel(logging.INFO)
    syslogger = logging.handlers.SysLogHandler(address='/dev/log')
    formatter = logging.Formatter(fmt='%(levelname)s %(message)s')
    syslogger.setFormatter(formatter)
    logger.addHandler(syslogger)
    return logger


@lve_supported_or_exit
def main():
    is_root_or_exit()
    if not detect.is_cpanel():
        sys.exit(0)
    logger = setup_system_log()
    try:
        lvectllib.init()
        lvectllib.get_XML_cfg()
        minute_before = time.time() - 60.0 * 5
        lve_mtime = os.path.getmtime(LVE_CONFIG)
        if os.path.exists(QUOTA_CONFIG):
            quotas_mtime = os.path.getmtime(QUOTA_CONFIG)
        else:
            quotas_mtime = float("inf")
    except Exception as e:
        logger.error(e)
        sys.exit(1)

    exit_status = 0
    for pkg_name in os.listdir(PKG_DIR):
        file_path = os.path.join(PKG_DIR, pkg_name)
        if not os.path.isfile(file_path):
            continue
        pkg_mtime = os.path.getmtime(file_path)
        if pkg_mtime > minute_before or pkg_mtime > lve_mtime or pkg_mtime > quotas_mtime:
            try:
                save_package(pkg_name)
            except Exception as e:
                exit_status = 1
                logger.error(f'Error while processing package data file {file_path}:\n{str(e)}\n')
                continue
    sys.exit(exit_status)


if "__main__" == __name__:
    main()
