bool do_pass() { int retval; DB_TRANSITIONER_ITEM_SET transitioner; std::vector<TRANSITIONER_ITEM> items; bool did_something = false; if (!one_pass) check_stop_daemons(); // loop over entries that are due to be checked // while (1) { if (wu_id) { // kludge to tell enumerate to return a given WU mod_n = 1; mod_i = wu_id; } retval = transitioner.enumerate( (int)time(0), SELECT_LIMIT, mod_n, mod_i, items ); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_CRITICAL, "WU enum error: %s; exiting\n", boincerror(retval) ); exit(1); } break; } did_something = true; TRANSITIONER_ITEM& wu_item = items[0]; retval = handle_wu(transitioner, items); if (retval) { log_messages.printf(MSG_CRITICAL, "[WU#%lu %s] handle_wu: %s; quitting\n", wu_item.id, wu_item.name, boincerror(retval) ); // probably better to exit here. // Whatever cause this WU to fail (and it could be temporary) // might cause ALL WUs to fail // exit(1); } if (!one_pass) check_stop_daemons(); if (wu_id) break; } return did_something; }
int main(int argc, char** argv) { int i, retval; bool one_pass = false; check_stop_daemons(); for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-one_pass")) { one_pass = true; } else if (!strcmp(argv[i], "-d")) { log_messages.set_debug_level(atoi(argv[++i])); } else { log_messages.printf(MSG_CRITICAL, "unrecognized arg: %s\n", argv[i] ); } } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } log_messages.printf(MSG_NORMAL, "Starting message handler\n"); install_stop_signal_handler(); main_loop(one_pass); }
int main(int argc, char** argv) { HR_INFO hri; int retval; for (int i=0; i<argc; i++) { if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { usage(argv); } } check_stop_daemons(); retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } retval = boinc_db.open( config.db_name, config.db_host, config.db_user, config.db_passwd ); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't open DB\n"); exit(1); } log_messages.printf(MSG_NORMAL, "Starting\n"); boinc_db.set_isolation_level(READ_UNCOMMITTED); hri.init(); hri.scan_db(); hri.write_file(); hri.perf_info.write_file(); log_messages.printf(MSG_NORMAL, "Finished\n"); }
int main_loop(bool one_pass) { int retval; bool did_something; // char buf[256]; retval = boinc_db.open(config.db_name, config.db_host, config.db_user, config.db_passwd); if (retval) { log_messages.printf(MSG_CRITICAL, "boinc_db.open failed: %s\n", boincerror(retval) ); exit(1); } /* sprintf(buf, "where name='%s'", app_name); retval = app.lookup(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "can't find app %s\n", app_name ); exit(1); } */ // coverity[loop_top] - infinite loop is intended while (1) { check_stop_daemons(); did_something = do_message_scan(); if (one_pass) break; if (!did_something) { daemon_sleep(5); } } return 0; }
int main_loop(bool one_pass) { while (1) { check_stop_daemons(); bool did_something = do_trickle_scan(); if (one_pass) break; if (!did_something) { daemon_sleep(5); } } return 0; }
void main_loop() { int retval; int node=0,n; while (node<n1) { check_stop_daemons(); retval = count_unsent_results(n, 0); if (retval) { log_messages.printf(MSG_CRITICAL, "count_unsent_jobs() failed: %s\n", boincerror(retval) ); exit(retval); } if (n > CUSHION) { daemon_sleep(5); } else { // int njobs = (CUSHION-n)/REPLICATION_FACTOR; log_messages.printf(MSG_DEBUG, "Making job for %d\n", node ); // for (int i=0; i<njobs; i++) { for (int i=0; i<n1; i+=CLIENT_LIMIT) { retval = make_job(node,i); if (retval) { log_messages.printf(MSG_CRITICAL, "can't make job: %s\n", boincerror(retval) ); exit(retval); } } // } // Now sleep for a few seconds to let the transitioner // create instances for the jobs we just created. // Otherwise we could end up creating an excess of jobs. double now = dtime(); while (1) { daemon_sleep(5); double x; retval = min_transition_time(x); if (retval) { log_messages.printf(MSG_CRITICAL, "min_transition_time failed: %s\n", boincerror(retval) ); exit(retval); } if (x > now) break; } } node++; } }
bool do_pass() { int retval; DB_TRANSITIONER_ITEM_SET transitioner; std::vector<TRANSITIONER_ITEM> items; bool did_something = false; if (!one_pass) check_stop_daemons(); // loop over entries that are due to be checked // while (1) { retval = transitioner.enumerate( (int)time(0), SELECT_LIMIT, mod_n, mod_i, items ); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_CRITICAL, "WU enum error: %s; exiting\n", boincerror(retval) ); exit(1); } break; } did_something = true; TRANSITIONER_ITEM& wu_item = items[0]; retval = handle_wu(transitioner, items); if (retval) { log_messages.printf(MSG_CRITICAL, "[WU#%d %s] handle_wu: %s; quitting\n", wu_item.id, wu_item.name, boincerror(retval) ); exit(1); } if (!one_pass) check_stop_daemons(); } return did_something; }
void main_loop() { int retval; while (1) { check_stop_daemons(); long n; retval = count_unsent_results(n, app.id); if (retval) { log_messages.printf(MSG_CRITICAL, "count_unsent_jobs() failed: %s\n", boincerror(retval) ); exit(retval); } if (n > CUSHION) { daemon_sleep(10); } else { int njobs = (CUSHION-n)/REPLICATION_FACTOR; log_messages.printf(MSG_DEBUG, "Making %d jobs\n", njobs ); for (int i=0; i<njobs; i++) { retval = make_job(); if (retval) { log_messages.printf(MSG_CRITICAL, "can't make job: %s\n", boincerror(retval) ); exit(retval); } } // Wait for the transitioner to create instances // of the jobs we just created. // Otherwise we'll create too many jobs. // double now = dtime(); while (1) { daemon_sleep(5); double x; retval = min_transition_time(x); if (retval) { log_messages.printf(MSG_CRITICAL, "min_transition_time failed: %s\n", boincerror(retval) ); exit(retval); } if (x > now) break; } } } }
// delete files in antique files list, and empty the list. // Returns number of files deleted, or negative for error. // // TODO: the list contains filenames, and we convert these to paths. // This is wacked. The list should contain paths. // int delete_antique_files() { int nfiles=0; log_messages.printf(MSG_DEBUG, "delete_antique_files(): start (%d files)\n", (int)files_to_delete.size() ); while (!files_to_delete.empty()) { char timestamp[128]; char pathname[1024]; int retval; FILE_RECORD fr = files_to_delete.front(); check_stop_daemons(); retval = get_file_path( fr.name.c_str(), config.upload_dir, config.uldl_dir_fanout, pathname ); if (retval) { log_messages.printf(MSG_CRITICAL, "get_file_path(%s) failed: %s\n", fr.name.c_str(), boincerror(retval) ); return retval; } strcpy(timestamp, time_to_string(fr.date_modified)); log_messages.printf(MSG_DEBUG, "deleting [antique %s] %s\n", timestamp, pathname ); if (unlink(pathname)) { int save_error=errno; log_messages.printf(MSG_CRITICAL, "unlink(%s) failed: %s\n", pathname, strerror(save_error) ); return retval; } else { nfiles++; files_to_delete.pop_front(); } } log_messages.printf(MSG_DEBUG, "delete_antique_files(): done, deleted %d files\n", nfiles ); return 0; }
int main(int argc, char** argv) { int i, retval; bool one_pass = false; check_stop_daemons(); for (i=1; i<argc; i++) { if (is_arg(argv[i], "one_pass")) { one_pass = true; } else if (is_arg(argv[i], "d")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } int dl = atoi(argv[i]); log_messages.set_debug_level(dl); if (dl == 4) g_print_queries = true; } else if (is_arg(argv[i], "h") || is_arg(argv[i], "help")) { usage(argv[0]); exit(0); } else if (is_arg(argv[i], "v") || is_arg(argv[i], "version")) { printf("%s\n", SVN_VERSION); exit(0); } else { log_messages.printf(MSG_CRITICAL, "unknown command line argument: %s\n\n", argv[i]); usage(argv[0]); exit(1); } } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } log_messages.printf(MSG_NORMAL, "Starting message handler\n"); install_stop_signal_handler(); main_loop(one_pass); }
int main_loop() { int retval; bool did_something; char buf[256]; retval = boinc_db.open( config.db_name, config.db_host, config.db_user, config.db_passwd ); if (retval) { log_messages.printf(MSG_CRITICAL, "boinc_db.open failed: %s\n", boincerror(retval) ); exit(1); } sprintf(buf, "where name='%s'", app_name); while (1) { check_stop_daemons(); // look up app within the loop, // in case its min_avg_pfc has been changed by the feeder // retval = app.lookup(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "can't find app %s\n", app_name); exit(1); } did_something = do_validate_scan(); if (!did_something) { write_modified_app_versions(app_versions); if (one_pass) break; #ifdef GCL_SIMULATOR char nameforsim[64]; sprintf(nameforsim, "validator%i", app.id); continue_simulation(nameforsim); signal(SIGUSR2, simulator_signal_handler); pause(); #else sleep(sleep_interval); #endif } } return 0; }
void generator(Connector connect, int cushion) { int retval; while (1) { check_stop_daemons(); int n; retval = count_unsent_results(n, 0); if (n > cushion || fileExists("stop_working")) { log_messages.printf(MSG_DEBUG, "N > cushion sleep n= %d\n", n); log_messages.printf(MSG_DEBUG, "sleep cushion= %d\n", cushion); sleep(100); } else { log_messages.printf(MSG_DEBUG, "N < cushion run n= %d\n", n); log_messages.printf(MSG_DEBUG, "run cushion= %d\n", cushion); connect.connectDB(); connect.getAllTasks(); connect.disconnectDB(); sleep(100); } } }
int main_loop() { int retval; bool did_something; char buf[256]; retval = boinc_db.open( config.db_name, config.db_host, config.db_user, config.db_passwd ); if (retval) { log_messages.printf(MSG_CRITICAL, "boinc_db.open failed: %d\n", retval); exit(1); } sprintf(buf, "where name='%s'", app_name); retval = app.lookup(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "can't find app %s\n", app_name); exit(1); } while (1) { check_stop_daemons(); did_something = do_validate_scan(); if (!did_something) { if (one_pass) break; #ifdef GCL_SIMULATOR char nameforsim[64]; sprintf(nameforsim, "validator%i", app.id); continue_simulation(nameforsim); signal(SIGUSR2, simulator_signal_handler); pause(); #else sleep(sleep_interval); #endif } } return 0; }
// returns number of files found & added, or negative for error. // int find_antique_files() { char buf[256]; DB_WORKUNIT wu; check_stop_daemons(); // Find the oldest workunit. We could add // "where file_delete_state!=FILE_DELETE_DONE" to the query, // but this might create some race condition // with the 'regular' file delete mechanism, // so better to do it like this. // sprintf(buf, "order by id limit 1"); if (!wu.enumerate(buf)) { // Don't ever delete files younger than a month. // int days = 1 + (time(0) - wu.create_time)/86400; if (days<31) days=31; return add_antiques_to_list(days); } return 0; }
// construct a list "file_to_delete" of old files. // Return number of files added to list, or negative for error. // int add_antiques_to_list(int days) { char command[256]; char single_line[1024]; FILE *fp; int dirlen=strlen(config.upload_dir); struct passwd *apache_info=getpwnam(config.httpd_user); int del_time=time(0)-86400*days; int nfiles=0; if (!apache_info) { log_messages.printf(MSG_CRITICAL, "default httpd_user '%s' found - add <httpd_user> entry in config.xml\n", config.httpd_user ); return -1; } log_messages.printf(MSG_DEBUG, "Searching for antique files older than %d days\n", days ); sprintf(command, "find %s -type f -mtime +%d -follow | head -%d", config.upload_dir, days, antique_limit); // Now execute the command, read output on a stream. We could use // find to also exec a 'delete' command. But we want to log all // file names into the log, and do lots of sanity checking, so // this way is better. // if (!(fp=popen(command, "r"))) { log_messages.printf(MSG_CRITICAL, "command %s failed\n", command ); return -2; } while (fgets(single_line, 1024, fp)) { char pathname[1024]; char *fname_at_end=NULL; int nchars=strlen(single_line); struct stat statbuf; const char *err=NULL; FILE_RECORD fr; // We can interrupt this at any point. // pclose() is called when process exits. check_stop_daemons(); // Do serious sanity checking on the path before // adding the file!! // if (!err && nchars > 1022) err="line too long"; if (!err && nchars < dirlen + 1) err="path shorter than upload directory name"; if (!err && single_line[nchars-1] != '\n') err="no newline terminator in line"; if (!err && strncmp(config.upload_dir, single_line, dirlen)) err="upload directory not in path"; if (!err && single_line[dirlen] != '/') err="no slash separator in path"; if (!err) single_line[nchars-1]='\0'; if (!err && stat(single_line, &statbuf)) err="stat failed"; if (!err && statbuf.st_mtime > del_time) err="file too recent"; if (!err && apache_info->pw_uid != statbuf.st_uid) err="file not owned by httpd user"; if (!err && !(fname_at_end=rindex(single_line+dirlen, '/'))) err="no trailing filename"; if (!err) fname_at_end++; if (!err && !strlen(fname_at_end)) err="trailing filename too short"; // skip NFS file system markers of form .nfs* // if (!err && !strncmp(fname_at_end, ".nfs", 4)) { log_messages.printf(MSG_CRITICAL, "Ignoring antique (stale) NFS lockfile %s\n", single_line ); continue; } if (!err && get_file_path(fname_at_end, config.upload_dir, config.uldl_dir_fanout, pathname)) err="get_file_path() failed"; if (!err && strcmp(pathname, single_line)) err="file in wrong hierarchical upload subdirectory"; if (err) { log_messages.printf(MSG_CRITICAL, "Can't list %s for deletion: %s\n", single_line, err ); // This file deleting business is SERIOUS. Give up at the // first sign of ANYTHING amiss. // pclose(fp); return -3; } // insert this file onto the list fr.date_modified = statbuf.st_mtime; fr.name = fname_at_end; files_to_delete.push_back(fr); nfiles++; } // while (fgets(single_line, 1024, fp)) { pclose(fp); log_messages.printf(MSG_DEBUG, "Found %d antique files to delete\n", nfiles ); files_to_delete.sort(); files_to_delete.unique(); return nfiles; }
// return true if we changed the file_delete_state of a WU or a result // bool do_pass(bool retry_error) { DB_WORKUNIT wu; DB_RESULT result; bool did_something = false; char buf[256]; char clause[256]; int retval, new_state; check_stop_daemons(); strcpy(clause, ""); if (id_modulus) { sprintf(clause, " and id %% %d = %d ", id_modulus, id_remainder); } if (dont_delete_batches) { strcat(clause, " and batch <= 0 "); } if (appid) { sprintf(buf, " and appid = %d ", appid); strcat(clause, buf); } sprintf(buf, "where file_delete_state=%d %s limit %d", retry_error?FILE_DELETE_ERROR:FILE_DELETE_READY, clause, WUS_PER_ENUM ); while (do_input_files) { retval = wu.enumerate(buf); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_DEBUG, "DB connection lost, exiting\n"); exit(0); } break; } if (preserve_wu_files) { retval = 0; } else { retval = wu_delete_files(wu); } if (retval) { new_state = FILE_DELETE_ERROR; log_messages.printf(MSG_CRITICAL, "[WU#%d] file deletion failed: %s\n", wu.id, boincerror(retval) ); } else { new_state = FILE_DELETE_DONE; } if (new_state != wu.file_delete_state) { sprintf(buf, "file_delete_state=%d", new_state); retval = wu.update_field(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "[WU#%d] update failed: %s\n", wu.id, boincerror(retval) ); } else { log_messages.printf(MSG_DEBUG, "[WU#%d] file_delete_state updated\n", wu.id ); did_something = true; } } } sprintf(buf, "where file_delete_state=%d %s limit %d", retry_error?FILE_DELETE_ERROR:FILE_DELETE_READY, clause, RESULTS_PER_ENUM ); while (do_output_files) { retval = result.enumerate(buf); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_DEBUG, "DB connection lost, exiting\n"); exit(0); } break; } if (preserve_result_files) { retval = 0; } else { retval = result_delete_files(result); } if (retval) { new_state = FILE_DELETE_ERROR; log_messages.printf(MSG_CRITICAL, "[RESULT#%d] file deletion failed: %s\n", result.id, boincerror(retval) ); } else { new_state = FILE_DELETE_DONE; } if (new_state != result.file_delete_state) { sprintf(buf, "file_delete_state=%d", new_state); retval = result.update_field(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "[RESULT#%d] update failed: %s\n", result.id, boincerror(retval) ); } else { log_messages.printf(MSG_DEBUG, "[RESULT#%d] file_delete_state updated\n", result.id ); did_something = true; } } } return did_something; }
int main(int argc, char** argv) { // Инициализация подключения к dims frontend_db = mysql_init(NULL); if (frontend_db == NULL) { log_messages.printf(MSG_CRITICAL, "Error %u: %s\n", mysql_errno(frontend_db), mysql_error(frontend_db)); exit(1); } // Подключение к БД dims if (mysql_real_connect(frontend_db, "localhost", "boincadm", "password!stronk!", "dihm1", 0, NULL, 0) == NULL) { log_messages.printf(MSG_CRITICAL, "Error %u: %s\n", mysql_errno(frontend_db), mysql_error(frontend_db)); exit(1); } int retval; DB_APP app; // http://boinc.berkeley.edu/doxygen/server/html/classDB__APP.html int i; char buf[256]; strcpy(app.name, ""); check_stop_daemons(); g_argc = argc; g_argv = argv; for (i=1; i<argc; i++) { if (is_arg(argv[i], "sleep_interval")) { sleep_interval = atoi(argv[++i]); } else if (is_arg(argv[i], "d") || is_arg(argv[i], "debug_level")) { int dl = atoi(argv[++i]); log_messages.set_debug_level(dl); if (dl ==4) g_print_queries = true; } else if (is_arg(argv[i], "app")) { strcpy(app.name, argv[++i]); } else if (is_arg(argv[i], "dont_update_db")) { // This option is for testing your assimilator. When set, // it ensures that the assimilator does not actually modify // the assimilate_state of the workunits, so you can run // your assimilator over and over again without affecting // your project. update_db = false; } else if (is_arg(argv[i], "help") || is_arg(argv[i], "h")) { // usage(argv); } else { log_messages.printf(MSG_CRITICAL, "Unrecognized arg: %s\n", argv[i]); // usage(argv); } } if (!strlen(app.name)) { // usage(argv); } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval)); exit(1); } log_messages.printf(MSG_NORMAL, "Starting\n"); retval = boinc_db.open(config.db_name, config.db_host, config.db_user, config.db_passwd); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't open DB\n"); exit(1); } sprintf(buf, "where name='%s'", app.name); retval = app.lookup(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't find app\n"); exit(1); } install_stop_signal_handler(); main_loop(app); }
// returns: // 0 if all went ok; // 1 on a transient error affecting only a single file; // -1 on a serious error that should switch off antique file deletion // int delete_antiques_from_dir(char*dirpath, time_t mtime, uid_t uid) { DIR*dir; struct dirent*entry; struct stat fstat; int ret; char path[MAXPATHLEN]; // open directory errno = 0; dir = opendir(dirpath); if (!dir) { log_messages.printf(MSG_CRITICAL, "delete_antiques_from_dir(): " "Couldn't open dir '%s': %s (%d)\n", dirpath, strerror(errno), errno ); return -1; } // scan directory errno = 0; while ((entry = readdir(dir))) { // might be woken by a signal check_stop_daemons(); // construct absolute path of this entry safe_strcpy(path, dirpath); strcat(path, "/"); strcat(path, entry->d_name); // examine file log_messages.printf(MSG_DEBUG, "delete_antiques_from_dir(): examining file: '%s'\n", path ); // stat errno = 0; if (lstat(path, &fstat)) { log_messages.printf(MSG_NORMAL, "delete_antiques_from_dir(): couldn't stat '%s: %s (%d)'\n", path, strerror(errno), errno ); // regular file } else if ((fstat.st_mode & S_IFMT) != S_IFREG) { log_messages.printf(MSG_DEBUG,"not a regular plain file\n"); // skip hidden files such as ".nfs" } else if (entry->d_name[0] == '.') { log_messages.printf(MSG_DEBUG,"hidden file or directory\n"); // modification time } else if (fstat.st_mtime > mtime) { log_messages.printf(MSG_DEBUG,"too young: %s\n", actime(fstat.st_mtime)); // check owner (must be apache) } else if (fstat.st_uid != uid) { log_messages.printf(MSG_DEBUG,"wrong owner: id %d\n", fstat.st_uid); // skip if dry_run } else if (antiques_deletion_dry_run) { log_messages.printf(MSG_NORMAL, "Would delete '%s/%s' (%s)\n", dirpath, entry->d_name, actime(fstat.st_mtime)); // found no reason to skip, actually delete this file } else { log_messages.printf(MSG_NORMAL, "Deleting file '%s' (%s)\n", path, actime(fstat.st_mtime) ); errno = 0; if (unlink(path)) { log_messages.printf(MSG_CRITICAL, "delete_antiques_from_dir(): " "Couldn't unlink '%s: %s (%d)'\n", path, strerror(errno), errno ); closedir(dir); return 1; } } // throttle I/O if told to if (antique_usleep) { usleep(antique_usleep); } } // while (readdir()) // if the loop terminated because of an error if (errno) { log_messages.printf(MSG_CRITICAL, "delete_antiques_from_dir(): " "Couldn't read dir '%s': %s (%d)\n", dirpath, strerror(errno), errno ); closedir(dir); return 1; } // close dir errno = 0; ret = closedir(dir); if (ret) { log_messages.printf(MSG_CRITICAL, "delete_antiques_from_dir(): " "Couldn't close dir '%s': %s (%d)\n", dirpath, strerror(errno), errno ); } return ret; }
int main(int argc, char** argv) { int retval; int i; check_stop_daemons(); for (i=1; i<argc; i++) { if (is_arg(argv[i], "d") || is_arg(argv[i], "debug_level")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } int dl = atoi(argv[i]); log_messages.set_debug_level(dl); if (dl == 4) g_print_queries = true; } else if (is_arg(argv[i], "dry_run")) { antiques_deletion_dry_run = true; } else if (is_arg(argv[i], "usleep")) { antique_usleep = atoi(argv[++i]); } else if (is_arg(argv[i], "h") || is_arg(argv[i], "help")) { usage(argv[0]); exit(0); } else if (is_arg(argv[i], "v") || is_arg(argv[i], "version")) { printf("%s\n", SVN_VERSION); exit(0); } else { log_messages.printf(MSG_CRITICAL, "unknown command line argument: %s\n\n", argv[i]); usage(argv[0]); exit(1); } } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } log_messages.printf(MSG_NORMAL, "Starting\n"); retval = boinc_db.open( config.replica_db_name, config.replica_db_host, config.replica_db_user, config.replica_db_passwd ); if (retval) { log_messages.printf(MSG_CRITICAL, "can't open DB\n"); exit(1); } retval = boinc_db.set_isolation_level(READ_UNCOMMITTED); if (retval) { log_messages.printf(MSG_CRITICAL, "boinc_db.set_isolation_level: %s; %s\n", boincerror(retval), boinc_db.error_string() ); } install_stop_signal_handler(); retval = delete_antiques(); if (retval) { log_messages.printf(MSG_CRITICAL, "delete_antiques() returned with error %d\n", retval ); } log_messages.printf(MSG_NORMAL, "Done\n"); return retval; }
int main_loop(APP& app) { DB_WORKUNIT wu; DB_RESULT canonical_result, result; DB_APP_VERSION app_version; // http://boinc.berkeley.edu/doxygen/server/html/classDB__APP__VERSION.html char buf[256]; char buf2[256]; int retval; task_t task; while(1) { check_stop_daemons(); sprintf(buf, "WHERE appid=%d AND assimilate_state=%d AND error_mask<>16", app.id, ASSIMILATE_READY); // Заполнение полей текущего ворк юнита retval = wu.enumerate(buf); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_DEBUG, "DB connection lost, exiting\n"); exit(0); } } // Заполнение полей текущего задания sscanf(wu.name, "%[^_]_%d_%d_%[^_]_%d_%*d_%d.%[^_]", task.app_name, &task.id, &task.uid, task.name, &task.timestamp, &task.size, task.extension); sprintf(buf, "SELECT login FROM user WHERE id=%d", task.uid); mysql_query(frontend_db, buf); mysql_result = mysql_store_result(frontend_db); if ((row = mysql_fetch_row(mysql_result)) != NULL) { strcpy(task.login, row[0]); } // Создание списка результатов задания vector<RESULT> results; if (strlen(task.name) > 0) { sprintf(buf, "INNER JOIN workunit ON result.id = workunit.canonical_resultid WHERE workunit.name like \"%%_%d_%d_%s_%%\" and workunit.assimilate_state=%d and workunit.error_mask<>16", task.id, task.uid, task.name, ASSIMILATE_READY); while (!result.enumerate(buf)) { results.push_back(result); } } // Склеивание заданий if ((results.size() == task.size) && (task.size != 0)) { log_messages.printf(MSG_NORMAL,"[%d_%s] Assimilating task\n", task.uid, task.name); retval = handle_result(task, results); if (retval) { log_messages.printf(MSG_CRITICAL,"[%d_%s] Assimilation failed\n", task.uid, task.name); } else { // Обновление записей в базе if (update_db) { sprintf(buf, "assimilate_state=%d, transition_time=%d", ASSIMILATE_DONE, (int)time(0)); sprintf(buf2, "appid=%d and assimilate_state=%d and name like \"%%_%d_%d_%s_%%\"", app.id, ASSIMILATE_READY, task.id, task.uid, task.name); wu.update_fields_noid(buf, buf2); boinc_db.commit_transaction(); // Обновление планктона update_plankton(task, app_version); update_plankton_percent(results, task); } log_messages.printf(MSG_NORMAL,"[%d_%s] Task assimilated\n", task.uid, task.name); //Очистка всех структур wu.clear(); memset(&task, 0, sizeof(task)); results.clear(); } } else { if (results.size()) { update_plankton_percent(results, task); } } sleep(SLEEP_INTERVAL); } }
int main(int argc, char** argv) { int i, retval; char file_name[256]; int host_id; host_id = 0; strcpy(file_name, ""); check_stop_daemons(); for (i=1; i<argc; i++) { if (is_arg(argv[i], "host_id")) { if (!argv[++i]) { fprintf(stderr, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } host_id = atoi(argv[i]); } else if (is_arg(argv[i], "file_name")) { if (!argv[++i]) { fprintf(stderr, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } strcpy(file_name, argv[i]); } else if (is_arg(argv[i], "help") || is_arg(argv[i], "h")) { usage(argv[0]); exit(0); } else if (is_arg(argv[i], "version") || is_arg(argv[i], "v")) { printf("%s\n", SVN_VERSION); exit(0); } else { fprintf(stderr, "unknown command line argument: %s\n\n", argv[i]); usage(argv[0]); exit(1); } } if (!strlen(file_name) || host_id == 0) { usage(argv[0]); exit(1); } retval = config.parse_file(); if (retval) { fprintf(stderr, "Can't parse config.xml: %s\n", boincerror(retval)); exit(1); } retval = boinc_db.open( config.db_name, config.db_host, config.db_user, config.db_passwd ); if (retval) { fprintf(stderr, "boinc_db.open failed: %s\n", boincerror(retval)); exit(1); } retval = create_delete_file_msg(host_id, file_name); boinc_db.close(); return retval; }
int main(int argc, char** argv) { int retval, i; bool do_update_teams = false, do_update_users = false; bool do_update_hosts = false; update_time_cutoff = time(0) - UPDATE_INTERVAL; check_stop_daemons(); for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-update_teams")) { do_update_teams = true; } else if (!strcmp(argv[i], "-update_users")) { do_update_users = true; } else if (!strcmp(argv[i], "-update_hosts")) { do_update_hosts = true; } else if (!strcmp(argv[i], "-d")) { log_messages.set_debug_level(atoi(argv[++i])); } else { log_messages.printf(MSG_CRITICAL, "Unrecognized arg: %s\n", argv[i]); } } log_messages.printf(MSG_NORMAL, "Starting\n"); retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } retval = boinc_db.open(config.db_name, config.db_host, config.db_user, config.db_passwd); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't open DB\n"); exit(1); } retval = boinc_db.set_isolation_level(READ_UNCOMMITTED); if (retval) { log_messages.printf(MSG_CRITICAL, "boinc_db.set_isolation_level: %d; %s\n", retval, boinc_db.error_string() ); } if (do_update_users) { retval = update_users(); if (retval) { log_messages.printf(MSG_CRITICAL, "update_users failed: %d\n", retval); exit(1); } } if (do_update_hosts) { retval = update_hosts(); if (retval) { log_messages.printf(MSG_CRITICAL, "update_hosts failed: %d\n", retval); exit(1); } } if (do_update_teams) { retval = update_teams(); if (retval) { log_messages.printf(MSG_CRITICAL, "update_teams failed: %d\n", retval); exit(1); } } log_messages.printf(MSG_NORMAL, "Finished\n"); return 0; }
// return true if did anything // bool do_pass() { int retval = 0; // The number of workunits/results purged in a single pass of do_pass(). // Since do_pass() may be invoked multiple times, // corresponding global variables store global totals. // int do_pass_purged_workunits = 0; int do_pass_purged_results = 0; // check to see if we got a stop signal. // Note that if we do catch a stop signal here, // we call an exit handler that closes [and optionally compresses] files // before returning to the OS. // check_stop_daemons(); bool did_something = false; DB_WORKUNIT wu; char buf[256]; if (min_age_days) { char timestamp[15]; mysql_timestamp(dtime()-min_age_days*86400., timestamp); sprintf(buf, "where file_delete_state=%d and mod_time<'%s' limit %d", FILE_DELETE_DONE, timestamp, DB_QUERY_LIMIT ); } else { sprintf(buf, "where file_delete_state=%d limit %d", FILE_DELETE_DONE, DB_QUERY_LIMIT ); } int n=0; while (1) { retval = wu.enumerate(buf); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_DEBUG, "DB connection lost, exiting\n" ); exit(0); } break; } if (strstr(wu.name, "nodelete")) continue; did_something = true; // if archives have not already been opened, then open them. // if (!no_archive && !wu_stream) { open_all_archives(); } retval = purge_and_archive_results(wu, n); do_pass_purged_results += n; if (!no_archive) { retval= archive_wu(wu); if (retval) { log_messages.printf(MSG_CRITICAL, "Failed to write to XML file workunit:%d\n", wu.id ); exit(5); } log_messages.printf(MSG_DEBUG, "Archived workunit [%d] to a file\n", wu.id ); } // purge workunit from DB // if (!dont_delete) { retval= wu.delete_from_db(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't delete workunit [%d] from database:%d\n", wu.id, retval ); exit(6); } } log_messages.printf(MSG_DEBUG, "Purged workunit [%d] from database\n", wu.id ); if (config.enable_assignment) { DB_ASSIGNMENT asg; char buf2[256]; sprintf(buf, "workunitid=%d", wu.id); asg.delete_from_db_multi(buf2); } purged_workunits++; do_pass_purged_workunits++; wu_stored_in_file++; if (!no_archive) { fflush(NULL); // if file has got max # of workunits, close and compress it. // This sets file pointers to NULL // if (max_wu_per_file && wu_stored_in_file>=max_wu_per_file) { close_all_archives(); wu_stored_in_file = 0; } } if (time_to_quit()) { break; } } if (do_pass_purged_workunits) { log_messages.printf(MSG_NORMAL, "Archived %d workunits and %d results\n", do_pass_purged_workunits, do_pass_purged_results ); } if (did_something && wu_stored_in_file>0) { log_messages.printf(MSG_DEBUG, "Currently open archive files contain %d workunits\n", wu_stored_in_file ); } if (do_pass_purged_workunits > DB_QUERY_LIMIT/2) { return true; } else { return false; } }
int main(int argc, char** argv) { int i, retval; char path[MAXPATHLEN]; startup_time = time(0); for (i=1; i<argc; i++) { if (is_arg(argv[i], "one_pass")) { one_pass = true; } else if (is_arg(argv[i], "d")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } int dl = atoi(argv[i]); log_messages.set_debug_level(dl); if (dl == 4) g_print_queries = true; } else if (is_arg(argv[i], "mod")) { if (!argv[i+1] || !argv[i+2]) { log_messages.printf(MSG_CRITICAL, "%s requires two arguments\n\n", argv[i]); usage(argv[0]); exit(1); } mod_n = atoi(argv[++i]); mod_i = atoi(argv[++i]); do_mod = true; } else if (is_arg(argv[i], "sleep_interval")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } sleep_interval = atoi(argv[i]); } else if (is_arg(argv[i], "h") || is_arg(argv[i], "help")) { usage(argv[0]); exit(0); } else if (is_arg(argv[i], "v") || is_arg(argv[i], "version")) { printf("%s\n", SVN_VERSION); exit(0); } else if (is_arg(argv[i], "wu_id")) { wu_id = atoi(argv[++i]); one_pass = true; } else { log_messages.printf(MSG_CRITICAL, "unknown command line argument: %s\n\n", argv[i]); usage(argv[0]); exit(1); } } if (!one_pass) check_stop_daemons(); retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval)); exit(1); } sprintf(path, "%s/upload_private", config.key_dir); retval = read_key_file(path, key); if (retval) { log_messages.printf(MSG_CRITICAL, "can't read key\n"); exit(1); } log_messages.printf(MSG_NORMAL, "Starting\n"); install_stop_signal_handler(); main_loop(); }
int main(int argc, char** argv) { int retval; bool one_pass = false; int i; check_stop_daemons(); for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-one_pass")) { one_pass = true; } else if (!strcmp(argv[i], "-dont_retry_errors")) { dont_retry_errors = true; } else if (!strcmp(argv[i], "-preserve_wu_files")) { preserve_wu_files = true; } else if (!strcmp(argv[i], "-preserve_result_files")) { preserve_result_files = true; } else if (!strcmp(argv[i], "-appid")) { appid = atoi(argv[++i]); } else if (!strcmp(argv[i], "-d")) { log_messages.set_debug_level(atoi(argv[++i])); } else if (!strcmp(argv[i], "-mod")) { id_modulus = atoi(argv[++i]); id_remainder = atoi(argv[++i]); } else if (!strcmp(argv[i], "-dont_delete_antiques")) { dont_delete_antiques = true; } else if (!strcmp(argv[i], "-dont_delete_batches")) { dont_delete_batches = true; } else if (!strcmp(argv[i], "-delete_antiques_now")) { antique_delay = 0; } else if (!strcmp(argv[i], "-input_files_only")) { do_output_files = false; dont_delete_antiques = true; } else if (!strcmp(argv[i], "-output_files_only")) { do_input_files = false; } else if (!strcmp(argv[i], "-sleep_interval")) { sleep_interval = atoi(argv[++i]); } else if (!strcmp(argv[i], "-help")) { usage(); } else { log_messages.printf(MSG_CRITICAL, "Unrecognized arg: %s\n", argv[i] ); usage(); } } if (id_modulus) { log_messages.printf(MSG_DEBUG, "Using mod'ed WU/result enumeration. mod = %d rem = %d\n", id_modulus, id_remainder ); } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } log_messages.printf(MSG_NORMAL, "Starting\n"); retval = boinc_db.open(config.db_name, config.db_host, config.db_user, config.db_passwd); if (retval) { log_messages.printf(MSG_CRITICAL, "can't open DB\n"); exit(1); } retval = boinc_db.set_isolation_level(READ_UNCOMMITTED); if (retval) { log_messages.printf(MSG_CRITICAL, "boinc_db.set_isolation_level: %d; %s\n", retval, boinc_db.error_string() ); } install_stop_signal_handler(); bool retry_errors_now = !dont_retry_errors; double next_error_time=0; double next_antique_time = dtime() + antique_delay; while (1) { bool got_any = do_pass(false); if (retry_errors_now) { bool got_any_errors = do_pass(true); if (got_any_errors) { got_any = true; } else { retry_errors_now = false; next_error_time = dtime() + ERROR_INTERVAL; log_messages.printf(MSG_DEBUG, "ending retry of previous errors\n" ); } } if (!got_any) { if (one_pass) break; sleep(sleep_interval); } if (!dont_delete_antiques && (dtime() > next_antique_time)) { log_messages.printf(MSG_DEBUG, "Doing antique deletion pass\n" ); do_antique_pass(); next_antique_time = dtime() + ANTIQUE_INTERVAL; } if (!dont_retry_errors && !retry_errors_now && (dtime() > next_error_time)) { retry_errors_now = true; log_messages.printf(MSG_DEBUG, "starting retry of previous errors\n" ); } } }
int main(int argc, char** argv) { int retval; bool one_pass = false; int i; int sleep_sec = 600; check_stop_daemons(); for (i=1; i<argc; i++) { if (is_arg(argv[i], "one_pass")) { one_pass = true; } else if (is_arg(argv[i], "dont_delete")) { dont_delete = true; } else if (is_arg(argv[i], "d") || is_arg(argv[i], "debug_level")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } int dl = atoi(argv[i]); log_messages.set_debug_level(dl); if (dl == 4) g_print_queries = true; } else if (is_arg(argv[i], "min_age_days")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } min_age_days = atof(argv[i]); } else if (is_arg(argv[i], "max")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } max_number_workunits_to_purge= atoi(argv[i]); } else if (is_arg(argv[i], "daily_dir")) { daily_dir=true; } else if (is_arg(argv[i], "zip")) { compression_type=COMPRESSION_ZIP; } else if (is_arg(argv[i], "gzip")) { compression_type=COMPRESSION_GZIP; } else if (is_arg(argv[i], "max_wu_per_file")) { if(!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } max_wu_per_file = atoi(argv[i]); } else if (is_arg(argv[i], "no_archive")) { no_archive = true; } else if (is_arg(argv[i], "-sleep")) { if(!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } sleep_sec = atoi(argv[i]); if (sleep_sec < 1 || sleep_sec > 86400) { log_messages.printf(MSG_CRITICAL, "Unreasonable value of sleep interval: %d seconds\n", sleep_sec ); usage(argv[0]); exit(1); } } else if (is_arg(argv[i], "--help") || is_arg(argv[i], "-help") || is_arg(argv[i], "-h")) { usage(argv[0]); return 0; } else if (is_arg(argv[i], "--version") || is_arg(argv[i], "-version")) { printf("%s\n", SVN_VERSION); exit(0); } else { log_messages.printf(MSG_CRITICAL, "unknown command line argument: %s\n\n", argv[i] ); usage(argv[0]); exit(1); } } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } log_messages.printf(MSG_NORMAL, "Starting\n"); retval = boinc_db.open( config.db_name, config.db_host, config.db_user, config.db_passwd ); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't open DB\n"); exit(2); } install_stop_signal_handler(); boinc_mkdir(config.project_path("archives")); // on exit, either via the check_stop_daemons signal handler, or // through a regular call to exit, these functions will be called // in the opposite order of registration. // atexit(close_db_exit_handler); atexit(close_all_archives); while (1) { if (time_to_quit()) { break; } if (!do_pass() && !one_pass) { log_messages.printf(MSG_NORMAL, "Sleeping....\n"); sleep(sleep_sec); } if (one_pass) { break; } } // files and database are closed by exit handler exit(0); }
int main(int argc, char** argv) { int retval; bool one_pass = false; int i; DB_APP app; check_stop_daemons(); *app.name='\0'; for (i=1; i<argc; i++) { if (is_arg(argv[i], "one_pass")) { one_pass = true; } else if (is_arg(argv[i], "dont_retry_errors")) { dont_retry_errors = true; } else if (is_arg(argv[i], "preserve_wu_files")) { preserve_wu_files = true; } else if (is_arg(argv[i], "preserve_result_files")) { preserve_result_files = true; } else if (is_arg(argv[i], "app")) { strcpy(app.name, argv[++i]); } else if (is_arg(argv[i], "appid")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } appid = atoi(argv[i]); } else if (is_arg(argv[i], "d") || is_arg(argv[i], "debug_level")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } int dl = atoi(argv[i]); log_messages.set_debug_level(dl); if (dl == 4) g_print_queries = true; } else if (is_arg(argv[i], "mod")) { if (!argv[i+1] || !argv[i+2]) { log_messages.printf(MSG_CRITICAL, "%s requires two arguments\n\n", argv[i]); usage(argv[0]); exit(1); } id_modulus = atoi(argv[++i]); id_remainder = atoi(argv[++i]); } else if (is_arg(argv[i], "dont_delete_antiques")) { dont_delete_antiques = true; } else if (is_arg(argv[i], "delete_antiques_interval")) { antique_interval = atoi(argv[++i]); } else if (is_arg(argv[i], "delete_antiques_limit")) { antique_limit = atoi(argv[++i]); } else if (is_arg(argv[i], "dont_delete_batches")) { dont_delete_batches = true; } else if (is_arg(argv[i], "delete_antiques_now")) { antique_delay = 0; } else if (is_arg(argv[i], "input_files_only")) { do_output_files = false; dont_delete_antiques = true; } else if (is_arg(argv[i], "output_files_only")) { do_input_files = false; } else if (is_arg(argv[i], "sleep_interval")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); usage(argv[0]); exit(1); } sleep_interval = atoi(argv[i]); } else if (is_arg(argv[i], "h") || is_arg(argv[i], "help")) { usage(argv[0]); exit(0); } else if (is_arg(argv[i], "v") || is_arg(argv[i], "version")) { printf("%s\n", SVN_VERSION); exit(0); } else { log_messages.printf(MSG_CRITICAL, "unknown command line argument: %s\n\n", argv[i]); usage(argv[0]); exit(1); } } if (id_modulus) { log_messages.printf(MSG_DEBUG, "Using mod'ed WU/result enumeration. mod = %d rem = %d\n", id_modulus, id_remainder ); } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } log_messages.printf(MSG_NORMAL, "Starting\n"); retval = boinc_db.open(config.db_name, config.db_host, config.db_user, config.db_passwd); if (retval) { log_messages.printf(MSG_CRITICAL, "can't open DB\n"); exit(1); } retval = boinc_db.set_isolation_level(READ_UNCOMMITTED); if (retval) { log_messages.printf(MSG_CRITICAL, "boinc_db.set_isolation_level: %s; %s\n", boincerror(retval), boinc_db.error_string() ); } if (*app.name && !appid) { char buf[256]; sprintf(buf, "where name='%s'", app.name); retval = app.lookup(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't find app\n"); exit(1); } appid=app.id; log_messages.printf(MSG_DEBUG, "Deleting files of appid %d\n",appid); } install_stop_signal_handler(); bool retry_errors_now = !dont_retry_errors; double next_error_time=0; double next_antique_time = dtime() + antique_delay; while (1) { bool got_any = do_pass(false); if (retry_errors_now) { bool got_any_errors = do_pass(true); if (got_any_errors) { got_any = true; } else { retry_errors_now = false; next_error_time = dtime() + ERROR_INTERVAL; log_messages.printf(MSG_DEBUG, "ending retry of previous errors\n" ); } } if (!got_any) { if (one_pass) break; sleep(sleep_interval); } if (!dont_delete_antiques && (dtime() > next_antique_time)) { log_messages.printf(MSG_DEBUG, "Doing antique deletion pass\n" ); do_antique_pass(); next_antique_time = dtime() + antique_interval; } if (!dont_retry_errors && !retry_errors_now && (dtime() > next_error_time)) { retry_errors_now = true; log_messages.printf(MSG_DEBUG, "starting retry of previous errors\n" ); } } }
int main(int argc, char** argv) { int i, retval; const char *usage = "\nUsage: %s -app <app-name> [OPTIONS]\n" "Start validator for application <app-name>\n\n" "Optional arguments:\n" " --one_pass_N_WU N Validate at most N WUs, then exit\n" " --one_pass Make one pass through WU table, then exit\n" " --mod n i Process only WUs with (id mod n) == i\n" " --max_claimed_credit X If a result claims more credit than this, mark it as invalid\n" " --max_granted_credit X Grant no more than this amount of credit to a result\n" " --grant_claimed_credit Grant the claimed credit, regardless of what other results for this workunit claimed\n" " --update_credited_job Add record to credited_job table after granting credit\n" " --credit_from_wu Credit is specified in WU XML\n" " --sleep_interval n Set sleep-interval to n\n" " -d n, --debug_level n Set log verbosity level, 1-4\n" " -h | --help Show this\n" " -v | --version Show version information\n"; if ((argc > 1) && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) { printf (usage, argv[0] ); exit(0); } check_stop_daemons(); for (i=1; i<argc; i++) { if (is_arg(argv[i], "one_pass_N_WU")) { one_pass_N_WU = atoi(argv[++i]); one_pass = true; } else if (is_arg(argv[i], "sleep_interval")) { sleep_interval = atoi(argv[++i]); } else if (is_arg(argv[i], "one_pass")) { one_pass = true; } else if (is_arg(argv[i], "app")) { strcpy(app_name, argv[++i]); } else if (is_arg(argv[i], "d") || is_arg(argv[i], "debug_level")) { debug_level = atoi(argv[++i]); log_messages.set_debug_level(debug_level); if (debug_level == 4) g_print_queries = true; } else if (is_arg(argv[i], "mod")) { wu_id_modulus = atoi(argv[++i]); wu_id_remainder = atoi(argv[++i]); } else if (is_arg(argv[i], "max_granted_credit")) { max_granted_credit = atof(argv[++i]); } else if (is_arg(argv[i], "max_claimed_credit")) { max_claimed_credit = atof(argv[++i]); } else if (is_arg(argv[i], "grant_claimed_credit")) { grant_claimed_credit = true; } else if (is_arg(argv[i], "update_credited_job")) { update_credited_job = true; } else if (is_arg(argv[i], "credit_from_wu")) { credit_from_wu = true; } else if (is_arg(argv[i], "v") || is_arg(argv[i], "version")) { printf("%s\n", SVN_VERSION); exit(0); } else if(!strcmp(argv[i], "-testmd5")) { unsigned char hash[16]; char text[5] = "test"; MD5((unsigned char*)&text, 4, (unsigned char *)&hash); string hex = HexToStr((const unsigned char *)&hash, 16); printf("test = %s", hex.c_str()); } else { fprintf(stderr, "Invalid option '%s'\nTry `%s --help` for more information\n", argv[i], argv[0] ); log_messages.printf(MSG_CRITICAL, "unrecognized arg: %s\n", argv[i]); exit(1); } } if (app_name[0] == 0) { log_messages.printf(MSG_CRITICAL, "must use '--app' to specify an application\n" ); printf (usage, argv[0] ); exit(1); } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } log_messages.printf(MSG_NORMAL, "Starting validator, debug level %d\n", log_messages.debug_level ); if (wu_id_modulus) { log_messages.printf(MSG_NORMAL, "Modulus %d, remainder %d\n", wu_id_modulus, wu_id_remainder ); } install_stop_signal_handler(); main_loop(); }
// sleep for n seconds, but check every second for trigger file // void daemon_sleep(int nsecs) { for (int i=0; i<nsecs; i++) { check_stop_daemons(); sleep(1); } }
int main(int argc, char** argv) { int i, retval; char file_name[256]; int host_id; vector<const char*> urls; double max_latency = 7*86400; double max_nbytes = 1e9; strcpy(file_name, ""); host_id = 0; check_stop_daemons(); for (i=1; i<argc; i++) { if (is_arg(argv[i], "host_id")) { if (!argv[++i]) { usage(); exit(1); } host_id = atoi(argv[i]); } else if (is_arg(argv[i], "file_name")) { if (!argv[++i]) { usage(); exit(1); } strcpy(file_name, argv[i]); } else if (is_arg(argv[i], "h") || is_arg(argv[i], "help")) { usage(); exit(0); } else if (is_arg(argv[i], "v") || is_arg(argv[i], "version")) { printf("%s\n", SVN_VERSION); exit(0); } else if (is_arg(argv[i], "url")) { urls.push_back(argv[++i]); } else if (is_arg(argv[i], "max_latency")) { max_latency = atof(argv[++i]); } else if (is_arg(argv[i], "max_nbytes")) { max_nbytes = atof(argv[++i]); } else { usage(); exit(1); } } if (!strlen(file_name) || host_id == 0) { usage(); exit(1); } retval = config.parse_file(); if (retval) { fprintf(stderr, "Can't parse config.xml: %s\n", boincerror(retval)); exit(1); } retval = boinc_db.open( config.db_name, config.db_host, config.db_user, config.db_passwd ); if (retval) { fprintf(stderr, "boinc_db.open failed: %s\n", boincerror(retval)); exit(1); } if (urls.size() == 0) { urls.push_back(config.upload_url); } R_RSA_PRIVATE_KEY key; bool generate_upload_certificate = !config.dont_generate_upload_certificates; if (generate_upload_certificate) { char keypath[MAXPATHLEN]; sprintf(keypath, "%s/upload_private", config.key_dir); retval = read_key_file(keypath, key); if (retval) { fprintf(stderr, "can't read key\n"); exit(1); } } retval = create_get_file_msg( host_id, file_name, urls, max_nbytes, dtime() + max_latency, generate_upload_certificate, key ); if (retval) { fprintf(stderr, "get_file() failed: %s\n", boincerror(retval)); } boinc_db.close(); }