102
103
/* External Functions Called */
104
105
extern void net_close A_((int));
106
extern void svr_format_job A_((FILE *, job *, char *, int, char *));
106
108
/* Global Data */
108
110
extern struct server server;
109
extern char *msg_job_abort;
110
extern char *msg_job_start;
111
extern char *msg_job_end;
112
extern char *msg_job_del;
113
extern char *msg_job_stageinfail;
114
extern char *msg_job_otherfail;
116
112
extern int LOGLEVEL;
129
125
char mailto[1024];
126
char *bodyfmt, *subjectfmt;
127
char bodyfmtbuf[1024];
132
130
struct array_strings *pas;
133
char *stdmessage = NULL;
135
132
if ((server.sv_attr[(int)SRV_ATR_MailDomain].at_flags & ATR_VFLAG_SET) &&
136
133
(server.sv_attr[(int)SRV_ATR_MailDomain].at_val.at_str != NULL) &&
137
134
(!strcasecmp("never", server.sv_attr[(int)SRV_ATR_MailDomain].at_val.at_str)))
139
136
/* never send user mail under any conditions */
139
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
141
pjob->ji_qs.ji_jobid,
142
"Not sending email: Mail domain set to 'never'\n");
171
175
mailpoint) == NULL)
173
177
/* do not send mail */
178
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
180
pjob->ji_qs.ji_jobid,
181
"Not sending email: User does not want mail of this type.\n");
178
186
else if (mailpoint != MAIL_ABORT) /* not set, default to abort */
188
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
190
pjob->ji_qs.ji_jobid,
191
"Not sending email: Default mailpoint does not include this type.\n");
203
216
/* Who is mail from, if SRV_ATR_mailfrom not set use default */
205
218
if ((mailfrom = server.sv_attr[(int)SRV_ATR_mailfrom].at_val.at_str) == NULL)
222
char tmpBuf[LOG_BUF_SIZE];
224
snprintf(tmpBuf,sizeof(tmpBuf),
225
"Updated mailto from user list: '%s'\n",
227
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
229
pjob->ji_qs.ji_jobid,
206
232
mailfrom = PBS_DEFAULT_MAIL;
208
235
/* Who does the mail go to? If mail-list, them; else owner */
237
264
strcpy(mailto, pjob->ji_wattr[(int)JOB_ATR_euser].at_val.at_str);
238
265
strcat(mailto, "@");
239
266
strcat(mailto, server.sv_attr[(int)SRV_ATR_MailDomain].at_val.at_str);
270
char tmpBuf[LOG_BUF_SIZE];
272
snprintf(tmpBuf,sizeof(tmpBuf),
273
"Updated mailto from job owner and mail domain: '%s'\n",
275
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
277
pjob->ji_qs.ji_jobid,
247
287
#else /* TMAILDOMAIN */
248
288
strcpy(mailto, pjob->ji_wattr[(int)JOB_ATR_job_owner].at_val.at_str);
249
289
#endif /* TMAILDOMAIN */
293
char tmpBuf[LOG_BUF_SIZE];
295
snprintf(tmpBuf,sizeof(tmpBuf),
296
"Updated mailto from job owner: '%s'\n",
298
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
300
pjob->ji_qs.ji_jobid,
306
/* mail subject line formating statement */
308
if ((server.sv_attr[(int)SRV_ATR_MailSubjectFmt].at_flags & ATR_VFLAG_SET) &&
309
(server.sv_attr[(int)SRV_ATR_MailSubjectFmt].at_val.at_str != NULL))
311
subjectfmt = server.sv_attr[(int)SRV_ATR_MailSubjectFmt].at_val.at_str;
315
subjectfmt = "PBS JOB %i";
318
/* mail body formating statement */
320
if ((server.sv_attr[(int)SRV_ATR_MailBodyFmt].at_flags & ATR_VFLAG_SET) &&
321
(server.sv_attr[(int)SRV_ATR_MailBodyFmt].at_val.at_str != NULL))
323
bodyfmt = server.sv_attr[(int)SRV_ATR_MailBodyFmt].at_val.at_str;
327
bodyfmt = strcpy(bodyfmtbuf, "PBS Job Id: %i\n"
329
if (pjob->ji_wattr[(int)JOB_ATR_exec_host].at_flags & ATR_VFLAG_SET)
331
strcat(bodyfmt, "Exec host: %h\n");
334
strcat(bodyfmt, "%m\n");
338
strcat(bodyfmt, "%d\n");
253
341
/* setup sendmail command line with -f from_whom */
255
343
i = strlen(SENDMAIL_CMD) + strlen(mailfrom) + strlen(mailto) + 6;
270
358
if (outmail == NULL)
360
char tmpBuf[LOG_BUF_SIZE];
362
snprintf(tmpBuf,sizeof(tmpBuf),
363
"Unable to popen() command '%s' for writing: '%s' (error %d)\n",
367
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
369
pjob->ji_qs.ji_jobid,
277
377
fprintf(outmail, "To: %s\n",
280
fprintf(outmail, "Subject: PBS JOB %s\n",
281
pjob->ji_qs.ji_jobid);
380
fprintf(outmail, "Subject: ");
381
svr_format_job(outmail, pjob, subjectfmt, mailpoint, text);
382
fprintf(outmail, "\n");
283
384
/* Set "Precedence: bulk" to avoid vacation messages, etc */
285
386
fprintf(outmail, "Precedence: bulk\n\n");
287
/* Now pipe in "standard" message */
294
stdmessage = msg_job_abort;
300
stdmessage = msg_job_start;
306
stdmessage = msg_job_end;
312
stdmessage = msg_job_del;
318
stdmessage = msg_job_stageinfail;
326
stdmessage = msg_job_otherfail;
329
} /* END switch (mailpoint) */
331
fprintf(outmail, "PBS Job Id: %s\n",
332
pjob->ji_qs.ji_jobid);
334
fprintf(outmail, "Job Name: %s\n",
335
pjob->ji_wattr[(int)JOB_ATR_jobname].at_val.at_str);
337
if (pjob->ji_wattr[(int)JOB_ATR_exec_host].at_flags & ATR_VFLAG_SET)
339
fprintf(outmail, "Exec host: %s\n",
340
pjob->ji_wattr[(int)JOB_ATR_exec_host].at_val.at_str);
343
if (stdmessage != NULL)
345
fprintf(outmail, "%s\n",
351
fprintf(outmail, "%s\n",
388
/* Now pipe in the email body */
389
svr_format_job(outmail, pjob, bodyfmt, mailpoint, text);
392
if ((i = pclose(outmail)) != 0)
394
char tmpBuf[LOG_BUF_SIZE];
396
snprintf(tmpBuf,sizeof(tmpBuf),
397
"Email '%c' to %s failed: Child process '%s' %s %d (errno %d:%s)\n",
401
((WIFEXITED(i)) ? ("returned") : ((WIFSIGNALED(i)) ? ("killed by signal") : ("croaked"))),
402
((WIFEXITED(i)) ? (WEXITSTATUS(i)) : ((WIFSIGNALED(i)) ? (WTERMSIG(i)) : (i))),
405
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
407
pjob->ji_qs.ji_jobid,
410
else if (LOGLEVEL >= 4)
412
log_event(PBSEVENT_ERROR | PBSEVENT_ADMIN | PBSEVENT_JOB,
414
pjob->ji_qs.ji_jobid,
415
"Email sent successfully\n");