#include #include /* for exit(), atoi() */ #include "libltgrey.h" #include "utils.h" #include "qq_exit_codes.h" using namespace std; pid_t mypid; string progname; #define exeunt exit // forward reference: void scan(const string progid, const string p, const int copies=1); int main(int _argc, char** _argv){ std::string hostname; std::string ipname; mypid = getpid(); int argc(_argc); char** argv(_argv); const string parent_dir("/var/qmail/ltgrey"); whatsit foo(argv[0], parent_dir); argc--; argv++; int scanmode(0); int copies(1); int shift(0); int stain(0); int dns_mode(0); string get40_mid; string set40_mid; while (argc > 0) { string arg = argv[0]; argc--; argv++; if (prefix(arg, "-scan")) { scanmode++; } else if (prefix(arg, "-copy")) { copies++; } else if (prefix(arg, "-verbose")) { foo.verbosity++; } else if (prefix(arg, "-dns_mode")) { dns_mode++; } else if (prefix(arg, "-get40")) { if (!argc){ cerr << "Option '" << arg << "' requires an argument" << endl; exeunt(ex_syserr); } get40_mid = *argv++; argc--; } else if (prefix(arg, "-set40")) { if (!argc){ cerr << "Option '" << arg << "' requires an argument" << endl; exeunt(ex_syserr); } set40_mid = *argv++; argc--; } else if (prefix(arg, "-shift") || prefix(arg, "-shift")) { if (!argc){ cerr << "Option '" << arg << "' requires an argument" << endl; exeunt(ex_syserr); } shift = atoi(*argv++); argc--; } else if (prefix(arg, "-stain")) { if (!argc){ cerr << "Option '" << arg << "' requires an argument" << endl; exeunt(ex_syserr); } stain = atoi(*argv++); argc--; } else if (prefix(arg, "-suffix")) { if (!argc){ cerr << "Option '" << arg << "' requires an argument" << endl; exeunt(ex_syserr); } foo.suffix += *argv++; argc--; } else { cerr << "Unrecognized arg: " << arg << endl; exeunt(ex_syserr); } } if (foo.setup()) return ex_syserr; // dns_mode mode ... // Probably it would be better to make more thorough DNS checks. // if (dns_mode) { char* ipvar = getenv("TCPREMOTEIP"); char* namevar = getenv("TCPREMOTEHOST"); exeunt(foo.check_dns(ipvar, namevar)); } if (get40_mid.length()){ state_40 rslt = foo.get40(get40_mid); cerr << foo.decode_40[rslt] << endl; return 0; } if (set40_mid.length()){ return foo.set40(set40_mid, shift); } if (scanmode) { string dirname = parent_dir + "/quarante"; scan(foo.progid, dirname, copies); return 0; } int sts = foo.doit(shift, stain); return sts; } ////////////////////////////////////////////////////////////////////// // requires apt-get install libboost-filesystem-dev: #include #include #include /* for stat(), getaddrinfo() */ #include /* for stat() */ #include /* for stat() */ #include /* for perror */ #include const int minute(60); const int hour(60*minute); const int day(24*hour); const int minimum_age(15*minute); const int maximum_age(32*day); const int probation(4*hour); void scan(const string progid, const string p, const int copies){ 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(); for (int ii = 0; ii < copies; ii++) cout << setw(20) << left << 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 << progid << ": 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) << time_out(mod_age) << " " << setw(10) << time_out(ac_age); if (0) { } else if (mod_age < 0) { cout << " penalty"; } else if (mod_age < ac_age) { cout << " parole"; } else if (mod_age - ac_age < minimum_age // early bird, or completely unused && mod_age > probation) { // did not diligently resubmit cout << " disprobation"; if (mod_age != ac_age) cout << "!"; } else if (mod_age < minimum_age) { cout << " young"; if (mod_age != ac_age) cout << "!"; } else if (mod_age == ac_age) { cout << " unused"; } else if (mod_age > maximum_age) { cout << " expired"; } else { cout << " OK"; } } cout << '\n'; } } else { // starting point is not a directory: cout << (exists(p) ? "Found: " : "Not found: ") << p << '\n'; } }