]> git.argeo.org Git - gpl/argeo-slc.git/blob - legacy/org.argeo.slc.support/src/org/argeo/slc/lib/vbox/VBoxManager.java
Massive Argeo APIs refactoring
[gpl/argeo-slc.git] / legacy / org.argeo.slc.support / src / org / argeo / slc / lib / vbox / VBoxManager.java
1 package org.argeo.slc.lib.vbox;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.argeo.api.cms.CmsLog;
8 import org.argeo.slc.SlcException;
9 import org.argeo.slc.core.execution.tasks.SystemCall;
10 import org.springframework.core.io.Resource;
11
12 public class VBoxManager {
13 private final static CmsLog log = CmsLog.getLog(VBoxManager.class);
14
15 private VBoxMachine vm;
16 private String executable = "VBoxManage";
17
18 private List<VBoxNat> nats = new ArrayList<VBoxNat>();
19
20 public void importOvf(Resource ovfDefinition) {
21 try {
22 List<Object> cmd = new ArrayList<Object>();
23 cmd.add(executable);
24 cmd.add("import");
25 cmd.add(ovfDefinition.getFile().getCanonicalPath());
26 cmd.add("--vsys 0 --vmname <name>");
27 cmd.add("0");
28 cmd.add("--vmname");
29 cmd.add(vm.getName());
30 new SystemCall(cmd).run();
31 } catch (IOException e) {
32 throw new SlcException("Cannot import OVF appliance "
33 + ovfDefinition, e);
34 }
35 }
36
37 public void startVm() {
38 startVm("gui");
39 }
40
41 public void startVmHeadless() {
42 startVm("vrdp");
43 }
44
45 public void startVm(String type) {
46 List<Object> cmd = new ArrayList<Object>();
47 cmd.add(executable);
48 cmd.add("startvm");
49 cmd.add(vm.getName());
50 cmd.add("--type");
51 cmd.add(type);
52 new SystemCall(cmd).run();
53 }
54
55 public void applyNats() {
56 StringBuffer script = new StringBuffer("");
57 for (VBoxNat vBoxNat : nats) {
58 for (String id : vBoxNat.getMappings().keySet()) {
59 VBoxPortMapping mapping = vBoxNat.getMappings().get(id);
60
61 // Try to delete rule first
62 try {
63 StringBuffer delCmd = new StringBuffer(
64 "VBoxManage modifyvm");
65 delCmd.append(" \"").append(vm.getName()).append("\"");
66 delCmd.append(" --natpf").append(vBoxNat.getDevice())
67 .append(" ");
68 delCmd.append(" delete ");
69 delCmd.append("\"").append(id).append("\"");
70 new SystemCall(delCmd.toString()).run();
71 script.append(delCmd).append("\n");
72 } catch (Exception e) {
73 // silent
74 }
75
76 StringBuffer cmd = new StringBuffer("VBoxManage modifyvm");
77 cmd.append(" \"").append(vm.getName()).append("\"");
78 cmd.append(" --natpf").append(vBoxNat.getDevice()).append(" ");
79 cmd.append("\"");
80 cmd.append(id).append(",");
81 cmd.append(mapping.getProtocol()).append(",");
82 cmd.append(",");
83 cmd.append(mapping.getHostPort()).append(",");
84 cmd.append(vBoxNat.getGuestIp()).append(",");
85 cmd.append(mapping.getGuestPort());
86 cmd.append("\"");
87
88 new SystemCall(cmd.toString()).run();
89 script.append(cmd).append("\n");
90
91 // Older VirtualBox
92 // new SystemCall(createNatCommand(id, vBoxNat.getDevice(),
93 // "Protocol", mapping.getProtocol(), script)).run();
94 // script.append('\n');
95 // new SystemCall(createNatCommand(id, vBoxNat.getDevice(),
96 // "GuestPort", mapping.getGuest(), script)).run();
97 // script.append('\n');
98 // new SystemCall(createNatCommand(id, vBoxNat.getDevice(),
99 // "HostPort", mapping.getHost(), script)).run();
100 // script.append('\n');
101 // script.append('\n');
102 }
103 script.append('\n');
104 }
105
106 if (log.isDebugEnabled())
107 log.debug("Port setting script:\n" + script);
108 }
109
110 protected List<Object> createNatCommand(String id, String device,
111 String cfgKey, String value, StringBuffer script) {
112 List<Object> cmd = new ArrayList<Object>();
113 cmd.add(executable);
114 cmd.add("setextradata");
115 cmd.add(vm.getName());
116 cmd.add("VBoxInternal/Devices/" + device + "/0/LUN#0/Config/" + id
117 + "/" + cfgKey);
118 cmd.add(value);
119
120 for (Object arg : cmd) {
121 script.append(arg).append(' ');
122 }
123
124 return cmd;
125 }
126
127 public String getExecutable() {
128 return executable;
129 }
130
131 public void setExecutable(String executable) {
132 this.executable = executable;
133 }
134
135 public List<VBoxNat> getNats() {
136 return nats;
137 }
138
139 public void setNats(List<VBoxNat> boxNats) {
140 nats = boxNats;
141 }
142
143 public void setVm(VBoxMachine vm) {
144 this.vm = vm;
145 }
146
147 }