boinc/samples/vboxwrapper/vboxjob.cpp

247 lines
8.7 KiB
C++

// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2010-2012 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 <http://www.gnu.org/licenses/>.
#ifdef _WIN32
#include "boinc_win.h"
#include "win_util.h"
#else
#include <vector>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <cmath>
#include <string>
#include <unistd.h>
#endif
#include "parse.h"
#include "filesys.h"
#include "boinc_api.h"
#include "vboxlogging.h"
#include "vboxjob.h"
VBOX_INTERMEDIATE_UPLOAD::VBOX_INTERMEDIATE_UPLOAD() {
clear();
}
VBOX_INTERMEDIATE_UPLOAD::~VBOX_INTERMEDIATE_UPLOAD() {
clear();
}
void VBOX_INTERMEDIATE_UPLOAD::clear() {
file = "";
reported = false;
ignore = false;
}
VBOX_PORT_FORWARD::VBOX_PORT_FORWARD() {
clear();
}
VBOX_PORT_FORWARD::~VBOX_PORT_FORWARD() {
clear();
}
void VBOX_PORT_FORWARD::clear() {
host_port = 0;
guest_port = 0;
is_remote = false;
nports = 0;
}
int VBOX_PORT_FORWARD::parse(XML_PARSER& xp) {
while (!xp.get_tag()) {
if (xp.match_tag("/port_forward")) {
if (!host_port) {
vboxlog_msg("VBOX_PORT_FORWARD::parse(): unspecified host port");
return ERR_XML_PARSE;
}
if (!guest_port) {
vboxlog_msg("VBOX_PORT_FORWARD::parse(): unspecified guest port");
return ERR_XML_PARSE;
}
return 0;
}
else if (xp.parse_bool("is_remote", is_remote)) continue;
else if (xp.parse_int("host_port", host_port)) continue;
else if (xp.parse_int("guest_port", guest_port)) continue;
else if (xp.parse_int("nports", nports)) continue;
else {
vboxlog_msg("VBOX_PORT_FORWARD::parse(): unexpected text %s", xp.parsed_tag);
}
}
return ERR_XML_PARSE;
}
VBOX_JOB::VBOX_JOB() {
clear();
}
VBOX_JOB::~VBOX_JOB() {
clear();
}
void VBOX_JOB::clear() {
os_name.clear();
memory_size_mb = 0.0;
job_duration = 0.0;
minimum_checkpoint_interval = 600.0;
minimum_heartbeat_interval = 600.0;
fraction_done_filename.clear();
heartbeat_filename.clear();
completion_trigger_file.clear();
temporary_exit_trigger_file.clear();
multiattach_vdi_file.clear();
enable_cern_dataformat = false;
enable_shared_directory = false;
enable_scratch_directory = false;
share_slot_dir = false;
share_project_dir = false;
enable_floppyio = false;
enable_cache_disk = false;
enable_isocontextualization = false;
enable_network = false;
network_bridged_mode = false;
enable_remotedesktop = false;
enable_gbac = false;
enable_screenshots_on_error = false;
enable_graphics_support = false;
enable_vm_savestate_usage = false;
disable_automatic_checkpoints = false;
boot_iso = false;
pf_guest_port = 0;
pf_host_port = 0;
port_forwards.clear();
intermediate_upload_files.clear();
copy_cmdline_to_shared = false;
// Initialize default values
vm_disk_controller_type = "sata";
vm_disk_controller_model = "IntelAHCI";
vm_graphics_controller_type = "VBoxVGA";
vram_size_mb = VBOX_VRAM_MIN;
}
int VBOX_JOB::parse() {
MIOFILE mf;
std::string str;
char buf[1024];
boinc_resolve_filename(JOB_FILENAME, buf, sizeof(buf));
FILE* f = boinc_fopen(buf, "r");
if (!f) {
vboxlog_msg("VBOX_JOB::parse(): can't open job file %s", buf);
return ERR_FOPEN;
}
mf.init_file(f);
XML_PARSER xp(&mf);
if (!xp.parse_start("vbox_job")) return ERR_XML_PARSE;
while (!xp.get_tag()) {
if (!xp.is_tag) {
vboxlog_msg("VBOX_JOB::parse(): unexpected text %s", xp.parsed_tag);
continue;
}
if (xp.match_tag("/vbox_job")) {
fclose(f);
return 0;
}
else if (xp.parse_string("vm_disk_controller_type", vm_disk_controller_type)) continue;
else if (xp.parse_string("vm_disk_controller_model", vm_disk_controller_model)) continue;
else if (xp.parse_string("os_name", os_name)) continue;
else if (xp.parse_double("vram_size_mb", vram_size_mb)) {
// keep it within the valid range
if (vram_size_mb < VBOX_VRAM_MIN) {
vram_size_mb = VBOX_VRAM_MIN;
} else if (vram_size_mb > VBOX_VRAM_MAX) {
vram_size_mb = VBOX_VRAM_MAX;
}
continue;
}
else if (xp.parse_double("memory_size_mb", memory_size_mb)) continue;
else if (xp.parse_double("job_duration", job_duration)) continue;
else if (xp.parse_double("minimum_checkpoint_interval", minimum_checkpoint_interval)) continue;
else if (xp.parse_double("minimum_heartbeat_interval", minimum_heartbeat_interval)) continue;
else if (xp.parse_string("fraction_done_filename", fraction_done_filename)) continue;
else if (xp.parse_string("heartbeat_filename", heartbeat_filename)) continue;
else if (xp.parse_string("completion_trigger_file", completion_trigger_file)) continue;
else if (xp.parse_string("temporary_exit_trigger_file", temporary_exit_trigger_file)) continue;
else if (xp.parse_string("multiattach_vdi_file", multiattach_vdi_file)) continue;
else if (xp.parse_bool("enable_cern_dataformat", enable_cern_dataformat)) continue;
else if (xp.parse_bool("enable_network", enable_network)) continue;
else if (xp.parse_bool("network_bridged_mode", network_bridged_mode)) continue;
else if (xp.parse_bool("enable_shared_directory", enable_shared_directory)) continue;
else if (xp.parse_bool("enable_scratch_directory", enable_scratch_directory)) continue;
else if (xp.parse_bool("share_slot_dir", share_slot_dir)) continue;
else if (xp.parse_bool("share_project_dir", share_project_dir)) continue;
else if (xp.parse_bool("enable_floppyio", enable_floppyio)) continue;
else if (xp.parse_bool("enable_cache_disk", enable_cache_disk)) continue;
else if (xp.parse_bool("enable_isocontextualization", enable_isocontextualization)) continue;
else if (xp.parse_bool("enable_remotedesktop", enable_remotedesktop)) continue;
else if (xp.parse_bool("enable_gbac", enable_gbac)) continue;
else if (xp.parse_bool("enable_screenshots_on_error", enable_screenshots_on_error)) continue;
else if (xp.parse_bool("enable_graphics_support", enable_graphics_support)) continue;
else if (xp.parse_bool("enable_vm_savestate_usage", enable_vm_savestate_usage)) continue;
else if (xp.parse_bool("disable_automatic_checkpoints", disable_automatic_checkpoints)) continue;
else if (xp.parse_bool("boot_iso", boot_iso)) continue;
else if (xp.parse_int("pf_guest_port", pf_guest_port)) continue;
else if (xp.parse_int("pf_host_port", pf_host_port)) continue;
else if (xp.parse_string("copy_to_shared", str)) {
copy_to_shared.push_back(str);
continue;
}
else if (xp.parse_bool("copy_cmdline_to_shared", copy_cmdline_to_shared)) continue;
else if (xp.parse_string("trickle_trigger_file", str)) {
trickle_trigger_files.push_back(str);
continue;
}
else if (xp.parse_string("intermediate_upload_file", str)) {
VBOX_INTERMEDIATE_UPLOAD iu;
iu.clear();
iu.file = str;
intermediate_upload_files.push_back(iu);
continue;
}
else if (xp.match_tag("port_forward")) {
VBOX_PORT_FORWARD pf;
pf.clear();
pf.parse(xp);
if (pf.nports) {
VBOX_PORT_FORWARD pf_range;
pf_range = pf;
pf_range.nports = 0;
for (int i = 0; i < pf.nports; ++i) {
port_forwards.push_back(pf_range);
pf_range.host_port++;
pf_range.guest_port++;
}
} else {
port_forwards.push_back(pf);
}
}
vboxlog_msg("VBOX_JOB::parse(): unexpected text %s", xp.parsed_tag);
}
fclose(f);
return ERR_XML_PARSE;
}