\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/cloudlinux/venv/lib64/python3.11/site-packages/clwizard/modules/

Viewing File: nodejs.py

# coding=utf-8
#
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENCE.TXT
#
import os
from typing import Dict, Iterable  # NOQA

from clcommon.const import Feature
from clcommon.utils import ExternalProgramFailed, get_passenger_package_name
from clwizard.constants import CL_SELECTOR_BIN, MODULES_LOGS_DIR
from clwizard.exceptions import InstallationFailedException, PackageMissingError
from clwizard.modules.base import WizardInstaller
from clwizard.utils import installed_interpreters_list


class NodejsInstaller(WizardInstaller):
    LOG_FILE = os.path.join(MODULES_LOGS_DIR, 'nodejs.log')
    _REQUIRED_CL_COMPONENT_SUPPORT = Feature.NODEJS_SELECTOR

    def _set_default_nodejs_version(self, version):
        # type: (str) -> None
        self.app_logger.info("trying to set default NodeJS version as '%s'", version)
        try:
            self._run_command(
                [
                    CL_SELECTOR_BIN,
                    'set',
                    '--interpreter',
                    'nodejs',
                    '--default-version',
                    version,
                    '--json',
                ]
            )
        except ExternalProgramFailed as e:
            raise InstallationFailedException() from e

    def _set_cloudlinux_selector_status(self, status):
        # type: (str) -> None
        self.app_logger.info("trying to set NodeJS Selector state '%s'", status)
        try:
            self._run_command(
                [
                    CL_SELECTOR_BIN,
                    'set',
                    '--interpreter',
                    'nodejs',
                    '--selector-status',
                    status,
                    '--json',
                ]
            )
        except ExternalProgramFailed as e:
            raise InstallationFailedException() from e

    def _install_nodejs_versions(self, versions):
        # type: (Iterable[str]) -> None
        self.app_logger.info("Trying to install NodeJS versions: %s", ', '.join(versions))
        # Given a version (e.g., '6') construct required package group name
        group_names = ['alt-nodejs' + version for version in versions]
        try:
            self._install_groups(*group_names)
        except ExternalProgramFailed as e:
            raise InstallationFailedException() from e

    def run_installation(self, options):
        default_version = options.get('default_version')  # type: str
        install_versions = options.get('versions', [])

        if default_version and default_version not in install_versions:
            self.app_logger.error(
                "Version %s that was specified to be set as default "
                "must be included in install_versions",
                default_version,
            )
            raise InstallationFailedException()

        self._install_passenger()
        self._install_nodejs_versions(install_versions)
        self._set_cloudlinux_selector_status(status='enabled')

        if default_version:
            self._set_default_nodejs_version(default_version)

    @classmethod
    def supported_options(cls):
        return {'default_version', 'versions'}

    @staticmethod
    def _nodejs_get_default_version():
        # type: () -> str
        try:
            from clselect.clselectctl import get_default_version  # pylint: disable=import-outside-toplevel
        except ImportError as e:
            raise PackageMissingError('lvemanager') from e
        return get_default_version('nodejs')

    def _is_already_configured(self):
        # type: () -> bool
        """
        Checks that nodejs selector is ready to work
        All configurations were done:
        - At least one interpreter version is installed
        - Passenger is installed
        - Nodejs selector is enabled
        :return: bool value configured or not
        """
        return bool(
            any(it.installed for it in installed_interpreters_list('nodejs'))
            and self._is_package_installed(get_passenger_package_name())
            and self._is_nodejs_selector_enabled()
        )

    def initial_status(self):
        # type: () -> Dict
        """
        Return dictionary with two required keys: installed and options.
        This will be used by lvemanager UI to properly display wizard.
        """
        interpreters_list = installed_interpreters_list('nodejs')
        installed_versions = [it.version for it in interpreters_list if it.installed]
        return {
            'already_configured': self._is_already_configured(),
            'options': {
                'default_version': self._nodejs_get_default_version(),
                'installed_versions': installed_versions,
                'available_versions': self._get_available_versions('nodejs'),
            },
        }

    def _is_nodejs_selector_enabled(self):
        # type: () -> bool
        """
        Return True if Nodejs Selector enabled
        :return: bool
        """
        self.app_logger.info("trying to get NodeJS Selector state.")
        try:
            from clselector.selectorlib import CloudlinuxSelectorLib  # pylint: disable=import-outside-toplevel

            return CloudlinuxSelectorLib('nodejs').get_nodejs_selector_status()['selector_enabled']
        except ImportError:
            return False