added option restartonsignal for PCAPExporterPipe

git-svn-id: file:///Users/braun/svn/vermont/branches/vermont/dtls-merge@2452 aef3b71b-58ee-0310-9ba9-8811b9f0742f
master
sithhaue 2010-07-12 08:44:15 +00:00
parent 3a6ed7f6f9
commit 02864f4003
5 changed files with 35 additions and 10 deletions

View File

@ -772,6 +772,7 @@ Output type: none
|fiforeadercmd| none |A single (i.e. no shell) command, which must read PCAP files via STDIN. |
|sigkilltimeout| 1 |Maximum additional waiting time in seconds, until a SIGKILL is sent to the reader process on module shutdown. |
|appenddate | false |If set to true, the logfilename given as logfilebasename will be suffixed with the current time and date |
|restartonsignal | false |If set to true, the command specified as fiforedercmd will be restarted, when a SIGUSR2 is sent to vermont |
|linkType | EN10MB |Data link type of the output file. Names are DLT_ names form the pcap man page with the DLT_ removed (see `man pcap') |
|snaplen | PCAP_MAX_ |Snaplen for the pcap file |
| | CAPTURE_LENGTH | |

View File

@ -41,8 +41,8 @@ namespace bfs = boost::filesystem;
PCAPExporterPipe::PCAPExporterPipe(const std::string& logfile)
: logFileName(logfile), fifoReaderCmd(""), onRestart(false),
appenddate(false), fifoReaderPid(0), dummy(NULL),
sigKillTimeout(1),counter(0), last_check(0)
appenddate(false), restartOnSignal(false),fifoReaderPid(0),
dummy(NULL), sigKillTimeout(1),counter(0), last_check(0)
{
}
@ -65,6 +65,10 @@ void PCAPExporterPipe::setSigKillTimeout(int s)
sigKillTimeout = s;
}
void PCAPExporterPipe::setRestartOnSignal(bool b){
restartOnSignal = b;
}
int PCAPExporterPipe::execCmd(std::string& cmd)
{
//char *command[] = {"tcpdump","-nr", "-" , (char*)0}; //"-w", "/tmp/pcap.dump",(char*)0};
@ -173,6 +177,9 @@ void PCAPExporterPipe::performStart()
SignalHandler::getInstance().registerSignalHandler(SIGCHLD, this);
SignalHandler::getInstance().registerSignalHandler(SIGPIPE, this);
if(restartOnSignal)
SignalHandler::getInstance().registerSignalHandler(SIGUSR2, this);
dummy = pcap_open_dead(link_type, snaplen);
if (!dummy) {
THROWEXCEPTION("Could not open dummy device: %s", errbuf);
@ -204,6 +211,8 @@ void PCAPExporterPipe::performShutdown()
{
SignalHandler::getInstance().unregisterSignalHandler(SIGCHLD, this);
SignalHandler::getInstance().unregisterSignalHandler(SIGPIPE, this);
if(restartOnSignal)
SignalHandler::getInstance().unregisterSignalHandler(SIGUSR2, this);
msg(MSG_DEBUG, "Performing shutdown for PID %d", fifoReaderPid);
sleep(1);
if (dumper) {
@ -246,7 +255,7 @@ void PCAPExporterPipe::receive(Packet* packet) {
return;
}
if(fifoReaderPid == 0){
msg(MSG_ERROR, "fifoReaderPid = 0...this might happen during reconfiguration");
msg(MSG_VDEBUG, "fifoReaderPid = 0...this might happen during reconfiguration");
return;
}
writePCAP(packet);
@ -282,6 +291,13 @@ void PCAPExporterPipe::handleSigChld(int sig){
onRestart = false;
}
void PCAPExporterPipe::handleSigUsr2(int sig){
if (! restartOnSignal) return;
int pid = fifoReaderPid;
fifoReaderPid = 0;
kill_all(pid);
handleSigChld(sig);
}
void PCAPExporterPipe::kill_pid(int pid)
{
int i = sigKillTimeout;

View File

@ -40,9 +40,11 @@ public:
~PCAPExporterPipe();
void setPipeReaderCmd(const std::string& cmd);
void setSigKillTimeout(int s);
virtual void handleSigChld(int i);
virtual void handleSigPipe(int sig);
void setRestartOnSignal(bool b);
void setAppendDate(bool b);
virtual void handleSigChld(int sig);
virtual void handleSigPipe(int sig);
virtual void handleSigUsr2(int sig);
bool isRunning(int pid);
int execCmd(std::string& cmd);
void kill_all(int ppid);
@ -64,6 +66,7 @@ private:
std::string logFileName;
std::string fifoReaderCmd;
bool appenddate;
bool restartOnSignal;
int fifoReaderPid;
pcap_t* dummy;
int sigKillTimeout;

View File

@ -28,7 +28,7 @@
PCAPExporterPipeCfg::PCAPExporterPipeCfg(XMLElement* elem)
: CfgHelper<PCAPExporterPipe, PCAPExporterPipeCfg>(elem, "pcapExporterPipe"),
link_type(DLT_EN10MB), snaplen(PCAP_MAX_CAPTURE_LENGTH), sigkilltimeout(1),
logFileName(""), fifoReaderCmd(""), appenddate(false)
logFileName(""), fifoReaderCmd(""), appenddate(false), restart(false)
{
if (!elem) return;
@ -49,12 +49,14 @@ PCAPExporterPipeCfg::PCAPExporterPipeCfg(XMLElement* elem)
}
} else if (e->matches("snaplen")) {
snaplen = getInt("snaplen", PCAP_MAX_CAPTURE_LENGTH, e);
} else if (e->matches("sigkilltimeout")){
} else if (e->matches("sigkilltimeout")) {
sigkilltimeout = getInt("sigkilltimeout", 1, e);
} else if(e->matches("fiforeadercmd")){
} else if(e->matches("fiforeadercmd")) {
fifoReaderCmd = e->getFirstText();
}else if(e->matches("appenddate")){
} else if (e->matches("appenddate")) {
appenddate = getBool("appenddate", false, e);
} else if(e->matches("restartonsignal")) {
restart = getBool("restartonsignal", false, e);
}
}
}
@ -78,6 +80,7 @@ PCAPExporterPipe* PCAPExporterPipeCfg::createInstance()
instance->setSigKillTimeout(sigkilltimeout);
instance->setPipeReaderCmd(fifoReaderCmd);
instance->setAppendDate(appenddate);
instance->setRestartOnSignal(restart);
return instance;
}
@ -88,7 +91,8 @@ bool PCAPExporterPipeCfg::deriveFrom(PCAPExporterPipeCfg* old)
snaplen != old->snaplen ||
fifoReaderCmd != old->fifoReaderCmd ||
sigkilltimeout != old->sigkilltimeout ||
appenddate != old->appenddate
appenddate != old->appenddate ||
restart != old->restart
) return false;
return true; // FIXME: implement
}

View File

@ -49,6 +49,7 @@ private:
int snaplen;
int sigkilltimeout;
bool appenddate;
bool restart;
std::string logFileName;
std::string fifoReaderCmd;
};