66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * CDDL HEADER START
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * The contents of this file are subject to the terms of the
66448911ac89c254e89afc52e114402115a497e3David Höppner * Common Development and Distribution License (the "License").
66448911ac89c254e89afc52e114402115a497e3David Höppner * You may not use this file except in compliance with the License.
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
66448911ac89c254e89afc52e114402115a497e3David Höppner * or http://www.opensolaris.org/os/licensing.
66448911ac89c254e89afc52e114402115a497e3David Höppner * See the License for the specific language governing permissions
66448911ac89c254e89afc52e114402115a497e3David Höppner * and limitations under the License.
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * When distributing Covered Code, include this CDDL HEADER in each
66448911ac89c254e89afc52e114402115a497e3David Höppner * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
66448911ac89c254e89afc52e114402115a497e3David Höppner * If applicable, add the following below this CDDL HEADER, with the
66448911ac89c254e89afc52e114402115a497e3David Höppner * fields enclosed by brackets "[]" replaced with your own identifying
66448911ac89c254e89afc52e114402115a497e3David Höppner * information: Portions Copyright [yyyy] [name of copyright owner]
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * CDDL HEADER END
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
66448911ac89c254e89afc52e114402115a497e3David Höppner * Use is subject to license terms.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * mediator status utility.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <meta.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <sdssc.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerusage(
66448911ac89c254e89afc52e114402115a497e3David Höppner mdsetname_t *sp,
66448911ac89c254e89afc52e114402115a497e3David Höppner char *string)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner if ((string != NULL) && (*string != '\0'))
66448911ac89c254e89afc52e114402115a497e3David Höppner md_eprintf("%s\n", string);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "usage: %s [-q] -s setname\n"),
66448911ac89c254e89afc52e114402115a497e3David Höppner myname);
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, (string == NULL) ? 0 : 1);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * parse args and do it
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerint
66448911ac89c254e89afc52e114402115a497e3David Höppnermain(
66448911ac89c254e89afc52e114402115a497e3David Höppner int argc,
66448911ac89c254e89afc52e114402115a497e3David Höppner char *argv[]
66448911ac89c254e89afc52e114402115a497e3David Höppner)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner int c;
66448911ac89c254e89afc52e114402115a497e3David Höppner char *sname = MD_LOCAL_NAME;
66448911ac89c254e89afc52e114402115a497e3David Höppner md_error_t status = mdnullerror;
66448911ac89c254e89afc52e114402115a497e3David Höppner md_error_t *ep = &status;
66448911ac89c254e89afc52e114402115a497e3David Höppner mdsetname_t *sp = NULL;
66448911ac89c254e89afc52e114402115a497e3David Höppner md_set_desc *sd;
66448911ac89c254e89afc52e114402115a497e3David Höppner int i;
66448911ac89c254e89afc52e114402115a497e3David Höppner md_h_t mdh;
66448911ac89c254e89afc52e114402115a497e3David Höppner med_data_t medd;
66448911ac89c254e89afc52e114402115a497e3David Höppner int medok = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner int golden = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner int verbose = 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Get the locale set up before calling any other routines
66448911ac89c254e89afc52e114402115a497e3David Höppner * with messages to ouput. Just in case we're not in a build
66448911ac89c254e89afc52e114402115a497e3David Höppner * environment, make sure that TEXT_DOMAIN gets set to
66448911ac89c254e89afc52e114402115a497e3David Höppner * something.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner#if !defined(TEXT_DOMAIN)
66448911ac89c254e89afc52e114402115a497e3David Höppner#define TEXT_DOMAIN "SYS_TEST"
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) setlocale(LC_ALL, "");
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) textdomain(TEXT_DOMAIN);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * There is no need to proxy the command to owner of the set
66448911ac89c254e89afc52e114402115a497e3David Höppner * to get the mediator information as the /etc/lvm/meddb file
66448911ac89c254e89afc52e114402115a497e3David Höppner * contains the required information and so it can be used.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner if ((sdssc_bind_library() == SDSSC_ERROR)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr,
66448911ac89c254e89afc52e114402115a497e3David Höppner "Failed to initialised libscsds.so.1\n");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(1);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* initialize */
66448911ac89c254e89afc52e114402115a497e3David Höppner if (md_init(argc, argv, 0, 1, ep) != 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner mde_perror(ep, "");
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 1);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner optind = 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner opterr = 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner while ((c = getopt(argc, argv, "qs:?")) != -1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner switch (c) {
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'q':
66448911ac89c254e89afc52e114402115a497e3David Höppner verbose = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 's':
66448911ac89c254e89afc52e114402115a497e3David Höppner sname = optarg;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case '?':
66448911ac89c254e89afc52e114402115a497e3David Höppner if (optopt == '?')
66448911ac89c254e89afc52e114402115a497e3David Höppner usage(sp, NULL);
66448911ac89c254e89afc52e114402115a497e3David Höppner /*FALLTHROUGH*/
66448911ac89c254e89afc52e114402115a497e3David Höppner default:
66448911ac89c254e89afc52e114402115a497e3David Höppner usage(sp, gettext("unknown command"));
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* must have set for everything else */
66448911ac89c254e89afc52e114402115a497e3David Höppner if (strcmp(sname, MD_LOCAL_NAME) == 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner usage(sp, gettext("setname must be specified"));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* snarf MDDB */
66448911ac89c254e89afc52e114402115a497e3David Höppner if (meta_setup_db_locations(ep) != 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner mde_perror(ep, "");
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 1);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if ((sp = metasetname(sname, ep)) != NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if ((sd = metaget_setdesc(sp, ep)) == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner mde_perror(ep, "");
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 1);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (sd->sd_med.n_cnt == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf(gettext("No mediator hosts"
66448911ac89c254e89afc52e114402115a497e3David Höppner "configured for set \"%s\".\n"), sname);
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 2);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("%8.8s\t\t%6.6s\t"
66448911ac89c254e89afc52e114402115a497e3David Höppner "%6.6s\n", gettext("Mediator"),
66448911ac89c254e89afc52e114402115a497e3David Höppner gettext("Status"), gettext("Golden"));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (i = 0; i < MED_MAX_HOSTS; i++) {
861bfc8941f2c557f1bcb7a6d7f62f9da98ee4dbTheo Schlossnagle
66448911ac89c254e89afc52e114402115a497e3David Höppner if (sd->sd_med.n_lst[i].a_cnt == 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) memset(&medd, '\0', sizeof (medd));
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) memset(&mdh, '\0', sizeof (mdh));
66448911ac89c254e89afc52e114402115a497e3David Höppner mdh = sd->sd_med.n_lst[i];
e633f2d79475b51f0a4d46972282225abf851733Richard Lowe
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("%-17.17s\t",
66448911ac89c254e89afc52e114402115a497e3David Höppner sd->sd_med.n_lst[i].a_nm[0]);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (clnt_med_get_data(&mdh, sp, &medd, ep) == -1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (mdanyrpcerror(ep)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("%s\n",
66448911ac89c254e89afc52e114402115a497e3David Höppner gettext("Unreachable"));
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (mdiserror(ep, MDE_MED_ERROR)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("%s\n",
66448911ac89c254e89afc52e114402115a497e3David Höppner gettext("Bad"));
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("%s\n",
66448911ac89c254e89afc52e114402115a497e3David Höppner gettext("Fatal"));
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner mde_perror(ep, "");
66448911ac89c254e89afc52e114402115a497e3David Höppner if (mdiserror(ep, MDE_MED_ERROR))
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 1);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("%s", gettext("Ok"));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (medd.med_dat_fl & MED_DFL_GOLDEN) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("\t%s",
66448911ac89c254e89afc52e114402115a497e3David Höppner gettext("Yes"));
66448911ac89c254e89afc52e114402115a497e3David Höppner golden++;
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("\t%s", gettext("No"));
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (verbose)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) printf("\n");
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner medok++;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (golden)
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (medok < ((sd->sd_med.n_cnt / 2) + 1))
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 1);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print the mediator status using /etc/lvm/meddb if host is not
66448911ac89c254e89afc52e114402115a497e3David Höppner * part of metaset but part of mediators.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (meta_mediator_info_from_file(sname, verbose, ep)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 1);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner md_exit(sp, 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner /* NOTREACHED */
66448911ac89c254e89afc52e114402115a497e3David Höppner return (0);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner