15#define WHO "qmail-mrtg"
80static void outs(
char *s)
82 if (buffer_puts(&
bo,s) == -1)
_exit(1);
83 if (buffer_puts(&
bo,
"\n") == -1)
_exit(1);
84 if (buffer_flush(&
bo) == -1)
_exit(1);
91 if (buffer_put(&
bo,
num,fmt_ulong(
num,(
unsigned long) i)) == -1)
_exit(1);
92 if (buffer_puts(&
bo,
"\n") == -1)
_exit(1);
93 if (buffer_flush(&
bo) == -1)
_exit(1);
134 case '1':
if (case_starts(
in,
"delivery")) {
135 i = str_chr(
in,
':') + 2;
136 if (case_starts(
in + i,
"success:"))
success++;
140 case '2':
if (case_starts(
in,
"info msg")) {
141 i = str_chr(
in,
':') + 8;
142 if ((
j = str_chr(
in + i,
' ')))
in[i +
j] =
'\0';
145 case '3':
if (case_starts(
in,
"status:")) {
146 i = str_rchr(
in,
'c') + 4;
147 k = str_rchr(
in,
'r') + 7;
148 if ((
j = str_chr(
in + i,
'/')))
in[i +
j] =
'\0';
150 if ((
j = str_chr(
in +
k,
'/')))
in[
k +
j] =
'\0';
153 case '4':
if (case_starts(
in,
"delivery")) {
154 i = str_chr(
in,
':') + 2;
155 if (case_starts(
in + i,
"failure:"))
failure++;
156 if (case_starts(
in + i,
"deferral:"))
deferral++;
158 case '5':
if (case_starts(
in,
"bounce msg"))
bounces++;
159 if (case_starts(
in,
"triple bounce:"))
triples++;
161 case '6':
if (case_starts(
in,
"delivery")) {
163 if (case_starts(
in + i,
"qmtp:_ok"))
qmtp++;
164 if (case_starts(
in + i,
"qmtps:_ok"))
qmtps++;
179 case 'a':
if (case_starts(
in + i,
"Accept"))
asessions++;
182 case 'b':
if (case_starts(
in + i,
"Accept::ORIG:"))
aorig++;
183 if (case_starts(
in + i,
"Accept::RCPT:"))
arcpt++;
185 case 'c':
if (case_starts(
in +
j,
"Reject::SNDR::Invalid_Relay"))
rsend++;
186 if (case_starts(
in +
j,
"Reject::SNDR::Bad_Helo"))
rhelo++;
187 if (case_starts(
in +
j,
"Reject::SNDR::DNS_Helo"))
rhelo++;
189 case 'd':
if (case_starts(
in +
j,
"Reject::ORIG::Bad_Mailfrom"))
rorigbad++;
190 if (case_starts(
in +
j,
"Reject::ORIG::DNS_MF"))
rorigdns++;
192 case 'e':
if (case_starts(
in +
j,
"Reject::RCPT::Bad_Rcptto"))
rrcptbad++;
193 if (case_starts(
in +
j,
"Reject::RCPT::Failed_Rcptto"))
rrcptfail++;
195 case 'f':
if (case_starts(
in +
j,
"Reject::DATA::Invalid_Size"))
rsize++;
196 if (case_starts(
in +
j,
"Reject::DATA::Bad_MIME"))
rmime++;
197 if (case_starts(
in +
j,
"Reject::DATA::MIME_Attach"))
rmime++;
198 if (case_starts(
in +
j,
"Reject::DATA::Bad_Loader"))
rloader++;
200 case 'g':
if (case_starts(
in +
j,
"Reject::DATA::Spam_Message"))
rspam++;
201 if (case_starts(
in +
j,
"Reject::DATA::Virus_Infected"))
rvirus++;
203 case 'h':
if (case_starts(
in + i,
"Accept::AUTH:"))
aauth++;
204 if (case_starts(
in +
j,
"Reject::AUTH:"))
rauth++;
206 case 'i':
if (case_starts(
in +
k,
"P:ESMTPS"))
atls++;
207 if (case_starts(
in +
j,
"Reject::TLS:"))
rtls++;
209 case 'j':
if (case_starts(
in + i,
"Accept::SPF:"))
spfpass++;
210 if (case_starts(
in +
j,
"Reject::SPF:"))
spfail++;
212 case 'k':
if (case_starts(
in + i,
"Deferred::SNDR::Grey_Listed"))
grey++;
214 case 'z':
if (case_starts(
in,
"tcpserver") || case_starts(
in,
"sslserver") || case_starts(
in,
"rblsmtpd")) {
215 i = str_chr(
in,
':') + 2;
216 if (case_starts(
in + i,
"ok"))
sok++;
217 if (case_starts(
in + i,
"deny"))
sdeny++;
218 j = str_chr(
in+i,
':') + 2;
219 if (case_starts(
in + i +
j,
"451"))
rbl++;
220 if (case_starts(
in + i +
j,
"553"))
rbl++;
221 if (case_starts(
in + i +
j,
"greetdelay:"))
greet++;
232 case 'A': i = str_chr(
in,
'A');
j = str_chr(
in,
'R');
233 if (case_starts(
in + i,
"Accept::AUTH:"))
apop++;
234 if (case_starts(
in +
j,
"Reject::AUTH:"))
rpop++;
236 case 'B':
if (case_starts(
in,
"tcpserver:") || case_starts(
in,
"sslserver:")) {
237 i = str_chr(
in,
':') + 2;
238 if (case_starts(
in + i,
"ok"))
pok++;
239 if (case_starts(
in + i,
"deny"))
pdeny++;
252 unsigned long calltime;
253 unsigned long seconds;
254 unsigned long nanoseconds;
255 unsigned int history = 305;
262 logmsg(
WHO,100,USAGE,
"qmail-mrtg [ -1 | -2 | -3 | -4 | -5 | -6 |\
263 -a | -b | -c | -d | -e | -f | -g | -h | -i | -j | -k | -z | -A | -B ] [time] \n\
264 qmail-mrtg needs to be called every [time] minutes (i.e. by crontab) - default 305 secs");
266 flag = *(argv[1] + 1);
267 if (argc == 3) { scan_ulong(argv[2],&u); history = 60 * u; }
281 if (
line.s[0] ==
'@') {
291 seconds += nanoseconds >> 28;
292 nanoseconds &= 0xfffffff;
296 seconds -= 4611686018427387914ULL;
297 seconds = seconds > 0 ? seconds : 0;
299 outs(
"Error: No TAI64N timestamp available.");
304 if (seconds <= calltime && seconds >= (calltime - history)) {
313 outs(
"Warning: Not enough time left between calls");
void c(char *, char *, char *, int, int, int)
void mrtg_smtplog(char *in, char flag)
void mrtg_sendlog(char *in, char flag)
void mrtg_pop3log(char *in, char flag)
void mrtg_results(char flag)