Your IP : 3.22.70.92


Current Path : /home/bitrix/ext_www/coffe.land/bitrix/modules/bitrixcloud/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/coffe.land/bitrix/modules/bitrixcloud/classes/general/monitoring.php

<?php
IncludeModuleLangFile(__FILE__);
class CBitrixCloudMonitoring
{
	private static $instance = /*.(CBitrixCloudMonitoring).*/ null;
	private $result = /*.(CBitrixCloudMonitoringResult).*/null;
	private $interval = 0;
	/**
	 * Returns proxy class instance (singleton pattern)
	 *
	 * @return CBitrixCloudMonitoring
	 *
	 */
	public static function getInstance()
	{
		if (!isset(self::$instance))
			self::$instance = new CBitrixCloudMonitoring;

		return self::$instance;
	}
	public function getConfiguredDomains()
	{
		$result = array();
		$converter = CBXPunycode::GetConverter();

		$domainName = COption::GetOptionString("main", "server_name", "");
		if ($domainName != "")
			$result[$domainName] = $domainName;

		$by = "";
		$order = "";
		$siteList = CSite::GetList($by, $order, array("ACTIVE"=>"Y"));
		while($site = $siteList->Fetch())
		{
			$domains = explode("\r\n", $site["DOMAINS"]);
			foreach($domains as $domainName)
			{
				if ($domainName != "")
				{
					$punyName = $converter->Encode($domainName);
					if ($punyName !== false)
						$result[$punyName] = $domainName;
				}
			}
		}

		ksort($result);
		return $result;
	}
	public function getList()
	{
		$web_service = new CBitrixCloudMonitoringWebService();
		$xml = $web_service->actionGetList();
		$xml = $xml->SelectNodes("/control/domains");
		if (is_object($xml))
		{
			$result = array();
			$children = $xml->children();
			if (is_array($children))
			{
				foreach($children as $domainXml)
				{
					$name = $domainXml->getAttribute("name");
					$emails = $domainXml->elementsByName("emails");
					$tests = $domainXml->elementsByName("tests");
					$result[] = array(
						"DOMAIN" => $name,
						"IS_HTTPS" => ($domainXml->getAttribute("https") === "true"? "Y": "N"),
						"LANG" => $domainXml->getAttribute("lang"),
						"EMAILS" => (is_array($emails)? explode(",", $emails[0]->textContent()): array()),
						"TESTS" => (is_array($tests)? explode(",", $tests[0]->textContent()): array()),
					);
				}
			}
			return $result;
		}
	}
	public function addDevice($domain, $deviceId)
	{
		if ($deviceId != "")
		{
			$option = CBitrixCloudOption::getOption('monitoring_devices');
			$devices = $option->getArrayValue();
			$devices[] = $domain."|".$deviceId;
			$option->setArrayValue($devices);
		}
	}
	public function deleteDevice($domain, $deviceId)
	{
		if ($deviceId != "")
		{
			$option = CBitrixCloudOption::getOption('monitoring_devices');
			$devices = $option->getArrayValue();
			$index = array_search($domain."|".$deviceId, $devices);
			if ($index !== false)
			{
				unset($devices[$index]);
				$option->setArrayValue($devices);
			}
		}
	}
	public function getDevices($domain)
	{
		$result = array();
		$option = CBitrixCloudOption::getOption('monitoring_devices');
		$devices = $option->getArrayValue();
		foreach($devices as $domain_device)
		{
			if (list ($myDomain, $myDevice) = explode("|", $domain_device, 2))
			{
				if ($myDomain === $domain)
					$result[] = $myDevice;
			}
		}
		return $result;
	}
	/*
	 * Registers new monitoring job with the remote service.
	 * Returns empty string on success.
	 *
	 * @return string
	 *
	 */
	public function startMonitoring($domain, $is_https, $language_id, $emails, $tests)
	{
		try
		{
			$web_service = new CBitrixCloudMonitoringWebService();
			$web_service->actionStart($domain, $is_https, $language_id, $emails, $tests);
			CBitrixCloudMonitoringResult::setExpirationTime(0);
			return "";
		}
		catch (CBitrixCloudException $e)
		{
			return $e->getMessage();//."[".htmlspecialcharsEx($e->getErrorCode())."]";
		}
	}
	/*
	 * Unregisters monitoring job with the remote service.
	 * Returns empty string on success.
	 *
	 * @return string
	 *
	 */
	public function stopMonitoring($domain)
	{
		try
		{
			$web_service = new CBitrixCloudMonitoringWebService();
			$web_service->actionStop($domain);
			CBitrixCloudMonitoringResult::setExpirationTime(0);
			return "";
		}
		catch (CBitrixCloudException $e)
		{
			return $e->getMessage();//."[".htmlspecialcharsEx($e->getErrorCode())."]";
		}
	}
	public function setInterval($interval)
	{
		$interval = intval($interval);
		if (
			$interval != 7
			&& $interval != 30
			&& $interval != 90
			&& $interval != 365
		)
			$interval = 7;
		$this->interval = $interval;
		return $interval;
	}
	public function getInterval()
	{
		if ($this->interval <= 0)
		{
			$this->interval = intval(COption::GetOptionInt("bitrixcloud", "monitoring_interval"));
			if (
				$this->interval != 7
				&& $this->interval != 30
				&& $this->interval != 90
				&& $this->interval != 365
			)
				$this->interval = 7;
		}
		return $this->interval;
	}
	public function getMonitoringResults($interval = false)
	{
		if ($interval === false)
			$interval = $this->getInterval();
		else
			$interval = $this->setInterval($interval);

		if ($this->result === null)
		{
			try
			{
				if (CBitrixCloudMonitoringResult::isExpired())
				{
					$web_service = new CBitrixCloudMonitoringWebService();
					$xml = $web_service->actionGetInfo($interval);
					$domains = $xml->SelectNodes("/control/domains");
					if (is_object($domains))
					{
						$this->result = CBitrixCloudMonitoringResult::fromXMLNode($domains);
						$control = $xml->SelectNodes("/control");
						if (is_object($control))
						{
							$this->result->saveToOptions();
							CBitrixCloudMonitoringResult::setExpirationTime(strtotime($control->getAttribute("expires")));
						}
					}
				}
				else
				{
					$this->result = CBitrixCloudMonitoringResult::loadFromOptions();
				}
			}
			catch (CBitrixCloudException $e)
			{
				CBitrixCloudMonitoringResult::setExpirationTime(time() + 1800);
				return $e->getMessage();//."[".htmlspecialcharsEx($e->getErrorCode())."]";
			}
		}
		return $this->result;
	}
	public function getAlertsCurrentResult()
	{
		$alerts = false;
		if ($this->result)
		{
			$alerts = array();
			foreach ($this->result as $domainName => $domainResult)
			{
				foreach ($domainResult as $testId => $testResult)
				{
					if ($testResult->getStatus() === CBitrixCloudMonitoringResult::RED_LAMP)
						$alerts[$domainName][$testId] = $testId;
				}

				if (isset($alerts[$domainName]))
				{
					ksort($alerts[$domainName]);
					$alerts[$domainName] = implode(",", $alerts[$domainName]);
				}
			}
			ksort($alerts);
		}
		return $alerts;
	}
	public function getAlertsStored()
	{
		return CBitrixCloudOption::getOption("monitoring_alert")->getArrayValue();
	}
	public function storeAlertsCurrentResult()
	{
		$alerts = $this->getAlertsCurrentResult();
		if (is_array($alerts))
		{
			CBitrixCloudOption::getOption("monitoring_alert")->setArrayValue($alerts);
		}
	}
	public function getWorstUptime($testId = "", $domainName = "")
	{
		$result = "";
		$maxDiff = 0;

		if ($this->result)
		{
			if ($domainName === "")
			{
				foreach ($this->result as $domainName => $domainResult)
				{
					foreach ($domainResult as $testId => $testResult)
					{
						if (
							($testId === "" || $testId === $testResult->getName())
							&& $testResult->getStatus() === CBitrixCloudMonitoringResult::RED_LAMP
						)
						{
							$uptime = explode("/", $testResult->getUptime());
							$diff = $uptime[1] - $uptime[0];
							if ($diff > $maxDiff)
							{
								$maxDiff = $diff;
								$result = $testResult->getUptime();
							}
						}
					}
				}
			}
			elseif (is_array($this->result[$domainName]))
			{
				foreach ($this->result[$domainName] as $testId => $testResult)
				{
					if (
						($testId === "" || $testId === $testResult->getName())
						&& $testResult->getStatus() === CBitrixCloudMonitoringResult::RED_LAMP
					)
					{
						$uptime = explode("/", $testResult->getUptime());
						$diff = $uptime[1] - $uptime[0];
						if ($diff > $maxDiff)
						{
							$maxDiff = $diff;
							$result = $testResult->getUptime();
						}
					}
				}
			}
		}

		return $result;
	}

	public static function startMonitoringAgent()
	{
		$monitoring = CBitrixCloudMonitoring::getInstance();
		$rsR = CLanguage::GetById("ru");
		if ($rsR->Fetch())
			$language_id = "ru";
		else
		{
			$rsD = CLanguage::GetById("de");
			if ($rsD->Fetch())
				$language_id = "de";
			else
				$language_id = "en";
		}

		$monitoring->startMonitoring(
			COption::GetOptionString("main", "server_name", ""),
			false,
			$language_id,
			array(
				COption::GetOptionString("main", "email_from", ""),
			),
			array(
				"test_lic",
				"test_domain_registration",
				"test_http_response_time",
			)
		);
		return "";
	}
}