PageRenderTime 54ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/Base/Service/Common.php

https://github.com/ilyich/iqyou
PHP | 957 lines | 708 code | 122 blank | 127 comment | 152 complexity | ca7ae9acb6796a8df7cb48465a950bb1 MD5 | raw file
  1. <?php
  2. class Base_Service_Common
  3. {
  4. const SALT = 'af<o!?sf$i>US3;4%+AEGd#Q-z';
  5. const SCRIPT_SERVERS_CONFIG_TEXT = 'var/script-servers-details.txt';
  6. const STATIC_SERVERS_CONFIG_TEXT = 'var/static-servers-details.txt';
  7. const VIRTSTAGE_SERVERS_CONFIG_TEXT = 'var/virtstages-servers-details.txt';
  8. const IS_OUR_IP_COOKIE = 'ourip';
  9. const GROUP_MCKEY = 'script_server_group';
  10. const SCRIPT_SERVERS_NEW_SCHEMA = 0;
  11. const MEMCACHE_SCRIPT_SERVERS_KEY = 'common_scriptservers';
  12. const LEMON_SCRIPT_SERVERS_PREFIX = 'common_scriptservers';
  13. const LEMON_SCRIPT_SERVERS_KEY = 1;
  14. private static $isOurIp = null;
  15. private static $needProjectSync;
  16. public static function isOurPerson()
  17. {
  18. if (self::$isOurIp !== null) {
  19. return self::$isOurIp;
  20. }
  21. if (isset($_COOKIE['disableIsOurIp']) && $_COOKIE['disableIsOurIp'] == 1) {
  22. self::$isOurIp = false;
  23. return false;
  24. }
  25. $uid = 0;
  26. $isUserKnown = false;
  27. if (class_exists('Base_Context')) {
  28. $currentUserGlobal = Base_Context::getInstance()->getUser();
  29. if ($currentUserGlobal) {
  30. $uid = $currentUserGlobal->getId();
  31. $isUserKnown = true;
  32. }
  33. } else {
  34. $uid = (isset($GLOBALS['requestUserId']) ? $GLOBALS['requestUserId'] : @$_GET['userId']);
  35. }
  36. $isRealOurIp = self::isRealOurIp();
  37. $ourIds = Base_Service_Acl::getAdminIds();
  38. $isOurIp = ($isRealOurIp || (in_array($uid, $ourIds))) ? true : false;
  39. // Êåøèðóåì çíà÷åíèå òîëüêî ïîëå òîãî, êàê îïðåäåëåí òåêóùèé þçåð, èíà÷å âñå ñëîìàåòñÿ
  40. if ($isUserKnown) {
  41. self::$isOurIp = $isOurIp;
  42. }
  43. return $isOurIp;
  44. }
  45. private static function logOurPerson()
  46. {
  47. $data = array('HTTP_X_REAL_IP' => @$_SERVER['HTTP_X_REAL_IP'], 'REMOTE_ADDR' => @$_SERVER['REMOTE_ADDR'], 'UID' => @$_COOKIE['uid'],
  48. 'HTTP_REFERER' => @$_SERVER['HTTP_REFERER'], 'REQUEST_URI' => @$_SERVER['REQUEST_URI'],
  49. );
  50. Base_Service_Log::log('ourperson', array(serialize($data)));
  51. }
  52. /**
  53. * Ñóòü ôóíêöèè íèêàê íå ñîîòíîñèòñÿ ñ åå íàçâàíèåì. Íà ñàìîì äåëå, îíà âêëþ÷àåò ðàçíûå îïöèè,
  54. * âêëþ÷åííûå òîëüêî äëÿ òåñòîâîãî ðåæèìà.
  55. */
  56. public static function isOurIp()
  57. {
  58. // âêëþ÷åíèå ïî êóêå
  59. if (!isset($_COOKIE[self::IS_OUR_IP_COOKIE]) || $_COOKIE[self::IS_OUR_IP_COOKIE] != 1) {
  60. return false;
  61. }
  62. return self::isOurPerson();
  63. }
  64. //public static function is
  65. public static function isRealOurIp($ip = false)
  66. {
  67. if ($ip) {
  68. $realIp = $ip;
  69. } else {
  70. $realIp = self::getRealIp();
  71. }
  72. $isOurIp = ((
  73. $realIp == '127.0.0.1'
  74. || strpos($realIp, '192.168.1.33') === 0
  75. || !PRODUCTION) ? true : false);
  76. if ($realIp == '10.13.177.109') {
  77. $isOurIp = false;
  78. }
  79. return $isOurIp;
  80. }
  81. /**
  82. * @deprecated use Base_Model_User::isAdmin() instead
  83. */
  84. public static function isAdminId($userId)
  85. {
  86. return self::isOurId($userId);
  87. }
  88. /**
  89. * @deprecated use Base_Model_User::isAdmin() instead
  90. *
  91. * Check user ID. For testing purpose
  92. *
  93. * @param Int $id
  94. * @return bool
  95. */
  96. public static function isOurId($id)
  97. {
  98. return in_array($id, Base_Service_Acl::getAdminIds());
  99. }
  100. /**
  101. * Returns user IP
  102. *
  103. * @return string
  104. */
  105. public static function getRealIp()
  106. {
  107. return isset($_SERVER['HTTP_X_REAL_IP']) ? $_SERVER['HTTP_X_REAL_IP'] : $_SERVER['REMOTE_ADDR'];
  108. }
  109. public static function getRealIpWithOpera()
  110. {
  111. $userAgent = Base_Context::getInstance()->getRequest()->getServer('HTTP_USER_AGENT');
  112. $xForward = Base_Context::getInstance()->getRequest()->getServer('HTTP_X_FORWARDED_FOR');
  113. if ($userAgent && $xForward) {
  114. if(preg_match("/Opera Mini/i", $userAgent))
  115. {
  116. preg_match_all("|([0-9]{1,3}\.){3}[0-9]{1,3}|",$xForward,$arr_ip);
  117. $ip = $arr_ip[0][0];
  118. if(!empty($ip)) {
  119. return $ip;
  120. }
  121. }
  122. }
  123. return self::getRealIp();
  124. }
  125. /**
  126. * Âîçâðàùàåò õåø, çàâèñÿùèé îò IP àäðåñà
  127. */
  128. public static function getIpHash($ip)
  129. {
  130. $salt = 'N3v3rG0nNaG1v3youUp';
  131. return Utf::substr(md5($ip . $salt), -8);
  132. }
  133. /**
  134. * Âîçâðàùàåò ñïèñîê ñêðèïòîâûõ ñåðâåðîâ
  135. *
  136. * @return array
  137. */
  138. public static function getScriptServers($upOnly = false,
  139. $skipMemcache = false,
  140. $includeTestLangServer = false, /* âðåìåíûé êîñòûëü äëÿ òåñòîâ */
  141. $includeControlServer = false,
  142. $includeVirtualStages = false /* Âêëþ÷èòü ëè â âûâîä âèðòóàëüíûå ñòåéäæè? Þçàåòñÿ äëÿ SQ */)
  143. {
  144. $cacheKey = self::MEMCACHE_SCRIPT_SERVERS_KEY;
  145. $serversGroups = Base_Service_Memcache::get(self::GROUP_MCKEY, __METHOD__);
  146. if(self::SCRIPT_SERVERS_NEW_SCHEMA) {
  147. $servers = self::_getScriptServers($skipMemcache);
  148. } else {
  149. $servers = $skipMemcache ? false : Base_Service_Memcache::get($cacheKey, __METHOD__);
  150. if (!$servers) {
  151. $serversString = @file(self::SCRIPT_SERVERS_CONFIG_TEXT);
  152. $serversString = $serversString ? $serversString : array();
  153. $servers = array();
  154. foreach ($serversString as $serverInfo) {
  155. $info = explode('|', $serverInfo);
  156. if (count($info) >= 4) {
  157. $servers[$info[0]] = array('ip' => $info[0],
  158. 'extIp' => $info[1],
  159. 'name' => $info[2],
  160. 'status' => (int)$info[3],
  161. 'nginx' => (int)@$info[4],
  162. );
  163. }
  164. }
  165. if (self::isControlServer()) {
  166. // êëþ÷ â ìåìêåøå ñòàâèòñÿ òîëüêî ñ zz. òàê êàê òàì êîíôèã àêòóàëüíûé âñåãäà.
  167. Base_Service_Memcache::setOnAllHost($cacheKey, $servers, 86400 * 7);
  168. }
  169. }
  170. }
  171. if ($upOnly) {
  172. foreach ($servers as $key => $serverInfo) {
  173. if ($includeControlServer && ($serverInfo['name'] == 'control-server' || $serverInfo['name'] == 'control-server2')) {
  174. continue;
  175. }
  176. if ($serverInfo['status'] !== 1) {
  177. unset($servers[$key]);
  178. }
  179. }
  180. }
  181. foreach ($servers as $ip => $server) {
  182. $servers[$ip]['group'] = isset($serversGroups[$ip]) ? $serversGroups[$ip] : '';
  183. }
  184. /*
  185. // îòêëþ÷àåì äî ëó÷øèõ âðåìåí
  186. if (PRODUCTION && $includeTestLangServer) {
  187. $servers['10.13.177.177'] = array('ip' => '10.13.177.177',
  188. 'extIp' => '91.210.7.40',
  189. 'name' => 'Qiped-script-01',
  190. 'status' => 1,
  191. 'nginx' => 0,
  192. );
  193. }
  194. */
  195. if ($includeVirtualStages) {
  196. $servers += self::getVirtualStageServers($upOnly, $skipMemcache);
  197. }
  198. return $servers;
  199. }
  200. /**
  201. * Âîçâðàùàåò ñïèñîê ñêðèïòîâûõ ñåðâåðîâ
  202. *
  203. * @return array
  204. */
  205. public static function getScriptServers2($upOnly = false,
  206. $skipMemcache = false,
  207. $includeTestLangServer = false, /* âðåìåíûé êîñòûëü äëÿ òåñòîâ */
  208. $includeControlServer = false,
  209. $includeVirtualStages = false, /* Âêëþ÷èòü ëè â âûâîä âèðòóàëüíûå ñòåéäæè? Þçàåòñÿ äëÿ SQ */
  210. $forceControlsExclude = false)
  211. {
  212. $cacheKey = self::MEMCACHE_SCRIPT_SERVERS_KEY;
  213. $serversGroups = Base_Service_Memcache::get(self::GROUP_MCKEY, __METHOD__);
  214. if (self::SCRIPT_SERVERS_NEW_SCHEMA) {
  215. $servers = self::_getScriptServers($skipMemcache);
  216. } else {
  217. $servers = $skipMemcache ? false : Base_Service_Memcache::get($cacheKey, __METHOD__);
  218. if (!$servers) {
  219. Base_Service_Log::text('case', 'test_log_zz');
  220. $serversString = @file(self::SCRIPT_SERVERS_CONFIG_TEXT);
  221. $serversString = $serversString ? $serversString : array();
  222. $servers = array();
  223. foreach ($serversString as $serverInfo) {
  224. $info = explode('|', $serverInfo);
  225. if (count($info) >= 4) {
  226. $servers[$info[0]] = array('ip' => $info[0],
  227. 'extIp' => $info[1],
  228. 'name' => $info[2],
  229. 'status' => (int)$info[3],
  230. 'nginx' => (int)@$info[4],
  231. );
  232. }
  233. }
  234. if (self::isControlServer()) {
  235. // êëþ÷ â ìåìêåøå ñòàâèòñÿ òîëüêî ñ zz. òàê êàê òàì êîíôèã àêòóàëüíûé âñåãäà.
  236. Base_Service_Memcache::setOnAllHost($cacheKey, $servers, 86400 * 7);
  237. }
  238. }
  239. }
  240. if ($upOnly) {
  241. foreach ($servers as $key => $serverInfo) {
  242. if (($serverInfo['name'] == 'control-server' || $serverInfo['name'] == 'control-server2')) {
  243. if ($includeControlServer) {
  244. continue;
  245. } elseif ($forceControlsExclude) {
  246. unset($servers[$key]);
  247. continue;
  248. }
  249. }
  250. if ($serverInfo['status'] !== 1) {
  251. unset($servers[$key]);
  252. }
  253. }
  254. }
  255. foreach ($servers as $ip => $server) {
  256. $servers[$ip]['group'] = isset($serversGroups[$ip]) ? $serversGroups[$ip] : '';
  257. }
  258. /*
  259. // îòêëþ÷àåì äî ëó÷øèõ âðåìåí
  260. if (PRODUCTION && $includeTestLangServer) {
  261. $servers['10.13.177.177'] = array('ip' => '10.13.177.177',
  262. 'extIp' => '91.210.7.40',
  263. 'name' => 'Qiped-script-01',
  264. 'status' => 1,
  265. 'nginx' => 0,
  266. );
  267. }
  268. */
  269. if ($includeVirtualStages) {
  270. $servers += self::getVirtualStageServers($upOnly, $skipMemcache);
  271. }
  272. return $servers;
  273. }
  274. /**
  275. * Ïîëó÷åíèå êîíôèãà ñêðèïòîâûõ ñåðâåðîâ èç memcache/lemon
  276. *
  277. * @param bool $ignoreMemcache
  278. *
  279. * @return array|bool
  280. */
  281. private function _getScriptServers($ignoreMemcache = false)
  282. {
  283. $config = false;
  284. if (!$ignoreMemcache) {
  285. $config = Base_Service_Memcache::get(self::MEMCACHE_SCRIPT_SERVERS_KEY . '_2', __METHOD__);
  286. }
  287. if ($config === false) {
  288. $config = Base_Service_Lemon::get(
  289. __METHOD__, self::LEMON_SCRIPT_SERVERS_PREFIX . '_2', self::LEMON_SCRIPT_SERVERS_KEY
  290. );
  291. }
  292. if ($config === false) {
  293. $config = Base_Service_Lemon2::get(
  294. __METHOD__, self::LEMON_SCRIPT_SERVERS_PREFIX . '_2', self::LEMON_SCRIPT_SERVERS_KEY
  295. );
  296. }
  297. return $config;
  298. }
  299. /**
  300. * Ïðîâåðÿåò äîñòóïíîñòü è ðàáîòîñïîñîáíîñòü øàðåíûõ î÷åðåäåé íà âèðòóàëüíûõ ñåðâåðàõ.
  301. *  ñëó÷àå ôýéëà îäíîãî èç íèõ îáíîâëÿåò ñòàòóñ â ôàéëå è ìåìêýøå
  302. */
  303. public static function checkVitualStageServers()
  304. {
  305. if (!self::isControlServer()) {
  306. return;
  307. }
  308. $servers = self::getVirtualStageServers();
  309. $async = new Base_Util_AsyncHttp();
  310. $async->options = array(
  311. CURLOPT_TIMEOUT => 1
  312. );
  313. foreach ($servers as $intIp => $server) {
  314. $async->get('http://' . $intIp . '/fast/sharedtesting/monitoring.php?ip=' . $intIp, null, null, $intIp);
  315. }
  316. $statusChanged = array();
  317. for ($i = 0; $i < 2; $i++) {
  318. foreach ($async->execute() as $intIp => $response) {
  319. $failed = ($response['error'] || $response['info']['http_code'] != 200 || strpos($response['output'], 'OK') === false);
  320. $sName = isset($servers[$intIp]['name']) ? $servers[$intIp]['name'] : '???';
  321. $newStatus = null;
  322. if ($failed && $servers[$intIp]['status'] != 0) {
  323. $newStatus = $servers[$intIp]['status'] = 0;
  324. } elseif (!$failed && $servers[$intIp]['status'] != 1) {
  325. $newStatus = $servers[$intIp]['status'] = 1;
  326. }
  327. if ($newStatus !== null) {
  328. if (isset($statusChanged[$intIp]) && $statusChanged[$intIp]['status'] != $newStatus) {
  329. unset($statusChanged[$intIp]);
  330. } elseif ($i == 0) { // çàïèñûâàåì òîëüêî åñëè ñòàòóñ ïîìåíÿëñÿ ïðè ïåðâîì çàïóñêå
  331. $statusChanged[$intIp] = array(
  332. 'name' => $sName,
  333. 'status' => $newStatus,
  334. 'http_code' => $response['info']['http_code'],
  335. 'response' => $response['output'],
  336. 'error' => $response['error']
  337. );
  338. }
  339. }
  340. }
  341. sleep(2); // ñïèì ñåêóíäó ïåðåä ñëåäóþùèì çàïóñêîì
  342. }
  343. if (!empty($statusChanged)) {
  344. $logMsg = '%s [%s] is turned %s; http_code: %s; response: %s; error: %s';
  345. $nagiosMsg = '/usr/local/bin/notify-nagios %s \'SQ Check\' %s';
  346. self::saveServersFile($servers, self::VIRTSTAGE_SERVERS_CONFIG_TEXT);
  347. foreach ($statusChanged as $intIp => $data) {
  348. Base_Service_Log::text(vsprintf($logMsg, array(
  349. $intIp,
  350. $data['name'],
  351. ($data['status'] == 0 ? 'off' : 'on'),
  352. $data['http_code'],
  353. $data['response'],
  354. $data['error']
  355. )), 'log_cron_vstages');
  356. exec(vsprintf($nagiosMsg, array(
  357. strtolower($data['name']),
  358. ($data['status'] == 0 ? 'WARNING "WARNING: switched OFF from SQ list"' : 'OK "Switched ON to SQ list"')
  359. )));
  360. }
  361. }
  362. return count($statusChanged);
  363. }
  364. /**
  365. * Îáíîâëÿåò ôàéëèê ñåðâåðàìè
  366. * @param $servers
  367. * @param $file
  368. * @return mixed
  369. */
  370. private static function saveServersFile($servers, $file)
  371. {
  372. if ($servers) {
  373. @rename($file . '.4.bak', $file . '.5.bak');
  374. @rename($file . '.3.bak', $file . '.4.bak');
  375. @rename($file . '.2.bak', $file . '.3.bak');
  376. @rename($file . '.1.bak', $file . '.2.bak');
  377. @rename($file, $file . '.1.bak');
  378. @unlink($file);
  379. foreach ($servers as $server) {
  380. file_put_contents($file, $server['ip'] . '|' . $server['extIp'] . '|' . $server['name'] . '|' . $server['status'] . '|' . $server['nginx'] . "\n", FILE_APPEND);
  381. }
  382. chmod($file, 0660);
  383. }
  384. if ($file == Base_Service_Common::VIRTSTAGE_SERVERS_CONFIG_TEXT) {
  385. Base_Service_Memcache::delete('virtual_stageservers');
  386. Base_Service_Common::getVirtualStageServers(false, true);
  387. }
  388. return $servers;
  389. }
  390. /**
  391. * Âîçâðàùàåò ñïèñîê ñåðâåðîâ âèðòóàëüíûõ ñòåéäæåé
  392. *
  393. * @return array
  394. */
  395. public static function getVirtualStageServers($upOnly = false, $skipMemcache = false)
  396. {
  397. $cacheKey = 'virtual_stageservers';
  398. $servers = $skipMemcache ? false : Base_Service_Memcache::get($cacheKey, __METHOD__);
  399. if (!$servers) {
  400. $serversString = @file(self::VIRTSTAGE_SERVERS_CONFIG_TEXT);
  401. $serversString = $serversString ? $serversString : array();
  402. $servers = array();
  403. foreach ($serversString as $serverInfo) {
  404. $info = explode('|', $serverInfo);
  405. if (count($info) >= 4) {
  406. $servers[$info[0]] = array('ip' => $info[0],
  407. 'extIp' => $info[1],
  408. 'name' => $info[2],
  409. 'status' => (int)$info[3],
  410. 'nginx' => (int)@$info[4],
  411. );
  412. }
  413. }
  414. if (self::isControlServer()) {
  415. // êëþ÷ â ìåìêåøå ñòàâèòñÿ òîëüêî ñ zz. òàê êàê òàì êîíôèã àêòóàëüíûé âñåãäà.
  416. Base_Service_Memcache::setOnAllHost($cacheKey, $servers, 86400 * 7);
  417. }
  418. }
  419. if ($upOnly) {
  420. foreach ($servers as $key => $serverInfo) {
  421. if ($serverInfo['status'] !== 1) {
  422. unset($servers[$key]);
  423. }
  424. }
  425. }
  426. foreach ($servers as $ip => $server) {
  427. $servers[$ip]['group'] = 'V-stage';
  428. }
  429. return $servers;
  430. }
  431. private static function getStaticConfigCacheKey()
  432. {
  433. return 'common_staticservers';
  434. }
  435. public static function cacheStaticServersConfig($config)
  436. {
  437. // êëþ÷ â ìåìêåøå ñòàâèòñÿ òîëüêî ñ zz. òàê êàê òàì êîíôèã àêòóàëüíûé âñåãäà.
  438. if (!self::isControlServer()) {
  439. return false;
  440. }
  441. if (is_string($config) && !empty($config)) {
  442. $config = @unserialize($config);
  443. }
  444. if (!is_array($config) || empty($config)) {
  445. return false;
  446. }
  447. $cacheKey = self::getStaticConfigCacheKey();
  448. Base_Service_Memcache::setOnAllHost($cacheKey, $config, 86400 * 7);
  449. return true;
  450. }
  451. public static function getStaticServers($activeOnly = false, $skipMemcache = false)
  452. {
  453. if (!PRODUCTION) {
  454. if (strpos(Base_Project_Manager::getProject()->getDomain(), 'fs16.vs58.net') === false) {
  455. return array();
  456. }
  457. }
  458. $cacheKey = self::getStaticConfigCacheKey();
  459. $servers = $skipMemcache ? false : Base_Service_Memcache::get($cacheKey);
  460. if (!$servers && file_exists(self::STATIC_SERVERS_CONFIG_TEXT)) {
  461. $serversString = file_get_contents(self::STATIC_SERVERS_CONFIG_TEXT);
  462. $servers = unserialize($serversString);
  463. self::cacheStaticServersConfig($servers);
  464. }
  465. if (PRODUCTION) {
  466. if (ENGLISH_VERSION) {
  467. $servers = array(
  468. 's.qiped.com' => array('active' => 1, 'weight' => 1, 'interval' => 1000),
  469. );
  470. }
  471. }
  472. if (!is_array($servers)) {
  473. $servers = array();
  474. }
  475. $result = array();
  476. if ($activeOnly) {
  477. foreach ($servers as $server => $data) {
  478. if ($data['active'] && $data['weight']) {
  479. $result[$server] = $data;
  480. }
  481. }
  482. } else {
  483. $result = $servers;
  484. }
  485. return $result;
  486. }
  487. /**
  488. * Ðàçìíîæàåò êîíôèã ñåðâåðîâ ñòàòèêè ïî ñêðèïòîâûì. Ðàáîòàåò òîëüåî íà zz.
  489. */
  490. public static function deployStaticServersConfig()
  491. {
  492. if (!PRODUCTION || !Base_Service_Common::isControlServer()) {
  493. return false;
  494. }
  495. $ssh = new Base_Service_Ssh();
  496. $serversList = Base_Service_Common::getScriptServers(
  497. true, /* $upOnly */
  498. false, /* $skipMemcache */
  499. false, /* $includeTestLangServer */
  500. false, /* $includeControlServer */
  501. true /* $includeVirtualStages */
  502. );
  503. $count = 0;
  504. foreach ($serversList as $serverInfo) {
  505. try {
  506. $ssh->connect($serverInfo['ip']);
  507. $ssh->keylogin('embria', './' . Base_Service_Ssh::PUBLIC_KEY_FILE, './' . Base_Service_Ssh::PRIVATE_KEY_FILE);
  508. $ssh->uploadFile(self::STATIC_SERVERS_CONFIG_TEXT, $ssh->getRealPath() . '/' . self::STATIC_SERVERS_CONFIG_TEXT);
  509. $count++;
  510. } catch (Exception $e) {
  511. continue;
  512. }
  513. }
  514. return $count;
  515. }
  516. public static function deployScriptServersConfig()
  517. {
  518. if (!Base_Service_Common::isControlServer()) {
  519. return false;
  520. }
  521. $ssh = new Base_Service_Ssh();
  522. $serversList = Base_Service_Common::getScriptServers2(
  523. true, /* $upOnly */
  524. false, /* $skipMemcache */
  525. false, /* $includeTestLangServer */
  526. false, /* $includeControlServer */
  527. true, /* $includeVirtualStages */
  528. true /* $forceControlsExclude */
  529. );
  530. $count = 0;
  531. foreach ($serversList as $serverInfo) {
  532. try {
  533. $ssh->connect($serverInfo['ip']);
  534. $ssh->keylogin('embria', './' . Base_Service_Ssh::PUBLIC_KEY_FILE, './' . Base_Service_Ssh::PRIVATE_KEY_FILE);
  535. $ssh->uploadFile(self::SCRIPT_SERVERS_CONFIG_TEXT, $ssh->getRealPath() . '/' . self::SCRIPT_SERVERS_CONFIG_TEXT);
  536. $ssh->uploadFile(self::VIRTSTAGE_SERVERS_CONFIG_TEXT, $ssh->getRealPath() . '/' . self::VIRTSTAGE_SERVERS_CONFIG_TEXT);
  537. $count++;
  538. } catch (Exception $e) {
  539. continue;
  540. }
  541. }
  542. return $count;
  543. }
  544. /**
  545. * Ïîëó÷àåì âíåøíèé IP òåêóùåãî ñåðâåðà
  546. *
  547. * @return string
  548. */
  549. public static function getServerIp()
  550. {
  551. $serverIp = $_SERVER['SERVER_ADDR'];
  552. $servers = self::getScriptServers();
  553. if (isset($servers[$serverIp])) {
  554. return $servers[$serverIp]['extIp'];
  555. } else {
  556. return 'fotostrana.ru';
  557. }
  558. }
  559. public static function getSecurityHash($text)
  560. {
  561. return Utf::substr(Utf::preg_replace('/[^0-9]/', '', md5($text . self::SALT)), 0, 8);
  562. }
  563. public static function traceSpy($_class = null, $depth = null)
  564. {
  565. $spy = array();
  566. $trace = debug_backtrace(false);
  567. array_shift($trace);
  568. array_shift($trace);
  569. $count = 0;
  570. foreach ($trace as $row) {
  571. if ($_class !== null && isset($row["class"]) && (Utf::strpos($row["class"], $_class) !== FALSE)) {
  572. continue;
  573. }
  574. $spy[] = (isset($row["class"]) ? $row["class"] : "") . "." . $row["function"];
  575. if ($depth !== null && ++$count > $depth) {
  576. break;
  577. }
  578. }
  579. return !empty($spy) ? implode(' <= ', $spy) : '';
  580. }
  581. public static function isStage($checkForIp = true)
  582. {
  583. return (!$checkForIp || Base_Service_Common::isOurIp())
  584. && isset($_SERVER['HTTP_HOST'])
  585. && ($_SERVER['HTTP_HOST'] == 'stage.fotostrana.ru' || $_SERVER['HTTP_HOST'] == 'stage3.fotostrana.ru');
  586. }
  587. // warning: this function is under active development
  588. public static function getProjectTitle($form = 0, $user = false, $domain = false)
  589. {
  590. if ($domain) {
  591. $project = Base_Project_Manager::getProject($domain);
  592. } else {
  593. $project = $user ? $user->getNativeProject() : Base_Project_Manager::getProject();
  594. }
  595. return $project->getTitle($form);
  596. }
  597. // warning: this function is under active development
  598. /**
  599. *
  600. * @param Base_Model_User $user
  601. * @param boolean $overrideDomain
  602. * @return Base_Mailer_NewCommon
  603. */
  604. public static function getUserMailer($user, $overrideDomain = false)
  605. {
  606. if (!$user) {
  607. $project = Base_Project_Manager::getProject();
  608. } else {
  609. $project = $user->getNativeProject();
  610. }
  611. return $overrideDomain ?
  612. Base_Project_Manager::getProject($overrideDomain)->getDefaultMailer($user) :
  613. $project->getDefaultMailer($user);
  614. }
  615. public static function getPetMailer($user)
  616. {
  617. if (!$user) {
  618. $project = Base_Project_Manager::getProject();
  619. } else {
  620. $project = $user->getNativeProject();
  621. }
  622. return $project->getPetMailer($user);
  623. }
  624. public static function getCurrencyTitle($full = false)
  625. {
  626. return !$full ? _('ÔÌ') : _('ÔîòîÌàíè');
  627. }
  628. /**
  629. * Ïðîâåðÿåò, ïðèø¸ë ëè êëèåíò íà ýòó ñòðàíèöó ñ äð ñòðàíèöû ýòîãî æå ñàéòà.
  630. * Åñëè ðåô ïóñòîé (þçåð òóïî âáèë ëèíê â áðàóçåð)
  631. * èëè äîìåí â ðåôå íå ñîîòâåòñòâóåò äîìåíó ñåðâà - âîçâðàùàåò ôîëñ
  632. * ïðîâåðêà ïî äîìåíó 2ãî óðîâíÿ
  633. */
  634. public static function checkReferer()
  635. {
  636. $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : false;
  637. if (!$referer) {
  638. return false;
  639. }
  640. Utf::preg_match('/[^\.\/]+\.[^\.\/]+$/', $_SERVER['HTTP_HOST'], $serverDomain); // èçâëåêàåì äâå ïîñëåäíèå ÷àñòè èìåíè õîñòà
  641. Utf::preg_match('/[^\.\/]+\.[^\.\/]+$/', parse_url($referer, PHP_URL_HOST), $refDomain);
  642. return $refDomain[0] == $serverDomain[0];
  643. }
  644. public static function setNeedProjectSync($val = true)
  645. {
  646. self::$needProjectSync = $val;
  647. }
  648. public static function checkNeedProjectSync()
  649. {
  650. return !!self::$needProjectSync;
  651. }
  652. public static function doSyncHttpRequest()
  653. {
  654. $projectGlobalConfig = Base_Application::getInstance()->config['project'];
  655. if (empty($projectGlobalConfig['db_sync']['hosts'])) {
  656. return false;
  657. }
  658. $timeout = (int)ini_get('max_execution_time');
  659. $opts = array(
  660. 'returnCode' => true,
  661. 'timeout' => $timeout ? $timeout : 5,
  662. 'header' => array('Cookie: ' . $_SERVER['HTTP_COOKIE'])
  663. );
  664. if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
  665. $opts['auth'] = $_SERVER['PHP_AUTH_USER'] . ':' . $_SERVER['PHP_AUTH_PW'];
  666. }
  667. $params = $_POST;
  668. if (!empty($_FILES)) {
  669. foreach ($_FILES as $key => $file) {
  670. $params[$key] = '@' . $file['tmp_name'];
  671. }
  672. }
  673. $params['admin_hash'] = Base_Controller_Admin::generateAdminHash();
  674. foreach ($projectGlobalConfig['db_sync']['hosts'] as $host) {
  675. $url = 'http://' . $host . $_SERVER['REQUEST_URI'];
  676. $res = Service_Apache::postabs($url, $params, $opts);
  677. if (!isset($res[1]) || $res[1] != 200 /* OK */ && $res[1] != 302 /* REDIRECT */) {
  678. trigger_error('Db sync failed. URL = ' . $url . '; Response code: ' . $res[1], E_USER_WARNING);
  679. }
  680. }
  681. return true;
  682. }
  683. public static function isControlServer()
  684. {
  685. return !empty($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == CONTROL_SERVER_PATH;
  686. }
  687. /**
  688. * @static
  689. * @param string $email
  690. * @return array|null
  691. */
  692. public static function getEmailInfoByEmail($email)
  693. {
  694. $link = null;
  695. $email = Utf::strtolower($email);
  696. if (Utf::strpos($email, '@mail.ru') || Utf::strpos($email, '@bk.ru') || Utf::strpos($email, '@inbox.ru') || Utf::strpos($email, '@list.ru')) {
  697. $link = array('title' => "mail.ru", 'url' => "http://e.mail.ru/cgi-bin/msglist");
  698. } elseif (Utf::strpos($email, '@gmail.com') || Utf::strpos($email, '@googlemail.com')) {
  699. $link = array('title' => "gmail.com", 'url' => "http://gmail.com");
  700. } elseif (Utf::strpos($email, '@yandex.ru') || Utf::strpos($email, '@ya.ru')) {
  701. $link = array('title' => "mail.yandex.ru", 'url' => "http://mail.yandex.ru");
  702. } elseif (Utf::strpos($email, '@yandex.com')) {
  703. $link = array('title' => "mail.yandex.com", 'url' => "http://mail.yandex.com");
  704. } elseif (Utf::strpos($email, '@rambler.ru') || Utf::strpos($email, '@lenta.ru') || Utf::strpos($email, '@myrambler.ru') || Utf::strpos($email, '@autorambler.ru') || Utf::strpos($email, '@ro.ru') || Utf::strpos($email, '@r0.ru')) {
  705. $link = array('title' => "rambler.ru", 'url' => "http://rambler.ru");
  706. } elseif (Utf::strpos($email, '@yahoo.com')) {
  707. $link = array('title' => "yahoo.com", 'url' => "https://login.yahoo.com/config/login_verify2");
  708. } elseif (Utf::strpos($email, '@hotmail.com')) {
  709. $link = array('title' => "hotmail.com", 'url' => "https://hotmail.com");
  710. } elseif (Utf::strpos($email, '@msn.com')) {
  711. $link = array('title' => "msn.com", 'url' => "https://msn.com");
  712. } elseif (Utf::strpos($email, '@tut.by')) {
  713. $link = array('title' => "tut.by", 'url' => "http://mail.tut.by");
  714. }
  715. return $link;
  716. }
  717. /**
  718. * @static
  719. * @param string $email
  720. * @return bool
  721. */
  722. public static function isEmailsDomainTrusted($email)
  723. {
  724. $trustedDomains = array(
  725. 'spaces.ru',
  726. 'pochtamt.ru',
  727. 'e1.ru',
  728. 'email.ru',
  729. 'ukrpost.ua',
  730. 'nm.ru',
  731. 'bigmir.net',
  732. 'sibmail.com',
  733. 'inbox.lv',
  734. 'e-mail.ua',
  735. 'hot.ee',
  736. 'pisem.net',
  737. 'hotbox.ru',
  738. 'gmx.de',
  739. 'ua.fm',
  740. 'narod.ru',
  741. 'qip.ru',
  742. 'meta.ua',
  743. 'yandex.by',
  744. 'yandex.ua',
  745. 'tut.by',
  746. 'i.ua',
  747. 'ukr.net',
  748. 'pochta.ru',
  749. 'mail.ru',
  750. 'bk.ru',
  751. 'inbox.ru',
  752. 'list.ru',
  753. 'gmail.com',
  754. 'googlemail.com',
  755. 'yandex.ru',
  756. 'ya.ru',
  757. 'rambler.ru',
  758. 'yahoo.com',
  759. 'hotmail.com',
  760. 'msn.com',
  761. );
  762. return in_array(substr(strstr($email, '@'),1),$trustedDomains);
  763. }
  764. /**
  765. * Ïîëó÷åíèå id áàííåðà, ïî êîòîðîìó íà ôîòîñòðàíó ïåðåøåë þçåð
  766. * @return int
  767. */
  768. public static function getElephantBannerId()
  769. {
  770. return Service_Base::getCookie('elephant_bid');
  771. }
  772. /**
  773. * Ñîõðàíåíèå id áàííåðà â êóêó íà 1 äåíü
  774. * @param int $bannerId
  775. */
  776. public static function setElephantBannerId($bannerId)
  777. {
  778. Service_Base::setCookie('elephant_bid', (int) $bannerId, 1);
  779. }
  780. public static function setRefIdCookie($refId, $subId='')
  781. {
  782. $days = 7;
  783. Service_Base::setCookie('ref_id', (int) $refId, $days, '/', true, true);
  784. Service_Base::setCookie('sub_id', (string) $subId, $days, '/', true, true);
  785. }
  786. public static function isOurMenu()
  787. {
  788. $module = Base_Context::getInstance()->getRequest()->getModuleName();
  789. switch ($module) {
  790. case "Staff":
  791. case "fsStats":
  792. return true;
  793. default:
  794. return false;
  795. }
  796. // if (self::isOurIp() && isset($_COOKIE['our_menu']) && !empty($_COOKIE['our_menu'])) {
  797. // return true;
  798. // }
  799. }
  800. public static function isAccessStaff()
  801. {
  802. $user = Base_Context::getInstance()->getUser();
  803. if (self::isOurMenu() && $user) {
  804. $staffDao = new Staff_Dao_Base();
  805. return (bool) $staffDao->getEmployeeByFsId($user->getId());
  806. }
  807. return $user && self::isOurPerson();
  808. }
  809. public static function isExternalReferer($referer)
  810. {
  811. return (
  812. $referer
  813. && ($domain = Base_Project_Manager::getProject()->getDomain())
  814. && (strpos($referer, '://' . $domain . '/') === false)
  815. && (strpos($referer, '.' . $domain . '/') === false)
  816. && ((strpos($referer, '.fsimg.ru/') === false)
  817. || (strpos($referer, '.fsimg.ru/elephant') !== false)
  818. )
  819. );
  820. }
  821. public static function logWrongRedirect($redirectUrl, $type = 'full')
  822. {
  823. $fromParams = array('eRf', 'fromHeader', 'h', 'fromServiceBlock', 'fromPeopleBlock', 'fromServicePage', 'fp', 'fromBubble', 'from');
  824. if ($sourceFrom = array_intersect($fromParams, array_keys($_GET))) {
  825. $redirect = parse_url($redirectUrl);
  826. $redirectGet = array();
  827. if (isset($redirect['query'])) {
  828. parse_str($redirect['query'], $redirectGet);
  829. }
  830. if ($test = array_diff($sourceFrom, array_keys($redirectGet))) {
  831. Base_Service_Log::log('internal_traffic_redirects', array($_SERVER['REQUEST_URI'], $redirectUrl, $type));
  832. }
  833. }
  834. }
  835. }