30 #define CTRL_TO_NMAX 10 32 #define GREY_SRV_CLOSE 1 34 #define GREY_SRV_ERROR -1 35 #define GREY_IO_ERROR -2 37 #define MAX_GREY_ERRORS 4 39 static int handle_command(
int,
char *,
int,
char **);
41 static void *greyd_father(
void *);
45 static void usage(
char *);
47 static void remove_socket_file(
void);
49 #define USE_SIGACTION 1 51 static void greyd_signal_handler(
int);
53 static bool set_uid_gid(
char *,
char *);
55 static bool greyd_check_access(
char *addr,
char *name);
63 static int nthread = 0;
65 static pthread_mutex_t smutex = PTHREAD_MUTEX_INITIALIZER;
67 # define GREY_LOCK() \ 68 if (pthread_mutex_lock(&smutex) != 0) { \ 69 ZE_LogSysError("pthread_mutex_lock"); \ 72 # define GREY_UNLOCK() \ 73 if (pthread_mutex_unlock(&smutex) != 0) { \ 74 ZE_LogSysError("pthread_mutex_unlock"); \ 96 static char *
user =
"ze-filter";
97 static char *
group =
"ze-filter";
101 #define DEFTUPLE "NET,HOST,FULL" 102 static char *ntuple = NULL;
104 static char *tconst = NULL;
106 #define MAX_ACCESS 256 108 static char *access_str = NULL;
116 bool foreground =
FALSE;
118 memset(access_arr, 0,
sizeof (access_arr));
127 const char *args =
"ht:T:i:dvu:g:w:s:n:l:a:";
130 while ((c = getopt(argc, argv, args)) != -1)
186 if (
zeStrRegex(optarg,
"^inet:[0-9]+@[-a-z0-9.]+$", NULL, NULL,
TRUE) ||
187 zeStrRegex(optarg,
"^(local|unix):([-/a-z0-9.]+)+$", NULL, NULL,
190 cargs.
socket = strdup(optarg);
203 printf(
"Error ... \n");
219 printf(
" ze-greyd daemonized !\n");
222 perror(
" Error daemonizing ze-greyd ");
229 if (setpgid(0, 0) < 0)
231 signal(SIGHUP, SIG_IGN);
237 perror(
" Error daemonizing ze-greyd ");
247 if ((fd = open(
"/dev/null", O_RDONLY, 0)) < 0)
250 if (dup2(fd, STDIN_FILENO) < 0)
255 if ((fd = open(
"/dev/null", O_WRONLY, 0)) < 0)
258 if (dup2(fd, STDOUT_FILENO) < 0)
261 if (dup2(fd, STDERR_FILENO) < 0)
293 ntuple =
STRNULL(ntuple,
"NET,HOST,FULL");
301 if ((s = strdup(ntuple)) != NULL)
303 memset(argv, 0,
sizeof (argv));
305 for (i = 0; i <
NTP; i++)
306 argv[i] =
STRNULL(argv[i],
"");
311 tconst =
STRNULL(tconst,
"0,0,0,0");
320 if ((s = strdup(tconst)) != NULL)
322 memset(argv, 0,
sizeof (argv));
323 memset(tc, 0,
sizeof (tc));
325 for (i = 0; i <
NTC; i++)
327 argv[i] =
STRNULL(argv[i],
"0");
335 access_str =
STRNULL(access_str,
"127.0.0.1");
336 if (access_str != NULL)
341 if ((s = strdup(access_str)) != NULL)
343 memset(access_arr, 0,
sizeof (access_arr));
346 access_arr[i] =
STRNULL(access_arr[i],
"UNKNOWN");
366 #define SET_SIG_HANDLER(handler) \ 368 struct sigaction act; \ 370 memset(&act, 0, sizeof (act)); \ 371 act.sa_handler = SIG_IGN; \ 372 sigaction(SIGPIPE, &act, NULL); \ 374 act.sa_handler = handler; \ 375 sigaction(SIGINT, &act, NULL); \ 376 sigaction(SIGTERM, &act, NULL); \ 377 sigaction(SIGQUIT, &act, NULL); \ 378 sigaction(SIGALRM, &act, NULL); \ 379 sigaction(SIGHUP, &act, NULL); \ 380 sigaction(SIGCHLD, &act, NULL); \ 391 int listenfd, connfd;
392 struct sockaddr *cliaddr;
394 static time_t last_reload = 0;
399 last_reload = time(NULL);
403 atexit(remove_socket_file);
411 signal(SIGPIPE, SIG_IGN);
412 signal(SIGTERM, greyd_signal_handler);
413 signal(SIGQUIT, greyd_signal_handler);
414 signal(SIGHUP, greyd_signal_handler);
415 signal(SIGINT, greyd_signal_handler);
416 signal(SIGCHLD, greyd_signal_handler);
417 signal(SIGALRM, greyd_signal_handler);
432 memset(&server, 0,
sizeof (server));
437 sockdomain = server.
family;
441 if ((cliaddr = (
struct sockaddr *) malloc(addrlen)) == NULL)
450 char client_addr[64], client_name[256];
453 connfd = accept(listenfd, cliaddr, &len);
458 memset(client_addr, 0,
sizeof (client_addr));
459 memset(client_name, 0,
sizeof (client_name));
461 if (sockdomain == AF_INET || sockdomain == AF_INET6)
463 char *addr, *name, *
user;
467 addr = name = user = NULL;
469 if (
get_hostbysock(cliaddr, len, client_addr,
sizeof (client_addr),
470 client_name,
sizeof (client_name)))
479 ok = greyd_check_access(client_addr, client_name);
484 if (addr == NULL || access_arr[i] == NULL)
490 if (strncasecmp(addr, access_arr[i], strlen(access_arr[i])) == 0)
501 (void)
sd_printf(connfd,
"500 Access denied\n");
502 shutdown(connfd, SHUT_RDWR);
515 if ((arg = malloc(
sizeof (
gclient_T))) == NULL)
518 (void)
sd_printf(connfd,
"421 System Error - come back later\n");
519 shutdown(connfd, SHUT_RDWR);
529 if ((r = pthread_create(&tid, NULL,
greyd_server, arg)) != 0)
532 (void)
sd_printf(connfd,
"421 System Error - come back later\n");
533 shutdown(connfd, SHUT_RDWR);
579 tid = pthread_self();
585 (void)
sd_printf(fd,
"421 I'm too busy. Come back later\r\n");
589 if (!
sd_printf(fd,
"200 OK - Waiting for commands !\r\n"))
601 if (tiloop + 2 > now)
604 "PEER=(%s) Error : connection broken (looping) ! Closing connection !",
617 "PEER=(%s) Error : connection broken ! Closing connection !",
624 long dt_max = 0, dt = 0;
638 "PEER=(%s) Connection inactive for more than %ld secs. Closing !",
652 memset(buf, 0,
sizeof (buf));
653 if ((sz = recvfrom(fd, buf,
sizeof (buf) - 1, 0, NULL, NULL)) > 0)
687 if (strlen(buf) == 0) {
701 r = handle_command(fd, addr, argc, argv);
724 shutdown(fd, SHUT_RDWR);
743 handle_command(sd, addr, argc, argv)
751 if (argv == NULL || argc == 0)
770 bool can_validate =
TRUE;
772 char *ip =
"", *from =
"", *to =
"", *hostname =
775 ip =
STRBOOL(argc > 1, argv[1],
"-");
776 from =
STRBOOL(argc > 2, argv[2],
"-");
777 to =
STRBOOL(argc > 3, argv[3],
"-");
778 hostname =
STRBOOL(argc > 4, argv[4],
"-");
779 netclass =
STRBOOL(argc > 5, argv[5], NULL);
783 r =
grey_check(ip, from, to, hostname, &
new, can_validate);
800 "PEER=(%s) ANSWER=(%d GREYCHECK - Grey server says... %s)",
803 ZE_MessageInfo(9,
"PEER=(%s) ANSWER=(%d GREYCHECK - policy says : %s)",
807 (sd,
"%d GREYCHECK ANSWER Grey server said... %s \r\n", r, s))
813 if (!
sd_printf(sd,
"600 Not enough parameters !\r\n"))
824 char *ip =
"", *from =
"", *to =
"", *hostname =
"";
826 ip =
STRBOOL(argc > 1, argv[1],
"-");
827 from =
STRBOOL(argc > 2, argv[2],
"-");
828 to =
STRBOOL(argc > 3, argv[3],
"-");
829 hostname =
STRBOOL(argc > 4, argv[4],
"-");
846 ZE_MessageInfo(9,
"PEER=(%s) ANSWER=(%d GREYVALID Grey server said... %s)",
849 (sd,
"%d GREYVALID ANSWER Grey server said... %s \r\n", r, s))
854 if (!
sd_printf(sd,
"600 Not enough parameters !\r\n"))
868 if (!
sd_printf(sd,
"200-OK for %s %s!\r\n", argv[0], argv[1]))
871 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
879 if (!
sd_printf(sd,
"200-OK for %s %s!\r\n", argv[0], argv[1]))
882 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
901 if (!
sd_printf(sd,
"200-OK for %s %s!\r\n", argv[0], argv[1]))
904 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
912 if (!
sd_printf(sd,
"200-OK for %s %s!\r\n", argv[0], argv[1]))
915 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
941 if (!
sd_printf(sd,
"200-OK for %s %s!\r\n", argv[0], argv[1]))
944 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
952 if (!
sd_printf(sd,
"200-OK for %s %s!\r\n", argv[0], argv[1]))
955 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
963 if (!
sd_printf(sd,
"200-OK for %s %s!\r\n", argv[0], argv[1]))
966 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
981 if (!
sd_printf(sd,
"200-OK for %s !\r\n", argv[0]))
984 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
998 if (!
sd_printf(sd,
"200-OK for %s !\r\n", argv[0]))
1001 if (!
sd_printf(sd,
"200 %s : %-10s %s !\r\n", argv[0],
"POLICY",
1014 if (!
sd_printf(sd,
"200-OK for %s !\r\n", argv[0]))
1017 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
1029 if (!
sd_printf(sd,
"200-OK for %s !\r\n", argv[0]))
1032 if (!
sd_printf(sd,
" GREYCHECK ip from to hostname\r\n"))
1034 if (!
sd_printf(sd,
" GREYVALID ip from to hostname\r\n"))
1037 if (!
sd_printf(sd,
" DOWNLOAD PENDING\r\n"))
1039 if (!
sd_printf(sd,
" DOWNLOAD VALID\r\n"))
1042 if (!
sd_printf(sd,
" UPDATE PENDING \r\n"))
1044 if (!
sd_printf(sd,
" UPDATE VALID \r\n"))
1047 if (!
sd_printf(sd,
" RECONFIGURE \r\n"))
1071 if (!
sd_printf(sd,
"200 %s done !\r\n", argv[0]))
1084 (void)
sd_printf(sd,
"200 OK for %s (EXIT)!\r\n", argv[0]);
1095 if (!
sd_printf(sd,
"200-OK for %s !\r\n", argv[0]))
1098 if (!
sd_printf(sd,
"200 %s done (EXIT)!\r\n", argv[0]))
1104 if (!
sd_printf(sd,
"600 %s : Unknown command !\r\n", argv[0]))
1121 (void)
sd_printf(sd,
"200 OK for %s (EXIT)!\r\n", argv[0]);
1132 greyd_check_access(addr, name)
1147 memset(buf, 0,
sizeof (buf));
1181 "Control access denied for %s (%s) by access rules",
1195 printf(
"Usage : %s options\n" 1198 " -h : this message\n" 1199 " -u : run ze-greyd as USER - default = ze-filter\n" 1200 " -g : run ze-greyd as GROUP - default = ze-filter\n" 1202 " inet:2012@localhost\n" 1203 " local:/var/sock\n" 1204 " -a client access control : \"1.2.3.4,4.3.2.,11.22.33.44\"\n" 1205 " -n : ntuple definition : IP,FROM,TO\n" 1206 " IP = NONE | FULL | NET\n" 1207 " USER = NONE | FULL | USER | HOST\n" 1208 " TO = NONE | FULL | USER | HOST\n" 1209 " DEFAULT = NET,HOST,FULL\n" 1210 " -t : pending entries time constants : ta,tb,tc,td\n" 1211 " ta = Min Pending delay - normal senders\n" 1212 " tb = Max Pending delay - normal senders\n" 1213 " tc = Min Pending delay - null senders\n" 1214 " td = Max Pending delay - null senders\n" 1215 " -T : valid entries time constants : tv,tw,tb\n" 1216 " tv = valid entries lifetime\n" 1217 " tw = whitelisted entries lifetime\n" 1218 " tb = blacklisted entries lifetime\n" 1219 " -w : working directory : default = %s\n" 1221 " -v : increase log level\n" 1222 " -d : debug mode - run in foreground\n" 1225 " Written by Jose Marcio Martins da Cruz\n" 1226 " Send bugs and gifts to jose.marcio.mc@gmail.org\n\n",
1235 remove_socket_file(
void)
1242 if (p == NULL || *p ==
'\0')
1248 if (lstat(p, &buf) == 0)
1263 greyd_signal_handler(sig)
1267 signal(sig, greyd_signal_handler);
1314 uid_t uid = getuid();
1315 gid_t gid = getgid();
1317 if ((gr = getgrnam(
group)) != NULL)
1320 if (gid != gr->gr_gid)
1322 if ((uid != 0) || (setregid(gr->gr_gid, gr->gr_gid) < 0))
1324 ZE_LogSysError(
"Can't set process gid = %ld", (
long) gr->gr_gid);
1330 if ((pw = getpwnam(
user)) != NULL)
1333 if (uid != pw->pw_uid)
1335 if ((uid != 0) || (setreuid(pw->pw_uid, pw->pw_uid) < 0))
1337 ZE_LogSysError(
"Can't set process uid = %ld", (
long) pw->pw_uid);
bool sd_printf(int sd, char *format,...)
#define CF_GREYD_CLIENT_IDLE_MAX
bool check_policy(char *prefix, char *key, char *buf, size_t size, bool cdef)
bool grey_set_tuples(char *ip, char *from, char *to)
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 jfd_ready(int, bool, long)
void zeLog_SetOutput(bool, bool)
bool zeStrRegex(char *, char *, long *, long *, bool)
bool open_work_db_env(char *defdir, char *cfdir, bool rdonly)
#define CF_GREYD_SOCKET_LISTEN
int grey_check(char *, char *, char *, char *, bool *, bool)
char * zeStrChomp(char *)
#define WAIT_NOHANG(pid, stat)
int zeStr2Tokens(char *, int, char **, char *)
int policy_decode(char *)
int grey_validate(char *, char *, char *, char *)
#define ZE_LogMsgDebug(level,...)
bool get_hostbysock(struct sockaddr *sock, socklen_t slen, char *addr, size_t alen, char *name, size_t nlen)
int main(int argc, char **argv)
#define ZE_MessageInfo(level,...)
bool grey_init(char *, bool, int)
#define ZE_MessageWarning(level,...)
bool create_pid_file(char *fname)
#define ZE_LogSysError(...)
char * cf_get_str(int id)
void * greyd_server(void *)
int configure(char *, char *, bool)
char * zeStr2Lower(char *)
#define STRCASEEQUAL(a, b)
unsigned long zeStr2ulong(char *s, int *error, unsigned long dval)
int server_listen(char *spec, server_T *server)
void remove_pid_file(void)
bool check_policy_tuple(char *prefix, char *ip, char *name, char *netclass, char *from, char *to, bool result)
int grey_dump(int fd, char *which, time_t dt)
#define SET_SIG_HANDLER(handler)
#define CF_GREYD_PID_FILE
time_t zeStr2time(char *s, int *error, time_t dval)