xref: /onnv-gate/usr/src/cmd/lvm/util/medstat.c (revision 8979:eba3282e25c3)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*8979SRameshkumar.Ramasamy@Sun.COM  * Common Development and Distribution License (the "License").
6*8979SRameshkumar.Ramasamy@Sun.COM  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
210Sstevel@tonic-gate /*
22*8979SRameshkumar.Ramasamy@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
230Sstevel@tonic-gate  * Use is subject to license terms.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate /*
270Sstevel@tonic-gate  * mediator status utility.
280Sstevel@tonic-gate  */
290Sstevel@tonic-gate 
300Sstevel@tonic-gate #include <meta.h>
310Sstevel@tonic-gate #include <sdssc.h>
320Sstevel@tonic-gate 
330Sstevel@tonic-gate static void
usage(mdsetname_t * sp,char * string)340Sstevel@tonic-gate usage(
350Sstevel@tonic-gate 	mdsetname_t	*sp,
360Sstevel@tonic-gate 	char		*string)
370Sstevel@tonic-gate {
380Sstevel@tonic-gate 	if ((string != NULL) && (*string != '\0'))
390Sstevel@tonic-gate 		md_eprintf("%s\n", string);
400Sstevel@tonic-gate 	(void) fprintf(stderr, gettext(
410Sstevel@tonic-gate 	    "usage:	%s [-q] -s setname\n"),
42*8979SRameshkumar.Ramasamy@Sun.COM 	    myname);
430Sstevel@tonic-gate 	md_exit(sp, (string == NULL) ? 0 : 1);
440Sstevel@tonic-gate }
450Sstevel@tonic-gate 
460Sstevel@tonic-gate /*
470Sstevel@tonic-gate  * parse args and do it
480Sstevel@tonic-gate  */
490Sstevel@tonic-gate int
main(int argc,char * argv[])500Sstevel@tonic-gate main(
510Sstevel@tonic-gate 	int			argc,
520Sstevel@tonic-gate 	char			*argv[]
530Sstevel@tonic-gate )
540Sstevel@tonic-gate {
550Sstevel@tonic-gate 	int			c;
560Sstevel@tonic-gate 	char			*sname = MD_LOCAL_NAME;
570Sstevel@tonic-gate 	md_error_t		status = mdnullerror;
580Sstevel@tonic-gate 	md_error_t		*ep = &status;
590Sstevel@tonic-gate 	mdsetname_t		*sp = NULL;
60*8979SRameshkumar.Ramasamy@Sun.COM 	md_set_desc		*sd;
61*8979SRameshkumar.Ramasamy@Sun.COM 	int			i;
62*8979SRameshkumar.Ramasamy@Sun.COM 	md_h_t			mdh;
63*8979SRameshkumar.Ramasamy@Sun.COM 	med_data_t		medd;
64*8979SRameshkumar.Ramasamy@Sun.COM 	int			medok = 0;
65*8979SRameshkumar.Ramasamy@Sun.COM 	int			golden = 0;
660Sstevel@tonic-gate 	int			verbose = 1;
670Sstevel@tonic-gate 
680Sstevel@tonic-gate 	/*
690Sstevel@tonic-gate 	 * Get the locale set up before calling any other routines
700Sstevel@tonic-gate 	 * with messages to ouput.  Just in case we're not in a build
710Sstevel@tonic-gate 	 * environment, make sure that TEXT_DOMAIN gets set to
720Sstevel@tonic-gate 	 * something.
730Sstevel@tonic-gate 	 */
740Sstevel@tonic-gate #if !defined(TEXT_DOMAIN)
750Sstevel@tonic-gate #define	TEXT_DOMAIN "SYS_TEST"
760Sstevel@tonic-gate #endif
770Sstevel@tonic-gate 	(void) setlocale(LC_ALL, "");
780Sstevel@tonic-gate 	(void) textdomain(TEXT_DOMAIN);
790Sstevel@tonic-gate 
807044Smk117520 	/*
817044Smk117520 	 * There is no need to proxy the command to owner of the set
827044Smk117520 	 * to get the mediator information as the /etc/lvm/meddb file
837044Smk117520 	 * contains the required information and so it can be used.
847044Smk117520 	 */
857044Smk117520 	if ((sdssc_bind_library() == SDSSC_ERROR))  {
867044Smk117520 		(void) fprintf(stderr,
877044Smk117520 		    "Failed to initialised libscsds.so.1\n");
887044Smk117520 		exit(1);
897044Smk117520 	}
907044Smk117520 
910Sstevel@tonic-gate 	/* initialize */
920Sstevel@tonic-gate 	if (md_init(argc, argv, 0, 1, ep) != 0) {
930Sstevel@tonic-gate 		mde_perror(ep, "");
940Sstevel@tonic-gate 		md_exit(sp, 1);
950Sstevel@tonic-gate 	}
960Sstevel@tonic-gate 
970Sstevel@tonic-gate 	optind = 1;
980Sstevel@tonic-gate 	opterr = 1;
990Sstevel@tonic-gate 	while ((c = getopt(argc, argv, "qs:?")) != -1) {
1000Sstevel@tonic-gate 		switch (c) {
101*8979SRameshkumar.Ramasamy@Sun.COM 		case 'q':
102*8979SRameshkumar.Ramasamy@Sun.COM 			verbose = 0;
103*8979SRameshkumar.Ramasamy@Sun.COM 			break;
104*8979SRameshkumar.Ramasamy@Sun.COM 		case 's':
105*8979SRameshkumar.Ramasamy@Sun.COM 			sname = optarg;
106*8979SRameshkumar.Ramasamy@Sun.COM 			break;
107*8979SRameshkumar.Ramasamy@Sun.COM 		case '?':
108*8979SRameshkumar.Ramasamy@Sun.COM 			if (optopt == '?')
109*8979SRameshkumar.Ramasamy@Sun.COM 				usage(sp, NULL);
110*8979SRameshkumar.Ramasamy@Sun.COM 			/*FALLTHROUGH*/
111*8979SRameshkumar.Ramasamy@Sun.COM 		default:
1120Sstevel@tonic-gate 			usage(sp, gettext("unknown command"));
1130Sstevel@tonic-gate 		}
1140Sstevel@tonic-gate 	}
115*8979SRameshkumar.Ramasamy@Sun.COM 
1160Sstevel@tonic-gate 	/* must have set for everything else */
1170Sstevel@tonic-gate 	if (strcmp(sname, MD_LOCAL_NAME) == 0)
1180Sstevel@tonic-gate 		usage(sp, gettext("setname must be specified"));
1190Sstevel@tonic-gate 
1200Sstevel@tonic-gate 	/* snarf MDDB */
1210Sstevel@tonic-gate 	if (meta_setup_db_locations(ep) != 0) {
1220Sstevel@tonic-gate 		mde_perror(ep, "");
1230Sstevel@tonic-gate 		md_exit(sp, 1);
1240Sstevel@tonic-gate 	}
1250Sstevel@tonic-gate 
126*8979SRameshkumar.Ramasamy@Sun.COM 	if ((sp = metasetname(sname, ep)) != NULL) {
127*8979SRameshkumar.Ramasamy@Sun.COM 
128*8979SRameshkumar.Ramasamy@Sun.COM 		if ((sd = metaget_setdesc(sp, ep)) == NULL) {
129*8979SRameshkumar.Ramasamy@Sun.COM 			mde_perror(ep, "");
130*8979SRameshkumar.Ramasamy@Sun.COM 			md_exit(sp, 1);
131*8979SRameshkumar.Ramasamy@Sun.COM 		}
132*8979SRameshkumar.Ramasamy@Sun.COM 
133*8979SRameshkumar.Ramasamy@Sun.COM 		if (sd->sd_med.n_cnt == 0) {
134*8979SRameshkumar.Ramasamy@Sun.COM 			if (verbose)
135*8979SRameshkumar.Ramasamy@Sun.COM 				(void) printf(gettext("No mediator hosts"
136*8979SRameshkumar.Ramasamy@Sun.COM 				    "configured for set \"%s\".\n"), sname);
137*8979SRameshkumar.Ramasamy@Sun.COM 			md_exit(sp, 2);
138*8979SRameshkumar.Ramasamy@Sun.COM 		}
139*8979SRameshkumar.Ramasamy@Sun.COM 
140*8979SRameshkumar.Ramasamy@Sun.COM 		if (verbose)
141*8979SRameshkumar.Ramasamy@Sun.COM 			(void) printf("%8.8s\t\t%6.6s\t"
142*8979SRameshkumar.Ramasamy@Sun.COM 			    "%6.6s\n", gettext("Mediator"),
143*8979SRameshkumar.Ramasamy@Sun.COM 			    gettext("Status"), gettext("Golden"));
144*8979SRameshkumar.Ramasamy@Sun.COM 
145*8979SRameshkumar.Ramasamy@Sun.COM 		for (i = 0; i < MED_MAX_HOSTS; i++) {
146*8979SRameshkumar.Ramasamy@Sun.COM 
147*8979SRameshkumar.Ramasamy@Sun.COM 			if (sd->sd_med.n_lst[i].a_cnt == 0)
148*8979SRameshkumar.Ramasamy@Sun.COM 				continue;
149*8979SRameshkumar.Ramasamy@Sun.COM 
150*8979SRameshkumar.Ramasamy@Sun.COM 			(void) memset(&medd, '\0', sizeof (medd));
151*8979SRameshkumar.Ramasamy@Sun.COM 			(void) memset(&mdh, '\0', sizeof (mdh));
152*8979SRameshkumar.Ramasamy@Sun.COM 			mdh = sd->sd_med.n_lst[i];
153*8979SRameshkumar.Ramasamy@Sun.COM 
154*8979SRameshkumar.Ramasamy@Sun.COM 			if (verbose)
155*8979SRameshkumar.Ramasamy@Sun.COM 				(void) printf("%-17.17s\t",
156*8979SRameshkumar.Ramasamy@Sun.COM 				    sd->sd_med.n_lst[i].a_nm[0]);
157*8979SRameshkumar.Ramasamy@Sun.COM 
158*8979SRameshkumar.Ramasamy@Sun.COM 			if (clnt_med_get_data(&mdh, sp, &medd, ep) == -1) {
159*8979SRameshkumar.Ramasamy@Sun.COM 				if (mdanyrpcerror(ep)) {
160*8979SRameshkumar.Ramasamy@Sun.COM 					if (verbose)
161*8979SRameshkumar.Ramasamy@Sun.COM 						(void) printf("%s\n",
162*8979SRameshkumar.Ramasamy@Sun.COM 						    gettext("Unreachable"));
163*8979SRameshkumar.Ramasamy@Sun.COM 				continue;
164*8979SRameshkumar.Ramasamy@Sun.COM 				} else if (mdiserror(ep, MDE_MED_ERROR)) {
165*8979SRameshkumar.Ramasamy@Sun.COM 					if (verbose)
166*8979SRameshkumar.Ramasamy@Sun.COM 						(void) printf("%s\n",
167*8979SRameshkumar.Ramasamy@Sun.COM 						    gettext("Bad"));
168*8979SRameshkumar.Ramasamy@Sun.COM 				} else {
169*8979SRameshkumar.Ramasamy@Sun.COM 					if (verbose)
170*8979SRameshkumar.Ramasamy@Sun.COM 						(void) printf("%s\n",
171*8979SRameshkumar.Ramasamy@Sun.COM 						    gettext("Fatal"));
172*8979SRameshkumar.Ramasamy@Sun.COM 				}
173*8979SRameshkumar.Ramasamy@Sun.COM 				mde_perror(ep, "");
174*8979SRameshkumar.Ramasamy@Sun.COM 				if (mdiserror(ep, MDE_MED_ERROR))
175*8979SRameshkumar.Ramasamy@Sun.COM 					continue;
176*8979SRameshkumar.Ramasamy@Sun.COM 				md_exit(sp, 1);
177*8979SRameshkumar.Ramasamy@Sun.COM 			}
178*8979SRameshkumar.Ramasamy@Sun.COM 
179*8979SRameshkumar.Ramasamy@Sun.COM 			if (verbose)
180*8979SRameshkumar.Ramasamy@Sun.COM 				(void) printf("%s", gettext("Ok"));
181*8979SRameshkumar.Ramasamy@Sun.COM 
182*8979SRameshkumar.Ramasamy@Sun.COM 			if (medd.med_dat_fl & MED_DFL_GOLDEN) {
183*8979SRameshkumar.Ramasamy@Sun.COM 				if (verbose)
184*8979SRameshkumar.Ramasamy@Sun.COM 					(void) printf("\t%s",
185*8979SRameshkumar.Ramasamy@Sun.COM 					    gettext("Yes"));
186*8979SRameshkumar.Ramasamy@Sun.COM 				golden++;
187*8979SRameshkumar.Ramasamy@Sun.COM 			} else {
188*8979SRameshkumar.Ramasamy@Sun.COM 				if (verbose)
189*8979SRameshkumar.Ramasamy@Sun.COM 					(void) printf("\t%s", gettext("No"));
190*8979SRameshkumar.Ramasamy@Sun.COM 			}
191*8979SRameshkumar.Ramasamy@Sun.COM 
192*8979SRameshkumar.Ramasamy@Sun.COM 			if (verbose)
193*8979SRameshkumar.Ramasamy@Sun.COM 				(void) printf("\n");
194*8979SRameshkumar.Ramasamy@Sun.COM 
195*8979SRameshkumar.Ramasamy@Sun.COM 			medok++;
196*8979SRameshkumar.Ramasamy@Sun.COM 		}
197*8979SRameshkumar.Ramasamy@Sun.COM 
198*8979SRameshkumar.Ramasamy@Sun.COM 		if (golden)
199*8979SRameshkumar.Ramasamy@Sun.COM 			md_exit(sp, 0);
200*8979SRameshkumar.Ramasamy@Sun.COM 
201*8979SRameshkumar.Ramasamy@Sun.COM 		if (medok < ((sd->sd_med.n_cnt / 2) + 1))
202*8979SRameshkumar.Ramasamy@Sun.COM 			md_exit(sp, 1);
203*8979SRameshkumar.Ramasamy@Sun.COM 
204*8979SRameshkumar.Ramasamy@Sun.COM 		md_exit(sp, 0);
205*8979SRameshkumar.Ramasamy@Sun.COM 	}
206*8979SRameshkumar.Ramasamy@Sun.COM 
2077044Smk117520 	/*
208*8979SRameshkumar.Ramasamy@Sun.COM 	 * Print the mediator status using /etc/lvm/meddb if host is not
209*8979SRameshkumar.Ramasamy@Sun.COM 	 * part of metaset but part of mediators.
2107044Smk117520 	 */
2110Sstevel@tonic-gate 
2127044Smk117520 	if (meta_mediator_info_from_file(sname, verbose, ep)) {
2130Sstevel@tonic-gate 		md_exit(sp, 1);
2140Sstevel@tonic-gate 	}
2150Sstevel@tonic-gate 
2160Sstevel@tonic-gate 	md_exit(sp, 0);
2177044Smk117520 	/* NOTREACHED */
2180Sstevel@tonic-gate 	return (0);
2190Sstevel@tonic-gate }
220