From f9e0e152bacfd3e5c99a8178cb0867090dcd4ebc Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Thu, 1 Nov 2018 13:14:49 -0400 Subject: [PATCH] 2018-11-01 Fred Gleason * Modified rdselect_helper(8) to use the automounter for managing audio store mounts. --- ChangeLog | 3 + lib/librd_cs.ts | 4 + lib/librd_de.ts | 4 + lib/librd_es.ts | 4 + lib/librd_fr.ts | 4 + lib/librd_nb.ts | 4 + lib/librd_nn.ts | 4 + lib/librd_pt_BR.ts | 4 + lib/rdconfig.cpp | 4 + lib/rdconfig.h | 3 +- rdselect/Makefile.am | 9 +- rdselect/rd.audiostore.autofs | 1 + rivendell.spec.in | 13 ++- utils/rdselect_helper/rdselect_helper.cpp | 101 +++++++++++++++------- utils/rdselect_helper/rdselect_helper.h | 4 + 15 files changed, 133 insertions(+), 33 deletions(-) create mode 100644 rdselect/rd.audiostore.autofs diff --git a/ChangeLog b/ChangeLog index dfa72e86..6d7a1077 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17952,3 +17952,6 @@ * Incremented the package version to 3.0.0alpha01. 2018-10-30 Patrick Linstruth * Added display of warnings from rddbmgr(8) to rddbconfig(8). +2018-11-01 Fred Gleason + * Modified rdselect_helper(8) to use the automounter for managing + audio store mounts. diff --git a/lib/librd_cs.ts b/lib/librd_cs.ts index 16803e90..397d3a64 100644 --- a/lib/librd_cs.ts +++ b/lib/librd_cs.ts @@ -681,6 +681,10 @@ Open RDAdmin->ManageHosts->Add to create one. + + Unable to update automounter configuration + + RDAddCart diff --git a/lib/librd_de.ts b/lib/librd_de.ts index 611a76fb..fb2d97ad 100644 --- a/lib/librd_de.ts +++ b/lib/librd_de.ts @@ -677,6 +677,10 @@ Open RDAdmin->ManageHosts->Add to create one. + + Unable to update automounter configuration + + RDAddCart diff --git a/lib/librd_es.ts b/lib/librd_es.ts index 2d40f5e9..dcbb7d7d 100644 --- a/lib/librd_es.ts +++ b/lib/librd_es.ts @@ -677,6 +677,10 @@ Open RDAdmin->ManageHosts->Add to create one. + + Unable to update automounter configuration + + RDAddCart diff --git a/lib/librd_fr.ts b/lib/librd_fr.ts index d3c0b495..d2d7eef2 100644 --- a/lib/librd_fr.ts +++ b/lib/librd_fr.ts @@ -647,6 +647,10 @@ Open RDAdmin->ManageHosts->Add to create one. + + Unable to update automounter configuration + + RDAddCart diff --git a/lib/librd_nb.ts b/lib/librd_nb.ts index 0d35c44a..d1dd8188 100644 --- a/lib/librd_nb.ts +++ b/lib/librd_nb.ts @@ -677,6 +677,10 @@ Open RDAdmin->ManageHosts->Add to create one. + + Unable to update automounter configuration + + RDAddCart diff --git a/lib/librd_nn.ts b/lib/librd_nn.ts index 0d35c44a..d1dd8188 100644 --- a/lib/librd_nn.ts +++ b/lib/librd_nn.ts @@ -677,6 +677,10 @@ Open RDAdmin->ManageHosts->Add to create one. + + Unable to update automounter configuration + + RDAddCart diff --git a/lib/librd_pt_BR.ts b/lib/librd_pt_BR.ts index 3ae9e9ce..97c5edb2 100644 --- a/lib/librd_pt_BR.ts +++ b/lib/librd_pt_BR.ts @@ -677,6 +677,10 @@ Open RDAdmin->ManageHosts->Add to create one. + + Unable to update automounter configuration + + RDAddCart diff --git a/lib/rdconfig.cpp b/lib/rdconfig.cpp index 5902eab4..d20d4293 100644 --- a/lib/rdconfig.cpp +++ b/lib/rdconfig.cpp @@ -814,6 +814,10 @@ QString RDConfig::rdselectExitCodeText(RDSelectExitCode code) ret=QObject::tr("mount(8) crashed"); break; + case RDConfig::RDSelectCantAccessAutomount: + ret=QObject::tr("Unable to update automounter configuration"); + break; + case RDConfig::RDSelectLast: break; } diff --git a/lib/rdconfig.h b/lib/rdconfig.h index ffbd2ff4..a0676ffc 100644 --- a/lib/rdconfig.h +++ b/lib/rdconfig.h @@ -51,7 +51,8 @@ class RDConfig RDSelectSymlinkFailed=11, RDSelectInvalidName=12, RDSelectMountCrashed=13, - RDSelectLast=14}; + RDSelectCantAccessAutomount=14, + RDSelectLast=15}; RDConfig(); RDConfig(const QString &filename); QString filename() const; diff --git a/rdselect/Makefile.am b/rdselect/Makefile.am index 8d44f531..f1b2e56f 100644 --- a/rdselect/Makefile.am +++ b/rdselect/Makefile.am @@ -1,6 +1,6 @@ ## Makefile.am ## -## (C) Copyright 2012,2016-2018 Fred Gleason +## (C) Copyright 2012-2018 Fred Gleason ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License version 2 as @@ -30,9 +30,13 @@ moc_%.cpp: %.h install-exec-hook: mkdir -p $(DESTDIR)$(prefix)/share/rivendell cp rdselect_*.qm $(DESTDIR)$(prefix)/share/rivendell + mkdir -p $(DESTDIR)/etc/auto.master.d + cp rd.audiostore.autofs $(DESTDIR)/etc/auto.master.d/ + touch $(DESTDIR)/etc/auto.rd.audiostore uninstall-local: rm -f $(DESTDIR)$(prefix)/share/rivendell/rdselect_*.qm + rm -f $(DESTDIR)/etc/auto.master.d/rd.audiostore.autofs all: lupdate-qt4 rdselect.pro @@ -46,7 +50,8 @@ nodist_rdselect_SOURCES = moc_rdselect.cpp rdselect_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ @QT4_LIBS@ -lQt3Support -EXTRA_DIST = rdselect.pro\ +EXTRA_DIST = rd.audiostore.autofs\ + rdselect.pro\ rdselect_cs.ts\ rdselect_de.ts\ rdselect_es.ts\ diff --git a/rdselect/rd.audiostore.autofs b/rdselect/rd.audiostore.autofs new file mode 100644 index 00000000..ef31172d --- /dev/null +++ b/rdselect/rd.audiostore.autofs @@ -0,0 +1 @@ +/- /etc/auto.rd.audiostore diff --git a/rivendell.spec.in b/rivendell.spec.in index 90e310c1..21f0ae4e 100644 --- a/rivendell.spec.in +++ b/rivendell.spec.in @@ -45,7 +45,7 @@ Requires: rivendell = @VERSION@, rivendell-webapi = @VERSION@ %package select Summary: The RDSelect system selector tool for Rivendell. -Requires: rivendell = @VERSION@ +Requires: rivendell = @VERSION@, autofs %description @@ -141,6 +141,7 @@ cp scripts/rd_backup_system.sh $RPM_BUILD_ROOT/@DOC_PATH@/scripts/ cp scripts/rd_restore_system.sh $RPM_BUILD_ROOT/@DOC_PATH@/scripts/ cp scripts/engine_conv.py $RPM_BUILD_ROOT/@DOC_PATH@ cp scripts/init_template_host.py $RPM_BUILD_ROOT/@DOC_PATH@ +rm -f $RPM_BUILD_ROOT/etc/auto.rd.audiostore %post @@ -467,10 +468,20 @@ rm -rf $RPM_BUILD_ROOT %files select @LOCAL_PREFIX@/bin/rdselect %attr(4755,root,root) @LOCAL_PREFIX@/bin/rdselect_helper +/etc/auto.master.d/rd.audiostore.autofs @LOCAL_PREFIX@/bin/rdmonitor /etc/X11/xinit/xinitrc.d/start-rdmonitor.sh +%post select +touch /etc/auto.rd.audiostore +systemctl restart autofs + + +%postun select +systemctl restart autofs + + %changelog * @RPM_DATESTAMP@ Fred Gleason - @VERSION@-@RPM_RELEASE@ -- Autogenerated from build tree. diff --git a/utils/rdselect_helper/rdselect_helper.cpp b/utils/rdselect_helper/rdselect_helper.cpp index b5de7f5c..d2c9ff44 100644 --- a/utils/rdselect_helper/rdselect_helper.cpp +++ b/utils/rdselect_helper/rdselect_helper.cpp @@ -96,38 +96,35 @@ void MainObject::Startup() { QStringList args; QProcess *proc=NULL; + FILE *f=NULL; - // - // Mount the audio store - // if(!helper_config->audioStoreMountSource().isEmpty()) { - args.clear(); - if(!helper_config->audioStoreMountType().isEmpty()) { - args.push_back("-t"); - args.push_back(helper_config->audioStoreMountType()); + // + // Stop the Automounter + // + ControlAutomounter("stop"); + + // + // Update the Automounter + // + if((f=fopen(RDSELECT_AUTOMOUNT_CONFIG,"w"))==NULL) { + fprintf(stderr, + "rdselect_helper: unable to open automount configuration \"%s\" [%s]\n", + RDSELECT_AUTOMOUNT_CONFIG, + strerror(errno)); + exit(RDConfig::RDSelectCantAccessAutomount); } - args.push_back("-o"); - if(helper_config->audioStoreMountOptions().isEmpty()) { - args.push_back("defaults"); - } - else { - args.push_back(helper_config->audioStoreMountOptions()); - } - args.push_back(helper_config->audioStoreMountSource()); - args.push_back(helper_config->audioRoot()); - proc=new QProcess(this); - proc->start("/bin/mount",args); - proc->waitForFinished(); - if(proc->exitStatus()!=QProcess::NormalExit) { - fprintf(stderr,"rdselect_helper: mount(8) command crashed\n"); - exit(RDConfig::RDSelectMountCrashed); - } - if(proc->exitCode()!=0) { - fprintf(stderr,"rdselect_helper: mount exited with error code %d\n", - proc->exitCode()); - exit(RDConfig::RDSelectAudioMountFailed); - } - delete proc; + fprintf(f,"%s",RDSELECT_AUTOMOUNT_WARNING); + fprintf(f,"%s\t-fstype=%s\t%s\n", + (const char *)helper_config->audioRoot().toUtf8(), + (const char *)helper_config->audioStoreMountType().toUtf8(), + (const char *)helper_config->audioStoreMountSource().toUtf8()); + fclose(f); + + // + // Restart the Automounter + // + ControlAutomounter("start"); } // @@ -160,6 +157,7 @@ void MainObject::Startup() void MainObject::Shutdown() { QStringList args; + FILE *f=NULL; // // Stop Rivendell Service @@ -179,6 +177,11 @@ void MainObject::Shutdown() } delete proc; + // + // Stop the Automounter + // + ControlAutomounter("stop"); + // // Unmount the audio store // @@ -190,6 +193,46 @@ void MainObject::Shutdown() exit(RDConfig::RDSelectAudioUnmountFailed); } } + + // + // Update the Automounter + // + if((f=fopen(RDSELECT_AUTOMOUNT_CONFIG,"w"))==NULL) { + fprintf(stderr, + "rdselect_helper: unable to open automount configuration \"%s\" [%s]\n", + RDSELECT_AUTOMOUNT_CONFIG, + strerror(errno)); + exit(RDConfig::RDSelectCantAccessAutomount); + } + fprintf(f,"%s",RDSELECT_AUTOMOUNT_WARNING); + fclose(f); + + // + // Restart the Automounter + // + ControlAutomounter("start"); +} + + +void MainObject::ControlAutomounter(const QString &cmd) +{ + QStringList args; + + args.push_back(cmd); + args.push_back("autofs"); + QProcess *proc=new QProcess(this); + proc->start("/bin/systemctl",args); + proc->waitForFinished(); + if(proc->exitStatus()!=QProcess::NormalExit) { + fprintf(stderr,"rdselect_helper: systemctl(8) crashed\n"); + exit(RDConfig::RDSelectSystemctlCrashed); + } + if(proc->exitCode()!=0) { + fprintf(stderr, + "rdselect_helper: automounter control failed [systemctl exit code: %d]\n", + proc->exitCode()); + } + delete proc; } diff --git a/utils/rdselect_helper/rdselect_helper.h b/utils/rdselect_helper/rdselect_helper.h index d8458a5a..92b8b9f9 100644 --- a/utils/rdselect_helper/rdselect_helper.h +++ b/utils/rdselect_helper/rdselect_helper.h @@ -29,6 +29,9 @@ #include "rdconfig.h" +#define RDSELECT_AUTOMOUNT_CONFIG "/etc/auto.rd.audiostore" +#define RDSELECT_AUTOMOUNT_WARNING "# THE CONTENTS OF THIS FILE ARE MANAGED BY RIVENDELL'S RDSELECT SYSTEM!\n# DO NOT HAND EDIT!\n\n" + class MainObject : public QObject { Q_OBJECT; @@ -38,6 +41,7 @@ class MainObject : public QObject private: void Startup(); void Shutdown(); + void ControlAutomounter(const QString &cmd); bool ProcessActive(const QStringList &cmds) const; bool ModulesActive() const; QString helper_config_filename;