acl/samples/master/master_notify/notify.c

149 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "lib_acl.h"
#include <string.h>
#include "lib_tpl.h"
#include "service_var.h"
#include "notify.h"
static int can_notify(ACL_CACHE *cache, const char *proc, const char *data)
{
const char *ptr;
if (cache == NULL)
return (1);
if (proc == NULL || *proc == 0) {
acl_msg_warn("%s(%d): proc null", __FUNCTION__, __LINE__);
return (0);
}
acl_cache_lock(cache);
acl_cache_timeout(cache);
ptr = acl_cache_find(cache, proc);
if (ptr) {
acl_cache_unlock(cache);
acl_msg_warn("%s(%d): data(%s) has just been notified before!",
__FUNCTION__, __LINE__, data);
return (0);
}
acl_cache_enter(cache, proc, acl_mystrdup(proc));
acl_cache_unlock(cache);
return (1);
}
static int can_notify_sms(ACL_CACHE *cache, const char *proc, const char *data)
{
time_t now;
struct tm local_time;
if (can_notify(cache, proc, data) == 0)
return (0);
(void) time(&now);
(void) localtime_r(&now, &local_time);
if (local_time.tm_wday >= var_cfg_work_week_min
&& local_time.tm_wday <= var_cfg_work_week_max
&& local_time.tm_hour >= var_cfg_work_hour_min
&& local_time.tm_hour <= var_cfg_work_hour_max)
{
acl_msg_info("%s(%d): data(%s) no notify! tm_wday: %d, tm_hour: %d",
__FUNCTION__, __LINE__, data,
local_time.tm_wday, local_time.tm_hour);
return (0);
}
return (1);
}
int notify(ACL_CACHE *smtp_notify_cache, ACL_CACHE *sms_notify_cache, const char *data)
{
ACL_ARGV *args = acl_argv_split(data, "|");
ACL_ITER iter;
char *proc = NULL, *info = NULL;
const char *ptr;
ACL_ARGV *rcpts = NULL, *to_mails, *to_phones;
int pid = -1;
#undef RETURN
#define RETURN(x) do { \
if (proc) \
acl_myfree(proc); \
if (info) \
acl_myfree(info); \
if (rcpts) \
acl_argv_free(rcpts); \
acl_argv_free(args); \
return (x); \
} while (0)
if (args->argc < 3) {
acl_msg_error("%s(%d): invalid data(%s)",
__FUNCTION__, __LINE__, data);
RETURN (-1);
}
acl_foreach(iter, args) {
ptr = (const char*) iter.data;
if (strncasecmp(ptr, "PROC=", 5) == 0) {
ptr += 5;
if (proc)
acl_myfree(proc);
proc = acl_mystrdup(ptr);
} else if (strncasecmp(ptr, "PID=", 4) == 0) {
ptr += 4;
pid = atoi(ptr);
} else if (strncasecmp(ptr, "RCPT=", 5) == 0) {
ptr += 5;
rcpts = acl_argv_split(ptr, ",;\t ");
} else if (strncasecmp(ptr, "info=", 5) == 0) {
if (info)
acl_myfree(info);
ptr += 5;
info = acl_mystrdup(ptr);
}
}
if (proc == NULL) {
acl_msg_error("%s(%d): invalid data(%s), no PROC",
__FUNCTION__, __LINE__, data);
RETURN (-1);
}
to_mails = acl_argv_alloc(1);
to_phones = acl_argv_alloc(1);
acl_foreach(iter, rcpts) {
char *to = (char*) iter.data;
char *p = strchr(to, ':');
if (p)
*p++ = 0;
to_mails->push_back(to_mails, to);
/* <20>򵥵<EFBFBD><F2B5A5B5>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD> */
if (p && strlen(p) == 11)
to_phones->push_back(to_phones, p);
}
/* <20>ʼ<EFBFBD>֪ͨ */
if (can_notify(smtp_notify_cache, proc, data))
(void) smtp_notify(proc, to_mails, pid,
info == NULL ? "program exception!" : info);
else
acl_msg_info("%s(%d): data(%s) not be send to smtp!",
__FUNCTION__, __LINE__, data);
/* <20>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>֪ͨ */
if (can_notify_sms(sms_notify_cache, proc, data))
(void) sms_notify(proc, to_phones, pid,
info == NULL ? "program exception!" : info);
else
acl_msg_info("%s(%d): data(%s) not be send to sms!",
__FUNCTION__, __LINE__, data);
acl_argv_free(to_phones);
acl_argv_free(to_mails);
RETURN (0);
}