/////////////////////////////////////////////////////////////////////////////////////////// /// \brief Prints the nodes recursively /// \author DJ /// \date 20051021 /// \test No /// \todo Remove root-argument /// \warning Changed 2005-11-28 the root-argument is newer used /////////////////////////////////////////////////////////////////////////////////////////// void print_nodes_rec(node *root,node *n, char print_mode){ int i; if( !is_terminal(n)){ if( n->accepted == FALSE && print_mode == PM_FINAL) dprint(RES_FILE,"[%s %4.2e]",REJ_WORD, 1.0-n->prob); if(print_mode == PM_INPUT && FIXAGE_MODE == TRUE) print_fixage_data(n); dprint(RES_FILE,"%c",SYM_LEFT); for (i =0 ; i < n->num_of_children-1; i++) { print_nodes_rec(root,n->child[i],print_mode); dprint(RES_FILE,"%c",SYM_COMMA); } print_nodes_rec(root,n->child[n->num_of_children-1],print_mode); dprint(RES_FILE,"%c",SYM_RIGHT); } print_node_line(n,print_mode); }
/* Used to handle store starting/stopping, interface is mostly identical */ static int start_or_stop_stores(int action) { int all = 0; /* if -a flag, then start/stop all, instead of kb name */ int kb_name_len = 11; if (args_index < 0) { /* no argument given, display help text */ fsa_error( LOG_ERR, "No store name(s) given. Use `%s help %s' for details", program_invocation_short_name, argv[cmd_index] ); return 1; } if (strcmp("-a", argv[args_index]) == 0 || strcmp("--all", argv[args_index]) == 0) { all = 1; /* all stores */ } else { /* check for invalid store names */ for (int i = args_index; i < argc; i++) { if (!fsa_is_valid_kb_name(argv[i])) { fsa_error(LOG_ERR, "'%s' is not a valid store name", argv[i]); return 1; } int len = strlen(argv[i]); if (len > kb_name_len) { kb_name_len = len; } } } /* get list of all storage nodes */ fsa_node_addr *nodes = get_storage_nodes(); /* Setup hints information */ struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; int sock_fd, len; char ipaddr[INET6_ADDRSTRLEN]; unsigned char *buf; int node_num = 0; unsigned char *cmd = NULL; int n_errors = 0; /* to be set by fsa_send_recv_cmd */ int response, bufsize, err; int print_node_header = 1; int print_store_header = 1; for (fsa_node_addr *n = nodes; n != NULL; n = n->next) { sock_fd = fsaf_connect_to_admind(n->host, n->port, &hints, ipaddr); print_node_line(node_num, n->host, print_node_header); print_node_header = 0; node_num += 1; if (sock_fd == -1) { print_colour("unreachable\n", ANSI_COLOUR_RED); continue; } if (all) { /* start/stop all kbs */ if (action == STOP_STORE) { cmd = fsap_encode_cmd_stop_kb_all(&len); } else if (action == START_STORE) { cmd = fsap_encode_cmd_start_kb_all(&len); } if (cmd == NULL) { fsa_error(LOG_CRIT, "failed to encode %s command", argv[cmd_index]); n_errors += 1; break; } fsa_error(LOG_DEBUG, "sending '%s' command to %s:%d", argv[cmd_index], n->host, n->port); /* send command and get reply */ buf = fsaf_send_recv_cmd(n, sock_fd, cmd, len, &response, &bufsize, &err); /* usually a network error */ if (buf == NULL) { /* error already handled */ n_errors += 1; break; } /* should get this if all went well */ if (response == ADM_RSP_EXPECT_N_KB) { int rv; uint8_t rspval; uint16_t datasize; unsigned char header_buf[ADM_HEADER_LEN]; fsa_kb_response *kbr = NULL; int max_kb_len; int expected_responses = fsap_decode_rsp_expect_n_kb(buf, &max_kb_len); free(buf); fsa_error(LOG_DEBUG, "expecting %d responses from server", expected_responses); /* print header */ if (print_store_header) { if (colour_flag) { printf(ANSI_COLOUR_BLUE); } printf(" %-*s status\n", max_kb_len, "store_name"); if (colour_flag) { printf(ANSI_COLOUR_RESET); } } /* get packet from server for each kb started/stopped */ for (int i = 0; i < expected_responses; i++) { rv = fsa_fetch_header(sock_fd, header_buf); if (rv == -1) { fsa_error(LOG_ERR, "failed to get response from %s:%d", n->host, n->port); break; } fsa_error(LOG_DEBUG, "got header %d/%d", i+1, expected_responses); rv = fsap_decode_header(header_buf, &rspval, &datasize); if (rv == -1) { fsa_error(LOG_CRIT, "unable to decode header from %s:%d", n->host, n->port); break; } if (rspval == ADM_RSP_ABORT_EXPECT) { fsa_error(LOG_ERR, "operation aborted by server"); break; } buf = (unsigned char *)malloc(datasize); rv = fsaf_recv_from_admind(sock_fd, buf, datasize); if (rv < 0) { /* error already handled/logged */ free(buf); break; } if (rspval == ADM_RSP_STOP_KB) { kbr = fsap_decode_rsp_stop_kb(buf); printf(" %-*s ", max_kb_len, kbr->kb_name); switch (kbr->return_val) { case ADM_ERR_OK: case ADM_ERR_KB_STATUS_STOPPED: print_colour("stopped", ANSI_COLOUR_GREEN); break; case ADM_ERR_KB_STATUS_UNKNOWN: print_colour("unknown", ANSI_COLOUR_RED); break; default: fsa_error( LOG_CRIT, "Unknown server response: %d", kbr->return_val ); print_colour("unknown", ANSI_COLOUR_RED); break; } } else if (rspval == ADM_RSP_START_KB) { kbr = fsap_decode_rsp_start_kb(buf); printf(" %-*s ", max_kb_len, kbr->kb_name); switch (kbr->return_val) { case ADM_ERR_OK: case ADM_ERR_KB_STATUS_RUNNING: print_colour("running", ANSI_COLOUR_GREEN); break; case ADM_ERR_KB_STATUS_STOPPED: print_colour("stopped", ANSI_COLOUR_YELLOW); break; case ADM_ERR_KB_STATUS_UNKNOWN: print_colour("unknown", ANSI_COLOUR_RED); break; default: fsa_error( LOG_CRIT, "Unknown server response: %d", kbr->return_val ); print_colour("unknown", ANSI_COLOUR_RED); break; } } printf("\n"); free(buf); buf = NULL; fsa_kb_response_free(kbr); kbr = NULL; } } else if (response == ADM_RSP_ERROR) { unsigned char *errmsg = fsap_decode_rsp_error(buf, bufsize); fsa_error(LOG_ERR, "server error: %s", errmsg); free(errmsg); free(buf); } else { fsa_error(LOG_ERR, "unexpected response from server: %d", response); free(buf); } } else { /* print header */ if (print_store_header) { if (colour_flag) { printf(ANSI_COLOUR_BLUE); } printf(" %-*s status\n", kb_name_len, "store_name"); if (colour_flag) { printf(ANSI_COLOUR_RESET); } print_store_header = 0; } /* stop kbs given on command line */ for (int i = args_index; i < argc; i++) { /* send start/stop command for each kb */ if (action == STOP_STORE) { cmd = fsap_encode_cmd_stop_kb((unsigned char *)argv[i], &len); } else if (action == START_STORE) { cmd = fsap_encode_cmd_start_kb((unsigned char *)argv[i], &len); } if (cmd == NULL) { fsa_error(LOG_CRIT, "failed to encode %s command", argv[cmd_index]); n_errors += 1; break; } fsa_error(LOG_DEBUG, "sending %s '%s' command to %s:%d", argv[cmd_index], argv[i], n->host, n->port); buf = fsaf_send_recv_cmd(n, sock_fd, cmd, len, &response, &bufsize, &err); free(cmd); cmd = NULL; /* usually a network error */ if (buf == NULL) { /* error already handled */ n_errors += 1; break; } printf(" %-*s ", kb_name_len, argv[i]); fsa_kb_response *kbr = NULL; if (response == ADM_RSP_STOP_KB) { kbr = fsap_decode_rsp_stop_kb(buf); switch (kbr->return_val) { case ADM_ERR_OK: case ADM_ERR_KB_STATUS_STOPPED: print_colour("stopped", ANSI_COLOUR_GREEN); break; case ADM_ERR_KB_NOT_EXISTS: print_colour("store_not_found", ANSI_COLOUR_RED); break; default: print_colour("unknown", ANSI_COLOUR_RED); break; } printf("\n"); fsa_kb_response_free(kbr); } else if (response == ADM_RSP_START_KB) { kbr = fsap_decode_rsp_start_kb(buf); switch (kbr->return_val) { case ADM_ERR_OK: case ADM_ERR_KB_STATUS_RUNNING: print_colour("running", ANSI_COLOUR_GREEN); break; case ADM_ERR_KB_STATUS_STOPPED: print_colour("stopped", ANSI_COLOUR_YELLOW); break; case ADM_ERR_KB_NOT_EXISTS: print_colour("store_not_found", ANSI_COLOUR_RED); break; default: print_colour("unknown", ANSI_COLOUR_RED); break; } printf("\n"); fsa_kb_response_free(kbr); } else if (response == ADM_RSP_ERROR) { unsigned char *msg = fsap_decode_rsp_error(buf, bufsize); printf("unknown: %s\n", msg); free(msg); n_errors += 1; } else { fsa_error(LOG_CRIT, "unknown response from server"); n_errors += 1; } free(buf); } } /* done with current server */ close(sock_fd); } if (n_errors > 0) { return 1; } return 0; }
static int cmd_list_stores_verbose(void) { fsa_node_addr *nodes = get_nodes_from_cmd_line(); if (nodes == NULL) { /* error messages already printed */ return 1; } fsa_node_addr *node = nodes; fsa_node_addr *tmp_node = NULL; fsa_kb_info *ki; fsa_kb_info *kis; int node_num = 0; int info_header_printed = 0; int print_node_header = 1; /* connect to each node separately */ while (node != NULL) { print_node_line(node_num, node->host, print_node_header); print_node_header = 0; /* only pass a single node to fetch_kb_info, so break linked list */ tmp_node = node->next; node->next = NULL; kis = fsaf_fetch_kb_info(NULL, node); /* restore next item in list */ node->next = tmp_node; /* TODO: better error handling, differentiate between err and no * stores */ if (kis != NULL) { /* get column widths */ int max_name = 10; int max_segs = 10; int curlen; for (ki = kis; ki != NULL; ki = ki->next) { curlen = strlen((char *)ki->name); if (curlen > max_name) { max_name = curlen; } curlen = ki->p_segments_len * 3; if (curlen > max_segs) { max_segs = curlen; } } /* print header */ if (!info_header_printed) { if (colour_flag) { printf(ANSI_COLOUR_BLUE); } printf(" %-*s status port number_of_segments\n", max_name, "store_name"); if (colour_flag) { printf(ANSI_COLOUR_RESET); } info_header_printed = 1; } /* print kb info */ for (ki = kis; ki != NULL; ki = ki->next) { printf(" %-*s ", max_name, ki->name); const char *kistat = fsa_kb_info_status_to_string(ki->status); if (ki->status == KB_STATUS_RUNNING) { print_colour(kistat, ANSI_COLOUR_GREEN); } else if (ki->status == KB_STATUS_STOPPED) { print_colour(kistat, ANSI_COLOUR_RED); } else { print_colour(kistat, ANSI_COLOUR_YELLOW); } printf(" "); if (ki->port > 0) { printf("%-5d ", ki->port); } else { printf(" "); } if (ki->p_segments_len > 0) { if (verbosity == V_VERBOSE) { for (int i = 0; i < ki->p_segments_len; i++) { printf("%d", ki->p_segments_data[i]); if (i == ki->p_segments_len-1) { printf(" of %d", ki->num_segments); } else { printf(","); } } } else { /* print summary of segments */ printf("%d of %d", ki->p_segments_len, ki->num_segments); } } printf("\n"); } } fsa_kb_info_free(kis); node_num += 1; node = node->next; } fsa_node_addr_free(nodes); return 0; }