PageRenderTime 27ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/zabbix-2.0.1/frontends/php/api/classes/CScreen.php

#
PHP | 610 lines | 438 code | 72 blank | 100 comment | 78 complexity | d8ec1da3776759237be6778786704d82 MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0
  1. <?php
  2. /*
  3. ** Zabbix
  4. ** Copyright (C) 2000-2011 Zabbix SIA
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. ** GNU General Public License for more details.
  15. **
  16. ** You should have received a copy of the GNU General Public License
  17. ** along with this program; if not, write to the Free Software
  18. ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. **/
  20. ?>
  21. <?php
  22. /**
  23. * File containing CScreen class for API.
  24. * @package API
  25. */
  26. /**
  27. * Class containing methods for operations with Screens
  28. */
  29. class CScreen extends CZBXAPI {
  30. protected $tableName = 'screens';
  31. protected $tableAlias = 's';
  32. /**
  33. * Get Screen data
  34. *
  35. * @param array $options
  36. * @param array $options['nodeids'] Node IDs
  37. * @param boolean $options['with_items'] only with items
  38. * @param boolean $options['editable'] only with read-write permission. Ignored for SuperAdmins
  39. * @param int $options['count'] count Hosts, returned column name is rowscount
  40. * @param string $options['pattern'] search hosts by pattern in host names
  41. * @param int $options['limit'] limit selection
  42. * @param string $options['order'] deprecated parameter (for now)
  43. * @return array|boolean Host data as array or false if error
  44. */
  45. public function get($options = array()) {
  46. $result = array();
  47. $userType = self::$userData['type'];
  48. // allowed columns for sorting
  49. $sortColumns = array('screenid', 'name');
  50. // allowed output options for [ select_* ] params
  51. $subselectsAllowedOutputs = array(API_OUTPUT_REFER, API_OUTPUT_EXTEND);
  52. $sqlParts = array(
  53. 'select' => array('screens' => 's.screenid'),
  54. 'from' => array('screens' => 'screens s'),
  55. 'where' => array('template' => 's.templateid IS NULL'),
  56. 'order' => array(),
  57. 'group' => array(),
  58. 'limit' => null
  59. );
  60. $defOptions = array(
  61. 'nodeids' => null,
  62. 'screenids' => null,
  63. 'screenitemids' => null,
  64. 'editable' => null,
  65. 'nopermissions' => null,
  66. // filter
  67. 'filter' => null,
  68. 'search' => null,
  69. 'searchByAny' => null,
  70. 'startSearch' => null,
  71. 'excludeSearch' => null,
  72. 'searchWildcardsEnabled' => null,
  73. // output
  74. 'output' => API_OUTPUT_REFER,
  75. 'selectScreenItems' => null,
  76. 'countOutput' => null,
  77. 'groupCount' => null,
  78. 'preservekeys' => null,
  79. 'sortfield' => '',
  80. 'sortorder' => '',
  81. 'limit' => null
  82. );
  83. $options = zbx_array_merge($defOptions, $options);
  84. if (is_array($options['output'])) {
  85. unset($sqlParts['select']['screens']);
  86. $dbTable = DB::getSchema('screens');
  87. foreach ($options['output'] as $field) {
  88. if (isset($dbTable['fields'][$field])) {
  89. $sqlParts['select'][$field] = 's.'.$field;
  90. }
  91. }
  92. $options['output'] = API_OUTPUT_CUSTOM;
  93. }
  94. // nodeids
  95. $nodeids = !is_null($options['nodeids']) ? $options['nodeids'] : get_current_nodeid();
  96. // screenids
  97. if (!is_null($options['screenids'])) {
  98. zbx_value2array($options['screenids']);
  99. $sqlParts['where'][] = DBcondition('s.screenid', $options['screenids']);
  100. }
  101. // screenitemids
  102. if (!is_null($options['screenitemids'])) {
  103. zbx_value2array($options['screenitemids']);
  104. if ($options['output'] != API_OUTPUT_EXTEND) {
  105. $sqlParts['select']['screenitemid'] = 'si.screenitemid';
  106. }
  107. $sqlParts['from']['screens_items'] = 'screens_items si';
  108. $sqlParts['where']['ssi'] = 'si.screenid=s.screenid';
  109. $sqlParts['where'][] = DBcondition('si.screenitemid', $options['screenitemids']);
  110. }
  111. // filter
  112. if (is_array($options['filter'])) {
  113. zbx_db_filter('screens s', $options, $sqlParts);
  114. }
  115. // search
  116. if (is_array($options['search'])) {
  117. zbx_db_search('screens s', $options, $sqlParts);
  118. }
  119. // output
  120. if ($options['output'] == API_OUTPUT_EXTEND) {
  121. $sqlParts['select']['screens'] = 's.*';
  122. }
  123. // countOutput
  124. if (!is_null($options['countOutput'])) {
  125. $options['sortfield'] = '';
  126. $sqlParts['select'] = array('count(DISTINCT s.screenid) as rowscount');
  127. // groupCount
  128. if (!is_null($options['groupCount'])) {
  129. foreach ($sqlParts['group'] as $key => $fields) {
  130. $sqlParts['select'][$key] = $fields;
  131. }
  132. }
  133. }
  134. // sorting
  135. zbx_db_sorting($sqlParts, $options, $sortColumns, 's');
  136. // limit
  137. if (zbx_ctype_digit($options['limit']) && $options['limit']) {
  138. $sqlParts['limit'] = $options['limit'];
  139. }
  140. $screenids = array();
  141. $sqlParts['select'] = array_unique($sqlParts['select']);
  142. $sqlParts['from'] = array_unique($sqlParts['from']);
  143. $sqlParts['where'] = array_unique($sqlParts['where']);
  144. $sqlParts['group'] = array_unique($sqlParts['group']);
  145. $sqlParts['order'] = array_unique($sqlParts['order']);
  146. $sqlSelect = '';
  147. $sqlFrom = '';
  148. $sqlWhere = '';
  149. $sqlGroup = '';
  150. $sqlOrder = '';
  151. if (!empty($sqlParts['select'])) {
  152. $sqlSelect .= implode(',', $sqlParts['select']);
  153. }
  154. if (!empty($sqlParts['from'])) {
  155. $sqlFrom .= implode(',', $sqlParts['from']);
  156. }
  157. if (!empty($sqlParts['where'])) {
  158. $sqlWhere .= ' AND '.implode(' AND ', $sqlParts['where']);
  159. }
  160. if (!empty($sqlParts['group'])) {
  161. $sqlGroup .= ' GROUP BY '.implode(',', $sqlParts['group']);
  162. }
  163. if (!empty($sqlParts['order'])) {
  164. $sqlOrder .= ' ORDER BY '.implode(',', $sqlParts['order']);
  165. }
  166. $sqlLimit = $sqlParts['limit'];
  167. $sql = 'SELECT '.zbx_db_distinct($sqlParts).' '.$sqlSelect.'
  168. FROM '.$sqlFrom.'
  169. WHERE '.DBin_node('s.screenid', $nodeids).
  170. $sqlWhere.
  171. $sqlGroup.
  172. $sqlOrder;
  173. $res = DBselect($sql, $sqlLimit);
  174. while ($screen = DBfetch($res)) {
  175. if (!is_null($options['countOutput'])) {
  176. if (!is_null($options['groupCount'])) {
  177. $result[] = $screen;
  178. }
  179. else {
  180. $result = $screen['rowscount'];
  181. }
  182. }
  183. else {
  184. $screenids[$screen['screenid']] = $screen['screenid'];
  185. if ($options['output'] == API_OUTPUT_SHORTEN) {
  186. $result[$screen['screenid']] = array('screenid' => $screen['screenid']);
  187. }
  188. else {
  189. if (!isset($result[$screen['screenid']])) {
  190. $result[$screen['screenid']]= array();
  191. }
  192. if (!is_null($options['selectScreenItems']) && !isset($result[$screen['screenid']]['screenitems'])) {
  193. $result[$screen['screenid']]['screenitems'] = array();
  194. }
  195. if (isset($screen['screenitemid']) && is_null($options['selectScreenItems'])) {
  196. if (!isset($result[$screen['screenid']]['screenitems'])) {
  197. $result[$screen['screenid']]['screenitems'] = array();
  198. }
  199. $result[$screen['screenid']]['screenitems'][] = array('screenitemid' => $screen['screenitemid']);
  200. unset($screen['screenitemid']);
  201. }
  202. $result[$screen['screenid']] += $screen;
  203. }
  204. }
  205. }
  206. // editable + PERMISSION CHECK
  207. if (USER_TYPE_SUPER_ADMIN == $userType || $options['nopermissions']) {
  208. }
  209. elseif (!empty($result)) {
  210. $groupsToCheck = array();
  211. $hostsToCheck = array();
  212. $graphsToCheck = array();
  213. $itemsToCheck = array();
  214. $mapsToCheck = array();
  215. $screensToCheck = array();
  216. $screensItems = array();
  217. $dbSitems = DBselect('SELECT si.* FROM screens_items si WHERE '.DBcondition('si.screenid', $screenids));
  218. while ($sitem = DBfetch($dbSitems)) {
  219. $screensItems[$sitem['screenitemid']] = $sitem;
  220. if ($sitem['resourceid']) {
  221. switch ($sitem['resourcetype']) {
  222. case SCREEN_RESOURCE_HOSTS_INFO:
  223. case SCREEN_RESOURCE_TRIGGERS_INFO:
  224. case SCREEN_RESOURCE_TRIGGERS_OVERVIEW:
  225. case SCREEN_RESOURCE_DATA_OVERVIEW:
  226. case SCREEN_RESOURCE_HOSTGROUP_TRIGGERS:
  227. $groupsToCheck[] = $sitem['resourceid'];
  228. break;
  229. case SCREEN_RESOURCE_HOST_TRIGGERS:
  230. $hostsToCheck[] = $sitem['resourceid'];
  231. break;
  232. case SCREEN_RESOURCE_GRAPH:
  233. $graphsToCheck[] = $sitem['resourceid'];
  234. break;
  235. case SCREEN_RESOURCE_SIMPLE_GRAPH:
  236. case SCREEN_RESOURCE_PLAIN_TEXT:
  237. $itemsToCheck[] = $sitem['resourceid'];
  238. break;
  239. case SCREEN_RESOURCE_MAP:
  240. $mapsToCheck[] = $sitem['resourceid'];
  241. break;
  242. case SCREEN_RESOURCE_SCREEN:
  243. $screensToCheck[] = $sitem['resourceid'];
  244. break;
  245. }
  246. }
  247. }
  248. $groupsToCheck = array_unique($groupsToCheck);
  249. $hostsToCheck = array_unique($hostsToCheck);
  250. $graphsToCheck = array_unique($graphsToCheck);
  251. $itemsToCheck = array_unique($itemsToCheck);
  252. $mapsToCheck = array_unique($mapsToCheck);
  253. $screensToCheck = array_unique($screensToCheck);
  254. // group
  255. $allowedGroups = API::HostGroup()->get(array(
  256. 'nodeids' => $nodeids,
  257. 'groupids' => $groupsToCheck,
  258. 'editable' => $options['editable']
  259. ));
  260. $allowedGroups = zbx_objectValues($allowedGroups, 'groupid');
  261. // host
  262. $allowedHosts = API::Host()->get(array(
  263. 'nodeids' => $nodeids,
  264. 'hostids' => $hostsToCheck,
  265. 'editable' => $options['editable']
  266. ));
  267. $allowedHosts = zbx_objectValues($allowedHosts, 'hostid');
  268. // graph
  269. $allowedGraphs = API::Graph()->get(array(
  270. 'nodeids' => $nodeids,
  271. 'graphids' => $graphsToCheck,
  272. 'editable' => $options['editable']
  273. ));
  274. $allowedGraphs = zbx_objectValues($allowedGraphs, 'graphid');
  275. // item
  276. $allowedItems = API::Item()->get(array(
  277. 'nodeids' => $nodeids,
  278. 'itemids' => $itemsToCheck,
  279. 'webitems' => 1,
  280. 'editable' => $options['editable']
  281. ));
  282. $allowedItems = zbx_objectValues($allowedItems, 'itemid');
  283. // map
  284. $allowedMaps = API::Map()->get(array(
  285. 'nodeids' => $nodeids,
  286. 'sysmapids' => $mapsToCheck,
  287. 'editable' => $options['editable']
  288. ));
  289. $allowedMaps = zbx_objectValues($allowedMaps, 'sysmapid');
  290. // screen
  291. $allowedScreens = API::Screen()->get(array(
  292. 'nodeids' => $nodeids,
  293. 'screenids' => $screensToCheck,
  294. 'editable' => $options['editable']
  295. ));
  296. $allowedScreens = zbx_objectValues($allowedScreens, 'screenid');
  297. $restrGroups = array_diff($groupsToCheck, $allowedGroups);
  298. $restrHosts = array_diff($hostsToCheck, $allowedHosts);
  299. $restrGraphs = array_diff($graphsToCheck, $allowedGraphs);
  300. $restrItems = array_diff($itemsToCheck, $allowedItems);
  301. $restrMaps = array_diff($mapsToCheck, $allowedMaps);
  302. $restrScreens = array_diff($screensToCheck, $allowedScreens);
  303. // group
  304. foreach ($restrGroups as $resourceid) {
  305. foreach ($screensItems as $screenItemid => $screenItem) {
  306. if (bccomp($screenItem['resourceid'], $resourceid) == 0
  307. && uint_in_array($screenItem['resourcetype'], array(
  308. SCREEN_RESOURCE_HOSTS_INFO, SCREEN_RESOURCE_TRIGGERS_INFO, SCREEN_RESOURCE_TRIGGERS_OVERVIEW,
  309. SCREEN_RESOURCE_DATA_OVERVIEW, SCREEN_RESOURCE_HOSTGROUP_TRIGGERS))) {
  310. unset($result[$screenItem['screenid']], $screensItems[$screenItemid]);
  311. }
  312. }
  313. }
  314. // host
  315. foreach ($restrHosts as $resourceid) {
  316. foreach ($screensItems as $screenItemid => $screenItem) {
  317. if (bccomp($screenItem['resourceid'], $resourceid) == 0
  318. && uint_in_array($screenItem['resourcetype'], array(SCREEN_RESOURCE_HOST_TRIGGERS))) {
  319. unset($result[$screenItem['screenid']], $screensItems[$screenItemid]);
  320. }
  321. }
  322. }
  323. // graph
  324. foreach ($restrGraphs as $resourceid) {
  325. foreach ($screensItems as $screenItemid => $screenItem) {
  326. if (bccomp($screenItem['resourceid'], $resourceid) == 0 && $screenItem['resourcetype'] == SCREEN_RESOURCE_GRAPH) {
  327. unset($result[$screenItem['screenid']], $screensItems[$screenItemid]);
  328. }
  329. }
  330. }
  331. // item
  332. foreach ($restrItems as $resourceid) {
  333. foreach ($screensItems as $screenItemid => $screenItem) {
  334. if (bccomp($screenItem['resourceid'], $resourceid) == 0
  335. && uint_in_array($screenItem['resourcetype'], array(SCREEN_RESOURCE_SIMPLE_GRAPH, SCREEN_RESOURCE_PLAIN_TEXT))) {
  336. unset($result[$screenItem['screenid']], $screensItems[$screenItemid]);
  337. }
  338. }
  339. }
  340. // map
  341. foreach ($restrMaps as $resourceid) {
  342. foreach ($screensItems as $screenItemid => $screenItem) {
  343. if (bccomp($screenItem['resourceid'], $resourceid) == 0
  344. && $screenItem['resourcetype'] == SCREEN_RESOURCE_MAP) {
  345. unset($result[$screenItem['screenid']], $screensItems[$screenItemid]);
  346. }
  347. }
  348. }
  349. // screen
  350. foreach ($restrScreens as $resourceid) {
  351. foreach ($screensItems as $screenItemid => $screenItem) {
  352. if (bccomp($screenItem['resourceid'], $resourceid) == 0
  353. && $screenItem['resourcetype'] == SCREEN_RESOURCE_SCREEN) {
  354. unset($result[$screenItem['screenid']], $screensItems[$screenItemid]);
  355. }
  356. }
  357. }
  358. }
  359. if (!is_null($options['countOutput'])) {
  360. return $result;
  361. }
  362. // Adding ScreenItems
  363. if (!is_null($options['selectScreenItems']) && str_in_array($options['selectScreenItems'], $subselectsAllowedOutputs)) {
  364. if (!isset($screensItems)) {
  365. $screensItems = array();
  366. $dbSitems = DBselect('SELECT si.* FROM screens_items si WHERE '.DBcondition('si.screenid', $screenids));
  367. while ($sitem = DBfetch($dbSitems)) {
  368. $screensItems[$sitem['screenitemid']] = $sitem;
  369. }
  370. }
  371. foreach ($screensItems as $snum => $sitem) {
  372. if (!isset($result[$sitem['screenid']]['screenitems'])) {
  373. $result[$sitem['screenid']]['screenitems'] = array();
  374. }
  375. $result[$sitem['screenid']]['screenitems'][] = $sitem;
  376. }
  377. }
  378. // removing keys (hash -> array)
  379. if (is_null($options['preservekeys'])) {
  380. $result = zbx_cleanHashes($result);
  381. }
  382. return $result;
  383. }
  384. public function exists($data) {
  385. $keyFields = array(array('screenid', 'name'));
  386. $options = array(
  387. 'filter' => zbx_array_mintersect($keyFields, $data),
  388. 'preservekeys' => true,
  389. 'output' => API_OUTPUT_SHORTEN,
  390. 'nopermissions' => true,
  391. 'limit' => 1
  392. );
  393. if (isset($data['node'])) {
  394. $options['nodeids'] = getNodeIdByNodeName($data['node']);
  395. }
  396. elseif (isset($data['nodeids'])) {
  397. $options['nodeids'] = $data['nodeids'];
  398. }
  399. $screens = $this->get($options);
  400. return !empty($screens);
  401. }
  402. /**
  403. * Create Screen
  404. *
  405. * @param _array $screens
  406. * @param string $screens['name']
  407. * @param array $screens['hsize']
  408. * @param int $screens['vsize']
  409. * @return array
  410. */
  411. public function create($screens) {
  412. $screens = zbx_toArray($screens);
  413. $insertScreenItems = array();
  414. $newScreenNames = zbx_objectValues($screens, 'name');
  415. $dbScreens = $this->get(array(
  416. 'filter' => array('name' => $newScreenNames),
  417. 'output' => API_OUTPUT_EXTEND,
  418. 'nopermissions' => true
  419. ));
  420. foreach ($dbScreens as $dbScreen) {
  421. self::exception(ZBX_API_ERROR_PARAMETERS, _s('Screen "%1$s" already exists.', $dbScreen['name']));
  422. }
  423. foreach ($screens as $screen) {
  424. $screenDbFields = array('name' => null);
  425. if (!check_db_fields($screenDbFields, $screen)) {
  426. self::exception(ZBX_API_ERROR_PARAMETERS, _s('Wrong fields for screen "%1$s".', $screen['name']));
  427. }
  428. }
  429. $screenids = DB::insert('screens', $screens);
  430. foreach ($screens as $snum => $screen) {
  431. if (isset($screen['screenitems'])) {
  432. foreach ($screen['screenitems'] as $screenitem) {
  433. $screenitem['screenid'] = $screenids[$snum];
  434. $insertScreenItems[] = $screenitem;
  435. }
  436. }
  437. }
  438. API::ScreenItem()->create($insertScreenItems);
  439. return array('screenids' => $screenids);
  440. }
  441. /**
  442. * Update Screen
  443. *
  444. * @param _array $screens multidimensional array with Hosts data
  445. * @param string $screens['screenid']
  446. * @param int $screens['name']
  447. * @param int $screens['hsize']
  448. * @param int $screens['vsize']
  449. * @return boolean
  450. */
  451. public function update($screens) {
  452. $screens = zbx_toArray($screens);
  453. $update = array();
  454. $updScreens = $this->get(array(
  455. 'screenids' => zbx_objectValues($screens, 'screenid'),
  456. 'editable' => true,
  457. 'output' => API_OUTPUT_SHORTEN,
  458. 'preservekeys' => true
  459. ));
  460. foreach ($screens as $screen) {
  461. if (!isset($screen['screenid'], $updScreens[$screen['screenid']])) {
  462. self::exception(ZBX_API_ERROR_PERMISSIONS, _('No permissions to referred object or it does not exist!'));
  463. }
  464. }
  465. foreach ($screens as $screen) {
  466. if (isset($screen['name'])) {
  467. $existScreen = $this->get(array(
  468. 'filter' => array('name' => $screen['name']),
  469. 'preservekeys' => true,
  470. 'nopermissions' => true,
  471. 'output' => API_OUTPUT_SHORTEN
  472. ));
  473. $existScreen = reset($existScreen);
  474. if ($existScreen && (bccomp($existScreen['screenid'], $screen['screenid']) != 0)) {
  475. self::exception(ZBX_API_ERROR_PERMISSIONS, _s('Screen "%1$s" already exists.', $screen['name']));
  476. }
  477. }
  478. $screenid = $screen['screenid'];
  479. unset($screen['screenid']);
  480. if (!empty($screen)) {
  481. $update[] = array(
  482. 'values' => $screen,
  483. 'where' => array('screenid' => $screenid),
  484. );
  485. }
  486. // udpate screen items
  487. if (isset($screen['screenitems'])) {
  488. $this->replaceItems($screenid, $screen['screenitems']);
  489. }
  490. }
  491. DB::update('screens', $update);
  492. return array('screenids' => zbx_objectValues($screens, 'screenid'));
  493. }
  494. /**
  495. * Delete Screen
  496. *
  497. * @param array $screenids
  498. * @return boolean
  499. */
  500. public function delete($screenids) {
  501. $screenids = zbx_toArray($screenids);
  502. $delScreens = $this->get(array(
  503. 'screenids' => $screenids,
  504. 'editable' => true,
  505. 'preservekeys' => true
  506. ));
  507. foreach ($screenids as $screenid) {
  508. if (!isset($delScreens[$screenid])) {
  509. self::exception(ZBX_API_ERROR_PERMISSIONS, _('No permissions to referred object or it does not exist!'));
  510. }
  511. }
  512. DB::delete('screens_items', array('screenid'=>$screenids));
  513. DB::delete('screens_items', array('resourceid'=>$screenids, 'resourcetype'=>SCREEN_RESOURCE_SCREEN));
  514. DB::delete('slides', array('screenid'=>$screenids));
  515. DB::delete('screens', array('screenid'=>$screenids));
  516. return array('screenids' => $screenids);
  517. }
  518. /**
  519. * Replaces all of the screen items of the given screen with the new ones.
  520. *
  521. * @param int $screenid The ID of the target screen
  522. * @param array $screenItems An array of screen items
  523. */
  524. protected function replaceItems($screenid, $screenItems) {
  525. $dbScreenItems = API::ScreenItem()->get(array(
  526. 'screenids' => $screenid,
  527. 'preservekeys' => true
  528. ));
  529. foreach ($screenItems as &$screenItem) {
  530. $screenItem['screenid'] = $screenid;
  531. }
  532. $result = API::ScreenItem()->updateByPosition($screenItems);
  533. // deleted the old items
  534. $deleteItemids = array_diff(array_keys($dbScreenItems), $result['screenitemids']);
  535. API::ScreenItem()->delete($deleteItemids);
  536. }
  537. }
  538. ?>