- vboxwrapper: for port-forwarding feature,

allow specification of guest port only.
    Change tag to <pf_guest_port>.
    Separate getting port from registering firewall rule


svn path=/trunk/boinc/; revision=24891
This commit is contained in:
David Anderson 2011-12-25 13:18:51 +00:00
parent 2ddd89cef3
commit 7f9fc64274
4 changed files with 56 additions and 55 deletions

View File

@ -9433,4 +9433,13 @@ Rom 25 Dec 2011
samples/vboxwrapper/
vbox.cpp, .h
David 25 Dec 2011
- vboxwrapper: for port-forwarding feature,
allow specification of guest port only.
Change tag to <pf_guest_port>.
Separate getting port from registering firewall rule
samples/vboxwrapper/
vbox.cpp,h
vboxwrapper.cpp

View File

@ -70,9 +70,8 @@ VBOX_VM::VBOX_VM() {
enable_floppyio = false;
register_only = false;
enable_network = false;
pf_desired_host_port = 0;
pf_desired_guest_port = 0;
pf_assigned_host_port = 0;
pf_guest_port = 0;
pf_host_port = 0;
}
VBOX_VM::~VBOX_VM() {
@ -129,8 +128,7 @@ int VBOX_VM::vbm_popen(string& arguments, string& output, const char* item, bool
int retry_count = 0;
string retry_notes;
do
{
do {
retval = vbm_popen_raw(arguments, output, item);
if (retval) {
@ -573,6 +571,35 @@ int VBOX_VM::initialize() {
return 0;
}
int VBOX_VM::get_port_forwarding_port() {
struct sockaddr_in addr;
BOINC_SOCKLEN_T addrsize;
int sock;
int retval;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addrsize = sizeof(addr);
retval = boinc_socket(sock);
if (retval) return retval;
retval = bind(sock, (struct sockaddr *)&addr, addrsize);
if (retval < 0) {
boinc_close_socket(sock);
return ERR_BIND;
}
getsockname(sock, (struct sockaddr *)&addr, &addrsize);
pf_host_port = addr.sin_port;
boinc_close_socket(sock);
return 0;
}
int VBOX_VM::register_vm() {
string command;
string output;
@ -737,7 +764,9 @@ int VBOX_VM::register_vm() {
// If a project wants to open up a firewall port through the VirtualBox virtual
// network firewall/nat do that here.
//
if (pf_desired_host_port) {
if (pf_guest_port) {
retval = get_port_forwarding_port();
if (retval) return retval;
retval = register_vm_firewall_rules();
if (retval) return retval;
}
@ -766,9 +795,6 @@ int VBOX_VM::register_vm_firewall_rules() {
string output;
string virtual_machine_slot_directory;
char buf[256];
struct sockaddr_in addr;
BOINC_SOCKLEN_T addrsize;
int sock;
int retval;
get_slot_directory(virtual_machine_slot_directory);
@ -779,45 +805,9 @@ int VBOX_VM::register_vm_firewall_rules() {
boinc_msg_prefix(buf, sizeof(buf))
);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(pf_desired_host_port);
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addrsize = sizeof(addr);
retval = boinc_socket(sock);
if(retval) return retval;
// Attempt to use the desired port number
//
retval = bind(sock, (struct sockaddr *)&addr, addrsize);
if(retval < 0)
{
// Okay the desired port number didn't work, to set the port number
// to 0 and try again. Let the OS choose a valid port number.
//
addr.sin_port = htons(0);
retval = bind(sock, (struct sockaddr *)&addr, addrsize);
if(retval < 0)
{
boinc_close_socket(sock);
return ERR_BIND;
}
}
// Okay we now have a valid port number, lets see what we have been
// assigned. Store it for future use.
//
getsockname(sock, (struct sockaddr *)&addr, &addrsize);
pf_assigned_host_port = addr.sin_port;
boinc_close_socket(sock);
// Add new firewall rule
//
sprintf(buf, "vboxwrapper,tcp,127.0.0.1,%d,,%d", pf_assigned_host_port, pf_desired_guest_port);
sprintf(buf, "vboxwrapper,tcp,127.0.0.1,%d,,%d", pf_host_port, pf_guest_port);
command = "modifyvm \"" + vm_name + "\" ";
command += "--natpf1 \"" + string(buf) + "\" ";
@ -827,7 +817,7 @@ int VBOX_VM::register_vm_firewall_rules() {
fprintf(
stderr,
"%s VM communication is allowed on port '%d'.\n",
boinc_msg_prefix(buf, sizeof(buf)), pf_assigned_host_port
boinc_msg_prefix(buf, sizeof(buf)), pf_host_port
);
@ -845,8 +835,8 @@ int VBOX_VM::register_vm_firewall_rules() {
" <guest_port>%d</guest_port>\n"
" </rule>\n"
"</vbox_firewall>\n",
pf_assigned_host_port,
pf_desired_guest_port
pf_host_port,
pf_guest_port
);
fclose(f);

View File

@ -66,9 +66,11 @@ struct VBOX_VM {
bool register_only;
// whether to allow network access at all
bool enable_network;
int pf_desired_host_port;
int pf_desired_guest_port;
int pf_assigned_host_port;
// the following for optional port forwarding
int pf_host_port;
// dynamically assigned
int pf_guest_port;
// specified in config file
int run();
int stop();
@ -95,6 +97,7 @@ struct VBOX_VM {
int get_vm_log(std::string& log);
int read_floppy(std::string& data);
int write_floppy(std::string& data);
int get_port_forwarding_port();
static int initialize();
static int get_install_directory(std::string& dir);

View File

@ -110,8 +110,7 @@ int parse_job_file(VBOX_VM& vm) {
else if (xp.parse_bool("enable_network", vm.enable_network)) continue;
else if (xp.parse_bool("enable_shared_directory", vm.enable_shared_directory)) continue;
else if (xp.parse_bool("enable_floppyio", vm.enable_floppyio)) continue;
else if (xp.parse_int("pf_desired_host_port", vm.pf_desired_host_port)) continue;
else if (xp.parse_int("pf_desired_guest_port", vm.pf_desired_guest_port)) continue;
else if (xp.parse_int("pf_guest_port", vm.pf_guest_port)) continue;
fprintf(stderr, "%s parse_job_file(): unexpected tag %s\n",
boinc_msg_prefix(buf, sizeof(buf)), xp.parsed_tag
);