acl/lib_acl/samples/master/master_notify/notify.c
zsxxsz cf2528eb7c 完善了非阻塞IO的SSL功能;将 samples 移到 lib_acl 目录下
完善了非阻塞IO的SSL功能;将 acl/samples/ 下的示例分别移到 lib_acl 及 lib_protocol 目录下
2014-11-30 21:15:35 +08:00

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);
}