summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--src/zabbix_server/server.c4
-rw-r--r--src/zabbix_server/utils/nodechange.c89
3 files changed, 90 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 65aef360..57547aa7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
Changes for 1.3.1:
+ - support of "-n" flag for ZABBIX server: change Node ID (Alexei)
- fixed configuration file creation and reading (Eugene)
- removed database creation from installation scriop (Eugene)
- fixed multiple mutex system (Eugene)
diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c
index 38e3e715..f30881b9 100644
--- a/src/zabbix_server/server.c
+++ b/src/zabbix_server/server.c
@@ -408,8 +408,8 @@ int main(int argc, char **argv)
exit(-1);
break;
case 'n':
- printf("[%s]\n", optarg);
- ZBX_STR2UINT64(nodeid,optarg);
+ nodeid=0;
+ if(optarg) ZBX_STR2UINT64(nodeid,optarg);
change_nodeid(0,nodeid);
exit(-1);
break;
diff --git a/src/zabbix_server/utils/nodechange.c b/src/zabbix_server/utils/nodechange.c
index 49c7a5f8..7e4debd1 100644
--- a/src/zabbix_server/utils/nodechange.c
+++ b/src/zabbix_server/utils/nodechange.c
@@ -39,6 +39,70 @@
/******************************************************************************
* *
+ * Function: convert_trigger_expression *
+ * *
+ * Purpose: convert trigger expression to new node ID *
+ * *
+ * Parameters: old_id - old id, new_id - new node id *
+ * old_exp - old expression, new_exp - new expression *
+ * *
+ * Return value: SUCCESS - converted succesfully *
+ * FAIL - an error occured *
+ * *
+ * Author: Alexei Vladishev *
+ * *
+ * Comments: *
+ * *
+ ******************************************************************************/
+static int convert_trigger_expression(zbx_uint64_t old_id, zbx_uint64_t new_id, char *old_exp, char *new_exp)
+{
+ int i;
+ char id[MAX_STRING_LEN];
+ enum state_t {NORMAL, ID} state = NORMAL;
+ char *p, *p_id;
+ zbx_uint64_t tmp;
+
+ p = new_exp;
+
+ for(i=0;old_exp[i]!=0;i++)
+ {
+ if(state == ID)
+ {
+ if(old_exp[i]=='}')
+ {
+ state = NORMAL;
+ ZBX_STR2UINT64(tmp,id);
+ tmp+=(zbx_uint64_t)__UINT64_C(100000000000000)*(zbx_uint64_t)new_id;
+ p+=zbx_snprintf(p,MAX_STRING_LEN,ZBX_FS_UI64, tmp);
+ p[0] = old_exp[i];
+ p++;
+ }
+ else
+ {
+ p_id[0] = old_exp[i];
+ p_id++;
+ }
+ }
+ else if(old_exp[i]=='{')
+ {
+ state = ID;
+ memset(id,0,MAX_STRING_LEN);
+ p_id = id;
+ p[0] = old_exp[i];
+ p++;
+ }
+ else
+ {
+ p[0] = old_exp[i];
+ p++;
+ }
+ }
+
+ return SUCCEED;
+}
+
+/******************************************************************************
+ * *
* Function: change_nodeid *
* *
* Purpose: convert database data to new node ID *
@@ -56,6 +120,10 @@
int change_nodeid(zbx_uint64_t old_id, zbx_uint64_t new_id)
{
int i,j;
+ DB_RESULT result;
+ DB_ROW row;
+ char new_expression[MAX_STRING_LEN];
+ char new_expression_esc[MAX_STRING_LEN];
if(old_id!=0)
{
@@ -67,9 +135,13 @@ int change_nodeid(zbx_uint64_t old_id, zbx_uint64_t new_id)
DBconnect();
+ printf("Converting tables ");
+ fflush(stdout);
+
for(i=0;tables[i].table!=0;i++)
{
- printf("Converting table %s...\n", tables[i].table);
+ printf(".");
+ fflush(stdout);
j=0;
while(tables[i].fields[j].name != 0)
@@ -83,8 +155,21 @@ int change_nodeid(zbx_uint64_t old_id, zbx_uint64_t new_id)
j++;
}
}
+/* Special processing for trigger expressions */
+
+ result=DBselect("select expression,triggerid from triggers");
+ while((row=DBfetch(result)))
+ {
+ memset(new_expression, 0, MAX_STRING_LEN);
+ convert_trigger_expression(old_id, new_id, row[0], new_expression);
+ DBescape_string(new_expression, new_expression_esc,MAX_STRING_LEN);
+ DBexecute("update triggers set expression='%s' where triggerid=%s",
+ new_expression_esc, row[1]);
+ }
+ DBfree_result(result);
+
DBclose();
- printf("Done.\n");
+ printf(" done.\n\nConversion completed.\n");
return SUCCEED;
}