Files
2026-08-07 17:38:18 +09:00

129 lines
3.1 KiB
C++

#include "rcdu.h"
#include "Database.h"
#include "Logger.h"
#include "parammanager.h"
#include "infomanager.h"
#include "syncmanager.h"
#include <unistd.h>
static void Trim( string & str )
{
if( str.length() == 0 )
return ;
// 문자열 뒤의 공백, TAB, CR 등의 문자 제거처리.
string::size_type pos = str.find_last_not_of(" \a\b\f\n\r\t\v");
if( pos != string::npos )
str.erase( pos + 1 );
// 문자열 앞의 공백, TAB, CR 등의 문자 제거처리.
pos = str.find_first_not_of(" \a\b\f\n\r\t\v");
if( pos != string::npos )
str.erase( 0, pos );
}
static bool IsCurrentProcessRun()
{
char tempBuffer[512];
FILE * fd = NULL;
bool bRun = false;
snprintf( tempBuffer, sizeof(tempBuffer), "pgrep -x %s | sort", PROG_NAME );
fd = popen( tempBuffer, "r" );
if( fd == NULL )
{
cerr << "[error] Process duplication check failed.[popen error][" << strerror(errno) << "]" << endl;
// 오류 발생시 true 반환하여 프로세스 실행 방지처리
return true;
}
else
{
memset( tempBuffer, 0x00, sizeof(tempBuffer) );
while( fgets( tempBuffer, sizeof(tempBuffer)-1, fd) != NULL )
{
string tempPid( tempBuffer );
Trim(tempPid);
if( atoi( tempPid.c_str() ) != getpid() )
{
cout << "[info] Process duplication found. pid[" << atoi( tempPid.c_str() ) << "]" << endl;
bRun = true;
break;
}
}
pclose( fd );
return bRun;
}
}
// main function
int main( int argc, char * argv[] )
{
// 프로그램 중복 실행 체크
if( IsCurrentProcessRun() == true )
{
cerr << "[warning] Process[" << PROG_NAME << "] is already running...." << endl;
return EXIT_FAILURE;
}
// 입력된 정보 분석 및 config load
CParamManager paramter;
if( paramter.inputparamAnalysis( argc, argv ) != 0 )
return EXIT_FAILURE;
// database connect
DataBase db;
if( db.PgOpenDB( paramter.getDBHost(), paramter.getDBPort(), paramter.getDBName(),
paramter.getDBUser(),paramter.getDBPasswd() ) == NULL)
{
cerr << "[error] Database connection fail." << endl;
return EXIT_FAILURE;
}
// initialized Log object
if( CLogger::Init( PROG_NAME, paramter.getLogPath(), paramter.getLogLevel()) == false )
{
cerr << "[error] Failed to initialize the log object." << endl;
return EXIT_FAILURE;
}
// load calculation depth
CInfoManager infomanger;
if( !infomanger.loadInfo( db, paramter.getServiceid() ) )
{
LOG(LERR, "load calculation depth failed.");
cerr << "[error] load calculation depth failed." << endl;
return EXIT_FAILURE;
}
#ifdef _DEBUG
time_t time_start = time(0);
#endif // _DEBUG
// 각 모드별 작업
switch( paramter.getMode() )
{
case CParamManager::REGMODE:
{
cout << "Mode : REG " << endl;
_LOG(LINF, "Mode : REG - start.");
infomanger.changDepth( db, paramter.getCaldepth() );
_LOG(LINF, "Mode : REG - end.");
}
break;
case CParamManager::SYNCMODE:
{
cout << "Mode : SYNC " << endl;
_LOG(LINF, "Mode : SYNC - start.");
CSyncManager syncmanager;
syncmanager.sync( db, infomanger.getInfolist() );
_LOG(LINF, "Mode : SYNC - end.");
}
break;
}
#ifdef _DEBUG
cout << "run-time : " << time(0) - time_start << " sec" <<endl;
#endif // _DEBUG
return EXIT_SUCCESS;
}