File manager - Edit - /home/newsbmcs.com/public_html/static/img/logo/Panel.tar
Back
DirectAdmin.php 0000644 00000036237 15030714005 0007446 0 ustar 00 <?php /** ****************************************** * LiteSpeed Web Server Cache Manager * * @author Michael Alegre * @copyright 2019-2024 LiteSpeed Technologies, Inc. * ******************************************* */ namespace Lsc\Wp\Panel; use DirectoryIterator; use Lsc\Wp\Logger; use Lsc\Wp\LSCMException; use Lsc\Wp\WPInstall; class DirectAdmin extends ControlPanel { protected function __construct() { /** @noinspection PhpUnhandledExceptionInspection */ parent::__construct(); } /** * * @since 1.13.2 */ protected function init2() { $this->panelName = 'DirectAdmin'; $this->defaultSvrCacheRoot = '/home/lscache/'; /** @noinspection PhpUnhandledExceptionInspection */ parent::init2(); } protected function initConfPaths() { $this->apacheConf = '/etc/httpd/conf/extra/httpd-includes.conf'; $this->apacheVHConf = '/usr/local/directadmin/data/templates/custom/' . 'cust_httpd.CUSTOM.2.pre'; } /** * * @return string */ protected function serverCacheRootSearch() { if ( !file_exists($this->apacheConf) ) { return ''; } return $this->getCacheRootSetting($this->apacheConf); } /** * * @return string */ protected function vhCacheRootSearch() { $apacheUserdataDir = dirname($this->apacheVHConf); if ( !file_exists($apacheUserdataDir) ) { return ''; } return $this->daVhCacheRootSearch($apacheUserdataDir); } /** * Searches the given directories '.pre' and '.post' files for CacheRoot * setting. * * @param string $confDir Directory to be searched. * * @return string */ public function daVhCacheRootSearch( $confDir ) { if ( !is_dir($confDir) ) { return ''; } $files = new DirectoryIterator($confDir); foreach ( $files as $file ) { $filename = $file->getFilename(); $isPreOrPostFile = ( strlen($filename) > 4 && ( substr_compare($filename, '.pre', -4) === 0 || substr_compare($filename, '.post', -5) === 0 ) ); if ( $isPreOrPostFile ) { $cacheRoot = $this->getCacheRootSetting($file->getPathname()); if ( $cacheRoot != '' ) { return $cacheRoot; } } } return ''; } /** * * @param array $file_contents * @param string $vhCacheRoot * * @return array */ protected function addVHCacheRootSection( array $file_contents, $vhCacheRoot = 'lscache' ) { array_unshift( $file_contents, "<IfModule LiteSpeed>\nCacheRoot $vhCacheRoot\n</IfModule>\n\n" ); return $file_contents; } /** * * @param string $vhConf * @param string $vhCacheRoot * * @throws LSCMException Thrown when mkdir() call fails to create virtual * host conf directory. * @throws LSCMException Thrown when file_put_contents() call fails to * create virtual host conf file. * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->log() call. */ public function createVHConfAndSetCacheRoot( $vhConf, $vhCacheRoot = 'lscache' ) { $vhConfDir = dirname($vhConf); if ( !file_exists($vhConfDir) ) { if ( !mkdir($vhConfDir, 0755) ) { throw new LSCMException( "Failed to create directory $vhConfDir." ); } $this->log("Created directory $vhConfDir", Logger::L_DEBUG); } $bytesWrittenToFile = file_put_contents( $vhConf, "<IfModule Litespeed>\nCacheRoot $vhCacheRoot\n</IfModule>" ); if ( false === $bytesWrittenToFile ) { throw new LSCMException("Failed to create file $vhConf."); } $this->log("Created file $vhConf.", Logger::L_DEBUG); } public function applyVHConfChanges() { exec('/usr/local/directadmin/custombuild/build rewrite_confs'); } /** * * @since 1.13.7 * * @return array[] * * @throws LSCMException Thrown indirectly by Logger::debug() call. */ private function getHttpdConfDocrootMapInfo() { exec( 'grep -hros "DocumentRoot.*\|ServerAlias.*\|ServerName.*" ' . '/usr/local/directadmin/data/users/*/httpd.conf', $lines ); /** * [0]=servername, [1]=serveraliases, [2]=docroot, [3]=servername, etc. * Not unique & not sorted. * * Example: * ServerName www.daruby1.com * ServerAlias www.daruby1.com daruby1.com * DocumentRoot /home/daruby1/domains/daruby1.com/public_html * ServerName www.daruby1.com * ServerAlias www.daruby1.com daruby1.com * DocumentRoot /home/daruby1/domains/daruby1.com/private_html * ServerName www.dauser1.com * ServerAlias www.dauser1.com dauser1.com * DocumentRoot /home/dauser1/domains/dauser1.com/public_html * ServerName www.dauser1.com * ServerAlias www.dauser1.com dauser1.com * DocumentRoot /home/dauser1/domains/dauser1.com/private_html * * @noinspection SpellCheckingInspection */ $docRoots = array(); $curServerName = $curServerAliases = ''; foreach ( $lines as $line ) { if ( $curServerName == '' ) { if ( strpos($line, 'ServerName') === 0 ) { /** * 10 is strlen('ServerName') */ $curServerName = trim(substr($line, 10)); } } elseif ( strpos($line, 'ServerAlias') === 0 ) { /** * 11 is strlen('ServerAlias') */ $curServerAliases = trim(substr($line, 11)); } elseif ( strpos($line, 'DocumentRoot') === 0 ) { /** * 12 is strlen('DocumentRoot') */ $curDocRoot = trim(substr($line, 12), " \n\r\t\v\x00\""); /** * Avoid possible duplicate detections due to * public_html/private_html symlinks. */ if ( !isset($docRoots[$curDocRoot]) && is_dir($curDocRoot) && !is_link($curDocRoot) ) { $docRoots[$curDocRoot] = explode(' ', $curServerAliases); $docRoots[$curDocRoot][] = $curServerName; } /** * Looking for the next data set */ $curServerName = $curServerAliases = ''; } else { Logger::debug("Unused line when preparing docroot map: $line."); } } return $docRoots; } /** * * @since 1.13.7 * * @return array[] * * @throws LSCMException Thrown indirectly by Logger::debug() call. */ private function getOpenlitespeedConfDocrootMapInfo() { exec( 'grep -hros "docRoot.*\|vhDomain.*\|vhAliases.*" ' . '/usr/local/directadmin/data/users/*/openlitespeed.conf', $lines ); /** * [0]=docroot, [1]=servername, [2]=serveraliases, [3]=docroot, etc. * Not unique & not sorted. * * Example: * docRoot /home/test/domains/test.com/public_html * vhDomain test.com * vhAliases www.test.com * docRoot /home/test/domains/test.com/public_html * vhDomain testalias.com * vhAliases www.testalias.com * docRoot /home/test/domains/test.com/private_html * vhDomain test.com * vhAliases www.test.com * docRoot /home/test/domains/test.com/private_html * vhDomain testalias.com * vhAliases www.testalias.com * docRoot /home/test_2/domains/test2.com/public_html * vhDomain test2.com * vhAliases www.test2.com * docRoot /home/test_2/domains/test2.com/private_html * vhDomain test2.com * vhAliases www.test2.com * * @noinspection SpellCheckingInspection */ $docRoots = array(); $curServerName = $curDocRoot = ''; foreach ( $lines as $line ) { if ( $curDocRoot == '' ) { if ( strpos($line, 'docRoot') === 0 ) { /** * 7 is strlen('docRoot') */ $curDocRoot = trim(substr($line, 7)); } } elseif ( strpos($line, 'vhDomain') === 0 ) { /** * 8 is strlen('vhDomain') */ $curServerName = trim(substr($line, 8)); } elseif ( strpos($line, 'vhAliases') === 0 ) { /** * 9 is strlen('vhAliases') */ $curServerAlias = trim(substr($line, 9)); /** * Avoid possible duplicate detections due to * public_html/private_html symlinks. */ if ( is_dir($curDocRoot) && !is_link($curDocRoot) ) { if ( !isset($docRoots[$curDocRoot]) ) { $docRoots[$curDocRoot] = array( $curServerName, $curServerAlias ); } else { if ( !in_array($curServerName, $docRoots[$curDocRoot]) ) { $docRoots[$curDocRoot][] = $curServerName; } if ( !in_array($curServerAlias, $docRoots[$curDocRoot]) ) { $docRoots[$curDocRoot][] = $curServerAlias; } } } /** * Looking for the next data set */ $curDocRoot = $curServerName = ''; } else { Logger::debug("Unused line when preparing docroot map: $line."); } } return $docRoots; } /** * Gets a list of found docroots and associated server names. * Only needed for scan operation. * * @throws LSCMException Thrown indirectly by * $this->getHttpdConfDocrootMapInfo() call. * @throws LSCMException Thrown indirectly by * $this->getOpenlitespeedConfDocrootMapInfo() call. */ protected function prepareDocrootMap() { $docRootMapInfo = $this->getHttpdConfDocrootMapInfo(); $openlitespeedConfDocrootMapInfo = $this->getOpenlitespeedConfDocrootMapInfo(); foreach ( $openlitespeedConfDocrootMapInfo as $oDocRoot => $oDomains ) { if ( !isset($docRootMapInfo[$oDocRoot]) ) { $docRootMapInfo[$oDocRoot] = $oDomains; } else { foreach ( $oDomains as $oDomain ) { if ( !in_array($oDomain, $docRootMapInfo[$oDocRoot]) ) { $docRootMapInfo[$oDocRoot][] = $oDomain; } } } } $roots = array(); $servernames = array(); $index = 0; foreach ( $docRootMapInfo as $docRoot => $domains ) { $domains = array_unique($domains); $roots[$index] = $docRoot; foreach ( $domains as $domain ) { $servernames[$domain] = $index; } $index++; } $this->docRootMap = array( 'docroots' => $roots, 'names' => $servernames ); } /** * Check the user's httpd.conf file for a VirtualHost entry containing a * given servername/docroot combination and return the PHP handler version * if set. * * @param WPInstall $wpInstall * * @return string * * @throws LSCMException Thrown when a valid user data conf file could not * be found. */ protected function getCustomPhpHandlerVer( WPInstall $wpInstall ) { if ( ($serverName = $wpInstall->getServerName()) == null || ($docroot = $wpInstall->getDocRoot()) == null ) { return ''; } $escServerName = str_replace('.', '\.', $serverName); $escDocRoot = str_replace(array('.', '/'), array('\.', '\/'), $docroot); $user = $wpInstall->getOwnerInfo('user_name'); $httpdConfFile = "/usr/local/directadmin/data/users/$user/httpd.conf"; $olsConfFile = "/usr/local/directadmin/data/users/$user/openlitespeed.conf"; if ( file_exists($httpdConfFile) ) { $confFile = $httpdConfFile; $pattern = '/VirtualHost' . '(?:(?!<\/VirtualHost).)*' . "ServerName $escServerName" . '(?:(?!<\/VirtualHost).)*' . "DocumentRoot $escDocRoot" . '(?:(?!<\/VirtualHost).)*' . 'AddHandler.* \.php(\d\d)/sU'; } elseif ( file_exists($olsConfFile) ) { $confFile = $olsConfFile; $pattern = '/virtualHost\s' . '(?:(?!}\s*\n*virtualHost).)*?' . '{' . '(?:(?!}\s*\n*virtualHost).)*?' . "(?:\s|\n)docRoot\s+$escDocRoot(?:\s|\n)" . '(?:(?!}\s*\n*virtualHost).)*?' . "(?:\s|\n)vhDomain\s+$escServerName(?:\s|\n)" . '(?:(?!}\s*\n*virtualHost).)*?' . '(?:\s|\n)scripthandler(?:\s|\n)*{' . '(?:(?!}\s*\n*virtualHost).)*?' . '\sphp(\d\d)(?=\s|\n)/s'; } else { throw new LSCMException('Could not find valid user data conf file'); } if ( preg_match($pattern, file_get_contents($confFile), $m) ) { return $m[1]; } return ''; } /** * * @param WPInstall $wpInstall * * @return string * * @throws LSCMException Thrown indirectly by * $this->getCustomPhpHandlerVer() call. */ public function getPhpBinary( WPInstall $wpInstall ) { $phpBin = '/usr/local/bin/php'; if ( ($ver = $this->getCustomPhpHandlerVer($wpInstall)) != '' ) { $customBin = "/usr/local/php$ver/bin/php"; if ( file_exists($customBin) && is_executable($customBin) ) { $phpBin = $customBin; } } return "$phpBin $this->phpOptions"; } } CustomPanelBase.php 0000644 00000002130 15030714005 0010271 0 ustar 00 <?php /** ****************************************** * LiteSpeed Web Server Cache Manager * * @author LiteSpeed Technologies, Inc. (https://www.litespeedtech.com) * @copyright (c) 2020-2023 * @since 1.10 * ******************************************* */ namespace Lsc\Wp\Panel; abstract class CustomPanelBase extends ControlPanel { /** * The following functions deal with apache configuration files and * server/virtual host cache roots and will never be called in the * CustomPanel context. They are included here to meet abstract function * requirements in parent class ControlPanel. * */ protected function initConfPaths() {} protected function serverCacheRootSearch() {} protected function vhCacheRootSearch() {} protected function addVHCacheRootSection( array $file_contents, $vhCacheRoot = 'lscache' ) {} public function verifyCacheSetup() {} public function createVHConfAndSetCacheRoot( $vhConf, $vhCacheRoot = 'lscache' ) {} public function applyVHConfChanges() {} } ControlPanel.php 0000644 00000074475 15030714005 0007671 0 ustar 00 <?php /** ****************************************** * LiteSpeed Web Server Cache Manager * * @author Michael Alegre * @copyright 2017-2024 LiteSpeed Technologies, Inc. * ******************************************* */ namespace Lsc\Wp\Panel; use DirectoryIterator; use Exception; use Lsc\Wp\Logger; use Lsc\Wp\LSCMException; use Lsc\Wp\Util; use Lsc\Wp\WPInstall; abstract class ControlPanel { /** * @deprecated * * @var string */ const PANEL_CPANEL = 'whm'; /** * @deprecated * * @var string */ const PANEL_PLESK = 'plesk'; /** * @var string */ const PANEL_API_VERSION = '1.17.2'; /** * @since 1.9 * @var int */ const PANEL_API_VERSION_SUPPORTED = 0; /** * @since 1.9 * @var int */ const PANEL_API_VERSION_TOO_LOW = 1; /** * @since 1.9 * @var int */ const PANEL_API_VERSION_TOO_HIGH = 2; /** * @since 1.9 * @var int */ const PANEL_API_VERSION_UNKNOWN = 3; /** * @var int */ const PHP_TIMEOUT = 30; /** * @var string */ const NOT_SET = '__LSC_NOTSET__'; /** * @var string */ protected $panelName = ''; /** * @var string */ protected $phpOptions; /** * @var null|string */ protected $serverCacheRoot; /** * @var null|string */ protected $vhCacheRoot; /** * @var string */ protected $defaultSvrCacheRoot; /** * @var string */ protected $apacheConf; /** * @var string */ protected $apacheVHConf; /** * @var null|array[] 'docroots' => (index => docroots), * 'names' => (servername => index) */ protected $docRootMap = null; /** * @since 1.9.7 * @var string */ protected static $minAPIFilePath = ''; /** * @var null|ControlPanel Object that extends ControlPanel abstract class. */ protected static $instance; /** * * @throws LSCMException Thrown indirectly by $this->init2() call. */ protected function __construct() { $this->init2(); } /** * Temporary function name until existing deprecated public static init() * function is removed. * * @since 1.13.2 * * @throws LSCMException Thrown indirectly by $this->initConfPaths() call. */ protected function init2() { /** * output_handler value cleared to avoid compressed output through * 'ob_gzhandler' etc. */ $this->phpOptions = '-d disable_functions=ini_set -d opcache.enable=0 ' . '-d max_execution_time=' . static::PHP_TIMEOUT . ' -d memory_limit=512M -d register_argc_argv=1 ' . '-d zlib.output_compression=0 -d output_handler= ' . '-d safe_mode=0 -d open_basedir='; $this->initConfPaths(); } /** * Deprecated 02/04/19 as this function will be made private. * Use getClassInstance() with a fully qualified class name as a parameter * instead. * * Sets static::$instance with a new $className instance if it has not been * set already. An exception will be thrown if static::$instance has already * been set to a different class name than the one provided. * * @deprecated * * @param string $className A fully qualified control panel class name. * * @return ControlPanel|null Object that extends ControlPanel abstract * class. * * @throws LSCMException Thrown when unable to include custom panel file. * @throws LSCMException Thrown when class 'CustomPanel' does not extend * class '\Lsc\Wp\Panel\CustomPanelBase'. * @throws LSCMException Re-thrown when "new $className()" call throws an * exception. * @throws LSCMException Thrown when an instance of a different * ControlPanel/CustomPanel extending class has already been created. */ public static function initByClassName( $className ) { if ( static::$instance == null ) { if ( $className == 'custom' ) { $lsws_home = realpath(__DIR__ . '/../../../../'); $customPanelFile = "$lsws_home/admin/lscdata/custom/CustomPanel.php"; if ( ! file_exists($customPanelFile) || ! include_once $customPanelFile ) { throw new LSCMException( "Unable to include file $customPanelFile" ); } $className = '\Lsc\Wp\Panel\CustomPanel'; $isSubClass = is_subclass_of( $className, '\Lsc\Wp\Panel\CustomPanelBase' ); if ( ! $isSubClass ) { throw new LSCMException( 'Class CustomPanel must extend class ' . '\Lsc\Wp\Panel\CustomPanelBase' ); } } try{ static::$instance = new $className(); } catch ( Exception $e ){ throw new LSCMException( "Could not create object with class name $className. " . "Error: {$e->getMessage()}" ); } } else { $instanceClassName = '\\' . get_class(static::$instance); if ( $instanceClassName != $className ) { throw new LSCMException( "Could not initialize $className instance as an instance " . "of another class ($instanceClassName) has already " . 'been created.' ); } } return static::$instance; } /** * Deprecated 01/14/19. Use initByClassName() instead. * * @deprecated * * @param string $name * * @return ControlPanel Object that extends ControlPanel abstract class. * * @throws LSCMException Thrown when static::$instance is not null. * @throws LSCMException Thrown when provided $name is not recognized. * @throws LSCMException Thrown indirectly by static::initByClassName() * call. */ public static function init( $name ) { if ( static::$instance != null ) { throw new LSCMException( 'ControlPanel cannot be initialized twice.' ); } switch ($name) { case static::PANEL_CPANEL: $className = 'CPanel'; break; case static::PANEL_PLESK: $className = 'Plesk'; break; default: throw new LSCMException( "Control panel '$name' is not supported." ); } return static::initByClassName("\Lsc\Wp\Panel\\$className"); } /** * Returns current ControlPanel instance when no $className is given. When * $className is provided, an instance of $className will also be * initialized if it has not yet been initialized already. * * @param string $className Fully qualified class name. * * @return ControlPanel Object that extends ControlPanel abstract class. * * @throws LSCMException Thrown when static::$instance is null. * @throws LSCMException Thrown indirectly by static::initByClassName() * call. */ public static function getClassInstance( $className = '' ) { if ( $className != '' ) { static::initByClassName($className); } elseif ( static::$instance == null ) { throw new LSCMException( 'Could not get instance, ControlPanel not initialized. ' ); } return static::$instance; } /** * Deprecated on 02/06/19. Use getClassInstance() instead. * * @deprecated * * @return ControlPanel Object that extends ControlPanel abstract class. * * @throws LSCMException Thrown indirectly by static::getClassInstance() * call. */ public static function getInstance() { return static::getClassInstance(); } /** * * @param string $serverName * * @return string|null * * @throws LSCMException Thrown indirectly by $this->prepareDocrootMap() * call. */ public function mapDocRoot( $serverName ) { if ( $this->docRootMap == null ) { $this->prepareDocrootMap(); } if ( isset($this->docRootMap['names'][$serverName]) ) { $index = $this->docRootMap['names'][$serverName]; return $this->docRootMap['docroots'][$index]; } // error out return null; } /** * * @return bool * * @throws LSCMException Thrown indirectly by $this->getServerCacheRoot() * call. * @throws LSCMException Thrown indirectly by $this->getVHCacheRoot() call. */ public function areCacheRootsSet() { $ret = true; if ( static::NOT_SET == $this->getServerCacheRoot() ) { $ret = false; } if ( static::NOT_SET == $this->getVHCacheRoot() ) { $ret = false; } return $ret; } /** * * @throws LSCMException Thrown when cache is not enabled for the current * LiteSpeed license. * @throws LSCMException Thrown indirectly by $this->getServerCacheRoot() * call. * @throws LSCMException Thrown indirectly by $this->setServerCacheRoot() * call. * @throws LSCMException Thrown indirectly by $this->getVHCacheRoot() call. * @throws LSCMException Thrown indirectly by $this->setVHCacheRoot() call. */ public function verifyCacheSetup() { if ( !$this->isCacheEnabled() ) { throw new LSCMException( 'LSCache is not included in the current LiteSpeed license. ' . 'Please purchase the LSCache add-on or upgrade to a ' . 'license type that includes LSCache and try again.', LSCMException::E_PERMISSION ); } $restartRequired = false; if ( static::NOT_SET == $this->getServerCacheRoot() ) { $this->setServerCacheRoot(); $restartRequired = true; } if ( static::NOT_SET == $this->getVHCacheRoot() ) { $this->setVHCacheRoot(); $restartRequired = true; } if ( $restartRequired ) { Util::restartLsws(); } } /** * * @param string $vhCacheRoot * * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->writeVHCacheRoot() * call. * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->applyVHConfChanges() * call. */ public function setVHCacheRoot( $vhCacheRoot = 'lscache' ) { $this->log('Attempting to set VH cache root...', Logger::L_VERBOSE); if ( !file_exists($this->apacheVHConf) ) { $this->createVHConfAndSetCacheRoot( $this->apacheVHConf, $vhCacheRoot ); } else { $this->writeVHCacheRoot($this->apacheVHConf, $vhCacheRoot); } $this->vhCacheRoot = $vhCacheRoot; $this->log( "Virtual Host cache root set to $vhCacheRoot", Logger::L_INFO ); if ( $this->vhCacheRoot[0] == '/' && !file_exists($this->vhCacheRoot) ) { /** * 01/29/19: Temporarily create top virtual host cache root * directory to avoid LSWS setting incorrect owner/group and * permissions for the directory outside the cage. */ mkdir(str_replace('/$vh_user', '', $vhCacheRoot), 0755, true); } $this->applyVHConfChanges(); } /** * * @return bool * * @throws LSCMException Thrown when status file is not found. * @throws LSCMException Thrown when status file cannot be read. * */ public function isCacheEnabled() { $statusFile = '/tmp/lshttpd/.status'; if ( !file_exists($statusFile) ) { throw new LSCMException( 'Cannot determine LSCache availability. Please start/switch to ' . 'LiteSpeed Web Server before trying again.', LSCMException::E_PERMISSION ); } if ( ($f = fopen($statusFile, 'r')) === false ) { throw new LSCMException( 'Cannot determine LSCache availability.', LSCMException::E_PERMISSION ); } fseek($f, -128, SEEK_END); $line = fread($f, 128); fclose($f); if ( preg_match('/FEATURES: ([0-9.]+)/', $line, $m) && ($m[1] & 1) == 1 ) { return true; } return false; } /** * return array of docroots, can set index from and batch * * @param int $offset * @param null|int $length * * @return string[] * * @throws LSCMException Thrown indirectly by $this->prepareDocrootMap() * call. */ public function getDocRoots( $offset = 0, $length = null ) { if ( $this->docRootMap == null ) { $this->prepareDocrootMap(); } return array_slice($this->docRootMap['docroots'], $offset, $length); } /** * Used in PleskEscalate. * * @return array[] * * @noinspection PhpUnused * @noinspection PhpDocMissingThrowsInspection */ public function getDocrootMap() { if ( $this->docRootMap == null ) { /** * LSCMException not thrown in Plesk implementation. * @noinspection PhpUnhandledExceptionInspection */ $this->prepareDocrootMap(); } return $this->docRootMap; } /** * * @return string */ public function getDefaultSvrCacheRoot() { return $this->defaultSvrCacheRoot; } /** * * @return string * * @throws LSCMException Thrown indirectly by $this->initCacheRoots() call. */ public function getServerCacheRoot() { if ( $this->serverCacheRoot == null ) { $this->initCacheRoots(); } return $this->serverCacheRoot; } /** * * @return string * * @throws LSCMException Thrown indirectly by $this->initCacheRoots() call. */ public function getVHCacheRoot() { if ( $this->vhCacheRoot == null ) { $this->initCacheRoots(); } return $this->vhCacheRoot; } /** * * @return void * * @throws LSCMException Thrown in some existing implementations. */ abstract protected function initConfPaths(); /** * * @throws LSCMException Thrown in some existing implementations. */ abstract protected function prepareDocrootMap(); /** * * @param WPInstall $wpInstall * * @return string * * @throws LSCMException Thrown in some existing implementations. */ abstract public function getPhpBinary( WPInstall $wpInstall ); /** * Searches the given directories '.conf' files for CacheRoot setting. * * Note: Visibility is public to better accommodate escalation functions. * * @param string $confDir Directory to be searched. * * @return string */ public function cacheRootSearch( $confDir ) { $files = new DirectoryIterator($confDir); foreach ( $files as $file ) { $filename = $file->getFilename(); if ( strlen($filename) > 5 && substr_compare($filename, '.conf', -5) === 0 ) { $cacheRoot = $this->getCacheRootSetting($file->getPathname()); if ( $cacheRoot != '' ) { return $cacheRoot; } } } return ''; } /** * Note: Visibility is public to better accommodate escalation functions. * * @param string $file * * @return string */ public function getCacheRootSetting( $file ) { if ( file_exists($file) ) { $matchFound = preg_match( '/^\s*CacheRoot (.+)/im', file_get_contents($file), $matches ); if ( $matchFound ) { return trim($matches[1]); } } return ''; } /** * Note: Visibility is public to better accommodate escalation functions. * * @return string */ public function getLSWSCacheRootSetting() { $serverConf = __DIR__ . '/../../../../conf/httpd_config.xml'; if ( file_exists($serverConf) ) { $matchFound = preg_match( '!<cacheStorePath>(.+)</cacheStorePath>!i', file_get_contents($serverConf), $matches ); if ( $matchFound ) { return trim($matches[1]); } } return ''; } abstract protected function serverCacheRootSearch(); abstract protected function vhCacheRootSearch(); /** * Checks server and VH conf files for cacheroot settings and populates in * object if found. * * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->log() call. */ protected function initCacheRoots() { $svrCacheRoot = $this->serverCacheRootSearch(); if ( $svrCacheRoot == '' ) { $svrCacheRoot = $this->getLSWSCacheRootSetting(); } $vhCacheRoot = $this->vhCacheRootSearch(); if ( $svrCacheRoot ) { $this->serverCacheRoot = $svrCacheRoot; $this->log( "Server level cache root is $svrCacheRoot.", Logger::L_DEBUG ); } else { $this->serverCacheRoot = static::NOT_SET; $this->log('Server level cache root is not set.', Logger::L_NOTICE); } if ( $vhCacheRoot ) { $this->vhCacheRoot = $vhCacheRoot; $this->log( "Virtual Host level cache root is $vhCacheRoot.", Logger::L_DEBUG ); } else { $this->vhCacheRoot = static::NOT_SET; $this->log( 'Virtual Host level cache root is not set.', Logger::L_INFO ); } } /** * * @param string $msg * @param int $level * * @throws LSCMException Thrown indirectly by Logger::error() call. * @throws LSCMException Thrown indirectly by Logger::warn() call. * @throws LSCMException Thrown indirectly by Logger::notice() call. * @throws LSCMException Thrown indirectly by Logger::info() call. * @throws LSCMException Thrown indirectly by Logger::verbose() call. * @throws LSCMException Thrown indirectly by Logger::debug() call. */ protected function log( $msg, $level ) { $msg = "$this->panelName - $msg"; switch ($level) { case Logger::L_ERROR: Logger::error($msg); break; case Logger::L_WARN: Logger::warn($msg); break; case Logger::L_NOTICE: Logger::notice($msg); break; case Logger::L_INFO: Logger::info($msg); break; case Logger::L_VERBOSE: Logger::verbose($msg); break; case Logger::L_DEBUG: Logger::debug($msg); break; //no default } } /** * * @param string $svrCacheRoot * * @throws LSCMException Thrown directly and indirectly. */ public function setServerCacheRoot( $svrCacheRoot = '' ) { $this->log('Attempting to set server cache root...', Logger::L_VERBOSE); if ( $svrCacheRoot != '' ) { $cacheroot = $svrCacheRoot; } else { $cacheroot = $this->defaultSvrCacheRoot; } $cacheRootLine = "<IfModule LiteSpeed>\nCacheRoot $cacheroot\n</IfModule>\n\n"; if ( !file_exists($this->apacheConf) ) { file_put_contents($this->apacheConf, $cacheRootLine); chmod($this->apacheConf, 0644); $this->log("Created file $this->apacheConf", Logger::L_VERBOSE); } else { if ( !is_writable($this->apacheConf) ) { throw new LSCMException( 'Apache Config is not writeable. No changes made.' ); } if ( !Util::createBackup($this->apacheConf) ) { throw new LSCMException( 'Could not backup Apache config. No changes made.' ); } else { $file_contents = file($this->apacheConf); $pattern = '/^\s*<IfModule +LiteSpeed *>/im'; if ( preg_grep($pattern, $file_contents) ) { if ( preg_grep('/^\s*CacheRoot +/im', $file_contents) ) { $file_contents = preg_replace( '/^\s*CacheRoot +.+/im', "CacheRoot $cacheroot", $file_contents ); } else { $file_contents = preg_replace( '/^\s*<IfModule +LiteSpeed *>/im', "<IfModule LiteSpeed>\nCacheRoot $cacheroot", $file_contents ); } } else { array_unshift($file_contents, $cacheRootLine); } file_put_contents($this->apacheConf, $file_contents); } } $this->serverCacheRoot = $cacheroot; $this->log("Server level cache root set to $cacheroot", Logger::L_INFO); if ( file_exists($cacheroot) ) { exec("/bin/rm -rf $cacheroot"); $this->log( 'Server level cache root directory removed for proper ' . 'permission.', Logger::L_DEBUG ); } } /** * * @param array $file_contents * @param string $vhCacheRoot * * @return array */ abstract protected function addVHCacheRootSection( array $file_contents, $vhCacheRoot = 'lscache' ); /** * * @param string $vhConf * * @throws LSCMException Thrown when virtual host conf file is not * writeable. * @throws LSCMException Thrown when a backup of the virtual host conf file * could not be made. * @throws LSCMException Thrown when "write to virtual host conf file" call * fails. * @throws LSCMException Thrown indirectly by $this->log() call. */ public function writeVHCacheRoot( $vhConf, $vhCacheRoot = 'lscache' ) { if ( !is_writable($vhConf) ) { throw new LSCMException( "Could not write to VH config $vhConf. No changes made.", LSCMException::E_PERMISSION ); } if ( !Util::createBackup($vhConf) ) { throw new LSCMException( "Could not backup Virtual Host config file $vhConf. No " . 'changes made.', LSCMException::E_PERMISSION ); } $file_contents = file($vhConf); if ( preg_grep('/^\s*<IfModule +LiteSpeed *>/im', $file_contents) ) { if ( preg_grep('/^\s*CacheRoot +/im', $file_contents) ) { $modified_contents = preg_replace( '/^\s*CacheRoot +.+/im', "CacheRoot $vhCacheRoot", $file_contents ); } else { $modified_contents = preg_replace( '/^\s*<IfModule +LiteSpeed *>/im', "<IfModule LiteSpeed>\nCacheRoot $vhCacheRoot", $file_contents ); } } else { $modified_contents = $this->addVHCacheRootSection($file_contents, $vhCacheRoot); } if ( file_put_contents($vhConf, $modified_contents) === false ) { throw new LSCMException( "Failed to write to file $vhConf.", LSCMException::E_PERMISSION ); } $this->log("Updated file $vhConf.", Logger::L_DEBUG); } /** * Note: Visibility is public to better accommodate escalation functions. * * @param string $vhConf * @param string $vhCacheRoot */ abstract public function createVHConfAndSetCacheRoot( $vhConf, $vhCacheRoot = 'lscache' ); /** * Note: Visibility is public to better accommodate escalation functions. * * @throws LSCMException Thrown by some implementations. */ abstract public function applyVHConfChanges(); /** * * @since 1.9.7 */ protected static function setMinAPIFilePath() { static::$minAPIFilePath = realpath(__DIR__ . '/../..') . '/MIN_VER'; } /** * * @since 1.9.7 * * @return string */ protected static function getMinAPIFilePath() { if ( static::$minAPIFilePath == '' ) { static::setMinAPIFilePath(); } return static::$minAPIFilePath; } /** * * @since 1.9.7 * @since 1.12 Changed visibility from protected to public. */ public static function populateMinAPIVerFile() { $minVerFile = static::getMinAPIFilePath(); $content = Util::get_url_contents( 'https://www.litespeed.sh/sub/shared/MIN_VER' ); if ( !empty($content) ) { file_put_contents($minVerFile, $content); } else { touch($minVerFile); } } /** * * @since 1.9.7 * * @return string */ protected static function getMinAPIVer() { $minVerFile = static::getMinAPIFilePath(); clearstatcache(); if ( !file_exists($minVerFile) || (time() - filemtime($minVerFile)) > 86400 ) { static::populateMinAPIVerFile(); } if ( ($content = file_get_contents($minVerFile)) !== false ) { return trim($content); } return ''; } /** * * @since 1.9.7 * * @return bool */ public static function meetsMinAPIVerRequirement() { $minAPIVer = static::getMinAPIVer(); if ( $minAPIVer == '' || Util::betterVersionCompare(static::PANEL_API_VERSION, $minAPIVer, '<') ) { return false; } return true; } /** * * @since 1.9 * * @param string $panelAPIVer Shared code API version used by the panel * plugin. * * @return int */ public static function checkPanelAPICompatibility( $panelAPIVer ) { $supportedAPIVers = array( '1.17.2', '1.17.1.1', '1.17.1', '1.17.0.5', '1.17.0.4', '1.17.0.3', '1.17.0.2', '1.17.0.1', '1.17', '1.16.1', '1.16.0.2', '1.16.0.1', '1.16', '1.15.0.1', '1.15', '1.14.5', '1.14.4.1', '1.14.4', '1.14.3.2', '1.14.3.1', '1.14.3', '1.14.2', '1.14.1.2', '1.14.1.1', '1.14.1', '1.14.0.3', '1.14.0.2', '1.14.0.1', '1.14', '1.13.13.1', '1.13.13', '1.13.12', '1.13.11.1', '1.13.11', '1.13.10.2', '1.13.10.1', '1.13.10', '1.13.9', '1.13.8', '1.13.7.1', '1.13.7', '1.13.6', '1.13.5.2', '1.13.5.1', '1.13.5', '1.13.4.4', '1.13.4.3', '1.13.4.2', '1.13.4.1', '1.13.4', '1.13.3.1', '1.13.3', '1.13.2.2', '1.13.2.1', '1.13.2', '1.13.1', '1.13.0.3', '1.13.0.2', '1.13.0.1', '1.13', '1.12', '1.11', '1.10', '1.9.8', '1.9.7', '1.9.6.1', '1.9.6', '1.9.5', '1.9.4', '1.9.3', '1.9.2', '1.9.1', '1.9', '1.8', '1.7', '1.6.1', '1.6', '1.5', '1.4', '1.3', '1.2', '1.1', '1.0' ); if ( Util::betterVersionCompare($panelAPIVer, $supportedAPIVers[0], '>') ) { return static::PANEL_API_VERSION_TOO_HIGH; } elseif ( Util::betterVersionCompare($panelAPIVer, end($supportedAPIVers), '<') ) { return static::PANEL_API_VERSION_TOO_LOW; } elseif ( ! in_array($panelAPIVer, $supportedAPIVers) ) { return static::PANEL_API_VERSION_UNKNOWN; } else { return static::PANEL_API_VERSION_SUPPORTED; } } /** * * @deprecated 1.9 Use checkPanelAPICompatibility() instead. * * @param string $panelAPIVer Shared code API version used by the panel * plugin. * * @return bool */ public static function isPanelAPICompatible( $panelAPIVer ) { $apiCompatStatus = static::checkPanelAPICompatibility($panelAPIVer); if ( $apiCompatStatus != static::PANEL_API_VERSION_SUPPORTED ) { return false; } return true; } } Plesk.php 0000644 00000030124 15030714005 0006326 0 ustar 00 <?php /** ****************************************** * LiteSpeed Web Server Cache Manager * * @author LiteSpeed Technologies, Inc. (https://www.litespeedtech.com) * @copyright (c) 2018-2023 * ******************************************* */ namespace Lsc\Wp\Panel; use Lsc\Wp\Logger; use Lsc\Wp\LSCMException; use Lsc\Wp\Util; use Lsc\Wp\WPInstall; class Plesk extends ControlPanel { /** * * @throws LSCMException Thrown indirectly by parent::__construct() call. */ public function __construct() { parent::__construct(); } /** * * @since 1.13.2 * * @throws LSCMException Thrown indirectly by parent::init2() call. */ protected function init2() { $this->panelName = 'Plesk'; $this->defaultSvrCacheRoot = '/var/www/vhosts/lscache/'; parent::init2(); } /** * More reliable than php_uname('s') * * @return string * * @throws LSCMException Thrown when supported Plesk OS detection command * fails. * @throws LSCMException Thrown when supported OS is not detected. */ public function getPleskOS() { $supportedOsList = array( 'centos', 'virtuozzo', 'cloudlinux', 'redhat', 'rhel', 'ubuntu', 'debian', 'almalinux', 'rocky' ); $cmds = array(); if ( file_exists('/etc/debian_version') ) { return 'debian'; } if ( is_readable('/etc/os-release') ) { $cmds[] = 'grep ^ID= /etc/os-release | cut -d "=" -f2 | xargs'; } if ( is_readable('/etc/lsb-release') ) { $cmds[] = 'grep ^DISTRIB_ID= /etc/lsb-release | cut -d "=" -f2 | xargs'; } if ( is_readable('/etc/redhat-release') ) { $cmds[] = 'cat /etc/redhat-release | awk \'{print $1}\''; } foreach ( $cmds as $cmd ) { if ( !($output = shell_exec($cmd)) ) { throw new LSCMException( 'Supported Plesk OS detection command failed.', LSCMException::E_UNSUPPORTED ); } $OS = trim($output); foreach ( $supportedOsList as $supportedOs ) { if ( stripos($OS, $supportedOs) !== false ) { return $supportedOs; } } } throw new LSCMException( 'Plesk detected with unsupported OS. ' . '(Not CentOS/Virtuozzo/Cloudlinux/RedHat/Ubuntu/Debian/' . 'AlmaLinux/Rocky)', LSCMException::E_UNSUPPORTED ); } /** * * @since 1.13.3 * * @return string */ protected function getVhDir() { $vhDir = '/var/www/vhosts'; $psaConfFile = '/etc/psa/psa.conf'; if ( file_exists($psaConfFile) ) { $ret = preg_match( '/HTTPD_VHOSTS_D\s+(\S+)/', file_get_contents($psaConfFile), $m ); if ( $ret == 1 ) { $vhDir = $m[1]; } } return $vhDir; } /** * * @throws LSCMException Thrown indirectly by $this->getPleskOS() call. */ protected function initConfPaths() { $OS = $this->getPleskOS(); switch ( $OS ) { case 'centos': case 'virtuozzo': case 'cloudlinux': case 'redhat': case 'rhel': case 'almalinux': case 'rocky': $this->apacheConf = '/etc/httpd/conf.d/lscache.conf'; break; case 'ubuntu': $this->apacheConf = '/etc/apache2/conf-enabled/lscache.conf'; break; case 'debian': if ( is_dir('/etc/apache2/conf-enabled') ) { $this->apacheConf = '/etc/apache2/conf-enabled/lscache.conf'; } else { /** * Old location. */ $this->apacheConf = '/etc/apache2/conf.d/lscache.conf'; } break; //no default case } $this->apacheVHConf = '/usr/local/psa/admin/conf/templates' . '/custom/domain/domainVirtualHost.php'; } /** * * @return string */ protected function serverCacheRootSearch() { $apacheConfDir = dirname($this->apacheConf); if ( file_exists($apacheConfDir) ) { return $this->cacheRootSearch($apacheConfDir); } return ''; } /** * * @return string */ protected function vhCacheRootSearch() { if ( file_exists($this->apacheVHConf) ) { return $this->getCacheRootSetting($this->apacheVHConf); } return ''; } /** * * @param array $file_contents * @param string $vhCacheRoot * * @return array */ protected function addVHCacheRootSection( array $file_contents, $vhCacheRoot = 'lscache' ) { return preg_replace( '!^\s*</VirtualHost>!im', "<IfModule Litespeed>\nCacheRoot $vhCacheRoot\n</IfModule>\n" . '</VirtualHost>', $file_contents ); } /** * * @param string $vhConf * @param string $vhCacheRoot * * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->log() call. */ public function createVHConfAndSetCacheRoot( $vhConf, $vhCacheRoot = 'lscache' ) { $vhConfTmpl = '/usr/local/psa/admin/conf/templates/default/domain/' . 'domainVirtualHost.php'; $vhConfDir = dirname($vhConf); if ( !file_exists($vhConfDir) ) { mkdir($vhConfDir, 0755, true); $this->log("Created directory $vhConfDir", Logger::L_DEBUG); } copy($vhConfTmpl, $vhConf); Util::matchPermissions($vhConfTmpl, $vhConf); $this->log( "Copied Virtual Host conf template file $vhConfTmpl to $vhConf", Logger::L_DEBUG ); file_put_contents( $vhConf, preg_replace( '!^\s*</VirtualHost>!im', "<IfModule Litespeed>\nCacheRoot $vhCacheRoot\n</IfModule>" . "\n</VirtualHost>", file($vhConf) ) ); $this->log( "Virtual Host cache root set to $vhCacheRoot", Logger::L_INFO ); } public function applyVHConfChanges() { exec('/usr/local/psa/admin/bin/httpdmng --reconfigure-all'); } /** * Gets a list of found docroots and associated server names. * * Note: This function is repeated in Plesk plugin files to avoid extra * serialize ops etc. This copy is for cli only. */ protected function prepareDocrootMap() { exec( 'grep -hro --exclude="stat_ttl.conf" --exclude="*.bak" ' . '--exclude="last_httpd.conf" ' . '"DocumentRoot.*\|ServerName.*\|ServerAlias.*" ' . "{$this->getVhDir()}/system/*/conf/*", $lines ); /** * [0]=servername, [1]=serveralias, [2]=serveralias, [3]=docroot, etc. * Not unique & not sorted. * * Example: * ServerName "pltest1.com:443" * ServerAlias "www.pltest1.com" * ServerAlias "ipv4.pltest1.com" * DocumentRoot "/var/www/vhosts/pltest1.com/httpdocs" * ServerName "pltest1.com:80" * ServerAlias "www.pltest1.com" * ServerAlias "ipv4.pltest1.com" * DocumentRoot "/var/www/vhosts/pltest1.com/httpdocs" * ServerName "pltest2.com:443" * ServerAlias "www.pltest2.com" * ServerAlias "ipv4.pltest2.com" * DocumentRoot "/var/www/vhosts/pltest2.com/httpdocs" * ServerName "pltest2.com:80" * ServerAlias "www.pltest2.com" * ServerAlias "ipv4.pltest2.com" * DocumentRoot "/var/www/vhosts/pltest2.com/httpdocs" * * @noinspection SpellCheckingInspection */ $x = 0; $names = $tmpDocrootMap = array(); $lineCount = count($lines); while ( $x < $lineCount ) { $matchFound = preg_match('/ServerName\s+"([^"]+)"/', $lines[$x], $m1); if ( !$matchFound ) { /** * Invalid start of group, skip. */ $x++; continue; } $UrlInfo = parse_url( (preg_match('#^https?://#', $m1[1])) ? $m1[1] : "http://$m1[1]" ); $names[] = $UrlInfo['host']; $x++; $pattern = '/ServerAlias\s+"([^"]+)"/'; while ( isset($lines[$x]) && preg_match($pattern, $lines[$x], $m2) ) { $names[] = $m2[1]; $x++; } $pattern = '/DocumentRoot\s+"([^"]+)"/'; if ( isset($lines[$x]) && preg_match($pattern, $lines[$x], $m3) == 1 && is_dir($m3[1]) ) { $docroot = $m3[1]; if ( !isset($tmpDocrootMap[$docroot]) ) { $tmpDocrootMap[$docroot] = $names; } else { $tmpDocrootMap[$docroot] = array_merge($tmpDocrootMap[$docroot], $names); } $x++; } $names = array(); } $index = 0; $roots = $serverNames = array(); foreach ( $tmpDocrootMap as $docroot => $names ) { $roots[$index] = $docroot; $names = array_unique($names); foreach ( $names as $n ) { $serverNames[$n] = $index; } $index++; } $this->docRootMap = array( 'docroots' => $roots, 'names' => $serverNames ); } /** * Check for known Plesk PHP binaries and return the newest available * version among them. * * @since 1.9.6 * * @return string */ protected function getDefaultPhpBinary() { $binaryList = array ( '/opt/plesk/php/8.2/bin/php', '/opt/plesk/php/8.1/bin/php', '/opt/plesk/php/8.0/bin/php', '/opt/plesk/php/7.4/bin/php', '/opt/plesk/php/7.3/bin/php', '/opt/plesk/php/7.2/bin/php', '/opt/plesk/php/7.1/bin/php', '/opt/plesk/php/7.0/bin/php', '/opt/plesk/php/5.6/bin/php', ); foreach ( $binaryList as $binary ) { if ( file_exists($binary)) { return $binary; } } return ''; } /** * * @param WPInstall $wpInstall * * @return string */ public function getPhpBinary( WPInstall $wpInstall ) { $serverName = $wpInstall->getData(WPInstall::FLD_SERVERNAME); if ( $serverName != null ) { $output = shell_exec( 'plesk db -Ne "SELECT s.value ' . 'FROM ((domains d INNER JOIN hosting h ON h.dom_id=d.id) ' . 'INNER JOIN ServiceNodeEnvironment s ' . 'ON h.php_handler_id=s.name) ' . 'WHERE d.name=' . escapeshellarg($serverName) . ' AND s.section=\'phphandlers\'" ' . '| sed -n \'s:.*<clipath>\(.*\)</clipath>.*:\1:p\'' ); if ( $output ) { $binPath = trim($output); } } if ( !empty($binPath) ) { $phpBin = $binPath; } elseif ( ($defaultBinary = $this->getDefaultPHPBinary()) != '' ) { $phpBin = $defaultBinary; } else { $phpBin = 'php'; } return "$phpBin $this->phpOptions"; } } CPanel.php 0000644 00000057704 15030714005 0006427 0 ustar 00 <?php /** ****************************************** * LiteSpeed Web Server Cache Manager * * @author Michael Alegre * @copyright 2017-2023 LiteSpeed Technologies, Inc. * ******************************************* */ namespace Lsc\Wp\Panel; use Lsc\Wp\Logger; use Lsc\Wp\LSCMException; use Lsc\Wp\Util; use Lsc\Wp\WPInstall; class CPanel extends ControlPanel { /** * @var string */ const USER_PLUGIN_INSTALL_SCRIPT = '/usr/local/cpanel/whostmgr/docroot/cgi/lsws/res/ls_web_cache_mgr/install.sh'; /** * @deprecated 1.13.11 Split into paper_lantern and jupiter theme specific * constants. * @since 1.13.2 * @var string */ const USER_PLUGIN_DIR = '/usr/local/cpanel/base/frontend/paper_lantern/ls_web_cache_manager'; /** * @since 1.13.11 * @var string */ const THEME_JUPITER_USER_PLUGIN_DIR = '/usr/local/cpanel/base/frontend/jupiter/ls_web_cache_manager'; /** * @since 1.13.11 * @var string */ const THEME_PAPER_LANTERN_USER_PLUGIN_DIR = '/usr/local/cpanel/base/frontend/paper_lantern/ls_web_cache_manager'; /** * @deprecated 1.13.11 No longer used. * @var string */ const USER_PLUGIN_UNINSTALL_SCRIPT = self::USER_PLUGIN_DIR . '/uninstall.sh'; /** * @since 1.13.11 * @var string */ const USER_PLUGIN_RELATIVE_UNINSTALL_SCRIPT = 'uninstall.sh'; /** * @since 1.13.2 * @var string */ const USER_PLUGIN_BACKUP_DIR = '/tmp/lscp-plugin-tmp'; /** * @since 1.13.11 * @var string */ const USER_PLUGIN_RELATIVE_DATA_DIR = 'data'; /** * @deprecated 1.13.11 * @since 1.13.2 * @var string An old location for cPanel user-end plugin conf file. */ const USER_PLUGIN_CONF_OLD = self::USER_PLUGIN_DIR . '/lswcm.conf'; /** * @since 1.13.11 * @var string */ const USER_PLUGIN_RELATIVE_CONF_OLD = '/lswcm.conf'; /** * @since 1.13.11 * @var string */ const USER_PLUGIN_RELATIVE_CONF_OLD_2 = self::USER_PLUGIN_RELATIVE_DATA_DIR . '/lswcm.conf'; /** * @var string */ const USER_PLUGIN_CONF = '/usr/local/cpanel/3rdparty/ls_webcache_mgr/lswcm.conf'; /** * @var string */ const CPANEL_AUTOINSTALL_DISABLE_FLAG = '/usr/local/cpanel/whostmgr/docroot/cgi/lsws/cpanel_autoinstall_off'; /** * @var string */ const USER_PLUGIN_SETTING_VHOST_CACHE_ROOT = 'vhost_cache_root'; /** * @var string */ const USER_PLUGIN_SETTING_LSWS_DIR = 'lsws_dir'; /** * @deprecated 1.13.11 Never used. * @since 1.13.2 * @var string */ protected $cpanelPluginDataDir; /** * @deprecated 1.13.11 Never used. * @since 1.13.2 * @var string */ protected $cpanelPluginTplDir; /** * @deprecated 1.13.11 Never used. * @since 1.13.2 * @var string */ protected $cpanelPluginCustTransDir; /** * @deprecated 1.13.11 Never used. * @since 1.13.2 * @var string */ protected $tmpCpanelPluginDataDir; /** * @since 1.13.2 * @var string */ protected $tmpCpanelPluginTplDir; /** * @since 1.13.2 * @var string */ protected $tmpCpanelPluginCustTransDir; protected function __construct() { /** @noinspection PhpUnhandledExceptionInspection */ parent::__construct(); } /** * * @since 1.13.2 */ protected function init2() { $this->panelName = 'cPanel/WHM'; $this->defaultSvrCacheRoot = '/home/lscache/'; $this->tmpCpanelPluginTplDir = self::USER_PLUGIN_BACKUP_DIR . '/landing'; $this->tmpCpanelPluginCustTransDir = self::USER_PLUGIN_BACKUP_DIR . '/cust'; /** @noinspection PhpUnhandledExceptionInspection */ parent::init2(); } protected function initConfPaths() { $this->apacheConf = '/etc/apache2/conf.d/includes/pre_main_global.conf'; $this->apacheVHConf = '/etc/apache2/conf.d/userdata/lscache_vhosts.conf'; } /** * * @return string */ protected function serverCacheRootSearch() { if ( file_exists($this->apacheConf) ) { return $this->getCacheRootSetting($this->apacheConf); } return ''; } /** * * @return string */ protected function vhCacheRootSearch() { $apacheUserdataDir = dirname($this->apacheVHConf); if ( file_exists($apacheUserdataDir) ) { return $this->cacheRootSearch($apacheUserdataDir); } return ''; } /** * * @param array $file_contents * @param string $vhCacheRoot * * @return array */ protected function addVHCacheRootSection( array $file_contents, $vhCacheRoot = 'lscache' ) { array_unshift( $file_contents, "<IfModule LiteSpeed>\nCacheRoot $vhCacheRoot\n</IfModule>\n\n" ); return $file_contents; } /** * * @param string $vhConf * @param string $vhCacheRoot * * @throws LSCMException Thrown when virtual host conf directory cannot be * created. * @throws LSCMException Thrown when virtual host conf file cannot be * created. * @throws LSCMException Thrown indirectly by $this->log() call. * @throws LSCMException Thrown indirectly by $this->log() call. */ public function createVHConfAndSetCacheRoot( $vhConf, $vhCacheRoot = 'lscache' ) { $vhConfDir = dirname($vhConf); if ( !file_exists($vhConfDir) ) { if ( !mkdir($vhConfDir, 0755) ) { throw new LSCMException( "Failed to create directory $vhConfDir." ); } $this->log("Created directory $vhConfDir", Logger::L_DEBUG); } $vhConfFileCreated = ( file_put_contents( $vhConf, "<IfModule Litespeed>\nCacheRoot $vhCacheRoot\n</IfModule>" ) !== false ); if ( !$vhConfFileCreated ) { throw new LSCMException("Failed to create file $vhConf."); } $this->log("Created file $vhConf.", Logger::L_DEBUG); } /** * * @throws LSCMException Thrown indirectly by * self::UpdateCpanelPluginConf() call. */ public function applyVHConfChanges() { exec('/scripts/ensure_vhost_includes --all-users'); if ( file_exists(self::THEME_JUPITER_USER_PLUGIN_DIR) || file_exists(self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR) ) { self::UpdateCpanelPluginConf( self::USER_PLUGIN_SETTING_VHOST_CACHE_ROOT, $this->vhCacheRoot ); } } /** * Gets a list of found docroots and associated server names. * Only needed for scan logic. * * @throws LSCMException Thrown when an error is encountered by * preg_split() call on trimmed $line value. * @throws LSCMException Thrown indirectly by Logger::debug() call. * * @noinspection SpellCheckingInspection */ protected function prepareDocrootMap() { exec( 'grep -hro ' . '--exclude="cache" --exclude="main" --exclude="*.cache" ' . '"documentroot.*\|serveralias.*\|servername.*" ' . '/var/cpanel/userdata/*', $lines ); /** * [0]=docroot, [1]=serveraliases, [2]=servername, [3]=docroot, etc. * Not unique & not sorted. * * Example: * documentroot: /home/user1/finches * serveralias: finches.com mail.finches.com www.finches.com www.finches.user1.com cpanel.finches.com autodiscover.finches.com whm.finches.com webmail.finches.com webdisk.finches.com * servername: finches.user1.com * documentroot: /home/user1/public_html/dookoo * serveralias: www.dookoo.user1.com * servername: dookoo.user1.com * documentroot: /home/user1/public_html/doo/doo2 * serveralias: www.doo2.user1.com * servername: doo2.user1.com * documentroot: /home/user1/finches * serveralias: finches.com mail.finches.com www.finches.com www.finches.user1.com * servername: finches.user1.com */ $cur = ''; $docroots = array(); foreach ( $lines as $line ) { if ( $cur == '' ) { if ( strpos($line, 'documentroot:') === 0 ) { /** * 13 is strlen('documentroot:') */ $cur = trim(substr($line, 13)); if ( !isset($docroots[$cur]) ) { if ( is_dir($cur) ) { $docroots[$cur] = ''; } else { /** * bad entry ignore */ $cur = ''; } } } } elseif ( strpos($line, 'serveralias:') === 0 ) { /** * 12 is strlen('serveralias:') */ $docroots[$cur] .= substr($line, 12); } elseif ( strpos($line, 'servername:') === 0 ) { /** * 11 is strlen('servername:') */ $docroots[$cur] .= substr($line, 11); /** * looking for the next docroot */ $cur = ''; } else { Logger::debug("Unused line when preparing docroot map: $line."); } } $roots = array(); $servernames = array(); $index = 0; foreach ( $docroots as $docroot => $line ) { $names = preg_split('/\s+/', trim($line), -1, PREG_SPLIT_NO_EMPTY); if ( $names === false ) { throw new LSCMException( 'prepareDocrootMap(): Error encountered when calling ' . 'preg_split() on trimmed $line.' ); } $names = array_unique($names); $roots[$index] = $docroot; foreach ( $names as $n ) { $servernames[$n] = $index; } $index++; } $this->docRootMap = array( 'docroots' => $roots, 'names' => $servernames ); } /** * * @param WPInstall $wpInstall * * @return string */ public function getPhpBinary( WPInstall $wpInstall ) { /** * cPanel php wrapper should accurately detect the correct binary in * EA4 when EA4 only directive '--ea-reference-dir' is provided. */ return '/usr/local/bin/php ' . "--ea-reference-dir={$wpInstall->getPath()}/wp-admin " . $this->phpOptions; } /** * * @return bool */ public static function isCpanelPluginAutoInstallOn() { if ( file_exists(self::CPANEL_AUTOINSTALL_DISABLE_FLAG) ) { return false; } return true; } /** * * @return bool */ public static function turnOnCpanelPluginAutoInstall() { if ( !file_exists(self::CPANEL_AUTOINSTALL_DISABLE_FLAG) ) { return true; } return unlink(self::CPANEL_AUTOINSTALL_DISABLE_FLAG); } /** * * @return bool */ public static function turnOffCpanelPluginAutoInstall() { return touch(self::CPANEL_AUTOINSTALL_DISABLE_FLAG); } /** * * @return string * * @throws LSCMException Thrown when unable to find cPanel user-end plugin * installation script. * @throws LSCMException Thrown when failing to back up cPanel user-end * plugin data files. * @throws LSCMException Thrown indirectly by * self::backupCpanelPluginDataFiles() call. * @throws LSCMException Thrown indirectly by Logger::error() call. */ public function installCpanelPlugin() { if ( !file_exists(self::USER_PLUGIN_INSTALL_SCRIPT) ) { throw new LSCMException( 'Unable to find cPanel user-end plugin installation script.' . ' Please ensure that the LiteSpeed WHM plugin is already ' . 'installed.' ); } $existingInstall = ( file_exists(self::THEME_JUPITER_USER_PLUGIN_DIR) || file_exists(self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR) ); if ( $existingInstall ) { if ( !self::backupCpanelPluginDataFiles() ) { throw new LSCMException( 'Failed to backup cPanel user-end plugin data files. ' . 'Aborting install/update operation.' ); } exec(self::USER_PLUGIN_INSTALL_SCRIPT); if ( !self::restoreCpanelPluginDataFiles() ) { Logger::error( 'Failed to restore cPanel user-end plugin data files.' ); } } else { exec(self::USER_PLUGIN_INSTALL_SCRIPT); self::turnOnCpanelPluginAutoInstall(); } $this->updateCoreCpanelPluginConfSettings(); return ($existingInstall) ? 'update' : 'new'; } /** * * @since 1.13.2 * @since 1.13.2.2 Made function static. * @since 1.13.5.2 Removed optional param $oldLogic. * * @return bool * * @throws LSCMException Thrown when failing to create a temporary backup * directory. */ protected static function backupCpanelPluginDataFiles() { if ( file_exists(self::THEME_JUPITER_USER_PLUGIN_DIR) ) { $pluginDir = self::THEME_JUPITER_USER_PLUGIN_DIR; } elseif ( file_exists(self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR) ) { $pluginDir = self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR; } else { return false; } if ( file_exists(self::USER_PLUGIN_BACKUP_DIR) ) { Util::rrmdir(self::USER_PLUGIN_BACKUP_DIR); } if ( !mkdir(self::USER_PLUGIN_BACKUP_DIR, 0755) ) { throw new LSCMException( 'Failed to make temporary directory ' . self::USER_PLUGIN_BACKUP_DIR ); } /** * Move existing conf file (if needed), templates, and custom * translations to temp directory and remove default template dir to * prevent overwriting when moving back. */ $activeConfFile = self::getInstalledCpanelPluginActiveConfFileLocation($pluginDir); if ( $activeConfFile == '' || !file_exists($activeConfFile) ) { return false; } $backupCmds = ''; if ( $activeConfFile != self::USER_PLUGIN_CONF ) { $backupCmds .= "/bin/mv $activeConfFile " . self::USER_PLUGIN_BACKUP_DIR . '/;'; } $tmpCpanelPluginCustTransDir = self::USER_PLUGIN_BACKUP_DIR . '/cust'; $backupCmds .= '/bin/mv ' . "$pluginDir/landing " . self::USER_PLUGIN_BACKUP_DIR . '/;' . "/bin/rm -rf " . self::USER_PLUGIN_BACKUP_DIR . '/landing/default;' . '/bin/mv ' . "$pluginDir/lang/cust $tmpCpanelPluginCustTransDir;" . "/bin/rm -rf $tmpCpanelPluginCustTransDir/README"; exec($backupCmds); return true; } /** * * @since 1.13.2 * @since 1.13.2.2 Made function static. * @since 1.13.5.2 Removed optional param $oldLogic. * * @return bool */ protected static function restoreCpanelPluginDataFiles() { $pluginInstalls = array(); if ( file_exists(self::THEME_JUPITER_USER_PLUGIN_DIR) ) { $pluginInstalls[] = self::THEME_JUPITER_USER_PLUGIN_DIR; } if ( file_exists(self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR) ) { $pluginInstalls[] = self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR; } if ( !file_exists(self::USER_PLUGIN_BACKUP_DIR) || empty($pluginInstalls) ) { return false; } $tmpCpanelPluginConfFile = self::USER_PLUGIN_BACKUP_DIR . '/lswcm.conf'; foreach ( $pluginInstalls as $pluginInstall ) { $cpanelPluginLangDir = "$pluginInstall/lang"; if (!file_exists($cpanelPluginLangDir)) { mkdir($cpanelPluginLangDir, 0755); } if ( file_exists($tmpCpanelPluginConfFile) ) { $activeConfFile = self::getInstalledCpanelPluginActiveConfFileLocation( $pluginInstall ); if ($activeConfFile == '') { return false; } copy($tmpCpanelPluginConfFile, $activeConfFile); chmod($activeConfFile, 0644); } /** * Replace cPanel plugin templates, custom translations. */ exec( '/bin/cp -prf ' . self::USER_PLUGIN_BACKUP_DIR . "/landing $pluginInstall/;" . '/bin/cp -prf ' . self::USER_PLUGIN_BACKUP_DIR . "/cust $cpanelPluginLangDir/" ); } exec('/bin/rm -rf ' . self::USER_PLUGIN_BACKUP_DIR); return true; } /** * * @since 1.13.2.2 Made function static. * * @throws LSCMException Thrown when unable to find the uninstallation * script. */ public static function uninstallCpanelPlugin() { $jupiterUninstallFile = self::THEME_JUPITER_USER_PLUGIN_DIR . '/' . self::USER_PLUGIN_RELATIVE_UNINSTALL_SCRIPT; $paperLanternUninstallFile = self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR . '/' . self::USER_PLUGIN_RELATIVE_UNINSTALL_SCRIPT; if ( file_exists($jupiterUninstallFile) ) { $uninstallFile = $jupiterUninstallFile; } elseif ( file_exists($paperLanternUninstallFile) ) { $uninstallFile = $paperLanternUninstallFile; } else { throw new LSCMException( 'Unable to find cPanel user-end plugin uninstallation script. ' . 'Plugin may already be uninstalled.' ); } exec($uninstallFile); self::turnOffCpanelPluginAutoInstall(); } /** * Attempt to update core cPanel plugin settings used for basic plugin * operation to the currently discovered values. * * @since 1.13.2.2 * @since 1.13.5 Changed function visibility to public. * * @throws LSCMException Thrown indirectly by * self::UpdateCpanelPluginConf() call. * @throws LSCMException Thrown indirectly by $this->getVHCacheRoot() call. * @throws LSCMException Thrown indirectly by * self::UpdateCpanelPluginConf() call. */ public function updateCoreCpanelPluginConfSettings() { self::UpdateCpanelPluginConf( self::USER_PLUGIN_SETTING_LSWS_DIR, realpath(__DIR__ . '/../../../..') ); self::UpdateCpanelPluginConf( self::USER_PLUGIN_SETTING_VHOST_CACHE_ROOT, $this->getVHCacheRoot() ); } /** * * @since 1.13.2.2 Made function static. * * @param string $setting * @param mixed $value * * @throws LSCMException Thrown when unable to determine active cPanel * user-end plugin conf file location usually indicating that the * cPanel user-end plugin is not currently installed. * @throws LSCMException Thrown when unable to create cPanel user-end * plugin "data" directory for older versions of the cPanel user-end * plugin that require this directory. */ public static function UpdateCpanelPluginConf( $setting, $value ) { $pluginInstalls = array(); if ( file_exists(self::THEME_JUPITER_USER_PLUGIN_DIR) ) { $pluginInstalls[] = self::THEME_JUPITER_USER_PLUGIN_DIR; } else { $pluginInstalls[] = self::THEME_PAPER_LANTERN_USER_PLUGIN_DIR; } foreach ( $pluginInstalls as $pluginInstall ) { $activeConfFile = self::getInstalledCpanelPluginActiveConfFileLocation( $pluginInstall ); if ( $activeConfFile == '' ) { throw new LSCMException( 'Unable to determine active conf file location for cPanel ' . 'user-end plugin. cPanel user-end plugin is likely ' . 'not installed.' ); } if ( !file_exists($activeConfFile) ) { $oldConf = ''; if ( file_exists("$pluginInstall/" . self::USER_PLUGIN_RELATIVE_CONF_OLD_2) ) { $oldConf = "$pluginInstall/" . self::USER_PLUGIN_RELATIVE_CONF_OLD_2; } elseif ( file_exists("$pluginInstall/" . self::USER_PLUGIN_RELATIVE_CONF_OLD) ) { $oldConf = "$pluginInstall/" . self::USER_PLUGIN_RELATIVE_CONF_OLD; } if ( $oldConf != '' ) { $dataDir = "$pluginInstall/" . self::USER_PLUGIN_RELATIVE_DATA_DIR; if ( $activeConfFile == "$pluginInstall/" . self::USER_PLUGIN_RELATIVE_CONF_OLD_2 && !file_exists($dataDir) && !mkdir($dataDir) ) { throw new LSCMException( "Failed to create directory $dataDir." ); } copy($oldConf, $activeConfFile); } } if ( file_exists($activeConfFile) ) { chmod($activeConfFile, 0644); switch ( $setting ) { case self::USER_PLUGIN_SETTING_LSWS_DIR: $pattern = '/LSWS_HOME_DIR = ".*"/'; $replacement = "LSWS_HOME_DIR = \"$value\""; break; case self::USER_PLUGIN_SETTING_VHOST_CACHE_ROOT: $pattern = '/VHOST_CACHE_ROOT = ".*"/'; $replacement = "VHOST_CACHE_ROOT = \"$value\""; break; default: return; } $content = file_get_contents($activeConfFile); if ( preg_match($pattern, $content) ) { file_put_contents( $activeConfFile, preg_replace($pattern, $replacement, $content) ); } else { file_put_contents( $activeConfFile, $replacement, FILE_APPEND ); } } } } /** * * @since 1.13.11 * * @param string $pluginDir * * @return string */ protected static function getInstalledCpanelPluginActiveConfFileLocation( $pluginDir ) { $versionFile = "$pluginDir/VERSION"; if ( file_exists($versionFile) ) { $verGreaterThan2_1_2_2 = Util::betterVersionCompare( file_get_contents($versionFile), '2.1.2.2', '>' ); if ( $verGreaterThan2_1_2_2 ) { return self::USER_PLUGIN_CONF; } } if ( file_exists("$pluginDir/" . self::USER_PLUGIN_RELATIVE_DATA_DIR) ) { return "$pluginDir/" . self::USER_PLUGIN_RELATIVE_CONF_OLD_2; } if ( file_exists($pluginDir) ) { return "$pluginDir/" . self::USER_PLUGIN_RELATIVE_CONF_OLD; } return ''; } } CustomPanel.php 0000644 00000004767 15030736205 0007526 0 ustar 00 <?php /** ****************************************** * LiteSpeed Web Server Cache Manager * * @author LiteSpeed Technologies, Inc. (https://www.litespeedtech.com) * @copyright (c) 2020 * ******************************************* */ namespace Lsc\Wp\Panel; use Lsc\Wp\WPInstall; class CustomPanel extends CustomPanelBase { protected function __construct() { /** * Panel name can be set to whatever you'd like. */ $this->panelName = 'customPanel'; /** @noinspection PhpUnhandledExceptionInspection */ parent::__construct(); } /** * * @since 1.13.2 */ protected function init2() { $this->panelName = 'customPanel'; /** @noinspection PhpUnhandledExceptionInspection */ parent::init2(); } /** * Gets a list of found docroots and associated server names. * Only needed for lscmctl 'scan' command. */ protected function prepareDocrootMap() { /** * This function can be left as is if you do not intend to use * the lscmctl 'scan' command. In this case lscmctl command * 'addinstalls' can be used to add WordPress installations to the * custom data file instead. * * If you would like to add support for the lscmctl 'scan' command, * implement this function so that it searches for all document root, * server name, and server alias groups and uses this information to * populate $this->docRootMap as follows: * * array( * 'docroots' => array(index => docroot), * 'names' => array("server name/alias" => index) * ); * * Where the value of each discovered servername/alias in the 'names' * array matches the index of the related document root in the * 'docroots' array. */ $this->docRootMap = array('docroots' => array(), 'names' => array()); } /** * This function returns the PHP binary to be used when performing * WordPress related actions for the WordPress installation associated with * the passed in WPInstall object. * * @param WPInstall $wpInstall * @return string */ public function getPhpBinary( WPInstall $wpInstall ) { /** * If PHP binary $phpBin can be more accurately detected for the given * installation, do so here. */ $phpBin = 'php'; return "{$phpBin} {$this->phpOptions}"; } }
| ver. 1.4 |
Github
|
.
| PHP 8.2.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings