int *iteliec_get_host_info (SoapCtx *request) { sg_host_info *general_stats; general_stats = sg_get_host_info (); soap_env_push_item (request->env, "urn:HostSoap", "host"); soap_env_add_item (request->env, "xsd:string", "os_name", general_stats->os_name); soap_env_add_item (request->env, "xsd:string", "platform", general_stats->platform); soap_env_add_item (request->env, "xsd:string", "hostname", general_stats->hostname); soap_env_add_itemf (request->env, "xsd:integer", "uptime", "%lu", general_stats->uptime); soap_env_pop_item (request->env); return 0; }
u_int32_t ws_add_para_tosoap(void *ctx_void, int type, char* name, void* data) { char integer_buf[16]; SoapCtx *ctx = (SoapCtx *)ctx_void; if(type == WS_PARA_TYPE_STRING) { soap_env_add_item(ctx->env, "xsd:string", name, (s8 *)data); } else { /*整数要先转换成字符串形式*/ snprintf(integer_buf, 16, "%d", (int32_t)(long)data); soap_env_add_item(ctx->env, "xsd:int", name, integer_buf); } return ERROR_SUCCESS; }
xmlNodePtr soap_env_push_item(SoapEnv * call, const char *type, const char *name) { xmlNodePtr node; if ((node = soap_env_add_item(call, type, name, ""))) call->cur = node; return node; }
xmlNodePtr soap_env_add_itemf(SoapEnv * call, const char *type, const char *name, const char *format, ...) { va_list ap; char buffer[1054]; va_start(ap, format); vsprintf(buffer, format, ap); va_end(ap); return soap_env_add_item(call, type, name, buffer); }
int main(int argc, char *argv[]) { SoapCtx *req, *resp; herror_t err; err = soap_client_init_args(argc, argv); if (err != H_OK) { log_error4("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; } err = soap_ctx_new_with_method(urn, "computePi", &req); if (err != H_OK) { log_error4("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; } soap_env_add_item(req->env, "xsd:decimal", "precision", "10000"); if (argc > 1) err = soap_client_invoke(req, &resp, argv[1], ""); else err = soap_client_invoke(req, &resp, url, ""); if (err != H_OK) { log_error4("[%d] %s(): %s ", herror_code(err), herror_func(err), herror_message(err)); herror_release(err); soap_ctx_free(req); return 1; } soap_xml_doc_print(resp->env->root->doc); soap_ctx_free(resp); soap_ctx_free(req); soap_client_destroy(); return 0; }
int iteliec_soap_register (char *username, char *password) { herror_t err; SoapCtx *request; SoapCtx *response; config_t cfg; config_setting_t *setting, *root; const char *cfile; cfile = iteliec_config_file (); config_init (&cfg); /* Read the file. If there is an error, report it and exit. */ if (!config_read_file (&cfg, cfile)) { iteliec_log (ITELIEC_ERR, "Please ensure configuration file %s exists and is valid", cfile); //printf ("\n%s:%d - %s", config_error_file (&cfg), config_error_line (&cfg), config_error_text (&cfg)); config_destroy (&cfg); return; } root = config_root_setting (&cfg); /* Init */ err = soap_client_init_args (0, NULL); if (err != H_OK) { err_soap (err); return ITELIEC_ERR; } err = soap_ctx_new_with_method ("", "sendAuth", &request); if (err != H_OK) { err_soap (err); soap_client_destroy (); return ITELIEC_ERR; } /* Add login details */ soap_env_add_item (request->env, "xsd:string", "username", username); soap_env_add_item (request->env, "xsd:string", "password", password); /* Trade for response */ err = soap_client_invoke (request, &response, "http://api.iteliec.com/register/auth/ws/", ""); if (err != H_OK) { err_soap (err); soap_ctx_free (request); soap_client_destroy (); return ITELIEC_ERR; } /* Parse response */ auth_type* ret = parse_auth_response (response); if (ret->auth == true) { printf ("Success\n"); setting = config_setting_get_member (root, "api"); if(!setting) { setting = config_setting_add (root, "api", CONFIG_TYPE_GROUP); } setting = config_setting_add (setting, "hash", CONFIG_TYPE_STRING); config_setting_set_string (setting, ret->token); /* Write out the updated configuration. */ if(! config_write_file(&cfg, cfile)) { fprintf (stderr, "Error while writing file.\n"); config_destroy (&cfg); return (ITELIEC_OK); } printf("\nConfiguration file updated. Server is ready to run.\n"); } else { printf("Auth failed\n"); } /* Destroy */ soap_ctx_free (request); soap_ctx_free (response); soap_client_destroy (); config_destroy (&cfg); return ITELIEC_OK; }
int *iteliec_get_process_list (SoapCtx *request) { sg_process_stats *ps; int ps_size; int x; char *state = NULL; /* get process list */ ps = sg_get_process_stats (&ps_size); if (ps == NULL) { iteliec_log (ITELIEC_ERR, "Failed to get process snapshot"); return; } soap_env_push_item (request->env, "urn:ProcessListSoapArray", "processlist"); for (x = 0; x < ps_size; x++) { switch (ps->state) { case SG_PROCESS_STATE_RUNNING: state = "RUNNING"; break; case SG_PROCESS_STATE_SLEEPING: state = "SLEEPING"; break; case SG_PROCESS_STATE_STOPPED: state = "STOPPED"; break; case SG_PROCESS_STATE_ZOMBIE: state = "ZOMBIE"; break; case SG_PROCESS_STATE_UNKNOWN: default: state = "UNKNOWN"; break; } soap_env_push_item (request->env, "urn:ProcessListSoap", "processlist"); soap_env_add_itemf (request->env, "xsd:integer", "pid", "%d", (int)ps->pid); soap_env_add_itemf (request->env, "xsd:integer", "parent", "%d", (int)ps->parent); soap_env_add_itemf (request->env, "xsd:integer", "pgid", "%d", (int)ps->pgid); soap_env_add_itemf (request->env, "xsd:integer", "uid", "%d", (int)ps->uid); soap_env_add_itemf (request->env, "xsd:integer", "euid", "%d", (int)ps->euid); soap_env_add_itemf (request->env, "xsd:integer", "gid", "%d", (int)ps->gid); soap_env_add_itemf (request->env, "xsd:integer", "egid", "%d", (int)ps->egid); soap_env_add_itemf (request->env, "xsd:integer", "nice", "%d", (int)ps->nice); soap_env_add_itemf (request->env, "xsd:integer", "proc_size", "%d", (int)ps->proc_size); soap_env_add_itemf (request->env, "xsd:integer", "proc_resident","%d", (int)ps->proc_resident); soap_env_add_itemf (request->env, "xsd:float", "cpu_percent", "%F", ps->cpu_percent); soap_env_add_item (request->env, "xsd:string", "state", state); soap_env_add_item (request->env, "xsd:string", "process_name", ps->process_name); soap_env_add_item (request->env, "xsd:string", "proctitle", ps->proctitle); soap_env_pop_item (request->env); ps++; } soap_env_pop_item (request->env); return ITELIEC_OK; }
void *reader_thread(void *arg) { SoapCtx *ctx, *ctx2; xmlNodePtr xmlcur,xmlitem,xmlitem2; herror_t err; char *itemname,*itemvalue,buf[1024], *cptr; int ret; THREAD_PARAM *p = (THREAD_PARAM *) arg; const char *url = (const char *) p->user; rlMailbox rlmbx(mbx); // read mbx until it is empty rlmbx.clear(); printf("reader_thread starting\n"); // wait for commands from clients while(1) { ret = rlmbx.read(buf,sizeof(buf)); // read "itemname,itemvalue\n" if(ret <= 0) continue; itemname = itemvalue = &buf[0]; cptr = strchr(buf,','); if(cptr != NULL) { *cptr = '\0'; cptr++; itemvalue = cptr; cptr = strchr(itemvalue,'\n'); if(cptr != NULL) *cptr = 0; } if(debug) { printf("reader_thread Write itemname=%s itemvalue=%s\n",itemname,itemvalue); } p->thread->lock(); /* create a SoapCtx object */ err = soap_ctx_new_with_method(URN, "Write", &ctx); if (err != H_OK) { log_error4("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); goto end_of_while; } /* create the ItemList */ xmlitem = soap_env_add_item(ctx->env, "xsd:element", "ItemList", ""); xmlcur = ctx->env->cur; ctx->env->cur = xmlitem; xmlitem2 = soap_env_add_item(ctx->env, "xsd:string", "Items", NULL); if (!xmlNewProp(xmlitem2, BAD_CAST "ItemName", BAD_CAST itemname)) { log_error1("Can not create new xml attribute ItemName"); goto end_of_while; } ctx->env->cur = xmlitem2; if(isdigit(itemvalue[0])) { soap_env_add_item(ctx->env,"xsd:double","Value",itemvalue); } else if(strcmp(itemvalue, "true") == 0 || strcmp(itemvalue, "false") == 0) { soap_env_add_item(ctx->env, "xsd:boolean", "Value", itemvalue); } else { soap_env_add_item(ctx->env,"xsd:istring","Value",itemvalue); } ctx->env->cur = xmlitem; ctx->env->cur = xmlcur; /* invoke */ err = soap_client_invoke(ctx, &ctx2, url, ""); if (err != H_OK) { log_error4("[%d] %s(): %s ", herror_code(err), herror_func(err), herror_message(err)); herror_release(err); soap_ctx_free(ctx); goto end_of_while; } /* print the result */ if(debug) { printf("reader_thread result:\n"); soap_xml_doc_print(ctx2->env->root->doc); } end_of_while: /* free the objects */ soap_ctx_free(ctx2); soap_ctx_free(ctx); p->thread->unlock(); } return NULL; }
int browse_childs(char *url, xmlNodePtr node) { SoapCtx *ctx, *ctx2; herror_t err; const char *itemname, *isitem, *haschildren; while(node != NULL) { if(strcmp((const char *) node->name, "Elements") == 0) { itemname = (const char *) xmlGetProp(node, (xmlChar*) "ItemName"); isitem = (const char *) xmlGetProp(node, (xmlChar*) "IsItem"); haschildren = (const char *) xmlGetProp(node, (xmlChar*) "HasChildren"); if(haschildren != NULL && strcmp(haschildren,"true") == 0) { if(itemname != NULL) { /* browse childs */ printf("#\n"); printf("#%s\n",itemname); /* create a SoapCtx object */ err = soap_ctx_new_with_method(URN, "Browse", &ctx); if (err != H_OK) { log_error4("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return -1; } /* add to the request */ soap_env_add_item(ctx->env, "xsd:string", "ItemName", itemname); /* invoke */ err = soap_client_invoke(ctx, &ctx2, url, ""); if (err != H_OK) { log_error4("[%d] %s(): %s ", herror_code(err), herror_func(err), herror_message(err)); herror_release(err); soap_ctx_free(ctx); return -1; } /* print the result */ //soap_xml_doc_print(ctx2->env->root->doc); /* browse the childs */ browse_childs(url, ctx2->env->cur->children); /* free the objects */ soap_ctx_free(ctx2); soap_ctx_free(ctx); } } else if(haschildren != NULL && strcmp(haschildren,"false") == 0 && isitem != NULL && strcmp(isitem,"true") == 0) { printf("%s\n", itemname); } } node = node->next; } return 0; }
int run(const char *url, int maxItemNameLength) { long shmsize_needed = ((maxItemNameLength+1)+(max_name_length+1))*num_items + sizeof(SHM_HEADER); FILE *fin; char buf[1024], *cptr; void *shmadr; SHM_HEADER *shmheader; int i; SoapCtx *ctx, *ctx2; xmlNodePtr xmlcur,xmlitem; herror_t err; if(url == NULL) return 1; // print shm parameters printf("maxItemNameLength=%d max_name_length=%d shmsize=%ld shmsize_needed=%ld num_items=%d shm=%s\n", maxItemNameLength, max_name_length, shmsize, shmsize_needed, num_items, shm); if(shmsize_needed > shmsize) { printf("shmsize too small -> increase it\n"); return 1; } if(maxItemNameLength <= 0 || max_name_length <= 0 || shmsize <= 0 || shmsize_needed <= 0) { printf("some values are negative or 0\n"); return 1; } if(maxItemNameLength >= (int) (sizeof(buf) - 100) || max_name_length >= (int) (sizeof(buf) - 100)) { printf("name is bigger than buf length = %d\n", (int) sizeof(buf)); return 1; } // init shared memory rlSharedMemory rlshm = rlSharedMemory(shm, (unsigned long) shmsize); if(rlshm.status != rlSharedMemory::OK) { printf("shared memory status is not OK\n"); return 1; } shmadr = rlshm.getUserAdr(); if(shmadr == NULL) { printf("shmadr = NULL\n"); return 1; } memset(shmadr,0,shmsize); // read itemlist to shared memory fin = fopen(itemlist,"r"); if(fin == NULL) { printf("could not open itemlist %s\n",itemlist); return 1; } i = 0; while(fgets(buf,sizeof(buf)-1,fin) != NULL) { if(buf[0] > ' ' && buf[0] != '#') { cptr = strchr(buf,'\n'); if(cptr != NULL) *cptr = '\0'; cptr = (char *) shmadr; cptr += sizeof(SHM_HEADER) + (i*(maxItemNameLength+1 + max_name_length+1)); strcpy(cptr,buf); i++; } } fclose(fin); // init header in shared memory shmheader = (SHM_HEADER *) shmadr; shmheader->maxItemNameLength = maxItemNameLength; shmheader->maxNameLength = max_name_length; shmheader->numItems = num_items; shmheader->readErrorCount = 0; shmheader->writeErrorCount = 0; strcpy(shmheader->ident,"opc"); /* create a SoapCtx object */ err = soap_ctx_new_with_method(URN, "Read", &ctx); if(err != H_OK) { log_error4("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; } /* create the Read ItemList */ xmlitem = soap_env_add_item(ctx->env, "xsd:element", "ItemList", ""); xmlcur = ctx->env->cur; ctx->env->cur = xmlitem; for(i=0; i<shmheader->numItems; i++) { cptr = (char *) shmadr; cptr += sizeof(SHM_HEADER) + (i*(maxItemNameLength+1 + max_name_length+1)); sprintf(buf,"Items ItemName=\"%s\"",cptr); soap_env_add_item(ctx->env, "xsd:string", buf, NULL); } ctx->env->cur = xmlcur; // create reader thread and the watchdog rlThread reader,watchdog; reader.create(reader_thread,(void *) url); watchdog.create(watchdog_thread,NULL); // poll the OPC XML-DA server forever while(1) { /* invoke */ err = soap_client_invoke(ctx, &ctx2, url, ""); if(err == H_OK) { /* print the result */ if(debug) soap_xml_doc_print(ctx2->env->root->doc); /* write the result to the shared memory */ reader.lock(); write_to_shared_memory(ctx2,shmadr); reader.unlock(); /* free the objects */ soap_ctx_free(ctx2); } watchcnt1++; if(watchcnt1 > 256*256) watchcnt1 = 0; rlsleep(sleep); } return 0; }
int main( int argc, char** argv ) { SoapCtx* request; SoapCtx* response; herror_t error; int ii; /* The array of parameter values to be fetched from argv. */ char* parameters[Parameter_Num_Pos]; xmlChar* buildID; if ( argc != Parameter_Num_Pos + 1 ) { printf( "Regresstor: Invalid Number of arguments! Num given: %d\n", argc ); printUsage(); return EXIT_FAILURE; } initParametersArray( parameters ); fetchParametersFromArgv( parameters, argc, argv ); if ( ! checkParameters( parameters ) ) { printUsage(); return EXIT_FAILURE; } printf( "Regresstor: calling web service %s(), %s at %s.\n", Regresstor_SubmitCheckMethod, Regresstor_URN, parameters[URL_Pos]); /* SOAP CALL */ error = soap_client_init_args( argc, argv ); if ( error != H_OK ) { log_error4( "%s():%s [%d]", herror_func(error), herror_message(error), herror_code(error) ); herror_release(error); return EXIT_FAILURE; } error = soap_ctx_new_with_method( Regresstor_URN, Regresstor_SubmitCheckMethod, &request ); if ( error != H_OK ) { log_error4( "%s():%s [%d]", herror_func(error), herror_message(error), herror_code(error) ); herror_release(error); return EXIT_FAILURE; } /* Add parameters into envelope except for the URL */ soap_env_push_item( request->env, NULL, "parameters" ); for ( ii = 0; ii < URL_Pos; ++ii ) { if ( ii == OutputLocation_Pos ) { /* Attach file */ char* contents; char* paramName = NULL; int sendDummyFile = 1; paramName = "Output"; if ( strcmp( parameters[ii], "none" ) != 0 ) { contents = getFileContents( parameters[ii] ); if ( contents != NULL ) { soap_env_add_item( request->env, "xsd:string", paramName, contents ); free( contents ); sendDummyFile = 0; } } if ( sendDummyFile ) { soap_env_add_item( request->env, "xsd:string", paramName, "No output file" ); } } else { soap_env_add_item( request->env, "xsd:string", parameterNames[ii], parameters[ii] ); } } /* Check commandline to see if diff passed. If fail, add a "Diff Failed" sub test */ if ( strcmp( parameters[Passed_Pos], "0" ) == 0 ) { /* Add the sub test */ soap_env_add_item( request->env, "xsd:string", "FailedSubTests", "Error failure" ); } soap_env_pop_item( request->env ); error = soap_client_invoke( request, &response, parameters[URL_Pos], ""); if ( error != H_OK ) { log_error4( "[%d] %s(): %s ", herror_code(error), herror_func(error), herror_message(error) ); herror_release( error ); soap_ctx_free( request ); return EXIT_FAILURE; } interpretResponse( response, &buildID ); soap_ctx_free( request ); soap_ctx_free( response ); soap_client_destroy(); return EXIT_SUCCESS; }