// This file is part of BOINC. // http://boinc.berkeley.edu // Copyright (C) 2022 University of California // // BOINC is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // BOINC is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with BOINC. If not, see . // This file is code to print (in ASCII) the stuff returned by GUI RPC. // Used only by boinccmd. #if defined(_WIN32) #include "boinc_win.h" #include "../version.h" #else #include "config.h" #include #include #include #include #include #include #include #include #endif #include "diagnostics.h" #include "error_numbers.h" #include "md5_file.h" #include "miofile.h" #include "network.h" #include "parse.h" #include "str_util.h" #include "util.h" #include "gui_rpc_client.h" using std::string; using std::vector; void DAILY_XFER_HISTORY::print() { for (unsigned int i=0; iproject_name.c_str()); } void APP_VERSION::print() { printf(" project: %s\n", project->project_name.c_str()); printf(" application: %s\n", app->name); printf(" platform: %s\n", platform); if (strlen(plan_class)) { printf(" plan class: %s\n", plan_class); } printf(" version: %.2f\n", version_num/100.0); if (avg_ncpus != 1) { printf(" avg #CPUS: %.3f\n", avg_ncpus); } if (gpu_type != PROC_TYPE_CPU) { printf(" coprocessor type: %s\n", proc_type_name(gpu_type)); printf(" coprocessor usage: %.3f\n", gpu_usage); } printf(" estimated GFLOPS: %.2f\n", flops/1e9); printf(" filename: %s\n", exec_filename); } void WORKUNIT::print() { printf(" name: %s\n", name); printf(" FP estimate: %e\n", rsc_fpops_est); printf(" FP bound: %e\n", rsc_fpops_bound); printf(" memory bound: %.2f MB\n", rsc_memory_bound/MEGA); printf(" disk bound: %.2f MB\n", rsc_disk_bound/MEGA); if (!job_keywords.empty()) { printf(" keywords:\n"); for (unsigned int i=0; i CPU_SCHED_UNINITIALIZED) { printf(" slot: %d\n", slot); printf(" PID: %d\n", pid); printf(" CPU time at last checkpoint: %f\n", checkpoint_cpu_time); printf(" current CPU time: %f\n", current_cpu_time); printf(" fraction done: %f\n", fraction_done); printf(" swap size: %.0f MB\n", swap_size/MEGA); printf(" working set size: %.0f MB\n", working_set_size_smoothed/MEGA); if (bytes_sent || bytes_received) { printf(" bytes sent: %.0f received: %.0f\n", bytes_sent, bytes_received ); } } // stuff for completed jobs // if (state > RESULT_FILES_DOWNLOADED) { printf(" final CPU time: %f\n", final_cpu_time); printf(" final elapsed time: %f\n", final_elapsed_time); printf(" exit_status: %d\n", exit_status); printf(" signal: %d\n", signal); } } void FILE_TRANSFER::print() { printf(" name: %s\n", name.c_str()); printf(" direction: %s\n", is_upload?"upload":"download"); printf(" sticky: %s\n", sticky?"yes":"no"); printf(" xfer active: %s\n", xfer_active?"yes":"no"); printf(" time_so_far: %f\n", time_so_far); if (xfer_active) printf(" estimated_xfer_time_remaining: %f\n", estimated_xfer_time_remaining); printf(" bytes_xferred: %f\n", bytes_xferred); printf(" xfer_speed: %f\n", xfer_speed); } void MESSAGE::print() { printf("%s %d %d %s\n", project.c_str(), priority, timestamp, body.c_str() ); } void GR_PROXY_INFO::print() { printf("HTTP server name: %s\n",this->http_server_name.c_str()); printf("HTTP server port: %d\n",this->http_server_port); printf("HTTP user name: %s\n",this->http_user_name.c_str()); //printf("HTTP user password: %s\n",this->http_user_passwd.c_str()); printf("SOCKS server name: %s\n",this->socks_server_name.c_str()); printf("SOCKS server port: %d\n",this->socks_server_port); printf("SOCKS5 user name: %s\n",this->socks5_user_name.c_str()); //printf("SOCKS5 user password: %s\n",this->socks5_user_passwd.c_str()); printf("no proxy hosts: %s\n",this->noproxy_hosts.c_str()); } void HOST_INFO::print() { printf(" timezone: %d\n", timezone); printf(" domain name: %s\n", domain_name); printf(" IP addr: %s\n", ip_addr); printf(" #CPUS: %d\n", p_ncpus); printf(" CPU vendor: %s\n", p_vendor); printf(" CPU model: %s\n", p_model); printf(" CPU FP OPS: %f\n", p_fpops); printf(" CPU int OPS: %f\n", p_iops); //printf(" CPU mem BW: %f\n", p_membw); printf(" OS name: %s\n", os_name); printf(" OS version: %s\n", os_version); printf(" mem size: %f\n", m_nbytes); printf(" cache size: %f\n", m_cache); printf(" swap size: %f\n", m_swap); printf(" disk size: %f\n", d_total); printf(" disk free: %f\n", d_free); // Show GPU info. // This is harder than it should be, // because the structures aren't populated like they were // at GPU detection time. // Would be better for the client to export the description strings. // char buf[256]; COPROC_NVIDIA& cn = coprocs.nvidia; if (cn.count) { cn.description(buf, sizeof(buf)); printf(" NVIDIA GPU: %s\n", buf); if (cn.count > 1) { printf(" Count: %d\n", cn.count); } if (cn.have_opencl) { cn.opencl_prop.is_used = COPROC_USED; cn.opencl_prop.peak_flops = cn.peak_flops; cn.opencl_prop.opencl_available_ram = cn.available_ram; cn.opencl_prop.description(buf, sizeof(buf), "NVIDIA"); printf(" %s\n", buf); } } COPROC_ATI &ca = coprocs.ati; if (ca.count) { ca.description(buf, sizeof(buf)); printf(" AMD GPU: %s\n", buf); if (ca.count > 1) { printf(" Count: %d\n", ca.count); } if (ca.have_opencl) { ca.opencl_prop.peak_flops = ca.peak_flops; ca.opencl_prop.opencl_available_ram = ca.available_ram; ca.opencl_prop.is_used = COPROC_USED; ca.opencl_prop.description(buf, sizeof(buf), "AMD"); printf(" %s\n", buf); } } COPROC_INTEL &ci = coprocs.intel_gpu; if (ci.count) { printf(" Intel GPU\n"); if (ci.count > 1) { printf(" Count: %d\n", ci.count); } if (ci.have_opencl) { ci.opencl_prop.peak_flops = ci.peak_flops; ci.opencl_prop.opencl_available_ram = ci.opencl_prop.global_mem_size; ci.opencl_prop.is_used = COPROC_USED; ci.opencl_prop.description(buf, sizeof(buf), "Intel GPU"); printf(" %s\n", buf); } } COPROC_APPLE &cap = coprocs.apple_gpu; if (cap.count) { printf(" Apple GPU\n"); if (cap.count > 1) { printf(" Count: %d\n", cap.count); } if (cap.have_opencl) { cap.opencl_prop.peak_flops = cap.peak_flops; cap.opencl_prop.opencl_available_ram = cap.opencl_prop.global_mem_size; cap.opencl_prop.is_used = COPROC_USED; cap.opencl_prop.description(buf, sizeof(buf), "Apple GPU"); printf(" %s\n", buf); } } } void SIMPLE_GUI_INFO::print() { unsigned int i; printf("======== Projects ========\n"); for (i=0; iprint(); } printf("\n======== Tasks ========\n"); for (i=0; iprint(); } } void TIME_STATS::print() { printf(" now: %f\n", now); printf(" on_frac: %f\n", on_frac); printf(" connected_frac: %f\n", connected_frac); printf(" cpu_and_network_available_frac: %f\n", cpu_and_network_available_frac); printf(" active_frac: %f\n", active_frac); printf(" gpu_active_frac: %f\n", gpu_active_frac); time_t foo = (time_t)client_start_time; printf(" client_start_time: %s\n", ctime(&foo)); printf(" previous_uptime: %f\n", previous_uptime); printf(" session_active_duration: %f\n", session_active_duration); printf(" session_gpu_active_duration: %f\n", session_gpu_active_duration); foo = (time_t)total_start_time; printf(" total_start_time: %s\n", ctime(&foo)); printf(" total_duration: %f\n", total_duration); printf(" total_active_duration: %f\n", total_active_duration); printf(" total_gpu_active_duration: %f\n", total_gpu_active_duration); } void CC_STATE::print() { unsigned int i; printf("======== Projects ========\n"); for (i=0; iprint(); } printf("\n======== Applications ========\n"); for (i=0; iprint(); } printf("\n======== Application versions ========\n"); for (i=0; iprint(); } printf("\n======== Workunits ========\n"); for (i=0; iprint(); } printf("\n======== Tasks ========\n"); for (i=0; iprint(); } printf("\n======== Time stats ========\n"); time_stats.print(); } void print_status( const char* name, int reason, int mode, int mode_perm, double delay ) { printf("%s status\n", name); if (reason) { printf(" suspended: %s\n", suspend_reason_string(reason)); } else { printf(" not suspended\n"); } printf( " current mode: %s\n" " perm mode: %s\n" " perm becomes current in %.0f sec\n", run_mode_string(mode), run_mode_string(mode_perm), delay ); } void CC_STATUS::print() { printf("network connection status: %s\n", network_status_string(network_status) ); print_status("CPU", task_suspend_reason, task_mode, task_mode_perm, task_mode_delay ); print_status("GPU", gpu_suspend_reason, gpu_mode, gpu_mode_perm, gpu_mode_delay ); print_status("Network", network_suspend_reason, network_mode, network_mode_perm, network_mode_delay ); } void PROJECTS::print() { unsigned int i; printf("======== Projects ========\n"); for (i=0; iprint(); } } void PROJECTS::print_urls() { unsigned int i; for (i=0; imaster_url); } } void DISK_USAGE::print() { unsigned int i; printf("======== Disk usage ========\n"); printf("total: %.2fMB\n", d_total/MEGA); printf("free: %.2fMB\n", d_free/MEGA); for (i=0; iprint_disk_usage(); } } void RESULTS::print() { unsigned int i; printf("\n======== Tasks ========\n"); for (i=0; iprint(); } } void FILE_TRANSFERS::print() { unsigned int i; printf("\n======== File transfers ========\n"); for (i=0; iprint(); } } void MESSAGES::print() { unsigned int i; printf("\n======== Messages ========\n"); for (i=0; iprint(); } } void PROJECT_CONFIG::print() { printf( "uses_username: %d\n" "name: %s\n" "min_passwd_length: %d\n", uses_username, name.c_str(), min_passwd_length ); } void ACCOUNT_OUT::print() { if (error_num) { printf("error in account lookup: %s\n", boincerror(error_num)); } else { printf("account key: %s\n", authenticator.c_str()); } } void OLD_RESULT::print() { printf( "task %s:\n" " project URL: %s\n" " app name: %s\n" " exit status: %d\n" " elapsed time: %f sec\n" " completed time: %s\n" " reported time: %s\n", result_name, project_url, app_name, exit_status, elapsed_time, time_to_string(completed_time), time_to_string(create_time) ); } void ACCT_MGR_INFO::print() { printf( "Account manager info:\n" " Name: %s\n" " URL: %s\n", acct_mgr_name.c_str(), acct_mgr_url.c_str() ); }