Файл: forsoc.ru/manul/classes/CmsVersionDetector.inc.php
Строк: 308
<?php
/*
Example of usage:
<?php
include 'CmsVersionDetector.inc.php';
$detector = new CmsVersionDetector($argv[1]);
var_dump($detector->getCmsList());
var_dump($detector->getCmsVersions());
?>
*/
define('CMS_BITRIX', 'Bitrix');
define('CMS_WORDPRESS', 'Wordpress');
define('CMS_JOOMLA', 'Joomla');
define('CMS_DLE', 'Data Life Engine');
define('CMS_IPB', 'Invision Power Board');
define('CMS_WEBASYST', 'WebAsyst');
define('CMS_OSCOMMERCE', 'OsCommerce');
define('CMS_DRUPAL', 'Drupal');
define('CMS_MODX', 'MODX');
define('CMS_INSTANTCMS', 'Instant CMS');
define('CMS_PHPBB', 'PhpBB');
define('CMS_VBULLETIN', 'vBulletin');
define('CMS_SHOPSCRIPT', 'PHP ShopScript Premium');
define('CMS_VERSION_UNDEFINED', '0.0');
class CmsVersionDetector
{
private $rootPath;
private $versions;
private $types;
public function __construct($rootPath = '.')
{
$this->rootPath = $rootPath;
$this->versions = array();
$this->types = array();
$version = '';
if ($this->checkBitrix($version)) {
$this->addCms(CMS_BITRIX, $version);
}
if ($this->checkWordpress($version)) {
$this->addCms(CMS_WORDPRESS, $version);
}
if ($this->checkJoomla($version)) {
$this->addCms(CMS_JOOMLA, $version);
}
if ($this->checkDle($version)) {
$this->addCms(CMS_DLE, $version);
}
if ($this->checkIpb($version)) {
$this->addCms(CMS_IPB, $version);
}
if ($this->checkWebAsyst($version)) {
$this->addCms(CMS_WEBASYST, $version);
}
if ($this->checkOsCommerce($version)) {
$this->addCms(CMS_OSCOMMERCE, $version);
}
if ($this->checkDrupal($version)) {
$this->addCms(CMS_DRUPAL, $version);
}
if ($this->checkMODX($version)) {
$this->addCms(CMS_MODX, $version);
}
if ($this->checkInstantCms($version)) {
$this->addCms(CMS_INSTANTCMS, $version);
}
if ($this->checkPhpBb($version)) {
$this->addCms(CMS_PHPBB, $version);
}
if ($this->checkVBulletin($version)) {
$this->addCms(CMS_VBULLETIN, $version);
}
if ($this->checkPhpShopScript($version)) {
$this->addCms(CMS_SHOPSCRIPT, $version);
}
}
function getCmsList()
{
return $this->types;
}
function getCmsVersions()
{
return $this->versions;
}
function getCmsNumber()
{
return count($this->types);
}
function getCmsName($index = 0)
{
return $this->types[$index];
}
function getCmsVersion($index = 0)
{
return $this->versions[$index];
}
private function addCms($type, $version)
{
$this->types[] = $type;
$this->versions[] = $version;
}
private function checkBitrix(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/bitrix')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/bitrix/modules/main/classes/general/version.php'));
if (preg_match('|define("SM_VERSION","(.+?)")|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkWordpress(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/wp-admin')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/wp-includes/version.php'));
if (preg_match('|$wp_versions*=s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkJoomla(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/libraries/joomla')) {
$res = true;
// for 1.5.x
$tmpContent = @implode('', @file($this->rootPath . '/libraries/joomla/version.php'));
if (preg_match('|vars+$RELEASEs*=s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
if (preg_match('|vars+$DEV_LEVELs*=s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version .= '.' . $tmpVer[1];
}
}
// for 1.7.x
$tmpContent = @implode('', @file($this->rootPath . '/includes/version.php'));
if (preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
if (preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version .= '.' . $tmpVer[1];
}
}
// for 2.5.x and 3.x
$tmpContent = @implode('', @file($this->rootPath . '/libraries/cms/version/version.php'));
if (preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
if (preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version .= '.' . $tmpVer[1];
}
}
}
return $res;
}
private function checkDle(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/engine/engine.php')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/engine/data/config.php'));
if (preg_match('|'version_id's*=>s*"(.+?)"|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
$tmpContent = @implode('', @file($this->rootPath . '/install.php'));
if (preg_match('|'version_id's*=>s*"(.+?)"|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkIpb(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/ips_kernel')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/ips_kernel/class_xml.php'));
if (preg_match('|IP.Boards+v([0-9.]+)|si', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkWebAsyst(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/wbs/installer')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/license.txt'));
if (preg_match('|v([0-9.]+)|si', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkOsCommerce(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/includes/version.php')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/includes/version.php'));
if (preg_match('|([0-9.]+)|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkDrupal(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/sites/all')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/CHANGELOG.txt'));
if (preg_match('|Drupals+([0-9.]+)|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkMODX(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/manager/assets')) {
$res = true;
// no way to pick up version
}
return $res;
}
private function checkInstantCms(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/plugins/p_usertab')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/index.php'));
if (preg_match('|InstantCMSs+v([0-9.]+)|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkPhpBb(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/includes/acp')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/config.php'));
if (preg_match('|phpBBs+([0-9.x]+)|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkVBulletin(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/core/admincp')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/core/api.php'));
if (preg_match('|vBulletins+([0-9.x]+)|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
private function checkPhpShopScript(&$version)
{
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->rootPath . '/install/consts.php')) {
$res = true;
$tmpContent = @implode('', @file($this->rootPath . '/install/consts.php'));
if (preg_match('|STRING_VERSION',s*'(.+?)'|smi', $tmpContent, $tmpVer)) {
$version = $tmpVer[1];
}
}
return $res;
}
public function getXMLNode()
{
$cmsNames = $this->getCmsList();
$cmsVersions = $this->getCmsVersions();
$dom = new DOMDocument('1.0', 'utf-8');
$cmsListNode = $dom->createElement('cms_list');
for ($i = 0; $i < count($cmsNames); ++$i) {
$cmsNode = $dom->createElement('cms');
$cmsNode->setAttribute('name', $cmsNames[$i]);
$cmsNode->setAttribute('version', $cmsVersions[$i]);
$cmsListNode->appendChild($cmsNode);
}
$dom->appendChild($cmsListNode);
return $dom->getElementsByTagName('cms_list')->item(0);
}
}