From e2fc500ec83b08faeeb29efd6f8487c9c75ef41c Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Fri, 17 May 2019 13:58:34 -0400 Subject: [PATCH] 2019-05-17 Fred Gleason * Added '--end-startup-after-caed', '--end-startup-after-ripcd', '--end-startup-after-rdcatchd', '--end-startup-after-rdpadd', '--end-startup-after-rdpadengined', '--end-startup-after-rdvairplayd', and '--end-startup-after-rdrepld' command line switches to rdservice(8). --- ChangeLog | 6 ++++ docs/manpages/rdservice.xml | 51 +++++++++++++++++++++++++++++-- rdservice/rdservice.cpp | 19 ++++++++++++ rdservice/rdservice.h | 5 ++++ rdservice/startup.cpp | 60 +++++++++++++++++++++++++++++++++++++ 5 files changed, 139 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1951d9d7..ed0cfae2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18672,3 +18672,9 @@ the lowest numbered matching cart/cut found. 2019-05-14 Fred Gleason * Added a 'Webget' chapter to the Operations Guide. +2019-05-17 Fred Gleason + * Added '--end-startup-after-caed', '--end-startup-after-ripcd', + '--end-startup-after-rdcatchd', '--end-startup-after-rdpadd', + '--end-startup-after-rdpadengined', '--end-startup-after-rdvairplayd', + and '--end-startup-after-rdrepld' command line switches to + rdservice(8). diff --git a/docs/manpages/rdservice.xml b/docs/manpages/rdservice.xml index a9ba9117..b9ccf196 100644 --- a/docs/manpages/rdservice.xml +++ b/docs/manpages/rdservice.xml @@ -6,7 +6,7 @@ rdservice 8 - October 2018 + Mat 2019 Linux Audio Manual @@ -30,6 +30,7 @@ rdservice + OPTIONS @@ -41,12 +42,15 @@ System, including caed8, rdcatchd8, ripcd8, + rdpadd8, + rdpadengined8, 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. + (such as systemd1) + 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 @@ -54,6 +58,40 @@ + Options + + + + + + + + + + + + + + + + + + + + + + + + + + Skip the remainder of the startup sequence after the specified + component is started. (Useless except for debugging). + + + + + + Exit Values @@ -66,6 +104,7 @@ 1Prior instance found 2Unable to open database 3Unable to start a service component + 4Unrecognized command line option @@ -79,6 +118,14 @@ rdimport1 + , + + systemd1 + + , + + systemctl1 + diff --git a/rdservice/rdservice.cpp b/rdservice/rdservice.cpp index 312edb4d..f1570fe0 100644 --- a/rdservice/rdservice.cpp +++ b/rdservice/rdservice.cpp @@ -57,6 +57,8 @@ MainObject::MainObject(QObject *parent) QString err_msg; RDApplication::ErrorType err_type=RDApplication::ErrorOk; + svc_startup_target=MainObject::TargetAll; + // // Open the syslog // @@ -80,6 +82,23 @@ MainObject::MainObject(QObject *parent) exit(2); } + // + // Process Startup Options + // + for(unsigned i=0;icmdSwitch()->keys();i++) { + for(int j=0;jcmdSwitch()->key(i)==TargetCommandString(target)) { + svc_startup_target=target; + rda->cmdSwitch()->setProcessed(i,true); + } + } + if(!rda->cmdSwitch()->processed(i)) { + fprintf(stderr,"rdservice: unknown command-line option\n"); + exit(4); + } + } + // // Exit Timer // diff --git a/rdservice/rdservice.h b/rdservice/rdservice.h index 87bb8fa3..7727447d 100644 --- a/rdservice/rdservice.h +++ b/rdservice/rdservice.h @@ -44,6 +44,9 @@ class MainObject : public QObject { Q_OBJECT; public: + enum StartupTarget {TargetCaed=0,TargetRipcd=1,TargetRdcatchd=2, + TargetRdpadd=3,TargetRdpadengined=4, + TargetRdvairplayd=5,TargetRdrepld=6,TargetAll=7}; MainObject(QObject *parent=0); private slots: @@ -62,9 +65,11 @@ class MainObject : public QObject int GetMaintInterval() const; void RunEphemeralProcess(int id,const QString &program, const QStringList &args); + QString TargetCommandString(StartupTarget target) const; QMap svc_processes; QTimer *svc_maint_timer; QTimer *svc_exit_timer; + StartupTarget svc_startup_target; }; diff --git a/rdservice/startup.cpp b/rdservice/startup.cpp index 3384ce9d..4a8b644b 100644 --- a/rdservice/startup.cpp +++ b/rdservice/startup.cpp @@ -58,6 +58,10 @@ bool MainObject::Startup(QString *err_msg) svc_processes[RDSERVICE_CAED_ID]->errorText(); return false; } + if(svc_startup_target==MainObject::TargetCaed) { + fprintf(stderr,"Startup target caed(8) reached\n"); + return true; + } // // ripcd(8) @@ -71,6 +75,10 @@ bool MainObject::Startup(QString *err_msg) svc_processes[RDSERVICE_RIPCD_ID]->errorText(); return false; } + if(svc_startup_target==MainObject::TargetRipcd) { + fprintf(stderr,"Startup target ripcd(8) reached\n"); + return true; + } // // rdcatchd(8) @@ -84,6 +92,10 @@ bool MainObject::Startup(QString *err_msg) svc_processes[RDSERVICE_RDCATCHD_ID]->errorText(); return false; } + if(svc_startup_target==MainObject::TargetRdcatchd) { + fprintf(stderr,"Startup target rdcatchd(8) reached\n"); + return true; + } // // rdpadd(8) @@ -97,6 +109,10 @@ bool MainObject::Startup(QString *err_msg) svc_processes[RDSERVICE_RDPADD_ID]->errorText(); return false; } + if(svc_startup_target==MainObject::TargetRdpadd) { + fprintf(stderr,"Startup target rdpadd(8) reached\n"); + return true; + } // // *** BAND-AID * BAND_AID * YEECH! *** @@ -118,6 +134,10 @@ bool MainObject::Startup(QString *err_msg) svc_processes[RDSERVICE_RDPADENGINED_ID]->errorText(); return false; } + if(svc_startup_target==MainObject::TargetRdpadengined) { + fprintf(stderr,"Startup target rdpadengined(8) reached\n"); + return true; + } // // rdvairplayd(8) @@ -131,6 +151,10 @@ bool MainObject::Startup(QString *err_msg) svc_processes[RDSERVICE_RDVAIRPLAYD_ID]->errorText(); return false; } + if(svc_startup_target==MainObject::TargetRdvairplayd) { + fprintf(stderr,"Startup target rdvairplayd(8) reached\n"); + return true; + } // // rdrepld(8) @@ -150,6 +174,10 @@ bool MainObject::Startup(QString *err_msg) } } delete q; + if(svc_startup_target==MainObject::TargetRdrepld) { + fprintf(stderr,"Startup target rdrepld(8) reached\n"); + return true; + } if(!StartDropboxes(err_msg)) { return false; @@ -296,3 +324,35 @@ void MainObject::KillProgram(const QString &program) pids=RDGetPids(program); } } + + +QString MainObject::TargetCommandString(MainObject::StartupTarget target) const +{ + switch(target) { + case MainObject::TargetCaed: + return QString("--end-startup-after-caed"); + + case MainObject::TargetRipcd: + return QString("--end-startup-after-ripcd"); + + case MainObject::TargetRdcatchd: + return QString("--end-startup-after-rdcatchd"); + + case MainObject::TargetRdpadd: + return QString("--end-startup-after-rdpadd"); + + case MainObject::TargetRdpadengined: + return QString("--end-startup-after-rdpadengined"); + + case MainObject::TargetRdvairplayd: + return QString("--end-startup-after-rdvairplayd"); + + case MainObject::TargetRdrepld: + return QString("--end-startup-after-rdrepld"); + + case MainObject::TargetAll: + break; + } + + return QString(); +}