mirror of https://github.com/BOINC/boinc.git
reset/detach project commands
svn path=/trunk/boinc/; revision=1205
This commit is contained in:
parent
be21b6b6dd
commit
7bf4b9f973
|
@ -4144,7 +4144,7 @@ Erik May 13 2003
|
|||
test/
|
||||
test_uc.php
|
||||
|
||||
Erik May 15 2003
|
||||
Erik May 14 2003
|
||||
- added function to "reset" project (stop all current activities
|
||||
and delete everything except sticky files)
|
||||
- added function to "detach" from project (the above, plus
|
||||
|
@ -4159,3 +4159,16 @@ Erik May 15 2003
|
|||
util.C
|
||||
test/
|
||||
test_uc.php
|
||||
|
||||
Erik May 15 2003
|
||||
- added cmdline options for show/detach/reset project
|
||||
- -update_prefs command now takes a URL
|
||||
- added license text to some files
|
||||
|
||||
client/
|
||||
account.C
|
||||
client_state.C,h
|
||||
lib/
|
||||
util.C
|
||||
doc/
|
||||
client.html
|
||||
|
|
|
@ -63,8 +63,8 @@ int CLIENT_STATE::add_project(char* master_url, char* authenticator) {
|
|||
project = new PROJECT;
|
||||
strcpy(project->master_url, master_url);
|
||||
strcpy(project->authenticator, authenticator);
|
||||
// Strip any whitespace out of the authenticator
|
||||
strip_whitespace(project->authenticator);
|
||||
|
||||
project->tentative = true;
|
||||
retval = project->write_account_file();
|
||||
if (retval) return retval;
|
||||
|
@ -85,88 +85,3 @@ int CLIENT_STATE::add_project(char* master_url, char* authenticator) {
|
|||
projects.push_back(project);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
// Wrong approach.
|
||||
// The user must detach and reattach.
|
||||
// In any case the following has a major bug:
|
||||
// the call to remove_project_dir() won't work because
|
||||
// it gets the new, not the old, project URL
|
||||
//
|
||||
int CLIENT_STATE::change_project(
|
||||
int index, char* master_url, char* authenticator
|
||||
) {
|
||||
char path[256];
|
||||
PROJECT* project;
|
||||
FILE* f;
|
||||
int retval;
|
||||
|
||||
// check if this project is already running
|
||||
//
|
||||
if (lookup_project(master_url)) return -1;
|
||||
|
||||
// delete old account file
|
||||
//
|
||||
project = projects[index];
|
||||
get_account_filename(project->master_url, path);
|
||||
retval = file_delete(path);
|
||||
|
||||
// create project state
|
||||
//
|
||||
retval = write_account_file(master_url, authenticator);
|
||||
if (retval) return retval;
|
||||
get_account_filename(master_url, path);
|
||||
f = fopen(path, "r");
|
||||
if (!f) return ERR_FOPEN;
|
||||
retval = project->parse_account(f);
|
||||
fclose(f);
|
||||
if (retval) return retval;
|
||||
|
||||
// remove any old files
|
||||
retval = remove_project_dir(*project);
|
||||
|
||||
retval = make_project_dir(*project);
|
||||
if(retval) {
|
||||
return retval;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO: see if any activities are in progress for this project, and stop them
|
||||
//
|
||||
int CLIENT_STATE::quit_project(PROJECT* project) {
|
||||
PROJECT* p;
|
||||
vector <PROJECT*>::iterator iter;
|
||||
char path[256];
|
||||
int retval;
|
||||
|
||||
// find project and remove it from the vector
|
||||
//
|
||||
for (iter = projects.begin(); iter != projects.end(); iter++) {
|
||||
p = *iter;
|
||||
if (p == project) {
|
||||
projects.erase(iter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// delete account file
|
||||
//
|
||||
get_account_filename(project->master_url, path);
|
||||
retval = file_delete(path);
|
||||
|
||||
// if tentative, there are no activities so we can safely delete everything
|
||||
//
|
||||
if (project->tentative) {
|
||||
// remove project directory and its contents
|
||||
//
|
||||
remove_project_dir(*project);
|
||||
delete project;
|
||||
} else {
|
||||
#ifdef _WIN32
|
||||
AfxMessageBox("Please restart the client to complete the quit.", MB_OK, 0);
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
// 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):
|
||||
//
|
||||
|
||||
#ifndef _ACCOUNT_
|
||||
#define _ACCOUNT_
|
||||
|
||||
|
|
|
@ -66,7 +66,6 @@ CLIENT_STATE::CLIENT_STATE() {
|
|||
scheduler_op = new SCHEDULER_OP(http_ops);
|
||||
client_state_dirty = false;
|
||||
exit_when_idle = false;
|
||||
update_prefs = false;
|
||||
run_cpu_benchmarks = false;
|
||||
skip_cpu_benchmarks = false;
|
||||
file_xfer_giveup_period = PERS_GIVEUP;
|
||||
|
@ -81,6 +80,8 @@ CLIENT_STATE::CLIENT_STATE() {
|
|||
user_idle = true;
|
||||
use_http_proxy = false;
|
||||
use_socks_proxy = false;
|
||||
show_projects = false;
|
||||
strcpy(detach_project_url, "");
|
||||
strcpy(proxy_server_name, "");
|
||||
proxy_server_port = 80;
|
||||
strcpy(socks_user_name, "");
|
||||
|
@ -168,6 +169,7 @@ void CLIENT_STATE::install_global_prefs() {
|
|||
int CLIENT_STATE::init() {
|
||||
int retval;
|
||||
unsigned int i;
|
||||
char buf[256];
|
||||
|
||||
srand(time(NULL));
|
||||
|
||||
|
@ -201,7 +203,60 @@ int CLIENT_STATE::init() {
|
|||
print_summary();
|
||||
}
|
||||
|
||||
show_message(NULL, "Starting BOINC client", MSG_INFO);
|
||||
if (show_projects) {
|
||||
printf("projects:\n");
|
||||
for (i=0; i<projects.size(); i++) {
|
||||
printf("URL: %s name: %s\n",
|
||||
projects[i]->master_url, projects[i]->project_name
|
||||
);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (strlen(detach_project_url)) {
|
||||
PROJECT* project = lookup_project(detach_project_url);
|
||||
if (project) {
|
||||
detach_project(project);
|
||||
} else {
|
||||
printf("project %s not found\n", detach_project_url);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (strlen(reset_project_url)) {
|
||||
PROJECT* project = lookup_project(reset_project_url);
|
||||
if (project) {
|
||||
reset_project(project);
|
||||
} else {
|
||||
printf("project %s not found\n", reset_project_url);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (strlen(update_prefs_url)) {
|
||||
PROJECT* project = lookup_project(update_prefs_url);
|
||||
if (project) {
|
||||
project->sched_rpc_pending = true;
|
||||
} else {
|
||||
printf("project %s not found\n", update_prefs_url);
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(buf, "Starting BOINC client version %d.%02d",
|
||||
core_client_major_version, core_client_minor_version
|
||||
);
|
||||
show_message(NULL, buf, MSG_INFO);
|
||||
|
||||
if (core_client_major_version != old_major_version) {
|
||||
sprintf(buf,
|
||||
"State file has different major version (%d.%02d); resetting projects\n",
|
||||
old_major_version, old_minor_version
|
||||
);
|
||||
show_message(NULL, buf, MSG_INFO);
|
||||
for (i=0; i<projects.size(); i++) {
|
||||
reset_project(projects[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Read the global preferences file, if it exists.
|
||||
// Do this after reading the state file so we know our venue
|
||||
|
@ -253,15 +308,6 @@ int CLIENT_STATE::init() {
|
|||
//
|
||||
gstate.restart_tasks();
|
||||
|
||||
// If we're supposed to update prefs, arrange to contact all projects
|
||||
//
|
||||
if (update_prefs) {
|
||||
for (i=0; i<projects.size(); i++) {
|
||||
projects[i]->sched_rpc_pending = true;
|
||||
projects[i]->min_rpc_time = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -593,7 +639,6 @@ int CLIENT_STATE::parse_state_file() {
|
|||
PROJECT temp_project, *project;
|
||||
int retval=0;
|
||||
int failnum;
|
||||
int old_major_vers, old_minor_vers;
|
||||
|
||||
if (!f) {
|
||||
if (log_flags.state_debug) {
|
||||
|
@ -616,11 +661,10 @@ int CLIENT_STATE::parse_state_file() {
|
|||
if (project) {
|
||||
project->copy_state_fields(temp_project);
|
||||
} else {
|
||||
sprintf(buf,
|
||||
"Missing account file for project %s. Please attach to project.\n",
|
||||
fprintf(stderr,
|
||||
"Project %s found in state file but not prefs.\n",
|
||||
temp_project.master_url
|
||||
);
|
||||
show_message(NULL, buf, MSG_ERROR);
|
||||
}
|
||||
} else if (match_tag(buf, "<app>")) {
|
||||
APP* app = new APP;
|
||||
|
@ -697,8 +741,8 @@ int CLIENT_STATE::parse_state_file() {
|
|||
} else if (match_tag(buf, "<version>")) {
|
||||
// could put logic here to detect incompatible state files
|
||||
// after core client update
|
||||
} else if (parse_int(buf, "<core_client_major_version>", old_major_vers)) {
|
||||
} else if (parse_int(buf, "<core_client_minor_version>", old_minor_vers)) {
|
||||
} else if (parse_int(buf, "<core_client_major_version>", old_major_version)) {
|
||||
} else if (parse_int(buf, "<core_client_minor_version>", old_minor_version)) {
|
||||
} else if (match_tag(buf, "<use_http_proxy/>")) {
|
||||
use_http_proxy = true;
|
||||
} else if (parse_str(buf, "<proxy_server_name>", proxy_server_name, sizeof(proxy_server_name))) {
|
||||
|
@ -822,21 +866,11 @@ int CLIENT_STATE::write_state_file_if_needed() {
|
|||
}
|
||||
|
||||
// See if the project specified by master_url already exists
|
||||
// in the client state record. Ignore trailing backslashes,
|
||||
// i.e. http://project.com == http://project.com/
|
||||
// in the client state record.
|
||||
//
|
||||
PROJECT* CLIENT_STATE::lookup_project(char* master_url) {
|
||||
int in_len, proj_len, max_len;
|
||||
// Get the length of the master_url string
|
||||
// If there's a '/' at the end, ignore it
|
||||
in_len = strlen(master_url);
|
||||
if (master_url[strlen(master_url)-1] == '/') in_len--;
|
||||
|
||||
for (unsigned int i=0; i<projects.size(); i++) {
|
||||
proj_len = strlen(projects[i]->master_url);
|
||||
if (projects[i]->master_url[strlen(projects[i]->master_url)-1] == '/') proj_len--;
|
||||
max_len = max(in_len, proj_len);
|
||||
if (!strncmp(master_url, projects[i]->master_url, max_len)) {
|
||||
if (!strcmp(master_url, projects[i]->master_url)) {
|
||||
return projects[i];
|
||||
}
|
||||
}
|
||||
|
@ -1310,12 +1344,18 @@ void CLIENT_STATE::parse_cmdline(int argc, char** argv) {
|
|||
|
||||
// the above options are private (i.e. not shown by -help)
|
||||
|
||||
} else if (!strcmp(argv[i], "-attach_project")) {
|
||||
add_new_project();
|
||||
} else if (!strcmp(argv[i], "-show_projects")) {
|
||||
show_projects = true;
|
||||
} else if (!strcmp(argv[i], "-detach_project")) {
|
||||
strcpy(detach_project_url, argv[++i]);
|
||||
} else if (!strcmp(argv[i], "-reset_project")) {
|
||||
strcpy(reset_project_url, argv[++i]);
|
||||
} else if (!strcmp(argv[i], "-update_prefs")) {
|
||||
update_prefs = true;
|
||||
strcpy(update_prefs_url, argv[++i]);
|
||||
} else if (!strcmp(argv[i], "-run_cpu_benchmarks")) {
|
||||
run_cpu_benchmarks = true;
|
||||
} else if (!strcmp(argv[i], "-add_new_project")) {
|
||||
add_new_project();
|
||||
} else if (!strcmp(argv[i], "-version")) {
|
||||
printf( "%.2f %s\n", MAJOR_VERSION+(MINOR_VERSION/100.0), HOST );
|
||||
exit(0);
|
||||
|
@ -1547,6 +1587,7 @@ int CLIENT_STATE::reset_project(PROJECT* project) {
|
|||
}
|
||||
|
||||
garbage_collect();
|
||||
write_state_file();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1582,6 +1623,7 @@ int CLIENT_STATE::detach_project(PROJECT* project) {
|
|||
//
|
||||
remove_project_dir(*project);
|
||||
delete project;
|
||||
write_state_file();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -94,13 +94,19 @@ public:
|
|||
int file_xfer_giveup_period;
|
||||
bool user_idle;
|
||||
bool suspend_requested;
|
||||
bool update_prefs;
|
||||
bool start_saver;
|
||||
bool exit_when_idle;
|
||||
bool show_projects;
|
||||
bool requested_exit;
|
||||
bool use_http_proxy;
|
||||
bool use_socks_proxy;
|
||||
int proxy_server_port;
|
||||
char detach_project_url[256];
|
||||
// stores URL for -detach_project option
|
||||
char reset_project_url[256];
|
||||
// stores URL for -reset_project option
|
||||
char update_prefs_url[256];
|
||||
// stores URL for -update_prefs option
|
||||
char proxy_server_name[256];
|
||||
char socks_user_name[256];
|
||||
char socks_user_passwd[256];
|
||||
|
@ -114,6 +120,8 @@ private:
|
|||
TIME_STATS time_stats;
|
||||
int core_client_major_version;
|
||||
int core_client_minor_version;
|
||||
int old_major_version;
|
||||
int old_minor_version;
|
||||
char* platform_name;
|
||||
int nslots;
|
||||
bool skip_cpu_benchmarks;
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
// 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):
|
||||
//
|
||||
|
||||
// Show a message, preceded by timestamp and project name
|
||||
// priorities:
|
||||
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
// 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):
|
||||
//
|
||||
|
||||
//#define RUN_TEST
|
||||
|
||||
#define THOUSAND 1000
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
// 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):
|
||||
//
|
||||
|
||||
#include "client_state.h"
|
||||
|
||||
#include "ss_logic.h"
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
// 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):
|
||||
//
|
||||
|
||||
// BOINC core client screensaver logic.
|
||||
// The basic idea:
|
||||
// when the core client goes into screensaver mode,
|
||||
|
|
|
@ -122,11 +122,38 @@ Otherwise it draws the BOINC logo bouncing around the screen.
|
|||
<p>
|
||||
The command line client has several options:
|
||||
<dl>
|
||||
<dt> -add_new_project
|
||||
<dd> Enroll in a new project.
|
||||
You will be asked for the project URL and an account ID.
|
||||
|
||||
<dt> -attach_project
|
||||
<dd> Attach this computer to a new project.
|
||||
You must have an account with that project.
|
||||
You will be asked for the project URL and the account ID.
|
||||
|
||||
<dt> -show_projects
|
||||
<dd> Print a list of projects to which this computer is attached.
|
||||
|
||||
<dt> -detach_project
|
||||
<dd> Detach this computer from a project.
|
||||
You will be asked for the project URL.
|
||||
|
||||
<dt> -reset_project
|
||||
<dd> Clear pending work for a project.
|
||||
Use this if there is a problem that is preventing
|
||||
your computer from working.
|
||||
You will be asked for the project URL.
|
||||
|
||||
<dt> -update_prefs
|
||||
<dd>
|
||||
Contact a project's server to obtain new preferences.
|
||||
You will be asked for the project URL.
|
||||
|
||||
<dt> -run_cpu_benchmarks
|
||||
<dd>
|
||||
Run CPU benchmarks.
|
||||
Do this if you have modified your computer's hardware.
|
||||
|
||||
<dt> -help
|
||||
<dd> Show client options.
|
||||
|
||||
<dt> -version
|
||||
<dd> Show client version.
|
||||
</dl>
|
||||
|
|
10
lib/util.C
10
lib/util.C
|
@ -249,16 +249,14 @@ void c2x(char *what) {
|
|||
}
|
||||
|
||||
void strip_whitespace(char *str) {
|
||||
int read_pos, write_pos;
|
||||
read_pos = write_pos = 0;
|
||||
while(str[read_pos] != 0) {
|
||||
int read_pos=0, write_pos=0;
|
||||
while (str[read_pos]) {
|
||||
if (!isspace(str[read_pos])) {
|
||||
str[write_pos] = str[read_pos];
|
||||
write_pos++;
|
||||
str[write_pos++] = str[read_pos];
|
||||
}
|
||||
read_pos++;
|
||||
}
|
||||
str[write_pos] = '\0';
|
||||
str[write_pos] = 0;
|
||||
}
|
||||
|
||||
void unescape_url(char *url) {
|
||||
|
|
Loading…
Reference in New Issue