// 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): // // add.C - add items to the DB // // usages: // add app -app_name x // add application // create DB record // add platform -platform_name x // create DB record // add app_version // -app_name x -platform_name y -version a -exec_dir b -exec_file c // -download_dir d -url_base e // create DB record // copy exec to data directory // add user -email_addr x -name y -web_password z -authenticator a // add prefs -email_addr x -prefs_file y #include #include #include #include "db.h" #include "backend_lib.h" #include "md5_file.h" #include "crypt.h" APP app; PLATFORM platform; APP_VERSION app_version; USER user; int version, retval; double nbytes; char buf[256], md5_cksum[64]; char *app_name=0, *platform_name=0, *exec_dir=0, *exec_file=0; char *email_addr=0, *user_name=0, *web_password=0, *authenticator=0; char *prefs_file=0, *download_dir, *url_base; char* code_sign_keyfile; char *message=0, *message_priority=0; void add_app() { int retval; memset(&app, 0, sizeof(app)); strcpy(app.name, app_name); app.create_time = time(0); app.alpha_vers = version; app.beta_vers = version; app.prod_vers = version; retval = db_app_new(app); if (retval) { db_print_error("db_app_new"); } } void add_platform() { int retval; memset(&platform, 0, sizeof(platform)); strcpy(platform.name, platform_name); platform.create_time = time(0); retval = db_platform_new(platform); if (retval) { db_print_error("db_platform_new"); } } void add_app_version() { char path[256]; DATA_BLOCK signature; unsigned char signature_buf[SIGNATURE_SIZE_BINARY]; char signature_text[1024]; memset(&app_version, 0, sizeof(app_version)); strcpy(app.name, app_name); retval = db_app_lookup_name(app); if (retval) { fprintf(stderr, "add_app_version(): can't find app %s\n", app_name); db_print_error("db_app_lookup_name"); return; } app_version.appid = app.id; strcpy(platform.name, platform_name); retval = db_platform_lookup_name(platform); if (retval) { fprintf(stderr, "add_app_version(): can't find platform %s\n", platform_name); db_print_error("db_platform_lookup_name"); return; } app_version.platformid = platform.id; app_version.version_num = version; if (message) strcpy(app_version.message, message); if (message_priority) strcpy(app_version.message, message_priority); // copy executable to download directory // sprintf( buf, "cp %s/%s %s/%s", exec_dir, exec_file, download_dir, exec_file ); retval = system(buf); if (retval) { printf("failed: %s\n", buf); return; } // sign the executable // R_RSA_PRIVATE_KEY code_sign_key; FILE* fkey = fopen(code_sign_keyfile, "r"); if (!fkey) { fprintf(stderr, "add: can't open key file (%s)\n", code_sign_keyfile); exit(1); } retval = scan_key_hex(fkey, (KEY*)&code_sign_key, sizeof(code_sign_key)); fclose(fkey); if (retval) { fprintf(stderr, "add: can't parse key\n"); exit(1); } sprintf(path, "%s/%s", exec_dir, exec_file); signature.data = signature_buf; sign_file(path, code_sign_key, signature); sprint_hex_data(signature_text, signature); md5_file(path, md5_cksum, nbytes); // generate the XML doc directly. // TODO: use a template, as in create_work // sprintf(app_version.xml_doc, "\n" " %s\n" " %s/%s\n" " \n" " \n%s" " \n" " %f\n" "\n" "\n" " %s\n" " %d\n" " \n" " %s\n" " \n" " \n" "\n", exec_file, url_base, exec_file, signature_text, nbytes, app_name, version, exec_file ); app_version.create_time = time(0); retval = db_app_version_new(app_version); if (retval) { db_print_error("db_app_version_new"); return; } } void add_user() { memset(&user, 0, sizeof(user)); user.create_time = time(0); strcpy(user.email_addr, email_addr); strcpy(user.name, user_name); strcpy(user.web_password, web_password); strcpy(user.authenticator, authenticator); strcpy(user.country, "United States"); strcpy(user.postal_code, "94703"); if (prefs_file) { retval = read_filename(prefs_file, user.prefs); if (retval) { printf("read_file: %s", prefs_file); return; } user.prefs_mod_time = time(0); } else { strcpy(user.prefs, "\n" "1.2\n" "2.5\n" "0.4\n" "50\n" "0.4\n" "\n" " http://localhost.localdomain\n" " david@localdomain\n" " 123892398\n" " 10\n" " \n" " Tahiti Sunset\n" " \n" "\n" "\n" ); } retval = db_user_new(user); if (retval) { db_print_error("db_user_new"); return; } } int main(int argc, char** argv) { int i; db_open(getenv("BOINC_DB_NAME")); for (i=2; i