diff --git a/src/qtgui/crontool.cpp b/src/qtgui/crontool.cpp index e5da5277..79fbfad7 100644 --- a/src/qtgui/crontool.cpp +++ b/src/qtgui/crontool.cpp @@ -51,8 +51,9 @@ void CronToolW::init() return; if (checkCrontabUnmanaged(marker, "recollindex")) { - QMessageBox::warning(0, "Recoll", - tr("It seems that manually edited entries exist for recollindex, cannot edit crontab")); + QMessageBox::warning( + 0, "Recoll", tr("It seems that manually edited entries exist for " + "recollindex, cannot edit crontab")); QTimer::singleShot(0, this, SLOT(close())); } @@ -81,6 +82,15 @@ void CronToolW::changeCron(bool enable) string id = idstring(theconfig->getConfDir()); string cmd("recollindex"); +#if defined(MACPORTS) || defined(HOMEBREW) + // The MACPORTS and HOMEBREW flags are set by the resp. portfile + // and recipee. Adjust the path for finding recollindex accordingly +#if defined(MACPORTS) + cmd = string("PATH=/opt/local/bin/:$PATH ") + cmd; +#elif defined(HOMEBREW) + cmd = string("PATH=/usr/local/bin/:$PATH ") + cmd; +#endif +#endif string reason; @@ -95,8 +105,9 @@ void CronToolW::changeCron(bool enable) if (editCrontab(marker, id, sched, cmd, reason)) { accept(); } else { - QMessageBox::warning(0, "Recoll", - tr("Error installing cron entry. Bad syntax in fields ?")); + QMessageBox::warning( + 0, "Recoll", tr("Error installing cron entry. " + "Bad syntax in fields ?")); } } } diff --git a/src/testmains/Makefile.am b/src/testmains/Makefile.am index 2ef43927..2ca73e4a 100644 --- a/src/testmains/Makefile.am +++ b/src/testmains/Makefile.am @@ -39,7 +39,10 @@ AM_CPPFLAGS = -Wall -Wno-unused -std=c++11 \ $(DEFS) noinst_PROGRAMS = textsplit utf8iter fstreewalk rclconfig hldata unac mbox \ - circache wipedir mimetype pathut fileudi x11mon trqrstore + circache wipedir mimetype pathut fileudi x11mon trqrstore ecrontab + +ecrontab_SOURCES = trecrontab.cpp +ecrontab_LDADD = ../librecoll.la circache_SOURCES = trcircache.cpp circache_LDADD = ../librecoll.la diff --git a/src/testmains/trecrontab.cpp b/src/testmains/trecrontab.cpp new file mode 100644 index 00000000..e298c97f --- /dev/null +++ b/src/testmains/trecrontab.cpp @@ -0,0 +1,132 @@ +/* Copyright (C) 2017-2019 J.F.Dockes + * + * License: GPL 2.1 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include + +#include +#include + +using namespace std; + +#include "ecrontab.h" + + +static char *thisprog; + +static char usage [] = + " -a add or replace crontab line \n" + " -d delete crontab line \n" + " -s get scheduling \n" + " -c check for unmanaged lines for string\n" + ; + +static void +Usage(void) +{ + fprintf(stderr, "%s: usage:\n%s", thisprog, usage); + exit(1); +} + +static int op_flags; +#define OPT_MOINS 0x1 +#define OPT_a 0x2 +#define OPT_d 0x4 +#define OPT_w 0x8 +#define OPT_c 0x10 +#define OPT_s 0x20 + +const string& marker("RCLCRON_RCLINDEX="); +// Note of course the -w does not make sense for a cron entry +const string& cmd0("recollindex -w "); +const string& id("RECOLL_CONFDIR=\"/home/dockes/.recoll/\""); +const string& sched("30 8 * 1 *"); + +int main(int argc, char **argv) +{ + thisprog = argv[0]; + argc--; argv++; + + string wt = "10"; + string cmd; + + while (argc > 0 && **argv == '-') { + (*argv)++; + if (!(**argv)) + /* Cas du "adb - core" */ + Usage(); + while (**argv) + switch (*(*argv)++) { + case 'a': op_flags |= OPT_a; break; + case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); + cmd = *(++argv); argc--; + goto b1; + case 'd': op_flags |= OPT_d; break; + case 's': op_flags |= OPT_s; break; + case 'w': op_flags |= OPT_w; if (argc < 2) Usage(); + wt = *(++argv); argc--; + goto b1; + + default: Usage(); break; + } + b1: argc--; argv++; + } + + if (argc != 0) + Usage(); + + string reason; + bool status = false; + + if (op_flags & OPT_a) { + cmd = cmd0 + wt; + status = editCrontab(marker, id, sched, cmd, reason); + } else if (op_flags & OPT_d) { + status = editCrontab(marker, id, sched, "", reason); + } else if (op_flags & OPT_s) { + vector sched; + if (!(status = getCrontabSched(marker, id, sched))) { + cerr << "getCrontabSched failed: " << reason << endl; + exit(1); + } + cout << "sched vec size " << sched.size() << endl; + cout << "mins " << sched[0] << " hours " << sched[1] << + " days of month " << sched[2] << " months " << sched[3] << + " days of week " << sched[4] << endl; + exit(0); + + } else if (op_flags & OPT_c) { + if ((status = checkCrontabUnmanaged(marker, cmd))) { + cerr << "crontab has unmanaged lines for " << cmd << endl; + exit(1); + } + exit(0); + } else { + Usage(); + } + if (!status) { + cerr << "editCrontab failed: " << reason << endl; + exit(1); + } + exit(0); +} diff --git a/src/utils/ecrontab.cpp b/src/utils/ecrontab.cpp index a92319c5..af677391 100644 --- a/src/utils/ecrontab.cpp +++ b/src/utils/ecrontab.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2004 J.F.Dockes +/* Copyright (C) 2004-2021 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -14,7 +14,6 @@ * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef TEST_ECRONTAB #include "autoconfig.h" #include @@ -37,8 +36,8 @@ static bool eCrontabGetLines(vector& lines) // status than for an empty one args.push_back("-l"); if ((status = croncmd.doexec("crontab", args, 0, &crontab))) { - lines.clear(); - return false; + lines.clear(); + return false; } // Split crontab into lines @@ -54,54 +53,51 @@ static bool eCrontabWriteFile(const vector& lines, string& reason) vector args; int status; - for (vector::const_iterator it = lines.begin(); - it != lines.end(); it++) { - crontab += *it + "\n"; + for (const auto& line : lines) { + crontab += line + "\n"; } args.push_back("-"); if ((status = croncmd.doexec("crontab", args, &crontab, 0))) { - char nbuf[30]; - sprintf(nbuf, "0x%x", status); - reason = string("Exec crontab -l failed: status: ") + nbuf; - return false; + char nbuf[30]; + sprintf(nbuf, "0x%x", status); + reason = string("Exec crontab -l failed: status: ") + nbuf; + return false; } return true; } // Add / change / delete entry identified by marker and id bool editCrontab(const string& marker, const string& id, - const string& sched, const string& cmd, string& reason) + const string& sched, const string& cmd, string& reason) { vector lines; if (!eCrontabGetLines(lines)) { - // Special case: cmd is empty, no crontab, don't create one - if (cmd.empty()) - return true; + // Special case: cmd is empty, no crontab, don't create one + if (cmd.empty()) + return true; } // Remove old copy if any - for (vector::iterator it = lines.begin(); - it != lines.end(); it++) { - // Skip comment - if (it->find_first_of("#") == it->find_first_not_of(" \t")) - continue; + for (auto it = lines.begin(); it != lines.end(); it++) { + // Skip comment + if (it->find_first_of("#") == it->find_first_not_of(" \t")) + continue; - if (it->find(marker) != string::npos && - it->find(id) != string::npos) { - lines.erase(it); - break; - } + if (it->find(marker) != string::npos && it->find(id) != string::npos) { + lines.erase(it); + break; + } } if (!cmd.empty()) { - string nline = sched + " " + marker + " " + id + " " + cmd; - lines.push_back(nline); + string nline = sched + " " + marker + " " + id + " " + cmd; + lines.push_back(nline); } if (!eCrontabWriteFile(lines, reason)) - return false; + return false; return true; } @@ -110,163 +106,45 @@ bool checkCrontabUnmanaged(const string& marker, const string& data) { vector lines; if (!eCrontabGetLines(lines)) { - // No crontab, answer is no - return false; + // No crontab, answer is no + return false; } // Scan crontab - for (vector::iterator it = lines.begin(); - it != lines.end(); it++) { - if (it->find(marker) == string::npos && - it->find(data) != string::npos) { - return true; - } + for (const auto& line : lines) { + if (line.find(marker) == string::npos && + line.find(data) != string::npos) { + return true; + } } return false; } /** Retrieve the scheduling for a crontab entry */ bool getCrontabSched(const string& marker, const string& id, - vector& sched) + vector& sched) { - LOGDEB0("getCrontabSched: marker[" << (marker) << "], id[" << (id) << "]\n" ); + LOGDEB0("getCrontabSched: marker[" << marker << "], id[" << id << "]\n"); vector lines; if (!eCrontabGetLines(lines)) { - // No crontab, answer is no - sched.clear(); - return false; + // No crontab, answer is no + sched.clear(); + return false; } - string line; + string theline; - for (vector::iterator it = lines.begin(); - it != lines.end(); it++) { - // Skip comment - if (it->find_first_of("#") == it->find_first_not_of(" \t")) - continue; + for (const auto& line : lines) { + // Skip comment + if (line.find_first_of("#") == line.find_first_not_of(" \t")) + continue; - if (it->find(marker) != string::npos && - it->find(id) != string::npos) { - line = *it; - break; - } + if (line.find(marker) != string::npos && + line.find(id) != string::npos) { + theline = line; + break; + } } - stringToTokens(line, sched); + stringToTokens(theline, sched); sched.resize(5); return true; } - -#else // TEST -> - -#include -#include -#include -#include -#include - -#include -#include - -using namespace std; - -#include "ecrontab.h" - - -static char *thisprog; - -static char usage [] = -" -a add or replace crontab line \n" -" -d delete crontab line \n" -" -s get scheduling \n" -" -c check for unmanaged lines for string\n" -; -static void -Usage(void) -{ - fprintf(stderr, "%s: usage:\n%s", thisprog, usage); - exit(1); -} - -static int op_flags; -#define OPT_MOINS 0x1 -#define OPT_a 0x2 -#define OPT_d 0x4 -#define OPT_w 0x8 -#define OPT_c 0x10 -#define OPT_s 0x20 - -const string& marker("RCLCRON_RCLINDEX="); -// Note of course the -w does not make sense for a cron entry -const string& cmd0("recollindex -w "); -const string& id("RECOLL_CONFDIR=\"/home/dockes/.recoll/\""); -const string& sched("30 8 * 1 *"); - -int main(int argc, char **argv) -{ - thisprog = argv[0]; - argc--; argv++; - - string wt = "10"; - string cmd; - - while (argc > 0 && **argv == '-') { - (*argv)++; - if (!(**argv)) - /* Cas du "adb - core" */ - Usage(); - while (**argv) - switch (*(*argv)++) { - case 'a': op_flags |= OPT_a; break; - case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); - cmd = *(++argv); argc--; - goto b1; - case 'd': op_flags |= OPT_d; break; - case 's': op_flags |= OPT_s; break; - case 'w': op_flags |= OPT_w; if (argc < 2) Usage(); - wt = *(++argv); argc--; - goto b1; - - default: Usage(); break; - } - b1: argc--; argv++; - } - - if (argc != 0) - Usage(); - - string reason; - bool status = false; - - if (op_flags & OPT_a) { - cmd = cmd0 + wt; - status = editCrontab(marker, id, sched, cmd, reason); - } else if (op_flags & OPT_d) { - status = editCrontab(marker, id, sched, "", reason); - } else if (op_flags & OPT_s) { - vector sched; - if (!(status = getCrontabSched(marker, id, sched))) { - cerr << "getCrontabSched failed: " << reason << endl; - exit(1); - } - cout << "sched vec size " << sched.size() << endl; - cout << "mins " << sched[0] << " hours " << sched[1] << - " days of month " << sched[2] << " months " << sched[3] << - " days of week " << sched[4] << endl; - exit(0); - - } else if (op_flags & OPT_c) { - if ((status = checkCrontabUnmanaged(marker, cmd))) { - cerr << "crontab has unmanaged lines for " << cmd << endl; - exit(1); - } - exit(0); - } else { - Usage(); - } - if (!status) { - cerr << "editCrontab failed: " << reason << endl; - exit(1); - } - exit(0); -} -#endif // TEST -