mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-15 09:20:52 +08:00
149 lines
3.5 KiB
C
149 lines
3.5 KiB
C
#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);
|
||
}
|