PATH:
usr
/
share
/
lve
/
dbgovernor
/
modules
/
Editing: da.py
#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 # """ This module contains class for managing governor on DirectAdmin server """ import os import shutil from glob import glob from utilities import ( check_file, exec_command, exec_command_out, grep, read_file, remove_packages, write_file, ) from .base import InstallManager class DirectAdminManager(InstallManager): """ Implementation for DA panel """ CONF_FILE_MYSQL = "/usr/local/directadmin/conf/mysql.conf" def update_user_map_file(self): """ Update user mapping file for cPanel """ self._script("dbgovernor_map.py") def _delete(self, installed_packages): """ Remove installed packages """ check_file("/usr/local/directadmin/custombuild/build") print("Removing mysql for db_governor start") self._mysqlservice("stop") # remove governor package exec_command_out("rpm -e governor-mysql") # delete installed packages remove_packages(installed_packages) param = "mysql" if os.path.exists("/usr/share/lve/dbgovernor/da.tp.old"): param = read_file("/usr/share/lve/dbgovernor/da.tp.old") exec_command_out(f"/usr/local/directadmin/custombuild/build set mysql_inst {param}") exec_command_out("/usr/local/directadmin/custombuild/build mysql update") print("Removing mysql for db_governor completed") def _before_install_new_packages(self): """ Specific actions before new packages installation """ print("The installation of MySQL for db_governor has started") check_file("/usr/local/directadmin/custombuild/build") check_file("/usr/local/directadmin/custombuild/options.conf") # MYSQL_DA_TYPE=`cat /usr/local/directadmin/custombuild/options.conf | grep mysql_inst= | cut -d= -f2` try: MYSQL_DA_TYPE = grep("/usr/local/directadmin/custombuild/options.conf", "mysql_inst=")[0].split("=")[1] except IndexError: MYSQL_DA_TYPE = "" if os.path.exists("/usr/share/lve/dbgovernor/da.tp.old"): if MYSQL_DA_TYPE == "no": MYSQL_DA_TYPE = read_file("/usr/share/lve/dbgovernor/da.tp.old") else: write_file("/usr/share/lve/dbgovernor/da.tp.old", MYSQL_DA_TYPE) else: write_file("/usr/share/lve/dbgovernor/da.tp.old", MYSQL_DA_TYPE) exec_command_out("/usr/local/directadmin/custombuild/build set mysql_inst no") self._mysqlservice("stop") def get_mysql_user(self): """ Retrieve MySQL user name and password and save it into self attributes """ if not os.path.exists(self.CONF_FILE_MYSQL): return None try: self.MYSQLUSER = grep(self.CONF_FILE_MYSQL, "user=")[0].split("=")[1] self.MYSQLPASSWORD = grep(self.CONF_FILE_MYSQL, "passwd=")[0].split("=")[1] except IndexError: pass def _after_install_new_packages(self): """ Specific actions after new packages installation """ # call parent after_install InstallManager._after_install_new_packages(self) print("Rebuild php please... /usr/local/directadmin/custombuild/build php") def _get_custombuild_option(self, option_name): """ Get an option from the DirectAdmin custombuild options.conf file """ CUSTOMBUILD_OPTIONS = "/usr/local/directadmin/custombuild/options.conf" option_regex = "{}=".format(option_name) try: option_grep = grep(CUSTOMBUILD_OPTIONS, option_regex) if not option_grep: return None option_value = option_grep[0].split("=")[1].strip() return option_value except IndexError: return None def _detect_version_if_auto(self): """ Detect version of MySQL if mysql.type is auto """ print("Detecting MySQL version for AUTO") try: # We can reach this section before calling _check_mysql_version in # InstallManager.install by calling manager.unsupported_db_version # from install\mysqlgovernor.py # self.prev_version won't be assigned then, try it now if not self.prev_version: self.prev_version = self._check_mysql_version() MYSQL_DA_VER = self.prev_version['full'] print(f'Detected successfully from installed mysql binary: {MYSQL_DA_VER}') except (KeyError, AttributeError): print('Failed to detect from mysql binary, trying to detect from custombuild options') check_file("/usr/local/directadmin/custombuild/build") check_file("/usr/local/directadmin/custombuild/options.conf") # MYSQL_DA_TYPE=`cat /usr/local/directadmin/custombuild/options.conf | grep mysql_inst= | cut -d= -f2` # This parameter is used to indicate what type of DB should be installed. # Typical values are 'mysql', 'mariadb' or 'no'. MYSQL_DA_TYPE = self._get_custombuild_option("mysql_inst") # On newer versions of DirectAdmin, the config parameter used to define MariaDB version is mariadb. # On older ones, both MySQL and MariaDB versions are defined by mysql parameter. if MYSQL_DA_TYPE == "mariadb": MARIADB_DA_VER = self._get_custombuild_option("mariadb") MYSQL_DA_VER = self._get_custombuild_option("mysql") # If we have a specified MariaDB version, we should use it. # Otherwise, fall back to the older approach and use the mysql parameter for MariaDB versions too. if MYSQL_DA_TYPE == "mariadb" and MARIADB_DA_VER: MYSQL_DA_VER = MARIADB_DA_VER if MYSQL_DA_TYPE == "no": if os.path.exists("/usr/share/lve/dbgovernor/da.tp.old"): MYSQL_DA_TYPE = read_file("/usr/share/lve/dbgovernor/da.tp.old") elif os.path.exists("/usr/bin/mysql"): result = exec_command("/usr/bin/mysql -V | grep -c 'MariaDB' -i || true", True) if result == "0": MYSQL_DA_TYPE = "mysql" else: MYSQL_DA_TYPE = "mariadb" print("I got %s and %s" % (MYSQL_DA_VER, MYSQL_DA_TYPE)) mysql_version_map = { "5.0": "mysql50", "5.1": "mysql51", "5.5": "mysql55", "5.6": "mysql56", "5.7": "mysql57", "8.0": "mysql80", "8.4": "mysql84", "10.0.0": "mariadb100", "10.1.1": "mariadb101" } mariadb_version_map = { "11.4": "mariadb1104", "11.04": "mariadb1104", "10.11": "mariadb1011", "10.6": "mariadb106", "10.5": "mariadb105", "10.4": "mariadb104", "10.3": "mariadb103", "10.2": "mariadb102", "10.1": "mariadb101", "10.0": "mariadb100", "5.6": "mariadb100", "5.5": "mariadb100", "10.0.0": "mariadb100", "10.1.1": "mariadb101" } # Double-check that we actually have a valid version and type try: # Did we actually detect a version from the mapping? if not MYSQL_DA_TYPE or not MYSQL_DA_VER: # It's OK not to reraise the exception here, the scenario being handled is different # pylint: disable=raise-missing-from raise AttributeError("MySQL/MariaDB version could not be detected") if MYSQL_DA_TYPE == "mysql": MYSQL_DA_VER = mysql_version_map[MYSQL_DA_VER] elif MYSQL_DA_TYPE == "mariadb": MYSQL_DA_VER = mariadb_version_map[MYSQL_DA_VER] # In case we have a version that is not in the mapping except KeyError as e: raise RuntimeError(f"Unsupported MySQL version: {MYSQL_DA_VER} ({MYSQL_DA_TYPE})") from e return MYSQL_DA_VER def _custom_rpm_locator(self, package_name): """ Where we should download installed MySQL package from. For the special argument value "package_name"=="+" returning "yes" means that this _custom_rpm_locator() implementation is fully functional, and returning any other value means that it's not supported. There could be a lot of packages in /usr/local/directadmin/custombuild/mysql, not all of them relevant (installed) or fine ones (not corrupted) """ if package_name == "+": # supported? return "yes" bad_pkg = False list_of_rpm = glob("/usr/local/directadmin/custombuild/mysql/*.rpm") + glob( "/usr/local/directadmin/scripts/packages/*.rpm") for found_package in list_of_rpm: try: result = exec_command(f"/bin/rpm -qp {found_package}", True) if package_name in result: pkg_name_real = found_package if pkg_name_real != "" and os.path.exists(pkg_name_real): return f"file:{pkg_name_real}" except RuntimeError as e: print(f"Failed to query package {found_package}: {e}\n") bad_pkg = True if bad_pkg: return f"bad_file:{package_name}" else: return "" def _custom_rpm_installer(self, package_name, indicator=False): """ Specific package installer :param package_name: :param indicator: :return: """ if not indicator: exec_command_out(f"/bin/rpm -ihv --force --nodeps {package_name}") return "" else: return "yes" def fix_mysqld_service(self): """ Restore mysqld.service """ try: shutil.copy(self._rel("scripts/mysqld.service"), '/usr/local/directadmin/custombuild/configure/systemd/mysqld.service') print('mysqld.service restored!') except Exception: print('ERROR occurred while attempting to restore mysqld.service!')
SAVE
CANCEL