summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Denker <jsd@av8n.com>2012-07-19 14:10:35 -0700
committerJohn Denker <jsd@av8n.com>2012-07-29 15:32:33 -0700
commit8fe5ccdb4ee79b4d287b82e80004e1acc9ee4b94 (patch)
tree525e4cbba77ee6ba2e78f0c45e4fa97dafa37421
parent1a6f4a654368174dc717d00b9eaf06872915d51c (diff)
teach hi-q to have a "mode" word at the front of each line
-rw-r--r--tools/aufilters.conf2
-rw-r--r--tools/filters.conf6
-rw-r--r--tools/hi-q.c82
-rw-r--r--tools/hi-test.conf9
-rw-r--r--tools/hi-test2.conf6
-rw-r--r--tools/makefile2
6 files changed, 63 insertions, 44 deletions
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/