3 * DCM-related functions for Moira client
5 * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology.
6 * For copying and distribution information, please see the file
10 #include <mit-copyright.h>
12 #include <moira_site.h>
24 static char buf[BUFSIZ];
26 int genable(int argc, char **argv, void *info);
27 int shserv(int argc, char **argv, void *hint);
28 char *unparse_interval(int i);
29 char **askserv(char **info);
30 int gserv(int argc, char **argv, void *hint);
31 void initserv(char *name, char **argv);
32 int shhost(int argc, char **argv, void *hint);
33 int ghost(int argc, char **argv, void *hint);
34 void inithost(char **info);
35 char **askhost(char **info);
36 int pserv(int argc, char **argv, void *count);
37 int phost(int argc, char **argv, void *count);
39 #define DCM_ENABLE_FLAG 0
41 int genable(int argc, char **argv, void *info)
43 ((char **)info)[1] = strdup(argv[0]);
47 int EnableDcm(int argc, char **argv)
52 info[0] = "dcm_enable";
53 if ((status = do_mr_query("get_value", 1, info, genable, info)))
54 com_err(whoami, status, " while getting value of dcm_enable");
55 if (GetValueFromUser("Enable value", &info[1]) == SUB_ERROR)
57 if ((status = do_mr_query("update_value", 2, info, NULL, NULL)))
58 com_err(whoami, status, " while updating value of dcm_enable");
59 FreeAndClear(&info[0], FALSE);
60 FreeAndClear(&info[1], TRUE);
65 int shserv(int argc, char **argv, void *hint)
69 Put_message("Name Type Owner Modified");
70 sprintf(tmp, "%s:%s", argv[SVC_ACE_TYPE], argv[SVC_ACE_NAME]);
71 sprintf(buf, "%-10s %-8s %-11s by %s on %s with %s", argv[SVC_SERVICE],
72 argv[SVC_TYPE], tmp, argv[SVC_MODBY], argv[SVC_MODTIME],
75 sprintf(buf, " Interval %s, Target:%s, Script:%s",
76 unparse_interval(atoi(argv[SVC_INTERVAL])), argv[SVC_TARGET],
79 if (atoi(argv[SVC_HARDERROR]))
80 sprintf(tmp, "Error %d: %s", atoi(argv[SVC_HARDERROR]), argv[SVC_ERRMSG]);
82 strcpy(tmp, "No error");
83 dfgen = strdup(atot(argv[SVC_DFGEN]));
84 sprintf(buf, " Generated %s; Last Checked %s", dfgen,
85 atot(argv[SVC_DFCHECK]));
88 sprintf(buf, " %s/%s/%s", atoi(argv[SVC_ENABLE]) ? "Enabled" : "Disabled",
89 atoi(argv[SVC_INPROGRESS]) ? "InProgress" : "Idle", tmp);
96 int showserv(int argc, char **argv)
102 if ((status = do_mr_query("get_server_info", 1, qargv, shserv, NULL)))
103 com_err(whoami, status, " while getting server info");
108 char *unparse_interval(int i)
110 static char uibuf[10];
112 sprintf(uibuf, "%02d:%02d:00", i / 60, i % 60);
116 int addserv(int argc, char **argv)
119 char *info[SC_END + 1];
121 initserv(argv[1], info);
124 Put_message("Aborted.");
127 if ((status = do_mr_query("add_server_info", SC_END, info, NULL, NULL)))
128 com_err(whoami, status, " while updating server info");
133 char **askserv(char **info)
135 if (GetValueFromUser("Interval", &info[SC_INTERVAL]) == SUB_ERROR)
137 if (GetValueFromUser("Target", &info[SC_TARGET]) == SUB_ERROR)
139 if (GetValueFromUser("Script", &info[SC_SCRIPT]) == SUB_ERROR)
141 if (GetTypeFromUser("Service type", "service", &info[SC_TYPE]) == SUB_ERROR)
143 if (GetValueFromUser("Enable", &info[SC_ENABLE]) == SUB_ERROR)
145 if (GetTypeFromUser("ACE type", "ace_type", &info[SC_ACE_TYPE]) == SUB_ERROR)
147 if (strcasecmp("none", info[SC_ACE_TYPE]))
149 if (GetValueFromUser("Ace name", &info[SC_ACE_NAME]) == SUB_ERROR)
156 int gserv(int argc, char **argv, void *hint)
160 cargv[SC_SERVICE] = strdup(argv[SVC_SERVICE]);
161 cargv[SC_INTERVAL] = strdup(argv[SVC_INTERVAL]);
162 cargv[SC_TARGET] = strdup(argv[SVC_TARGET]);
163 cargv[SC_SCRIPT] = strdup(argv[SVC_SCRIPT]);
164 cargv[SC_TYPE] = strdup(argv[SVC_TYPE]);
165 cargv[SC_ENABLE] = strdup(argv[SVC_ENABLE]);
166 cargv[SC_ACE_TYPE] = strdup(argv[SVC_ACE_TYPE]);
167 cargv[SC_ACE_NAME] = strdup(argv[SVC_ACE_NAME]);
168 cargv[SC_END] = NULL;
172 void initserv(char *name, char **argv)
176 argv[SC_SERVICE] = strdup(name);
177 argv[SC_INTERVAL] = strdup("1440");
178 sprintf(tmp, "/tmp/%s.out", name);
179 argv[SC_TARGET] = strdup(tmp);
180 sprintf(tmp, "%s/%s.sh", BIN_DIR, name);
181 argv[SC_SCRIPT] = strdup(tmp);
182 argv[SC_TYPE] = strdup("UNIQUE");
183 argv[SC_ENABLE] = strdup("1");
184 argv[SC_ACE_TYPE] = strdup("LIST");
185 argv[SC_ACE_NAME] = strdup("dbadmin");
190 int updateserv(int argc, char **argv)
192 char *qargv[SC_END + 1];
195 qargv[0] = (char *)argv[1];
196 if ((status = do_mr_query("get_server_info", 1, qargv, gserv, qargv)))
198 com_err(whoami, status, " while getting server info");
203 Put_message("Aborted.");
206 if ((status = do_mr_query("update_server_info", SC_END, qargv, NULL, NULL)))
207 com_err(whoami, status, " while updating server info");
212 int shhost(int argc, char **argv, void *hint)
216 sprintf(buf, "%s:%s mod by %s on %s with %s", argv[SH_MACHINE],
217 argv[SH_SERVICE], argv[SH_MODBY], argv[SH_MODTIME],
220 if (atoi(argv[SH_HOSTERROR]))
221 sprintf(tmp, "Error %d: %s", atoi(argv[SH_HOSTERROR]), argv[SH_ERRMSG]);
223 strcpy(tmp, "No error");
224 sprintf(buf, " %s/%s/%s/%s/%s",
225 atoi(argv[SH_ENABLE]) ? "Enabled" : "Disabled",
226 atoi(argv[SH_SUCCESS]) ? "Success" : "Failure",
227 atoi(argv[SH_INPROGRESS]) ? "InProgress" : "Idle",
228 atoi(argv[SH_OVERRIDE]) ? "Override" : "Normal", tmp);
230 Put_message(" Last Try Last Success Value1 Value2 Value3");
231 ltt = strdup(atot(argv[SH_LASTTRY]));
232 sprintf(buf, " %-20s %-20s %-9d %-9d %s", ltt, atot(argv[SH_LASTSUCCESS]),
233 atoi(argv[SH_VALUE1]), atoi(argv[SH_VALUE2]), argv[SH_VALUE3]);
241 int showhost(int argc, char **argv)
246 qargv[SHI_SERVICE] = argv[1];
247 qargv[SHI_MACHINE] = canonicalize_hostname(strdup(argv[2]));
248 if ((status = do_mr_query("get_server_host_info", 2, qargv, shhost, NULL)))
249 com_err(whoami, status, " getting server/host info");
254 int resetsrverr(int argc, char **argv)
257 if ((status = do_mr_query("reset_server_error", 1, &argv[1], NULL, NULL)))
258 com_err(whoami, status, " while resetting server error");
263 int resetsrvc(int argc, char **argv)
266 char *qargv[6], buf[BUFSIZ];
268 sprintf(buf, "Reset state for service %s (Y/N)", argv[1]);
277 if ((status = do_mr_query("set_server_internal_flags", 6, qargv,
279 com_err(whoami, status, " while resetting server error");
284 int resethosterr(int argc, char **argv)
288 argv[2] = canonicalize_hostname(strdup(argv[2]));
289 if ((status = do_mr_query("reset_server_host_error", 2, &argv[1],
291 com_err(whoami, status, " while resetting server/host error");
296 int resethost(int argc, char **argv)
299 char *qargv[9], buf[BUFSIZ];
301 sprintf(buf, "Reset state for service %s on host %s (Y/N)", argv[1],
302 canonicalize_hostname(strdup(argv[2])));
306 qargv[1] = canonicalize_hostname(strdup(argv[2]));
314 if ((status = do_mr_query("set_server_host_internal", 9, qargv,
316 com_err(whoami, status, " while resetting server/host error");
321 int sethostor(int argc, char **argv)
325 argv[2] = canonicalize_hostname(strdup(argv[2]));
326 if ((status = do_mr_query("set_server_host_override", 2, &argv[1],
328 com_err(whoami, status, " while setting server/host override");
333 int ghost(int argc, char **argv, void *hint)
337 cargv[SHI_SERVICE] = strdup(argv[SH_SERVICE]);
338 cargv[SHI_MACHINE] = strdup(argv[SH_MACHINE]);
339 cargv[SHI_ENABLE] = strdup(argv[SH_ENABLE]);
340 cargv[SHI_VALUE1] = strdup(argv[SH_VALUE1]);
341 cargv[SHI_VALUE2] = strdup(argv[SH_VALUE2]);
342 cargv[SHI_VALUE3] = strdup(argv[SH_VALUE3]);
343 cargv[SHI_END] = NULL;
348 void inithost(char **info)
350 info[SHI_MACHINE] = canonicalize_hostname(strdup(info[SH_MACHINE]));
351 info[SHI_ENABLE] = strdup("1");
352 info[SHI_VALUE1] = strdup("0");
353 info[SHI_VALUE2] = strdup("0");
354 info[SHI_VALUE3] = strdup("");
355 info[SHI_END] = NULL;
359 char **askhost(char **info)
361 if (GetValueFromUser("Enable", &info[SHI_ENABLE]) == SUB_ERROR)
363 if (GetValueFromUser("Value 1", &info[SHI_VALUE1]) == SUB_ERROR)
365 if (GetValueFromUser("Value 2", &info[SHI_VALUE2]) == SUB_ERROR)
367 if (GetValueFromUser("Value 3", &info[SHI_VALUE3]) == SUB_ERROR)
373 int updatehost(int argc, char **argv)
375 char *info[SHI_END + 1];
378 info[SHI_SERVICE] = strdup(argv[1]);
379 info[SHI_MACHINE] = canonicalize_hostname(strdup(argv[2]));
380 if ((status = do_mr_query("get_server_host_info", 2, info, ghost, info)))
382 com_err(whoami, status, " while getting server/host info");
387 Put_message("Aborted.");
390 if ((status = do_mr_query("update_server_host_info", SHI_END, info,
392 com_err(whoami, status, " while updating server/host info");
398 int addhost(int argc, char **argv)
400 char *info[SHI_END + 1];
403 info[SHI_SERVICE] = strdup(argv[1]);
404 info[SHI_MACHINE] = canonicalize_hostname(strdup(argv[2]));
408 Put_message("Aborted.");
411 if ((status = do_mr_query("add_server_host_info", SHI_END, info,
413 com_err(whoami, status, " while adding server/host info");
419 int delserv(int argc, char **argv)
423 if ((status = do_mr_query("delete_server_info", 1, &argv[1], NULL, NULL)))
424 com_err(whoami, status, " while deleting server info");
429 int delhost(int argc, char **argv)
433 argv[2] = canonicalize_hostname(strdup(argv[2]));
434 if ((status = do_mr_query("delete_server_host_info", 2, &argv[1],
436 com_err(whoami, status, " while deleting server/host info");
441 int pserv(int argc, char **argv, void *count)
443 sprintf(buf, "Service %s", argv[0]);
449 int phost(int argc, char **argv, void *count)
451 sprintf(buf, "Host %s:%s", argv[0], argv[1]);
458 int InProgress(int argc, char **oargv)
461 int status, count = 0;
463 argv[0] = argv[2] = "DONTCARE";
465 if ((status = do_mr_query("qualified_get_server", 3, argv, pserv,
466 &count)) && status != MR_NO_MATCH)
467 com_err(whoami, status, " while getting servers");
469 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
471 if ((status = do_mr_query("qualified_get_server_host", 6, argv, phost,
472 &count)) && status != MR_NO_MATCH)
473 com_err(whoami, status, " while getting server/hosts");
475 strcpy(buf, "Nothing is in progress at this time");
477 sprintf(buf, "%d update%s in progress at this time", count,
478 count == 1 ? "" : "s");
483 int DcmFailed(int argc, char **oargv)
486 int status, count = 0;
488 argv[0] = argv[1] = "DONTCARE";
490 if ((status = do_mr_query("qualified_get_server", 3, argv, pserv,
491 &count)) && status != MR_NO_MATCH)
492 com_err(whoami, status, " while getting servers");
494 argv[1] = argv[2] = argv[3] = argv[4] = "DONTCARE";
496 if ((status = do_mr_query("qualified_get_server_host", 6, argv, phost,
497 &count)) && status != MR_NO_MATCH)
498 com_err(whoami, status, " while getting server/hosts");
500 strcpy(buf, "Nothing has failed at this time");
502 sprintf(buf, "%d thing%s ha%s failed at this time", count,
503 count == 1 ? "" : "s", count == 1 ? "s" : "ve");
509 int Dcm(int argc, char **argv)
512 if (Confirm("Are you sure you want to start a DCM now"))
514 if ((status = mr_do_update()))
515 com_err(whoami, status, " while triggering update");