VBoxPortForwarding.py revision f52596ee352b88100d0a2abd044c8edd3c542bd7
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#!/usr/bin/python
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync"""
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncCopyright (C) 2009-2012 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsyncavailable from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncGeneral Public License (GPL) as published by the Free Software
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync"""
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync#################################################################################
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync# This program is a port-forwarding configurator supposed to simplify
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync# port-forwarding for NAT users
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync# > python VBoxPortForwarding.py --vm winXP -a 1 -p TCP -l 8080 -g 80 -P www
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync# generates sequence of API calls, equivalent to:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# > VBoxManage setextradata "winXP"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# "VBoxInternal/Devices/pcnet/0/LUN#0/Config/www/Protocol" TCP
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# > VBoxManage setextradata "winXP"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# "VBoxInternal/Devices/pcnet/0/LUN#0/Config/www/GuestPort" 80
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# > VBoxManage setextradata "winXP"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# "VBoxInternal/Devices/pcnet/0/LUN#0/Config/www/HostPort" 8080
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync################################################################################
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncimport os,sys
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncfrom vboxapi import VirtualBoxManager
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncimport optparse
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncclass OptionParser (optparse.OptionParser):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync def check_required(self, opt):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync option = self.get_option(opt)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if option.type == "string" and getattr(self.values, option.dest) != None:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return True
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if option.type == "int" and getattr(self.values, option.dest) != -1:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return True
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return False
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncdef generate_profile_name(proto, host_port, guest_port):
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync return proto + '_' + str(host_port) + '_' + str(guest_port)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncdef main(argv):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync usage = "usage: %prog --vm winXP -a 1 -p TCP -l 8080 -g 80 -P www"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser = OptionParser(usage=usage)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.add_option("-V", "--vm", action="store", dest="vmname", type="string",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync help="Name or UID of VM to operate on", default=None)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.add_option("-P", "--profile", dest="profile", type="string",
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync default=None)
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync parser.add_option("-p", "--ip-proto", dest="proto", type="string",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default=None)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.add_option("-l", "--host-port", dest="host_port", type="int",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default = -1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.add_option("-g", "--guest-port", dest="guest_port", type="int",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default = -1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.add_option("-a", "--adapter", dest="adapter", type="int",
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync default=-1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync (options,args) = parser.parse_args(argv)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (not (parser.check_required("-V") or parser.check_required("-G"))):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.error("please define --vm or --guid option")
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (not parser.check_required("-p")):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.error("please define -p or --ip-proto option")
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (not parser.check_required("-l")):
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync parser.error("please define -l or --host_port option")
2daaccf68be3773aee600c5c3e48bcf5401418a6vboxsync if (not parser.check_required("-g")):
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync parser.error("please define -g or --guest_port option")
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (not parser.check_required("-a")):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync parser.error("please define -a or --adapter option")
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync man = VirtualBoxManager(None, None)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vb = man.getVirtualBox()
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print "VirtualBox version: %s" % vb.version,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print "r%s" % vb.revision
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vm = None
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if options.vmname != None:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vm = vb.findMachine(options.vmname)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync elif options.vmname != None:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vm = vb.getMachine(options.vmname)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync except:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print "can't find VM by name or UID:",options.vmname
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync del man
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print "vm found: %s [%s]" % (vm.name, vm.id)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync session = man.openMachineSession(vm.id)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vm = session.machine
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync adapter = vm.getNetworkAdapter(options.adapter)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if adapter.enabled == False:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print "adapter(%d) is disabled" % adapter.slot
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync del man
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync name = None
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (adapter.adapterType == man.constants.NetworkAdapterType_Null):
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync print "none adapter type detected"
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync return -1
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync elif (adapter.adapterType == man.constants.NetworkAdapterType_Am79C970A):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync name = "pcnet"
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync elif (adapter.adapterType == man.constants.NetworkAdapterType_Am79C973):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync name = "pcnet"
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync elif (adapter.adapterType == man.constants.NetworkAdapterType_I82540EM):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync name = "e1000"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync elif (adapter.adapterType == man.constants.NetworkAdapterType_I82545EM):
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync name = "e1000"
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync elif (adapter.adapterType == man.constants.NetworkAdapterType_I82543GC):
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync name = "e1000"
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync print "adapter of '%s' type has been detected" % name
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync profile_name = options.profile
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if profile_name == None:
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync profile_name = generate_profile_name(options.proto.upper(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync options.host_port,
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync options.guest_port)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync config = "VBoxInternal/Devices/" + name + "/"
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync config = config + str(adapter.slot) +"/LUN#0/Config/" + profile_name
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync proto = config + "/Protocol"
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync host_port = config + "/HostPort"
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync guest_port = config + "/GuestPort"
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync vm.setExtraData(proto, options.proto.upper())
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync vm.setExtraData(host_port, str(options.host_port))
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync vm.setExtraData(guest_port, str(options.guest_port))
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vm.saveSettings()
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync man.closeMachineSession(session)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync del man
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncif __name__ == "__main__":
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync main(sys.argv)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync