From 6710e3d72bfa36de6ef0cfb0bdd9623c65ebc40f Mon Sep 17 00:00:00 2001
From: John Denker <jsd@av8n.com>
Date: Thu, 19 Jul 2012 14:10:35 -0700
Subject: teach hi-q to have a "mode" word at the front of each line

---
 tools/aufilters.conf |  2 +-
 tools/filters.conf   |  6 ++--
 tools/hi-q.c         | 82 ++++++++++++++++++++++++++++++++--------------------
 tools/hi-test.conf   |  9 ++++--
 tools/hi-test2.conf  |  6 ++--
 tools/makefile       |  2 --
 6 files changed, 63 insertions(+), 44 deletions(-)

(limited to 'tools')

diff --git a/tools/aufilters.conf b/tools/aufilters.conf
index 2eea3fd..e166133 100644
--- a/tools/aufilters.conf
+++ b/tools/aufilters.conf
@@ -1,2 +1,2 @@
 # configuration file for hi-q (authorized users)
-  /var/qmail/bin/qmail-queue
+qq      /var/qmail/bin/qmail-queue
diff --git a/tools/filters.conf b/tools/filters.conf
index 169f74d..8bc2efe 100644
--- a/tools/filters.conf
+++ b/tools/filters.conf
@@ -1,4 +1,4 @@
 # configuration file for hi-q
-  /var/qmail/bin/skrewt
-  /usr/local/bin/spamc -Y 0 -s 1000000
-  /var/qmail/bin/qmail-queue
+black   /var/qmail/bin/skrewt
+black   /usr/local/bin/spamc -Y 0 -s 1000000
+qq      /var/qmail/bin/qmail-queue
diff --git a/tools/hi-q.c b/tools/hi-q.c
index 81e717a..6140206 100644
--- a/tools/hi-q.c
+++ b/tools/hi-q.c
@@ -134,6 +134,39 @@ int xclose(int arg){
 
 extern char** environ;
 
+typedef enum {gray, black, qq, fail} moder;
+
+class jobber{
+public:
+  moder mode;
+  vector<string> cmd;
+
+  jobber(const moder _mode, const vector<string> _cmd)
+  : mode(_mode), cmd(_cmd)
+  {}
+
+  jobber(const string _mode, const vector<string> _cmd)
+  : mode(fail), cmd(_cmd){
+    setmode(_mode);
+  }
+  
+  jobber()
+  : mode(fail), cmd(0)
+  {}
+
+  void setmode(const string _mode) {
+    if (0) {}
+    else if (_mode == "gray")  mode = gray;
+    else if (_mode == "grey")  mode = gray;     // variant spelling
+    else if (_mode == "black") mode = black;
+    else if (_mode == "qq") mode = qq;
+    else {
+      cerr << "jobber: bad mode: " << _mode << endl;
+      mode = fail;
+    }
+  }
+};
+
 int main(int argc, char** argv) {
   int verbose(0);
   int kidstatus;
@@ -141,27 +174,8 @@ int main(int argc, char** argv) {
   int rslt;
   int loose_end = 0;
 
-#ifdef SpareStuff
-  char* slurp2_args[] = {"/home/jsd/hack/slurp2", 0};
-  char* echo_args[] = {"/bin/echo", "hi there", 0};
-  char* wc_args[] = {"/usr/bin/wc", 0};
-  char* cat_args[] = {"/bin/cat", 0};
-  char* spama_args[] = {"/usr/local/bin/spamassassin", "-e", 0};
-  char* spamc_args[] = {"/usr/local/bin/spamc", "-Z", "7", 0};
-  char* qq_args[] = {"/var/qmail/bin/qmail-queue", 0};
-
-
-
-  const char** joblist[] = {
-    cat_args,
-    slurp2_args,
-    0           // required: zero terminates the list
-  };
-
-#endif
-
   typedef vector<string> VS;
-  vector<VS> filter;
+  vector<jobber> filter;
   string conf_var = "HI_Q_CONF";
   char* auth = getenv("QMAIL_AUTHORIZED");
   if (auth && *auth) conf_var = "HI_Q_AUCONF";
@@ -199,15 +213,19 @@ int main(int argc, char** argv) {
     string line;
     if (!getline(conf, line).good()) break;
     istringstream parse(line);
-    vector<string> job;
+    jobber job;
     while (parse.good()){
       string token;
       parse >> token;
       if (parse.fail()) break;
       if (token[0] == '#') break;
-      job.push_back(token);
+      job.cmd.push_back(token);
+    }
+    if (job.cmd.size()) {
+      job.setmode(job.cmd.front());
+      job.cmd.erase(job.cmd.begin());
     }
-    if (job.size()) filter.push_back(job);
+    if (job.cmd.size()) filter.push_back(job);
   }
   unsigned int nkids = filter.size();
 
@@ -218,8 +236,8 @@ int main(int argc, char** argv) {
 
   if (0 && verbose) for (unsigned int ii = 0; ii < nkids; ii++) {
     cerr << "hi-q filter[" << ii << "] :; ";
-    for (VS::const_iterator token = filter[ii].begin();
-        token != filter[ii].end(); token++){
+    for (VS::const_iterator token = filter[ii].cmd.begin();
+        token != filter[ii].cmd.end(); token++){
       cerr << *token << " ";
     }
     cerr << endl;
@@ -351,10 +369,10 @@ int main(int argc, char** argv) {
       // (except last kid reads fd1 as well as fd0).
 ////  probe_fd();
 
-      int ntok = filter[ii].size();
+      int ntok = filter[ii].cmd.size();
       const char* prog[1+ntok];
       for (int jj = 0; jj < ntok; jj++){
-        prog[jj] = filter[ii][jj].c_str();
+        prog[jj] = filter[ii].cmd[jj].c_str();
       }
       prog[ntok] = 0;
       close(resync[rEnd]);
@@ -417,8 +435,8 @@ int main(int argc, char** argv) {
     cerr << "hi-q filter[" << ii << "] "
     << kidpid[ii]
     << " :; ";
-    for (VS::const_iterator token = filter[ii].begin();
-        token != filter[ii].end(); token++){
+    for (VS::const_iterator token = filter[ii].cmd.begin();
+        token != filter[ii].cmd.end(); token++){
       cerr << *token << " ";
     }
     cerr << endl;
@@ -477,7 +495,7 @@ int main(int argc, char** argv) {
       if (sts == 1) {
         cerr << "hi-q says: kid[" << kidno << "]"
            << " pid " << argbest_blame
-           << " i.e. '" << filter[kidno][0] << "'"
+           << " i.e. '" << filter[kidno].cmd[0] << "'"
            << " reports spam." << endl;
         panic(ex_spam);
       }
@@ -515,13 +533,13 @@ int main(int argc, char** argv) {
       if (WIFEXITED(kidstatus)) {
         int sts = WEXITSTATUS(kidstatus);
         cerr << "hi-q says: qq program " << kidpid[nkids-1]
-                << " i.e. '" << filter[nkids-1][0] << "'"
+                << " i.e. '" << filter[nkids-1].cmd[0] << "'"
                 << " returned status " << sts 
                 << endl;
         return sts;
       } else if (WIFSIGNALED(kidstatus)) {
         cerr << "hi-q says: qq program " << kidpid[nkids-1]
-                << " i.e. '" << filter[nkids-1][0] << "'"
+                << " i.e. '" << filter[nkids-1].cmd[0] << "'"
                 << " was killed by signal " << WTERMSIG(kidstatus)
                 << endl;
         return ex_syserr;
diff --git a/tools/hi-test.conf b/tools/hi-test.conf
index 630e2bb..d400373 100644
--- a/tools/hi-test.conf
+++ b/tools/hi-test.conf
@@ -1,3 +1,6 @@
-hi-test x0 -snooze 10
-hi-test x1 -snooze 1 -exit 1 -kill
-hi-test x2 -snooze 10
+# comment
+
+# another comment, with blank line between
+black   hi-test x0 -snooze 10
+black   hi-test x1 -snooze 1 -exit 1 -kill
+qq      hi-test x2 -snooze 10
diff --git a/tools/hi-test2.conf b/tools/hi-test2.conf
index 2dbad3b..df047ab 100644
--- a/tools/hi-test2.conf
+++ b/tools/hi-test2.conf
@@ -1,3 +1,3 @@
-hi-test x0 -snooze 10
-hi-test x2 -snooze 10
-hi-test x1 -snooze 1 -exit 3
+grey    hi-test x0 -snooze 10
+gray    hi-test x2 -snooze 10
+qq      hi-test x1 -snooze 1 -exit 3
diff --git a/tools/makefile b/tools/makefile
index e092702..bb91f37 100644
--- a/tools/makefile
+++ b/tools/makefile
@@ -28,8 +28,6 @@ install:
 	chmod u+s  /var/qmail/rbin/checkpassword
 	cp smtp.conf /etc/stunnel/
 	cp pop3.conf /etc/stunnel/
-	chmod 640    /var/qmail/control/*.crtkey
-	chown qmaild /var/qmail/control/*.crtkey
 	install qmail-tls-check_certs /var/qmail/bin/
 	install spamassassin /etc/init.d/
 	install qmail /etc/init.d/
-- 
cgit v1.2.3