2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * This file implements the bos related funtions for afscp
14 #include <afsconfig.h>
15 #include <afs/param.h>
28 * Generic fuction for converting input string to an integer. Pass
29 * the error_msg you want displayed if there is an error converting
34 GetIntFromString(const char *int_str, const char *error_msg)
37 char *bad_char = NULL;
39 i = strtoul(int_str, &bad_char, 10);
40 if ((bad_char == NULL) || (*bad_char == 0)) {
48 * Functions for reading and displaying bos restart times. These are copied
49 * from util/ktime.c and changed to handle the bos types.
57 static char *day[] = {
68 LocalFreeTokens(struct token *alist)
71 for (; alist; alist = nlist) {
82 if (x == 0 || x == ' ' || x == '\t' || x == '\n')
89 LocalParseLine(char *aline, struct token **alist)
94 struct token *first, *last;
98 inToken = 0; /* not copying token chars at start */
103 if (tc == 0 || space(tc)) {
105 inToken = 0; /* end of this token */
107 ttok = (struct token *)malloc(sizeof(struct token));
109 ttok->key = (char *)malloc(strlen(tbuffer) + 1);
110 strcpy(ttok->key, tbuffer);
120 /* an alpha character */
125 if (tptr - tbuffer >= sizeof(tbuffer))
130 /* last token flushed 'cause space(0) --> true */
139 /* keyword database for periodic date parsing */
140 static struct ptemp {
144 {"sun", 0x10000}, {"mon", 0x10001}, {"tue", 0x10002},
145 {"wed", 0x10003}, {"thu", 0x10004}, {"fri", 0x10005},
147 {"sunday", 0x10000}, {"monday", 0x10001},
148 {"tuesday", 0x10002}, {"wednesday", 0x10003},
149 {"thursday", 0x10004}, {"thur", 0x10004},
150 {"friday", 0x10005}, {"saturday", 0x10006},
151 {"am", 0x20000}, {"pm", 0x20001},
152 {"a.m.", 0x20000}, {"p.m.", 0x20001}, {0, 0}};
155 ParseTime(bos_RestartTime_p ak, char *astr)
162 field = 0; /* 0=hour, 1=min, 2=sec */
166 (BOS_RESTART_TIME_HOUR | BOS_RESTART_TIME_MINUTE |
167 BOS_RESTART_TIME_SECOND);
170 if (tc == 0 || tc == ':') {
182 } else if (!isdigit(tc))
183 return -1; /* syntax error */
190 if (ak->hour >= 24 || ak->min >= 60 || ak->sec >= 60)
196 ktime_ParsePeriodic(char *adate, bos_RestartTime_p ak)
202 memset(ak, 0, sizeof(*ak));
203 code = LocalParseLine(adate, &tt);
206 for (; tt; tt = tt->next) {
207 /* look at each token */
208 if (strcmp(tt->key, "now") == 0) {
209 ak->mask |= BOS_RESTART_TIME_NOW;
213 if (strcmp(tt->key, "never") == 0) {
214 ak->mask |= BOS_RESTART_TIME_NEVER;
218 if (strcmp(tt->key, "at") == 0)
220 if (strcmp(tt->key, "every") == 0)
222 if (isdigit(tt->key[0])) {
224 code = ParseTime(ak, tt->key);
231 /* otherwise use keyword table */
232 for (tp = ptkeys;; tp++) {
233 if (tp->key == NULL) {
237 if (strcmp(tp->key, tt->key) == 0)
240 /* now look at tp->value to see what we've got */
241 if ((tp->value >> 16) == 1) {
243 ak->mask |= BOS_RESTART_TIME_DAY;
244 ak->day = tp->value & 0xff;
246 if ((tp->value >> 16) == 2) {
248 if ((tp->value & 0xff) == 1) {
250 if (!(ak->mask & BOS_RESTART_TIME_HOUR))
255 else if (ak->hour != 12) {
260 /* am is almost a noop, except that we map 12:01 am to 0:01 */
275 DoBosProcessCreate(struct cmd_syndesc *as, void *arock)
277 typedef enum { SERVER, PROCESS, BINARY, CRON, CRONTIME,
279 } DoBosProcessCreate_parm_t;
281 void *bos_server = NULL;
282 const char *process = NULL;
283 bos_ProcessType_t process_type = BOS_PROCESS_SIMPLE;
284 const char *binary = NULL;
286 const char *cron_time = NULL;
287 int has_cron_time = 0;
288 const char *notifier = NULL;
290 if (as->parms[SERVER].items) {
292 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
293 ERR_ST_EXT("bos_ServerOpen", st);
297 if (as->parms[PROCESS].items) {
298 process = as->parms[PROCESS].items->data;
301 if (as->parms[BINARY].items) {
302 binary = as->parms[BINARY].items->data;
305 if (as->parms[CRON].items) {
307 process_type = BOS_PROCESS_CRON;
310 if (as->parms[CRONTIME].items) {
311 cron_time = as->parms[CRONTIME].items->data;
316 if (!has_cron_time) {
317 ERR_EXT("must specify cron time when creating a cron process");
321 ERR_EXT("cron time is meaningless for non cron process");
325 if (as->parms[NOTIFIER].items) {
326 notifier = as->parms[NOTIFIER].items->data;
329 if (!bos_ProcessCreate
330 (bos_server, (char *)process, process_type, (char *)binary, (char *)cron_time, (char *)notifier,
332 ERR_ST_EXT("bos_ProcessCreate", st);
335 bos_ServerClose(bos_server, 0);
341 DoBosFSProcessCreate(struct cmd_syndesc *as, void *arock)
343 typedef enum { SERVER, PROCESS, FILESERVER, VOLSERVER, SALVAGER,
345 } DoBosFSProcessCreate_parm_t;
347 void *bos_server = NULL;
348 const char *process = NULL;
349 const char *fileserver = NULL;
350 const char *volserver = NULL;
351 const char *salvager = NULL;
352 const char *notifier = NULL;
354 if (as->parms[SERVER].items) {
356 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
357 ERR_ST_EXT("bos_ServerOpen", st);
361 if (as->parms[PROCESS].items) {
362 process = as->parms[PROCESS].items->data;
365 if (as->parms[FILESERVER].items) {
366 fileserver = as->parms[FILESERVER].items->data;
369 if (as->parms[VOLSERVER].items) {
370 volserver = as->parms[VOLSERVER].items->data;
373 if (as->parms[SALVAGER].items) {
374 salvager = as->parms[SALVAGER].items->data;
377 if (as->parms[NOTIFIER].items) {
378 notifier = as->parms[NOTIFIER].items->data;
381 if (!bos_FSProcessCreate
382 (bos_server, (char *)process, (char *)fileserver, (char *)volserver, (char *)salvager, (char *)notifier,
384 ERR_ST_EXT("bos_FSProcessCreate", st);
387 bos_ServerClose(bos_server, 0);
393 DoBosProcessDelete(struct cmd_syndesc *as, void *arock)
395 typedef enum { SERVER, PROCESS } DoBosProcessDelete_parm_t;
397 void *bos_server = NULL;
398 const char *process = NULL;
400 if (as->parms[SERVER].items) {
402 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
403 ERR_ST_EXT("bos_ServerOpen", st);
407 if (as->parms[PROCESS].items) {
408 process = as->parms[PROCESS].items->data;
411 if (!bos_ProcessDelete(bos_server, (char *)process, &st)) {
412 ERR_ST_EXT("bos_ProcessDelete", st);
415 bos_ServerClose(bos_server, 0);
421 Print_bos_ProcessExecutionState_p(bos_ProcessExecutionState_p state,
424 printf("%sThe process executation state is: ", prefix);
426 case BOS_PROCESS_STOPPED:
429 case BOS_PROCESS_RUNNING:
432 case BOS_PROCESS_STOPPING:
433 printf("stopping\n");
435 case BOS_PROCESS_STARTING:
436 printf("starting\n");
442 DoBosProcessExecutionStateGet(struct cmd_syndesc *as, void *arock)
444 typedef enum { SERVER, PROCESS } DoBosProcessExecutionStateGet_parm_t;
446 void *bos_server = NULL;
447 const char *process = NULL;
448 bos_ProcessExecutionState_t state;
449 char aux_status[BOS_MAX_NAME_LEN];
451 if (as->parms[SERVER].items) {
453 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
454 ERR_ST_EXT("bos_ServerOpen", st);
458 if (as->parms[PROCESS].items) {
459 process = as->parms[PROCESS].items->data;
462 if (!bos_ProcessExecutionStateGet
463 (bos_server, (char *)process, &state, aux_status, &st)) {
464 ERR_ST_EXT("bos_ProcessExecutionStateGet", st);
467 Print_bos_ProcessExecutionState_p(&state, "");
468 if (aux_status[0] != 0) {
469 printf("Aux process status: %s\n", aux_status);
472 bos_ServerClose(bos_server, 0);
478 DoBosProcessExecutionStateSet(struct cmd_syndesc *as, void *arock)
480 typedef enum { SERVER, PROCESS, STOPPED,
482 } DoBosProcessExecutionStateSet_parm_t;
484 void *bos_server = NULL;
485 const char *process = NULL;
488 bos_ProcessExecutionState_t state = 0;
490 if (as->parms[SERVER].items) {
492 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
493 ERR_ST_EXT("bos_ServerOpen", st);
497 if (as->parms[PROCESS].items) {
498 process = as->parms[PROCESS].items->data;
501 if (as->parms[STOPPED].items) {
503 state = BOS_PROCESS_STOPPED;
506 if (as->parms[RUNNING].items) {
508 state = BOS_PROCESS_RUNNING;
511 if ((stop == 1) && (run == 1)) {
512 ERR_EXT("you must specify either running or stopped, but not both");
515 if ((stop == 0) && (run == 0)) {
516 ERR_EXT("you must specify either running or stopped");
519 if (!bos_ProcessExecutionStateSet(bos_server, process, state, &st)) {
520 ERR_ST_EXT("bos_ProcessExecutionStateSet", st);
523 bos_ServerClose(bos_server, 0);
529 DoBosProcessExecutionStateSetTemporary(struct cmd_syndesc *as, void *arock)
531 typedef enum { SERVER, PROCESS, STOPPED,
533 } DoBosProcessExecutionStateSetTemporary_parm_t;
535 void *bos_server = NULL;
536 const char *process = NULL;
539 bos_ProcessExecutionState_t state = 0;
541 if (as->parms[SERVER].items) {
543 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
544 ERR_ST_EXT("bos_ServerOpen", st);
548 if (as->parms[PROCESS].items) {
549 process = as->parms[PROCESS].items->data;
552 if (as->parms[STOPPED].items) {
554 state = BOS_PROCESS_STOPPED;
557 if (as->parms[RUNNING].items) {
559 state = BOS_PROCESS_RUNNING;
562 if ((stop == 1) && (run == 1)) {
563 ERR_EXT("you must specify either running or stopped, but not both");
566 if ((stop == 0) && (run == 0)) {
567 ERR_EXT("you must specify either running or stopped");
570 if (!bos_ProcessExecutionStateSetTemporary
571 (bos_server, (char *)process, state, &st)) {
572 ERR_ST_EXT("bos_ProcessExecutionStateSetTemporary", st);
575 bos_ServerClose(bos_server, 0);
581 DoBosProcessNameList(struct cmd_syndesc *as, void *arock)
583 typedef enum { SERVER } DoBosProcessNameList_parm_t;
585 void *bos_server = NULL;
587 char process[BOS_MAX_NAME_LEN];
589 if (as->parms[SERVER].items) {
591 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
592 ERR_ST_EXT("bos_ServerOpen", st);
596 if (!bos_ProcessNameGetBegin(bos_server, &iter, &st)) {
597 ERR_ST_EXT("bos_ProcessNameGetBegin", st);
600 printf("Listing processes at server %s:\n",
601 as->parms[SERVER].items->data);
603 while (bos_ProcessNameGetNext(iter, process, &st)) {
604 printf("\t%s\n", process);
607 if (st != ADMITERATORDONE) {
608 ERR_ST_EXT("bos_ProcessNameGetNext", st);
611 if (!bos_ProcessNameGetDone(iter, &st)) {
612 ERR_ST_EXT("bos_ProcessNameGetDone", st);
619 Print_bos_ProcessType_p(bos_ProcessType_p type, const char *prefix)
621 printf("%sProcess type: \n", prefix);
623 case BOS_PROCESS_SIMPLE:
629 case BOS_PROCESS_CRON:
636 Print_bos_ProcessState_p(bos_ProcessState_p state, const char *prefix)
638 printf("%sProcess state:\n", prefix);
639 /* FIXME: BOS_PROCESS_OK is 0, so this test is not right */
640 if (*state & BOS_PROCESS_OK) {
641 printf("%s\tBOS_PROCESS_OK:\n", prefix);
643 if (*state & BOS_PROCESS_CORE_DUMPED) {
644 printf("%s\tBOS_PROCESS_CORE_DUMPED:\n", prefix);
646 if (*state & BOS_PROCESS_TOO_MANY_ERRORS) {
647 printf("%s\tBOS_PROCESS_TOO_MANY_ERRORS:\n", prefix);
649 if (*state & BOS_PROCESS_BAD_FILE_ACCESS) {
650 printf("%s\tBOS_PROCESS_BAD_FILE_ACCESS:\n", prefix);
655 Print_bos_ProcessInfo_p(bos_ProcessInfo_p info, const char *prefix)
657 Print_bos_ProcessExecutionState_p(&info->processGoal, prefix);
658 printf("%sStart time %lu\n", prefix, info->processStartTime);
659 printf("%sNumber of process starts %lu \n", prefix,
660 info->numberProcessStarts);
661 printf("%sProcess exit time %lu\n", prefix, info->processExitTime);
662 printf("%sProcess exit error time %lu\n", prefix,
663 info->processExitErrorTime);
664 printf("%sProcess error code %lu\n", prefix, info->processErrorCode);
665 printf("%sProcess error signal %lu\n", prefix, info->processErrorSignal);
666 Print_bos_ProcessState_p(&info->state, prefix);
670 DoBosProcessInfoGet(struct cmd_syndesc *as, void *arock)
672 typedef enum { SERVER, PROCESS } DoBosProcessInfoGet_parm_t;
674 void *bos_server = NULL;
675 const char *process = NULL;
676 bos_ProcessType_t type;
677 bos_ProcessInfo_t info;
679 if (as->parms[SERVER].items) {
681 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
682 ERR_ST_EXT("bos_ServerOpen", st);
686 if (as->parms[PROCESS].items) {
687 process = as->parms[PROCESS].items->data;
690 if (!bos_ProcessInfoGet(bos_server, (char *)process, &type, &info, &st)) {
691 ERR_ST_EXT("bos_ProcessInfoGet", st);
694 Print_bos_ProcessType_p(&type, "");
695 Print_bos_ProcessInfo_p(&info, "");
701 DoBosProcessParameterList(struct cmd_syndesc *as, void *arock)
703 typedef enum { SERVER, PROCESS } DoBosProcessParameterList_parm_t;
705 void *bos_server = NULL;
706 char *process = NULL;
708 char parameter[BOS_MAX_NAME_LEN];
710 if (as->parms[SERVER].items) {
712 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
713 ERR_ST_EXT("bos_ServerOpen", st);
717 if (as->parms[PROCESS].items) {
718 process = as->parms[PROCESS].items->data;
721 if (!bos_ProcessParameterGetBegin(bos_server, process, &iter, &st)) {
722 ERR_ST_EXT("bos_ProcessParameterGetBegin", st);
725 printf("Getting parameters for %s\n", process);
727 while (bos_ProcessParameterGetNext(iter, parameter, &st)) {
728 printf("\t%s\n", parameter);
731 if (st != ADMITERATORDONE) {
732 ERR_ST_EXT("bos_ProcessParameterGetNext", st);
735 if (!bos_ProcessParameterGetDone(iter, &st)) {
736 ERR_ST_EXT("bos_ProcessParameterGetDone", st);
739 bos_ServerClose(bos_server, 0);
745 DoBosProcessNotifierGet(struct cmd_syndesc *as, void *arock)
747 typedef enum { SERVER, PROCESS } DoBosProcessNotifierGet_parm_t;
749 void *bos_server = NULL;
750 const char *process = NULL;
751 char notifier[BOS_MAX_NAME_LEN];
753 if (as->parms[SERVER].items) {
755 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
756 ERR_ST_EXT("bos_ServerOpen", st);
760 if (as->parms[PROCESS].items) {
761 process = as->parms[PROCESS].items->data;
764 if (!bos_ProcessNotifierGet(bos_server, process, notifier, &st)) {
765 ERR_ST_EXT("bos_ProcessNotifierGet", st);
768 if (notifier[0] == 0) {
769 printf("%s does not have a notifier.\n", process);
771 printf("The notifier for %s is %s\n", process, notifier);
774 bos_ServerClose(bos_server, 0);
780 DoBosProcessRestart(struct cmd_syndesc *as, void *arock)
782 typedef enum { SERVER, PROCESS } DoBosProcessRestart_parm_t;
784 void *bos_server = NULL;
785 const char *process = NULL;
787 if (as->parms[SERVER].items) {
789 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
790 ERR_ST_EXT("bos_ServerOpen", st);
794 if (as->parms[PROCESS].items) {
795 process = as->parms[PROCESS].items->data;
798 if (!bos_ProcessRestart(bos_server, process, &st)) {
799 ERR_ST_EXT("bos_ProcessRestart", st);
802 bos_ServerClose(bos_server, 0);
808 DoBosProcessAllStop(struct cmd_syndesc *as, void *arock)
810 typedef enum { SERVER } DoBosProcessAllStop_parm_t;
812 void *bos_server = NULL;
814 if (as->parms[SERVER].items) {
816 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
817 ERR_ST_EXT("bos_ServerOpen", st);
821 if (!bos_ProcessAllStop(bos_server, &st)) {
822 ERR_ST_EXT("bos_ProcessAllStop", st);
825 bos_ServerClose(bos_server, 0);
831 DoBosProcessAllStart(struct cmd_syndesc *as, void *arock)
833 typedef enum { SERVER } DoBosProcessAllStart_parm_t;
835 void *bos_server = NULL;
837 if (as->parms[SERVER].items) {
839 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
840 ERR_ST_EXT("bos_ServerOpen", st);
844 if (!bos_ProcessAllStart(bos_server, &st)) {
845 ERR_ST_EXT("bos_ProcessAllStart", st);
848 bos_ServerClose(bos_server, 0);
854 DoBosProcessAllWaitStop(struct cmd_syndesc *as, void *arock)
856 typedef enum { SERVER } DoBosProcessAllWaitStop_parm_t;
858 void *bos_server = NULL;
860 if (as->parms[SERVER].items) {
862 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
863 ERR_ST_EXT("bos_ServerOpen", st);
867 if (!bos_ProcessAllWaitStop(bos_server, &st)) {
868 ERR_ST_EXT("bos_ProcessAllWaitStop", st);
871 bos_ServerClose(bos_server, 0);
877 DoBosProcessAllWaitTransition(struct cmd_syndesc *as, void *arock)
879 typedef enum { SERVER } DoBosProcessAllWaitTransition_parm_t;
881 void *bos_server = NULL;
883 if (as->parms[SERVER].items) {
885 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
886 ERR_ST_EXT("bos_ServerOpen", st);
890 if (!bos_ProcessAllWaitTransition(bos_server, &st)) {
891 ERR_ST_EXT("bos_ProcessAllWaitTransition", st);
894 bos_ServerClose(bos_server, 0);
900 DoBosProcessAllStopAndRestart(struct cmd_syndesc *as, void *arock)
902 typedef enum { SERVER, INCLUDEBOS } DoBosProcessAllStopAndRestart_parm_t;
904 void *bos_server = NULL;
905 bos_RestartBosServer_t restart = BOS_DONT_RESTART_BOS_SERVER;
907 if (as->parms[SERVER].items) {
909 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
910 ERR_ST_EXT("bos_ServerOpen", st);
914 if (as->parms[INCLUDEBOS].items) {
915 restart = BOS_RESTART_BOS_SERVER;
918 if (!bos_ProcessAllStopAndRestart(bos_server, restart, &st)) {
919 ERR_ST_EXT("bos_ProcessAllStopAndRestart", st);
922 bos_ServerClose(bos_server, 0);
928 DoBosAdminCreate(struct cmd_syndesc *as, void *arock)
930 typedef enum { SERVER, ADMIN } DoBosAdminCreate_parm_t;
932 void *bos_server = NULL;
933 const char *admin = NULL;
935 if (as->parms[SERVER].items) {
937 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
938 ERR_ST_EXT("bos_ServerOpen", st);
942 if (as->parms[ADMIN].items) {
943 admin = as->parms[ADMIN].items->data;
946 if (!bos_AdminCreate(bos_server, admin, &st)) {
947 ERR_ST_EXT("bos_AdminCreate", st);
950 bos_ServerClose(bos_server, 0);
956 DoBosAdminDelete(struct cmd_syndesc *as, void *arock)
958 typedef enum { SERVER, ADMIN } DoBosAdminDelete_parm_t;
960 void *bos_server = NULL;
961 const char *admin = NULL;
963 if (as->parms[SERVER].items) {
965 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
966 ERR_ST_EXT("bos_ServerOpen", st);
970 if (as->parms[ADMIN].items) {
971 admin = as->parms[ADMIN].items->data;
974 if (!bos_AdminDelete(bos_server, admin, &st)) {
975 ERR_ST_EXT("bos_AdminDelete", st);
978 bos_ServerClose(bos_server, 0);
984 DoBosAdminList(struct cmd_syndesc *as, void *arock)
986 typedef enum { SERVER } DoBosAdminList_parm_t;
988 void *bos_server = NULL;
990 char admin[BOS_MAX_NAME_LEN];
992 if (as->parms[SERVER].items) {
994 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
995 ERR_ST_EXT("bos_ServerOpen", st);
999 if (!bos_AdminGetBegin(bos_server, &iter, &st)) {
1000 ERR_ST_EXT("bos_AdminGetBegin", st);
1003 printf("Administrators at %s\n", as->parms[SERVER].items->data);
1005 while (bos_AdminGetNext(iter, admin, &st)) {
1006 printf("%s\n", admin);
1009 if (st != ADMITERATORDONE) {
1010 ERR_ST_EXT("bos_AdminGetNext", st);
1013 if (!bos_AdminGetDone(iter, &st)) {
1014 ERR_ST_EXT("bos_AdminGetDone", st);
1017 bos_ServerClose(bos_server, 0);
1023 DoBosKeyCreate(struct cmd_syndesc *as, void *arock)
1025 typedef enum { SERVER, VERSIONNUMBER, KEY } DoBosKeyCreate_parm_t;
1026 afs_status_t st = 0;
1027 void *bos_server = NULL;
1028 int version_number = 0;
1029 kas_encryptionKey_t key = { {0, 0, 0, 0, 0, 0, 0, 0} };
1032 if (as->parms[SERVER].items) {
1034 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1035 ERR_ST_EXT("bos_ServerOpen", st);
1039 if (as->parms[VERSIONNUMBER].items) {
1041 GetIntFromString(as->parms[VERSIONNUMBER].items->data,
1042 "invalid version number");
1045 if (as->parms[KEY].items) {
1046 const char *str = as->parms[KEY].items->data;
1047 if (!afsclient_CellNameGet(cellHandle, &cell, &st)) {
1048 ERR_ST_EXT("afsclient_CellNameGet", st);
1050 if (!kas_StringToKey(cell, str, &key, &st)) {
1051 ERR_ST_EXT("kas_StringToKey", st);
1055 if (!bos_KeyCreate(bos_server, version_number, &key, &st)) {
1056 ERR_ST_EXT("bos_KeyCreate", st);
1059 bos_ServerClose(bos_server, 0);
1065 DoBosKeyDelete(struct cmd_syndesc *as, void *arock)
1067 typedef enum { SERVER, VERSIONNUMBER } DoBosKeyDelete_parm_t;
1068 afs_status_t st = 0;
1069 void *bos_server = NULL;
1070 int version_number = 0;
1072 if (as->parms[SERVER].items) {
1074 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1075 ERR_ST_EXT("bos_ServerOpen", st);
1079 if (as->parms[VERSIONNUMBER].items) {
1081 GetIntFromString(as->parms[VERSIONNUMBER].items->data,
1082 "invalid version number");
1085 if (!bos_KeyDelete(bos_server, version_number, &st)) {
1086 ERR_ST_EXT("bos_KeyDelete", st);
1089 bos_ServerClose(bos_server, 0);
1095 Print_bos_KeyInfo_p(bos_KeyInfo_p key, const char *prefix)
1098 printf("%sVersion number: %d\n", prefix, key->keyVersionNumber);
1099 printf("%sLast modification date %d\n", prefix,
1100 key->keyStatus.lastModificationDate);
1101 printf("%sLast modification micro seconds %d\n", prefix,
1102 key->keyStatus.lastModificationMicroSeconds);
1103 printf("%sChecksum %u\n", prefix, key->keyStatus.checkSum);
1105 printf("%sKey: \n", prefix);
1106 for (i = 0; i < KAS_ENCRYPTION_KEY_LEN; i++) {
1107 printf("%s\t%d ", prefix, key->key.key[i]);
1113 DoBosKeyList(struct cmd_syndesc *as, void *arock)
1115 typedef enum { SERVER } DoBosKeyList_parm_t;
1116 afs_status_t st = 0;
1117 void *bos_server = NULL;
1121 if (as->parms[SERVER].items) {
1123 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1124 ERR_ST_EXT("bos_ServerOpen", st);
1128 if (!bos_KeyGetBegin(bos_server, &iter, &st)) {
1129 ERR_ST_EXT("bos_KeyGetBegin", st);
1132 printf("Listing keys at server %s:\n", as->parms[SERVER].items->data);
1134 while (bos_KeyGetNext(iter, &key, &st)) {
1135 Print_bos_KeyInfo_p(&key, "");
1138 if (st != ADMITERATORDONE) {
1139 ERR_ST_EXT("bos_KeyGetNext", st);
1142 if (!bos_KeyGetDone(iter, &st)) {
1143 ERR_ST_EXT("bos_KeyGetDone", st);
1146 bos_ServerClose(bos_server, 0);
1152 DoBosCellSet(struct cmd_syndesc *as, void *arock)
1154 typedef enum { SERVER, CELL } DoBosCellSet_parm_t;
1155 afs_status_t st = 0;
1156 void *bos_server = NULL;
1157 const char *cell = NULL;
1159 if (as->parms[SERVER].items) {
1161 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1162 ERR_ST_EXT("bos_ServerOpen", st);
1166 if (as->parms[SERVER].items) {
1167 cell = as->parms[SERVER].items->data;
1170 if (!bos_CellSet(bos_server, cell, &st)) {
1171 ERR_ST_EXT("bos_CellSet", st);
1174 bos_ServerClose(bos_server, 0);
1180 DoBosCellGet(struct cmd_syndesc *as, void *arock)
1182 typedef enum { SERVER } DoBosCellGet_parm_t;
1183 afs_status_t st = 0;
1184 void *bos_server = NULL;
1185 char cell[BOS_MAX_NAME_LEN];
1187 if (as->parms[SERVER].items) {
1189 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1190 ERR_ST_EXT("bos_ServerOpen", st);
1194 if (!bos_CellGet(bos_server, cell, &st)) {
1195 ERR_ST_EXT("bos_CellGet", st);
1198 printf("The cell name is %s\n", cell);
1200 bos_ServerClose(bos_server, 0);
1206 DoBosHostCreate(struct cmd_syndesc *as, void *arock)
1208 typedef enum { SERVER, HOST } DoBosHostCreate_parm_t;
1209 afs_status_t st = 0;
1210 void *bos_server = NULL;
1211 const char *host = NULL;
1213 if (as->parms[SERVER].items) {
1215 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1216 ERR_ST_EXT("bos_ServerOpen", st);
1220 if (as->parms[HOST].items) {
1221 host = as->parms[HOST].items->data;
1224 if (!bos_HostCreate(bos_server, host, &st)) {
1225 ERR_ST_EXT("bos_HostCreate", st);
1228 bos_ServerClose(bos_server, 0);
1234 DoBosHostDelete(struct cmd_syndesc *as, void *arock)
1236 typedef enum { SERVER, HOST } DoBosHostDelete_parm_t;
1237 afs_status_t st = 0;
1238 void *bos_server = NULL;
1239 const char *host = NULL;
1241 if (as->parms[SERVER].items) {
1243 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1244 ERR_ST_EXT("bos_ServerOpen", st);
1248 if (as->parms[HOST].items) {
1249 host = as->parms[HOST].items->data;
1252 if (!bos_HostDelete(bos_server, host, &st)) {
1253 ERR_ST_EXT("bos_HostDelete", st);
1256 bos_ServerClose(bos_server, 0);
1262 DoBosHostList(struct cmd_syndesc *as, void *arock)
1264 typedef enum { SERVER } DoBosHostList_parm_t;
1265 afs_status_t st = 0;
1266 void *bos_server = NULL;
1268 char host[BOS_MAX_NAME_LEN];
1270 if (as->parms[SERVER].items) {
1272 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1273 ERR_ST_EXT("bos_ServerOpen", st);
1276 printf("Listing hosts at server %s\n", as->parms[SERVER].items->data);
1279 if (!bos_HostGetBegin(bos_server, &iter, &st)) {
1280 ERR_ST_EXT("bos_HostGetBegin", st);
1284 while (bos_HostGetNext(iter, host, &st)) {
1285 printf("\t%s\n", host);
1288 if (st != ADMITERATORDONE) {
1289 ERR_ST_EXT("bos_HostGetNext", st);
1292 if (!bos_HostGetDone(iter, &st)) {
1293 ERR_ST_EXT("bos_HostGetDone", st);
1296 bos_ServerClose(bos_server, 0);
1302 DoBosExecutableCreate(struct cmd_syndesc *as, void *arock)
1304 typedef enum { SERVER, BINARY, DEST } DoBosExecutableCreate_parm_t;
1305 afs_status_t st = 0;
1306 void *bos_server = NULL;
1307 const char *binary = NULL;
1308 const char *dest = NULL;
1310 if (as->parms[SERVER].items) {
1312 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1313 ERR_ST_EXT("bos_ServerOpen", st);
1317 if (as->parms[BINARY].items) {
1318 binary = as->parms[BINARY].items->data;
1321 if (as->parms[DEST].items) {
1322 dest = as->parms[DEST].items->data;
1325 if (!bos_ExecutableCreate(bos_server, binary, dest, &st)) {
1326 ERR_ST_EXT("bos_ExecutableCreate", st);
1329 bos_ServerClose(bos_server, 0);
1335 DoBosExecutableRevert(struct cmd_syndesc *as, void *arock)
1337 typedef enum { SERVER, EXECUTABLE } DoBosExecutableRevert_parm_t;
1338 afs_status_t st = 0;
1339 void *bos_server = NULL;
1340 const char *executable = NULL;
1342 if (as->parms[SERVER].items) {
1344 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1345 ERR_ST_EXT("bos_ServerOpen", st);
1349 if (as->parms[EXECUTABLE].items) {
1350 executable = as->parms[EXECUTABLE].items->data;
1353 if (!bos_ExecutableRevert(bos_server, executable, &st)) {
1354 ERR_ST_EXT("bos_ExecutableRevert", st);
1357 bos_ServerClose(bos_server, 0);
1363 DoBosExecutableTimestampGet(struct cmd_syndesc *as, void *arock)
1365 typedef enum { SERVER, EXECUTABLE } DoBosExecutableTimestampGet_parm_t;
1366 afs_status_t st = 0;
1367 void *bos_server = NULL;
1368 const char *executable = NULL;
1369 afs_int32 new_time = 0;
1370 afs_int32 old_time = 0;
1371 afs_int32 bak_time = 0;
1373 if (as->parms[SERVER].items) {
1375 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1376 ERR_ST_EXT("bos_ServerOpen", st);
1380 if (as->parms[EXECUTABLE].items) {
1381 executable = as->parms[EXECUTABLE].items->data;
1384 if (!bos_ExecutableTimestampGet
1385 (bos_server, executable, &new_time, &old_time, &bak_time, &st)) {
1386 ERR_ST_EXT("bos_ExecutableTimestampGet", st);
1389 bos_ServerClose(bos_server, 0);
1395 DoBosExecutablePrune(struct cmd_syndesc *as, void *arock)
1397 typedef enum { SERVER, OLDFILES, BAKFILES,
1399 } DoBosExecutablePrune_parm_t;
1400 afs_status_t st = 0;
1401 void *bos_server = NULL;
1402 bos_Prune_t old_files = BOS_DONT_PRUNE;
1403 bos_Prune_t bak_files = BOS_DONT_PRUNE;
1404 bos_Prune_t core_files = BOS_DONT_PRUNE;
1406 if (as->parms[SERVER].items) {
1408 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1409 ERR_ST_EXT("bos_ServerOpen", st);
1413 if (as->parms[OLDFILES].items) {
1414 old_files = BOS_PRUNE;
1417 if (as->parms[BAKFILES].items) {
1418 bak_files = BOS_PRUNE;
1421 if (as->parms[COREFILES].items) {
1422 core_files = BOS_PRUNE;
1425 if (!bos_ExecutablePrune
1426 (bos_server, old_files, bak_files, core_files, &st)) {
1427 ERR_ST_EXT("bos_ExecutablePrune", st);
1430 bos_ServerClose(bos_server, 0);
1436 DoBosExecutableRestartTimeSet(struct cmd_syndesc *as, void *arock)
1438 typedef enum { SERVER, DAILY, WEEKLY,
1440 } DoBosExecutableRestartTimeSet_parm_t;
1441 afs_status_t st = 0;
1442 void *bos_server = NULL;
1443 bos_Restart_t type = 0;
1445 int have_weekly = 0;
1446 bos_RestartTime_t time;
1448 if (as->parms[SERVER].items) {
1450 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1451 ERR_ST_EXT("bos_ServerOpen", st);
1455 if (as->parms[DAILY].items) {
1456 type = BOS_RESTART_DAILY;
1460 if (as->parms[WEEKLY].items) {
1461 type = BOS_RESTART_WEEKLY;
1465 if ((have_daily == 0) && (have_weekly == 0)) {
1466 ERR_EXT("must specify either daily or weekly");
1469 if ((have_daily == 1) && (have_weekly == 1)) {
1470 ERR_EXT("must specify either daily or weekly, not both");
1473 if (as->parms[TIME].items) {
1474 if (ktime_ParsePeriodic(as->parms[TIME].items->data, &time) == -1) {
1475 ERR_EXT("error parsing time");
1479 if (!bos_ExecutableRestartTimeSet(bos_server, type, time, &st)) {
1480 ERR_ST_EXT("bos_ExecutableRestartTimeSet", st);
1483 bos_ServerClose(bos_server, 0);
1489 Print_bos_RestartTime_p(bos_RestartTime_p restart, const char *prefix)
1491 char tempString[50];
1497 if (restart->mask & BOS_RESTART_TIME_NEVER) {
1498 printf("%snever\n", prefix);
1499 } else if (restart->mask & BOS_RESTART_TIME_NOW) {
1500 printf("%snow\n", prefix);
1502 strcpy(astring, "at");
1503 if (restart->mask & BOS_RESTART_TIME_DAY) {
1504 strcat(astring, " ");
1505 strcat(astring, day[restart->day]);
1507 if (restart->mask & BOS_RESTART_TIME_HOUR) {
1508 if (restart->hour > 12)
1509 sprintf(tempString, " %d", restart->hour - 12);
1510 else if (restart->hour == 0)
1511 strcpy(tempString, " 12");
1513 sprintf(tempString, " %d", restart->hour);
1514 strcat(astring, tempString);
1516 if (restart->mask & BOS_RESTART_TIME_MINUTE) {
1517 sprintf(tempString, ":%02d", restart->min);
1518 strcat(astring, tempString);
1520 if ((restart->mask & BOS_RESTART_TIME_SECOND) && restart->sec != 0) {
1521 sprintf(tempString, ":%02d", restart->sec);
1522 strcat(astring, tempString);
1524 if (restart->mask & BOS_RESTART_TIME_HOUR) {
1525 if (restart->hour >= 12)
1526 strcat(astring, " pm");
1528 strcat(astring, " am");
1530 printf("%s%s\n", prefix, astring);
1535 DoBosExecutableRestartTimeGet(struct cmd_syndesc *as, void *arock)
1537 typedef enum { SERVER, DAILY,
1539 } DoBosExecutableRestartTimeGet_parm_t;
1540 afs_status_t st = 0;
1541 void *bos_server = NULL;
1542 bos_Restart_t type = 0;
1544 int have_weekly = 0;
1545 bos_RestartTime_t restart_time;
1547 if (as->parms[SERVER].items) {
1549 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1550 ERR_ST_EXT("bos_ServerOpen", st);
1554 if (as->parms[DAILY].items) {
1555 type = BOS_RESTART_DAILY;
1559 if (as->parms[WEEKLY].items) {
1560 type = BOS_RESTART_WEEKLY;
1564 if ((have_daily == 0) && (have_weekly == 0)) {
1565 ERR_EXT("must specify either daily or weekly");
1568 if ((have_daily == 1) && (have_weekly == 1)) {
1569 ERR_EXT("must specify either daily or weekly, not both");
1572 if (!bos_ExecutableRestartTimeGet(bos_server, type, &restart_time, &st)) {
1573 ERR_ST_EXT("bos_ExecutableRestartTimeGet", st);
1576 Print_bos_RestartTime_p(&restart_time, "");
1578 bos_ServerClose(bos_server, 0);
1583 #define INITIAL_BUF_SIZE 4096
1586 DoBosLogGet(struct cmd_syndesc *as, void *arock)
1588 typedef enum { SERVER, LOGFILE } DoBosLogGet_parm_t;
1589 afs_status_t st = 0;
1590 void *bos_server = NULL;
1591 const char *log_file = NULL;
1592 unsigned long buf_size = INITIAL_BUF_SIZE;
1595 if (as->parms[SERVER].items) {
1597 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1598 ERR_ST_EXT("bos_ServerOpen", st);
1602 if (as->parms[LOGFILE].items) {
1603 log_file = as->parms[LOGFILE].items->data;
1607 while (st == ADMMOREDATA) {
1608 buf = realloc(buf, buf_size);
1610 ERR_EXT("cannot dynamically allocate memory");
1612 bos_LogGet(bos_server, log_file, &buf_size, buf, &st);
1613 if (st == ADMMOREDATA) {
1614 buf_size = buf_size + (unsigned long)(0.2 * buf_size);
1619 ERR_ST_EXT("bos_LogGet", st);
1621 printf("Log file:\n%s", buf);
1628 bos_ServerClose(bos_server, 0);
1634 DoBosAuthSet(struct cmd_syndesc *as, void *arock)
1636 typedef enum { SERVER, REQUIREAUTH, DISABLEAUTH } DoBosAuthSet_parm_t;
1637 afs_status_t st = 0;
1638 void *bos_server = NULL;
1639 bos_Auth_t auth = 0;
1643 if (as->parms[SERVER].items) {
1645 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1646 ERR_ST_EXT("bos_ServerOpen", st);
1650 if (as->parms[REQUIREAUTH].items) {
1651 auth = BOS_AUTH_REQUIRED;
1655 if (as->parms[DISABLEAUTH].items) {
1660 if ((have_req == 0) && (have_dis == 0)) {
1661 ERR_EXT("must specify either requireauth or disableauth");
1664 if ((have_req == 1) && (have_dis == 1)) {
1665 ERR_EXT("must specify either requireauth or disableauth, not both");
1668 if (!bos_AuthSet(bos_server, auth, &st)) {
1669 ERR_ST_EXT("bos_AuthSet", st);
1672 bos_ServerClose(bos_server, 0);
1678 DoBosCommandExecute(struct cmd_syndesc *as, void *arock)
1680 typedef enum { SERVER, COMMAND } DoBosCommandExecute_parm_t;
1681 afs_status_t st = 0;
1682 void *bos_server = NULL;
1683 const char *command = NULL;
1685 if (as->parms[SERVER].items) {
1687 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1688 ERR_ST_EXT("bos_ServerOpen", st);
1692 if (as->parms[COMMAND].items) {
1693 command = as->parms[COMMAND].items->data;
1696 if (!bos_CommandExecute(bos_server, command, &st)) {
1697 ERR_ST_EXT("bos_CommandExecute", st);
1700 bos_ServerClose(bos_server, 0);
1706 DoBosSalvage(struct cmd_syndesc *as, void *arock)
1708 typedef enum { SERVER, PARTITION, VOLUME, NUMSALVAGERS, TMPDIR, LOGFILE,
1709 FORCE, NOWRITE, INODES, ROOTINODES, SALVAGEDIRS, BLOCKREADS
1710 } DoBosSalvage_parm_t;
1711 afs_status_t st = 0;
1712 void *bos_server = NULL;
1713 const char *partition = NULL;
1714 const char *volume = NULL;
1715 int num_salvagers = 1;
1716 const char *tmp_dir = NULL;
1717 const char *log_file = NULL;
1718 vos_force_t force = VOS_NORMAL;
1719 bos_SalvageDamagedVolumes_t no_write = BOS_SALVAGE_DAMAGED_VOLUMES;
1720 bos_WriteInodes_t inodes = BOS_SALVAGE_WRITE_INODES;
1721 bos_WriteRootInodes_t root_inodes = BOS_SALVAGE_WRITE_ROOT_INODES;
1722 bos_ForceDirectory_t salvage_dirs = BOS_SALVAGE_DONT_FORCE_DIRECTORIES;
1723 bos_ForceBlockRead_t block_reads = BOS_SALVAGE_DONT_FORCE_BLOCK_READS;
1726 if (as->parms[SERVER].items) {
1728 (cellHandle, as->parms[SERVER].items->data, &bos_server, &st)) {
1729 ERR_ST_EXT("bos_ServerOpen", st);
1733 if (as->parms[PARTITION].items) {
1734 partition = as->parms[PARTITION].items->data;
1737 if (as->parms[VOLUME].items) {
1738 volume = as->parms[VOLUME].items->data;
1741 if (as->parms[NUMSALVAGERS].items) {
1743 GetIntFromString(as->parms[NUMSALVAGERS].items->data,
1744 "invalid number of salvagers");
1747 if (as->parms[TMPDIR].items) {
1748 tmp_dir = as->parms[TMPDIR].items->data;
1751 if (as->parms[LOGFILE].items) {
1752 log_file = as->parms[LOGFILE].items->data;
1755 if (as->parms[FORCE].items) {
1759 if (as->parms[NOWRITE].items) {
1760 no_write = BOS_DONT_SALVAGE_DAMAGED_VOLUMES;
1763 if (as->parms[INODES].items) {
1764 inodes = BOS_SALVAGE_DONT_WRITE_INODES;
1767 if (as->parms[ROOTINODES].items) {
1768 root_inodes = BOS_SALVAGE_DONT_WRITE_ROOT_INODES;
1771 if (as->parms[SALVAGEDIRS].items) {
1772 salvage_dirs = BOS_SALVAGE_FORCE_DIRECTORIES;
1775 if (as->parms[BLOCKREADS].items) {
1776 block_reads = BOS_SALVAGE_FORCE_BLOCK_READS;
1780 (cellHandle, bos_server, partition, volume, num_salvagers, tmp_dir,
1781 log_file, force, no_write, inodes, root_inodes, salvage_dirs,
1782 block_reads, &st)) {
1783 ERR_ST_EXT("bos_Salvage", st);
1786 bos_ServerClose(bos_server, 0);
1793 Print_afs_RPCStatsState_p(afs_RPCStatsState_p state, const char *prefix)
1795 printf("%sThe rpc stats state is: ", prefix);
1797 case AFS_RPC_STATS_DISABLED:
1798 printf("disabled\n");
1800 case AFS_RPC_STATS_ENABLED:
1801 printf("enabled\n");
1808 SetupBosAdminCmd(void)
1810 struct cmd_syndesc *ts;
1812 ts = cmd_CreateSyntax("BosProcessCreate", DoBosProcessCreate, NULL,
1813 "create a new bos process");
1814 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1815 "server where process will be created");
1816 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1817 "the name of the process");
1818 cmd_AddParm(ts, "-binary", CMD_SINGLE, CMD_REQUIRED,
1819 "path to the process binary");
1820 cmd_AddParm(ts, "-cron", CMD_FLAG, CMD_OPTIONAL,
1821 "this is a cron process");
1822 cmd_AddParm(ts, "-crontime", CMD_SINGLE, CMD_OPTIONAL,
1823 "the time when the process will be run");
1824 cmd_AddParm(ts, "-notifier", CMD_SINGLE, CMD_OPTIONAL,
1825 "path to notifier binary that is run when process terminates");
1826 SetupCommonCmdArgs(ts);
1828 ts = cmd_CreateSyntax("BosFSProcessCreate", DoBosFSProcessCreate, NULL,
1829 "create a fs bos process");
1830 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1831 "server where process will be created");
1832 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1833 "the name of the process");
1834 cmd_AddParm(ts, "-fileserver", CMD_SINGLE, CMD_REQUIRED,
1835 "path to the fileserver binary");
1836 cmd_AddParm(ts, "-volserver", CMD_SINGLE, CMD_REQUIRED,
1837 "path to the volserver binary");
1838 cmd_AddParm(ts, "-salvager", CMD_SINGLE, CMD_REQUIRED,
1839 "path to the salvager binary");
1840 cmd_AddParm(ts, "-notifier", CMD_SINGLE, CMD_OPTIONAL,
1841 "path to notifier binary that is run when process terminates");
1842 SetupCommonCmdArgs(ts);
1844 ts = cmd_CreateSyntax("BosProcessDelete", DoBosProcessDelete, NULL,
1845 "delete a bos process");
1846 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1847 "server where process will be deleted");
1848 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1849 "the name of the process");
1850 SetupCommonCmdArgs(ts);
1852 ts = cmd_CreateSyntax("BosProcessExecutionStateGet",
1853 DoBosProcessExecutionStateGet, NULL,
1854 "get the process execution state of a process");
1855 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1856 "server where process exists");
1857 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1858 "the name of the process");
1859 SetupCommonCmdArgs(ts);
1861 ts = cmd_CreateSyntax("BosProcessExecutionStateSet",
1862 DoBosProcessExecutionStateSet, NULL,
1863 "set the process execution state of a process");
1864 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1865 "server where process exists");
1866 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1867 "the name of the process");
1868 cmd_AddParm(ts, "-stopped", CMD_FLAG, CMD_OPTIONAL,
1869 "set the process state to stopped");
1870 cmd_AddParm(ts, "-running", CMD_FLAG, CMD_OPTIONAL,
1871 "set the process state to running");
1872 SetupCommonCmdArgs(ts);
1874 ts = cmd_CreateSyntax("BosProcessExecutionStateSetTemporary",
1875 DoBosProcessExecutionStateSetTemporary, NULL,
1876 "set the process execution state "
1877 "of a process temporarily");
1878 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1879 "server where process exists");
1880 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1881 "the name of the process");
1882 cmd_AddParm(ts, "-stopped", CMD_FLAG, CMD_OPTIONAL,
1883 "set the process state to stopped");
1884 cmd_AddParm(ts, "-running", CMD_FLAG, CMD_OPTIONAL,
1885 "set the process state to running");
1886 SetupCommonCmdArgs(ts);
1888 ts = cmd_CreateSyntax("BosProcessNameList", DoBosProcessNameList, NULL,
1889 "list the names of all processes at a bos server");
1890 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
1891 SetupCommonCmdArgs(ts);
1893 ts = cmd_CreateSyntax("BosProcessInfoGet", DoBosProcessInfoGet, NULL,
1894 "get information about a process");
1895 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1896 "server where process exists");
1897 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1898 "the name of the process");
1899 SetupCommonCmdArgs(ts);
1901 ts = cmd_CreateSyntax("BosProcessParameterList",
1902 DoBosProcessParameterList, NULL,
1903 "list the parameters of a process");
1904 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1905 "server where process exists");
1906 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1907 "the name of the process");
1908 SetupCommonCmdArgs(ts);
1910 ts = cmd_CreateSyntax("BosProcessNotifierGet", DoBosProcessNotifierGet, NULL,
1911 "get the notifier for a process");
1912 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1913 "server where process exists");
1914 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1915 "the name of the process");
1916 SetupCommonCmdArgs(ts);
1918 ts = cmd_CreateSyntax("BosProcessRestart", DoBosProcessRestart, NULL,
1919 "restart a process");
1920 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1921 "server where process exists");
1922 cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED,
1923 "the name of the process");
1924 SetupCommonCmdArgs(ts);
1926 ts = cmd_CreateSyntax("BosProcessAllStop", DoBosProcessAllStop, NULL,
1927 "stop all processes at a bos server");
1928 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1929 "server where processes exists");
1930 SetupCommonCmdArgs(ts);
1932 ts = cmd_CreateSyntax("BosProcessAllWaitStop", DoBosProcessAllWaitStop, NULL,
1933 "stop all processes at a bos server and block "
1934 "until they all exit");
1935 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1936 "server where processes exists");
1937 SetupCommonCmdArgs(ts);
1939 ts = cmd_CreateSyntax("BosProcessAllWaitTransition",
1940 DoBosProcessAllWaitTransition, NULL,
1941 "wait until all processes have transitioned to "
1942 "their desired state");
1943 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1944 "server where processes exists");
1945 SetupCommonCmdArgs(ts);
1947 ts = cmd_CreateSyntax("BosProcessAllStopAndRestart",
1948 DoBosProcessAllStopAndRestart, NULL,
1949 "stop all processes at a bos server and "
1950 "then restart them");
1951 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1952 "server where processes exists");
1953 cmd_AddParm(ts, "-includebos", CMD_FLAG, CMD_OPTIONAL,
1954 "include the bos server in the processes to be restarted");
1955 SetupCommonCmdArgs(ts);
1957 ts = cmd_CreateSyntax("BosAdminCreate", DoBosAdminCreate, NULL,
1958 "create an admin user at a bos server");
1959 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1960 "server where admin will be created");
1961 cmd_AddParm(ts, "-admin", CMD_SINGLE, CMD_REQUIRED,
1962 "the name of the administrator to add");
1963 SetupCommonCmdArgs(ts);
1965 ts = cmd_CreateSyntax("BosAdminDelete", DoBosAdminDelete, NULL,
1966 "delete an admin user at a bos server");
1967 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1968 "server where admin will be deleted");
1969 cmd_AddParm(ts, "-admin", CMD_SINGLE, CMD_REQUIRED,
1970 "the name of the administrator to delete");
1971 SetupCommonCmdArgs(ts);
1973 ts = cmd_CreateSyntax("BosAdminList", DoBosAdminList, NULL,
1974 "list all admin users at a bos server");
1975 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1976 "server where admins will be listed");
1977 SetupCommonCmdArgs(ts);
1979 ts = cmd_CreateSyntax("BosKeyCreate", DoBosKeyCreate, NULL,
1980 "create a key at a bos server");
1981 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1982 "server where key will be created");
1983 cmd_AddParm(ts, "-versionnumber", CMD_SINGLE, CMD_REQUIRED,
1984 "version number of new key");
1985 cmd_AddParm(ts, "-key", CMD_SINGLE, CMD_REQUIRED, "new encryption key");
1986 SetupCommonCmdArgs(ts);
1988 ts = cmd_CreateSyntax("BosKeyDelete", DoBosKeyDelete, NULL,
1989 "delete a key at a bos server");
1990 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1991 "server where key will be deleted");
1992 cmd_AddParm(ts, "-versionnumber", CMD_SINGLE, CMD_REQUIRED,
1993 "version number of the key");
1994 SetupCommonCmdArgs(ts);
1996 ts = cmd_CreateSyntax("BosKeyList", DoBosKeyList, NULL,
1997 "list keys at a bos server");
1998 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1999 "server where keys exist");
2000 SetupCommonCmdArgs(ts);
2002 ts = cmd_CreateSyntax("BosCellSet", DoBosCellSet, NULL,
2003 "set the cell at a bos server");
2004 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2005 cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_REQUIRED, "new cell");
2006 SetupCommonCmdArgs(ts);
2008 ts = cmd_CreateSyntax("BosCellGet", DoBosCellGet, NULL,
2009 "get the cell at a bos server");
2010 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
2011 SetupCommonCmdArgs(ts);
2013 ts = cmd_CreateSyntax("BosHostCreate", DoBosHostCreate, NULL,
2014 "add a host entry to the server CellServDB");
2015 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2016 cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_REQUIRED, "host to add");
2017 SetupCommonCmdArgs(ts);
2019 ts = cmd_CreateSyntax("BosHostDelete", DoBosHostDelete, NULL,
2020 "delete a host entry from the server CellServDB");
2021 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2022 cmd_AddParm(ts, "-host", CMD_SINGLE, CMD_REQUIRED, "host to delete");
2023 SetupCommonCmdArgs(ts);
2025 ts = cmd_CreateSyntax("BosHostList", DoBosHostList, NULL,
2026 "list all host entries from the server CellServDB");
2027 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
2028 SetupCommonCmdArgs(ts);
2030 ts = cmd_CreateSyntax("BosExecutableCreate", DoBosExecutableCreate, NULL,
2031 "create a new binary at a bos server");
2032 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2033 cmd_AddParm(ts, "-binary", CMD_SINGLE, CMD_REQUIRED,
2034 "path to the binary to create");
2035 cmd_AddParm(ts, "-dest", CMD_SINGLE, CMD_REQUIRED,
2036 "path where the binary will be stored");
2037 SetupCommonCmdArgs(ts);
2039 ts = cmd_CreateSyntax("BosExecutableRevert", DoBosExecutableRevert, NULL,
2040 "revert a binary at a bos server");
2041 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2042 cmd_AddParm(ts, "-executable", CMD_SINGLE, CMD_REQUIRED,
2043 "path to the binary to revert");
2044 SetupCommonCmdArgs(ts);
2046 ts = cmd_CreateSyntax("BosExecutableTimestampGet",
2047 DoBosExecutableTimestampGet, NULL,
2048 "get the timestamps for a binary at bos server");
2049 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
2050 cmd_AddParm(ts, "-executable", CMD_SINGLE, CMD_REQUIRED,
2051 "path to the binary to revert");
2052 SetupCommonCmdArgs(ts);
2054 ts = cmd_CreateSyntax("BosExecutablePrune", DoBosExecutablePrune, NULL,
2055 "prune various files at bos server");
2056 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2057 cmd_AddParm(ts, "-oldfiles", CMD_FLAG, CMD_OPTIONAL, "prune .old files");
2058 cmd_AddParm(ts, "-bakfiles", CMD_FLAG, CMD_OPTIONAL, "prune .bak files");
2059 cmd_AddParm(ts, "-corefiles", CMD_FLAG, CMD_OPTIONAL, "prune core files");
2060 SetupCommonCmdArgs(ts);
2062 ts = cmd_CreateSyntax("BosExecutableRestartTimeSet",
2063 DoBosExecutableRestartTimeSet, NULL,
2064 "set the restart times at a bos server");
2065 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2066 cmd_AddParm(ts, "-daily", CMD_FLAG, CMD_OPTIONAL,
2067 "set daily restart time");
2068 cmd_AddParm(ts, "-weekly", CMD_FLAG, CMD_OPTIONAL,
2069 "set weekly restart time");
2070 cmd_AddParm(ts, "-time", CMD_SINGLE, CMD_REQUIRED,
2071 "the new restart time");
2072 SetupCommonCmdArgs(ts);
2074 ts = cmd_CreateSyntax("BosExecutableRestartTimeGet",
2075 DoBosExecutableRestartTimeGet, NULL,
2076 "get the restart times at a bos server");
2077 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
2078 cmd_AddParm(ts, "-daily", CMD_FLAG, CMD_OPTIONAL,
2079 "get daily restart time");
2080 cmd_AddParm(ts, "-weekly", CMD_FLAG, CMD_OPTIONAL,
2081 "get weekly restart time");
2082 SetupCommonCmdArgs(ts);
2084 ts = cmd_CreateSyntax("BosLogGet", DoBosLogGet, NULL,
2085 "get a log file from the bos server");
2086 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
2087 cmd_AddParm(ts, "-logfile", CMD_SINGLE, CMD_REQUIRED,
2088 "path to the log file to retrieve");
2089 SetupCommonCmdArgs(ts);
2091 ts = cmd_CreateSyntax("BosAuthSet", DoBosAuthSet, NULL,
2092 "set the authorization level at a bos server");
2093 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to modify");
2094 cmd_AddParm(ts, "-requireauth", CMD_FLAG, CMD_OPTIONAL,
2095 "require authorization");
2096 cmd_AddParm(ts, "-disableauth", CMD_FLAG, CMD_OPTIONAL,
2097 "don't require authorization");
2098 SetupCommonCmdArgs(ts);
2100 ts = cmd_CreateSyntax("BosCommandExecute", DoBosCommandExecute, 0,
2101 "execute a command at a bos server");
2102 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2103 "server where command will execute");
2104 cmd_AddParm(ts, "-command", CMD_SINGLE, CMD_REQUIRED,
2105 "command to execute");
2106 SetupCommonCmdArgs(ts);
2108 ts = cmd_CreateSyntax("BosSalvage", DoBosSalvage, NULL,
2109 "execute a salvage command at a bos server");
2110 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
2111 "server where salvager will execute");
2112 cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL,
2113 "partition to salvage");
2114 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_OPTIONAL, "volume to salvage");
2115 cmd_AddParm(ts, "-numsalvagers", CMD_SINGLE, CMD_REQUIRED,
2116 "number of salvagers to run in parallel");
2117 cmd_AddParm(ts, "-tmpdir", CMD_SINGLE, CMD_OPTIONAL,
2118 "directory to place temporary files");
2119 cmd_AddParm(ts, "-logfile", CMD_SINGLE, CMD_OPTIONAL,
2120 "file where salvager log will be written");
2121 cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL, "run salvager -force");
2122 cmd_AddParm(ts, "-nowrite", CMD_FLAG, CMD_OPTIONAL,
2123 "run salvager -nowrite");
2124 cmd_AddParm(ts, "-inodes", CMD_FLAG, CMD_OPTIONAL,
2125 "run salvager -inodes");
2126 cmd_AddParm(ts, "-rootinodes", CMD_FLAG, CMD_OPTIONAL,
2127 "run salvager -rootinodes");
2128 cmd_AddParm(ts, "-salvagedirs", CMD_FLAG, CMD_OPTIONAL,
2129 "run salvager -salvagedirs");
2130 cmd_AddParm(ts, "-blockreads", CMD_FLAG, CMD_OPTIONAL,
2131 "run salvager -blockreads");
2132 SetupCommonCmdArgs(ts);