diff --git a/ChangeLog b/ChangeLog index ef6b9294..ca9811d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18337,3 +18337,6 @@ 2019-01-09 Fred Gleason * Fixed a bug in rddbmgr(8) that caused DB corruption in multi-byte UTF-8 strings when reverting the schema. +2019-01-09 Fred Gleason + * Fixed a bug in rdpadengined(8) that caused PyPAD script errors + to fail to be logged. diff --git a/lib/rdprocess.cpp b/lib/rdprocess.cpp index 07b29b37..9536e0d2 100644 --- a/lib/rdprocess.cpp +++ b/lib/rdprocess.cpp @@ -31,6 +31,8 @@ RDProcess::RDProcess(int id,QObject *parent) connect(p_process,SIGNAL(started()),this,SLOT(startedData())); connect(p_process,SIGNAL(finished(int,QProcess::ExitStatus)), this,SLOT(finishedData(int,QProcess::ExitStatus))); + connect(p_process,SIGNAL(readyReadStandardError()), + this,SLOT(readyReadStandardErrorData())); } @@ -103,6 +105,12 @@ void RDProcess::finishedData(int exit_code,QProcess::ExitStatus status) } +void RDProcess::readyReadStandardErrorData() +{ + p_standard_error_data+=process()->readAllStandardError(); +} + + void *RDProcess::privateData() const { return p_private_data; @@ -113,3 +121,9 @@ void RDProcess::setPrivateData(void *priv) { p_private_data=priv; } + + +QByteArray RDProcess::standardErrorData() const +{ + return p_standard_error_data; +} diff --git a/lib/rdprocess.h b/lib/rdprocess.h index 6d01a91f..2b972f16 100644 --- a/lib/rdprocess.h +++ b/lib/rdprocess.h @@ -37,6 +37,7 @@ class RDProcess : public QObject QString errorText() const; void *privateData() const; void setPrivateData(void *priv); + QByteArray standardErrorData() const; signals: void started(int id); @@ -45,6 +46,7 @@ class RDProcess : public QObject private slots: void startedData(); void finishedData(int exit_code,QProcess::ExitStatus status); + void readyReadStandardErrorData(); private: int p_id; @@ -53,6 +55,7 @@ class RDProcess : public QObject QProcess *p_process; QString p_error_text; void *p_private_data; + QByteArray p_standard_error_data; }; diff --git a/rdpadengined/rdpadengined.cpp b/rdpadengined/rdpadengined.cpp index 778553c9..95273bea 100644 --- a/rdpadengined/rdpadengined.cpp +++ b/rdpadengined/rdpadengined.cpp @@ -64,13 +64,17 @@ MainObject::MainObject(QObject *parent) // if(getuid()==0) { if(setgid(rda->config()->pypadGid())!=0) { - fprintf(stderr,"rdpadengined: unable to set GID to %d [%s]\n", - rda->config()->pypadGid(),strerror(errno)); + rda->log(RDConfig::LogErr, + QString().sprintf("unable to set GID to %d [", + rda->config()->pypadGid())+ + QString(strerror(errno))+"], exiting"); exit(1); } if(setuid(rda->config()->pypadUid())!=0) { - fprintf(stderr,"rdpadengined: unable to set UID to %d [%s]\n", - rda->config()->pypadUid(),strerror(errno)); + rda->log(RDConfig::LogErr, + QString().sprintf("unable to set UID to %d [", + rda->config()->pypadUid())+ + QString(strerror(errno))+"], exiting"); exit(1); } } @@ -80,8 +84,9 @@ MainObject::MainObject(QObject *parent) // for(unsigned i=0;icmdSwitch()->keys();i++) { if(!rda->cmdSwitch()->processed(i)) { - fprintf(stderr,"rdpadengined: unknown command option \"%s\"\n", - (const char *)rda->cmdSwitch()->key(i)); + rda->log(RDConfig::LogErr, + QString("unknown command option \"")+rda->cmdSwitch()->key(i)+ + "\""); exit(2); } } @@ -187,8 +192,9 @@ void MainObject::instanceFinishedData(int id) RDProcess *proc=pad_instances.value(id); if(proc->process()->exitStatus()!=QProcess::NormalExit) { - fprintf(stderr,"rdpadengined: process %d crashed\n",id); - SetRunStatus(id,false,-1,proc->process()->readAllStandardError()); + rda->log(RDConfig::LogWarning, + QString().sprintf("PyPAD script %d crashed\n",id)); + SetRunStatus(id,false,-1,proc->standardErrorData()); proc->deleteLater(); pad_instances.remove(id); return; @@ -205,8 +211,11 @@ void MainObject::instanceFinishedData(int id) } else { if(!global_pad_exiting) { + rda->log(RDConfig::LogWarning, + QString().sprintf("PyPAD script ID %d exited with code %d", + id,proc->process()->exitCode())); SetRunStatus(id,false,proc->process()->exitCode(), - proc->process()->readAllStandardError()); + proc->standardErrorData()); } } } @@ -243,13 +252,14 @@ void MainObject::StartScript(unsigned id,const QString &script_path) connect(proc,SIGNAL(started(int)),this,SLOT(instanceStartedData(int))); connect(proc,SIGNAL(finished(int)),this,SLOT(instanceFinishedData(int))); QStringList args; + args.push_back("-u"); args.push_back(script_path); args.push_back("localhost"); args.push_back(QString().sprintf("%u",RD_PAD_CLIENT_TCP_PORT)); args.push_back(QString().sprintf("$%u",id)); pad_instances.value(id)->start(RD_PYPAD_PYTHON_PATH,args); - syslog(LOG_NOTICE,"starting: %s %s",(const char *)proc->program().toUtf8(), - (const char *)proc->arguments().join(" ").toUtf8()); + rda->log(RDConfig::LogInfo,"starting: "+proc->program()+" "+ + proc->arguments().join(" ").toUtf8()); }