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