void mesos::parse_state(const std::string& json) { Json::Value root; Json::Reader reader; if(reader.parse(json, root, false)) { //g_logger.log(root.toStyledString(), sinsp_logger::SEV_DEBUG); determine_node_type(root); handle_frameworks(root); handle_slaves(root); } else { throw sinsp_exception("Invalid JSON (parsing Mesos state failed)."); } }
int main(int argc, char **argv) { struct sockaddr_in pulladdr; struct sockaddr_in pushaddr; int pullsock; int pushsock; int err; int recovering = 0; struct arguments args; struct log *log = NULL; #ifdef TCPR int tcprsock; struct tcpr_ip4 state; #endif //OpenSSL SSL_load_error_strings(); ERR_load_BIO_strings(); ERR_load_SSL_strings(); SSL_library_init(); OpenSSL_add_all_algorithms(); ///////// memset(&args, 0, sizeof(args)); parse_arguments(&args, argc, argv); err = resolve_address(&pulladdr, args.pullhost, args.pullport); if (err) { fprintf(stderr, "%s:%s: %s\n", args.pullhost, args.pullport, gai_strerror(err)); exit(EXIT_FAILURE); } err = resolve_address(&pushaddr, args.pushhost, args.pushport); if (err) { fprintf(stderr, "%s:%s: %s\n", args.pushhost, args.pushport, gai_strerror(err)); exit(EXIT_FAILURE); } if (!args.port) args.port = 10000; #ifdef TCPR printf("Connecting to TCPR.\n"); tcprsock = connect_to_tcpr(&pulladdr); if (tcprsock < 0) { perror("Connecting to TCPR"); exit(EXIT_FAILURE); } pulladdr1 = pulladdr; port1 = args.port; tcpr_sock = tcprsock; printf("Waiting for existing master, if any.\n"); if (get_tcpr_state(&state, tcprsock, &pulladdr, args.port) < 0) { perror("Getting TCPR state"); exit(EXIT_FAILURE); } recovering = wait_for_master(&state); if (recovering) { printf("Recovering from failed master.\n"); if (claim_tcpr_state(&state, tcprsock, &pulladdr, args.port) < 0) { perror("Claiming TCPR state"); exit(EXIT_FAILURE); } } else { printf("Creating fresh connection.\n"); } handle_slaves(); #endif /* TCPR */ printf("Connecting to data source.\n"); pullsock = connect_to_peer(&pulladdr, args.port); if (pullsock < 0) { perror("Connecting to data source"); exit(EXIT_FAILURE); } printf("Connecting to data sink.\n"); pushsock = connect_to_peer(&pushaddr, 0); if (pushsock < 0) { perror("Connecting to data sink"); exit(EXIT_FAILURE); } if (args.logprefix) { printf("Opening log.\n"); log = log_start(args.logprefix, args.logbytes, args.logcount); } #ifdef TCPR if (get_tcpr_state(&state, tcprsock, &pulladdr, args.port) < 0) { perror("Getting TCPR state"); exit(EXIT_FAILURE); } #endif if (!recovering) { printf("Sending ID to data source.\n"); if (send(pullsock, args.id, strlen(args.id), 0) < 0) { perror("Sending session ID"); exit(EXIT_FAILURE); } } get_tcpr_state(&state1, tcpr_sock, &pulladdr1, port1); get_tcpr_state(&state, tcpr_sock, &pulladdr, args.port); //BIO_set_callback(sbio,test_write); //BIO_set_callback(sbio1,test_write); printf("Copying data from source to sink.\n"); #ifdef TCPR if (copy_data(&state, log, pullsock, pushsock, tcprsock) < 0) { #else if (copy_data(log, pullsock, pushsock) < 0) { #endif perror("Copying data"); exit(EXIT_FAILURE); } printf("Done.\n"); #ifdef TCPR close(tcprsock); #endif close(pullsock); close(pushsock); return EXIT_SUCCESS; }