From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 22 Jan 2007 23:10:13 -0000 Subject: [Cluster-devel] cluster/rgmanager include/resgroup.h init.d/rg ... Message-ID: <20070122231013.26720.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: STABLE Changes by: lhh at sourceware.org 2007-01-22 23:10:02 Modified files: rgmanager/include: resgroup.h rgmanager/init.d: rgmanager rgmanager/src/clulib: clulog.c vft.c rgmanager/src/daemons: groups.c main.c nodeevent.c reslist.c resrules.c rg_forward.c rg_state.c rg_thread.c rgmanager/src/resources: Makefile clusterfs.sh fs.sh ip.sh ocf-shellfuncs rgmanager/src/utils: clustat.c clusvcadm.c Added files: rgmanager/src/resources: apache.metadata apache.sh mysql.metadata mysql.sh openldap.metadata openldap.sh postgres-8.metadata postgres-8.sh samba.metadata samba.sh tomcat-5.metadata tomcat-5.sh Log message: Merge fixes from RHEL4 branch since rhel4U4 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/resgroup.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.3.2.5.6.2&r2=1.3.2.5.6.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/init.d/rgmanager.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.3.2.1.6.2&r2=1.3.2.1.6.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/clulib/clulog.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.2.2.1.6.3&r2=1.2.2.1.6.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/clulib/vft.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.7.2.3.6.3&r2=1.7.2.3.6.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/groups.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.8.2.10.6.4&r2=1.8.2.10.6.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/main.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.9.2.8.6.8&r2=1.9.2.8.6.9 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/nodeevent.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.2.2.2&r2=1.2.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/reslist.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.6.2.4.6.2&r2=1.6.2.4.6.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/resrules.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.9.2.2.6.1&r2=1.9.2.2.6.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/rg_forward.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.2.8.1&r2=1.2.8.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/rg_state.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.4.2.8.6.5&r2=1.4.2.8.6.6 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/rg_thread.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.7.2.3.6.4&r2=1.7.2.3.6.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/apache.metadata.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.3.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/apache.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.9.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/mysql.metadata.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.3.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/mysql.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.8.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/openldap.metadata.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.2.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/openldap.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.7.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/postgres-8.metadata.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.2.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/postgres-8.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.5.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/samba.metadata.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.2.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/samba.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.5.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/tomcat-5.metadata.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.1.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/tomcat-5.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=NONE&r2=1.1.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/Makefile.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.4.2.3.6.3&r2=1.4.2.3.6.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/clusterfs.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.2.3.4.6&r2=1.1.2.3.4.7 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/fs.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.4.2.6.4.7&r2=1.4.2.6.4.8 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/ip.sh.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.5.2.4.4.10&r2=1.5.2.4.4.11 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/ocf-shellfuncs.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.2.2.3&r2=1.2.2.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clustat.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.5.2.3.6.9&r2=1.5.2.3.6.10 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clusvcadm.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.2.2.3.6.4&r2=1.2.2.3.6.5 --- cluster/rgmanager/include/resgroup.h 2006/06/16 20:07:46 1.3.2.5.6.2 +++ cluster/rgmanager/include/resgroup.h 2007/01/22 23:10:01 1.3.2.5.6.3 @@ -121,8 +121,8 @@ int rt_enqueue_request(const char *resgroupname, int request, int response_fd, int max, uint64_t target, int arg0, int arg1); -void send_response(int ret, request_t *req); -void send_ret(int fd, char *name, int ret, int req); +void send_response(int ret, uint64_t owner, request_t *req); +void send_ret(int fd, char *name, int ret, int req, uint64_t newowner); /* do this op on all resource groups. The handler for the request will sort out whether or not it's a valid request given the state */ @@ -156,12 +156,14 @@ cluster_member_list_t *member_list(void); uint64_t my_id(void); -#define RG_EAGAIN -6 -#define RG_EDEADLCK -5 -#define RG_ENOSERVICE -4 -#define RG_EFORWARD -3 -#define RG_EABORT -2 -#define RG_EFAIL -1 +#define RG_ENODEDEATH -8 /* Processing node died */ +#define RG_ERUN -7 /* Service is running already */ +#define RG_EAGAIN -6 /* Try again */ +#define RG_EDEADLCK -5 /* Operation would cause deadlock */ +#define RG_ENOSERVICE -4 /* Service does not exist */ +#define RG_EFORWARD -3 /* Ask current service owner to do this, please */ +#define RG_EABORT -2 /* Request cancelled */ +#define RG_EFAIL -1 /* Generic error */ #define RG_ESUCCESS 0 --- cluster/rgmanager/init.d/rgmanager 2006/11/03 16:29:58 1.3.2.1.6.2 +++ cluster/rgmanager/init.d/rgmanager 2007/01/22 23:10:01 1.3.2.1.6.3 @@ -96,10 +96,14 @@ [ -z "$RGMGR_OPTS" ] && RGMGR_OPTS="-t 30" echo -n $"Starting $ID: " daemon $RGMGRD $RGMGR_OPTS + rv=$? echo # To be consistent... - touch /var/lock/subsys/rgmanager + if [ $rv -eq 0 ]; then + touch /var/lock/subsys/rgmanager + fi + exit $rv ;; restart) --- cluster/rgmanager/src/clulib/clulog.c 2006/11/03 16:29:58 1.2.2.1.6.3 +++ cluster/rgmanager/src/clulib/clulog.c 2007/01/22 23:10:01 1.2.2.1.6.4 @@ -20,7 +20,7 @@ /** @file * Library routines for communicating with the logging daemon. * - * $Id: clulog.c,v 1.2.2.1.6.3 2006/11/03 16:29:58 lhh Exp $ + * $Id: clulog.c,v 1.2.2.1.6.4 2007/01/22 23:10:01 lhh Exp $ * * Author: Jeff Moyer */ @@ -50,7 +50,7 @@ #include -static const char *version __attribute__ ((unused)) = "$Revision: 1.2.2.1.6.3 $"; +static const char *version __attribute__ ((unused)) = "$Revision: 1.2.2.1.6.4 $"; #ifdef DEBUG #include --- cluster/rgmanager/src/clulib/vft.c 2006/06/16 20:07:46 1.7.2.3.6.3 +++ cluster/rgmanager/src/clulib/vft.c 2007/01/22 23:10:01 1.7.2.3.6.4 @@ -44,8 +44,6 @@ #include -int clu_lock_verbose(char *lockname, int flags, void **lockpp); - static int vf_lfds[2]; static int vf_lfd = 0; static key_node_t *key_list = NULL; /** List of key nodes. */ @@ -1187,7 +1185,7 @@ pthread_mutex_lock(&vf_mutex); /* Obtain cluster lock on it. */ snprintf(lock_name, sizeof(lock_name), "usrm::vf"); - l = clu_lock_verbose(lock_name, CLK_EX, &lockp); + l = clu_lock(lock_name, CLK_EX, &lockp); if (l < 0) { clu_unlock(lock_name, lockp); pthread_mutex_unlock(&vf_mutex); @@ -1524,7 +1522,7 @@ /* Obtain cluster lock on it. */ pthread_mutex_lock(&vf_mutex); snprintf(lock_name, sizeof(lock_name), "usrm::vf"); - l = clu_lock_verbose(lock_name, CLK_EX, &lockp); + l = clu_lock(lock_name, CLK_EX, &lockp); if (l < 0) { clu_unlock(lock_name, lockp); pthread_mutex_unlock(&vf_mutex); --- cluster/rgmanager/src/daemons/groups.c 2006/06/16 20:07:46 1.8.2.10.6.4 +++ cluster/rgmanager/src/daemons/groups.c 2007/01/22 23:10:01 1.8.2.10.6.5 @@ -879,8 +879,19 @@ if (curr->rn_resource->r_flags & RF_NEEDSTART) need_init = 1; - if (get_rg_state_local(name, &svcblk) < 0) { - continue; + if (!need_init) { + if (get_rg_state_local(name, &svcblk) < 0) + continue; + } else { + if (rg_lock(name, &lockp) != 0) + continue; + + if (get_rg_state(name, &svcblk) < 0) { + rg_unlock(name, lockp); + continue; + } + + rg_unlock(name, lockp); } if (!need_init && svcblk.rs_owner != my_id()) { --- cluster/rgmanager/src/daemons/main.c 2006/11/03 16:29:58 1.9.2.8.6.8 +++ cluster/rgmanager/src/daemons/main.c 2007/01/22 23:10:01 1.9.2.8.6.9 @@ -426,12 +426,15 @@ sizeof (SmMessageSt)) clulog(LOG_ERR, "#40: Error replying to " "action request.\n"); + break; } /* Queue request */ rt_enqueue_request(msg_sm.sm_data.d_svcName, msg_sm.sm_data.d_action, - fd, 0, msg_sm.sm_data.d_svcOwner, 0, 0); + fd, 0, msg_sm.sm_data.d_svcOwner, + msg_sm.sm_hdr.gh_arg1, + msg_sm.sm_hdr.gh_arg2); break; case RG_EXITING: --- cluster/rgmanager/src/daemons/nodeevent.c 2006/06/21 18:34:39 1.2.2.2 +++ cluster/rgmanager/src/daemons/nodeevent.c 2007/01/22 23:10:01 1.2.2.3 @@ -36,7 +36,6 @@ static nevent_t *event_queue = NULL; static pthread_mutex_t ne_queue_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t ne_thread = 0; -int ne_queue_request(int local, uint64_t nodeid, int state); void * --- cluster/rgmanager/src/daemons/reslist.c 2005/10/17 20:30:45 1.6.2.4.6.2 +++ cluster/rgmanager/src/daemons/reslist.c 2007/01/22 23:10:01 1.6.2.4.6.3 @@ -523,6 +523,83 @@ } +/* Copied from resrules.c -- _get_actions */ +void +_get_actions_ccs(int ccsfd, char *base, resource_t *res) +{ + char xpath[256]; + int idx = 0; + char *act, *ret; + int interval, timeout, depth; + + do { + /* setting these to -1 prevents overwriting with 0 */ + interval = -1; + depth = -1; + act = NULL; + timeout = -1; + + snprintf(xpath, sizeof(xpath), + "%s/action[%d]/@name", base, ++idx); + +#ifndef NO_CCS + if (ccs_get(ccsfd, xpath, &act) != 0) +#else + if (conf_get(xpath, &act) != 0) +#endif + break; + + snprintf(xpath, sizeof(xpath), + "%s/action[%d]/@timeout", base, idx); +#ifndef NO_CCS + if (ccs_get(ccsfd, xpath, &ret) == 0 && ret) { +#else + if (conf_get(xpath, &ret) == 0 && ret) { +#endif + timeout = expand_time(ret); + if (timeout < 0) + timeout = 0; + free(ret); + } + + snprintf(xpath, sizeof(xpath), + "%s/action[%d]/@interval", base, idx); +#ifndef NO_CCS + if (ccs_get(ccsfd, xpath, &ret) == 0 && ret) { +#else + if (conf_get(xpath, &ret) == 0 && ret) { +#endif + interval = expand_time(ret); + if (interval < 0) + interval = 0; + free(ret); + } + + if (!strcmp(act, "status") || !strcmp(act, "monitor")) { + snprintf(xpath, sizeof(xpath), + "%s/action[%d]/@depth", base, idx); +#ifndef NO_CCS + if (ccs_get(ccsfd, xpath, &ret) == 0 && ret) { +#else + if (conf_get(xpath, &ret) == 0 && ret) { +#endif + depth = atoi(ret); + if (depth < 0) + depth = 0; + + /* */ + if (ret[0] == '*') + depth = -1; + free(ret); + } + } + + if (store_action(&res->r_actions, act, depth, timeout, + interval) != 0) + free(act); + } while (1); +} + /** Try to load all the attributes in our rule set. If none are found, @@ -628,12 +705,12 @@ } if (!found) { - //printf("No attributes found for %s\n", base); destroy_resource(res); return NULL; } res->r_actions = act_dup(rule->rr_actions); + _get_actions_ccs(ccsfd, base, res); return res; } @@ -660,7 +737,7 @@ for (resID = 1; ; resID++) { snprintf(tok, sizeof(tok), RESOURCE_BASE "/%s[%d]", currule->rr_type, resID); - + newres = load_resource(ccsfd, currule, tok); if (!newres) break; --- cluster/rgmanager/src/daemons/resrules.c 2006/11/03 16:29:58 1.9.2.2.6.1 +++ cluster/rgmanager/src/daemons/resrules.c 2007/01/22 23:10:01 1.9.2.2.6.2 @@ -248,17 +248,36 @@ } +/** + * Store a resource action + * @param actsp Action array; may be modified and returned! + * @param name Name of the action + * @param depth Resource depth (status/monitor; -1 means *ALL LEVELS* + * ... this means that only the highest-level check depth + * will ever be performed!) + * @param timeout Timeout (not used) + * @param interval Time interval for status/monitor + * @return 0 on success, -1 on failure + * + */ int store_action(resource_act_t **actsp, char *name, int depth, int timeout, int interval) { - int x = 0; + int x = 0, replace = 0; resource_act_t *acts = *actsp; if (!name) return -1; + + if (depth < 0 && timeout < 0 && interval < 0) + return -1; if (!acts) { + /* Can't create with anything < 0 */ + if (depth < 0 || timeout < 0 || interval < 0) + return -1; + acts = malloc(sizeof(resource_act_t) * 2); if (!acts) return -1; @@ -274,17 +293,38 @@ for (x = 0; acts[x].ra_name; x++) { if (!strcmp(acts[x].ra_name, name) && - depth == acts[x].ra_depth) { - printf("Skipping duplicate action/depth %s/%d\n", - name, depth); - return -1; + (depth == acts[x].ra_depth || depth == -1)) { + printf("Replacing action '%s' depth %d: ", + name, acts[x].ra_depth); + if (timeout >= 0) { + printf("timeout: %d->%d ", + (int)acts[x].ra_timeout, + (int)timeout); + acts[x].ra_timeout = timeout; + } + if (interval >= 0) { + printf("interval: %d->%d", + (int)acts[x].ra_interval, + (int)interval); + acts[x].ra_interval = interval; + } + printf("\n"); + replace = 1; } } + + if (replace) + /* If we replaced something, we're done */ + return 1; + + /* Can't create with anything < 0 */ + if (depth < 0 || timeout < 0 || interval < 0) + return -1; acts = realloc(acts, sizeof(resource_act_t) * (x+2)); if (!acts) return -1; - + acts[x].ra_name = name; acts[x].ra_depth = depth; acts[x].ra_timeout = timeout; @@ -297,6 +337,7 @@ } + void _get_actions(xmlDocPtr doc, xmlXPathContextPtr ctx, char *base, resource_rule_t *rr) @@ -324,8 +365,8 @@ ret = xpath_get_one(doc, ctx, xpath); if (ret) { timeout = expand_time(ret); - if (interval < 0) - interval = 0; + if (timeout < 0) + timeout = 0; free(ret); } @@ -352,9 +393,8 @@ } if (store_action(&rr->rr_actions, act, depth, timeout, - interval) < 0) + interval) != 0) free(act); - } while (1); @@ -946,6 +986,14 @@ type = xpath_get_one(doc, ctx, base); if (!type) break; + + if (!strcasecmp(type, "action")) { + fprintf(stderr, + "Error: Resource type '%s' is reserved", + type); + free(type); + break; + } rr = malloc(sizeof(*rr)); if (!rr) --- cluster/rgmanager/src/daemons/rg_forward.c 2006/01/20 16:27:29 1.2.8.1 +++ cluster/rgmanager/src/daemons/rg_forward.c 2007/01/22 23:10:01 1.2.8.2 @@ -48,8 +48,9 @@ rg_state_t rgs; request_t *req = (request_t *)arg; void *lockp; - int fd; + int fd, ret; SmMessageSt msg; + cluster_member_list_t *m = NULL; if (rg_lock(req->rr_group, &lockp) != 0) { msg_close(req->rr_resp_fd); @@ -88,19 +89,43 @@ pthread_exit(NULL); } - if (msg_receive(fd, &msg, sizeof(msg)) != sizeof(msg)) { - msg_close(fd); - msg_close(req->rr_resp_fd); - rq_free(req); - pthread_exit(NULL); - } + /* + * Ok, we're forwarding a message to another node. Keep tabs on + * the node to make sure it doesn't die. Basically, wake up every + * now and again to make sure it's still online. If it isn't, send + * a response back to the caller. + */ + do { + ret = msg_receive_timeout(fd, &msg, sizeof(msg), 10); + if (ret < (int)sizeof(msg)) { + if (ret < 0 && errno == ETIMEDOUT) { + m = member_list(); + if (!memb_online(m, rgs.rs_owner)) { + msg.sm_data.d_ret = RG_ENODEDEATH; + /* we decode down below, + * so encode here */ + swab_SmMessageSt(&msg); + break; + } + cml_free(m); + m = NULL; + continue; + } + msg_close(fd); + msg_close(req->rr_resp_fd); + goto out; + } + break; + } while(1); + + if (m) + cml_free(m); msg_close(fd); swab_SmMessageSt(&msg); - send_response(msg.sm_data.d_ret, req); - + send_response(msg.sm_data.d_ret, req->rr_target, req); +out: rq_free(req); - pthread_exit(NULL); } --- cluster/rgmanager/src/daemons/rg_state.c 2006/11/03 16:29:58 1.4.2.8.6.5 +++ cluster/rgmanager/src/daemons/rg_state.c 2007/01/22 23:10:01 1.4.2.8.6.6 @@ -111,123 +111,6 @@ int -clu_lock_verbose(char *resource, int dflt_flags, void **lockpp) -{ - int ret, timed_out = 0; - struct timeval start, now; - uint64_t nodeid, *p; - int flags; - int conv = 0, err; - int block = !(dflt_flags & CLK_NOWAIT); - - /* Holder not supported for this call */ - dflt_flags &= ~CLK_HOLDER; - - flags = dflt_flags; - - if (block) { - gettimeofday(&start, NULL); - start.tv_sec += 30; - } - - /* Ripped from global.c in magma */ - if (!(dflt_flags & CLK_CONVERT) && - (block || ((dflt_flags & CLK_EX) == 0))) { - /* Acquire NULL lock */ - ret = clu_lock(resource, CLK_NULL, lockpp); - err = errno; - if (ret == 0) { - if ((flags & CLK_EX) == 0) { - /* User only wanted a NULL lock... */ - return 0; - } - /* - Ok, NULL lock was taken, rest of blocking - call should be done using lock conversions. - */ - flags |= CLK_CONVERT; - conv = 1; - } else { - switch(err) { - case EINVAL: - /* Oops, null locks don't work on this - plugin; use normal spam mode */ - break; - default: - errno = err; - return -1; - } - } - } - - while (1) { - if (block) { - gettimeofday(&now, NULL); - - if ((now.tv_sec > start.tv_sec) || - ((now.tv_sec == start.tv_sec) && - (now.tv_usec >= start.tv_usec))) { - - gettimeofday(&start, NULL); - start.tv_sec += 30; - - timed_out = 1; - flags |= CLK_HOLDER; - } - } - - *lockpp = NULL; - - /* Take the lock (convert if possible). */ - ret = clu_lock(resource, flags | CLK_NOWAIT | - ((conv && !timed_out) ? CLK_CONVERT : 0), - lockpp); - err = errno; - - if ((ret != 0) && (err == EAGAIN) && block) { - if (timed_out) { - p = (uint64_t *)*lockpp; - if (p) { - nodeid = *p; - clulog(LOG_WARNING, "Node ID:%08x%08x" - " stuck with lock %s\n", - (uint32_t)(nodeid>>32&0xffffffff), - (uint32_t)nodeid&0xffffffff, - resource); - free(p); - } else { - clulog(LOG_WARNING, "Starving for lock" - " %s\n", resource); - } - flags = dflt_flags; - timed_out = 0; - } - usleep(random()&32767<<1); - continue; - - } else if (ret == 0) { - /* Success */ - return 0; - } - - break; - } - - /* Fatal error. If we took an automatic NL lock with the hopes of - converting it, release the lock before returning */ - if (conv == 1 && ret < 0) { - clu_unlock(resource, *lockpp); - *lockpp = NULL; - } - - if (ret < 0) - errno = err; - - return ret; -} - - -int #ifdef DEBUG _rg_lock(char *name, void **p) #else @@ -237,7 +120,7 @@ char res[256]; snprintf(res, sizeof(res), "usrm::rg=\"%s\"", name); - return clu_lock_verbose(res, CLK_EX, p); + return clu_lock(res, CLK_EX, p); } @@ -277,7 +160,7 @@ void -send_ret(int fd, char *name, int ret, int orig_request) +send_ret(int fd, char *name, int ret, int orig_request, uint64_t newowner) { SmMessageSt msg, *msgp = &msg; if (fd < 0) @@ -289,7 +172,11 @@ msgp->sm_data.d_action = orig_request; strncpy(msgp->sm_data.d_svcName, name, sizeof(msgp->sm_data.d_svcName)); - msgp->sm_data.d_svcOwner = my_id(); /* XXX Broken */ + if (newowner == NODE_ID_NONE) { + msgp->sm_data.d_svcOwner = my_id(); /* XXX Broken */ + } else { + msgp->sm_data.d_svcOwner = newowner; + } msgp->sm_data.d_ret = ret; swab_SmMessageSt(msgp); @@ -301,7 +188,7 @@ void -send_response(int ret, request_t *req) +send_response(int ret, uint64_t newowner, request_t *req) { SmMessageSt msg, *msgp = &msg; @@ -314,7 +201,11 @@ msgp->sm_data.d_action = req->rr_orig_request; strncpy(msgp->sm_data.d_svcName, req->rr_group, sizeof(msgp->sm_data.d_svcName)); - msgp->sm_data.d_svcOwner = my_id(); /* XXX Broken */ + if (newowner == NODE_ID_NONE) { + msgp->sm_data.d_svcOwner = my_id(); /* XXX Broken */ + } else { + msgp->sm_data.d_svcOwner = newowner; + } msgp->sm_data.d_ret = ret; swab_SmMessageSt(msgp); @@ -594,6 +485,7 @@ * 1 = START service - return whatever it returns. * 2 = DO NOT start service, return 0 * 3 = DO NOT start service, return RG_EAGAIN + * 4 = DO NOT start servuce, return RG_ERUN */ int svc_advise_start(rg_state_t *svcStatus, char *svcName, int req) @@ -618,7 +510,7 @@ clulog(LOG_DEBUG, "RG %s is already running locally\n", svcName); */ - ret = 2; + ret = 4; break; } @@ -630,7 +522,7 @@ svcName, memb_id_to_name(membership,svcStatus->rs_owner)); */ - ret = 2; + ret = 4; break; } @@ -688,6 +580,7 @@ break; case RG_STATE_STOPPED: + case RG_STATE_ERROR: /* Don't actually enable if the RG is locked! */ if (rg_locked()) { ret = 3; @@ -719,7 +612,6 @@ svcName); break; - case RG_STATE_ERROR: default: clulog(LOG_ERR, "#44: Cannot start RG %s: Invalid State %d\n", @@ -771,6 +663,9 @@ case 3: rg_unlock(svcName, lockp); return RG_EAGAIN; + case 4: + rg_unlock(svcName, lockp); + return RG_ERUN; default: break; } @@ -1363,6 +1258,60 @@ } +int +handle_fd_start_req(char *svcName, int request, uint64_t *new_owner) +{ + cluster_member_list_t *allowed_nodes, *backup = NULL; + uint64_t target, me = my_id(); + int ret, x; + + allowed_nodes = member_list(); + + while (memb_count(allowed_nodes)) { + target = best_target_node(allowed_nodes, NODE_ID_NONE, + svcName, 1); + if (target == me) { + ret = handle_start_remote_req(svcName, request); + } else { + ret = relocate_service(svcName, request, target); + } + + switch (ret) { + case RG_ERUN: + return RG_ERUN; + case RG_EFAIL: + memb_mark_down(allowed_nodes, target); + continue; + case RG_EABORT: + svc_report_failure(svcName); + cml_free(allowed_nodes); + return FAIL; + case NO: + /* state uncertain */ + cml_free(allowed_nodes); + clulog(LOG_DEBUG, "State Uncertain: svc:%s " + "nid:%08x%08x req:%d\n", svcName, + (uint32_t)(target>>32)&0xffffffff, + (uint32_t)(target&0xffffffff), request); + return 0; + case 0: + *new_owner = target; + clulog(LOG_NOTICE, "Service %s is now running " + "on member %d\n", svcName, (int)target); + cml_free(allowed_nodes); + return 0; + default: + clulog(LOG_ERR, + "#61: Invalid reply from member %d during" + " relocate operation!\n", target); + } + } + + cml_free(allowed_nodes); + return RG_EFAIL; +} + + /** * handle_start_req - Handle a generic start request from a user or during * service manager boot. @@ -1404,8 +1353,8 @@ /* If services are locked, return the error */ - if (ret == RG_EAGAIN) - return RG_EAGAIN; + if (ret == RG_EAGAIN || ret == RG_ERUN) + return ret; /* * If we succeeded, then we're done. @@ -1498,11 +1447,14 @@ } cml_free(membership); - if (svc_start(svcName, req) == 0) + x = svc_start(svcName, req); + if (x == 0) return 0; + if (x == RG_ERUN) + return RG_ERUN; if (svc_stop(svcName, RG_STOP_RECOVER) == 0) - return FAIL; + return RG_EFAIL; svc_fail(svcName); return RG_EABORT; --- cluster/rgmanager/src/daemons/rg_thread.c 2006/11/03 16:29:58 1.7.2.3.6.4 +++ cluster/rgmanager/src/daemons/rg_thread.c 2007/01/22 23:10:01 1.7.2.3.6.5 @@ -145,7 +145,7 @@ list_remove(list, curr); dprintf("Removed request %d\n", curr->rr_request); if (curr->rr_resp_fd != -1) { - send_response(RG_EABORT, curr); + send_response(RG_EABORT, NODE_ID_NONE, curr); } rq_free(curr); } @@ -237,8 +237,15 @@ case RG_START: case RG_ENABLE: - error = handle_start_req(myname, req->rr_request, - &newowner); + if (req->rr_arg0) { + error = handle_fd_start_req(myname, + req->rr_request, + &newowner); + } else { + error = handle_start_req(myname, + req->rr_request, + &newowner); + } break; case RG_RELOCATE: @@ -412,9 +419,8 @@ if (ret != RG_NONE && rg_initialized() && (req->rr_resp_fd >= 0)) { - send_response(error, req); + send_response(error, newowner, req); } - rq_free(req); } @@ -611,7 +617,7 @@ case RG_START: case RG_ENABLE: send_ret(response_fd, resgroup->rt_name, RG_EDEADLCK, - request); + request, NODE_ID_NONE); break; } fprintf(stderr, "Failed to queue request: Would block\n"); /cvs/cluster/cluster/rgmanager/src/resources/apache.metadata,v --> standard output revision 1.3.8.1 --- cluster/rgmanager/src/resources/apache.metadata +++ - 2007-01-22 23:10:10.075850000 +0000 @@ -0,0 +1,95 @@ + + + 1.0 + + + This defines an instance of Apache web server + + + Defines an Apache web server + + + + + + Define a name for use in <IfDefine name> directive. + + + Name + + + + + + + Define an alternate initial ServerRoot + + + Initial ServerRoot + + + + + + + Define an alternate ServerConfigFile + + + Initial ServerConfigFile + + + + + + + Other command-line options for httpd + + + Other command-line options for httpd + + + + + + + Wait X seconds for correct end of service shutdown + + + Wait X seconds for correct end of service shutdown + + + + + + + Inherit the service name. We need to know + the service name in order to determine file + systems and IPs for this service. + + + Inherit the service name. + + + + + + + + + + + + + + + + + + + + + + + + + /cvs/cluster/cluster/rgmanager/src/resources/apache.sh,v --> standard output revision 1.9.8.1 --- cluster/rgmanager/src/resources/apache.sh +++ - 2007-01-22 23:10:10.224129000 +0000 @@ -0,0 +1,277 @@ +#!/bin/bash + +# +# Copyright Red Hat, Inc. 2006 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. +# +# +# Author(s): +# Marek Grac (mgrac at redhat.com) +# + +export LC_ALL=C +export LANG=C +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +. $(dirname $0)/ocf-shellfuncs +. $(dirname $0)/utils/config-utils.sh +. $(dirname $0)/utils/messages.sh +. $(dirname $0)/utils/ra-skelet.sh + +declare APACHE_HTTPD=/usr/sbin/httpd +declare APACHE_serverConfigFile +declare APACHE_pid_file="`generate_name_for_pid_file`" +declare APACHE_conf_dir="`generate_name_for_conf_dir`" +declare APACHE_genConfig="$APACHE_conf_dir/httpd.conf" + +declare APACHE_parseConfig=$(dirname $0)/utils/httpd-parse-config.pl + +apache_serverConfigFile() +{ + if [[ "$OCF_RESKEY_config_file" =~ '^/' ]]; then + APACHE_serverConfigFile="$OCF_RESKEY_config_file" + else + APACHE_serverConfigFile="$OCF_RESKEY_server_root/$OCF_RESKEY_config_file" + fi + + return; +} + +verify_all() +{ + clog_service_verify $CLOG_INIT + + if [ -z "$OCF_RESKEY_name" ]; then + clog_service_verify $CLOG_FAILED "Invalid Name Of Service" + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_service_name" ]; then + clog_service_verify $CLOG_FAILED_NOT_CHILD + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_server_root" ]; then + clog_service_verify $CLOG_FAILED "Invalid ServerRoot" + return $OCF_ERR_ARGS + fi + + if [ ! -d "$OCF_RESKEY_server_root" ]; then + clog_service_verify $CLOG_FAILED "ServerRoot Directory Is Missing" + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_INVALID "$OCF_RESKEY_config_file" + return $OCF_ERR_ARGS + fi + + if [ ! -r "$APACHE_serverConfigFile" ]; then + clog_check_file_exist $CLOG_FAILED_NOT_READABLE "$APACHE_config_file" + return $OCF_ERR_ARGS + fi + + if [ -z "$APACHE_pid_file" ]; then + clog_service_verify $CLOG_FAILED "Invalid name of PID file" + return $OCF_ERR_ARGS + fi + + clog_check_syntax $CLOG_INIT "$APACHE_serverConfigFile" + + "$APACHE_HTTPD" -t \ + -D"$OCF_RESKEY_name" \ + -d "$OCF_RESKEY_server_root" \ + -f "$APACHE_serverConfigFile" \ + $OCF_RESKEY_httpd_options &> /dev/null + + if [ $? -ne 0 ]; then + clog_check_syntax $CLOG_FAILED "$APACHE_config_file" + return $OCF_ERR_GENERIC + fi + + clog_check_syntax $CLOG_SUCCEED "$APACHE_config_file" + + return 0 +} + +generate_configFile() +{ + declare originalConfigFile=$1; + declare generatedConfigFile=$2; + declare ip_addresses=$3; + + if [ -f "$generatedConfigFile" ]; then + sha1_verify "$generatedConfigFile" + if [ $? -ne 0 ]; then + clog_check_sha1 $CLOG_FAILED + return 0 + fi + fi + + clog_generate_config $CLOG_INIT "$originalConfigFile" "$generatedConfigFile" + + generate_configTemplate "$generatedConfigFile" "$1" + cat >> "$generatedConfigFile" << EOT +# From a cluster perspective, the key fields are: +# Listen - must be set to service floating IP address. +# ServerRoot - path to the ServerRoot (initial value is set in service conf) +# + +EOT + + IFS_old="$IFS" + IFS=$'\n' + for i in `"$APACHE_parseConfig" -D"$OCF_RESKEY_name" < "$originalConfigFile" | grep -P '(^Listen)|(^Port)' | grep -v ':'`; do + port=`echo $i | sed 's/^Listen \(.*\)/\1/;s/^Port \(.*\)/\1/'`; + IFS=$' '; + for z in $ip_addresses; do + echo "Listen $z:$port" >> "$generatedConfigFile"; + done + IFS=$'\n'; + done; + IFS="$IFS_old" + + echo "PidFile \"$APACHE_pid_file\"" >> "$generatedConfigFile"; + echo >> "$generatedConfigFile" + + cat "$originalConfigFile" | sed 's/^Listen/### Listen/;s/^Port/### Port/;s/^PidFile/### PidFile/' | \ + "$APACHE_parseConfig" -D"$OCF_RESKEY_name" >> "$generatedConfigFile" + + sha1_addToFile "$generatedConfigFile" + clog_generate_config $CLOG_SUCCEED "$originalConfigFile" "$generatedConfigFile" +} + +start() +{ + declare ccs_fd + declare ip_addresses + + clog_service_start $CLOG_INIT + + create_pid_directory + create_conf_directory "$APACHE_conf_dir" + check_pid_file "$APACHE_pid_file" + + if [ $? -ne 0 ]; then + clog_check_pid $CLOG_FAILED "$APACHE_pid_file" + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_INIT "IP Addresses" + + ccs_fd=$(ccs_connect); + if [ $? -ne 0 ]; then + clog_looking_for $CLOG_FAILED_CCS + return $OCF_ERR_GENERIC + fi + + get_service_ip_keys "$ccs_fd" "$OCF_RESKEY_service_name" + ip_addresses=`build_ip_list "$ccs_fd"` + + if [ -z "$ip_addresses" ]; then + clog_looking_for $CLOG_FAILED_NOT_FOUND "IP Addresses" + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_SUCCEED "IP Addresses" + + generate_configFile "$APACHE_serverConfigFile" "$APACHE_genConfig" "$ip_addresses" + + "$APACHE_HTTPD" \ + "-D$OCF_RESKEY_name" \ + -d "$OCF_RESKEY_server_root" \ + -f "$APACHE_genConfig" \ + $OCF_RESKEY_httpd_options \ + -k start + + if [ $? -ne 0 ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + else + clog_service_start $CLOG_SUCCEED + fi + + return 0; +} + +stop() +{ + clog_service_stop $CLOG_INIT + + stop_generic "$APACHE_pid_file" "$OCF_RESKEY_shutdown_wait" + + if [ $? -ne 0 ]; then + clog_service_stop $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_service_stop $CLOG_SUCCEED + return 0; +} + +status() +{ + clog_service_status $CLOG_INIT + + status_check_pid "$APACHE_pid_file" + if [ $? -ne 0 ]; then + clog_service_status $CLOG_FAILED "$APACHE_pid_file" + return $OCF_ERR_GENERIC + fi + + clog_service_status $CLOG_SUCCEED + return 0 +} + +if [ "$1" != "meta-data" ]; then + apache_serverConfigFile +fi; + +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` + exit 0 + ;; + verify-all) + verify_all + exit $? + ;; + start) + verify_all && start + exit $? + ;; + stop) + verify_all && stop + exit $? + ;; + status|monitor) + verify_all + status + exit $? + ;; + restart) + verify_all + stop + start + exit $? + ;; + *) + echo "Usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" + exit $OCF_ERR_GENERIC + ;; +esac /cvs/cluster/cluster/rgmanager/src/resources/mysql.metadata,v --> standard output revision 1.3.8.1 --- cluster/rgmanager/src/resources/mysql.metadata +++ - 2007-01-22 23:10:10.345042000 +0000 @@ -0,0 +1,96 @@ + + + 1.0 + + + This defines an instance of MySQL database server + + + Defines a MySQL database server + + + + + + Define a name + + + Name + + + + + + + Define configuration file + + + Define configuration file + + + + + + + Define an IP address for MySQL + + + Define an IP address for MySQL server. If the address + is not given then first IP address from the service is taken. + + + + + + + Other command-line options for httpd + + + Other command-line options for httpd + + + + + + + Wait X seconds for correct end of service shutdown + + + Wait X seconds for correct end of service shutdown + + + + + + + Inherit the service name. We need to know + the service name in order to determine file + systems and IPs for this service. + + + Inherit the service name. + + + + + + + + + + + + + + + + + + + + + + + + + /cvs/cluster/cluster/rgmanager/src/resources/mysql.sh,v --> standard output revision 1.8.8.1 --- cluster/rgmanager/src/resources/mysql.sh +++ - 2007-01-22 23:10:10.461857000 +0000 @@ -0,0 +1,205 @@ +#!/bin/bash + +# +# Copyright Red Hat, Inc. 2006 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. +# +# +# Author(s): +# Marek Grac (mgrac at redhat.com) +# + +export LC_ALL=C +export LANG=C +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +. $(dirname $0)/ocf-shellfuncs +. $(dirname $0)/utils/config-utils.sh +. $(dirname $0)/utils/messages.sh +. $(dirname $0)/utils/ra-skelet.sh + +declare MYSQL_MYSQLD=/usr/bin/mysqld_safe +declare MYSQL_ipAddress +declare MYSQL_pid_file="`generate_name_for_pid_file`" +declare MYSQL_timeout=30 + +verify_all() +{ + clog_service_verify $CLOG_INIT + + if [ -z "$OCF_RESKEY_name" ]; then + clog_service_verify $CLOG_FAILED "Invalid Name Of Service" + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_service_name" ]; then + clog_service_verify $CLOG_FAILED_NOT_CHILD + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_INVALID "$OCF_RESKEY_config_file" + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + if [ ! -r "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_NOT_READABLE $OCF_RESKEY_config_file + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + if [ -z "$MYSQL_pid_file" ]; then + clog_service_verify $CLOG_FAILED "Invalid name of PID file" + return $OCF_ERR_ARGS + fi + + clog_service_verify $CLOG_SUCCEED + return 0 +} + +start() +{ + declare ccs_fd; + + clog_service_start $CLOG_INIT + + create_pid_directory + check_pid_file "$MYSQL_pid_file" + + if [ $? -ne 0 ]; then + clog_check_pid $CLOG_FAILED "$MYSQL_pid_file" + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + if [ -n "$OCF_RESKEY_listen_address" ]; then + MYSQL_ipAddress="$OCF_RESKEY_listen_address" + else + clog_looking_for $CLOG_INIT "IP Address" + + ccs_fd=$(ccs_connect); + if [ $? -ne 0 ]; then + clog_looking_for $CLOG_FAILED_CCS + return $OCF_ERR_GENERIC + fi + + get_service_ip_keys "$ccs_fd" "$OCF_RESKEY_service_name" + ip_addresses=`build_ip_list "$ccs_fd"` + + if [ -n "$ip_addresses" ]; then + for i in $ip_addresses; do + MYSQL_ipAddress="$i" + break; + done + else + clog_looking_for $CLOG_FAILED_NOT_FOUND "IP Address" + fi + fi + + clog_looking_for $CLOG_SUCCEED "IP Address" + + $MYSQL_MYSQLD --defaults-file="$OCF_RESKEY_config_file" \ + --pid-file="$MYSQL_pid_file" \ + --bind-address="$MYSQL_ipAddress" \ + $OCF_RESKEY_mysqld_options > /dev/null 2>&1 & + + if [ $? -ne 0 ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + while [ "$MYSQL_timeout" -gt 0 ]; do + if [ -f "$MYSQL_pid_file" ]; then + break; + fi + sleep 1 + let MYSQL_timeout=${MYSQL_timeout}-1 + done + + if [ "$MYSQL_timeout" -eq 0 ]; then + clog_service_start $CLOG_FAILED_TIMEOUT + return $OCF_ERR_GENERIC + fi + + clog_service_start $CLOG_SUCCEED + + return 0; +} + +stop() +{ + clog_service_stop $CLOG_INIT + + stop_generic "$MYSQL_pid_file" "$OCF_RESKEY_shutdown_wait" + + if [ $? -ne 0 ]; then + clog_service_stop $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_service_stop $CLOG_SUCCEED + return 0; +} + +status() +{ + clog_service_status $CLOG_INIT + + status_check_pid "$MYSQL_pid_file" + if [ $? -ne 0 ]; then + clog_service_status $CLOG_FAILED "$MYSQL_pid_file" + return $OCF_ERR_GENERIC + fi + + clog_service_status $CLOG_SUCCEED + return 0 +} + +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` + exit 0 + ;; + verify-all) + verify_all + exit $? + ;; + start) + verify_all && start + exit $? + ;; + stop) + verify_all && stop + exit $? + ;; + status|monitor) + verify_all + status + exit $? + ;; + restart) + verify_all + stop + start + exit $? + ;; + *) + echo "Usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" + exit $OCF_ERR_GENERIC + ;; +esac /cvs/cluster/cluster/rgmanager/src/resources/openldap.metadata,v --> standard output revision 1.2.8.1 --- cluster/rgmanager/src/resources/openldap.metadata +++ - 2007-01-22 23:10:11.865229000 +0000 @@ -0,0 +1,98 @@ + + + 1.0 + + + This defines an instance of Open LDAP + + + Defines an Open LDAP server + + + + + + Specifies a service name for logging and other purposes + + + Name + + + + + + + Define absolute path to configuration file + + + Config File + + + + + + + Serve URL list. Default behaviour of URL list is changed and + enhanced. eg. ldap:/// won't bind all IP address on the + computer but to all IP addresses in service. Using + ldap://0:port/ will bind to all IP addresses for service on + given port. + + + URL list + + + + + + + Other command-line options for slapd + + + Other command-line options for slapd + + + + + + + Wait X seconds for correct end of service shutdown + + + Wait X seconds for correct end of service shutdown + + + + + + + Inherit the service name. We need to know + the service name in order to determine file + systems and IPs for this service. + + + Inherit the service name. + + + + + + + + + + + + + + + + + + + + + + + + /cvs/cluster/cluster/rgmanager/src/resources/openldap.sh,v --> standard output revision 1.7.8.1 --- cluster/rgmanager/src/resources/openldap.sh +++ - 2007-01-22 23:10:11.947535000 +0000 @@ -0,0 +1,240 @@ +#!/bin/bash + +# +# Copyright Red Hat, Inc. 2006 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. +# +# +# Author(s): +# Marek Grac (mgrac at redhat.com) +# + +export LC_ALL=C +export LANG=C +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +. $(dirname $0)/ocf-shellfuncs +. $(dirname $0)/utils/config-utils.sh +. $(dirname $0)/utils/messages.sh +. $(dirname $0)/utils/ra-skelet.sh + +declare LDAP_SLAPD=/usr/sbin/slapd +declare LDAP_pid_file="`generate_name_for_pid_file`" +declare LDAP_conf_dir="`generate_name_for_conf_dir`" +declare LDAP_gen_config_file="$LDAP_conf_dir/slapd.conf" +declare LDAP_url_list + +verify_all() +{ + clog_service_verify $CLOG_INIT + + if [ -z "$OCF_RESKEY_name" ]; then + clog_service_verify $CLOG_FAILED "Invalid Name Of Service" + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_service_name" ]; then + clog_service_verify $CLOG_FAILED_NOT_CHILD + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_INVALID "$OCF_RESKEY_config_file" + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + if [ ! -r "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_NOT_READABLE $OCF_RESKEY_config_file + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + clog_service_verify $CLOG_SUCCEED + + return 0 +} + +generate_url_list() +{ + declare ldap_url_source=$1 + declare ip_addresses=$2 + declare url_list + declare tmp; + + for u in $ldap_url_source; do + if [[ "$u" =~ ':///' ]]; then + for z in $ip_addresses; do + tmp=`echo $u | sed "s,://,://$z,"` + url_list="$url_list $tmp" + done + elif [[ "$u" =~ '://0:' ]]; then + for z in $ip_addresses; do + tmp=`echo $u | sed "s,://0:,://$z:,"` + url_list="$url_list $tmp" + done + else + url_list="$url_list $u" + fi + done + + echo $url_list +} + +generate_config_file() +{ + declare original_file="$1" + declare generated_file="$2" + + if [ -f "$generated_file" ]; then + sha1_verify "$generated_file" + if [ $? -ne 0 ]; then + clog_check_sha1 $CLOG_FAILED + return 0 + fi + fi + + clog_generate_config $CLOG_INIT "$original_file" "$generated_file" + + generate_configTemplate "$generated_file" "$1" + echo "pidfile \"$LDAP_pid_file\"" >> $generated_file + echo >> $generated_file + sed 's/^[[:space:]]*pidfile/### pidfile/i' < "$original_file" >> "$generated_file" + + sha1_addToFile "$generated_file" + clog_generate_config $CLOG_SUCCEED "$original_file" "$generated_file" + + return 0; +} + +start() +{ + declare ccs_fd; + + clog_service_start $CLOG_INIT + + create_pid_directory + create_conf_directory "$LDAP_conf_dir" + check_pid_file "$LDAP_pid_file" + + if [ $? -ne 0 ]; then + clog_check_pid $CLOG_FAILED "$LDAP_pid_file" + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + clog_looking_for $CLOG_INIT "IP Addresses" + + ccs_fd=$(ccs_connect); + if [ $? -ne 0 ]; then + clog_looking_for $CLOG_FAILED_CCS + return $OCF_ERR_GENERIC + fi + + get_service_ip_keys "$ccs_fd" "$OCF_RESKEY_service_name" + ip_addresses=`build_ip_list "$ccs_fd"` + + if [ -z "$ip_addresses" ]; then + clog_looking_for $CLOG_FAILED_NOT_FOUND "IP Addresses" + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_SUCCEED "IP Addresses" + + LDAP_url_list=`generate_url_list "$OCF_RESKEY_url_list" "$ip_addresses"` + + if [ -z "$LDAP_url_list" ]; then + ocf_log error "Generating URL List for $OCF_RESOURCE_INSTANCE > Failed" + return $OCF_ERR_GENERIC + fi + + generate_config_file "$OCF_RESKEY_config_file" "$LDAP_gen_config_file" + + $LDAP_SLAPD -f "$LDAP_gen_config_file" -n "$OCF_RESOURCE_INSTANCE" \ + -h "$LDAP_url_list" $OCF_RESKEY_slapd_options + + if [ $? -ne 0 ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_service_start $CLOG_SUCCEED + + return 0; +} + +stop() +{ + clog_service_stop $CLOG_INIT + + stop_generic "$LDAP_pid_file" "$OCF_RESKEY_shutdown_wait" + + if [ $? -ne 0 ]; then + clog_service_stop $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_service_stop $CLOG_SUCCEED + return 0; +} + +status() +{ + clog_service_status $CLOG_INIT + + status_check_pid "$LDAP_pid_file" + if [ $? -ne 0 ]; then + clog_service_status $CLOG_FAILED "$LDAP_pid_file" + return $OCF_ERR_GENERIC + fi + + clog_service_status $CLOG_SUCCEED + return 0 +} + +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` + exit 0 + ;; + verify-all) + verify_all + exit $? + ;; + start) + verify_all && start + exit $? + ;; + stop) + verify_all && stop + exit $? + ;; + status|monitor) + verify_all + status + exit $? + ;; + restart) + verify_all + stop + start + exit $? + ;; + *) + echo "Usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" + exit $OCF_ERR_GENERIC + ;; +esac /cvs/cluster/cluster/rgmanager/src/resources/postgres-8.metadata,v --> standard output revision 1.2.8.1 --- cluster/rgmanager/src/resources/postgres-8.metadata +++ - 2007-01-22 23:10:12.038744000 +0000 @@ -0,0 +1,95 @@ + + + 1.0 + + + This defines an instance of PostgreSQL server + + + Defines a PostgreSQL server + + + + + + Specifies a service name for logging and other purposes + + + Name + + + + + + + Define absolute path to configuration file + + + Config File + + + + + + + User who runs the database server because it can't be + run by root. + + + User who runs the database server + + + + + + + Other command-line options for postmaster + + + Other command-line options for postmaster + + + + + + + Wait X seconds for correct end of service shutdown + + + Wait X seconds for correct end of service shutdown + + + + + + + Inherit the service name. We need to know + the service name in order to determine file + systems and IPs for this service. + + + Inherit the service name. + + + + + + + + + + + + + + + + + + + + + + + + /cvs/cluster/cluster/rgmanager/src/resources/postgres-8.sh,v --> standard output revision 1.5.8.1 --- cluster/rgmanager/src/resources/postgres-8.sh +++ - 2007-01-22 23:10:12.135850000 +0000 @@ -0,0 +1,225 @@ +#!/bin/bash + +# +# Copyright Red Hat, Inc. 2006 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. +# +# +# Author(s): +# Marek Grac (mgrac at redhat.com) +# + +export LC_ALL=C +export LANG=C +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +. $(dirname $0)/ocf-shellfuncs +. $(dirname $0)/utils/config-utils.sh +. $(dirname $0)/utils/messages.sh +. $(dirname $0)/utils/ra-skelet.sh + +declare PSQL_POSTMASTER="/usr/bin/postmaster" +declare PSQL_pid_file="`generate_name_for_pid_file`" +declare PSQL_conf_dir="`generate_name_for_conf_dir`" +declare PSQL_gen_config_file="$PSQL_conf_dir/postgresql.conf" + +verify_all() +{ + clog_service_verify $CLOG_INIT + + if [ -z "$OCF_RESKEY_name" ]; then + clog_service_verify $CLOG_FAILED "Invalid Name Of Service" + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_service_name" ]; then + clog_service_verify $CLOG_FAILED_NOT_CHILD + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_INVALID "$OCF_RESKEY_config_file" + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + if [ ! -r "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_NOT_READABLE $OCF_RESKEY_config_file + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_postmaster_user" ]; then + clog_servicer_verify $CLOG_FAILED "Invalid User" + return $OCF_ERR_ARGS + fi + + clog_service_verify $CLOG_SUCCEED + + return 0 +} + +generate_config_file() +{ + declare original_file="$1" + declare generated_file="$2" + declare ip_addressess="$3" + + declare ip_comma=""; + + if [ -f "$generated_file" ]; then + sha1_verify "$generated_file" + if [ $? -ne 0 ]; then + clog_check_sha1 $CLOG_FAILED + return 0 + fi + fi + + clog_generate_config $CLOG_INIT "$original_file" "$generated_file" + + declare x=1 + for i in $ip_addressess; do + if [ $x -eq 1 ]; then + x=0 + ip_comma=$i + else + ip_comma=$ip_comma,$i + fi + done + + generate_configTemplate "$generated_file" "$1" + echo "external_pid_file = '$PSQL_pid_file'" >> $generated_file + echo "listen_address = '$ip_comma'" >> $generated_file + + echo >> $generated_file + sed 's/^[[:space:]]*external_pid_file/### external_pid_file/i;s/^[[:space:]]*listen_address/### listen_address/i' < "$original_file" >> "$generated_file" + + sha1_addToFile "$generated_file" + clog_generate_config $CLOG_SUCCEED "$original_file" "$generated_file" + + return 0; +} + +start() +{ + declare ccs_fd; + + clog_service_start $CLOG_INIT + + create_pid_directory + create_conf_directory "$PSQL_conf_dir" + check_pid_file "$PSQL_pid_file" + + if [ $? -ne 0 ]; then + clog_check_pid $CLOG_FAILED "$PSQL_pid_file" + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_INIT "IP Addresses" + + ccs_fd=$(ccs_connect); + if [ $? -ne 0 ]; then + clog_looking_for $CLOG_FAILED_CCS + return $OCF_ERR_GENERIC + fi + + get_service_ip_keys "$ccs_fd" "$OCF_RESKEY_service_name" + ip_addresses=`build_ip_list "$ccs_fd"` + + if [ -z "$ip_addresses" ]; then + clog_looking_for $CLOG_FAILED_NOT_FOUND "IP Addresses" + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_SUCCEED "IP Addresses" + + generate_config_file "$OCF_RESKEY_config_file" "$PSQL_gen_config_file" "$ip_addresses" + + sudo -u "$OCF_RESKEY_postmaster_user" $PSQL_POSTMASTER -c config_file="$PSQL_gen_config_file" \ + $OCF_RESKEY_postmaster_options + + if [ $? -ne 0 ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_service_start $CLOG_SUCCEED + return 0; +} + +stop() +{ + clog_service_stop $CLOG_INIT + + stop_generic "$PSQL_pid_file" "$OCF_RESKEY_shutdown_wait" + if [ $? -ne 0 ]; then + clog_service_stop $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_service_stop $CLOG_SUCCEED + return 0; +} + +status() +{ + clog_service_status $CLOG_INIT + + status_check_pid "$PSQL_pid_file" + if [ $? -ne 0 ]; then + clog_service_status $CLOG_FAILED "$PSQL_pid_file" + return $OCF_ERR_GENERIC + fi + + clog_service_status $CLOG_SUCCEED + return 0 +} + +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` + exit 0 + ;; + verify-all) + verify_all + exit $? + ;; + start) + verify_all && start + exit $? + ;; + stop) + verify_all && stop + exit $? + ;; + status|monitor) + verify_all + status + exit $? + ;; + restart) + verify_all + stop + start + exit $? + ;; + *) + echo "Usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" + exit $OCF_ERR_GENERIC + ;; +esac /cvs/cluster/cluster/rgmanager/src/resources/samba.metadata,v --> standard output revision 1.2.8.1 --- cluster/rgmanager/src/resources/samba.metadata +++ - 2007-01-22 23:10:12.229800000 +0000 @@ -0,0 +1,89 @@ + + + 1.0 + + + Dynamic smbd/nmbd resource agent + + + Dynamic smbd/nmbd resource agent + + + + + + Samba Symbolic Name. + + + Samba Name + + + + + + + Define absolute path to configuration file + + + Config File + + + + + + + Other command-line options for smbd + + + Other command-line options for smbd + + + + + + + Other command-line options for nmbd + + + Other command-line options for nmbd + + + + + + + Wait X seconds for correct end of service shutdown + + + Wait X seconds for correct end of service shutdown + + + + + + + Inherit the service name. We need to know + the service name in order to determine file + systems and IPs for this smb service. + + + Inherit the service name. + + + + + + + + + + + + + + + + + /cvs/cluster/cluster/rgmanager/src/resources/samba.sh,v --> standard output revision 1.5.8.1 --- cluster/rgmanager/src/resources/samba.sh +++ - 2007-01-22 23:10:12.318596000 +0000 @@ -0,0 +1,254 @@ +#!/bin/bash + +# +# Copyright Red Hat, Inc. 2006 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. +# +# +# Author(s): +# Marek Grac (mgrac at redhat.com) +# + +export LC_ALL=C +export LANG=C +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +. $(dirname $0)/ocf-shellfuncs +. $(dirname $0)/utils/config-utils.sh +. $(dirname $0)/utils/messages.sh +. $(dirname $0)/utils/ra-skelet.sh + +declare SAMBA_SMBD=/usr/sbin/smbd +declare SAMBA_NMBD=/usr/sbin/nmbd +declare SAMBA_pid_dir="`generate_name_for_pid_dir`" +declare SAMBA_conf_dir="`generate_name_for_conf_dir`" +declare SAMBA_smbd_pid_file="$SAMBA_pid_dir/smbd.pid" +declare SAMBA_nmbd_pid_file="$SAMBA_pid_dir/nmbd.pid" +declare SAMBA_gen_config_file="$SAMBA_conf_dir/smb.conf" + +verify_all() +{ + clog_service_verify $CLOG_INIT + + if [ -z "$OCF_RESKEY_name" ]; then + clog_service_verify $CLOG_FAILED "Invalid Name Of Service" + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_service_name" ]; then + clog_service_verify $CLOG_FAILED_NOT_CHILD + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_INVALID "$OCF_RESKEY_config_file" + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + if [ ! -r "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_NOT_READABLE $OCF_RESKEY_config_file + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + clog_service_verify $CLOG_SUCCEED + + return 0 +} + +generate_config_file() +{ + declare original_file="$1" + declare generated_file="$2" + declare ip_addresses="$3" + + if [ -f "$generated_file" ]; then + sha1_verify "$generated_file" + if [ $? -ne 0 ]; then + clog_check_sha1 $CLOG_FAILED + return 0 + fi + fi + + clog_generate_config $CLOG_INIT "$original_file" "$generated_file" + + generate_configTemplate "$generated_file" "$1" + + echo "pid directory = \"$SAMBA_pid_dir\"" >> $generated_file + echo "interfaces = $ip_addresses" >> $generated_file + echo "bind interfaces only = Yes" >> $generated_file + echo "netbios name = \"$OCF_RESKEY_name\"" >> $generated_file + echo >> $generated_file + sed 's/^[[:space:]]*pid directory/### pid directory/i;s/^[[:space:]]*interfaces/### interfaces/i;s/^[[:space:]]*bind interfaces only/### bind interfaces only/i;s/^[[:space:]]*netbios name/### netbios name/i' \ + < "$original_file" >> "$generated_file" + + sha1_addToFile "$generated_file" + clog_generate_config $CLOG_SUCCEED "$original_file" "$generated_file" + + return 0; +} + +start() +{ + declare ccs_fd; + + clog_service_start $CLOG_INIT + + create_pid_directory + mkdir -p "$SAMBA_pid_dir" + create_conf_directory "$SAMBA_conf_dir" + check_pid_file "$SAMBA_smbd_pid_file" + + if [ $? -ne 0 ]; then + clog_check_pid $CLOG_FAILED "$SAMBA_smbd_pid_file" + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + check_pid_file "$SAMBA_nmbd_pid_file" + + if [ $? -ne 0 ]; then + clog_check_pid $CLOG_FAILED "$SAMBA_nmbd_pid_file" + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_INIT "IP Addresses" + + ccs_fd=$(ccs_connect); + if [ $? -ne 0 ]; then + clog_looking_for $CLOG_FAILED_CCS + return $OCF_ERR_GENERIC + fi + + get_service_ip_keys "$ccs_fd" "$OCF_RESKEY_service_name" + ip_addresses=`build_ip_list "$ccs_fd"` + + if [ -z "$ip_addresses" ]; then + clog_looking_for $CLOG_FAILED_NOT_FOUND "IP Addresses" + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_SUCCEED "IP Addresses" + + generate_config_file "$OCF_RESKEY_config_file" "$SAMBA_gen_config_file" "$ip_addresses" + + $SAMBA_SMBD -D -s "$SAMBA_gen_config_file" $OCF_RESKEY_smbd_options + + if [ $? -ne 0 ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + $SAMBA_NMBD -D -s "$SAMBA_gen_config_file" $OCF_RESKEY_nmbd_options + + if [ $? -ne 0 ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + clog_service_start $CLOG_SUCCEED + + return 0; +} + +stop() +{ + clog_service_stop $CLOG_INIT + + stop_generic "$SAMBA_smbd_pid_file" "$OCF_RESKEY_shutdown_wait" + + if [ $? -ne 0 ]; then + clog_service_stop $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + stop_generic "$SAMBA_nmbd_pid_file" + + if [ $? -ne 0 ]; then + clog_service_stop $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + if [ -e "$SAMBA_smbd_pid_file" ]; then + rm -f "$SAMBA_smbd_pid_file" + fi + + if [ -e "$SAMBA_nmbd_pid_file" ]; then + rm -f "$SAMBA_nmbd_pid_file" + fi + + clog_service_stop $CLOG_SUCCEED + return 0; +} + +status() +{ + clog_service_status $CLOG_INIT + + status_check_pid "$SAMBA_smbd_pid_file" + + if [ $? -ne 0 ]; then + clog_service_status $CLOG_FAILED "$SAMBA_smbd_pid_file" + return $OCF_ERR_GENERIC + fi + + status_check_pid "$SAMBA_nmbd_pid_file" + + if [ $? -ne 0 ]; then + clog_service_status $CLOG_FAILED "$SAMBA_nmbd_pid_file" + return $OCF_ERR_GENERIC + fi + + clog_service_status $CLOG_SUCCEED + return 0 +} + +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` + exit 0 + ;; + verify-all) + verify_all + exit $? + ;; + start) + verify_all && start + exit $? + ;; + stop) + verify_all && stop + exit $? + ;; + status|monitor) + verify_all + status + exit $? + ;; + restart) + verify_all + stop + start + exit $? + ;; + *) + echo "Usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" + exit $OCF_ERR_GENERIC + ;; +esac /cvs/cluster/cluster/rgmanager/src/resources/tomcat-5.metadata,v --> standard output revision 1.1.8.1 --- cluster/rgmanager/src/resources/tomcat-5.metadata +++ - 2007-01-22 23:10:12.402246000 +0000 @@ -0,0 +1,104 @@ + + + 1.0 + + + This defines an instance of Tomcat server + + + Defines a Tomcat server + + + + + + Specifies a service name for logging and other purposes + + + Name + + + + + + + Define absolute path to configuration file + + + Config File + + + + + + + User who runs the Tomcat server + + + User who runs the Tomcat server + + + + + + + Other command-line options for Catalina + + + Other command-line options for Catalina + + + + + + + Cataliny base directory + + + Catalina base directory (differs for each service) + + + + + + + Wait X seconds for correct end of service shutdown + + + Wait X seconds for correct end of service shutdown + + + + + + + Inherit the service name. We need to know + the service name in order to determine file + systems and IPs for this service. + + + Inherit the service name. + + + + + + + + + + + + + + + + + + + + + + + + /cvs/cluster/cluster/rgmanager/src/resources/tomcat-5.sh,v --> standard output revision 1.1.8.1 --- cluster/rgmanager/src/resources/tomcat-5.sh +++ - 2007-01-22 23:10:12.481744000 +0000 @@ -0,0 +1,287 @@ +#!/bin/bash + +# +# Copyright Red Hat, Inc. 2006 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Gener5~al Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. +# +# +# Author(s): +# Marek Grac (mgrac at redhat.com) +# + +export LC_ALL=C +export LANG=C +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +. $(dirname $0)/ocf-shellfuncs +. $(dirname $0)/utils/config-utils.sh +. $(dirname $0)/utils/messages.sh +. $(dirname $0)/utils/ra-skelet.sh + +declare TOMCAT_TOMCAT=/usr/bin/dtomcat5 +declare TOMCAT_RELINK=/usr/share/tomcat5/bin/relink +declare TOMCAT_pid_file="`generate_name_for_pid_file`" +declare TOMCAT_conf_dir="`generate_name_for_conf_dir`/conf" +declare TOMCAT_gen_config_file="$TOMCAT_conf_dir/server.xml" +declare TOMCAT_gen_catalina_base="`generate_name_for_conf_dir`" + +declare JAVA_HOME +declare CATALINA_HOME +declare CATALINA_BASE +declare CATALINA_TMPDIR +declare CLASSPATH +declare TOMCAT_USER +## + +verify_all() +{ + clog_service_verify $CLOG_INIT + + if [ -z "$OCF_RESKEY_name" ]; then + clog_service_verify $CLOG_FAILED "Invalid Name Of Service" + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_service_name" ]; then + clog_service_verify $CLOG_FAILED_NOT_CHILD + return $OCF_ERR_ARGS + fi + + if [ -z "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_INVALID "$OCF_RESKEY_config_file" + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + if [ ! -r "$OCF_RESKEY_config_file" ]; then + clog_check_file_exist $CLOG_FAILED_NOT_READABLE $OCF_RESKEY_config_file + clog_service_verify $CLOG_FAILED + return $OCF_ERR_ARGS + fi + + . "$OCF_RESKEY_config_file" + + if [ $? -ne 0 ]; then + clog_service_verify $CLOG_FAILED "Error In The File \"$OCF_RESKEY_config_file\"" + return $OCF_ERR_ARGS + fi + + if [ -z "$JAVA_HOME" ]; then + clog_service_verify $CLOG_FAILED "JAVA_HOME Not Specified In ${OCF_RESKEY_config_file}" + return $OCF_ERR_ARGS; + fi + + if [ ! -d "$JAVA_HOME" ]; then + clog_service_verify $CLOG_FAILED "JAVA_HOME Does Not Exist" + return $OCF_ERR_ARGS; + fi + + if [ -z "$JAVA_ENDORSED_DIRS" ]; then + clog_service_verify $CLOG_FAILED "JAVA_ENDORSED_DIRS Not Specified In ${OCF_RESKEY_config_file}" + return $OCF_ERR_ARGS; + fi + + if [ ! -d "$JAVA_ENDORSED_DIRS" ]; then + clog_service_verify $CLOG_FAILED "JAVA_ENDORSED_DIRS Does Not Exist" + return $OCF_ERR_ARGS; + fi + + if [ -z "$CATALINA_HOME" ]; then + clog_service_verify $CLOG_FAILED "CATALINA_HOME Not Specified In ${OCF_RESKEY_config_file}" + return $OCF_ERR_ARGS; + fi + + if [ ! -d "$CATALINA_HOME" ]; then + clog_service_verify $CLOG_FAILED "CATALINA_HOME Does Not Exist" + return $OCF_ERR_ARGS; + fi + + if [ -z "$CATALINA_TMPDIR" ]; then + clog_service_verify $CLOG_FAILED "CATALINA_TMPDIR Not Specified In ${OCF_RESKEY_config_file}" + return $OCF_ERR_ARGS; + fi + + if [ ! -d "$CATALINA_TMPDIR" ]; then + clog_service_verify $CLOG_FAILED "CATALINA_TMPDIR Does Not Exist" + return $OCF_ERR_ARGS; + fi + + if [ -z "$TOMCAT_USER" ]; then + clog_service_verify $CLOG_FAILED "TOMCAT_USER Does Not Exist" + return $OCF_ERR_ARGS; + fi + + clog_service_verify $CLOG_SUCCEED + + return 0 +} + +generate_config_file() +{ + declare original_file="$1" + declare generated_file="$2" + declare ip_addresses="$3" + + if [ -f "$generated_file" ]; then + sha1_verify "$generated_file" + if [ $? -ne 0 ]; then + clog_check_sha1 $CLOG_FAILED + return 0 + fi + fi + + clog_generate_config $CLOG_INIT "$original_file" "$generated_file" + +# generate_configTemplate "$generated_file" "$original_file" + $(dirname $0)/utils/tomcat-parse-config.pl $ip_addresses < "$original_file" >> "$generated_file" + + sha1_addToFile "$generated_file" + clog_generate_config $CLOG_SUCCEED "$original_file" "$generated_file" + + return 0; +} + +start() +{ + declare ccs_fd; + + clog_service_start $CLOG_INIT + + create_pid_directory + create_conf_directory "$TOMCAT_conf_dir" + check_pid_file "$TOMCAT_pid_file" + + if [ $? -ne 0 ]; then + clog_check_pid $CLOG_FAILED "$TOMCAT_pid_file" + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + clog_looking_for $CLOG_INIT "IP Addresses" + + ccs_fd=$(ccs_connect); + if [ $? -ne 0 ]; then + clog_looking_for $CLOG_FAILED_CCS + return $OCF_ERR_GENERIC + fi + + get_service_ip_keys "$ccs_fd" "$OCF_RESKEY_service_name" + ip_addresses=`build_ip_list "$ccs_fd"` + + if [ -z "$ip_addresses" ]; then + clog_looking_for $CLOG_FAILED_NOT_FOUND "IP Addresses" + return $OCF_ERR_GENERIC + fi + + clog_looking_for $CLOG_SUCCEED "IP Addresses" + generate_config_file "$OCF_RESKEY_catalina_base/conf/server.xml" "$TOMCAT_gen_config_file" "$ip_addresses" + ln -s "$OCF_RESKEY_catalina_base"/* "$TOMCAT_gen_catalina_base" &> /dev/null + ln -s "$OCF_RESKEY_catalina_base"/conf/* "$TOMCAT_gen_catalina_base"/conf &> /dev/null + + CLASSPATH="$JAVA_HOME"/lib/tools.jar:"$CATALINA_HOME"/bin/bootstrap.jar:"$CATALINA_HOME"/bin/commons-logging-api.jar:`/usr/bin/build-classpath mx4j/mx4j-impl`:`/usr/bin/build-classpath mx4j/mx4j-jmx` + + sudo -u "$TOMCAT_USER" "$JAVA_HOME/bin/java" $JAVA_OPTS $OCF_RESKEY_catalina_options \ + -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \ + -Dcatalina.base="$TOMCAT_gen_catalina_base" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMPDIR" \ + org.apache.catalina.startup.Bootstrap "$@" start \ + >> "$TOMCAT_gen_catalina_base"/logs/catalina.out 2>&1 & + + + if [ $? -ne 0 ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + if [ -z "$!" ]; then + clog_service_start $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + echo $! > $TOMCAT_pid_file + + clog_service_start $CLOG_SUCCEED + + return 0; +} + +stop() +{ + clog_service_stop $CLOG_INIT + + stop_generic "$TOMCAT_pid_file" "$OCF_RESKEY_shutdown_wait" + + if [ $? -ne 0 ]; then + clog_service_stop $CLOG_FAILED + return $OCF_ERR_GENERIC + fi + + if [ -e "$TOMCAT_pid_file" ]; then + rm -f "$TOMCAT_pid_file" + fi + + clog_service_stop $CLOG_SUCCEED + return 0; +} + +status() +{ + clog_service_status $CLOG_INIT + + status_check_pid "$TOMCAT_pid_file" + if [ $? -ne 0 ]; then + clog_service_status $CLOG_FAILED "$TOMCAT_pid_file" + return $OCF_ERR_GENERIC + fi + + clog_service_status $CLOG_SUCCEED + return 0 +} + +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` + exit 0 + ;; + verify-all) + verify_all + exit $? + ;; + start) + verify_all && start + exit $? + ;; + stop) + verify_all && stop + exit $? + ;; + status|monitor) + verify_all + status + exit $? + ;; + restart) + verify_all + stop + start + exit $? + ;; + *) + echo "Usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" + exit $OCF_ERR_GENERIC + ;; +esac --- cluster/rgmanager/src/resources/Makefile 2006/06/16 20:07:46 1.4.2.3.6.3 +++ cluster/rgmanager/src/resources/Makefile 2007/01/22 23:10:01 1.4.2.3.6.4 @@ -18,9 +18,16 @@ INCLUDE += -I $(top_srcdir)/include RESOURCES=fs.sh service.sh ip.sh nfsclient.sh nfsexport.sh \ - script.sh netfs.sh clusterfs.sh smb.sh - -TARGETS=${RESOURCES} ocf-shellfuncs svclib_nfslock + script.sh netfs.sh clusterfs.sh smb.sh \ + apache.sh openldap.sh samba.sh mysql.sh \ + postgres-8.sh tomcat-5.sh + +METADATA=apache.metadata openldap.metadata samba.metadata \ + mysql.metadata postgres-8.metadata tomcat-5.metadata + +TARGETS=${RESOURCES} ocf-shellfuncs svclib_nfslock \ + utils/config-utils.sh utils/ra-skelet.sh utils/messages.sh \ + utils/httpd-parse-config.pl utils/tomcat-parse-config.pl all: @@ -28,7 +35,9 @@ echo ${sharedir} echo ${sbindir} install -d ${sharedir} + install -d ${sharedir}/utils install $(TARGETS) ${sharedir} + install -m 644 $(METADATA) ${sharedir} uninstall: ${UNINSTALL} ${TARGETS} ${sharedir} --- cluster/rgmanager/src/resources/clusterfs.sh 2006/11/03 16:29:58 1.1.2.3.4.6 +++ cluster/rgmanager/src/resources/clusterfs.sh 2007/01/22 23:10:01 1.1.2.3.4.7 @@ -898,7 +898,7 @@ isAlive ${OCF_RESKEY_mountpoint} [ $? -eq $YES ] && exit 0 - ocf_log err "fs:${OCF_RESKEY_name}: Mount point is not accessible!" + ocf_log err "clusterfs:${OCF_RESKEY_name}: Mount point is not accessible!" exit $OCF_ERR_GENERIC ;; restart) --- cluster/rgmanager/src/resources/fs.sh 2006/11/03 16:29:58 1.4.2.6.4.7 +++ cluster/rgmanager/src/resources/fs.sh 2007/01/22 23:10:01 1.4.2.6.4.8 @@ -496,6 +496,18 @@ # +# trim_trailing_slash path +# +# Trim trailing slash from given path. +# +trim_trailing_slash() { + declare mpath=$1 + + echo $mpath | sed -e 's/\/*$//' +} + + +# # isMounted device mount_point # # Check to see if the device is mounted. Print a warning if its not @@ -523,6 +535,8 @@ do #echo "spec=$1 dev=$dev tmp_dev=$tmp_dev" tmp_dev=$(real_device $tmp_dev) + tmp_mp=$(trim_trailing_slash $tmp_mp) + mp=$(trim_trailing_slash $mp) if [ -n "$tmp_dev" -a "$tmp_dev" = "$dev" ]; then # --- cluster/rgmanager/src/resources/ip.sh 2006/06/16 20:07:46 1.5.2.4.4.10 +++ cluster/rgmanager/src/resources/ip.sh 2007/01/22 23:10:01 1.5.2.4.4.11 @@ -884,6 +884,9 @@ exit 0 fi ip_op ${OCF_RESKEY_family} add ${OCF_RESKEY_address} + if [ $? -ne 0 ]; then + exit $OCF_ERR_GENERIC + fi if [ $NFS_TRICKS -eq 0 ]; then if [ "$OCF_RESKEY_nfslock" = "yes" ] || \ --- cluster/rgmanager/src/resources/ocf-shellfuncs 2006/11/03 16:29:58 1.2.2.3 +++ cluster/rgmanager/src/resources/ocf-shellfuncs 2007/01/22 23:10:01 1.2.2.4 @@ -1,5 +1,5 @@ # -# $Id: ocf-shellfuncs,v 1.2.2.3 2006/11/03 16:29:58 lhh Exp $ +# $Id: ocf-shellfuncs,v 1.2.2.4 2007/01/22 23:10:01 lhh Exp $ # # Common helper functions for the OCF Resource Agents supplied by # heartbeat. --- cluster/rgmanager/src/utils/clustat.c 2006/11/03 16:29:59 1.5.2.3.6.9 +++ cluster/rgmanager/src/utils/clustat.c 2007/01/22 23:10:01 1.5.2.3.6.10 @@ -358,14 +358,14 @@ } -void +int txt_rg_states(rg_state_list_t *rgl, cluster_member_list_t *members, char *svcname, int flags) { - int x; + int x, ret = 0; if (!rgl || !members) - return; + return -1; if (!(flags & RG_VERBOSE)) { printf(" %-20.20s %-30.30s %-14.14s\n", @@ -382,18 +382,31 @@ strcmp(rgl->rgl_states[x].rs_name, svcname)) continue; txt_rg_state(&rgl->rgl_states[x], members, flags); + if (svcname) { + switch (rgl->rgl_states[x].rs_state) { + case RG_STATE_STARTING: + case RG_STATE_STARTED: + case RG_STATE_STOPPING: + break; + default: + ret = rgl->rgl_states[x].rs_state; + } + } } + + return ret; } -void +int xml_rg_states(rg_state_list_t *rgl, cluster_member_list_t *members, char *svcname) { int x; + int ret = 0; if (!rgl || !members) - return; + return -1; printf(" \n"); @@ -401,14 +414,23 @@ if (svcname && strcmp(rgl->rgl_states[x].rs_name, svcname)) continue; - xml_rg_state(&rgl->rgl_states[x], members, 0); + if (svcname) { + switch (rgl->rgl_states[x].rs_state) { + case RG_STATE_STARTING: + case RG_STATE_STARTED: + case RG_STATE_STOPPING: + break; + default: + ret = rgl->rgl_states[x].rs_state; + } + } } printf(" \n"); + return ret; } - void txt_quorum_state(int qs) { @@ -481,14 +503,14 @@ } -void +int txt_member_states(cluster_member_list_t *membership, char *name) { - int x; + int x, ret = 0; if (!membership) { printf("Membership information not available\n"); - return; + return -1; } printf(" %-40.40s %s\n", "Member Name", "Status"); @@ -498,20 +520,22 @@ if (name && strcmp(membership->cml_members[x].cm_name, name)) continue; txt_member_state(&membership->cml_members[x]); + ret = !(membership->cml_members[x].cm_state & FLAG_UP); } printf("\n"); + return ret; } -void +int xml_member_states(cluster_member_list_t *membership, char *name) { - int x; + int x, ret = 0; if (!membership) { printf(" \n"); - return; + return -1; } printf(" \n"); @@ -519,16 +543,22 @@ if (name && strcmp(membership->cml_members[x].cm_name, name)) continue; xml_member_state(&membership->cml_members[x]); + if (name) + ret = !(membership->cml_members[x].cm_state & FLAG_UP); } printf(" \n"); + + return ret; } -void +int txt_cluster_status(int qs, cluster_member_list_t *membership, rg_state_list_t *rgs, char *name, char *svcname, int flags) { + int ret; + if (!svcname && !name) { txt_quorum_state(qs); if (!membership || !(qs & QF_GROUPMEMBER)) { @@ -538,50 +568,43 @@ } if (!svcname || (name && svcname)) - txt_member_states(membership, name); + ret = txt_member_states(membership, name); + if (name && !svcname) + return ret; if (!name || (name && svcname)) - txt_rg_states(rgs, membership, svcname, flags); + ret = txt_rg_states(rgs, membership, svcname, flags); + return ret; } -void +int xml_cluster_status(int qs, cluster_member_list_t *membership, rg_state_list_t *rgs, char *name, char *svcname, int flags) { + int ret1 = 0, ret2 = -1; + printf("\n"); printf("\n"); if (!svcname && !name) xml_quorum_state(qs); if (!svcname || (name && svcname)) - xml_member_states(membership, name); + ret1 = xml_member_states(membership, name); + if (rgs && (!name || (name && svcname))) - xml_rg_states(rgs, membership, svcname); + ret2 = xml_rg_states(rgs, membership, svcname); printf("\n"); + + if (name && ret1) + return ret1; + if (svcname && ret2) + return ret2; + return 0; } -void -dump_node(cluster_member_t *node) -{ - printf("Node %s state %02x\n", node->cm_name, node->cm_state); -} - - -void -dump_nodes(cluster_member_list_t *nodes) -{ - int x; - - for (x=0; xcml_count; x++) { - dump_node(&nodes->cml_members[x]); - } -} - - - cluster_member_list_t * build_member_list(uint64_t *lid) { @@ -778,11 +801,13 @@ } if (xml) - xml_cluster_status(qs, membership, rgs, member_name, - rg_name,flags); + ret = xml_cluster_status(qs, membership, rgs, + member_name, rg_name, + flags); else - txt_cluster_status(qs, membership, rgs, member_name, - rg_name,flags); + ret = txt_cluster_status(qs, membership, rgs, + member_name, rg_name, + flags); if (membership) cml_free(membership); --- cluster/rgmanager/src/utils/clusvcadm.c 2006/06/16 20:07:47 1.2.2.3.6.4 +++ cluster/rgmanager/src/utils/clusvcadm.c 2007/01/22 23:10:01 1.2.2.3.6.5 @@ -37,11 +37,14 @@ void -build_message(SmMessageSt *msgp, int action, char *svcName, uint64_t target) +build_message(SmMessageSt *msgp, int action, char *svcName, uint64_t target, + uint32_t arg1, uint32_t arg2) { msgp->sm_hdr.gh_magic = GENERIC_HDR_MAGIC; msgp->sm_hdr.gh_command = RG_ACTION_REQUEST; msgp->sm_hdr.gh_length = sizeof(*msgp); + msgp->sm_hdr.gh_arg1 = arg1; + msgp->sm_hdr.gh_arg2 = arg2; msgp->sm_data.d_action = action; strncpy(msgp->sm_data.d_svcName, svcName, sizeof(msgp->sm_data.d_svcName)); @@ -147,14 +150,53 @@ } +int +do_msg_receive(uint64_t msgtarget, int fd, void *buf, size_t len) +{ + int ret; + cluster_member_list_t *m = NULL; + + if ((int64_t)msgtarget < (int64_t)0) + return msg_receive(fd, buf, len); + + /* Make sure a node hasn't died while processing our request. */ + do { + ret = msg_receive_timeout(fd, buf, len, 20); + if (ret < (int)len) { + if (ret < 0 && errno == ETIMEDOUT) { + m = clu_member_list(RG_SERVICE_GROUP); + if (!memb_online(m, msgtarget)) { + ret = RG_ENODEDEATH; + break; + } + cml_free(m); + m = NULL; + continue; + } + + /* Make sure we don't overwrite ENODEDEATH */ + if (ret < 0) + ret = -1; + } + break; + } while(1); + + if (m) + cml_free(m); + return ret; +} + + void usage(char *name) { printf("Resource Group Control Commands:\n"); printf(" %s -v Display version and exit\n",name); printf(" %s -d Disable \n", name); -printf(" %s -e Enable \n", +printf(" %s -e Enable on the local node\n", name); +printf(" %s -e -F Enable according to failover\n" + " domain rules\n", name); printf(" %s -e -m Enable " " on \n", name); printf(" %s -r -m Relocate [to ]\n", @@ -182,7 +224,7 @@ extern char *optarg; char *svcname=NULL, nodename[256]; int opt; - int msgfd = -1, fd; + int msgfd = -1, fd, fod = 0; SmMessageSt msg; int action = RG_STATUS; int node_specified = 0; @@ -195,7 +237,7 @@ return 1; } - while ((opt = getopt(argc, argv, "lSue:d:r:n:m:vR:s:qh?")) != EOF) { + while ((opt = getopt(argc, argv, "lSue:d:r:Fn:m:vR:s:qh?")) != EOF) { switch (opt) { case 'l': return do_lock(); @@ -212,6 +254,14 @@ action = RG_ENABLE; svcname = optarg; break; + case 'F': + if (node_specified) { + fprintf(stderr, + "Cannot use '-F' with '-n' or '-m'\n"); + return 1; + } + fod = 1; + break; case 'd': /* DISABLE */ actionstr = "disabling"; @@ -237,7 +287,11 @@ break; case 'm': /* member ... */ case 'n': /* node .. same thing */ - + if (fod) { + fprintf(stderr, + "Cannot use '-F' with '-n' or '-m'\n"); + return 1; + } strncpy(nodename,optarg,sizeof(nodename)); node_specified = 1; break; @@ -259,7 +313,6 @@ usage(basename(argv[0])); return 1; } - /* No login */ fd = clu_connect(RG_SERVICE_GROUP, 0); @@ -286,7 +339,7 @@ sizeof(nodename)); } - build_message(&msg, action, svcname, svctarget); + build_message(&msg, action, svcname, svctarget, fod, 0); if (action != RG_RELOCATE) { printf("Member %s %s %s", nodename, actionstr, svcname); @@ -294,10 +347,15 @@ fflush(stdout); msgfd = msg_open(msgtarget, RG_PORT, 0, 5); } else { - printf("Trying to relocate %s to %s", svcname, nodename); + if (node_specified) + printf("Trying to relocate %s to %s", svcname, nodename); + else + printf("Trying to relocate %s", svcname); printf("..."); fflush(stdout); msgfd = msg_open(me, RG_PORT, 0, 5); + /* just do a normal receive from the local node */ + msgtarget = (uint64_t)-1; } if (msgfd < 0) { @@ -312,21 +370,59 @@ return 1; } - if (msg_receive(msgfd, &msg, sizeof(msg)) != sizeof(msg)) { - perror("msg_receive"); - fprintf(stderr, "Error receiving reply!\n"); - return 1; + /* reusing opt */ + opt = do_msg_receive(msgtarget, msgfd, &msg, + sizeof(msg)); + if (opt < (int)sizeof(msg)) { + if (opt != RG_ENODEDEATH) { + perror("msg_receive"); + fprintf(stderr, "Error receiving reply!\n"); + return 1; + } + + /* + * XXX hack to enable node death processing along side + * all the rest of the possible responses. If an end-node + * died while processing, this will have been set by the + * rgmanager and a response with RG_ENODEDEATH as the d_ret + * would have been received. + */ + msg.sm_data.d_ret = RG_ENODEDEATH; + swab_SmMessageSt(&msg); } - + /* Decode */ swab_SmMessageSt(&msg); switch (msg.sm_data.d_ret) { case SUCCESS: printf("success\n"); + + /* Non-start/relo request: done */ + if (action != RG_RELOCATE && action != RG_ENABLE) + break; + + if (svctarget != NODE_ID_NONE && + msg.sm_data.d_svcOwner != svctarget) { + /* Service running somewhere besides where requested */ + printf("Warning: Service %s is running on %s " + "instead of %s\n", svcname, + memb_id_to_name(membership, + msg.sm_data.d_svcOwner), + memb_id_to_name(membership, svctarget)); + break; + } + + /* No node specified or service running where requested */ + printf("Service %s is now running on %s\n", svcname, + memb_id_to_name(membership, msg.sm_data.d_svcOwner)); break; case RG_EFAIL: printf("failed\n"); break; + case RG_ENODEDEATH: + printf("node processing request died\n"); + printf("(Status unknown)\n"); + break; case RG_EABORT: printf("cancelled by resource manager\n"); break; @@ -339,6 +435,10 @@ case RG_EAGAIN: printf("failed: Try again (resource groups locked)\n"); break; + case RG_ERUN: + printf("failed: Service is already running\n"); + return 0; + break; default: printf("failed: unknown reason %d\n", msg.sm_data.d_ret); break;