This commit is contained in:
Brian Cox 2016-04-11 11:46:42 -07:00
commit 2cff64ebe7
19 changed files with 117 additions and 11 deletions

View File

@ -1,6 +1,6 @@
Open Source Tripwire Maintainers: Open Source Tripwire Maintainers:
bcox@tripwire.com Brian Cox (bcox [at] tripwire.com)
tripwire@frlinux.net (maintains the fork at github.com/frlinux/tripwire-open-source) tripwire@frlinux.net (maintains the fork at github.com/frlinux/tripwire-open-source)
Previous Maintainer: Previous Maintainer:

View File

@ -273,6 +273,7 @@ lbw(1.2i) lb.
-x \fIsection\fP --section \fIsection\fP -x \fIsection\fP --section \fIsection\fP
-M --email-report -M --email-report
-t \fR{ 0|1|2|3|4 }\fP --email-report-level \fR{ 0|1|2|3|4 }\fP -t \fR{ 0|1|2|3|4 }\fP --email-report-level \fR{ 0|1|2|3|4 }\fP
-h --hexadecimal
.TE .TE
.RI "[ " object1 " [ " object2... " ]]" .RI "[ " object1 " [ " object2... " ]]"
.RE .RE
@ -369,6 +370,9 @@ EMAILREPORTLEVEL variable in the configuration file. \fIlevel\fR must
be a number from 0\ to\ 4. be a number from 0\ to\ 4.
Valid only with (\fB\(hyM\fP). Valid only with (\fB\(hyM\fP).
.TP .TP
.BR \(hyh ", " --hexadecimal
Display hash values as hexadecimal in email reports
.TP
.RI "[ " object1 " [ " object2... " ]]" .RI "[ " object1 " [ " object2... " ]]"
List of files and directories that should be integrity checked. List of files and directories that should be integrity checked.
Default is all files. If files are specified for checking, the Default is all files. If files are specified for checking, the

View File

@ -53,6 +53,7 @@ lbw(1.2i) lb.
-m r --print-report -m r --print-report
-v --verbose -v --verbose
-s --silent\fR,\fP --quiet -s --silent\fR,\fP --quiet
-h --hexadecimal
-c \fIcfgfile\fP --cfgfile \fIcfgfile\fP -c \fIcfgfile\fP --cfgfile \fIcfgfile\fP
-r \fIreport\fP --twrfile \fIreport\fP -r \fIreport\fP --twrfile \fIreport\fP
-L \fIlocalkey\fP --local-keyfile \fIlocalkey\fP -L \fIlocalkey\fP --local-keyfile \fIlocalkey\fP
@ -69,6 +70,9 @@ Verbose output mode. Mutually exclusive with (\fB\(hys\fR).
.BR \(hys ", " --silent ", " --quiet .BR \(hys ", " --silent ", " --quiet
Silent output mode. Mutually exclusive with (\fB\(hyv\fR). Silent output mode. Mutually exclusive with (\fB\(hyv\fR).
.TP .TP
.BR \(hyh ", " --hexadecimal
Display hash values as hexadecimal.
.TP
.BI \(hyc " cfgfile\fR, " --cfgfile " cfgfile" .BI \(hyc " cfgfile\fR, " --cfgfile " cfgfile"
Use the specified configuration file. Use the specified configuration file.
.TP .TP
@ -92,6 +96,7 @@ lbw(1.2i) lb.
-m d --print-dbfile -m d --print-dbfile
-v --verbose -v --verbose
-s --silent\fR,\fP --quiet -s --silent\fR,\fP --quiet
-h --hexadecimal
-c \fIcfgfile\fP --cfgfile \fIcfgfile\fP -c \fIcfgfile\fP --cfgfile \fIcfgfile\fP
-d \fIdatabase\fP --dbfile \fIdatabase\fP -d \fIdatabase\fP --dbfile \fIdatabase\fP
-L \fIlocalkey\fP --local-keyfile \fIlocalkey\fP -L \fIlocalkey\fP --local-keyfile \fIlocalkey\fP
@ -108,6 +113,9 @@ Verbose output mode. Mutually exclusive with (\fB\(hys\fR).
.BR \(hys ", " --silent ", " --quiet .BR \(hys ", " --silent ", " --quiet
Silent output mode. Mutually exclusive with (\fB\(hyv\fR). Silent output mode. Mutually exclusive with (\fB\(hyv\fR).
.TP .TP
.BR \(hyh ", " --hexadecimal
Display hash values as hexadecimal.
.TP
.BI \(hyc " cfgfile\fR, " --cfgfile " cfgfile" .BI \(hyc " cfgfile\fR, " --cfgfile " cfgfile"
Use the specified configuration file. Use the specified configuration file.
.TP .TP

View File

@ -128,7 +128,9 @@ struct cFSStatArgs {
TY_CHARDEV, TY_CHARDEV,
TY_SYMLINK, TY_SYMLINK,
TY_FIFO, TY_FIFO,
TY_SOCK TY_SOCK,
TY_DOOR,
TY_PORT
}; };
// attr is fs dependent? // attr is fs dependent?

View File

@ -381,14 +381,21 @@ void cUnixFSServices::Stat( const TSTRING& strNameC, cFSStatArgs& stat) const th
stat.blocks = statbuf.st_blocks; stat.blocks = statbuf.st_blocks;
// set the file type // set the file type
if(S_ISREG(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_FILE; if(S_ISREG(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_FILE;
else if(S_ISDIR(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_DIR; else if(S_ISDIR(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_DIR;
else if(S_ISLNK(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_SYMLINK; else if(S_ISLNK(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_SYMLINK;
else if(S_ISBLK(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_BLOCKDEV; else if(S_ISBLK(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_BLOCKDEV;
else if(S_ISCHR(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_CHARDEV; else if(S_ISCHR(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_CHARDEV;
else if(S_ISFIFO(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_FIFO; else if(S_ISFIFO(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_FIFO;
else if(S_ISSOCK(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_SOCK; else if(S_ISSOCK(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_SOCK;
else stat.mFileType = cFSStatArgs::TY_INVALID; #ifdef S_IFDOOR
else if(S_ISDOOR(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_DOOR;
#endif
#ifdef S_IFPORT
else if(S_ISPORT(statbuf.st_mode)) stat.mFileType = cFSStatArgs::TY_PORT;
#endif
else stat.mFileType = cFSStatArgs::TY_INVALID;
} }
void cUnixFSServices::GetMachineName( TSTRING& strName ) const throw( eFSServices ) void cUnixFSServices::GetMachineName( TSTRING& strName ) const throw( eFSServices )
@ -589,18 +596,29 @@ void cUnixFSServices::ConvertModeToString( uint64 perm, TSTRING& tstrPerm ) cons
{ {
case S_IFDIR: case S_IFDIR:
szPerm[0] = _T('d'); szPerm[0] = _T('d');
break; break;
case S_IFCHR: case S_IFCHR:
szPerm[0] = _T('c'); szPerm[0] = _T('c');
break; break;
case S_IFBLK: case S_IFBLK:
szPerm[0] = _T('b'); szPerm[0] = _T('b');
break; break;
case S_IFIFO: case S_IFIFO:
szPerm[0] = _T('p'); szPerm[0] = _T('p');
break; break;
case S_IFLNK: case S_IFLNK:
szPerm[0] = _T('l'); szPerm[0] = _T('l');
break;
#ifdef S_IFDOOR
case S_IFDOOR:
szPerm[0] = _T('D');
break;
#endif
#ifdef S_IFPORT
case S_IFPORT:
szPerm[0] = _T('P');
break;
#endif
break; break;
} }

View File

@ -97,6 +97,7 @@ iFCOProp::CmpResult iSignature::Compare(const iFCOProp* rhs, Op op) const
return (op == iFCOProp::OP_NE) ? iFCOProp::CMP_TRUE : iFCOProp::CMP_FALSE; return (op == iFCOProp::OP_NE) ? iFCOProp::CMP_TRUE : iFCOProp::CMP_FALSE;
} }
bool cArchiveSigGen::mHex = false;
void cArchiveSigGen::AddSig( iSignature* pSig ) void cArchiveSigGen::AddSig( iSignature* pSig )
{ {
@ -129,6 +130,16 @@ void cArchiveSigGen::CalculateSignatures( cArchive& a )
mSigList[i]->Finit(); mSigList[i]->Finit();
} }
bool cArchiveSigGen::Hex()
{
return mHex;
}
void cArchiveSigGen::SetHex(bool hex)
{
mHex = hex;
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// btob64 -- convert arbitrary bits to base 64 string // btob64 -- convert arbitrary bits to base 64 string
// //
@ -399,6 +410,9 @@ void cCRC32Signature::Finit()
// mCRC // mCRC
TSTRING cCRC32Signature::AsString() const TSTRING cCRC32Signature::AsString() const
{ {
if (cArchiveSigGen::Hex())
return AsStringHex();
TSTRING ret; TSTRING ret;
char *ps_signature; char *ps_signature;
char buf[100]; char buf[100];
@ -505,6 +519,9 @@ void cMD5Signature::Finit()
// AsString -- Converts to Base64 representation and returns a TSTRING // AsString -- Converts to Base64 representation and returns a TSTRING
TSTRING cMD5Signature::AsString() const TSTRING cMD5Signature::AsString() const
{ {
if (cArchiveSigGen::Hex())
return AsStringHex();
TSTRING ret; TSTRING ret;
char buf[24]; char buf[24];
int length; int length;
@ -626,6 +643,9 @@ void cSHASignature::Finit()
#ifdef HAVE_OPENSSL_SHA_H #ifdef HAVE_OPENSSL_SHA_H
TSTRING cSHASignature::AsString(void) const TSTRING cSHASignature::AsString(void) const
{ {
if (cArchiveSigGen::Hex())
return AsStringHex();
TSTRING ret; TSTRING ret;
char* ps_signature; char* ps_signature;
char buf[100]; char buf[100];
@ -704,6 +724,9 @@ bool cSHASignature::IsEqual(const iSignature& rhs) const
TSTRING cSHASignature::AsString(void) const TSTRING cSHASignature::AsString(void) const
{ {
if (cArchiveSigGen::Hex())
return AsStringHex();
TSTRING ret; TSTRING ret;
char* ps_signature; char* ps_signature;
char buf[100]; char buf[100];
@ -812,6 +835,9 @@ void cHAVALSignature::Finit()
// AsString -- Returns Base64 representation of mSignature in a TSTRING // AsString -- Returns Base64 representation of mSignature in a TSTRING
TSTRING cHAVALSignature::AsString() const TSTRING cHAVALSignature::AsString() const
{ {
if (cArchiveSigGen::Hex())
return AsStringHex();
TSTRING ret; TSTRING ret;
char buf[24]; char buf[24];
int length; int length;

View File

@ -75,6 +75,8 @@
// TODO: figure out a way to do this without including these headers. // TODO: figure out a way to do this without including these headers.
// pool of objects? // pool of objects?
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// class iSignatrue -- Interface all signatures will implement. // class iSignatrue -- Interface all signatures will implement.
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -145,6 +147,9 @@ public:
// produces signature of archive for all signatures in the list // produces signature of archive for all signatures in the list
// remember to rewind archive! // remember to rewind archive!
static bool Hex();
static void SetHex(bool);
private: private:
// don't let C++ create these functions // don't let C++ create these functions
cArchiveSigGen( const cArchiveSigGen& ); cArchiveSigGen( const cArchiveSigGen& );
@ -152,6 +157,8 @@ private:
typedef std::vector< iSignature* > container_type; typedef std::vector< iSignature* > container_type;
container_type mSigList; container_type mSigList;
static bool mHex;
}; };

View File

@ -249,6 +249,12 @@ bool cFSDataSourceIter::InitializeTypeInfo(iFCO* pFCO)
case cFSStatArgs::TY_SOCK: case cFSStatArgs::TY_SOCK:
propSet.SetFileType(cFSPropSet::FT_SOCK); propSet.SetFileType(cFSPropSet::FT_SOCK);
break; break;
case cFSStatArgs::TY_DOOR:
propSet.SetFileType(cFSPropSet::FT_DOOR);
break;
case cFSStatArgs::TY_PORT:
propSet.SetFileType(cFSPropSet::FT_PORT);
break;
default: default:
// set it to invalid // set it to invalid
propSet.SetFileType(cFSPropSet::FT_INVALID); propSet.SetFileType(cFSPropSet::FT_INVALID);

View File

@ -255,6 +255,12 @@ void cFSPropCalc::VisitFSObject(cFSObject& obj)
case cFSStatArgs::TY_SOCK: case cFSStatArgs::TY_SOCK:
propSet.SetFileType(cFSPropSet::FT_SOCK); propSet.SetFileType(cFSPropSet::FT_SOCK);
break; break;
case cFSStatArgs::TY_DOOR:
propSet.SetFileType(cFSPropSet::FT_DOOR);
break;
case cFSStatArgs::TY_PORT:
propSet.SetFileType(cFSPropSet::FT_PORT);
break;
default: default:
// set it to invalid // set it to invalid
propSet.SetFileType(cFSPropSet::FT_INVALID); propSet.SetFileType(cFSPropSet::FT_INVALID);

View File

@ -58,7 +58,9 @@ TSTRING cFCOPropFileType::AsString() const
fs::STR_FT_CHARDEV, fs::STR_FT_CHARDEV,
fs::STR_FT_SYMLINK, fs::STR_FT_SYMLINK,
fs::STR_FT_FIFO, fs::STR_FT_FIFO,
fs::STR_FT_SOCK fs::STR_FT_SOCK,
fs::STR_FT_DOOR,
fs::STR_FT_PORT
}; };
int32 fileType = GetValue(); int32 fileType = GetValue();

View File

@ -109,6 +109,8 @@ public:
FT_SYMLINK, FT_SYMLINK,
FT_FIFO, FT_FIFO,
FT_SOCK, FT_SOCK,
FT_DOOR,
FT_PORT,
FT_NUMITEMS FT_NUMITEMS
}; };

View File

@ -49,6 +49,8 @@ TSS_BeginStringtable( cFS )
TSS_StringEntry( fs::STR_FT_SYMLINK, _T("Symbolic Link") ), TSS_StringEntry( fs::STR_FT_SYMLINK, _T("Symbolic Link") ),
TSS_StringEntry( fs::STR_FT_FIFO, _T("FIFO") ), TSS_StringEntry( fs::STR_FT_FIFO, _T("FIFO") ),
TSS_StringEntry( fs::STR_FT_SOCK, _T("Socket") ), TSS_StringEntry( fs::STR_FT_SOCK, _T("Socket") ),
TSS_StringEntry( fs::STR_FT_DOOR, _T("Door") ),
TSS_StringEntry( fs::STR_FT_PORT, _T("Event Port") ),
// property names // property names
TSS_StringEntry( fs::STR_PROP_DEV, _T("Device Number") ), TSS_StringEntry( fs::STR_PROP_DEV, _T("Device Number") ),

View File

@ -53,6 +53,8 @@ TSS_BeginStringIds( fs )
STR_FT_SYMLINK, STR_FT_SYMLINK,
STR_FT_FIFO, STR_FT_FIFO,
STR_FT_SOCK, STR_FT_SOCK,
STR_FT_DOOR,
STR_FT_PORT,
// property names // property names
STR_PROP_DEV, STR_PROP_DEV,

View File

@ -89,6 +89,7 @@ TSS_BeginStringtable( cTripwire )
_T(" -m c --check\n") _T(" -m c --check\n")
_T(" -I --interactive\n") _T(" -I --interactive\n")
_T(" -v --verbose\n") _T(" -v --verbose\n")
_T(" -h --hexadecimal\n")
_T(" -s --silent, --quiet\n") _T(" -s --silent, --quiet\n")
_T(" -c cfgfile --cfgfile cfgfile\n") _T(" -c cfgfile --cfgfile cfgfile\n")
_T(" -p polfile --polfile polfile\n") _T(" -p polfile --polfile polfile\n")

View File

@ -66,6 +66,7 @@
#include <set> #include <set>
#include "fco/parsergenreutil.h" // this is needed to figure out if a path is fully qualified for the current genre. #include "fco/parsergenreutil.h" // this is needed to figure out if a path is fully qualified for the current genre.
#include "tw/fcodatabasefile.h" #include "tw/fcodatabasefile.h"
#include "fco/signature.h"
#include "fco/genreswitcher.h" #include "fco/genreswitcher.h"
#include "generatedb.h" #include "generatedb.h"
#include "integritycheck.h" #include "integritycheck.h"
@ -829,7 +830,8 @@ void cTWModeIC::InitCmdLineParser(cCmdLineParser& cmdLine)
cmdLine.AddArg(cTWCmdLine::RULE_NAME, TSTRING(_T("R")), TSTRING(_T("rule-name")), cCmdLineParser::PARAM_ONE); cmdLine.AddArg(cTWCmdLine::RULE_NAME, TSTRING(_T("R")), TSTRING(_T("rule-name")), cCmdLineParser::PARAM_ONE);
cmdLine.AddArg(cTWCmdLine::GENRE_NAME, TSTRING(_T("x")), TSTRING(_T("section")), cCmdLineParser::PARAM_ONE); cmdLine.AddArg(cTWCmdLine::GENRE_NAME, TSTRING(_T("x")), TSTRING(_T("section")), cCmdLineParser::PARAM_ONE);
cmdLine.AddArg(cTWCmdLine::PARAMS, TSTRING(_T("")), TSTRING(_T("")), cCmdLineParser::PARAM_MANY); cmdLine.AddArg(cTWCmdLine::PARAMS, TSTRING(_T("")), TSTRING(_T("")), cCmdLineParser::PARAM_MANY);
cmdLine.AddArg(cTWCmdLine::HEXADECIMAL, TSTRING(_T("h")), TSTRING(_T("hexadecimal")), cCmdLineParser::PARAM_NONE);
// multiple levels of reporting // multiple levels of reporting
cmdLine.AddArg(cTWCmdLine::REPORTLEVEL, TSTRING(_T("t")), TSTRING(_T("email-report-level")), cCmdLineParser::PARAM_ONE); cmdLine.AddArg(cTWCmdLine::REPORTLEVEL, TSTRING(_T("t")), TSTRING(_T("email-report-level")), cCmdLineParser::PARAM_ONE);
@ -838,6 +840,8 @@ void cTWModeIC::InitCmdLineParser(cCmdLineParser& cmdLine)
cmdLine.AddArg(cTWCmdLine::USE_GMMS, TSTRING(_T("g")), TSTRING(_T("gmms")), cCmdLineParser::PARAM_NONE); cmdLine.AddArg(cTWCmdLine::USE_GMMS, TSTRING(_T("g")), TSTRING(_T("gmms")), cCmdLineParser::PARAM_NONE);
cmdLine.AddArg(cTWCmdLine::GMMS_VERBOSITY, TSTRING(_T("b")), TSTRING(_T("gmms-verbosity")), cCmdLineParser::PARAM_ONE); cmdLine.AddArg(cTWCmdLine::GMMS_VERBOSITY, TSTRING(_T("b")), TSTRING(_T("gmms-verbosity")), cCmdLineParser::PARAM_ONE);
#endif #endif
// mutual exclusion... // mutual exclusion...
// you can't specify any of these 3 things together... // you can't specify any of these 3 things together...
@ -967,6 +971,10 @@ bool cTWModeIC::Init(const cConfigFile& cf, const cCmdLineParser& cmdLine)
ASSERT(iter.NumParams() > 0); ASSERT(iter.NumParams() > 0);
mpData->mGenreName = iter.ParamAt(0); mpData->mGenreName = iter.ParamAt(0);
break; break;
case cTWCmdLine::HEXADECIMAL:
cArchiveSigGen::SetHex(true);
break;
case cTWCmdLine::PARAMS: case cTWCmdLine::PARAMS:
{ {
// pack all of these onto the files to check list... // pack all of these onto the files to check list...

View File

@ -137,7 +137,8 @@ public:
SITE_PASSPHRASE, SITE_PASSPHRASE,
TEST_EMAIL, TEST_EMAIL,
REPORTLEVEL, REPORTLEVEL,
HEXADECIMAL,
#ifdef GMMS #ifdef GMMS
USE_GMMS, USE_GMMS,
GMMS_VERBOSITY, GMMS_VERBOSITY,

View File

@ -66,6 +66,8 @@
#include "fco/twfactory.h" #include "fco/twfactory.h"
#include "fco/fcospeclist.h" // cFCOSpecList #include "fco/fcospeclist.h" // cFCOSpecList
#include "fco/fcopropdisplayer.h" #include "fco/fcopropdisplayer.h"
#include "fco/signature.h"
#include <set> #include <set>
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -118,6 +120,9 @@ static void InitCmdLineCommon(cCmdLineParser& parser)
// unattended operation // unattended operation
parser.AddArg(cTWPrintCmdLine::PASSPHRASE, TSTRING(_T("P")), TSTRING(_T("passphrase")), cCmdLineParser::PARAM_ONE); parser.AddArg(cTWPrintCmdLine::PASSPHRASE, TSTRING(_T("P")), TSTRING(_T("passphrase")), cCmdLineParser::PARAM_ONE);
parser.AddArg(cTWPrintCmdLine::HEXADECIMAL, TSTRING(_T("h")), TSTRING(_T("hexadecimal")), cCmdLineParser::PARAM_NONE);
// the paramters to the command line ... for now, this will take "many", even though in some // the paramters to the command line ... for now, this will take "many", even though in some
// modes, this is not valid to do... // modes, this is not valid to do...
@ -276,6 +281,9 @@ static void FillOutCmdLineInfo(cTWPrintModeCommon* pModeInfo, const cCmdLinePars
ASSERT(iter.NumParams() > 0); // should be caught by cmd line parser ASSERT(iter.NumParams() > 0); // should be caught by cmd line parser
pModeInfo->mSiteKeyFile = iter.ParamAt(0); pModeInfo->mSiteKeyFile = iter.ParamAt(0);
break; break;
case cTWPrintCmdLine::HEXADECIMAL:
cArchiveSigGen::SetHex(true);
break;
case cTWPrintCmdLine::PASSPHRASE: case cTWPrintCmdLine::PASSPHRASE:
{ {
// this bites! I have to make sure it is a narrow char string // this bites! I have to make sure it is a narrow char string

View File

@ -89,6 +89,7 @@ public:
PASSPHRASE, PASSPHRASE,
REPORTLEVEL, REPORTLEVEL,
HEXADECIMAL,
PARAMS, // the final parameters PARAMS, // the final parameters

View File

@ -56,6 +56,7 @@ TSS_BeginStringtable( cTWPrint )
_T("Print Database mode:\n") _T("Print Database mode:\n")
_T(" -m d --print-dbfile\n") _T(" -m d --print-dbfile\n")
_T(" -v --verbose\n") _T(" -v --verbose\n")
_T(" -h --hexadecimal\n")
_T(" -s --silent, --quiet\n") _T(" -s --silent, --quiet\n")
_T(" -c cfgfile --cfgfile cfgfile\n") _T(" -c cfgfile --cfgfile cfgfile\n")
_T(" -d database --dbfile database\n") _T(" -d database --dbfile database\n")
@ -70,6 +71,7 @@ TSS_BeginStringtable( cTWPrint )
_T("Print Report mode:\n") _T("Print Report mode:\n")
_T(" -m r --print-report\n") _T(" -m r --print-report\n")
_T(" -v --verbose\n") _T(" -v --verbose\n")
_T(" -h --hexadecimal\n")
_T(" -s --silent, --quiet\n") _T(" -s --silent, --quiet\n")
_T(" -c cfgfile --cfgfile cfgfile\n") _T(" -c cfgfile --cfgfile cfgfile\n")
_T(" -r report --twrfile report\n") _T(" -r report --twrfile report\n")