This commit is contained in:
biosvos
2026-08-07 17:38:18 +09:00
commit 873193a243
9613 changed files with 2755992 additions and 0 deletions
+238
View File
@@ -0,0 +1,238 @@
#include "ExecCall.h"
#include "ServiceConfig.h"
#include "Logger.h"
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <spawn.h>
static int getCommand(string cmd, string & out)
{
string data;
FILE *stream;
int MAX_BUFFER = 256;
char buffer[MAX_BUFFER];
cmd.append(" 2>&1");
LOG(LDEV1, "[POPNE] OPEN %s ", cmd.c_str());
stream = popen(cmd.c_str(), "r");
if (!stream)
{
LOG(LERR, "[POPNE] popen error. [%s] ", cmd.c_str());
return -1;
}
LOG(LDEV1, "[POPNE] READ %s ", cmd.c_str());
memset(buffer, 0, MAX_BUFFER);
while (fgets(buffer, MAX_BUFFER, stream))
{
LOG(LDEV1, "[POPNE] READING.. %s|%s ", cmd.c_str(), buffer);
data.append(buffer);
memset(buffer, 0, MAX_BUFFER);
}
LOG(LDEV1, "[POPNE] READ END %s ", cmd.c_str());
if (ferror(stream))
{
// Handle error.
LOG(LERR, "[POPNE] Handle error. [%s] ", cmd.c_str());
return -2;
}
out = data;
pclose(stream);
//if (status == -1)
//{
// LOG(LERR, "[POPNE] popen run error(%s). [%s] ", data.c_str(),cmd.c_str());
// return -3;
//}
return 0;
}
static int callAnother(char *argv[])
{
//pid_t processID;
//int status = -1;
//status = posix_spawn(&processID, argv[0], NULL, NULL, argv, environ);
//if (status == 0)
// LOG(LDBG, "%s Launching Application", argv[0]);
//else
// LOG(LDBG, "%s Launching application Failed", argv[0]);
///*
pid_t pid = fork();
// 실해된 프로세스 좀비 프로스세 막기 위해서
signal(SIGCHLD, SIG_IGN);
switch (pid)
{
case -1:
LOG(LERR, "Command fork failed.[%s]", argv[0]);
return -1;
break;
case 0:
{
// exec ... call
// close-exec
int flags;
for (int i = getdtablesize(); i-- > 3;) {
if ((flags = fcntl(i, F_GETFD)) != -1)
fcntl(i, F_SETFD, flags | FD_CLOEXEC);
}
execvp(argv[0], const_cast<char**>(argv));
LOG(LERR, "Command exec failed.[%s]", argv[0]); // //check for error in execl
exit(EXIT_FAILURE);
return -2;
}
break;
default:
// wait((int*)0);// child 종료 될 때까지 기다림; block 됨
LOG(LDBG, "%s completed", argv[0]);
return 0;
break;
}
//*/
return 0;
}
CExecCall::CExecCall(CSyncInfo & info)
: m_info(info)
{
}
CExecCall::~CExecCall()
{
}
int CExecCall::Call(Call_TYPE t, bool called /*= true*/)
{
int r = -1 ;
switch (t)
{
case CExecCall::DIFF_SCRIPT:
r = DIFF(called);
break;
case CExecCall::RC_CMOVE:
r = RCCMove(called);
break;
default:
r = -1;
break;
}
return r;
}
int CExecCall::GetFileLine(const char * filename)
{
int64_t r = -1;
string out;
ostringstream cmd, msg;
cmd << "cat " << filename << " | wc -l";
if(getCommand(cmd.str(), out) == 0)
{
r = atoll(out.c_str());
}
msg << "file lines : " << filename << " => " << r;
_LOG(LDBG, msg.str().c_str());
return r;
}
int CExecCall::DIFF(bool called /*= true*/)
{
int r = 0;
// /user/service/etc/svcsync_diff.sh [master data] [slave data] [output file]
string strCmd = CServiceConfig::GetInstance()->GetDiffCommand();
struct stat fileStat;
if (stat(strCmd.c_str(), &fileStat) < 0)
{
LOG(LERR, "Diff Commnad not found.[%s]", strCmd.c_str());
if (getppid() > 1)
{
kill(getppid(), SIGTERM);
}
return -101;
}
strCmd = strCmd + " " + m_info.file_master_name + " " + m_info.file_slave_name + " " + m_info.file_diff_name;
if (called)
{
string out;
r = getCommand(strCmd, out);
if (r != 0)
LOG(LERR, "Fialed diff script.[%s]", strCmd.c_str());
}
else
{
r = -100;
LOG(LNOT, "Only block run diff script.[%s]", strCmd.c_str());
}
return r;
}
int CExecCall::RCCMove(bool called /*= true*/)
{
int r = 0;
// /user/service/bin/rc_cmove -m copy -f [sync file]
string strCmd = CServiceConfig::GetInstance()->GetRCCMoveCommand();
struct stat fileStat;
if (stat(strCmd.c_str(), &fileStat) < 0)
{
LOG(LERR, "RC MOVE Commnad not found.[%s]", strCmd.c_str());
if (getppid() > 1)
{
kill(getppid(), SIGTERM);
}
return -101;
}
if (called)
{
strCmd = strCmd + " -m copy -f " + m_info.file_sync_name;
string out;
r = getCommand(strCmd, out);
}
else
{
char *argv[8];
argv[0] = (char *)strCmd.c_str();
argv[1] = (char *)"-m";
argv[2] = (char *)"copy";
argv[3] = (char *)"-f";
argv[4] = (char *)m_info.file_sync_name.c_str();
argv[5] = (char *)"2>&1";
argv[6] = (char *)"&";
argv[7] = NULL;
r = callAnother(argv);
}
if (r != 0)
LOG(LERR, "Fialed rc_cmove.[%s]", strCmd.c_str());
return 0;
}