Home | History | Annotate | Download | only in util
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 /*
     27  * mediator status utility.
     28  */
     29 
     30 #include <meta.h>
     31 #include <sdssc.h>
     32 
     33 static void
     34 usage(
     35 	mdsetname_t	*sp,
     36 	char		*string)
     37 {
     38 	if ((string != NULL) && (*string != '\0'))
     39 		md_eprintf("%s\n", string);
     40 	(void) fprintf(stderr, gettext(
     41 	    "usage:	%s [-q] -s setname\n"),
     42 	    myname);
     43 	md_exit(sp, (string == NULL) ? 0 : 1);
     44 }
     45 
     46 /*
     47  * parse args and do it
     48  */
     49 int
     50 main(
     51 	int			argc,
     52 	char			*argv[]
     53 )
     54 {
     55 	int			c;
     56 	char			*sname = MD_LOCAL_NAME;
     57 	md_error_t		status = mdnullerror;
     58 	md_error_t		*ep = &status;
     59 	mdsetname_t		*sp = NULL;
     60 	md_set_desc		*sd;
     61 	int			i;
     62 	md_h_t			mdh;
     63 	med_data_t		medd;
     64 	int			medok = 0;
     65 	int			golden = 0;
     66 	int			verbose = 1;
     67 
     68 	/*
     69 	 * Get the locale set up before calling any other routines
     70 	 * with messages to ouput.  Just in case we're not in a build
     71 	 * environment, make sure that TEXT_DOMAIN gets set to
     72 	 * something.
     73 	 */
     74 #if !defined(TEXT_DOMAIN)
     75 #define	TEXT_DOMAIN "SYS_TEST"
     76 #endif
     77 	(void) setlocale(LC_ALL, "");
     78 	(void) textdomain(TEXT_DOMAIN);
     79 
     80 	/*
     81 	 * There is no need to proxy the command to owner of the set
     82 	 * to get the mediator information as the /etc/lvm/meddb file
     83 	 * contains the required information and so it can be used.
     84 	 */
     85 	if ((sdssc_bind_library() == SDSSC_ERROR))  {
     86 		(void) fprintf(stderr,
     87 		    "Failed to initialised libscsds.so.1\n");
     88 		exit(1);
     89 	}
     90 
     91 	/* initialize */
     92 	if (md_init(argc, argv, 0, 1, ep) != 0) {
     93 		mde_perror(ep, "");
     94 		md_exit(sp, 1);
     95 	}
     96 
     97 	optind = 1;
     98 	opterr = 1;
     99 	while ((c = getopt(argc, argv, "qs:?")) != -1) {
    100 		switch (c) {
    101 		case 'q':
    102 			verbose = 0;
    103 			break;
    104 		case 's':
    105 			sname = optarg;
    106 			break;
    107 		case '?':
    108 			if (optopt == '?')
    109 				usage(sp, NULL);
    110 			/*FALLTHROUGH*/
    111 		default:
    112 			usage(sp, gettext("unknown command"));
    113 		}
    114 	}
    115 
    116 	/* must have set for everything else */
    117 	if (strcmp(sname, MD_LOCAL_NAME) == 0)
    118 		usage(sp, gettext("setname must be specified"));
    119 
    120 	/* snarf MDDB */
    121 	if (meta_setup_db_locations(ep) != 0) {
    122 		mde_perror(ep, "");
    123 		md_exit(sp, 1);
    124 	}
    125 
    126 	if ((sp = metasetname(sname, ep)) != NULL) {
    127 
    128 		if ((sd = metaget_setdesc(sp, ep)) == NULL) {
    129 			mde_perror(ep, "");
    130 			md_exit(sp, 1);
    131 		}
    132 
    133 		if (sd->sd_med.n_cnt == 0) {
    134 			if (verbose)
    135 				(void) printf(gettext("No mediator hosts"
    136 				    "configured for set \"%s\".\n"), sname);
    137 			md_exit(sp, 2);
    138 		}
    139 
    140 		if (verbose)
    141 			(void) printf("%8.8s\t\t%6.6s\t"
    142 			    "%6.6s\n", gettext("Mediator"),
    143 			    gettext("Status"), gettext("Golden"));
    144 
    145 		for (i = 0; i < MED_MAX_HOSTS; i++) {
    146 
    147 			if (sd->sd_med.n_lst[i].a_cnt == 0)
    148 				continue;
    149 
    150 			(void) memset(&medd, '\0', sizeof (medd));
    151 			(void) memset(&mdh, '\0', sizeof (mdh));
    152 			mdh = sd->sd_med.n_lst[i];
    153 
    154 			if (verbose)
    155 				(void) printf("%-17.17s\t",
    156 				    sd->sd_med.n_lst[i].a_nm[0]);
    157 
    158 			if (clnt_med_get_data(&mdh, sp, &medd, ep) == -1) {
    159 				if (mdanyrpcerror(ep)) {
    160 					if (verbose)
    161 						(void) printf("%s\n",
    162 						    gettext("Unreachable"));
    163 				continue;
    164 				} else if (mdiserror(ep, MDE_MED_ERROR)) {
    165 					if (verbose)
    166 						(void) printf("%s\n",
    167 						    gettext("Bad"));
    168 				} else {
    169 					if (verbose)
    170 						(void) printf("%s\n",
    171 						    gettext("Fatal"));
    172 				}
    173 				mde_perror(ep, "");
    174 				if (mdiserror(ep, MDE_MED_ERROR))
    175 					continue;
    176 				md_exit(sp, 1);
    177 			}
    178 
    179 			if (verbose)
    180 				(void) printf("%s", gettext("Ok"));
    181 
    182 			if (medd.med_dat_fl & MED_DFL_GOLDEN) {
    183 				if (verbose)
    184 					(void) printf("\t%s",
    185 					    gettext("Yes"));
    186 				golden++;
    187 			} else {
    188 				if (verbose)
    189 					(void) printf("\t%s", gettext("No"));
    190 			}
    191 
    192 			if (verbose)
    193 				(void) printf("\n");
    194 
    195 			medok++;
    196 		}
    197 
    198 		if (golden)
    199 			md_exit(sp, 0);
    200 
    201 		if (medok < ((sd->sd_med.n_cnt / 2) + 1))
    202 			md_exit(sp, 1);
    203 
    204 		md_exit(sp, 0);
    205 	}
    206 
    207 	/*
    208 	 * Print the mediator status using /etc/lvm/meddb if host is not
    209 	 * part of metaset but part of mediators.
    210 	 */
    211 
    212 	if (meta_mediator_info_from_file(sname, verbose, ep)) {
    213 		md_exit(sp, 1);
    214 	}
    215 
    216 	md_exit(sp, 0);
    217 	/* NOTREACHED */
    218 	return (0);
    219 }
    220