int main(int argc, char **argv) { long timeout; char host[MAX_DB_HOST_NAMELEN]; int port; char user[MAX_USER_PASSWD_LEN]; char pass[MAX_USER_PASSWD_LEN]; int node_count; int ch; int optindex; static struct option long_options[] = { {"debug", no_argument, NULL, 'd'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; while ((ch = getopt_long(argc, argv, "hd", long_options, &optindex)) != -1) { switch (ch) { case 'd': pcp_enable_debug(); break; case 'h': case '?': default: usage(); exit(0); } } argc -= optind; argv += optind; if (argc != 5) { errorcode = INVALERR; pcp_errorstr(errorcode); myexit(errorcode); } timeout = atol(argv[0]); if (timeout < 0) { errorcode = INVALERR; pcp_errorstr(errorcode); myexit(errorcode); } if (strlen(argv[1]) >= MAX_DB_HOST_NAMELEN) { errorcode = INVALERR; pcp_errorstr(errorcode); myexit(errorcode); } strcpy(host, argv[1]); port = atoi(argv[2]); if (port <= 1024 || port > 65535) { errorcode = INVALERR; pcp_errorstr(errorcode); myexit(errorcode); } if (strlen(argv[3]) >= MAX_USER_PASSWD_LEN) { errorcode = INVALERR; pcp_errorstr(errorcode); myexit(errorcode); } strcpy(user, argv[3]); if (strlen(argv[4]) >= MAX_USER_PASSWD_LEN) { errorcode = INVALERR; pcp_errorstr(errorcode); myexit(errorcode); } strcpy(pass, argv[4]); pcp_set_timeout(timeout); if (pcp_connect(host, port, user, pass)) { pcp_errorstr(errorcode); myexit(errorcode); } if ((node_count = pcp_node_count()) < 0) { pcp_errorstr(errorcode); pcp_disconnect(); myexit(errorcode); } else { printf("%d\n", node_count); } pcp_disconnect(); return 0; }
int main(int argc, char **argv) { char* host = NULL; int port = 9898; char* user = NULL; char* pass = NULL; int nodeID = -1; int processID = 0; int ch; char shutdown_mode = 's'; int optindex; int i; bool all = false; bool debug = false; bool need_password = true; bool gracefully = false; bool verbose = false; PCPConnInfo* pcpConn; PCPResultInfo* pcpResInfo; /* here we put all the allowed long options for all utilities */ static struct option long_options[] = { {"help", no_argument, NULL, '?'}, {"debug", no_argument, NULL, 'd'}, {"version", no_argument, NULL, 'V'}, {"host", required_argument, NULL, 'h'}, {"port", required_argument, NULL, 'p'}, {"process-id", required_argument, NULL, 'P'}, {"username", required_argument, NULL, 'U'}, {"no-password", no_argument, NULL, 'w'}, {"password", no_argument, NULL, 'W'}, {"mode", required_argument, NULL, 'm'}, {"gracefully", no_argument, NULL, 'g'}, {"verbose", no_argument, NULL, 'v'}, {"all", no_argument, NULL, 'a'}, {"node-id", required_argument, NULL, 'n'}, {"watchdog-id", required_argument, NULL, 'n'}, {NULL, 0, NULL, 0} }; /* Identify the utility app */ progname = get_progname(argv[0]); for( i =0; ;i++) { current_app_type = &AllAppTypes[i]; if(current_app_type->app_type == UNKNOWN) break; if (strcmp(current_app_type->app_name, progname) == 0) break; } if(current_app_type->app_type == UNKNOWN) { fprintf(stderr, "%s is a invalid PCP utility\n",progname); exit(1); } if (argc > 1) { if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) { usage(); exit(0); } else if (strcmp(argv[1], "-V") == 0 || strcmp(argv[1], "--version") == 0) { fprintf(stderr, "%s (%s) %s\n",progname,PACKAGE, VERSION); exit(0); } } while ((ch = getopt_long(argc, argv, current_app_type->allowed_options, long_options, &optindex)) != -1) { switch (ch) { case 'd': debug = true; break; case 'a': all = true; break; case 'w': need_password = false; break; case 'W': need_password = true; break; case 'g': gracefully = true; break; case 'm': if (current_app_type->app_type == PCP_STOP_PGPOOL) { if (strcmp(optarg, "s") == 0 || strcmp(optarg, "smart") == 0) shutdown_mode = 's'; else if (strcmp(optarg, "f") == 0 || strcmp(optarg, "fast") == 0) shutdown_mode = 'f'; else if (strcmp(optarg, "i") == 0 || strcmp(optarg, "immediate") == 0) shutdown_mode = 'i'; else { fprintf(stderr, "%s: Invalid shutdown mode \"%s\", must be either \"smart\" \"immediate\" or \"fast\" \n",progname,optarg); exit(1); } } else { fprintf(stderr, "Invalid argument \"%s\", Try \"%s --help\" for more information.\n",optarg,progname); exit(1); } break; case 'v': verbose = true; break; case 'n': nodeID = atoi(optarg); if (current_app_type->app_type == PCP_WATCHDOG_INFO) { if (nodeID < 0) { fprintf(stderr, "%s: Invalid watchdog-id \"%s\", must be a positive number or zero for a local watchdog node\n",progname,optarg); exit(0); } } else { if (nodeID < 0 || nodeID > MAX_NUM_BACKENDS) { fprintf(stderr, "%s: Invalid node-id \"%s\", must be between 0 and %d\n",progname,optarg,MAX_NUM_BACKENDS); exit(0); } } break; case 'p': port = atoi(optarg); if (port <= 1024 || port > 65535) { fprintf(stderr, "%s: Invalid port number \"%s\", must be between 1024 and 65535\n",progname,optarg); exit(0); } break; case 'P': /* PID */ processID = atoi(optarg); if (processID <= 0 ) { fprintf(stderr, "%s: Invalid process-id \"%s\", must be greater than 0\n",progname,optarg); exit(0); } break; case 'h': host = strdup(optarg); break; case 'U': user = strdup(optarg); break; case '?': default: /* * getopt_long whould already have emitted a complaint */ fprintf(stderr, "Try \"%s --help\" for more information.\n\n",progname); exit(1); } } /* * if we still have arguments, use it */ while (argc - optind >= 1) { if (current_app_type->app_type == PCP_PROC_INFO && processID <= 0) { processID = atoi(argv[optind]); if (processID <= 0 ) { fprintf(stderr, "%s: Invalid process-id \"%s\", must be greater than 0\n",progname,optarg); exit(0); } } else if (current_app_type->app_type == PCP_WATCHDOG_INFO && nodeID < 0) { nodeID = atoi(argv[optind]); if (nodeID < 0 ) { fprintf(stderr, "%s: Invalid watchdog-id \"%s\", must be a positive number or zero for local watchdog node\n",progname,optarg); exit(0); } } else if (app_require_nodeID() && nodeID < 0) { nodeID = atoi(argv[optind]); if (nodeID < 0 || nodeID > MAX_NUM_BACKENDS) { fprintf(stderr, "%s: Invalid node-id \"%s\", must be between 0 and %d\n",progname,optarg,MAX_NUM_BACKENDS); exit(0); } } else fprintf(stderr, "%s: Warning: extra command-line argument \"%s\" ignored\n", progname, argv[optind]); optind++; } if(nodeID < 0) { if (app_require_nodeID()) { fprintf(stderr, "%s: missing node-id\n",progname); fprintf(stderr, "Try \"%s --help\" for more information.\n\n",progname); exit(1); } else if (current_app_type->app_type == PCP_WATCHDOG_INFO) { nodeID = -1; } } /* Get a new password if appropriate */ if (need_password) { pass = simple_prompt("Password: "******"%s\n",pcp_get_last_error(pcpConn)?pcp_get_last_error(pcpConn):"Unknown Error"); exit(1); } /* * Okay the connection is successful not call the actual PCP function */ if (current_app_type->app_type == PCP_ATTACH_NODE) { pcpResInfo = pcp_attach_node(pcpConn,nodeID); } else if (current_app_type->app_type == PCP_DETACH_NODE) { if (gracefully) pcpResInfo = pcp_detach_node_gracefully(pcpConn,nodeID); else pcpResInfo = pcp_detach_node(pcpConn,nodeID); } else if (current_app_type->app_type == PCP_NODE_COUNT) { pcpResInfo = pcp_node_count(pcpConn); } else if (current_app_type->app_type == PCP_NODE_INFO) { pcpResInfo = pcp_node_info(pcpConn,nodeID); } else if (current_app_type->app_type == PCP_POOL_STATUS) { pcpResInfo = pcp_pool_status(pcpConn); } else if (current_app_type->app_type == PCP_PROC_COUNT) { pcpResInfo = pcp_process_count(pcpConn); } else if (current_app_type->app_type == PCP_PROC_INFO) { pcpResInfo = pcp_process_info(pcpConn, processID); } else if (current_app_type->app_type == PCP_PROMOTE_NODE) { if (gracefully) pcpResInfo = pcp_promote_node_gracefully(pcpConn,nodeID); else pcpResInfo = pcp_promote_node(pcpConn,nodeID); } else if (current_app_type->app_type == PCP_RECOVERY_NODE) { pcpResInfo = pcp_recovery_node(pcpConn, nodeID); } else if (current_app_type->app_type == PCP_STOP_PGPOOL) { pcpResInfo = pcp_terminate_pgpool(pcpConn, shutdown_mode); } else if (current_app_type->app_type == PCP_WATCHDOG_INFO) { pcpResInfo = pcp_watchdog_info(pcpConn,nodeID); } else { /* should never happen */ fprintf(stderr,"%s: Invalid pcp process\n",progname); goto DISCONNECT_AND_EXIT; } if(pcpResInfo == NULL || PCPResultStatus(pcpResInfo) != PCP_RES_COMMAND_OK) { fprintf(stderr, "%s\n",pcp_get_last_error(pcpConn)?pcp_get_last_error(pcpConn):"Unknown Error"); goto DISCONNECT_AND_EXIT; } if (pcp_result_is_empty(pcpResInfo)) { fprintf(stdout,"%s -- Command Successful\n",progname); } else { if (current_app_type->app_type == PCP_NODE_COUNT) output_nodecount_result(pcpResInfo, verbose); if (current_app_type->app_type == PCP_NODE_INFO) output_nodeinfo_result(pcpResInfo, verbose); if (current_app_type->app_type == PCP_POOL_STATUS) output_poolstatus_result(pcpResInfo, verbose); if (current_app_type->app_type == PCP_PROC_COUNT) output_proccount_result(pcpResInfo, verbose); if (current_app_type->app_type == PCP_PROC_INFO) output_procinfo_result(pcpResInfo, all, verbose); else if (current_app_type->app_type == PCP_WATCHDOG_INFO) output_watchdog_info_result(pcpResInfo, verbose); } DISCONNECT_AND_EXIT: pcp_disconnect(pcpConn); pcp_free_connection(pcpConn); return 0; }