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
usage(mdsetname_t * sp,char * string)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
main(int argc,char * argv[])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