/**
  * This is called whenever the notification service is called. We have to store all interesting
  * results in an internal structure to use it later.
  *
  * @param string $event
  * @param tx_caretaker_AbstractNode $node
  * @param tx_caretaker_TestResult $result
  * @param tx_caretaKer_TestResult $lastResult
  */
 public function addNotification($event, $node, $result = NULL, $lastResult = NULL)
 {
     $strategies = $node->getStrategies();
     foreach ($strategies as $strategy) {
         $config = $this->getStrategyConfig($strategy);
         $this->processStrategy($strategy, $config, array('event' => $event, 'node' => $node, 'result' => $result, 'lastResult' => $lastResult));
         if ($config['stop']) {
             break;
         }
     }
 }
 /**
  * Get the current instance
  * @return tx_caretaker_InstanceNode
  */
 public function getInstance()
 {
     if ($this instanceof tx_caretaker_InstanceNode) {
         return $this;
     } else {
         if ($this->parent) {
             return $this->parent->getInstance();
         } else {
             return FALSE;
         }
     }
 }
 /**
  * Get the current instance
  * @return tx_caretaker_InstanceNode
  */
 public function getInstance()
 {
     if (is_a($this, 'tx_caretaker_InstanceNode')) {
         return $this;
     } else {
         if ($this->parent) {
             return $this->parent->getInstance();
         } else {
             return FALSE;
         }
     }
 }
 /**
  * @param tx_caretaker_AbstractNode $node
  * @param int $depth
  * @return array
  */
 protected function nodeToArray($node, $depth = 1)
 {
     // show node and icon
     $result = array();
     $uid = $node->getUid();
     $title = $node->getTitle();
     $hidden = $node->getHidden();
     $id = $node->getCaretakerNodeId();
     $testResult = $node->getTestResult();
     $resultClass = 'caretaker-state-' . strtolower($testResult->getStateInfo());
     $typeClass = 'caretaker-type-' . strtolower($node->getType());
     $result['type'] = strtolower($node->getType());
     $result['id'] = $id;
     $result['uid'] = $uid;
     $result['disabled'] = $hidden;
     $result['text'] = $title ? $title : '[no title]';
     $result['cls'] = $resultClass . ' ' . $typeClass;
     $result['iconCls'] = 'icon-' . $typeClass . ($hidden ? '-hidden' : '');
     if (strtolower($node->getType()) == 'instance' && $node instanceof tx_caretaker_InstanceNode) {
         $result['url'] = $node->getUrl();
     } else {
         $result['url'] = false;
     }
     // show subitems of tx_caretaker_AggregatorNodes
     if ($node instanceof tx_caretaker_AggregatorNode) {
         $children = $node->getChildren(true);
         $result['leaf'] = count($children) == 0 ? true : false;
         if ($depth > 0) {
             $result['children'] = array();
             foreach ($children as $child) {
                 $result['children'][] = $this->nodeToArray($child, $depth - 1);
             }
         }
     } else {
         $result['leaf'] = TRUE;
     }
     return $result;
 }
 /**
  * Get the ResultRange for the given Aggregator and the timerange
  *
  * @param tx_caretaker_AbstractNode $node
  * @param integer $start_timestamp
  * @param integer $stop_timestamp
  * @return tx_caretaker_AggregatorResultRange
  */
 public function getRangeByNode($node, $start_timestamp, $stop_timestamp)
 {
     $result_range = new tx_caretaker_AggregatorResultRange($start_timestamp, $stop_timestamp);
     $instance = $node->getInstance();
     if ($instance) {
         $instanceUid = $instance->getUid();
     } else {
         $instanceUid = 0;
     }
     $nodeType = $node->getType();
     $nodeUid = $node->getUid();
     $base_condition = 'aggregator_uid=' . $nodeUid . ' AND aggregator_type="' . $nodeType . '" AND instance_uid=' . $instanceUid;
     $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_caretaker_aggregatorresult', $base_condition . ' AND tstamp >=' . $start_timestamp . ' AND tstamp <=' . $stop_timestamp, '', 'tstamp ASC');
     while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
         $result = $this->dbrow2instance($row);
         $result_range->addResult($result);
     }
     // add first value if needed
     $first = $result_range->getFirst();
     if (!$first || $first && $first->getTstamp() > $start_timestamp) {
         $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = TRUE;
         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_caretaker_aggregatorresult', $base_condition . ' AND tstamp <' . $start_timestamp, '', 'tstamp DESC', 1);
         if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
             $row['tstamp'] = $start_timestamp;
             $result = $this->dbrow2instance($row);
             $result_range->addResult($result);
         }
     }
     // add last value if needed
     $last = $result_range->getLast();
     if ($last && $last->getTstamp() < $stop_timestamp) {
         $real_last = new tx_caretaker_AggregatorResult($stop_timestamp, $last->getState(), $last->getNumUNDEFINED(), $last->getNumOK(), $last->getNumWARNING(), $last->getNumERROR(), $last->getMessage()->getText());
         $result_range->addResult($real_last);
     }
     return $result_range;
 }
 /**
  * Get All Contacts for the given node that match the given role
  *
  * @param tx_caretaker_AbstractNode $node
  * @param tx_caretaker_ContactRole $role
  * @return array
  */
 public function getContactsByNodeAndRole(tx_caretaker_AbstractNode $node, tx_caretaker_ContactRole $role)
 {
     $contacts = array();
     // only Instancegroups and Instances store Contacts
     $nodeType = $node->getType();
     if ($nodeType != tx_caretaker_Constants::nodeType_Instance && $nodeType != tx_caretaker_Constants::nodeType_Instancegroup) {
         return $contacts;
     }
     $storageTable = $node->getStorageTable();
     $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', tx_caretaker_Constants::relationTable_Node2Address, 'uid_node=' . $node->getUid() . ' AND node_table=\'' . $storageTable . '\'' . ' AND role=' . $role->getUid());
     while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
         if ($contact = $this->dbrow2contact($row)) {
             $contacts[] = $contact;
         }
     }
     return $contacts;
 }
 /**
  *
  * @param tx_caretaker_AbstractNode $node
  * @return array
  */
 function getNodeData($node)
 {
     $data = array();
     // node data
     $data['uid'] = $node->getUid();
     $data['node_id'] = $node->getCaretakerNodeId();
     $data['node_type'] = $node->getType();
     $data['type'] = $node->getTypeDescription();
     $data['configuration'] = $node->getConfigurationInfo();
     $data['title'] = $node->getTitle();
     $data['description'] = $node->getDescription();
     // add state Infos
     $result = $node->getTestResult();
     $data['state'] = $result->getState();
     $data['state_info'] = $result->getStateInfo();
     $data['state_show'] = $result->getLocallizedStateInfo();
     $data['state_msg'] = $result->getLocallizedInfotext();
     $data['state_tstamp'] = $result->getTimestamp();
     if ($result instanceof tx_caretaker_TestResult) {
         $data['state_value'] = $result->getValue();
     }
     // instance data
     if (is_a($node, 'tx_caretaker_TestNode') || is_a($node, 'tx_caretaker_TestgroupNode')) {
         $data['instance'] = $node->getInstance()->getTitle();
     }
     $data['link_parameters'] = '&tx_caretaker_pi_singleview[id]=' . $node->getCaretakerNodeId();
     return $data;
 }
 /**
  * @param tx_caretaker_AbstractNode $node
  * @param int $offset
  * @param int $limit
  * @return tx_caretaker_AggregatorResultRange
  */
 public function getResultRangeByNodeAndOffset($node, $offset = 0, $limit = 10)
 {
     $result_range = new tx_caretaker_AggregatorResultRange(NULL, NULL);
     $instance = $node->getInstance();
     if ($instance) {
         $instanceUid = $instance->getUid();
     } else {
         $instanceUid = 0;
     }
     $nodeType = $node->getType();
     $nodeUid = $node->getUid();
     $base_condition = 'aggregator_uid=' . $nodeUid . ' AND aggregator_type="' . $nodeType . '" AND instance_uid=' . $instanceUid;
     $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_caretaker_aggregatorresult', $base_condition, '', 'tstamp DESC', (int) $offset . ',' . (int) $limit);
     while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
         $result = $this->dbrow2instance($row);
         $result_range->addResult($result);
     }
     return $result_range;
 }
 /**
  * @param tx_caretaker_AbstractNode $node
  * @return bool|string
  */
 function getNodeChart($node)
 {
     $chart = false;
     $range = 24;
     if ($this->piVars['range']) {
         $range = (int) $this->piVars['range'];
     }
     $id = $node->getCaretakerNodeID();
     $result_range = $node->getTestResultRange(time() - 3600 * $range, time());
     $filename = 'typo3temp/caretaker/charts/' . $id . '_' . $range . '.png';
     $base = \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('TYPO3_SITE_URL');
     if (is_a($node, 'tx_caretaker_TestNode')) {
         $TestResultRangeChartRenderer = new tx_caretaker_TestResultRangeChartRenderer();
         $TestResultRangeChartRenderer->setTitle($node->getTitle());
         $TestResultRangeChartRenderer->setTestResultRange($result_range);
         $result = $TestResultRangeChartRenderer->getChartImageTag($filename, $base);
         if ($result) {
             $chart = $result;
         } else {
             $chart = 'Graph Error';
         }
     } else {
         if (is_a($node, 'tx_caretaker_AggregatorNode')) {
             $TestResultRangeChartRenderer = new tx_caretaker_AggregatorResultRangeChartRenderer();
             $TestResultRangeChartRenderer->setTitle($node->getTitle());
             $TestResultRangeChartRenderer->setAggregatorResultRange($result_range);
             $result = $TestResultRangeChartRenderer->getChartImageTag($filename, $base);
             if ($result) {
                 $chart = $result;
             } else {
                 $chart = 'Graph Error';
             }
         }
     }
     return $chart;
 }
 /**
  * @return string
  */
 public function getHiddenInfo()
 {
     $hiddenInfo = parent::getHiddenInfo();
     if ($this->testServiceType) {
         if (isset($this->testServiceConfiguration['overwritten_in']) && is_array($this->testServiceConfiguration['overwritten_in']) && $this->testServiceConfiguration['hidden']) {
             $hiddenInfo .= ' (hidden in ' . '<span title=" ' . $this->testServiceConfiguration['overwritten_in']['id'] . '">' . $this->testServiceConfiguration['overwritten_in']['title'] . '</span>)';
         }
     }
     return $hiddenInfo;
 }
 /**
  * Get the latest Testresult for the given Instance and Test
  *
  * @param tx_caretaker_AbstractNode $testNode
  * @param $currentResult
  * @return tx_caretaker_TestResult
  */
 public function getPreviousDifferingResult($testNode, $currentResult)
 {
     $row = NULL;
     if ($testNode instanceof tx_caretaker_TestNode) {
         $testUID = $testNode->getUid();
         $instanceUID = $testNode->getInstance()->getUid();
         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_caretaker_testresult', 'test_uid = ' . $testUID . ' AND instance_uid = ' . $instanceUID . ' AND result_status <> ' . $currentResult->getState() . ' AND tstamp < ' . $currentResult->getTimestamp(), 'tstamp DESC, uid DESC', '', '1');
         $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
     }
     if ($row) {
         $result = $this->dbrow2instance($row);
         return $result;
     } else {
         return new tx_caretaker_TestResult();
     }
 }