// The contents of this file are subject to the Mozilla Public License // Version 1.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.mozilla.org/MPL/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations // under the License. // // The Original Code is the Berkeley Open Infrastructure for Network Computing. // // The Initial Developer of the Original Code is the SETI@home project. // Portions created by the SETI@home project are Copyright (C) 2002 // University of California at Berkeley. All Rights Reserved. // // Contributor(s): // make_work // -wu_name name // -result_template filename // [ -redundancy n ] // [ -cushion n ] // // Create WU and result records as needed to maintain a pool of work // (for testing purposes). // Makes a new WU for every "redundancy" results. // Clones the WU of the given name. // #include #include #include #include #include #include "db.h" #include "crypt.h" #include "backend_lib.h" #include "config.h" #include "parse.h" #define TRIGGER_FILENAME "stop_server" int cushion = 10; int redundancy = 10; char wu_name[256], result_template_file[256]; void replace_file_name(char * xml_doc, char * filename, char * new_filename,char * download_url) { char buf[MAX_BLOB_SIZE], temp[256], download_path[256], new_download_path[256]; char * p; sprintf(download_path,"%s/%s",download_url,filename); sprintf(new_download_path,"%s/%s",download_url,new_filename); strcpy(buf,xml_doc); p = strtok(buf,"\n"); while (p) { if (parse_str(p, "", temp, sizeof(temp))) { if(!strcmp(filename, temp)) { replace_element(xml_doc + (p - buf),"","",new_filename); } } else if (parse_str(p, "", temp, sizeof(temp))) { if(!strcmp(filename, temp)) { replace_element(xml_doc + (p - buf),"","",new_filename); } } else if (parse_str(p, "", temp, sizeof(temp))) { if(!strcmp(temp, download_path)) { replace_element(xml_doc + (p - buf),"","",new_download_path); } } p = strtok(0, "\n"); } } void check_trigger() { FILE* f = fopen(TRIGGER_FILENAME, "r"); if (!f) return; exit(0); } void make_work() { CONFIG config; char * p; int retval, i, start_time=time(0), n, nresults_left; char keypath[256], suffix[256], result_template[MAX_BLOB_SIZE], file_name[256], buf[MAX_BLOB_SIZE],pathname[256],new_file_name[256],new_pathname[256],command[256]; R_RSA_PRIVATE_KEY key; WORKUNIT wu; retval = config.parse_file(); if (retval) { fprintf(stderr,"make_work: can't read config file\n"); exit(1); } retval = db_open(config.db_name, config.db_passwd); if (retval) { fprintf(stderr,"make_work: can't open db\n"); exit(1); } strcpy(wu.name, wu_name); retval = db_workunit_lookup_name(wu); if (retval) { fprintf(stderr,"make_work: can't find wu %s\n", wu_name); exit(1); } sprintf(keypath, "%s/upload_private", config.key_dir); retval = read_key_file(keypath, key); if (retval) { fprintf(stderr,"make_work: can't read key\n"); exit(1); } retval = read_filename(result_template_file, result_template); if (retval) { fprintf(stderr,"make_work: can't open result template\n"); exit(1); } nresults_left = 0; while (true) { fflush(stdout); retval = db_result_count_server_state(RESULT_SERVER_STATE_UNSENT, n); if (retval) { fprintf(stderr,"make_work: can't counts results\n"); exit(1); } printf("make_work: %d results\n", n); if (n > cushion) { sleep(1); continue; } if (nresults_left == 0) { strcpy(buf,wu.xml_doc); p = strtok(buf, "\n"); strcpy(file_name, ""); while (p) { if (parse_str(p, "", file_name, sizeof(file_name))) { sprintf(new_file_name,"%s_%d_%d",file_name,start_time,i++); sprintf(pathname, "%s/%s", config.download_dir, file_name); sprintf(new_pathname,"%s/%s",config.download_dir, new_file_name); sprintf(command,"cp %s %s",pathname,new_pathname); system(command); replace_file_name(wu.xml_doc,file_name,new_file_name,config.download_url); } p = strtok(0, "\n"); } nresults_left = redundancy; sprintf(wu.name, "wu_%d_%d", start_time, i++); wu.id = 0; wu.create_time = time(0); retval = db_workunit_new(wu); wu.id = db_insert_id(); } sprintf(suffix, "%d_%d", start_time, i++); create_result( wu, result_template, suffix, key, config.upload_url, config.download_url ); printf("make_work: added a result\n"); nresults_left--; check_trigger(); } } int main(int argc, char** argv) { bool asynch = false; int i; unlink(TRIGGER_FILENAME); for (i=1; i