qa: update 660 to generate index.html, fixing pcp-testsuite runs
[pcp.git] / qa / src / pmcdgone.c
blobed3c43d546efcf8f670802f88b5ae23fad60957a
1 /*
2 * Copyright (c) 2012 Red Hat. All Rights Reserved.
3 * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved.
4 */
6 /*
7 * ping pmcd 4 times, kill off pmcd, ping 4 more times, restart pmcd,
8 * ping 4 more times ... and some reconnect attempts for good measure ...
9 * and some more pings ...
10 * sleep 10 seconds after change of state for pmcd
12 * Has to be run as root to control pmcd
15 #include <ctype.h>
16 #include <pcp/pmapi.h>
17 #include <pcp/impl.h>
19 #include "localconfig.h"
21 static pmResult *_store;
22 static pmDesc _desc;
23 static int _numinst;
24 static int *_instlist;
25 static char **_inamelist;
26 static int _text;
27 static int _indom_text;
28 static int ctlport;
30 static void
31 _ConnectLogger(void)
33 int n;
34 int pid = PM_LOG_PRIMARY_PID;
35 int port = PM_LOG_NO_PORT;
37 if ((n = __pmConnectLogger("localhost", &pid, &port)) < 0) {
38 printf("Cannot connect to primary pmlogger on \"localhost\": %s\n", pmErrStr(n));
39 exit(1);
41 ctlport = n;
44 static int
45 x_indom(int xpecterr)
47 int err = 0;
48 int n;
49 int j;
50 int numinst;
51 int *instlist;
52 char **inamelist;
53 char *name = NULL;
55 if ((numinst = pmGetInDom(_desc.indom, &instlist, &inamelist)) < 0) {
56 fprintf(stderr, "pmGetInDom: %s", pmErrStr(numinst));
57 if (xpecterr)
58 fprintf(stderr, " -- error expected\n");
59 else {
60 fprintf(stderr, "\n");
61 err++;
64 else {
65 free(instlist);
66 free(inamelist);
69 j = _numinst / 2;
71 if ((n = pmNameInDom(_desc.indom, _instlist[j], &name)) < 0) {
72 fprintf(stderr, "pmNameInDom: %s", pmErrStr(n));
73 if (xpecterr)
74 fprintf(stderr, " -- error expected\n");
75 else {
76 fprintf(stderr, "\n");
77 err++;
81 if ((n = pmLookupInDom(_desc.indom, name)) < 0) {
82 fprintf(stderr, "pmLookupInDom: %s", pmErrStr(n));
83 if (xpecterr)
84 fprintf(stderr, " -- error expected\n");
85 else {
86 fprintf(stderr, "\n");
87 err++;
90 else {
91 if (n != _instlist[j]) {
92 err++;
93 fprintf(stderr, "botch: pmLookupInDom returns 0x%x, expected 0x%x\n",
94 n, _instlist[j]);
96 free(name);
99 return err;
102 static int
103 exer(int numpmid, pmID *pmidlist, int xpecterr)
105 int i;
106 int j;
107 int n;
108 int err = 0;
109 pmDesc desc;
110 char *buf;
111 pmResult *resp, *lresp;
113 for (i = 0; i < 4; i++) {
114 if (!xpecterr)
115 fputc('.', stderr);
117 if ((n = pmLookupDesc(pmidlist[0], &desc)) < 0) {
118 fprintf(stderr, "pmLookupDesc: %s", pmErrStr(n));
119 if (xpecterr)
120 fprintf(stderr, " -- error expected\n");
121 else {
122 fprintf(stderr, "\n");
123 err++;
126 else if (xpecterr)
127 err++;
129 err += x_indom(xpecterr);
131 if ((n = pmLookupText(pmidlist[1], PM_TEXT_HELP, &buf)) < 0) {
132 fprintf(stderr, "pmLookupText: %s", pmErrStr(n));
133 if (xpecterr)
134 fprintf(stderr, " -- error expected\n");
135 else {
136 fprintf(stderr, "\n");
137 err++;
140 else {
141 if (xpecterr)
142 err++;
143 if (!_text) {
144 fprintf(stderr, "Text: %s\n", buf);
145 _text = 1;
147 free(buf);
150 if ((n = pmLookupInDomText(_desc.indom, PM_TEXT_HELP, &buf)) < 0) {
151 fprintf(stderr, "pmLookupInDomText: %s", pmErrStr(n));
152 if (xpecterr)
153 fprintf(stderr, " -- error expected\n");
154 else {
155 fprintf(stderr, "\n");
156 err++;
159 else {
160 if (xpecterr)
161 err++;
162 if (!_indom_text) {
163 fprintf(stderr, "InDomText: %s\n", buf);
164 _indom_text = 1;
166 free(buf);
169 if ((n = pmFetch(numpmid, pmidlist, &resp)) < 0) {
170 fprintf(stderr, "pmFetch: %s", pmErrStr(n));
171 if (xpecterr)
172 fprintf(stderr, " -- error expected\n");
173 else {
174 fprintf(stderr, "\n");
175 err++;
178 else {
179 if (xpecterr)
180 err++;
181 if (resp->numpmid != numpmid) {
182 err++;
183 __pmDumpResult(stderr, resp);
185 else for (j = 0; j < resp->numpmid; j++) {
186 if (resp->vset[j]->numval < 1) {
187 err++;
188 __pmDumpResult(stderr, resp);
189 break;
192 pmFreeResult(resp);
195 if ((n = pmStore(_store)) < 0) {
196 fprintf(stderr, "pmStore: %s", pmErrStr(n));
197 if (xpecterr)
198 fprintf(stderr, " -- error expected\n");
199 else {
200 fprintf(stderr, "\n");
201 err++;
204 else if (xpecterr)
205 err++;
207 if ((n = __pmControlLog(ctlport, _store, PM_LOG_ENQUIRE, 0, 0, &lresp)) < 0) {
208 fprintf(stderr, "__pmControlLog: %s", pmErrStr(n));
209 if (xpecterr)
210 fprintf(stderr, " -- error expected\n");
211 else {
212 fprintf(stderr, "\n");
213 err++;
216 else {
217 pmFreeResult(lresp);
221 if (!xpecterr)
222 fputc('\n', stderr);
225 return err;
229 main(int argc, char **argv)
231 int err = 0;
232 int sts;
233 int i;
234 int j;
235 char *namelist[4];
236 pmID pmidlist[4];
237 int n;
238 int numpmid;
239 int ctx0;
240 int ctx1;
241 int c;
242 int errflag = 0;
243 char *binadm = pmGetConfig("PCP_BINADM_DIR");
244 char path[MAXPATHLEN];
246 __pmSetProgname(argv[0]);
248 while ((c = getopt(argc, argv, "D:")) != EOF) {
249 switch (c) {
250 case 'D': /* debug flag */
251 sts = __pmParseDebug(optarg);
252 if (sts < 0) {
253 fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n",
254 pmProgname, optarg);
255 errflag++;
257 else
258 pmDebug |= sts;
259 break;
261 case '?':
262 default:
263 errflag++;
264 break;
268 if (errflag) {
269 fprintf(stderr,
270 "Usage: %s options ...\n\
272 Options:\n\
273 -D N set pmDebug debugging flag to N\n",
274 pmProgname);
275 exit(1);
278 #ifndef IS_MINGW
279 if ((n = geteuid()) != 0) {
280 fprintf(stderr, "pmcdgone: Must be run as root, not uid %d!\n", n);
281 exit(1);
283 #endif
285 if ((n = pmLoadNameSpace(PM_NS_DEFAULT)) < 0) {
286 fprintf(stderr, "pmLoadNameSpace: %s\n", pmErrStr(n));
287 exit(1);
290 if ((ctx0 = pmNewContext(PM_CONTEXT_HOST, "localhost")) < 0) {
291 fprintf(stderr, "pmNewContext: %s\n", pmErrStr(ctx0));
292 exit(1);
294 if ((ctx1 = pmNewContext(PM_CONTEXT_HOST, "localhost")) < 0) {
295 fprintf(stderr, "pmNewContext: %s\n", pmErrStr(ctx1));
296 exit(1);
298 _ConnectLogger();
300 i = 0;
301 namelist[i++] = "sample.long.write_me";
302 namelist[i++] = "sample.colour";
303 namelist[i++] = "sampledso.bin";
304 numpmid = i;
305 n = pmLookupName(numpmid, namelist, pmidlist);
306 if (n < 0) {
307 fprintf(stderr, "pmLookupName: %s\n", pmErrStr(n));
308 for (i = 0; i < numpmid; i++) {
309 if (pmidlist[i] == PM_ID_NULL)
310 fprintf(stderr, " %s - not known\n", namelist[i]);
312 exit(1);
314 if ((n = pmFetch(1, pmidlist, &_store)) < 0) {
315 fprintf(stderr, "initial pmFetch failed: %s\n", pmErrStr(n));
316 exit(1);
318 if ((n = pmLookupDesc(pmidlist[1], &_desc)) < 0) {
319 fprintf(stderr, "initial pmLookupDesc failed: %s\n", pmErrStr(n));
320 exit(1);
322 if ((_numinst = pmGetInDom(_desc.indom, &_instlist, &_inamelist)) < 0) {
323 fprintf(stderr, "initial pmGetInDom failed: %s\n", pmErrStr(n));
324 exit(1);
327 err += exer(numpmid, pmidlist, 0);
329 fprintf(stderr, "Kill off pmcd ...\n");
330 sts = system(". $PCP_DIR/etc/pcp.env; $PCP_RC_DIR/pcp stop");
331 if (sts != 0)
332 fprintf(stderr, "Warning: stop script returns %d\n", sts);
333 sleep(10);
334 _text = _indom_text = 0;
335 __pmCloseSocket(ctlport);
337 err += exer(numpmid, pmidlist, 1);
339 for (j = 0; j < 2; j++) {
340 if (j == 0)
341 i = ctx1;
342 else
343 i = ctx0;;
344 fprintf(stderr, "Reconnect to pmcd context %d ...\n", i);
345 if ((n = pmReconnectContext(i)) < 0) {
346 fprintf(stderr, "pmReconnectContext: %s -- error expected\n", pmErrStr(n));
348 else {
349 fprintf(stderr, "pmReconnectContext: success after pmcd killed!?\n");
350 err++;
353 err += exer(numpmid, pmidlist, 1);
357 * tricky part begins ...
358 * 1. get rid of the archive folio to avoid timestamp clashes with last
359 * created folio
360 * 2. re-start pmcd
361 * 3. wait for pmcd to be accepting connections
362 * 4. wait for pmlogger to be accepting connections from pmlc
363 * 5. connect to pmlogger
365 fprintf(stderr, "Restart pmcd ...\n");
366 sts = system(". $PCP_DIR/etc/pcp.env; path_opt=''; if [ $PCP_PLATFORM = linux ]; then path_opt=pmlogger/; fi; pmafm $PCP_LOG_DIR/$path_opt`hostname`/Latest remove 2>/dev/null | sh");
367 if (sts != 0)
368 fprintf(stderr, "Warning: folio removal script %d\n", sts);
369 __pmCloseSocket(ctlport);
370 sts = system(". $PCP_DIR/etc/pcp.env; $PCP_RC_DIR/pcp start");
371 if (sts != 0)
372 fprintf(stderr, "Warning: stop script returns %d\n", sts);
374 sprintf(path, "%s/pmcd_wait", binadm);
375 if(access(path, X_OK) == 0) {
376 sts = system(". $PCP_DIR/etc/pcp.env; [ -x $PCP_BINADM_DIR/pmcd_wait ] && $PCP_BINADM_DIR/pmcd_wait");
377 if (sts != 0)
378 fprintf(stderr, "Warning: pmcd_wait script returns %d\n", sts);
381 sts = system(". $PCP_DIR/etc/pcp.env; ( cat common.check; echo _wait_for_pmlogger -P $PCP_LOG_DIR/pmlogger/`hostname`/pmlogger.log ) | sh");
382 if (sts != 0)
383 fprintf(stderr, "Warning: _wait_for_pmlogger script returns %d\n", sts);
384 _ConnectLogger();
386 err += exer(numpmid, pmidlist, 1);
389 * more trickery ...
390 * need to sleep here for at least 1 second so that timestamp of
391 * IPC failure above is more than 1 second ago, so we wait long enough
392 * that pmReconnectContext() really does the connect() attempt, rather
393 * than returning -ETIMEDOUT immediately ... but sleep(1) is unreliable,
394 * hence ...
396 sleep(3);
398 for (j = 0; j < 2; j++) {
399 if (j == 0)
400 i = ctx1;
401 else
402 i = ctx0;
403 fprintf(stderr, "Reconnect to pmcd context %d ...\n", i);
404 if ((n = pmReconnectContext(i)) < 0) {
405 fprintf(stderr, "pmReconnectContext: %s\n", pmErrStr(n));
406 err++;
409 err += exer(numpmid, pmidlist, 0);
412 fprintf(stderr, "%d unexpected errors.\n", err);
413 exit(0);