457 lines
16 KiB
C++
457 lines
16 KiB
C++
//#pragma title ("SDStat.hpp -- Statistical information for SDResolve")
|
|
/*
|
|
Copyright (c) 1995-1998, Mission Critical Software, Inc. All rights reserved.
|
|
===============================================================================
|
|
Module - sdstat.hpp
|
|
System - SDResolve
|
|
Author - Christy Boles
|
|
Created - 97/06/27
|
|
Description - Statistical information for SDResolve
|
|
Updates -
|
|
===============================================================================
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include <stdio.h>
|
|
|
|
#include "common.hpp"
|
|
#include "ErrDct.hpp"
|
|
#include "sidcache.hpp"
|
|
#include "sd.hpp"
|
|
#include "SecObj.hpp"
|
|
#include "enumvols.hpp"
|
|
#include "sdstat.hpp"
|
|
|
|
#include "Mcs.h"
|
|
|
|
|
|
extern TErrorDct err;
|
|
|
|
TSDResolveStats::TSDResolveStats(
|
|
TSDRidCache * cache, // in - cache containing mapping of accounts for the translation
|
|
const TPathList * plist, // in - list of paths being translated
|
|
IVarSet * pVarSet // in - varset to store stats in
|
|
)
|
|
{
|
|
memset(&unit,0,sizeof TSDFileActions);
|
|
memset(&part,0,sizeof TSDPartStats);
|
|
pPList = plist;
|
|
len = 0;
|
|
frame_foreground =FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN ;
|
|
background = BACKGROUND_BLUE ;
|
|
data_foreground =frame_foreground | FOREGROUND_INTENSITY ;
|
|
message_foreground = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
|
|
pCache = cache;
|
|
m_pVarSet = pVarSet;
|
|
}
|
|
|
|
|
|
|
|
TSDResolveStats::TSDResolveStats(
|
|
TSDRidCache * cache // in - cache containing mapping of accounts for translation
|
|
)
|
|
{
|
|
memset(&unit,0,sizeof TSDFileActions);
|
|
memset(&part,0,sizeof TSDPartStats);
|
|
pPList = NULL;
|
|
len = 0;
|
|
frame_foreground =FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN ;
|
|
background = BACKGROUND_BLUE ;
|
|
data_foreground =frame_foreground | FOREGROUND_INTENSITY ;
|
|
message_foreground = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
|
|
pCache = cache;
|
|
//Added by Sham : Initialize m_pVarSet
|
|
IVarSetPtr pVarSet(__uuidof(VarSet));
|
|
m_pVarSet = pVarSet;
|
|
// Need to add code to release this interface once we are done. In the destructor maybe
|
|
m_pVarSet->AddRef();
|
|
}
|
|
void
|
|
TSDResolveStats::IncrementOwnerChange(
|
|
TAcctNode * acct, // in -account changed
|
|
objectType type, // in -type of object
|
|
TSecurableObject * file // in -file changed
|
|
)
|
|
{
|
|
acct->AddOwnerChange(type);
|
|
|
|
if ( acct->IsValidOnTgt() )
|
|
{
|
|
part.owner.changed++;
|
|
// DisplayStatItem(OWNER_ROW,CHANGED_COL,part.owner.changed);
|
|
}
|
|
else
|
|
{
|
|
part.owner.notarget++;
|
|
// DisplayStatItem(OWNER_ROW,SKIPPED_COL,part.owner.skipped);
|
|
// TODO log an error message
|
|
}
|
|
|
|
if ( file )
|
|
file->LogOwnerChange(acct);
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::IncrementGroupChange(
|
|
TAcctNode * acct, // in -account changed
|
|
objectType type, // in -type of object
|
|
TSecurableObject * file // in -file changed
|
|
)
|
|
{
|
|
acct->AddGroupChange(type);
|
|
if ( acct->IsValidOnTgt() )
|
|
{
|
|
part.group.changed++;
|
|
// DisplayStatItem(GROUP_ROW,CHANGED_COL,part.group.changed);
|
|
}
|
|
else
|
|
{
|
|
part.group.notarget++;
|
|
// DisplayStatItem(GROUP_ROW,SKIPPED_COL,part.group.skipped);
|
|
}
|
|
|
|
if ( file )
|
|
file->LogGroupChange(acct);
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::IncrementDACEChange(
|
|
TAcctNode * acct, // in -account changed
|
|
objectType type, // in -type of object
|
|
TSecurableObject * file // in -file changed
|
|
)
|
|
{
|
|
acct->AddAceChange(type);
|
|
if ( acct->IsValidOnTgt() )
|
|
{
|
|
part.dace.changed++;
|
|
// DisplayStatItem(DACE_ROW,CHANGED_COL,part.dace.changed);
|
|
}
|
|
else
|
|
{
|
|
part.dace.notarget++;
|
|
// DisplayStatItem(DACE_ROW,SKIPPED_COL,part.dace.skipped);
|
|
}
|
|
if ( file )
|
|
file->LogDACEChange(acct);
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::IncrementSACEChange(
|
|
TAcctNode * acct, // in -account changed
|
|
objectType type, // in -type of object
|
|
TSecurableObject * file // in -file changed
|
|
)
|
|
{
|
|
acct->AddSaceChange(type);
|
|
if ( acct->IsValidOnTgt() )
|
|
{
|
|
part.sace.changed++;
|
|
// DisplayStatItem(SACE_ROW,CHANGED_COL,part.sace.changed);
|
|
}
|
|
else
|
|
{
|
|
part.sace.notarget++;
|
|
// DisplayStatItem(SACE_ROW,SKIPPED_COL,part.sace.skipped);
|
|
}
|
|
if ( file )
|
|
file->LogSACEChange(acct);
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::IncrementDACENotSelected(
|
|
TSecurableObject *file // in - object to increment stats for
|
|
)
|
|
{
|
|
file->daceNS++;
|
|
part.dace.notselected++;
|
|
}
|
|
void
|
|
TSDResolveStats::IncrementSACENotSelected(
|
|
TSecurableObject *file // in - object to increment stats for
|
|
)
|
|
{
|
|
if ( file )
|
|
file->saceNS++;
|
|
part.sace.notselected++;
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::IncrementDACEUnknown(
|
|
TSecurableObject *file // in - object to increment stats for
|
|
)
|
|
{
|
|
if ( file )
|
|
file->daceU++;
|
|
part.dace.unknown++;
|
|
}
|
|
void
|
|
TSDResolveStats::IncrementSACEUnknown(
|
|
TSecurableObject *file // in - object to increment stats for
|
|
)
|
|
{
|
|
if ( file )
|
|
file->saceU++;
|
|
part.sace.unknown++;
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::IncrementDACENoTarget(
|
|
TSecurableObject *file // in - object to increment stats for
|
|
)
|
|
{
|
|
if ( file )
|
|
file->daceNT++;
|
|
part.dace.notarget++;
|
|
}
|
|
void
|
|
TSDResolveStats::IncrementSACENoTarget(
|
|
TSecurableObject *file // in - object to increment stats for
|
|
)
|
|
{
|
|
if ( file )
|
|
file->saceNT++;
|
|
part.sace.notarget++;
|
|
}
|
|
|
|
/***************************************************************************************************/
|
|
/* IncrementLastFileChanges: used in conjunction with last-seen heuristic. When a SD matches the
|
|
last-seen SD, this routine repeats all the stat-updates
|
|
that were done for the last-seen SD, so that we have accurate stats
|
|
(especially ACE changes per account)
|
|
/**************************************************************************************************/
|
|
void
|
|
TSDResolveStats::IncrementLastFileChanges(
|
|
const TSecurableObject * lastfile, // in -file to repeat change stats from
|
|
objectType objType // in -type of object
|
|
)
|
|
{
|
|
TNodeListEnum tenum;
|
|
TStatNode * snode;
|
|
|
|
// make modifications except changes
|
|
// owner
|
|
IncrementOwnerExamined();
|
|
IncrementGroupExamined();
|
|
|
|
if ( lastfile->UnknownOwner() )
|
|
part.owner.unknown++;
|
|
|
|
// group
|
|
if ( lastfile->UnknownGroup() )
|
|
part.group.unknown++;
|
|
// dacl
|
|
if ( lastfile->HasDacl() )
|
|
IncrementDACLExamined();
|
|
// sacl
|
|
if ( lastfile->HasSacl() )
|
|
IncrementSACLExamined();
|
|
// aces
|
|
part.dace.notarget+=lastfile->daceNT;
|
|
part.sace.notarget+=lastfile->saceNT;
|
|
part.dace.unknown+=lastfile->daceU;
|
|
part.sace.unknown+=lastfile->saceU;
|
|
part.dace.notselected+=lastfile->daceNS;
|
|
part.sace.notselected+=lastfile->saceNS;
|
|
if ( lastfile->Changed() )
|
|
{
|
|
IncrementChanged(objType);
|
|
}
|
|
|
|
if ( lastfile->Changed() || (lastfile->GetChangeLog())->Count() )
|
|
{
|
|
if ( lastfile->IsDaclChanged() )
|
|
{
|
|
IncrementDACLChanged();
|
|
}
|
|
if ( lastfile->IsSaclChanged() )
|
|
{
|
|
IncrementSACLChanged();
|
|
}
|
|
for ( snode = (TStatNode *)tenum.OpenFirst(lastfile->GetChangeLog()) ;
|
|
snode ;
|
|
snode = (TStatNode *)tenum.Next()
|
|
)
|
|
{
|
|
switch ( snode->changetype )
|
|
{
|
|
case TStatNode::owner:
|
|
IncrementOwnerChange(snode->acctnode,objType,NULL);
|
|
break;
|
|
case TStatNode::group:
|
|
IncrementGroupChange(snode->acctnode,objType,NULL);
|
|
break;
|
|
case TStatNode::dace:
|
|
IncrementDACEChange(snode->acctnode,objType,NULL);
|
|
break;
|
|
case TStatNode::sace:
|
|
IncrementSACEChange(snode->acctnode,objType,NULL);
|
|
break;
|
|
default:
|
|
MCSASSERT( false );
|
|
}
|
|
}
|
|
tenum.Close();
|
|
}
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::ReportToVarSet(
|
|
IVarSet * pVarSet, // in -varset to write data to
|
|
DWORD verbnum // in -which info to log
|
|
) const
|
|
{
|
|
BOOL summary = verbnum & SUMMARYSTATS;
|
|
BOOL accts = verbnum & ACCOUNTSTATS;
|
|
// BOOL file = verbnum & FILESTATS;
|
|
BOOL paths = verbnum & PATHSTATS;
|
|
|
|
if ( summary )
|
|
{
|
|
if ( paths && pPList )
|
|
{
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Paths),(LONG)pPList->GetNumPaths() );
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Servers),(LONG)pPList->GetNumServers() );
|
|
}
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Files_Examined),(LONG)unit.examined.file);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Directories_Examined),(LONG)unit.examined.dir);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Shares_Examined),(LONG)unit.examined.share);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Mailboxes_Examined),(LONG)unit.examined.mailbox);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Containers_Examined),(LONG)unit.examined.container);
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Files_CacheHits),(LONG)unit.cachehit.file);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Directories_CacheHits),(LONG)unit.cachehit.dir);
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Files_Skipped),(LONG)unit.skipped.file);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Directories_Skipped),(LONG)unit.skipped.dir);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Shares_Skipped),(LONG)unit.skipped.share);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Mailboxes_Skipped),(LONG)unit.skipped.mailbox);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Containers_Skipped),(LONG)unit.skipped.container);
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Files_Changed),(LONG)unit.changed.file);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Directories_Changed),(LONG)unit.changed.dir);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Shares_Changed),(LONG)unit.changed.share);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Mailboxes_Changed),(LONG)unit.changed.mailbox);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Containers_Changed),(LONG)unit.changed.container);
|
|
|
|
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Owners_Examined),(LONG)part.owner.examined);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Groups_Examined),(LONG)part.group.examined);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_DACL_Examined),(LONG)part.dacl.examined);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_SACL_Examined),(LONG)part.sacl.examined);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_DACE_Examined),(LONG)part.dace.examined);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_SACE_Examined),(LONG)part.sace.examined);
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Owners_Changed),(LONG)part.owner.changed);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Groups_Changed),(LONG)part.group.changed);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_DACL_Changed),(LONG)part.dacl.changed);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_SACL_Changed),(LONG)part.sacl.changed);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_DACE_Changed),(LONG)part.dace.changed);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_SACE_Changed),(LONG)part.sace.changed);
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Owners_NoTarget),(LONG)part.owner.notarget);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Groups_NoTarget),(LONG)part.group.notarget);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_DACE_NoTarget),(LONG)part.dace.notarget);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_SACE_NoTarget),(LONG)part.sace.notarget);
|
|
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Owners_Unknown),(LONG)part.owner.unknown);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_Groups_Unknown),(LONG)part.group.unknown);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_DACE_Unknown),(LONG)part.dace.unknown);
|
|
pVarSet->put(GET_BSTR(DCTVS_Stats_SACE_Unknown),(LONG)part.sace.unknown);
|
|
|
|
}
|
|
if ( accts )
|
|
pCache->ReportToVarSet(pVarSet,false, true);
|
|
|
|
}
|
|
|
|
|
|
void
|
|
TSDResolveStats::Report(
|
|
BOOL summary, // in -flag, whether to report summary information
|
|
BOOL accts, // in -flag, whether to report account detail information
|
|
BOOL paths // in -flag, whether to report path detail information
|
|
) const
|
|
{
|
|
if ( accts )
|
|
pCache->Display(summary!=0, accts!=0);
|
|
#ifdef FST
|
|
if ( paths & pPList )
|
|
pPList->Display();
|
|
#endif
|
|
if ( summary )
|
|
{
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_HEADER);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_FILES_DDD,unit.examined.file, unit.changed.file, unit.examined.file - unit.changed.file);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_DIRS_DDD,unit.examined.dir, unit.changed.dir, unit.examined.dir - unit.changed.dir);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_SHARES_DDD,unit.examined.share, unit.changed.share, unit.examined.share - unit.changed.share);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_MEMBERS_DDD,unit.examined.member, unit.changed.member, unit.examined.member - unit.changed.member);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_RIGHTS_DDD,unit.examined.userright, unit.changed.userright, unit.examined.userright - unit.changed.userright);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_MAILBOXES_DDD,unit.examined.mailbox, unit.changed.mailbox, unit.examined.mailbox - unit.changed.mailbox);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_CONTAINERS_DDD,unit.examined.container, unit.changed.container, unit.examined.container - unit.changed.container);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_DACLS_DDD,part.dacl.examined, part.dacl.changed, part.dacl.examined - part.dacl.changed);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_REPORT_SACLS_DDD,part.sacl.examined, part.sacl.changed, part.sacl.examined - part.sacl.changed);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_PARTS_REPORT_HEADER);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_PARTS_REPORT_OWNERS_DDDDD,part.owner.examined, part.owner.changed, part.owner.notarget, part.owner.examined - part.owner.changed - part.owner.notarget - part.owner.unknown, part.owner.unknown);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_PARTS_REPORT_GROUPS_DDDDD,part.group.examined, part.group.changed, part.group.notarget, part.group.examined - part.group.changed - part.group.notarget - part.group.unknown ,part.group.unknown);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_PARTS_REPORT_DACES_DDDDD,part.dace.examined, part.dace.changed, part.dace.notarget,part.dace.notselected,part.dace.unknown);
|
|
err.MsgWrite(0,DCT_MSG_SUMMARY_PARTS_REPORT_SACES_DDDDD,part.sace.examined, part.sace.changed, part.sace.notarget,part.sace.notselected,part.sace.unknown);
|
|
}
|
|
|
|
}
|
|
#define HDR1ITEMS 2
|
|
#define HDRCOL1 8
|
|
#define HDRROW1 4
|
|
#define COLWIDTH 12
|
|
#define HDRCOL2 ( HDRCOL1 + COLWIDTH )
|
|
#define HDRROW2 ( HDRROW1 + ( 2 * HDR1ITEMS + 1) + 1)
|
|
|
|
void
|
|
TSDResolveStats::InitDisplay(
|
|
BOOL nochange
|
|
)
|
|
{
|
|
}
|
|
|
|
// no longer used
|
|
void
|
|
TSDResolveStats::DisplayStatFrame(
|
|
BOOL nochange
|
|
)
|
|
{
|
|
|
|
}
|
|
// no longer used
|
|
void TSDResolveStats::DisplayStatItem(SHORT row, SHORT col, DWORD val, BOOL forceUpdate)
|
|
{
|
|
|
|
}
|
|
|
|
DWORD dwLastUpdate = 0;
|
|
|
|
void
|
|
TSDResolveStats::DisplayPath(LPWSTR str,BOOL forceUpdate)
|
|
{
|
|
DWORD now = GetTickCount();
|
|
|
|
if ( m_pVarSet )
|
|
{
|
|
m_pVarSet->put(GET_BSTR(DCTVS_CurrentPath),str);
|
|
if ( now - dwLastUpdate > 1000 )
|
|
{
|
|
ReportToVarSet(m_pVarSet,SUMMARYSTATS);
|
|
dwLastUpdate = GetTickCount();
|
|
}
|
|
}
|
|
}
|
|
void
|
|
TSDResolveStats::DisplayBox(SHORT x1, SHORT y1, SHORT x2, SHORT y2)
|
|
{
|
|
}
|
|
|
|
void
|
|
TSDResolveStats::SetFrameText(WCHAR * msg)
|
|
{
|
|
} |