As we needed a 1:1-copy of a host template we quickly discovered that it is a bit tricky to copy the data, because there are some relations that must be also duplicated. As we didn't find script to do this, we wrote our own (very basic) script. So there is no guarantee that it will work for your case.
Eventually a similar functionality will be implemented in future Zabbix versions.
This script will do the following (nothing more):
1. Copy selected host (append _1 to its new name)
2. Copy related items,functions and triggers for host
It was wrote to use no dependent scripts so dont be scared if the code is kinda ugly.
How to use it: Simply copy it into your zabbix-docroot-folder and open it with your browser.
Eventually a similar functionality will be implemented in future Zabbix versions.
This script will do the following (nothing more):
1. Copy selected host (append _1 to its new name)
2. Copy related items,functions and triggers for host
It was wrote to use no dependent scripts so dont be scared if the code is kinda ugly.
PHP Code:
<pre><?php
error_reporting(E_ALL);
$cleanExit = false;
function rollback() {
global $cleanExit;
if($cleanExit === false) {
$stack = debug_backtrace();
var_export($stack);
$result = mysql_query("ROLLBACK");
if(!$result) {
echo mysql_error();
echo "Error on shutdown";
} else {
echo "Shutdown completed with rollback";
}
}
else {
mysql_query("COMMIT");
echo "Shutdown completed with commit";
}
}
register_shutdown_function("rollback");
$db = mysql_connect("localhost","root","");
if(!$db) exit(__LINE__ . mysql_error());
if(!mysql_select_db("zabbix")) exit(__LINE__ . mysql_error());
$hostId = @$_GET['hostId'];
if(!$hostId) {
$result = mysql_query("SELECT * FROM hosts");
echo "<form action=host_copy.php method=get><table border=1>";
while($row = mysql_fetch_assoc($result)) {
echo "<tr>";
echo "<td><input type=radio name=hostId value=".$row['hostid']."></td>";
echo "<td>".$row['host'] ."</td>";
echo "</tr>";
}
echo "</table><input type=submit></form>";
exit;
}
$result = mysql_query("SET autocommit=0");
if(!$result) exit(__LINE__ . mysql_error());
$result = mysql_query("START TRANSACTION");
if(!$result) exit(__LINE__ . mysql_error());
$query = "INSERT INTO `hosts` (`host`, `useip`, `ip`, `port`, `status`, `disable_until`, `error`, `available`, `errors_from`, `templateid`)
SELECT CONCAT(`host`,'_1'), `useip`, `ip`, `port`, `status`, `disable_until`, `error`, `available`, `errors_from`, `templateid` FROM `hosts` WHERE `hostid`=".$hostId;
$result = mysql_query($query);
if(!$result) exit(__LINE__ . mysql_error());
$newHostId = mysql_insert_id();
if(!$newHostId) exit(__LINE__ . mysql_error());
echo "Created Host: $newHostId\n";
echo "Searching for items related to the host:\n";
$query = "SELECT `itemid` FROM `items` WHERE `hostid`=$hostId";
$result = mysql_query($query);
if(!$result) exit(__LINE__ . mysql_error());
echo "Found ".mysql_num_rows($result) ." items\n";
while($items_row = mysql_fetch_assoc($result)) {
echo "Duplicating item #".$items_row['itemid']."\n";
$query = "INSERT INTO `items` (`hostid`, `type`, `snmp_community`, `snmp_oid`, `snmp_port`, `description`, `key_`, `delay`, `history`, `trends`, `nextcheck`, `lastvalue`, `lastclock`, `prevvalue`, `status`, `value_type`, `trapper_hosts`, `units`, `multiplier`, `delta`, `prevorgvalue`, `snmpv3_securityname`, `snmpv3_securitylevel`, `snmpv3_authpassphrase`, `snmpv3_privpassphrase`, `formula`, `error`, `lastlogsize`, `logtimefmt`, `templateid`, `valuemapid`)
SELECT ".$newHostId.", `type`, `snmp_community`, `snmp_oid`, `snmp_port`, `description`, `key_`, `delay`, `history`, `trends`, `nextcheck`, `lastvalue`, `lastclock`, `prevvalue`, `status`, `value_type`, `trapper_hosts`, `units`, `multiplier`, `delta`, `prevorgvalue`, `snmpv3_securityname`, `snmpv3_securitylevel`, `snmpv3_authpassphrase`, `snmpv3_privpassphrase`, `formula`, `error`, `lastlogsize`, `logtimefmt`, `templateid`, `valuemapid` FROM `items` WHERE `itemid`=".$items_row['itemid'];
$result_dup_item = mysql_query($query);
if(!$result_dup_item) exit(__LINE__ . mysql_error());
$newItemId = mysql_insert_id();
if(!$newItemId) exit(__LINE__ . mysql_error());
echo "Successfull - new itemid: #".$newItemId . "\n";
echo "Searching for functions for item\n";
$query = "SELECT `functionid`,`itemid`,`triggerid` FROM `functions` WHERE `itemid`=".$items_row['itemid'];
$result_functions = mysql_query($query);
if(!$result_functions) exit(__LINE__ . mysql_error());
echo "Found ".mysql_num_rows($result_functions)." functions\n";
while($row_functions = mysql_fetch_assoc($result_functions)) {
echo "Duplicating Trigger #".$row_functions['triggerid']." for function\n";
$query = "INSERT INTO `triggers` (`expression`, `description`, `url`, `status`, `value`, `priority`, `lastchange`, `dep_level`, `comments`, `error`, `templateid`)
SELECT `expression`, `description`, `url`, `status`, `value`, `priority`, `lastchange`, `dep_level`, `comments`, `error`, `templateid` FROM `triggers` WHERE `triggerid`=".$row_functions['triggerid'];
$result_dup_trigger = mysql_query($query);
if(!$result_dup_trigger) exit(__LINE__ . mysql_error());
$newTriggerId = mysql_insert_id();
if(!$newTriggerId) exit(__LINE__ . mysql_error());
echo "Successful - new triggerid: #". $newTriggerId."\n";
echo "Duplicating function #". $row_functions['functionid']."\n";
$query = "INSERT INTO `functions` (`itemid`, `triggerid`, `lastvalue`, `function`, `parameter`)
SELECT ".$newItemId.", ".$newTriggerId.", `lastvalue`, `function`, `parameter` FROM `functions` WHERE `functionid`=".$row_functions['functionid'];
$result_dup_function = mysql_query($query);
if(!$result_dup_function) exit(__LINE__ . mysql_error());
$newFunctionId = mysql_insert_id();
if(!$newFunctionId) exit(__LINE__ . mysql_error());
echo "Successful - new functionid: #".$newFunctionId."\n";
echo "Updating trigger #".$newTriggerId." with new expression\n";
$query = "SELECT `expression` FROM `triggers` WHERE `triggerid`=".$newTriggerId;
$result_get_trigger = mysql_query($query);
if(!$result_get_trigger) exit(__LINE__ . mysql_error());
$trigger_data = mysql_fetch_assoc($result_get_trigger);
$expression = $trigger_data['expression'];
# var_export($expression);
$newExpression = preg_replace('/^\{[0-9]+\}(.*)/','{'.$newFunctionId . '}\1',$expression);
# var_export($expression);
if($newExpression == $expression || empty($newExpression)) {
exit(__LINE__ . " Expression can not be changed: $expression --> $newExpression");
}
$query = "UPDATE `triggers` SET `expression`='".mysql_real_escape_string($newExpression)."' WHERE `triggerid`=".$newTriggerId;
$result_update_trigger = mysql_query($query);
if(!$result_update_trigger) exit(__LINE__ . mysql_error());
echo "Successfully updated trigger expression: $expression --> $newExpression\n";
}
}
echo "Done.\n";
$cleanExit = true;
Comment