xref: /titanic_41/usr/src/cmd/lvm/util/medstat.c (revision 2a8d6eba033e4713ab12b61178f0513f1f075482)
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