diff --git a/client/boinc_cmd.cpp b/client/boinc_cmd.cpp index 0871a4bf6d..bd08047512 100644 --- a/client/boinc_cmd.cpp +++ b/client/boinc_cmd.cpp @@ -77,7 +77,15 @@ Commands:\n\ --get_proxy_settings\n\ --get_simple_gui_info show status of projects and active tasks\n\ --get_state show entire state\n\ - --get_tasks show tasks\n\ + --get_tasks show tasks (detailed)\n\ + --get_task_summary [pcedsrw] show tasks (1 task per line)\n\ + p: project name\n\ + c: completion %%\n\ + e: elapsed time\n\ + d: deadline\n\ + s: status\n\ + r: resource usage\n\ + w: WU name\n\ --get_old_tasks show reported tasks from last 1 hour\n\ --join_acct_mgr URL name passwd same as --acct_mgr attach\n\ --lookup_account URL email passwd\n\ @@ -188,6 +196,166 @@ void show_alerts(RPC_CLIENT &rpc) { } } +////////////// --get_task_summary start //////////////// + +typedef vector STR_LIST; + +// given: a list of lines, each consisting of n columns +// for each column: find the longest entry. +// Then display the lines so the columns line up. +// +void show_str_lists(vector &lines, size_t ncols) { + vector lengths; + size_t i; + for (i=0; i lines; + STR_LIST title; + + bool projects = false; + for (char opt: options) { + switch(opt) { + case 'p': title.push_back("Project"); projects = true; break; + case 'c': title.push_back("% Done"); break; + case 'e': title.push_back("Elapsed"); break; + case 'd': title.push_back("Deadline"); break; + case 's': title.push_back("Status"); break; + case 'r': title.push_back("Procs"); break; + case 'w': title.push_back("WU name"); break; + } + } + lines.push_back(title); + if (projects) { + retval = rpc.get_project_status(ps); + if (retval) return retval; + } + for (RESULT* r: results.results) { + RESULT_INFO* ri = new RESULT_INFO; + STR_LIST line; + for (char opt2: options) { + switch(opt2) { + case 'p': + strcpy(ri->project_name, r->project_url); + for (PROJECT* p: ps.projects) { + if (!strcmp(p->master_url, r->project_url)) { + strcpy(ri->project_name, p->project_name.c_str()); + break; + } + } + line.push_back(ri->project_name); + break; + case 'c': + if (r->scheduler_state > CPU_SCHED_UNINITIALIZED) { + sprintf(ri->pct_done, "%.2f%%", r->fraction_done*100); + } else { + strcpy(ri->pct_done, "---"); + } + line.push_back(ri->pct_done); + break; + case 'e': + if (r->scheduler_state > CPU_SCHED_UNINITIALIZED) { + strcpy(ri->elapsed_time, timediff_format(r->elapsed_time).c_str()); + } else { + strcpy(ri->elapsed_time, "---"); + } + line.push_back(ri->elapsed_time); + break; + case 'd': + strcpy(ri->deadline, time_to_string(r->report_deadline)); + line.push_back(ri->deadline); + break; + case 's': + strcpy(ri->status, active_task_state_string(r->active_task_state)); + downcase_string(ri->status); + line.push_back(ri->status); + break; + case 'r': + strcpy(ri->resource_usage, strlen(r->resources)?r->resources:"1 CPU"); + line.push_back(ri->resource_usage); + break; + case 'w': + strcpy(ri->wu_name, r->wu_name); + line.push_back(ri->wu_name); + break; + } + } + lines.push_back(line); + } + show_str_lists(lines, options.length()); + return 0; +} + +////////////// --get_task_summary end //////////////// + int main(int argc, char** argv) { RPC_CLIENT rpc; int i, retval, port=0; @@ -335,6 +503,15 @@ int main(int argc, char** argv) { RESULTS results; retval = rpc.get_results(results); if (!retval) results.print(); + } else if (!strcmp(cmd, "--get_task_summary")) { + string options; + if (i ors; retval = rpc.get_old_results(ors);