X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=cms%2Forg.argeo.slc.support%2Fsrc%2Forg%2Fargeo%2Fslc%2Flib%2Fvbox%2FVBoxManager.java;fp=cms%2Forg.argeo.slc.support%2Fsrc%2Forg%2Fargeo%2Fslc%2Flib%2Fvbox%2FVBoxManager.java;h=9992d77f58c6e29865dec91ac7aec0f520d36ccf;hb=ecc22e604e47533c79de9cecdcdeacbc752cbff1;hp=0000000000000000000000000000000000000000;hpb=e07ded4632e53f8b8869763bc1f1f4091361e76e;p=gpl%2Fargeo-slc.git diff --git a/cms/org.argeo.slc.support/src/org/argeo/slc/lib/vbox/VBoxManager.java b/cms/org.argeo.slc.support/src/org/argeo/slc/lib/vbox/VBoxManager.java new file mode 100644 index 000000000..9992d77f5 --- /dev/null +++ b/cms/org.argeo.slc.support/src/org/argeo/slc/lib/vbox/VBoxManager.java @@ -0,0 +1,148 @@ +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 nats = new ArrayList(); + + public void importOvf(Resource ovfDefinition) { + try { + List cmd = new ArrayList(); + cmd.add(executable); + cmd.add("import"); + cmd.add(ovfDefinition.getFile().getCanonicalPath()); + cmd.add("--vsys 0 --vmname "); + 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 cmd = new ArrayList(); + 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 createNatCommand(String id, String device, + String cfgKey, String value, StringBuffer script) { + List cmd = new ArrayList(); + 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 getNats() { + return nats; + } + + public void setNats(List boxNats) { + nats = boxNats; + } + + public void setVm(VBoxMachine vm) { + this.vm = vm; + } + +}