summaryrefslogtreecommitdiff
path: root/tools/greylist.c
diff options
context:
space:
mode:
authorJohn Denker <jsd@av8n.com>2012-07-20 03:58:24 (GMT)
committerJohn Denker <jsd@av8n.com>2012-07-20 03:58:24 (GMT)
commit0931dac68f4c04c58e1f5300b2bb11fc4f3a4504 (patch)
tree546cdd94f530d7e5a751570684f3fc2347e4fded /tools/greylist.c
parentd0b00466addec0d6f96d2dedd6b09d462b2fd565 (diff)
add "Scan" function to greylist
Diffstat (limited to 'tools/greylist.c')
-rw-r--r--tools/greylist.c89
1 files changed, 74 insertions, 15 deletions
diff --git a/tools/greylist.c b/tools/greylist.c
index d769ff4..3ba502d 100644
--- a/tools/greylist.c
+++ b/tools/greylist.c
@@ -1,5 +1,6 @@
#include <stdlib.h> /* for exit(), getenv() */
#include <iostream>
+#include <iomanip>
#include <string>
#include <sys/types.h> /* for stat() */
@@ -11,8 +12,16 @@
#include <fcntl.h> /* for creat() */
#include <sys/time.h> /* for gettimeofday() */
+// requires apt-get install libboost-filesystem-dev:
+#include <boost/filesystem.hpp>
+
using namespace std;
+const int minute(60);
+const int hour(60*minute);
+const int day(24*hour);
+
+const int minimum_age(5*minute);
const int sa_good = 0;
const int bug_bait_grey = 1;
// qmail_queue and spamc have similar interpretations here:
@@ -30,27 +39,26 @@ void dump(const string var){
else cerr << " is not set." << endl;
}
-const string dirname("/var/qmail/greylist");
// int stat(const char *path, struct stat *buf);
// int fstat(int fd, struct stat *buf);
// int lstat(const char *path, struct stat *buf);
-const int minute(60);
-const int hour(60*minute);
-const int day(24*hour);
class whatsit{
public:
+ string dirname;
string progname;
pid_t mypid;
timeval now;
+ string ipbase;
string ipname;
+ string hostname;
int mod_age;
int ac_age;
- whatsit(const string name)
- : progname(name), mypid(getpid())
+ whatsit(const string name, const string _dirname)
+ : dirname(_dirname), progname(name), mypid(getpid()), mod_age(0), ac_age(0)
{
gettimeofday(&now, NULL);
}
@@ -59,10 +67,49 @@ public:
void update(const string msg, const timeval new_mod, const timeval new_ac);
};
+void scan(const string p){
+ timeval now;
+ gettimeofday(&now, NULL);
+ using namespace boost::filesystem;
+
+ if (is_directory(p)) {
+ for (directory_iterator itr(p); itr!=directory_iterator(); ++itr) {
+ string basename = itr->path().filename();
+ cout << setw(20) << basename << ' '; // display filename only
+ if (is_regular_file(itr->status())) {
+// cout << " [" << file_size(itr->path()) << ']';
+ struct stat mystat;
+ string fn = p + "/" + basename;
+ int rslt = stat(fn.c_str(), &mystat);
+ if (rslt != 0){
+ cerr << progname << ": stat failed for '"
+ << fn << "' : ";
+ perror(0);
+ }
+ int mod_age = now.tv_sec - mystat.st_mtime;
+ int ac_age = now.tv_sec - mystat.st_atime;
+ cout << setw(10) << mod_age
+ << " " << setw(10) << ac_age;
+ if (mod_age < minimum_age) {
+ cout << " young";
+ } else if (mod_age == ac_age) {
+ cout << " never used";
+ }
+ }
+ cout << '\n';
+ }
+ }
+ else {
+ // starting point is not a directory:
+ cout << (exists(p) ? "Found: " : "Not found: ") << p << '\n';
+ }
+}
+
void whatsit::update(const string msg, const timeval new_mod, const timeval new_ac){
cerr << progname << ": "
- << msg << ": " << ipname
- << " mod_age: " << mod_age
+ << msg << ": " << ipbase;
+ if (hostname.length()) cerr << " " << hostname;
+ cerr << " mod_age: " << mod_age
<< " ac_age: " << ac_age
<< endl;
timeval upd[2] = {
@@ -73,12 +120,22 @@ void whatsit::update(const string msg, const timeval new_mod, const timeval new_
utimes(ipname.c_str(), upd);
}
-int main(int argc, char** argv){
-
-// dump("TCPREMOTEIP");
-// dump("TCPREMOTEHOST");
+int main(int _argc, char** _argv){
+ int argc(_argc);
+ char** argv(_argv);
+ const string dirname("/var/qmail/greylist");
+ whatsit foo(argv[0], dirname); argc--; argv++;
+ while (argc > 0) {
+ string arg = argv[0]; argc--; argv++;
+ if (arg == "-scan") {
+ scan(dirname);
+ return 0;
+ }
+ else {
+ cerr << "Unrecognized arg, ignored: " << arg << endl;
+ }
+ }
- whatsit foo(argv[0]);
return foo.doit();
}
@@ -88,7 +145,9 @@ int whatsit::doit(){
cerr << progname << ": TCPREMOTEIP not set???" << endl;
exit(sa_syserr);
}
- string ipbase = ipvar;
+ ipbase = ipvar;
+ char* hostvar = getenv("TCPREMOTEHOST");
+ if (hostvar) hostname = hostvar;
// see if our directory exists:
struct stat dirstat;
@@ -134,7 +193,7 @@ int whatsit::doit(){
mod_age = now.tv_sec - ipstat.st_mtime;
ac_age = now.tv_sec - ipstat.st_atime;
timeval mod_orig = {ipstat.st_mtime, 0};
- if (mod_age < 5*minute) {
+ if (mod_age < minimum_age) {
update("early bird", mod_orig, now);
return(bug_bait_grey);
}