#!/opt/cloudlinux/venv/bin/python3 -sbb
# -*- coding: utf-8 -*-

# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2019 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import os
import subprocess

from future import standard_library
standard_library.install_aliases()
from builtins import *


# Trusted absolute locations of the mysql client, in priority order. We
# probe these explicitly instead of inheriting PATH from the parent
# process: this code runs as root from RPM scriptlets and from the root
# cron, and trusting an inherited PATH would let a writable directory
# anywhere ahead of /usr/bin shadow the real mysql with a planted
# binary. /usr/local/bin/mysql is Plesk's default for some MariaDB
# packages and is kept here so those deployments keep working.
_MYSQL_CANDIDATES = (
    '/usr/bin/mysql',
    '/usr/local/bin/mysql',
)


def _resolve_mysql_binary():
    for path in _MYSQL_CANDIDATES:
        if os.path.isfile(path) and os.access(path, os.X_OK):
            return path
    return None


def _execute(query):
    with open('/etc/psa/.psa.shadow', 'r') as f:
        password = f.readline().rstrip()
    query = query.replace("\n", " ").strip()
    mysql_bin = _resolve_mysql_binary()
    if mysql_bin is None:
        raise RuntimeError(
            "mysql client not found at any of: %s" %
            ", ".join(_MYSQL_CANDIDATES)
        )
    # Custom env without PATH: Popen will execve the absolute path
    # directly without a PATH search, so the child cannot be hijacked
    # via the parent's PATH.
    proc_env = {'MYSQL_PWD': password}
    proc = subprocess.Popen(
        [mysql_bin, '--no-beep', '--skip-column-names', '--user=admin',
         '--execute', query + ';'],
        stdout=subprocess.PIPE,
        text=True,
        bufsize=-1,
        env=proc_env,
    )
    return proc.communicate()[0]


def install_cagefs_module_plesk():
    result = _execute("select * from psa.Modules where name='plesk-cagefs'")
    if result == "":
        _execute("""
            insert into psa.Modules(name, packname, display_name, description, icon)
            values(
                'plesk-cagefs',
                'plesk-cagefs',
                'CageFS',
                'GageFS',
                '/images/modules/plesk-cagefs/addon_CloudLinux_logo2.png'
            )
        """)


def delete_cagefs_module_plesk():
    _execute("delete from psa.Modules where name='plesk-cagefs'")
