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; } }