--- /dev/null
+package org.argeo.slc.lib.vbox;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.core.execution.tasks.SystemCall;
+import org.springframework.core.io.Resource;
+
+public class VBoxManager {
+ private final static Log log = LogFactory.getLog(VBoxManager.class);
+
+ private VBoxMachine vm;
+ private String executable = "VBoxManage";
+
+ private List<VBoxNat> nats = new ArrayList<VBoxNat>();
+
+ public void importOvf(Resource ovfDefinition) {
+ try {
+ List<Object> cmd = new ArrayList<Object>();
+ cmd.add(executable);
+ cmd.add("import");
+ cmd.add(ovfDefinition.getFile().getCanonicalPath());
+ cmd.add("--vsys 0 --vmname <name>");
+ cmd.add("0");
+ cmd.add("--vmname");
+ cmd.add(vm.getName());
+ new SystemCall(cmd).run();
+ } catch (IOException e) {
+ throw new SlcException("Cannot import OVF appliance "
+ + ovfDefinition, e);
+ }
+ }
+
+ public void startVm() {
+ startVm("gui");
+ }
+
+ public void startVmHeadless() {
+ startVm("vrdp");
+ }
+
+ public void startVm(String type) {
+ List<Object> cmd = new ArrayList<Object>();
+ cmd.add(executable);
+ cmd.add("startvm");
+ cmd.add(vm.getName());
+ cmd.add("--type");
+ cmd.add(type);
+ new SystemCall(cmd).run();
+ }
+
+ public void applyNats() {
+ StringBuffer script = new StringBuffer("");
+ for (VBoxNat vBoxNat : nats) {
+ for (String id : vBoxNat.getMappings().keySet()) {
+ VBoxPortMapping mapping = vBoxNat.getMappings().get(id);
+
+ // Try to delete rule first
+ try {
+ StringBuffer delCmd = new StringBuffer(
+ "VBoxManage modifyvm");
+ delCmd.append(" \"").append(vm.getName()).append("\"");
+ delCmd.append(" --natpf").append(vBoxNat.getDevice())
+ .append(" ");
+ delCmd.append(" delete ");
+ delCmd.append("\"").append(id).append("\"");
+ new SystemCall(delCmd.toString()).run();
+ script.append(delCmd).append("\n");
+ } catch (Exception e) {
+ // silent
+ }
+
+ StringBuffer cmd = new StringBuffer("VBoxManage modifyvm");
+ cmd.append(" \"").append(vm.getName()).append("\"");
+ cmd.append(" --natpf").append(vBoxNat.getDevice()).append(" ");
+ cmd.append("\"");
+ cmd.append(id).append(",");
+ cmd.append(mapping.getProtocol()).append(",");
+ cmd.append(",");
+ cmd.append(mapping.getHostPort()).append(",");
+ cmd.append(vBoxNat.getGuestIp()).append(",");
+ cmd.append(mapping.getGuestPort());
+ cmd.append("\"");
+
+ new SystemCall(cmd.toString()).run();
+ script.append(cmd).append("\n");
+
+ // Older VirtualBox
+ // new SystemCall(createNatCommand(id, vBoxNat.getDevice(),
+ // "Protocol", mapping.getProtocol(), script)).run();
+ // script.append('\n');
+ // new SystemCall(createNatCommand(id, vBoxNat.getDevice(),
+ // "GuestPort", mapping.getGuest(), script)).run();
+ // script.append('\n');
+ // new SystemCall(createNatCommand(id, vBoxNat.getDevice(),
+ // "HostPort", mapping.getHost(), script)).run();
+ // script.append('\n');
+ // script.append('\n');
+ }
+ script.append('\n');
+ }
+
+ if (log.isDebugEnabled())
+ log.debug("Port setting script:\n" + script);
+ }
+
+ protected List<Object> createNatCommand(String id, String device,
+ String cfgKey, String value, StringBuffer script) {
+ List<Object> cmd = new ArrayList<Object>();
+ cmd.add(executable);
+ cmd.add("setextradata");
+ cmd.add(vm.getName());
+ cmd.add("VBoxInternal/Devices/" + device + "/0/LUN#0/Config/" + id
+ + "/" + cfgKey);
+ cmd.add(value);
+
+ for (Object arg : cmd) {
+ script.append(arg).append(' ');
+ }
+
+ return cmd;
+ }
+
+ public String getExecutable() {
+ return executable;
+ }
+
+ public void setExecutable(String executable) {
+ this.executable = executable;
+ }
+
+ public List<VBoxNat> getNats() {
+ return nats;
+ }
+
+ public void setNats(List<VBoxNat> boxNats) {
+ nats = boxNats;
+ }
+
+ public void setVm(VBoxMachine vm) {
+ this.vm = vm;
+ }
+
+}