You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
7.9 KiB
252 lines
7.9 KiB
#include "stdafx.h"
|
|
#include "ServList.hpp"
|
|
#include "globals.h"
|
|
#include "resstr.h"
|
|
#include "resource.h"
|
|
|
|
#import "VarSet.tlb" no_namespace, named_guids rename("property", "aproperty")
|
|
|
|
extern GlobalData gData;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Function: QueryStatusFromFile
|
|
//
|
|
// Synopsis: Query the job status from the status file
|
|
//
|
|
// Arguments:
|
|
//
|
|
// statusFilename the name of the status file
|
|
//
|
|
// Returns:
|
|
//
|
|
// Modifies: Call SetFinished and SetSeverity functions
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void TServerNode::QueryStatusFromFile(WCHAR* statusFilename)
|
|
{
|
|
if (bHasQueriedStatusFromFile)
|
|
return;
|
|
|
|
try
|
|
{
|
|
IVarSetPtr pVarSet;
|
|
IStoragePtr store;
|
|
HRESULT hr = S_OK;
|
|
BOOL bDoneTry = FALSE;
|
|
|
|
SetQueryFailed(FALSE);
|
|
|
|
// attempt to open status file
|
|
while (TRUE)
|
|
{
|
|
hr = StgOpenStorage(statusFilename,
|
|
NULL,
|
|
STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE,
|
|
NULL,
|
|
0,
|
|
&store);
|
|
|
|
// if sharing or lock violation then...
|
|
if ((hr == STG_E_SHAREVIOLATION) || (hr == STG_E_LOCKVIOLATION))
|
|
{
|
|
// wait 30 seconds before trying again
|
|
if (bDoneTry)
|
|
break;
|
|
Sleep(30000);
|
|
bDoneTry = TRUE; // we only try once
|
|
}
|
|
else
|
|
{
|
|
// otherwise stop trying
|
|
break;
|
|
}
|
|
}
|
|
|
|
// load varset from file and check the status
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = OleLoad(store, IID_IVarSet, NULL, (void**)&pVarSet);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
bHasQueriedStatusFromFile = TRUE;
|
|
_bstr_t jobStatus = pVarSet->get(GET_BSTR(DCTVS_JobStatus));
|
|
if (!UStrICmp(jobStatus,GET_STRING(IDS_DCT_Status_Completed)))
|
|
SetFinished();
|
|
else if (!UStrICmp(jobStatus,GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
|
|
{
|
|
SetFinished();
|
|
SetSeverity(2);
|
|
}
|
|
}
|
|
else
|
|
SetQueryFailed(TRUE);
|
|
}
|
|
else
|
|
SetQueryFailed(TRUE);
|
|
}
|
|
catch (...)
|
|
{
|
|
SetQueryFailed(TRUE);
|
|
}
|
|
}
|
|
|
|
void TServerNode::QueryStatusFromFile()
|
|
{
|
|
if (bHasQueriedStatusFromFile)
|
|
return;
|
|
|
|
try
|
|
{
|
|
_bstr_t remoteResultPath = GetRemoteResultPath();
|
|
_bstr_t statusFilename = remoteResultPath + GetJobID();
|
|
QueryStatusFromFile(statusFilename);
|
|
}
|
|
catch (...)
|
|
{
|
|
SetQueryFailed(TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Function: PrepareForLogging
|
|
//
|
|
// Synopsis: Prepare the status and error message for logging agent
|
|
// completion status into migration log.
|
|
// The logic is taken from COLUMN_STATUS and COLUMN_MESSAGE parts
|
|
// of CAgentMonitorDlg::OnGetdispinfoServerlist.
|
|
// Due to the fact that this code is added for RTM, the minimum
|
|
// change is preferred to prevent behavioral regression.
|
|
// These two codes should be consolidated after ADMT v2.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Modifies: It updates the bstrStatusForLogging, bstrErrorMessageForLogging
|
|
// and dwStatusForLogging member variables.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void TServerNode::PrepareForLogging()
|
|
{
|
|
CString status;
|
|
|
|
status.LoadString(IDS_Status_Installing);
|
|
dwStatusForLogging = Completion_Status_Installing;
|
|
|
|
if (HasFailed())
|
|
{
|
|
status.LoadString(IDS_Status_InstallFailed);
|
|
dwStatusForLogging = Completion_Status_InstallFailed;
|
|
}
|
|
if (IsInstalled())
|
|
{
|
|
if (!HasFailed())
|
|
{
|
|
status.LoadString(IDS_Status_Installed);
|
|
dwStatusForLogging = Completion_Status_Installed;
|
|
}
|
|
else
|
|
{
|
|
status.LoadString(IDS_Status_DidNotStart);
|
|
dwStatusForLogging = Completion_Status_DidNotStart;
|
|
}
|
|
}
|
|
if (GetStatus() & Agent_Status_Started)
|
|
{
|
|
if (!HasFailed())
|
|
{
|
|
status.LoadString(IDS_Status_Running);
|
|
dwStatusForLogging = Completion_Status_Running;
|
|
}
|
|
else
|
|
{
|
|
status.LoadString(IDS_Status_Failed);
|
|
dwStatusForLogging = Completion_Status_StatusUnknown;
|
|
}
|
|
}
|
|
if (IsFinished())
|
|
{
|
|
if (QueryFailed())
|
|
{
|
|
// we show "Status Unknown" in the status field
|
|
status.LoadString(IDS_Status_Unknown);
|
|
dwStatusForLogging = Completion_Status_StatusUnknown;
|
|
}
|
|
else if (!IsResultPullingTried() || (HasResult() && !IsResultProcessed()))
|
|
{
|
|
// if still pulling results or results not yet processed
|
|
// we want to show the status of still running
|
|
status.LoadString(IDS_Status_Running);
|
|
dwStatusForLogging = Completion_Status_Running;
|
|
}
|
|
else
|
|
{
|
|
if (!HasResult())
|
|
{
|
|
// if there is no result, we consider it an error
|
|
status.LoadString(IDS_Status_Completed_With_Errors);
|
|
dwStatusForLogging = Completion_Status_CompletedWithErrors;
|
|
}
|
|
else if (!GetSeverity())
|
|
{
|
|
// if we have the result and no error happened during agent operation
|
|
// we show the status of complete
|
|
status.LoadString(IDS_Status_Completed);
|
|
dwStatusForLogging = Completion_Status_Completed;
|
|
}
|
|
else
|
|
{
|
|
// if we have the result, we set the status
|
|
// based on the error/warning level
|
|
switch (GetSeverity())
|
|
{
|
|
case 1:
|
|
status.LoadString(IDS_Status_Completed_With_Warnings);
|
|
dwStatusForLogging = Completion_Status_CompletedWithWarnings;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
default:
|
|
status.LoadString(IDS_Status_Completed_With_Errors);
|
|
dwStatusForLogging = Completion_Status_CompletedWithErrors;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bstrStatusForLogging = (LPCWSTR)status;
|
|
|
|
// this part deals with the error message
|
|
|
|
status = L""; // reset the status
|
|
|
|
if (IsFinished() && QueryFailed())
|
|
{
|
|
// in this case, we show the error during the query
|
|
status = GetMessageText();
|
|
}
|
|
else if (IsFinished()
|
|
&& (!IsResultPullingTried()
|
|
|| (HasResult() && !IsResultProcessed())))
|
|
{
|
|
// if agent has finished but result not yet pulled or processed,
|
|
// we show the status of "still processing results"
|
|
status.LoadString(IDS_Status_Processing_Results);
|
|
}
|
|
else if (IsFinished() && IsResultPullingTried() && !HasResult())
|
|
{
|
|
// if agent finished but we cannot retrieve results
|
|
// we show the status of "cannot retrieve results"
|
|
status.LoadString(IDS_Status_Cannot_Retrieve_Results);
|
|
}
|
|
else if (HasFailed() || QueryFailed() || GetSeverity() || IsFinished())
|
|
{
|
|
// for these cases, we get the message stored on the node
|
|
status = GetMessageText();
|
|
}
|
|
|
|
bstrErrorMessageForLogging = (LPCWSTR)status;
|
|
}
|