fixed server crash when scheduling file upload job with invalid parameters; job class...
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 28 Sep 2016 08:31:24 +0000 (11:31 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 28 Sep 2016 08:31:24 +0000 (11:31 +0300)
src/server/core/ap_jobs.cpp
src/server/core/job.cpp
src/server/core/jobmgr.cpp
src/server/core/jobqueue.cpp
src/server/core/node.cpp
src/server/core/session.cpp
src/server/core/upload_job.cpp
src/server/include/nxcore_jobs.h

index 2c8a8a0..7b21ed6 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Raden Solutions
 **
 ** 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
@@ -32,7 +32,7 @@ void ScheduleDeployPolicy(const ScheduledTaskParameters *params)
    {
       if (object->checkAccessRights(params->m_userId, OBJECT_ACCESS_CONTROL))
       {
-         ServerJob *job = new PolicyDeploymentJob(params->m_params, params->m_objectId, params->m_userId);
+         ServerJob *job = new PolicyInstallJob(params->m_params, params->m_objectId, params->m_userId);
          if (!AddJob(job))
          {
             delete job;
@@ -49,12 +49,10 @@ void ScheduleDeployPolicy(const ScheduledTaskParameters *params)
 /**
  * Constructor
  */
-PolicyDeploymentJob::PolicyDeploymentJob(Node *node, AgentPolicy *policy, UINT32 userId)
+PolicyInstallJob::PolicyInstallJob(Node *node, AgentPolicy *policy, UINT32 userId)
                     : ServerJob(_T("DEPLOY_AGENT_POLICY"), _T("Deploy agent policy"), node->getId(), userId, false)
 {
-       m_node = node;
        m_policy = policy;
-       node->incRefCount();
        policy->incRefCount();
 
        TCHAR buffer[1024];
@@ -62,45 +60,35 @@ PolicyDeploymentJob::PolicyDeploymentJob(Node *node, AgentPolicy *policy, UINT32
        setDescription(buffer);
 }
 
-
 /**
  * Constructor
  */
-PolicyDeploymentJob::PolicyDeploymentJob(const TCHAR* params, UINT32 node, UINT32 userId)
-                    : ServerJob(_T("DEPLOY_AGENT_POLICY"), _T("Deploy agent policy"), node, userId, false)
+PolicyInstallJob::PolicyInstallJob(const TCHAR *params, UINT32 nodeId, UINT32 userId)
+                    : ServerJob(_T("DEPLOY_AGENT_POLICY"), _T("Deploy agent policy"), nodeId, userId, false)
 {
    StringList paramList(params, _T(","));
-   if(paramList.size() < 1)
+   if (paramList.size() < 1)
    {
-      setIsValid(false);
+      m_policy = NULL;
+      invalidate();
       return;
    }
 
-       m_node = (Node *)FindObjectById(node, OBJECT_NODE);
        NetObj *obj = FindObjectById(_tcstol(paramList.get(0), NULL, 0));
-       if(obj != NULL && (obj->getObjectClass() == OBJECT_AGENTPOLICY || obj->getObjectClass() == OBJECT_AGENTPOLICY_CONFIG
-      || obj->getObjectClass() == OBJECT_AGENTPOLICY_LOGPARSER))
+       if (obj != NULL && (obj->getObjectClass() == OBJECT_AGENTPOLICY || obj->getObjectClass() == OBJECT_AGENTPOLICY_CONFIG ||
+       obj->getObjectClass() == OBJECT_AGENTPOLICY_LOGPARSER))
        {
       m_policy = (AgentPolicy *)obj;
-   }
-
-   if(m_node != NULL && m_policy != NULL)
-   {
-      m_node->incRefCount();
       m_policy->incRefCount();
    }
-   else
-   {
-      setIsValid(false);
-      return;
-   }
+       else
+       {
+          m_policy = NULL;
+          invalidate();
+          return;
+       }
 
-   if(paramList.size() >= 2)
-   {
-      m_retryCount = _tcstol(paramList.get(1), NULL, 0);
-   }
-   else
-      m_retryCount = 0;
+   m_retryCount = (paramList.size() >= 2) ? _tcstol(paramList.get(1), NULL, 0) : 0;
 
    TCHAR buffer[1024];
    _sntprintf(buffer, 1024, _T("Deploy policy %s"), m_policy->getName());
@@ -110,35 +98,32 @@ PolicyDeploymentJob::PolicyDeploymentJob(const TCHAR* params, UINT32 node, UINT3
 /**
  * Destructor
  */
-PolicyDeploymentJob::~PolicyDeploymentJob()
+PolicyInstallJob::~PolicyInstallJob()
 {
-   if(isValid())
-   {
-      m_node->decRefCount();
+   if (m_policy != NULL)
       m_policy->decRefCount();
-   }
 }
 
 /**
  * Run job
  */
-ServerJobResult PolicyDeploymentJob::run()
+ServerJobResult PolicyInstallJob::run()
 {
-   ServerJobResult success = JOB_RESULT_FAILED;
+   ServerJobResult result = JOB_RESULT_FAILED;
 
    TCHAR jobName[1024];
    _sntprintf(jobName, 1024, _T("Deploy policy %s"), m_policy->getName());
 
    setDescription(jobName);
-   AgentConnectionEx *conn = m_node->createAgentConnection(true);
+   AgentConnectionEx *conn = getNode()->createAgentConnection(true);
    if (conn != NULL)
    {
       UINT32 rcc = conn->deployPolicy(m_policy);
       conn->decRefCount();
       if (rcc == ERR_SUCCESS)
       {
-         m_policy->linkNode(m_node);
-         success = JOB_RESULT_SUCCESS;
+         m_policy->linkNode(getNode());
+         result = JOB_RESULT_SUCCESS;
       }
       else
       {
@@ -150,20 +135,20 @@ ServerJobResult PolicyDeploymentJob::run()
       setFailureMessage(_T("Agent connection not available"));
    }
 
-   if(success == JOB_RESULT_FAILED && m_retryCount-- > 0)
+   if ((result == JOB_RESULT_FAILED) && (m_retryCount-- > 0))
    {
       TCHAR description[256];
-      _sntprintf(description, 256, _T("Policy deploy failed. Wainting %d minutes to restart job."), getRetryDelay() / 60);
+      _sntprintf(description, 256, _T("Policy installation failed. Waiting %d minutes to restart job."), getRetryDelay() / 60);
       setDescription(description);
-      success = JOB_RESULT_RESCHEDULE;
+      result = JOB_RESULT_RESCHEDULE;
    }
-       return success;
+       return result;
 }
 
 /**
  * Serializes job parameters into TCHAR line separated by ';'
  */
-const String PolicyDeploymentJob::serializeParameters()
+const String PolicyInstallJob::serializeParameters()
 {
    String params;
    params.append(m_policy->getId());
@@ -175,14 +160,13 @@ const String PolicyDeploymentJob::serializeParameters()
 /**
  * Schedules execution in 10 minutes
  */
-void PolicyDeploymentJob::rescheduleExecution()
+void PolicyInstallJob::rescheduleExecution()
 {
-   AddOneTimeScheduledTask(_T("Policy.Deploy"), time(NULL) + getRetryDelay(), serializeParameters(), 0, getRemoteNode(), SYSTEM_ACCESS_FULL, SCHEDULED_TASK_SYSTEM);//TODO: change to correct user
+   AddOneTimeScheduledTask(_T("Policy.Deploy"), time(NULL) + getRetryDelay(), serializeParameters(), 0, getNodeId(), SYSTEM_ACCESS_FULL, SCHEDULED_TASK_SYSTEM);//TODO: change to correct user
 }
 
-
 /**
- * Scheduled file upload
+ * Scheduled policy uninstall
  */
 void ScheduleUninstallPolicy(const ScheduledTaskParameters *params)
 {
@@ -211,9 +195,7 @@ void ScheduleUninstallPolicy(const ScheduledTaskParameters *params)
 PolicyUninstallJob::PolicyUninstallJob(Node *node, AgentPolicy *policy, UINT32 userId)
                    : ServerJob(_T("UNINSTALL_AGENT_POLICY"), _T("Uninstall agent policy"), node->getId(), userId, false)
 {
-       m_node = node;
        m_policy = policy;
-       node->incRefCount();
        policy->incRefCount();
 
        TCHAR buffer[1024];
@@ -228,37 +210,28 @@ PolicyUninstallJob::PolicyUninstallJob(const TCHAR* params, UINT32 node, UINT32
                     : ServerJob(_T("DEPLOY_AGENT_POLICY"), _T("Deploy agent policy"), node, userId, false)
 {
    StringList paramList(params, _T(","));
-   if(paramList.size() < 1)
+   if (paramList.size() < 1)
    {
-      setIsValid(false);
+      m_policy = NULL;
+      invalidate();
       return;
    }
 
-       m_node = (Node *)FindObjectById(node, OBJECT_NODE);
        NetObj *obj = FindObjectById(_tcstol(paramList.get(0), NULL, 0));
        if(obj != NULL && (obj->getObjectClass() == OBJECT_AGENTPOLICY || obj->getObjectClass() == OBJECT_AGENTPOLICY_CONFIG
       || obj->getObjectClass() == OBJECT_AGENTPOLICY_LOGPARSER))
        {
       m_policy = (AgentPolicy *)obj;
-   }
-
-   if(m_node != NULL && m_policy != NULL)
-   {
-      m_node->incRefCount();
       m_policy->incRefCount();
    }
-   else
-   {
-      setIsValid(false);
+       else
+       {
+      m_policy = NULL;
+      invalidate();
       return;
-   }
+       }
 
-   if(paramList.size() >= 2)
-   {
-      m_retryCount = _tcstol(paramList.get(1), NULL, 0);
-   }
-   else
-      m_retryCount = 0;
+   m_retryCount = (paramList.size() >= 2) ? _tcstol(paramList.get(1), NULL, 0) : 0;
 
    TCHAR buffer[1024];
    _sntprintf(buffer, 1024, _T("Uninstall policy %s"), m_policy->getName());
@@ -270,11 +243,8 @@ PolicyUninstallJob::PolicyUninstallJob(const TCHAR* params, UINT32 node, UINT32
  */
 PolicyUninstallJob::~PolicyUninstallJob()
 {
-   if(isValid())
-   {
-      m_node->decRefCount();
+   if (m_policy != NULL)
       m_policy->decRefCount();
-   }
 }
 
 /**
@@ -282,17 +252,17 @@ PolicyUninstallJob::~PolicyUninstallJob()
  */
 ServerJobResult PolicyUninstallJob::run()
 {
-       ServerJobResult success = JOB_RESULT_FAILED;
+       ServerJobResult result = JOB_RESULT_FAILED;
 
-       AgentConnectionEx *conn = m_node->createAgentConnection();
+       AgentConnectionEx *conn = getNode()->createAgentConnection();
        if (conn != NULL)
        {
                UINT32 rcc = conn->uninstallPolicy(m_policy);
                conn->decRefCount();
                if (rcc == ERR_SUCCESS)
                {
-                       m_policy->unlinkNode(m_node);
-                       success = JOB_RESULT_SUCCESS;
+                       m_policy->unlinkNode(getNode());
+                       result = JOB_RESULT_SUCCESS;
                }
                else
                {
@@ -304,15 +274,15 @@ ServerJobResult PolicyUninstallJob::run()
                setFailureMessage(_T("Agent connection not available"));
        }
 
-   if(success == JOB_RESULT_FAILED && m_retryCount-- > 0)
+   if ((result == JOB_RESULT_FAILED) && (m_retryCount-- > 0))
    {
       TCHAR description[256];
-      _sntprintf(description, 256, _T("Policy uninstall failed. Wainting %d minutes to restart job."), getRetryDelay() / 60);
+      _sntprintf(description, 256, _T("Policy uninstall failed. Waiting %d minutes to restart job."), getRetryDelay() / 60);
       setDescription(description);
-      success = JOB_RESULT_RESCHEDULE;
+      result = JOB_RESULT_RESCHEDULE;
    }
 
-       return success;
+       return result;
 }
 
 /**
@@ -332,5 +302,5 @@ const String PolicyUninstallJob::serializeParameters()
  */
 void PolicyUninstallJob::rescheduleExecution()
 {
-   AddOneTimeScheduledTask(_T("Policy.Uninstall"), time(NULL) + getRetryDelay(), serializeParameters(), 0, getRemoteNode(), SYSTEM_ACCESS_FULL, SCHEDULED_TASK_SYSTEM);//TODO: change to correct user
+   AddOneTimeScheduledTask(_T("Policy.Uninstall"), time(NULL) + getRetryDelay(), serializeParameters(), 0, getNodeId(), SYSTEM_ACCESS_FULL, SCHEDULED_TASK_SYSTEM);//TODO: change to correct user
 }
index ca269e3..cfcccc1 100644 (file)
  */
 void UnregisterJob(UINT32 jobId);
 
-
 /**
  * Constructor
  */
-ServerJob::ServerJob(const TCHAR *type, const TCHAR *description, UINT32 node, UINT32 userId, bool createOnHold, int retryCount)
+ServerJob::ServerJob(const TCHAR *type, const TCHAR *description, UINT32 nodeId, UINT32 userId, bool createOnHold, int retryCount)
 {
        m_id = CreateUniqueId(IDG_JOB);
        m_userId = userId;
@@ -41,8 +40,8 @@ ServerJob::ServerJob(const TCHAR *type, const TCHAR *description, UINT32 node, U
        m_status = createOnHold ? JOB_ON_HOLD : JOB_PENDING;
        m_lastStatusChange = time(NULL);
        m_autoCancelDelay = 0;
-       m_remoteNode = node;
-       m_resolvedObject = FindObjectById(m_remoteNode);
+       m_nodeId = nodeId;
+       m_node = (Node *)FindObjectById(m_nodeId, OBJECT_NODE);
        m_progress = 0;
        m_failureMessage = NULL;
        m_owningQueue = NULL;
@@ -51,7 +50,10 @@ ServerJob::ServerJob(const TCHAR *type, const TCHAR *description, UINT32 node, U
        m_notificationLock = MutexCreate();
        m_blockNextJobsOnFailure = false;
        m_retryCount = retryCount == -1 ? ConfigReadInt(_T("JobRetryCount"), 5) : retryCount;
-       m_isValid = (m_resolvedObject != NULL) && (m_resolvedObject->getObjectClass() == OBJECT_NODE);
+       m_valid = (m_node != NULL);
+
+   if (m_node != NULL)
+      m_node->incRefCount();
 
        createHistoryRecord();
 }
@@ -59,7 +61,7 @@ ServerJob::ServerJob(const TCHAR *type, const TCHAR *description, UINT32 node, U
 /**
  * Constructor that creates class from serialized string
  */
-ServerJob::ServerJob(const TCHAR* params, UINT32 node, UINT32 userId)
+ServerJob::ServerJob(const TCHAR *params, UINT32 nodeId, UINT32 userId)
 {
        m_id = CreateUniqueId(IDG_JOB);
        m_userId = userId;
@@ -68,8 +70,8 @@ ServerJob::ServerJob(const TCHAR* params, UINT32 node, UINT32 userId)
        m_description = _tcsdup(_T(""));
        m_lastStatusChange = time(NULL);
        m_autoCancelDelay = 0;
-       m_remoteNode = node;
-       m_resolvedObject = FindObjectById(m_remoteNode);
+   m_nodeId = nodeId;
+   m_node = (Node *)FindObjectById(m_nodeId, OBJECT_NODE);
        m_progress = 0;
        m_failureMessage = NULL;
        m_owningQueue = NULL;
@@ -78,7 +80,10 @@ ServerJob::ServerJob(const TCHAR* params, UINT32 node, UINT32 userId)
        m_notificationLock = MutexCreate();
        m_blockNextJobsOnFailure = false;
        m_retryCount = ConfigReadInt(_T("JobRetryCount"), 5);
-       m_isValid = (m_resolvedObject != NULL) && (m_resolvedObject->getObjectClass() == OBJECT_NODE);
+   m_valid = (m_node != NULL);
+
+   if (m_node != NULL)
+      m_node->incRefCount();
 
        createHistoryRecord();
 }
@@ -92,12 +97,14 @@ ServerJob::~ServerJob()
 
        ThreadJoin(m_workerThread);
 
-       safe_free(m_type);
-       safe_free(m_description);
-       safe_free(m_failureMessage);
+       free(m_type);
+       free(m_description);
+       free(m_failureMessage);
        MutexDestroy(m_notificationLock);
-}
 
+   if (m_node != NULL)
+      m_node->decRefCount();
+}
 
 /**
  * Send notification to clients
@@ -105,7 +112,7 @@ ServerJob::~ServerJob()
 void ServerJob::sendNotification(ClientSession *session, void *arg)
 {
        ServerJob *job = (ServerJob *)arg;
-       if (job->m_resolvedObject->checkAccessRights(session->getUserId(), OBJECT_ACCESS_READ))
+       if (job->m_node->checkAccessRights(session->getUserId(), OBJECT_ACCESS_READ))
                session->postMessage(&job->m_notificationMessage);
 }
 
@@ -115,7 +122,7 @@ void ServerJob::sendNotification(ClientSession *session, void *arg)
  */
 void ServerJob::notifyClients(bool isStatusChange)
 {
-       if (m_resolvedObject == NULL)
+       if (m_node == NULL)
                return;
 
        time_t t = time(NULL);
@@ -282,7 +289,7 @@ bool ServerJob::onCancel()
  */
 void ServerJob::setFailureMessage(const TCHAR *msg)
 {
-       safe_free(m_failureMessage);
+       free(m_failureMessage);
        m_failureMessage = (msg != NULL) ? _tcsdup(msg) : NULL;
 }
 
@@ -292,7 +299,7 @@ void ServerJob::setFailureMessage(const TCHAR *msg)
  */
 void ServerJob::setDescription(const TCHAR *description)
 {
-       safe_free(m_description);
+       free(m_description);
        m_description = _tcsdup(description);
 }
 
@@ -305,7 +312,7 @@ void ServerJob::fillMessage(NXCPMessage *msg)
        msg->setField(VID_JOB_ID, m_id);
        msg->setField(VID_USER_ID, m_userId);
        msg->setField(VID_JOB_TYPE, m_type);
-       msg->setField(VID_OBJECT_ID, m_remoteNode);
+       msg->setField(VID_OBJECT_ID, m_nodeId);
        msg->setField(VID_DESCRIPTION, CHECK_NULL_EX(m_description));
        msg->setField(VID_JOB_STATUS, (WORD)m_status);
        msg->setField(VID_JOB_PROGRESS, (WORD)m_progress);
@@ -331,7 +338,7 @@ void ServerJob::createHistoryRecord()
                DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, (UINT32)time(NULL));
                DBBind(hStmt, 3, DB_SQLTYPE_VARCHAR, m_type, DB_BIND_STATIC);
                DBBind(hStmt, 4, DB_SQLTYPE_VARCHAR, CHECK_NULL_EX(m_description), DB_BIND_STATIC);
-               DBBind(hStmt, 5, DB_SQLTYPE_INTEGER, m_remoteNode);
+               DBBind(hStmt, 5, DB_SQLTYPE_INTEGER, m_nodeId);
                DBBind(hStmt, 6, DB_SQLTYPE_INTEGER, m_userId);
                DBBind(hStmt, 7, DB_SQLTYPE_INTEGER, (LONG)m_status);
                DBExecute(hStmt);
index f48f5cf..0ff0fe2 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2011 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Raden Solutions
 **
 ** 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
@@ -22,7 +22,6 @@
 
 #include "nxcore.h"
 
-
 /**
  * Job operation codes
  */
 #define HOLD_JOB                       1
 #define UNHOLD_JOB             2
 
-
 /**
  * Static data
  */
 static ObjectIndex s_jobNodes;
 
-
 /**
  * Add job
  */
 bool NXCORE_EXPORTABLE AddJob(ServerJob *job)
 {
        bool success = false;
-
-       NetObj *object = FindObjectById(job->getRemoteNode());
        if (job->isValid())
        {
-               ServerJobQueue *queue = ((Node *)object)->getJobQueue();
+               ServerJobQueue *queue = job->getNode()->getJobQueue();
                queue->add(job);
-               s_jobNodes.put(job->getId(), object);
+               s_jobNodes.put(job->getId(), job->getNode());
                success = true;
        }
        return success;
 }
 
-
 /**
  * Unregister job from job manager
  */
@@ -64,9 +58,8 @@ void UnregisterJob(UINT32 jobId)
        s_jobNodes.remove(jobId);
 }
 
-
 /**
- * Get job list
+ * Data for job enumeration callback
  */
 struct __job_callback_data
 {
@@ -75,6 +68,9 @@ struct __job_callback_data
        UINT32 baseId;
 };
 
+/**
+ * Callback for job enumeration
+ */
 static void JobListCallback(NetObj *object, void *data)
 {
        struct __job_callback_data *jcb = (struct __job_callback_data *)data;
@@ -82,6 +78,9 @@ static void JobListCallback(NetObj *object, void *data)
        jcb->jobCount += queue->fillMessage(jcb->msg, &jcb->baseId);
 }
 
+/**
+ * Get list of all jobs
+ */
 void GetJobList(NXCPMessage *msg)
 {
        struct __job_callback_data jcb;
@@ -93,7 +92,6 @@ void GetJobList(NXCPMessage *msg)
        msg->setField(VID_JOB_COUNT, jcb.jobCount);
 }
 
-
 /**
  * Implementatoin for job status changing operations: cancel, hold, unhold
  */
@@ -139,7 +137,6 @@ static UINT32 ChangeJobStatus(UINT32 userId, NXCPMessage *msg, int operation)
        return rcc;
 }
 
-
 /**
  * Cancel job
  */
@@ -148,7 +145,6 @@ UINT32 NXCORE_EXPORTABLE CancelJob(UINT32 userId, NXCPMessage *msg)
        return ChangeJobStatus(userId, msg, CANCEL_JOB);
 }
 
-
 /**
  * Hold job
  */
@@ -157,7 +153,6 @@ UINT32 NXCORE_EXPORTABLE HoldJob(UINT32 userId, NXCPMessage *msg)
        return ChangeJobStatus(userId, msg, HOLD_JOB);
 }
 
-
 /**
  * Unhold job
  */
@@ -166,9 +161,8 @@ UINT32 NXCORE_EXPORTABLE UnholdJob(UINT32 userId, NXCPMessage *msg)
        return ChangeJobStatus(userId, msg, UNHOLD_JOB);
 }
 
-
 /**
- * Job manager worker thread
+ * Cleanup job queue
  */
 static void CleanupJobQueue(NetObj *object, void *data)
 {
@@ -176,6 +170,9 @@ static void CleanupJobQueue(NetObj *object, void *data)
        queue->cleanup();
 }
 
+/**
+ * Job manager worker thread
+ */
 THREAD_RESULT THREAD_CALL JobManagerThread(void *arg)
 {
        DbgPrintf(2, _T("Job Manager worker thread started"));
index 8b3f943..c6f3d43 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2012 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Raden Solutions
 **
 ** 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
@@ -62,7 +62,7 @@ void ServerJobQueue::add(ServerJob *job)
        MutexUnlock(m_accessMutex);
 
        DbgPrintf(4, _T("Job %d added to queue (node=%d, type=%s, description=\"%s\")"),
-                 job->getId(), job->getRemoteNode(), job->getType(), job->getDescription());
+                 job->getId(), job->getNodeId(), job->getType(), job->getDescription());
 
        runNext();
 }
@@ -124,8 +124,8 @@ bool ServerJobQueue::cancel(UINT32 jobId)
                {
                        if (m_jobList[i]->cancel())
                        {
-                               DbgPrintf(4, _T("Job %d cancelled (node=%d, type=%s, description=\"%s\")"),
-                                                        m_jobList[i]->getId(), m_jobList[i]->getRemoteNode(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
+                               nxlog_debug(4, _T("Job %d cancelled (node=%d, type=%s, description=\"%s\")"),
+                                                          m_jobList[i]->getId(), m_jobList[i]->getNodeId(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
 
                                if (m_jobList[i]->getStatus() != JOB_CANCEL_PENDING)
                                {
@@ -158,8 +158,8 @@ bool ServerJobQueue::hold(UINT32 jobId)
                {
                        if (m_jobList[i]->hold())
                        {
-                               DbgPrintf(4, _T("Job %d put on hold (node=%d, type=%s, description=\"%s\")"),
-                                                        m_jobList[i]->getId(), m_jobList[i]->getRemoteNode(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
+                               nxlog_debug(4, _T("Job %d put on hold (node=%d, type=%s, description=\"%s\")"),
+                                                          m_jobList[i]->getId(), m_jobList[i]->getNodeId(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
 
                                success = true;
                        }
@@ -185,8 +185,8 @@ bool ServerJobQueue::unhold(UINT32 jobId)
                {
                        if (m_jobList[i]->unhold())
                        {
-                               DbgPrintf(4, _T("Job %d unhold (node=%d, type=%s, description=\"%s\")"),
-                                                        m_jobList[i]->getId(), m_jobList[i]->getRemoteNode(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
+                               nxlog_debug(4, _T("Job %d unhold (node=%d, type=%s, description=\"%s\")"),
+                                                          m_jobList[i]->getId(), m_jobList[i]->getNodeId(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
 
                                success = true;
                        }
@@ -215,8 +215,8 @@ void ServerJobQueue::cleanup()
                        int delay = m_jobList[i]->getAutoCancelDelay();
                        if ((delay > 0) && (now - m_jobList[i]->getLastStatusChange() >= delay))
                        {
-                               DbgPrintf(4, _T("Failed job %d deleted from queue (node=%d, type=%s, description=\"%s\")"),
-                                                        m_jobList[i]->getId(), m_jobList[i]->getRemoteNode(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
+                               nxlog_debug(4, _T("Failed job %d deleted from queue (node=%d, type=%s, description=\"%s\")"),
+                                                          m_jobList[i]->getId(), m_jobList[i]->getNodeId(), m_jobList[i]->getType(), m_jobList[i]->getDescription());
 
                                // Delete and remove from list
                                m_jobList[i]->cancel();
@@ -265,7 +265,7 @@ UINT32 ServerJobQueue::fillMessage(NXCPMessage *msg, UINT32 *varIdBase)
                msg->setField(id++, m_jobList[i]->getId());
                msg->setField(id++, m_jobList[i]->getType());
                msg->setField(id++, m_jobList[i]->getDescription());
-               msg->setField(id++, m_jobList[i]->getRemoteNode());
+               msg->setField(id++, m_jobList[i]->getNodeId());
                msg->setField(id++, (WORD)m_jobList[i]->getStatus());
                msg->setField(id++, (WORD)m_jobList[i]->getProgress());
                msg->setField(id++, m_jobList[i]->getFailureMessage());
index a2224c2..107c96e 100644 (file)
@@ -1952,7 +1952,7 @@ void Node::checkAgentPolicyBinding(AgentConnection *conn)
                                }
                                if (j == ap->size())
             {
-               ServerJob *job = new PolicyDeploymentJob(this, (AgentPolicy *)m_parentList->get(i), 0); //TODO: change to system user
+               ServerJob *job = new PolicyInstallJob(this, (AgentPolicy *)m_parentList->get(i), 0);
                                        if (AddJob(job))
                                        {
                   DbgPrintf(5, _T("ConfPoll(%s): \"%s\" policy deploy scheduled for \"%s\" node"), m_name, m_parentList->get(i)->getName(), m_name );
index 421e361..56db126 100644 (file)
@@ -11462,7 +11462,7 @@ void ClientSession::deployAgentPolicy(NXCPMessage *request, bool uninstallFlag)
                                        if (uninstallFlag)
                                                job = new PolicyUninstallJob((Node *)target, (AgentPolicy *)policy, m_dwUserId);
                                        else
-                                               job = new PolicyDeploymentJob((Node *)target, (AgentPolicy *)policy, m_dwUserId);
+                                               job = new PolicyInstallJob((Node *)target, (AgentPolicy *)policy, m_dwUserId);
                                        if (AddJob(job))
                                        {
                                                msg.setField(VID_RCC, RCC_SUCCESS);
index 5ecd0c8..6c945fd 100644 (file)
@@ -39,7 +39,6 @@ void ScheduledFileUpload(const ScheduledTaskParameters *params)
    {
       if (object->checkAccessRights(params->m_userId, OBJECT_ACCESS_CONTROL))
       {
-
          ServerJob *job = new FileUploadJob(params->m_params, params->m_objectId, params->m_userId);
          if (!AddJob(job))
          {
@@ -70,9 +69,6 @@ void FileUploadJob::init()
 FileUploadJob::FileUploadJob(Node *node, const TCHAR *localFile, const TCHAR *remoteFile, UINT32 userId, bool createOnHold)
               : ServerJob(_T("UPLOAD_FILE"), _T("Upload file to managed node"), node->getId(), userId, createOnHold)
 {
-       m_node = node;
-       node->incRefCount();
-
        TCHAR buffer[1024];
        _sntprintf(buffer, 1024, _T("Upload file %s"), GetCleanFileName(localFile));
        setDescription(buffer);
@@ -87,21 +83,32 @@ FileUploadJob::FileUploadJob(Node *node, const TCHAR *localFile, const TCHAR *re
        m_fileSize = 0;
 }
 
-FileUploadJob::FileUploadJob(TCHAR* params, UINT32 node, UINT32 userId)
-              : ServerJob(_T("UPLOAD_FILE"), _T("Upload file to managed node"), node, userId, false)
+/**
+ * Create file upload job from scheduled task
+ */
+FileUploadJob::FileUploadJob(const TCHAR *params, UINT32 nodeId, UINT32 userId)
+              : ServerJob(_T("UPLOAD_FILE"), _T("Upload file to managed node"), nodeId, userId, false)
 {
-       m_node = (Node *)FindObjectById(node, OBJECT_NODE);
-       if(m_node != NULL)
-      m_node->incRefCount();
+   m_localFile = NULL;
+   m_localFileFullPath = NULL;
+   m_remoteFile = NULL;
+   m_info = NULL;
+
+   if (!isValid())
+   {
+      nxlog_debug(4, _T("FileUploadJob: base job object is invalid for (\"%s\", nodeId=%d, userId=%d)"), params, nodeId, userId);
+      return;
+   }
 
    StringList fileList(params, _T(","));
-   if(fileList.size() < 2)
+   if (fileList.size() < 2)
    {
-      setIsValid(false);
+      nxlog_debug(4, _T("FileUploadJob: invalid job parameters \"%s\" (nodeId=%d, userId=%d)"), params, nodeId, userId);
+      invalidate();
       return;
    }
 
-   if(fileList.size() == 3)
+   if (fileList.size() == 3)
       m_retryCount = _tcstol(fileList.get(2), NULL, 0);
 
        TCHAR buffer[1024];
@@ -118,6 +125,20 @@ FileUploadJob::FileUploadJob(TCHAR* params, UINT32 node, UINT32 userId)
        m_fileSize = 0;
 }
 
+/**
+ *  Destructor
+ */
+FileUploadJob::~FileUploadJob()
+{
+       free(m_localFile);
+       free(m_localFileFullPath);
+       free(m_remoteFile);
+       free(m_info);
+}
+
+/**
+ * Set full path for local file
+ */
 void FileUploadJob::setLocalFileFullPath()
 {
    int nLen;
@@ -132,18 +153,6 @@ void FileUploadJob::setLocalFileFullPath()
    m_localFileFullPath = _tcsdup(fullPath);
 }
 
-/**
- *  Destructor
- */
-FileUploadJob::~FileUploadJob()
-{
-       m_node->decRefCount();
-       safe_free(m_localFile);
-       safe_free(m_localFileFullPath);
-       safe_free(m_remoteFile);
-       safe_free(m_info);
-}
-
 /**
  * Run job
  */
@@ -164,7 +173,7 @@ ServerJobResult FileUploadJob::run()
                ThreadSleep(5);
        }
 
-       AgentConnectionEx *conn = m_node->createAgentConnection();
+       AgentConnectionEx *conn = getNode()->createAgentConnection();
        if (conn != NULL)
        {
                m_fileSize = (INT64)FileSize(m_localFileFullPath);
@@ -237,5 +246,5 @@ const String FileUploadJob::serializeParameters()
  */
 void FileUploadJob::rescheduleExecution()
 {
-   AddOneTimeScheduledTask(_T("Policy.Uninstall"), time(NULL) + getRetryDelay(), serializeParameters(), 0, getRemoteNode(), SYSTEM_ACCESS_FULL, SCHEDULED_TASK_SYSTEM);//TODO: change to correct user
+   AddOneTimeScheduledTask(_T("Policy.Uninstall"), time(NULL) + getRetryDelay(), serializeParameters(), 0, getNodeId(), SYSTEM_ACCESS_FULL, SCHEDULED_TASK_SYSTEM);//TODO: change to correct user
 }
index 7a73f0f..6368186 100644 (file)
@@ -64,7 +64,8 @@ private:
        UINT32 m_id;
        UINT32 m_userId;
        TCHAR *m_type;
-       UINT32 m_remoteNode;
+       UINT32 m_nodeId;
+   Node *m_node;
        TCHAR *m_description;
        ServerJobStatus m_status;
        int m_progress;
@@ -74,11 +75,10 @@ private:
        time_t m_lastStatusChange;
        int m_autoCancelDelay;  // Interval in seconds to cancel failed job automatically (0 = disabled)
        time_t m_lastNotification;
-       NetObj *m_resolvedObject;
        MUTEX m_notificationLock;
        NXCPMessage m_notificationMessage;
        bool m_blockNextJobsOnFailure;
-       bool m_isValid;
+       bool m_valid;
 
        static THREAD_RESULT THREAD_CALL WorkerThreadStarter(void *);
        static void sendNotification(ClientSession *session, void *arg);
@@ -99,12 +99,13 @@ protected:
        void markProgress(int pctCompleted);
        void setFailureMessage(const TCHAR *msg);
        void setDescription(const TCHAR *description);
+   void invalidate() { m_valid = false; }
 
        int getRetryDelay();
 
 public:
-       ServerJob(const TCHAR *type, const TCHAR *description, UINT32 node, UINT32 userId, bool createOnHold, int retryCount = -1);
-       ServerJob(const TCHAR* params, UINT32 node, UINT32 userId);
+       ServerJob(const TCHAR *type, const TCHAR *description, UINT32 nodeId, UINT32 userId, bool createOnHold, int retryCount = -1);
+       ServerJob(const TCHAR *params, UINT32 nodeId, UINT32 userId);
        virtual ~ServerJob();
 
        void start();
@@ -113,22 +114,22 @@ public:
        bool unhold();
 
        void setAutoCancelDelay(int delay) { m_autoCancelDelay = delay; }
-       int getAutoCancelDelay() { return m_autoCancelDelay; }
+       int getAutoCancelDelay() const { return m_autoCancelDelay; }
 
        void setBlockNextJobsOnFailure(bool flag) { m_blockNextJobsOnFailure = flag; }
-       bool isBlockNextJobsOnFailure() { return m_blockNextJobsOnFailure; }
-       void setIsValid(bool valid) { m_isValid = valid; }
-       bool isValid() { return m_isValid; }
-
-       UINT32 getId() { return m_id; }
-       UINT32 getUserId() { return m_userId; }
-       const TCHAR *getType() { return m_type; }
-       const TCHAR *getDescription() { return m_description; }
-       ServerJobStatus getStatus() { return m_status; }
-       int getProgress() { return m_progress; }
-       UINT32 getRemoteNode() { return m_remoteNode; }
-       const TCHAR *getFailureMessage() { return CHECK_NULL_EX(m_failureMessage); }
-       time_t getLastStatusChange() { return m_lastStatusChange; }
+       bool isBlockNextJobsOnFailure() const { return m_blockNextJobsOnFailure; }
+       bool isValid() const { return m_valid; }
+
+       UINT32 getId() const { return m_id; }
+       UINT32 getUserId() const { return m_userId; }
+       const TCHAR *getType() const { return m_type; }
+       const TCHAR *getDescription() const { return m_description; }
+       ServerJobStatus getStatus() const { return m_status; }
+       int getProgress() const { return m_progress; }
+       UINT32 getNodeId() const { return m_nodeId; }
+   Node *getNode() const { return m_node; }
+       const TCHAR *getFailureMessage() const { return CHECK_NULL_EX(m_failureMessage); }
+       time_t getLastStatusChange() const { return m_lastStatusChange; }
 
        void setOwningQueue(ServerJobQueue *queue);
 
@@ -180,33 +181,34 @@ UINT32 NXCORE_EXPORTABLE UnholdJob(UINT32 userId, NXCPMessage *msg);
  */
 class FileUploadJob : public ServerJob
 {
-protected:
+private:
        static int m_activeJobs;
        static int m_maxActiveJobs;
        static MUTEX m_sharedDataMutex;
 
-       Node *m_node;
        TCHAR *m_localFile;
        TCHAR *m_localFileFullPath;
        TCHAR *m_remoteFile;
        TCHAR *m_info;
        INT64 m_fileSize;
 
+   void setLocalFileFullPath();
+
+   static void uploadCallback(INT64 size, void *arg);
+
+protected:
        virtual ServerJobResult run();
        virtual const TCHAR *getAdditionalInfo();
        virtual const String serializeParameters();
 
-   static void uploadCallback(INT64 size, void *arg);
-
 public:
        static void init();
 
        FileUploadJob(Node *node, const TCHAR *localFile, const TCHAR *remoteFile, UINT32 userId, bool createOnHold);
-       FileUploadJob(TCHAR* params, UINT32 node, UINT32 userId);
+       FileUploadJob(const TCHAR *params, UINT32 nodeId, UINT32 userId);
        virtual ~FileUploadJob();
 
        virtual void rescheduleExecution();
-       void setLocalFileFullPath();
 };
 
 /**
@@ -246,21 +248,21 @@ public:
 class AgentPolicy;
 
 /**
- * Agent policy deployment job
+ * Agent policy install job
  */
-class PolicyDeploymentJob : public ServerJob
+class PolicyInstallJob : public ServerJob
 {
-protected:
-       Node *m_node;
-       AgentPolicy *m_policy;
+private:
+   AgentPolicy *m_policy;
 
+protected:
        virtual ServerJobResult run();
        virtual const String serializeParameters();
 
 public:
-       PolicyDeploymentJob(Node *node, AgentPolicy *policy, UINT32 userId);
-   PolicyDeploymentJob(const TCHAR* params, UINT32 node, UINT32 userId);
-       virtual ~PolicyDeploymentJob();
+       PolicyInstallJob(Node *node, AgentPolicy *policy, UINT32 userId);
+       PolicyInstallJob(const TCHAR *params, UINT32 nodeId, UINT32 userId);
+       virtual ~PolicyInstallJob();
 
        virtual void rescheduleExecution();
 };
@@ -270,16 +272,16 @@ public:
  */
 class PolicyUninstallJob : public ServerJob
 {
-protected:
-       Node *m_node;
-       AgentPolicy *m_policy;
+private:
+   AgentPolicy *m_policy;
 
+protected:
        virtual ServerJobResult run();
        virtual const String serializeParameters();
 
 public:
        PolicyUninstallJob(Node *node, AgentPolicy *policy, UINT32 userId);
-   PolicyUninstallJob(const TCHAR* params, UINT32 node, UINT32 userId);
+   PolicyUninstallJob(const TCHAR *params, UINT32 nodeId, UINT32 userId);
        virtual ~PolicyUninstallJob();
 
        virtual void rescheduleExecution();