晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/proc/self/root/proc/self/root/opt/cpanel/ea-wappspector/src/Helper/ |
| Current File : //proc/self/root/proc/self/root/opt/cpanel/ea-wappspector/src/Helper/ScanDirectoryIterator.php |
<?php
declare(strict_types=1);
namespace Plesk\Wappspector\Helper;
use FilesystemIterator;
use Plesk\Wappspector\Matchers\CpanelWebApp;
use RecursiveCallbackFilterIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use SplFileInfo;
/**
* Walks the directories under a path, depth-limited, for inspection.
*
* The depth limit is relaxed for one directory: a web application registered by the
* cPanel Web App feature lives in `ea-podman.d/<container>/webapp`, three levels below
* the account home and so deeper than any useful default. Pruning at the limit would
* hide every web application on the server unless the caller knew to raise `--depth`,
* so the two levels under `ea-podman.d` are always descended into. They hold one
* directory per container and are cheap to walk; nothing below them is, and nothing
* below them is descended into either.
*
* One directory is left out of the walk entirely: `ea-podman.d/<container>.bak`, the
* copy a redeploy leaves behind.
*/
final class ScanDirectoryIterator extends RecursiveIteratorIterator
{
/**
* Suffix of the directory a redeploy leaves behind, alongside the container it
* replaced.
*/
private const LEFT_OVER_SUFFIX = '.bak';
private const FLAGS = FilesystemIterator::KEY_AS_PATHNAME
| FilesystemIterator::CURRENT_AS_FILEINFO
| FilesystemIterator::SKIP_DOTS;
public function __construct(string $path, private int $maxDepth)
{
parent::__construct(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator($path, self::FLAGS),
static fn(SplFileInfo $item): bool => !self::isLeftOverContainer($item)
),
self::SELF_FIRST
);
}
public function callHasChildren(): bool
{
if (!parent::callHasChildren()) {
return false;
}
return $this->getDepth() < $this->maxDepth || $this->holdsContainers();
}
/**
* Whether the current directory is `ea-podman.d` itself, or one of the container
* directories directly inside it.
*/
private function holdsContainers(): bool
{
$current = $this->current();
if (!$current instanceof SplFileInfo) {
return false;
}
return $current->getFilename() === CpanelWebApp::CONTAINER_DIR
|| $current->getPathInfo()?->getFilename() === CpanelWebApp::CONTAINER_DIR;
}
/**
* Whether the path is a container's plumbing rather than a place an application
* lives: `ea-podman.d` itself, one of the container directories inside it, or
* anything in a container other than its `webapp` directory.
*
* The walk passes through these to reach the application directories below them,
* but none of them is a document root. Inspecting one reports a container's own
* configuration as though it were a site -- an `index.php` next to the container
* config reads as a PHP site, and the container is listed alongside the
* application it hosts.
*/
public static function isContainerInternals(string $path): bool
{
$parts = explode('/', str_replace('\\', '/', $path));
$containerDir = array_search(CpanelWebApp::CONTAINER_DIR, $parts, true);
if ($containerDir === false) {
return false;
}
$below = array_slice($parts, $containerDir + 1);
return count($below) !== 2 || $below[1] !== CpanelWebApp::APP_DIR;
}
/**
* Whether the item is the container copy a redeploy leaves behind. Such a copy is
* in no registry, so it is not a web application, yet it still holds a full copy of
* the superseded one — reporting what is inside it would report every superseded
* deploy on the server as a live site. It is dropped from the walk, along with
* everything below it.
*
* This exclusion is not a caller preference. Should an `--ignore=<pattern>` option
* ever be added, this one must stay in effect regardless of what the caller passes.
*/
private static function isLeftOverContainer(SplFileInfo $item): bool
{
return $item->isDir()
&& str_ends_with($item->getFilename(), self::LEFT_OVER_SUFFIX)
&& $item->getPathInfo()?->getFilename() === CpanelWebApp::CONTAINER_DIR;
}
}
|