#include #include #include #include "trlitool.h" #include #include #include using namespace std; #define trli_stop_control_quit_NOTNEED #define trli_stop_control_stop_NOTNEED #define trli_stop_control_nbalive_NOTNEED #define trli_stop_control_start_NOTNEED #define trli_stop_control_debug_NOTNEED #define trli_stop_control_debugfile_NOTNEED #include "proto/trli_stop_control.protoch" #define trli_syslog_control_status_NOTNEED #define trli_syslog_control_logs_NOTNEED #define trli_syslog_control_logerrs_NOTNEED #define trli_syslog_control_tail_NOTNEED #define trli_syslog_control_quit_NOTNEED #define trli_syslog_control_debug_NOTNEED #define trli_syslog_control_debugfile_NOTNEED #define trli_syslog_control_reseterrors_NOTNEED #define trli_syslog_control_clearlogs_NOTNEED #include "proto/trli_syslog_control.protoch" static const char *ok_marker = " "; static const char *err_marker = "-> "; /* Monitoring for services known to trli_tool exim trli_syslog trli_stop Return -1 if it does not handle this socket path. */ int trlitool_mon (const char *sockpath, vector &out, time_t &last_error) { glocal last_error; glocal int ret = 0; glocal const char *path = sockpath; glocal vector *out = &out; CONNECT_INFO con; con.port = sockpath; last_error = (time_t)0; if (strstr(sockpath,"-exim")!=NULL){ glocal bool line220seen = false; ("unix:",glocal.path,5); int error = 0; if (strncmp(line,"220 ",4)==0){ glocal.line220seen = true; }else{ error = 1; } glocal.out->push_back (string_f("%s%s: error=%d %s" ,error ? err_marker : ok_marker ,glocal.path,error,line)); send ("quit\r\n"); end = true; glocal.out->push_back (string_f("%s%s: can't connect",err_marker,glocal.path)); glocal.ret = -1; if (!glocal.line220seen){ glocal.out->push_back(string_f("%s%s: line 220 not seen",err_marker,glocal.path)); glocal.ret = -1; } if (glocal.ret == -1) last_error = time(nullptr); }else if (strstr(glocal.path,"-stop")!=NULL){ (con); if (internal_error){ glocal.out->push_back(string_f("%sCan't talk to trli-stop server: %s" ,err_marker,glocal.path)); glocal.ret = -1; }else{ for (auto l:lines){ if (strncmp(l,"run=",4)==0){ bool ok = true; if (l[4] != '1'){ glocal.ret = -1; ok = false; } glocal.out->push_back(string_f("%s%s: %s" ,ok ? ok_marker : err_marker ,glocal.path,l)); } } } if (glocal.ret == -1) last_error = time(nullptr); }else if (strstr(glocal.path,"-syslog")!=NULL){ (con); if (internal_error){ glocal.out->push_back(string_f("%sCan't talk to trli-syslog server: %s" ,err_marker,glocal.path)); glocal.ret = -1; }else{ bool ok = true; string line; if (nberrors > 0){ glocal.ret = -1; ok = false; DATEASC date; fdpass_asctime (lasterror,date); line = string_f("errors=%u last=%s",nberrors,date.buf); glocal.last_error = lasterror; } glocal.out->push_back(string_f("%s%s: %s" ,ok ? ok_marker : err_marker ,glocal.path,line.c_str())); } } return glocal.ret; }