'', 'hostgroup_name' => '', // Time-saving support 'notes' => '', 'notes_url' => '', 'action_url' => '', 'icon_image' => '', 'icon_image_alt' => '', 'vrml_image' => '', 'statusmap_image' => '', '2d_coords' => '', '3d_coords' => '', 'name' => '', 'use' => '', 'register' => ''); private $fieldMethods = array('notes' => 'setNotes', 'notes_url' => 'setNotesUrl', 'action_url' => 'setActionUrl', 'icon_image' => 'setIconImage', 'icon_image_alt' => 'setIconImageAlt', 'vrml_image' => 'setVrmlImage', 'statusmap_image' => 'setStatusmapImage', '2d_coords' => 'setTwoDCoords', '3d_coords' => 'setThreeDCoords'); // We should gather all the cfg_file and cfg_dir directives and add them to our NagiosImportEngine's object files public function init() { $config = $this->getEngine()->getConfig(); $job = $this->getEngine()->getJob(); $segment = $this->getSegment(); $values = $segment->getValues(); foreach($values as $key => $entry) { foreach($entry as $lineValue) { $value = $lineValue['value']; $lineNum = $lineValue['line']; if(strpos($key, "address") === 0) { // It's an address value, we'll accept it for now. continue; } if(!key_exists($key, $this->regexValidators)) { $job->addLogEntry("Variable in host ext object file not supported: " . $key . " on line " . $lineNum); if(!$config->getVar('continue_error')) { return false; } } else { // Key exists, let's check the regexp if($this->regexValidators[$key] != '' && !preg_match($this->regexValidators[$key], $value)) { // Failed the regular expression match (which was provided)!!! $job->addLogEntry("Variable '" . $key . "' failed the regular expression sanity check of: " . $this->regexValidators[$key] . " on line " . $linenum); if(!$config->getVar('continue_error')) { return false; } } } } } $job->addNotice("NagiosHostExtInfoImporter finished initializing."); return true; } public static function getTemplateByName($name) { if(!key_exists($name, NagiosHostExtInfoImporter::$templates)) { return false; } return NagiosHostExtInfoImporter::$templates[$name]; } public function valid() { $values = $this->getSegment()->getValues(); $job = $this->getEngine()->getJob(); if(isset($values['use'])) { // We need to use a template $job->addNotice("This Host Ext Info uses a template: " . $values['use'][0]['value']); $template = NagiosHostExtInfoImporter::getTemplateByName($values['use'][0]['value']); if(empty($template)) { $job->addNotice("That template is not found yet. Setting this host ext info as queued."); return false; } } if($this->getAppliedHosts(empty($values['host_name']) ? array() : $values['host_name'], empty($values['hostgroup_name']) ? array() : $values['hostgroup_name']) === false) { return false; } return true; } // Return a list of valid NagiosHost objects which this importer will apply // this to. private function getAppliedHosts($hostValues, $hostgroupValues) { $appliedHosts = array(); foreach($hostValues as $val) { $val = $val['value']; if($val == "*") { // Get all hosts $tempHosts = NagiosHostPeer::doSelect(new Criteria()); foreach($tempHosts as $tempHost) { if(!array_key_exists($tempHost->getName(), $appliedHosts)) { $appliedHosts[] = $tempHost; } } } else if(preg_match("/^!/", $val)) continue; // We'll do exclusions later else { $host = NagiosHostPeer::getByName($val); if(!$host) { // Give error $values = $this->getSegment()->getValues(); $job = $this->getEngine()->getJob(); $job->addError("The host specified by name: " . $val . " was not found. Setting this host ext info as queued."); return false; } else { if(!array_key_exists($host->getName(), $appliedHosts)) { $appliedHosts[] = $host; } } } } foreach($hostgroupValues as $val) { $val = $val['value']; // First check for * // then check for each hostgroup existence, then // each additional hostgroup if($val == "*") { // Get all hostgroups $hostgroups = NagiosHostgroupPeer::doSelect(new Criteria()); foreach($hostgroups as $hg) { $hosts = $hostgroup->getNagiosHosts(); foreach($hosts as $tempHost) { if(!array_key_exists($tempHost->getName(), $appliedHosts)) { $appliedHosts[] = $tempHost; } } } } else if(preg_match("/^!/", $val)) continue; else { $hg = NagiosHostgroupPeer::getByName($val); if(!$hg) { // Give error $values = $this->getSegment()->getValues(); $job = $this->getEngine()->getJob(); $job->addError("The hostgroup specified by name: " . $val . " was not found. Setting this host ext info as queued."); return false; } else { $hosts = $hg->getMembers(); foreach($hosts as $tempHost) { if(!array_key_exists($tempHost->getName(), $appliedHosts)) { $appliedHosts[] = $tempHost; } } } } } // Okay, do exclusions foreach($hostValues as $val) { $val = $val['value']; if(preg_match("/^!/", $val)) { unset($appliedHosts[$val]); } } foreach($hostgroupValues as $val) { $val = $val['value']; if(preg_match("/^!/", $val)) { $hg = NagiosHostgroupPeer::getByName($val); if(!$hg) { // Do nothing } else { $hosts = $hg->getMembers(); foreach($hosts as $tempHost) { unset($appliedHosts[$tempHost->getName()]); } } } } return $appliedHosts; } private function getTemplateValues($name) { $job = $this->getEngine()->getJob(); $template = NagiosHostExtInfoImporter::getTemplateByName($name); if(!$template) { $job->addNotice("FATAL ERROR: Failed to get template by name: " . $name); } // $template is a segment instance $values = $template->getValues(); if(isset($values['use'])) { // Multiple levels! $tempValues = $this->getTemplateValues($values['use'][0]['value']); // Okay, go through each foreach($tempValues as $key => $val) { if(!isset($values[$key])) { $values[$key] = $val; } } } return $values; } static function saveTemplate($name, $segment) { NagiosHostExtInfoImporter::$templates[$name] = $segment; } public function import() { $job = $this->getEngine()->getJob(); $config = $this->getEngine()->getConfig(); $segment = $this->getSegment(); $values = $segment->getValues(); $fileName = $segment->getFilename(); // We need to determine if we are a template if(isset($values['name'])) { // We are a template $job->addNotice("Saving internal host ext info template: " . $values['name'][0]['value']); NagiosHostExtInfoImporter::saveTemplate($values['name'][0]['value'], $segment); return true; } // Get our host obj if(isset($values['use'])) { // We sure are using a template! // Okay, hokey multi-inheritance support for the importer $tempValues = $this->getTemplateValues($values['use'][0]['value']); // Okay, go through each foreach($tempValues as $key => $val) { if(!isset($values[$key])) { $values[$key] = $val; } } } $appliedHosts = $this->getAppliedHosts(empty($values['host_name']) ? array() : $values['host_name'], empty($values['hostgroup_name']) ? array() : $values['hostgroup_name']); foreach($appliedHosts as $host) { foreach($values as $key => $entries) { foreach($entries as $entry) { // Skips $value = $entry['value']; $lineNum = $entry['line']; if($key == 'use' || $key == 'name' || $key == 'register' || $key == 'host_name' || $key == 'hostgroup_name') continue; // Okay, let's check that the method DOES exist if(!method_exists($host, $this->fieldMethods[$key])) { $job->addError("Method " . $this->fieldMethods[$key] . " does not exist for variable: " . $key . " on line " . $lineNum . " in file " . $fileName); if(!$config->getVar('continue_error')) { return false; } } else { call_user_method($this->fieldMethods[$key], $host, $value); } } } $host->save(); $job->addNotice("NagiosHostExtInfo finished importing extended info for :" . $host->getName()); } return true; } } ?>