diff --git a/ChangeLog b/ChangeLog index 53e92aaf..68409409 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17838,3 +17838,8 @@ 2018-10-19 Fred Gleason * Added code in the %post and %preun rules in 'rivendell.spec.in' to enable and disable the 'rivendell' service. +2018-10-19 Fred Gleason + * Modified rdservice(8) to log errors to syslog. + * Added an rdservice(8) man page. + * Modified 'systemd/rivendell.service.in' to enable automatic + start retries. diff --git a/docs/manpages/Makefile.am b/docs/manpages/Makefile.am index f822221f..f4b74b7e 100644 --- a/docs/manpages/Makefile.am +++ b/docs/manpages/Makefile.am @@ -38,7 +38,8 @@ all-local: rdclilogedit.1\ rdimport.1\ rdmarkerset.8\ rdrender.1\ - rmlsend.1 + rmlsend.1\ + rdservice.8 man_MANS = rdclilogedit.1\ rdconvert.1\ @@ -47,7 +48,8 @@ man_MANS = rdclilogedit.1\ rdimport.1\ rdmarkerset.8\ rdrender.1\ - rmlsend.1 + rmlsend.1\ + rdservice.8 EXTRA_DIST = rdclilogedit.1\ rdclilogedit.xml\ @@ -64,7 +66,9 @@ EXTRA_DIST = rdclilogedit.1\ rdrender.1\ rdrender.xml\ rmlsend.1\ - rmlsend.xml + rmlsend.xm\ + rdservice.8\ + rdservice.xml CLEANFILES = *~ MAINTAINERCLEANFILES = *~\ diff --git a/docs/manpages/rdservice.xml b/docs/manpages/rdservice.xml new file mode 100644 index 00000000..a9ba9117 --- /dev/null +++ b/docs/manpages/rdservice.xml @@ -0,0 +1,87 @@ + + + + + rdservice + 8 + October 2018 + Linux Audio Manual + + + rdservice + Rivendell service manager + + + + + Fred + Gleason + fredg@paravelsystems.com + + Application Author + + + + + + + rdservice + + + + + Description + + rdservice8 manages the various + background service components of the Rivendell Radio Automation + System, including caed8, + rdcatchd8, + ripcd8, + rdvairplayd8, + rdimport1 (in dropbox mode) + as well as periodic system maintenance tasks using + rdmaint8. + It is normally invoked by the host's boot system + (such as Systemd) at system boot-time and runs continuously thereafter. + There should only be one instance of + rdservice8 running at any + given time; attempts to start an additional instance will terminate + with exit code 1. + + + + Exit Values + + + + + + + + 0Normal shutdown + 1Prior instance found + 2Unable to open database + 3Unable to start a service component + + + + + See Also + + + rddbmgr8 + + , + + rdimport1 + + + + + + + diff --git a/rdservice/rdservice.cpp b/rdservice/rdservice.cpp index 378d2ad6..86620bb0 100644 --- a/rdservice/rdservice.cpp +++ b/rdservice/rdservice.cpp @@ -56,11 +56,16 @@ MainObject::MainObject(QObject *parent) { QString err_msg; + // + // Open the syslog + // + openlog("rdservice",LOG_PERROR,LOG_DAEMON); + // // Check for prior instance // if(RDGetPids("rdservice").size()>1) { - fprintf(stderr,"rdservice: prior instance found\n"); + syslog(LOG_ERR,"prior instance found"); exit(1); } @@ -69,8 +74,9 @@ MainObject::MainObject(QObject *parent) // rda=new RDApplication("rdservice","rdservice","\n\n",this); if(!rda->open(&err_msg)) { - fprintf(stderr,"rdservice: %s\n",(const char *)err_msg.utf8()); - exit(1); + syslog(LOG_ERR,"unable to open database [%s]", + (const char *)err_msg.utf8()); + exit(2); } // @@ -85,8 +91,9 @@ MainObject::MainObject(QObject *parent) if(!Startup(&err_msg)) { Shutdown(); - fprintf(stderr,"rdservice: %s\n",(const char *)err_msg.toUtf8()); - exit(1); + syslog(LOG_ERR,"unable to start service component [%s]", + (const char *)err_msg.toUtf8()); + exit(3); } // @@ -105,7 +112,8 @@ MainObject::MainObject(QObject *parent) } if(!RDWritePid(RD_PID_DIR,"rdservice.pid",getuid())) { - fprintf(stderr,"rdservice: can't write pid file\n"); + syslog(LOG_WARNING,"unable to write pid file to \"%s/rdservice.pid\"", + RD_PID_DIR); } } @@ -124,6 +132,7 @@ void MainObject::exitData() if(global_exiting) { Shutdown(); RDDeletePid(RD_PID_DIR,"rdservice.pid"); + syslog(LOG_DEBUG,"shutting down normally"); exit(0); } diff --git a/rdservice/startup.cpp b/rdservice/startup.cpp index 00b6efe7..02178d74 100644 --- a/rdservice/startup.cpp +++ b/rdservice/startup.cpp @@ -232,85 +232,6 @@ bool MainObject::StartDropboxes(QString *err_msg) return false; } id++; - - - - /* - QString cmd=QString(). - sprintf("nice rdimport --persistent-dropbox-id=%d --drop-box --log-mode", - q->value(15).toInt()); - sql=QString("select SCHED_CODE from DROPBOX_SCHED_CODES where ")+ - QString().sprintf("DROPBOX_ID=%d",q->value(0).toInt()); - q1=new RDSqlQuery(sql); - while(q1->next()) { - cmd+=QString(" --add-scheduler-code=\"")+q1->value(0).toString()+"\""; - } - delete q1; - cmd+= - QString().sprintf(" --normalization-level=%d",q->value(3).toInt()/100); - cmd+= - QString().sprintf(" --autotrim-level=%d",q->value(4).toInt()/100); - if(q->value(5).toUInt()>0) { - cmd+=QString().sprintf(" --to-cart=%u",q->value(5).toUInt()); - } - if(q->value(6).toString()=="Y") { - cmd+=" --use-cartchunk-cutid"; - } - if(q->value(21).toInt()<1) { - cmd+= - QString().sprintf(" --segue-level=%d",q->value(21).toInt()); - cmd+= - QString().sprintf(" --segue-length=%u",q->value(22).toUInt()); - } - if(q->value(7).toString()=="Y") { - cmd+=" --title-from-cartchunk-cutid"; - } - if(q->value(8).toString()=="Y") { - cmd+=" --delete-cuts"; - } - if(q->value(20).toString()=="Y") { - cmd+=" --to-mono"; - } - if(!q->value(9).toString().isEmpty()) { - cmd+=QString().sprintf(" \"--metadata-pattern=%s\"", - (const char *)q->value(9).toString()); - } - if(q->value(10).toString()=="Y") { - cmd+=" --fix-broken-formats"; - } - if(q->value(12).toString()=="Y") { - cmd+=" --delete-source"; - } - if(q->value(16).toString()=="Y") { - cmd+=QString().sprintf(" --create-startdate-offset=%d", - q->value(17).toInt()); - cmd+=QString().sprintf(" --create-enddate-offset=%d", - q->value(18).toInt()); - } - if(!q->value(19).toString().isEmpty()) { - cmd+=" --set-user-defined="+RDEscapeString(q->value(19).toString()); - } - cmd+=QString().sprintf(" --startdate-offset=%d",q->value(13).toInt()); - cmd+=QString().sprintf(" --enddate-offset=%d",q->value(14).toInt()); - cmd+=QString().sprintf(" %s \"%s\"",(const char *)q->value(1).toString(), - (const char *)q->value(2).toString()); - if(!q->value(11).toString().isEmpty()) { - cmd+=QString().sprintf(" >> %s 2>> %s", - (const char *)q->value(11).toString(), - (const char *)q->value(11).toString()); - } - else { - cmd+=" > /dev/null 2> /dev/null"; - } - cmd+=" &"; - LogLine(RDConfig::LogInfo,QString(). - sprintf("launching dropbox configuration: \"%s\"", - (const char *)cmd)); - if(fork()==0) { - system(cmd); - exit(0); - } - */ } delete q; return true; @@ -324,8 +245,8 @@ void MainObject::KillProgram(const QString &program) while(pids.size()>0) { for(int i=0;i