void CBOINCClientManager::ShutdownBOINCCore() { CMainDocument* pDoc = wxGetApp().GetDocument(); wxInt32 iCount = 0; bool bClientQuit = false; std::string strPassword; wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (m_bBOINCStartedByManager) { if (!pDoc->IsLocalClient()) { RPC_CLIENT rpc; if (!rpc.init("localhost")) { try { strPassword = read_gui_rpc_password(); } catch (...) { // Ignore any errors here and set an empty password. // This will happen if the manager does not find the // GUI-RPC-password file in its working directory. } rpc.authorize(strPassword.c_str()); if (wxProcess::Exists(m_lBOINCCoreProcessId)) { rpc.quit(); for (iCount = 0; iCount <= 10; iCount++) { if (!bClientQuit && !wxProcess::Exists(m_lBOINCCoreProcessId)) { bClientQuit = true; break; } ::wxSleep(1); } } } rpc.close(); } else { if (wxProcess::Exists(m_lBOINCCoreProcessId)) { pDoc->CoreClientQuit(); for (iCount = 0; iCount <= 10; iCount++) { if (!bClientQuit && !wxProcess::Exists(m_lBOINCCoreProcessId)) { bClientQuit = true; break; } ::wxSleep(1); } } } if (!bClientQuit) { ::wxKill(m_lBOINCCoreProcessId); } } }
// wxProcess::Exists and wxKill are unimplemented in WxMac-2.6.0 void CBOINCClientManager::ShutdownBOINCCore() { CMainDocument* pDoc = wxGetApp().GetDocument(); wxInt32 iCount = 0; std::string strPassword; wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (m_bBOINCStartedByManager) { if (!pDoc->IsLocalClient()) { RPC_CLIENT rpc; if (!rpc.init("localhost")) { try { strPassword = read_gui_rpc_password(); } catch (...) { // Ignore any errors here and set an empty password. // This will happen if the manager does not find the // GUI-RPC-password file in its working directory. } rpc.authorize(strPassword.c_str()); if (ProcessExists(m_lBOINCCoreProcessId)) { rpc.quit(); for (iCount = 0; iCount <= 10; iCount++) { if (!ProcessExists(m_lBOINCCoreProcessId)) return; ::wxSleep(1); } } } rpc.close(); } else { if (ProcessExists(m_lBOINCCoreProcessId)) { pDoc->CoreClientQuit(); for (iCount = 0; iCount <= 10; iCount++) { if (!ProcessExists(m_lBOINCCoreProcessId)) return; ::wxSleep(1); } } } // Client did not quit after 10 seconds so kill it kill(m_lBOINCCoreProcessId, SIGKILL); } m_lBOINCCoreProcessId = 0; }
void CBOINCClientManager::ShutdownBOINCCore(bool ShuttingDownManager) { wxLogTrace(wxT("Function Start/End"), wxT("CBOINCClientManager::ShutdownBOINCCore - Function Begin")); CMainDocument* pDoc = wxGetApp().GetDocument(); wxInt32 iCount = 0; bool bClientQuit = false; wxString strConnectedCompter = wxEmptyString; wxString strPassword = wxEmptyString; double startTime = 0; wxDateTime zeroTime = wxDateTime((time_t)0); wxDateTime rpcCompletionTime = zeroTime; ASYNC_RPC_REQUEST request; int quit_result; wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); #ifdef __WXMAC__ // Mac Manager shuts down client only if Manager started client if (!m_bBOINCStartedByManager) return; #endif #ifdef __WXMSW__ if (IsBOINCConfiguredAsDaemon()) { stop_daemon_via_daemonctrl(); bClientQuit = true; } else #endif { pDoc->GetConnectedComputerName(strConnectedCompter); if (!pDoc->IsComputerNameLocal(strConnectedCompter)) { RPC_CLIENT rpc; if (!rpc.init("localhost")) { pDoc->m_pNetworkConnection->GetLocalPassword(strPassword); rpc.authorize((const char*)strPassword.mb_str()); if (IsBOINCCoreRunning()) { rpc.quit(); for (iCount = 0; iCount <= 10; iCount++) { if (!bClientQuit && !IsBOINCCoreRunning()) { wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - (localhost) Application Exit Detected")); bClientQuit = true; break; } wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - (localhost) Application Exit NOT Detected, Sleeping...")); ::wxSleep(1); } } else { bClientQuit = true; } } rpc.close(); } else { if (IsBOINCCoreRunning()) { if (ShuttingDownManager) { // Set event filtering to allow RPC completion // events but not events which start new RPCs wxGetApp().SetEventFiltering(true); } quit_result = -1; request.clear(); request.which_rpc = RPC_QUIT; request.rpcType = RPC_TYPE_ASYNC_NO_REFRESH; request.completionTime = &rpcCompletionTime; request.resultPtr = &quit_result; pDoc->RequestRPC(request); // Issue an asynchronous Quit RPC // Client needs time to shut down project applications, so don't wait // for it to shut down; assume it will exit OK if Quit RPC succeeds. startTime = dtime(); while ((dtime() - startTime) < 10.0) { // Allow 10 seconds boinc_sleep(0.25); // Check 4 times per second wxSafeYield(NULL, true); // To allow handling RPC completion events if (!bClientQuit && (rpcCompletionTime != zeroTime)) { // If Quit RPC finished, check its returned value if (quit_result) { break; // Quit RPC returned an error } wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - Application Exit Detected")); bClientQuit = true; break; } wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - Application Exit NOT Detected, Sleeping...")); } } else { bClientQuit = true; } } } if (!bClientQuit) { KillClient(); } m_lBOINCCoreProcessId = 0; wxLogTrace(wxT("Function Start/End"), wxT("CBOINCClientManager::ShutdownBOINCCore - Function End")); }
void CBOINCClientManager::ShutdownBOINCCore() { wxLogTrace(wxT("Function Start/End"), wxT("CBOINCClientManager::ShutdownBOINCCore - Function Begin")); CMainDocument* pDoc = wxGetApp().GetDocument(); wxInt32 iCount = 0; DWORD dwExitCode = 0; bool bClientQuit = false; std::string strPassword; wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (m_bBOINCStartedByManager) { if (!pDoc->IsLocalClient()) { RPC_CLIENT rpc; if (!rpc.init("localhost")) { try { strPassword = read_gui_rpc_password(); } catch (...) { // Ignore any errors here and set an empty password. // This will happen if the manager does not find the // GUI-RPC-password file in its working directory. } rpc.authorize(strPassword.c_str()); if (GetExitCodeProcess(m_hBOINCCoreProcess, &dwExitCode)) { if (STILL_ACTIVE == dwExitCode) { rpc.quit(); for (iCount = 0; iCount <= 10; iCount++) { if (!bClientQuit && GetExitCodeProcess(m_hBOINCCoreProcess, &dwExitCode)) { if (STILL_ACTIVE != dwExitCode) { wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - (localhost) Application Exit Detected")); bClientQuit = true; break; } } wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - (localhost) Application Exit NOT Detected, Sleeping...")); ::wxSleep(1); } } } } rpc.close(); } else { if (GetExitCodeProcess(m_hBOINCCoreProcess, &dwExitCode)) { if (STILL_ACTIVE == dwExitCode) { pDoc->CoreClientQuit(); for (iCount = 0; iCount <= 10; iCount++) { if (!bClientQuit && GetExitCodeProcess(m_hBOINCCoreProcess, &dwExitCode)) { if (STILL_ACTIVE != dwExitCode) { wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - Application Exit Detected")); bClientQuit = true; break; } } wxLogTrace(wxT("Function Status"), wxT("CBOINCClientManager::ShutdownBOINCCore - Application Exit NOT Detected, Sleeping...")); ::wxSleep(1); } } } } if (!bClientQuit) { ::wxKill(m_lBOINCCoreProcessId); } m_lBOINCCoreProcessId = 0; } wxLogTrace(wxT("Function Start/End"), wxT("CBOINCClientManager::ShutdownBOINCCore - Function End")); }
int main(int argc, char** argv) { RPC_CLIENT rpc; int i, retval, port=0; MESSAGES messages; NOTICES notices; char passwd_buf[256], hostname_buf[256], *hostname=0; char* passwd = passwd_buf, *p; #ifdef _WIN32 chdir_to_data_dir(); #endif strcpy(passwd_buf, ""); read_gui_rpc_password(passwd_buf); #if defined(_WIN32) && defined(USE_WINSOCK) WSADATA wsdata; retval = WSAStartup( MAKEWORD( 1, 1 ), &wsdata); if (retval) { fprintf(stderr, "WinsockInitialize: %d\n", retval); exit(1); } #endif if (argc < 2) usage(); i = 1; if (!strcmp(argv[i], "--help")) usage(); if (!strcmp(argv[i], "-h")) usage(); if (!strcmp(argv[i], "--version")) version(); if (!strcmp(argv[i], "-V")) version(); if (!strcmp(argv[i], "--host")) { if (++i == argc) usage(); strlcpy(hostname_buf, argv[i], sizeof(hostname_buf)); hostname = hostname_buf; p = strchr(hostname, ':'); if (p) { port = atoi(p+1); *p=0; } i++; } if ((i<argc)&& !strcmp(argv[i], "--passwd")) { if (++i == argc) usage(); passwd = argv[i]; i++; } // change the following to debug GUI RPC's asynchronous connection mechanism // #if 1 retval = rpc.init(hostname, port); if (retval) { fprintf(stderr, "can't connect to %s\n", hostname?hostname:"local host"); exit(1); } #else retval = rpc.init_asynch(hostname, 60., false); while (1) { retval = rpc.init_poll(); if (!retval) break; if (retval == ERR_RETRY) { printf("sleeping\n"); sleep(1); continue; } fprintf(stderr, "can't connect: %d\n", retval); exit(1); } printf("connected\n"); #endif if (strlen(passwd)) { retval = rpc.authorize(passwd); if (retval) { fprintf(stderr, "Authorization failure: %d\n", retval); exit(1); } } char* cmd = next_arg(argc, argv, i); if (!strcmp(cmd, "--get_state")) { CC_STATE state; retval = rpc.get_state(state); if (!retval) state.print(); } else if (!strcmp(cmd, "--get_tasks")) { RESULTS results; retval = rpc.get_results(results); if (!retval) results.print(); } else if (!strcmp(cmd, "--get_file_transfers")) { FILE_TRANSFERS ft; retval = rpc.get_file_transfers(ft); if (!retval) ft.print(); } else if (!strcmp(cmd, "--get_daily_xfer_history")) { DAILY_XFER_HISTORY dxh; retval = rpc.get_daily_xfer_history(dxh); if (!retval) dxh.print(); } else if (!strcmp(cmd, "--get_project_status")) { PROJECTS ps; retval = rpc.get_project_status(ps); if (!retval) ps.print(); } else if (!strcmp(cmd, "--get_simple_gui_info")) { SIMPLE_GUI_INFO info; retval = rpc.get_simple_gui_info(info); if (!retval) info.print(); } else if (!strcmp(cmd, "--get_disk_usage")) { DISK_USAGE du; retval = rpc.get_disk_usage(du); if (!retval) du.print(); } else if (!strcmp(cmd, "--task")) { RESULT result; char* project_url = next_arg(argc, argv, i); strcpy(result.project_url, project_url); char* name = next_arg(argc, argv, i); strcpy(result.name, name); char* op = next_arg(argc, argv, i); if (!strcmp(op, "suspend")) { retval = rpc.result_op(result, "suspend"); } else if (!strcmp(op, "resume")) { retval = rpc.result_op(result, "resume"); } else if (!strcmp(op, "abort")) { retval = rpc.result_op(result, "abort"); } else { fprintf(stderr, "Unknown op %s\n", op); } } else if (!strcmp(cmd, "--project")) { PROJECT project; strcpy(project.master_url, next_arg(argc, argv, i)); canonicalize_master_url(project.master_url); char* op = next_arg(argc, argv, i); if (!strcmp(op, "reset")) { retval = rpc.project_op(project, "reset"); } else if (!strcmp(op, "suspend")) { retval = rpc.project_op(project, "suspend"); } else if (!strcmp(op, "resume")) { retval = rpc.project_op(project, "resume"); } else if (!strcmp(op, "detach")) { retval = rpc.project_op(project, "detach"); } else if (!strcmp(op, "update")) { retval = rpc.project_op(project, "update"); } else if (!strcmp(op, "suspend")) { retval = rpc.project_op(project, "suspend"); } else if (!strcmp(op, "resume")) { retval = rpc.project_op(project, "resume"); } else if (!strcmp(op, "nomorework")) { retval = rpc.project_op(project, "nomorework"); } else if (!strcmp(op, "allowmorework")) { retval = rpc.project_op(project, "allowmorework"); } else if (!strcmp(op, "detach_when_done")) { retval = rpc.project_op(project, "detach_when_done"); } else if (!strcmp(op, "dont_detach_when_done")) { retval = rpc.project_op(project, "dont_detach_when_done"); } else { fprintf(stderr, "Unknown op %s\n", op); } } else if (!strcmp(cmd, "--project_attach")) { char url[256]; strcpy(url, next_arg(argc, argv, i)); canonicalize_master_url(url); char* auth = next_arg(argc, argv, i); retval = rpc.project_attach(url, auth, ""); } else if (!strcmp(cmd, "--file_transfer")) { FILE_TRANSFER ft; ft.project_url = next_arg(argc, argv, i); ft.name = next_arg(argc, argv, i); char* op = next_arg(argc, argv, i); if (!strcmp(op, "retry")) { retval = rpc.file_transfer_op(ft, "retry"); } else if (!strcmp(op, "abort")) { retval = rpc.file_transfer_op(ft, "abort"); } else { fprintf(stderr, "Unknown op %s\n", op); } } else if (!strcmp(cmd, "--set_run_mode")) { char* op = next_arg(argc, argv, i); double duration; if (i >= argc || (argv[i][0] == '-')) { duration = 0; } else { duration = atof(next_arg(argc, argv, i)); } if (!strcmp(op, "always")) { retval = rpc.set_run_mode(RUN_MODE_ALWAYS, duration); } else if (!strcmp(op, "auto")) { retval = rpc.set_run_mode(RUN_MODE_AUTO, duration); } else if (!strcmp(op, "never")) { retval = rpc.set_run_mode(RUN_MODE_NEVER, duration); } else { fprintf(stderr, "Unknown op %s\n", op); } } else if (!strcmp(cmd, "--set_gpu_mode")) { char* op = next_arg(argc, argv, i); double duration; if (i >= argc || (argv[i][0] == '-')) { duration = 0; } else { duration = atof(next_arg(argc, argv, i)); } if (!strcmp(op, "always")) { retval = rpc.set_gpu_mode(RUN_MODE_ALWAYS, duration); } else if (!strcmp(op, "auto")) { retval = rpc.set_gpu_mode(RUN_MODE_AUTO, duration); } else if (!strcmp(op, "never")) { retval = rpc.set_gpu_mode(RUN_MODE_NEVER, duration); } else { fprintf(stderr, "Unknown op %s\n", op); } } else if (!strcmp(cmd, "--set_network_mode")) { char* op = next_arg(argc, argv, i); double duration; if (i >= argc || (argv[i][0] == '-')) { duration = 0; } else { duration = atof(next_arg(argc, argv, i)); } if (!strcmp(op, "always")) { retval = rpc.set_network_mode(RUN_MODE_ALWAYS, duration); } else if (!strcmp(op, "auto")) { retval = rpc.set_network_mode(RUN_MODE_AUTO, duration); } else if (!strcmp(op, "never")) { retval = rpc.set_network_mode(RUN_MODE_NEVER, duration); } else { fprintf(stderr, "Unknown op %s\n", op); } } else if (!strcmp(cmd, "--get_proxy_settings")) { GR_PROXY_INFO pi; retval = rpc.get_proxy_settings(pi); if (!retval) pi.print(); } else if (!strcmp(cmd, "--set_proxy_settings")) { GR_PROXY_INFO pi; pi.http_server_name = next_arg(argc, argv, i); pi.http_server_port = atoi(next_arg(argc, argv, i)); pi.http_user_name = next_arg(argc, argv, i); pi.http_user_passwd = next_arg(argc, argv, i); pi.socks_server_name = next_arg(argc, argv, i); pi.socks_server_port = atoi(next_arg(argc, argv, i)); pi.socks5_user_name = next_arg(argc, argv, i); pi.socks5_user_passwd = next_arg(argc, argv, i); pi.noproxy_hosts = next_arg(argc, argv, i); if (pi.http_server_name.size()) pi.use_http_proxy = true; if (pi.http_user_name.size()) pi.use_http_authentication = true; if (pi.socks_server_name.size()) pi.use_socks_proxy = true; retval = rpc.set_proxy_settings(pi); } else if (!strcmp(cmd, "--get_message_count")) { int seqno; retval = rpc.get_message_count(seqno); if (!retval) { printf("Greatest message sequence number: %d\n", seqno); } } else if (!strcmp(cmd, "--get_messages")) { int seqno; if (i == argc) { seqno = 0; } else { seqno = atoi(next_arg(argc, argv, i)); } retval = rpc.get_messages(seqno, messages); if (!retval) { unsigned int j; for (j=0; j<messages.messages.size(); j++) { MESSAGE& md = *messages.messages[j]; strip_whitespace(md.body); printf("%d: %s (%s) [%s] %s\n", md.seqno, time_to_string(md.timestamp), prio_name(md.priority), md.project.c_str(), md.body.c_str() ); } } } else if (!strcmp(cmd, "--get_notices")) { int seqno; if (i == argc) { seqno = 0; } else { seqno = atoi(next_arg(argc, argv, i)); } retval = rpc.get_notices(seqno, notices); if (!retval) { unsigned int j; for (j=0; j<notices.notices.size(); j++) { NOTICE& n = *notices.notices[j]; strip_whitespace(n.description); printf("%d: (%s) %s\n", n.seqno, time_to_string(n.create_time), n.description.c_str() ); } } } else if (!strcmp(cmd, "--get_host_info")) { HOST_INFO hi; retval = rpc.get_host_info(hi); if (!retval) hi.print(); } else if (!strcmp(cmd, "--join_acct_mgr")) { char* am_url = next_arg(argc, argv, i); char* am_name = next_arg(argc, argv, i); char* am_passwd = next_arg(argc, argv, i); retval = rpc.acct_mgr_rpc(am_url, am_name, am_passwd); if (!retval) { while (1) { ACCT_MGR_RPC_REPLY amrr; retval = rpc.acct_mgr_rpc_poll(amrr); if (retval) { printf("poll status: %s\n", boincerror(retval)); } else { if (amrr.error_num) { printf("poll status: %s\n", boincerror(amrr.error_num)); if (amrr.error_num != ERR_IN_PROGRESS) break; boinc_sleep(1); } else { int j, n = (int)amrr.messages.size(); if (n) { printf("Messages from account manager:\n"); for (j=0; j<n; j++) { printf("%s\n", amrr.messages[j].c_str()); } } break; } } } } } else if (!strcmp(cmd, "--quit_acct_mgr")) { retval = rpc.acct_mgr_rpc("", "", ""); } else if (!strcmp(cmd, "--run_benchmarks")) { retval = rpc.run_benchmarks(); } else if (!strcmp(cmd, "--get_project_config")) { char* gpc_url = next_arg(argc, argv,i); retval = rpc.get_project_config(string(gpc_url)); if (!retval) { while (1) { PROJECT_CONFIG pc; retval = rpc.get_project_config_poll(pc); if (retval) { printf("poll status: %s\n", boincerror(retval)); } else { if (pc.error_num) { printf("poll status: %s\n", boincerror(pc.error_num)); if (pc.error_num != ERR_IN_PROGRESS) break; boinc_sleep(1); } else { pc.print(); break; } } } } } else if (!strcmp(cmd, "--lookup_account")) { ACCOUNT_IN lai; lai.url = next_arg(argc, argv, i); lai.email_addr = next_arg(argc, argv, i); lai.passwd = next_arg(argc, argv, i); retval = rpc.lookup_account(lai); printf("status: %s\n", boincerror(retval)); if (!retval) { ACCOUNT_OUT lao; while (1) { retval = rpc.lookup_account_poll(lao); if (retval) { printf("poll status: %s\n", boincerror(retval)); } else { if (lao.error_num) { printf("poll status: %s\n", boincerror(lao.error_num)); if (lao.error_num != ERR_IN_PROGRESS) break; boinc_sleep(1); } else { lao.print(); break; } } } } } else if (!strcmp(cmd, "--create_account")) { ACCOUNT_IN cai; cai.url = next_arg(argc, argv, i); cai.email_addr = next_arg(argc, argv, i); cai.passwd = next_arg(argc, argv, i); cai.user_name = next_arg(argc, argv, i); retval = rpc.create_account(cai); printf("status: %s\n", boincerror(retval)); if (!retval) { ACCOUNT_OUT lao; while (1) { retval = rpc.create_account_poll(lao); if (retval) { printf("poll status: %s\n", boincerror(retval)); } else { if (lao.error_num) { printf("poll status: %s\n", boincerror(lao.error_num)); if (lao.error_num != ERR_IN_PROGRESS) break; boinc_sleep(1); } else { lao.print(); break; } } } } } else if (!strcmp(cmd, "--read_global_prefs_override")) { retval = rpc.read_global_prefs_override(); } else if (!strcmp(cmd, "--read_cc_config")) { retval = rpc.read_cc_config(); printf("retval %d\n", retval); } else if (!strcmp(cmd, "--network_available")) { retval = rpc.network_available(); } else if (!strcmp(cmd, "--get_cc_status")) { CC_STATUS cs; retval = rpc.get_cc_status(cs); if (!retval) { retval = cs.network_status; } cs.print(); } else if (!strcmp(cmd, "--quit")) { retval = rpc.quit(); } else { usage(); } if (retval < 0) { show_error(retval); } #if defined(_WIN32) && defined(USE_WINSOCK) WSACleanup(); #endif exit(retval); }