31 static bool do_control(
int,
int,
char **);
32 static bool check_control_access(
char *,
char *,
char *);
49 struct sockaddr *clisock;
56 (void) pthread_detach(tid);
62 memset(&server, 0,
sizeof (server));
69 sockdomain = server.
family;
73 ZE_MessageInfo(12,
"sd : %d len : %d domain %d", listenfd, addrlen,
76 if ((clisock = (
struct sockaddr *) malloc(addrlen)) == NULL) {
82 char client_addr[64], client_name[256];
88 connfd = accept(listenfd, clisock, &len);
100 if (sockdomain == AF_INET || sockdomain == AF_INET6) {
101 char *addr, *name, *user;
103 addr = name = user = NULL;
105 memset(client_addr, 0,
sizeof (client_addr));
106 memset(client_name, 0,
sizeof (client_name));
108 if (
get_hostbysock(clisock, len, client_addr,
sizeof (client_addr),
109 client_name,
sizeof (client_name))) {
114 if (
jsock_ntop(clisock, len, client_addr,
sizeof (client_addr)))
117 if (
get_hostbyaddr(client_addr, client_name,
sizeof (client_name)))
124 if (!check_control_access(addr, name, user)) {
127 FD_PRINTF(connfd,
"500 Access denied\n");
128 shutdown(connfd, SHUT_RDWR);
134 FD_PRINTF(connfd,
"200 OK - Waiting for commands !\n");
142 memset(buf, 0,
sizeof (buf));
143 if ((sz = read(connfd, buf,
sizeof (buf) - 1)) > 0) {
153 memset(argv, 0,
sizeof (argv));
154 for (s = strtok_r(buf,
" \t", &ptr);
155 argc <
MAX_ARGS && s != NULL; s = strtok_r(NULL,
" \t", &ptr)) {
159 if (do_control(connfd, argc, argv))
164 FD_PRINTF(connfd,
"500 Read timeout on control channel\r\n");
166 shutdown(connfd, SHUT_RDWR);
191 if ((r = pthread_create(&tid, NULL, control_handler, NULL)) != 0)
203 do_control(sd, argc, argv)
211 char *helpstr =
"500 Command not understood";
213 if (argv == NULL || argc == 0 || argv[0] == 0)
216 if (strcasecmp(argv[0],
"help") == 0) {
223 arg = argc > 0 ? argv[1] : NULL;
230 if (argc == 0 || help) {
231 ndc_help(sd, NULL, help, argc, argv);
240 if (strcasecmp(cmd,
"VERSION") == 0) {
241 helpstr =
" VERSION - writes ze-filter version and exit";
244 ndc_help(sd, helpstr, help, argc, argv);
254 ndc_help(sd,
" You've asked for help !", help, argc, argv);
263 if (strcasecmp(cmd,
"DUMPCF") == 0) {
269 helpstr =
" VERSION - writes ze-filter version and exit";
272 ndc_help(sd, helpstr, help, argc, argv);
276 FD_PRINTF(sd,
"200 OK for %s !\r\n", cmd);
278 prmt = argc > 2 ? argv[2] : NULL;
306 if (strcasecmp(cmd,
"SETCF") == 0) {
311 helpstr =
" ...\r\n";
316 prmt = argc > 2 ? argv[2] : NULL;
321 FD_PRINTF(sd,
"200 OK for %s %s %s !\r\n", cmd, arg, prmt);
340 FD_PRINTF(sd,
"200 %s %s %s done !\r\n", cmd, arg, prmt);
346 ndc_help(sd, helpstr, help, argc, argv);
350 if (strcasecmp(cmd,
"SETORACLE") == 0) {
353 helpstr =
"............\r\n";
358 prmt = argc > 2 ? argv[2] : NULL;
361 int type = -1, ind = 0;
365 FD_PRINTF(sd,
"200 OK for %s %s %s !\r\n", cmd, arg, prmt);
394 if (errno == ERANGE || errno == EINVAL)
399 FD_PRINTF(sd,
"200 %s %s %s done !\r\n", cmd, arg, prmt);
405 ndc_help(sd, helpstr, help, argc, argv);
413 if (strcasecmp(cmd,
"SET") == 0) {
426 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
429 FD_PRINTF(sd,
"200 OK for %s %s %ld s !\r\n", cmd, arg, pt);
431 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
436 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
439 FD_PRINTF(sd,
"200 OK for %s %s %ld s !\r\n", cmd, arg, pi);
444 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
448 scmd =
"LOG_SM_MACROS";
449 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
452 if (strcasecmp(prmt,
"YES") == 0)
453 log_sm_macros =
TRUE;
455 log_sm_macros =
FALSE;
457 FD_PRINTF(sd,
"200 OK for %s %s %s !\r\n", cmd, arg, prmt);
459 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
463 scmd =
"MXCHECKLEVEL";
464 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
469 FD_PRINTF(sd,
"200 OK for %s %s %ld !\r\n", cmd, arg, pi);
474 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
479 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
484 FD_PRINTF(sd,
"200 OK for %s %s %ld !\r\n", cmd, arg, pi);
489 FD_PRINTF(sd,
"500 %s %s not done : %s too short !\r\n", cmd, arg,
492 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
497 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
502 memset(delays, 0,
sizeof (delays));
504 for (i = 0; i < 4; i++) {
506 delays[i] =
zeStr2time(argv[i + 2], NULL, 3600);
509 FD_PRINTF(sd,
"200 OK for %s %s %ld !\r\n", cmd, arg, pi);
511 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
515 scmd =
"GREYLIFETIME";
516 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
521 memset(lifetime, 0,
sizeof (lifetime));
523 for (i = 0; i < 4; i++) {
525 lifetime[i] =
zeStr2time(argv[i + 2], NULL, 3600);
528 FD_PRINTF(sd,
"200 OK for %s %s %ld !\r\n", cmd, arg, pi);
530 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
534 scmd =
"GREYPENDING";
535 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
540 memset(nb, 0,
sizeof (nb));
542 for (i = 0; i < 2; i++) {
547 FD_PRINTF(sd,
"200 OK for %s %s %ld !\r\n", cmd, arg, pi);
549 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
554 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
559 memset(tuple, 0,
sizeof (tuple));
561 for (i = 0; i < 3; i++) {
562 tuple[i] = (argc > i + 2) ? argv[i + 2] : NULL;
565 FD_PRINTF(sd,
"200 OK for %s %s %ld !\r\n", cmd, arg, pi);
567 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
571 scmd =
"GREYCLEANUP";
572 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
579 FD_PRINTF(sd,
"200 OK for %s %s %ld !\r\n", cmd, arg, dt);
581 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
585 FD_PRINTF(sd,
"400 KO for %s %s %ld !\r\n", cmd, arg, pi);
590 scmd =
"GREY_DEWHITE_THRESHOLD";
591 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
595 if (errno != ERANGE && errno != EINVAL && t >= 0) {
596 FD_PRINTF(sd,
"200 OK for %s %s %5.2f !\r\n", cmd, arg, t);
600 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
610 if (strcasecmp(cmd,
"BAYES") == 0) {
613 helpstr =
"200 Not yet implemented !!!\r\n";
616 ndc_help(sd, helpstr, help, argc, argv);
624 if (strncasecmp(arg, scmd, strlen(scmd)) == 0) {
625 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
627 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
631 ndc_help(sd, helpstr, help, argc, argv);
639 if (strcasecmp(cmd,
"GREYDELETE") == 0) {
642 helpstr =
"200 Not yet implemented !!!\r\n";
645 ndc_help(sd, helpstr, help, argc, argv);
652 if (db == NULL || key == NULL)
655 FD_PRINTF(sd,
"200 OK for %s %s from %s !\r\n", cmd, key, db);
657 ndc_help(sd, helpstr, help, argc, argv);
665 if (strcasecmp(cmd,
"SHOW") == 0) {
670 ndc_help(sd, helpstr, help, argc, argv);
674 if (strcasecmp(arg,
"RUN") == 0) {
675 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
677 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
681 ndc_help(sd, helpstr, help, argc, argv);
689 if (strcasecmp(cmd,
"STATS") == 0) {
693 if (strcasecmp(arg,
"ORACLE") == 0) {
694 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
696 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
700 if (strcasecmp(arg,
"THROTTLE") == 0) {
701 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
703 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
707 if (strcasecmp(arg,
"SMTPRATE") == 0) {
709 char *prmt =
STRNULL(argv[2],
"");
717 FD_PRINTF(sd,
"200 FLAGS %08X for %s !\r\n", flags, prmt);
719 FD_PRINTF(sd,
"200 OK for %s %s %s!\r\n", cmd, arg, prmt);
721 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
725 if (strcasecmp(arg,
"CONNOPEN") == 0) {
726 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
728 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
732 if (strcasecmp(arg,
"HTIMES") == 0) {
733 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
735 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
739 if (strcasecmp(arg,
"RAWHTIMES") == 0) {
740 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
742 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
746 if (strcasecmp(arg,
"COUNTERS") == 0) {
747 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
749 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
753 if (strcasecmp(arg,
"RAWCOUNTERS") == 0) {
754 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
756 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
760 if (strcasecmp(arg,
"SCORES") == 0) {
761 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
763 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
767 if (strcasecmp(arg,
"ORASCORE") == 0) {
768 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
770 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
774 if (strcasecmp(arg,
"REGSCORE") == 0) {
775 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
777 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
781 if (strcasecmp(arg,
"LIVEHISTORY") == 0) {
782 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
784 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
788 if (strcasecmp(arg,
"LIVEHISTORY_R") == 0) {
789 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
791 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
795 ndc_help(sd, helpstr, help, argc, argv);
803 if (strcasecmp(cmd,
"RECONFIG") == 0) {
806 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
808 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
817 if (strcasecmp(cmd,
"RELOAD") == 0 || strcasecmp(cmd,
"REOPEN") == 0) {
821 if (strcasecmp(arg,
"TABLES") == 0) {
822 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
824 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
828 if (strcasecmp(arg,
"DATABASES") == 0) {
831 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
847 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
851 if (strcasecmp(arg,
"LRDATA") == 0) {
852 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
854 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
858 if (strcasecmp(arg,
"LOGFILES") == 0) {
861 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
864 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
868 ndc_help(sd, helpstr, help, argc, argv);
876 if (strcasecmp(cmd,
"RESET") == 0) {
880 if (strcasecmp(arg,
"STATS") == 0) {
881 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
884 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
888 if (strcasecmp(arg,
"GREYERRORS") == 0) {
889 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
891 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
895 ndc_help(sd, helpstr, help, argc, argv);
903 if (strcasecmp(cmd,
"RESTART") == 0) {
904 FD_PRINTF(sd,
"200 OK for %s %s !\r\n", cmd, arg);
908 FD_PRINTF(sd,
"200 %s %s done !\r\n", cmd, arg);
924 check_control_access(addr, name, user)
939 memset(buf, 0,
sizeof (buf));
953 "Control access denied for %s (%s) by access rules",
965 *********************************************************************
if 966 (strcasecmp(cmd,
"HELP") == 0) {
967 if (strcasecmp(arg,
"GET") == 0) {
968 char *hlpstr =
" Commands : HELP GET\r\n" " GET \r\n";
977 if (strcasecmp(arg,
"VERSION") == 0) {
979 " Commands : HELP VERSION\r\n" " VERSION \r\n";
988 if (strcasecmp(arg,
"SET") == 0) {
990 " Commands : HELP SET \r\n" 993 " RESOLVEWINDOW \r\n" 1000 " GREYTUPLE \r\n" " GREYCLEANUP \r\n" 1001 " GREY_DEWHITE_THRESHOLD \r\n";
1010 if (strcasecmp(arg,
"SETCF") == 0) {
1012 " Commands : HELP SETCF \r\n" " SETCF VAR VALUE\r\n";
1021 if (strcasecmp(arg,
"SETORACLE") == 0) {
1023 " Commands : HELP SETORACLE\r\n" " SETORACLE XNN VALUE \r\n";
1032 if (strcasecmp(arg,
"SHOW") == 0) {
1034 " Commands : HELP SHOW \r\n" " SHOW \r\n" " CONF \r\n";
1043 if (strcasecmp(arg,
"STATS") == 0) {
1045 " Commands : HELP STATS\r\n" 1054 " LIVEHISTORY \r\n" " COUNTERS \r\n" " RAWCOUNTERS \r\n";
1063 if (strcasecmp(arg,
"RECONFIG") == 0) {
1065 " Commands : HELP RECONFIG \r\n" " RECONFIG \r\n";
1074 if (strcasecmp(arg,
"RELOAD") == 0) {
1076 " Commands : HELP RELOAD | REOPAN\r\n" 1077 " RELOAD | REOPEN \r\n" 1078 " TABLES \r\n" " DATABASES \r\n" " LOGFILES \r\n";
1087 if (strcasecmp(arg,
"RESTART") == 0) {
1089 " Commands : HELP RESTART \r\n" " RESTART \r\n";
1098 if (strcasecmp(arg,
"RESET") == 0) {
1100 " Commands : HELP RESET \r\n" 1101 " RESET \r\n" " STATS\r\n" " GREYERRORS\r\n";
void grey_set_compat_domain_check(bool enable)
int cf_set_val(int id, char *val)
bool check_policy(char *prefix, char *key, char *buf, size_t size, bool cdef)
bool grey_set_cleanup_interval(time_t tclean)
uint32_t smtprate_str2flags(char *)
bool grey_set_tuples(char *ip, char *from, char *to)
bool setup_control_handler()
bool grey_set_delays(time_t tp_min_norm, time_t tp_max_norm, time_t tp_min_null, time_t tp_max_null)
int dump_state(int, int, int, int, int)
void livehistory_log_table(int, bool)
int jfd_ready(int, bool, long)
void mk_cf_file(int, bool, bool)
bool zeStrRegex(char *, char *, long *, long *, bool)
void log_counters(int, bool)
bool oracle_set_score(int, int, double)
#define FD_PRINTF(fdp,...)
char * zeStrChomp(char *)
bool jsock_ntop(struct sockaddr *, socklen_t, char *, size_t)
bool callback_stats_dump(int fd, bool line)
bool get_hostbyaddr(char *ip, char *name, int len)
int policy_decode(char *)
void set_grey_dewhitelist_threshold(double val)
bool ndc_help(int fd, char *helpstr, bool help, int argc, char **argv)
long zeStr2long(char *s, int *error, long dval)
void grey_channel_error_clear()
#define CF_GREY_DEWHITE_FLAGS
bool grey_set_lifetime(time_t tv, time_t tw, time_t tb)
bool get_hostbysock(struct sockaddr *sock, socklen_t slen, char *addr, size_t alen, char *name, size_t nlen)
double zeStr2double(char *s, int *error, double dval)
#define ZE_MessageInfo(level,...)
#define ZE_MessageWarning(level,...)
bool lr_data_load(bool background)
#define ZE_LogSysError(...)
#define ZE_MessageError(level,...)
char * cf_get_str(int id)
#define CF_CTRL_CHANNEL_ENABLE
#define CF_GREY_COMPAT_DOMAIN_CHECK
void grey_set_dewhite_flags(char *, bool)
int configure(char *, char *, bool)
#define ORACLE_TYPE_PLAIN
void connopen_print_table(int)
char * zeStr2Upper(char *)
bool reopen_all_log_files()
char * zeStr2Lower(char *)
bool grey_set_max_pending(int normal, int bounce)
#define STRCASEEQUAL(a, b)
bool oracle_dump_counters(int, bool)
int server_listen(char *spec, server_T *server)
bool db_reopen_rurlbl_database()
void msg_score_stats_print(int, int)
time_t zeStr2time(char *s, int *error, time_t dval)
void smtprate_print_table(int, int, int, int, time_t, uint32_t, int)