462 lines
15 KiB
PHP
462 lines
15 KiB
PHP
|
<?php
|
||
|
/*
|
||
|
Lilac - A Nagios Configuration Tool
|
||
|
Copyright (C) 2007 Taylor Dondich
|
||
|
|
||
|
This program is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU General Public License
|
||
|
as published by the Free Software Foundation; either version 2
|
||
|
of the License, or (at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
Filename: search.php
|
||
|
*/
|
||
|
|
||
|
include_once('includes/config.inc');
|
||
|
|
||
|
|
||
|
class module_search_simple {
|
||
|
private $dbHost;
|
||
|
private $dbUsername;
|
||
|
private $dbPasswor;
|
||
|
private $dbDatabase ;
|
||
|
private $dbServ; // Database driver to use
|
||
|
private $dbConnection;
|
||
|
|
||
|
private $searchResults;
|
||
|
private $searchCount;
|
||
|
private $searchTemplate;
|
||
|
|
||
|
function __construct() {
|
||
|
global $sitedb_config;
|
||
|
global $path_config;
|
||
|
|
||
|
|
||
|
$this->searchResults = array();
|
||
|
$this->searchCount = 0;
|
||
|
|
||
|
$this->searchTemplate = array();
|
||
|
|
||
|
$this->searchTemplate['hosts'] = array( "type"=>"Hosts", "getName"=>"Host Name", "getAddress"=>"IP Address", "getAlias"=>"Alias");
|
||
|
$this->searchTemplate['hostgroups'] = array( "type"=>"Hostgroups", "getName"=>"Hostgroup Name", "getAlias"=>"Alias");
|
||
|
$this->searchTemplate['host_templates'] = array( "type"=>"Host Templates", "getName"=>"Template Name", "getDescription"=>"Description");
|
||
|
$this->searchTemplate['services'] = array( "type"=>"Services", "getDescription"=>"Service", "getOwnerDescription"=>"Owner Description");
|
||
|
$this->searchTemplate['servicegroups'] = array( "type"=>"Servicegroups", "getName"=>"servicegroup Name", "getAlias"=>"Alias");
|
||
|
$this->searchTemplate['service_templates'] = array( "type"=>"Service Templates", "getName"=>"Template Name", "getDescription"=>"Description");
|
||
|
$this->searchTemplate['contacts'] = array( "type"=>"Contacts", "getName"=>"Contact", "getAlias"=>"Alias", "getEmail"=>"Email");
|
||
|
$this->searchTemplate['contactgroups'] = array( "type"=>"Contactgroups", "getName"=>"Contactgroup Name", "getAlias"=>"Alias");
|
||
|
$this->searchTemplate['timeperiods'] = array( "type"=>"Timeperiods", "getName"=>"Timeperiod Name", "getAlias"=>"Alias");
|
||
|
$this->searchTemplate['commands'] = array( "type"=>"Commands", "getName"=>"Command Name", "getDescription"=>"Description");
|
||
|
|
||
|
$this->searchTemplate['hosts']['url'] = "hosts.php?id=@1@";
|
||
|
$this->searchTemplate['hostgroups']['url'] = "hostgroups.php?id=@1@";
|
||
|
$this->searchTemplate['host_templates']['url'] = "host_templates.php?id=@1@";
|
||
|
$this->searchTemplate['services']['url'] = "service.php?id=@1@";
|
||
|
$this->searchTemplate['servicegroups']['url'] = "servicegroups.php?servicegroup_id=@1@";
|
||
|
$this->searchTemplate['service_templates']['url'] = "service_template.php?id=@1@";
|
||
|
$this->searchTemplate['contacts']['url'] = "contacts.php?contact_id=@1@";
|
||
|
$this->searchTemplate['contactgroups']['url'] = "contactgroups.php?contact_id=@1@";
|
||
|
$this->searchTemplate['timeperiods']['url'] = "timeperiods.php?timeperiod_id=@1@";
|
||
|
$this->searchTemplate['commands']['url'] = "commands.php?command_id=@1@";
|
||
|
}
|
||
|
|
||
|
function __destruct() {
|
||
|
}
|
||
|
|
||
|
public function init() {
|
||
|
// Does nothing
|
||
|
}
|
||
|
|
||
|
public function restart() {
|
||
|
$this->dbConnection = ADONewConnection($this->dbServ);
|
||
|
$this->dbConnection->PConnect($this->dbHost, $this->dbUsername,
|
||
|
$this->dbPassword,$this->dbDatabase);
|
||
|
if(!$this->dbConnection->IsConnected()) {
|
||
|
print("DBAUTH Failure: Unable to connect to auth database. Please check your dbauth configuration.");
|
||
|
die();
|
||
|
}
|
||
|
$this->dbConnection->SetFetchMode(ADODB_FETCH_ASSOC);
|
||
|
}
|
||
|
|
||
|
public function render() {
|
||
|
$this->renderBasicSearch();
|
||
|
}
|
||
|
|
||
|
private function search_text( $text) {
|
||
|
// LOTS of places to check...
|
||
|
// Hosts: name, alias, addresses
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosHostPeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(nagiosHostPeer::ALIAS, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c3 = $c->getNewCriterion(nagiosHostPeer::ADDRESS, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2->addOr($c3);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosHostPeer::NAME);
|
||
|
|
||
|
$matchedHosts = NagiosHostPeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedHosts)) {
|
||
|
foreach($matchedHosts as $host) {
|
||
|
$this->searchResults['hosts'][$host->getId()] = $host;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Hostgroups: name, alias
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosHostgroupPeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(nagiosHostgroupPeer::ALIAS, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosHostgroupPeer::NAME);
|
||
|
$matchedHostgroups = NagiosHostgroupPeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedHostgroups)) {
|
||
|
foreach($matchedHostgroups as $hostgroup) {
|
||
|
$this->searchResults['hostgroups'][$hostgroup->getId()] = $hostgroup;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Host Templates: name, description
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosHostTemplatePeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(NagiosHostTemplatePeer::DESCRIPTION, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosHostTemplatePeer::NAME);
|
||
|
$matchedTemplates = NagiosHostTemplatePeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedTemplates)) {
|
||
|
foreach($matchedTemplates as $template) {
|
||
|
$this->searchResults['host_templates'][$template->getId()] = $template;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Services: description
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosServicePeer::DESCRIPTION, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosServicePeer::DESCRIPTION);
|
||
|
$matchedServices = NagiosServicePeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedServices)) {
|
||
|
foreach($matchedServices as $service) {
|
||
|
$this->searchResults['services'][$service->getId()] = $service;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Servicegroups: name, alias
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosServiceGroupPeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(NagiosServiceGroupPeer::ALIAS, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosServiceGroupPeer::NAME);
|
||
|
$matchedServicegroups = NagiosServiceGroupPeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedServicegroups)) {
|
||
|
foreach($matchedServicegroups as $servicegroup) {
|
||
|
$this->searchResults['servicegroups'][$servicegroup->getId()] = $servicegroup;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Service Templates: name, description
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosServiceTemplatePeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(NagiosServiceTemplatePeer::DESCRIPTION, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosServiceTemplatePeer::NAME);
|
||
|
$matchedTemplates = NagiosServiceTemplatePeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedTemplates)) {
|
||
|
foreach($matchedTemplates as $template) {
|
||
|
$this->searchResults['service_templates'][$template->getId()] = $template;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Service Templates: name, description
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosContactPeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(NagiosContactPeer::ALIAS, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c3 = $c->getNewCriterion(NagiosContactPeer::EMAIL, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2->addOr($c3);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosContactPeer::NAME);
|
||
|
$matchedContacts = NagiosContactPeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedContacts)) {
|
||
|
foreach($matchedContacts as $contact) {
|
||
|
$this->searchResults['contacts'][$contact->getId()] = $contact;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ContactGroups: name, alias
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosContactGroupPeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(NagiosContactGroupPeer::ALIAS, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosContactGroupPeer::NAME);
|
||
|
$matchedContactgroups = NagiosContactGroupPeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedContactgroups)) {
|
||
|
foreach($matchedContactgroups as $contactgroup) {
|
||
|
$this->searchResults['contactgroups'][$contactgroup->getId()] = $contactgroup;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Timeperiod: name, alias
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosTimeperiodPeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(NagiosTimeperiodPeer::ALIAS, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosTimeperiodPeer::NAME);
|
||
|
$matchedPeriods = NagiosTimeperiodPeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedPeriods)) {
|
||
|
foreach($matchedPeriods as $period) {
|
||
|
$this->searchResults['timeperiods'][$period->getId()] = $period;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Command: name, description
|
||
|
$c = new Criteria();
|
||
|
|
||
|
$c1 = $c->getNewCriterion(NagiosCommandPeer::NAME, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c2 = $c->getNewCriterion(NagiosCommandPeer::DESCRIPTION, "%" . $text . "%", Criteria::LIKE);
|
||
|
$c1->addOr($c2);
|
||
|
$c->add($c1);
|
||
|
$c->setIgnoreCase(true);
|
||
|
$c->addAscendingOrderByColumn(NagiosCommandPeer::NAME);
|
||
|
$matchedCommands = NagiosCommandPeer::doSelect($c);
|
||
|
|
||
|
if(count($matchedCommands)) {
|
||
|
foreach($matchedCommands as $command) {
|
||
|
$this->searchResults['commands'][$command->getId()] = $command;
|
||
|
$this->searchCount++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function doSearch() {
|
||
|
global $error, $success;
|
||
|
// Get settings from the POST
|
||
|
|
||
|
if(empty($_GET['query'])) {
|
||
|
$_GET['query'] = '';
|
||
|
}
|
||
|
|
||
|
$searchString = $_GET['query'];
|
||
|
$tokens = explode( " ", $searchString);
|
||
|
|
||
|
$this->searchResults = array();
|
||
|
$this->searchCount = 0;
|
||
|
|
||
|
if(count($tokens)) {
|
||
|
foreach( $tokens as $token) {
|
||
|
$token = trim($token);
|
||
|
$type = "text";
|
||
|
$area = "any";
|
||
|
// Determine the type of this token
|
||
|
/*
|
||
|
if( strpos( $token, ".") !== false) {
|
||
|
// Might be an ip address
|
||
|
if( preg_match( "/[0-9]{1,3}\.|\.[0-9]{1,3}/", $token)) {
|
||
|
$type = "ip";
|
||
|
}
|
||
|
}*/
|
||
|
|
||
|
$token = str_replace( "*", "%", $token);
|
||
|
$token = str_replace( "_", "\\_", $token);
|
||
|
switch( $type) {
|
||
|
case "ip": {
|
||
|
$this->search_ip( $token);
|
||
|
} break;
|
||
|
case "text":
|
||
|
default: {
|
||
|
$this->search_text( $token);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if( $this->searchCount == 0)
|
||
|
$error = "No results returned. Please adjust your search and try again.";
|
||
|
}
|
||
|
|
||
|
public function renderBasicSearch() {
|
||
|
global $path_config;
|
||
|
|
||
|
?>
|
||
|
<script type="text/javascript">
|
||
|
<!--
|
||
|
function clearSearch() {
|
||
|
id = document.getElementById("searchField");
|
||
|
if( id.value != "Enter a search") {
|
||
|
id.value = "";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function validateForm() {
|
||
|
id = document.getElementById("searchField");
|
||
|
if( id.value.length == 0) {
|
||
|
alert( "Please enter a search string before searching");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if( id.value == "Enter a search") {
|
||
|
alert( "Please enter a search string before searching");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
-->
|
||
|
</script>
|
||
|
<form action="search.php" method="post" target="rightHome" id="searchForm" onsubmit="return validateForm();">
|
||
|
<input type="hidden" id="simpleSearch" name="simpleSearch" value="1" />
|
||
|
<table align="right" cellspacing="0" cellpadding="0">
|
||
|
<tr>
|
||
|
<td><input type="text" size="45" name="searchField" id="searchField" value="Enter a search" onfocus="javascript:if(this.value=='Enter a search')this.value='';" /> </td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td align="right" colspan="4"><img src="<?php echo $path_config['image_root'];?>dotclear.gif" height="4" width="1" /></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td align="right"><input type="submit" value="Search" /> </td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
</form>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
public function renderAdvancedSearch() {
|
||
|
print "Advanced search page<br>\n";
|
||
|
}
|
||
|
|
||
|
public function renderResults() {
|
||
|
global $error;
|
||
|
if(count($this->searchResults)) {
|
||
|
|
||
|
foreach( $this->searchResults as $group=>$results) {
|
||
|
print_window_header( "Results in " . $this->searchTemplate[$group]['type'] . ": " . count($results), "100%", "center");
|
||
|
?>
|
||
|
<table width="95%" border="0" align="center" cellspacing="0" cellpadding="0">
|
||
|
<tr>
|
||
|
<?php
|
||
|
if(count($this->searchTemplate[$group])) {
|
||
|
foreach( $this->searchTemplate[$group] as $key=>$value) {
|
||
|
if( $key != "type" && $key != "url") {
|
||
|
print "\t<td style=\"padding: 2px; border-bottom: 1px solid #aaaaaa;\"><b>$value</b></td>\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
?>
|
||
|
</tr>
|
||
|
<?php
|
||
|
$count = 0;
|
||
|
$span = count( $this->searchTemplate[$group]) - 3;
|
||
|
$url = $this->searchTemplate[$group]['url'];
|
||
|
if(count($results)) {
|
||
|
foreach( $results as $id=>$result) {
|
||
|
$bgcolor = "#f0f0f0";
|
||
|
if( $count % 2) {
|
||
|
$bgcolor = "#cccccc";
|
||
|
}
|
||
|
print "<tr style=\"background-color: $bgcolor\">\n";
|
||
|
|
||
|
$n = 0;
|
||
|
if(count($this->searchTemplate[$group])) {
|
||
|
foreach( $this->searchTemplate[$group] as $key=>$value) {
|
||
|
if( $key != "type" && $key != "url") {
|
||
|
if( $n == 0) {
|
||
|
print "\t<td style=\"padding: 2px; border-left: 1px solid #aaaaaa; border-bottom: 1px solid #aaaaaa;\" valign=\"top\">";
|
||
|
} elseif( $n == $span) {
|
||
|
print "\t<td style=\"padding: 2px; border-right: 1px solid #aaaaaa; border-bottom: 1px solid #aaaaaa;\" valign=\"top\">";
|
||
|
} else {
|
||
|
print "\t<td style=\"padding: 2px; border-bottom: 1px solid #aaaaaa;\" valign=\"top\">";
|
||
|
}
|
||
|
|
||
|
if( strlen( $result->$key()) == 0) {
|
||
|
$temp = " ";
|
||
|
} else {
|
||
|
$temp = "<a href=\"" . str_replace( "@1@", $id, $url) . "\">" . $result->$key() . "</a>";
|
||
|
}
|
||
|
|
||
|
print $temp . "</td>\n";
|
||
|
$n++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
$count++;
|
||
|
|
||
|
print "</tr>\n";
|
||
|
}
|
||
|
|
||
|
}
|
||
|
?>
|
||
|
</table>
|
||
|
<br />
|
||
|
<?php
|
||
|
print_window_footer();
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$searchMod = new module_search_simple();
|
||
|
|
||
|
$searchMod->doSearch();
|
||
|
print_header("Search");
|
||
|
|
||
|
$searchMod->renderResults();
|
||
|
|
||
|
print_footer();
|
||
|
|
||
|
|
||
|
|
||
|
?>
|