From 7390ef55417aaacc7c22c0c69066dc6be4a83107 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Kou=C5=99il?= Date: Tue, 15 Mar 2005 08:17:29 +0000 Subject: [PATCH] - the master process allowed to restart the slave process when it disappears - the slave process commits suicide after 1000 renewal attempts (this should prevent from problems with memory leaks in myproxy/globus libraries). - signals handled properly --- .../project/version.properties | 2 +- org.glite.security.proxyrenewal/src/renew.c | 43 +++++++++-- org.glite.security.proxyrenewal/src/renewal_locl.h | 1 + org.glite.security.proxyrenewal/src/renewd.c | 87 ++++++++++++---------- 4 files changed, 85 insertions(+), 48 deletions(-) diff --git a/org.glite.security.proxyrenewal/project/version.properties b/org.glite.security.proxyrenewal/project/version.properties index f3a53b1..7c91709 100644 --- a/org.glite.security.proxyrenewal/project/version.properties +++ b/org.glite.security.proxyrenewal/project/version.properties @@ -1,4 +1,4 @@ #Wed Jan 12 04:00:08 CET 2005 -module.version=1.1.1 +module.version=1.1.2 module.build=137 module.age=1 diff --git a/org.glite.security.proxyrenewal/src/renew.c b/org.glite.security.proxyrenewal/src/renew.c index ac7ec96..d576969 100644 --- a/org.glite.security.proxyrenewal/src/renew.c +++ b/org.glite.security.proxyrenewal/src/renew.c @@ -5,16 +5,18 @@ #ident "$Header$" +#define RENEWAL_COUNTS_MAX 1000 /* the slave daemon exits after that many attemtps */ + extern char *repository; extern char *cadir; extern char *vomsdir; extern int voms_enabled; extern char *vomsconf; -static int received_signal = -1; +static int received_signal = -1, die = 0; static void -check_renewal(char *datafile, int force_renew); +check_renewal(char *datafile, int force_renew, int *num_renewed); static int renew_proxy(proxy_record *record, char *basename, char **new_proxy); @@ -82,6 +84,15 @@ static void register_signal(int signal) { received_signal = signal; + switch ((received_signal = signal)) { + case SIGINT: + case SIGTERM: + case SIGQUIT: + die = signal; + break; + default: + break; + } } static int @@ -197,7 +208,7 @@ end: } static void -check_renewal(char *datafile, int force_renew) +check_renewal(char *datafile, int force_renew, int *num_renewed) { char line[1024]; proxy_record record; @@ -215,6 +226,8 @@ check_renewal(char *datafile, int force_renew) assert(datafile != NULL); + *num_renewed = 0; + memset(&record, 0, sizeof(record)); memset(basename, 0, sizeof(basename)); memset(&request, 0, sizeof(request)); @@ -301,17 +314,22 @@ check_renewal(char *datafile, int force_renew) edg_wlpr_CleanResponse(&response); edg_wlpr_CleanRequest(&request); + *num_renewed = num; + return; } -int renewal(int force_renew) +int renewal(int force_renew, int *num_renewed) { DIR *dir = NULL; struct dirent *file; FILE *fd; + int num = 0; edg_wlpr_Log(LOG_DEBUG, "Starting renewal process"); + *num_renewed = 0; + if (chdir(repository)) { edg_wlpr_Log(LOG_ERR, "Cannot access repository directory %s (%s)", repository, strerror(errno)); @@ -337,7 +355,8 @@ int renewal(int force_renew) file->d_name, strerror(errno)); continue; } - check_renewal(file->d_name, force_renew); + check_renewal(file->d_name, force_renew, &num); + *num_renewed += num; fclose(fd); } closedir(dir); @@ -350,16 +369,26 @@ watchdog_start(void) { struct sigaction sa; int force_renewal; + int count = 0, num; memset(&sa,0,sizeof(sa)); sa.sa_handler = register_signal; sigaction(SIGUSR1, &sa, NULL); + sigaction(SIGINT,&sa,NULL); + sigaction(SIGQUIT,&sa,NULL); + sigaction(SIGTERM,&sa,NULL); + sigaction(SIGPIPE,&sa,NULL); - while (1) { + while (count < RENEWAL_COUNTS_MAX && !die) { received_signal = -1; sleep(60 * 5); force_renewal = (received_signal == SIGUSR1) ? 1 : 0; + if (die) + break; /* XXX uninstall signal handler ? */ - renewal(force_renewal); + renewal(force_renewal, &num); + count += num; } + edg_wlpr_Log(LOG_DEBUG, "Terminating after %d renewal attempts", count); + exit(0); } diff --git a/org.glite.security.proxyrenewal/src/renewal_locl.h b/org.glite.security.proxyrenewal/src/renewal_locl.h index 45317e3..6ebc8c4 100644 --- a/org.glite.security.proxyrenewal/src/renewal_locl.h +++ b/org.glite.security.proxyrenewal/src/renewal_locl.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include diff --git a/org.glite.security.proxyrenewal/src/renewd.c b/org.glite.security.proxyrenewal/src/renewd.c index 1b6e011..a25ff39 100644 --- a/org.glite.security.proxyrenewal/src/renewd.c +++ b/org.glite.security.proxyrenewal/src/renewd.c @@ -16,6 +16,8 @@ int voms_enabled = 0; char *vomsconf = "/opt/edg/etc/vomses"; +static volatile int die = 0, child_died = 0; + static struct option opts[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, @@ -68,6 +70,26 @@ doit(int sock); static int decode_request(const char *msg, const size_t msg_len, edg_wlpr_Request *request); +int +start_watchdog(pid_t *pid); + +static void +catchsig(int sig) +{ + switch (sig) { + case SIGINT: + case SIGTERM: + case SIGQUIT: + die = sig; + break; + case SIGCHLD: + child_died = 1; + break; + default: + break; + } +} + static command_table * find_command(edg_wlpr_Command code) { @@ -155,44 +177,36 @@ doit(int sock) proxies[0] = NULL; #endif -#if 0 - sigemptyset(&sset); - sigaddset(&sset,SIGTERM); - sigaddset(&sset,SIGINT); - sigaddset(&sset, SIGKILL); - sigaddset(&sset, SIGUSR1); - sigaddset(&sset, SIGALRM); - sigprocmask(SIG_BLOCK,&sset,NULL); -#endif + while (!die) { - while (1) { -#if 0 - sigprocmask(SIG_UNBLOCK,&sset,NULL); - newsock = accept(sock, (struct sockaddr *) &client_addr, &client_addr_len); - sigprocmask(SIG_BLOCK,&sset,NULL); + if (child_died) { + int pid, newpid, ret; - if (newsock == -1) { - if (errno == EINTR) /* ERESTARTSYS */ - proxy_renewal(received_signal); - else - log(); - continue; + while ((pid=waitpid(-1,NULL,WNOHANG))>0) + ; + ret = start_watchdog(&newpid); + if (ret) + return ret; + edg_wlpr_Log(LOG_DEBUG, "Renewal slave process re-started"); + child_died = 0; + continue; } -#else + newsock = accept(sock, (struct sockaddr *) &client_addr, &client_addr_len); if (newsock == -1) { - edg_wlpr_Log(LOG_ERR, "accept() failed"); + if (errno != EINTR) + edg_wlpr_Log(LOG_ERR, "accept() failed"); continue; } edg_wlpr_Log(LOG_DEBUG, "Got connection"); -#endif - proto(newsock); edg_wlpr_Log(LOG_DEBUG, "Connection closed"); close(newsock); } + edg_wlpr_Log(LOG_DEBUG, "Terminating on signal %d\n",die); + return 0; } static int @@ -500,6 +514,7 @@ int main(int argc, char *argv[]) char sockname[PATH_MAX]; int ret; pid_t pid; + struct sigaction sa; progname = strrchr(argv[0],'/'); if (progname) progname++; @@ -548,6 +563,14 @@ int main(int argc, char *argv[]) openlog(progname, LOG_PID, LOG_DAEMON); } + memset(&sa,0,sizeof(sa)); + sa.sa_handler = catchsig; + sigaction(SIGINT,&sa,NULL); + sigaction(SIGQUIT,&sa,NULL); + sigaction(SIGTERM,&sa,NULL); + sigaction(SIGCHLD,&sa,NULL); + sigaction(SIGPIPE,&sa,NULL); + ret = start_watchdog(&pid); if (ret) return 1; @@ -561,22 +584,6 @@ int main(int argc, char *argv[]) return 1; edg_wlpr_Log(LOG_DEBUG, "Listening at %s", sockname); -#if 0 - /* XXX ??? */ - install_handlers(); -#endif - - -#if 0 - /* XXX this overrides setings done by install_handlers()? */ - signal(SIGTERM, cleanup); - signal(SIGINT, cleanup); - signal(SIGKILL, cleanup); - signal(SIGPIPE, SIG_IGN); - - atexit(cleanup); -#endif - ret = doit(sock); close(sock); -- 1.8.2.3