package jfqemu;
/**
* Created : Mar 19 ,2012
*
* @author pquiring
*/
import java.io.*;
import java.util.*;
import java.net.*;
import javax.swing.*;
import javaforce.*;
import javaforce.jbus.*;
public class MainPanel extends javax.swing.JPanel {
/**
* Creates new form MainPanel
*/
public MainPanel(JFrame frame) {
initComponents();
JFLog.init(JF.getUserPath() + "/.jfqemu.log", true);
this.frame = frame;
listVMs();
if (JF.isJFLinux()) {
jbusClient = new JBusClient("org.jflinux.jfqemu.Client" + Math.abs(new Random().nextInt()), new JBusMethods());
jbusClient.start();
} else {
jflinuxOnly.setVisible(false);
}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
vmlist = new javax.swing.JList();
newVM = new javax.swing.JButton();
startVM = new javax.swing.JButton();
editVM = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
name = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
os = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
state = new javax.swing.JTextField();
jflinuxOnly = new javax.swing.JPanel();
nicConfig = new javax.swing.JButton();
startVMservice = new javax.swing.JButton();
connectVMservice = new javax.swing.JButton();
vmlist.setFont(new java.awt.Font("Ubuntu", 0, 24)); // NOI18N
vmlist.setModel(vmlistModel);
vmlist.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
vmlistValueChanged(evt);
}
});
jScrollPane1.setViewportView(vmlist);
newVM.setText("Create New Virtual Machine");
newVM.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
newVMActionPerformed(evt);
}
});
startVM.setText("Start Virtual Machine");
startVM.setEnabled(false);
startVM.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
startVMActionPerformed(evt);
}
});
editVM.setText("Edit Virtual Machine");
editVM.setEnabled(false);
editVM.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editVMActionPerformed(evt);
}
});
jLabel1.setText("Name:");
name.setEditable(false);
jLabel2.setText("OS:");
os.setEditable(false);
jLabel3.setText("State:");
state.setEditable(false);
nicConfig.setText("Configure Network Devices");
nicConfig.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
nicConfigActionPerformed(evt);
}
});
startVMservice.setText("Start VM as a Service");
startVMservice.setEnabled(false);
startVMservice.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
startVMserviceActionPerformed(evt);
}
});
connectVMservice.setText("Connect to VM running as a Service");
connectVMservice.setEnabled(false);
connectVMservice.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
connectVMserviceActionPerformed(evt);
}
});
javax.swing.GroupLayout jflinuxOnlyLayout = new javax.swing.GroupLayout(jflinuxOnly);
jflinuxOnly.setLayout(jflinuxOnlyLayout);
jflinuxOnlyLayout.setHorizontalGroup(
jflinuxOnlyLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jflinuxOnlyLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jflinuxOnlyLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(nicConfig, javax.swing.GroupLayout.DEFAULT_SIZE, 348, Short.MAX_VALUE)
.addComponent(startVMservice, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(connectVMservice, javax.swing.GroupLayout.DEFAULT_SIZE, 348, Short.MAX_VALUE))
.addContainerGap())
);
jflinuxOnlyLayout.setVerticalGroup(
jflinuxOnlyLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jflinuxOnlyLayout.createSequentialGroup()
.addContainerGap()
.addComponent(nicConfig)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(startVMservice)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(connectVMservice)
.addContainerGap())
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(newVM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(startVM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(editVM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(state)
.addComponent(name)
.addComponent(os)))
.addComponent(jflinuxOnly, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(newVM)
.addGap(49, 49, 49)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(name, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(os, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(state, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(startVM)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(editVM)
.addGap(18, 18, 18)
.addComponent(jflinuxOnly, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void vmlistValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_vmlistValueChanged
int idx = vmlist.getSelectedIndex();
if (idx == -1) {
name.setText("");
os.setText("");
return;
}
loadVM(idx);
}//GEN-LAST:event_vmlistValueChanged
private void newVMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newVMActionPerformed
newVM();
}//GEN-LAST:event_newVMActionPerformed
private void editVMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editVMActionPerformed
int idx = vmlist.getSelectedIndex();
if (idx == -1) return;
editVM(idx);
}//GEN-LAST:event_editVMActionPerformed
private void startVMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startVMActionPerformed
int idx = vmlist.getSelectedIndex();
if (idx == -1) return;
startVM(idx);
}//GEN-LAST:event_startVMActionPerformed
private void startVMserviceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startVMserviceActionPerformed
int idx = vmlist.getSelectedIndex();
if (idx == -1) return;
VM vm = vms.get(idx);
String vmXML = vm.folder + "/jfqemu.xml";
startVMasService(vmXML);
}//GEN-LAST:event_startVMserviceActionPerformed
private void connectVMserviceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectVMserviceActionPerformed
int idx = vmlist.getSelectedIndex();
if (idx == -1) return;
connectVMasService(idx);
}//GEN-LAST:event_connectVMserviceActionPerformed
private void nicConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nicConfigActionPerformed
NetworkDialog dialog = new NetworkDialog(null, true);
dialog.setVisible(true);
}//GEN-LAST:event_nicConfigActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton connectVMservice;
private javax.swing.JButton editVM;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPanel jflinuxOnly;
private javax.swing.JTextField name;
private javax.swing.JButton newVM;
private javax.swing.JButton nicConfig;
private javax.swing.JTextField os;
private javax.swing.JButton startVM;
private javax.swing.JButton startVMservice;
private javax.swing.JTextField state;
private javax.swing.JList vmlist;
// End of variables declaration//GEN-END:variables
public static ArrayList<VM> vms = new ArrayList<VM>();
private DefaultListModel vmlistModel = new DefaultListModel();
private ArrayList<File> vmfiles = new ArrayList<File>();
private JFrame frame;
private JBusClient jbusClient;
private void listVM(File file) throws Exception {
XML xml = new XML();
FileInputStream fis = new FileInputStream(file);
xml.read(fis);
fis.close();
VM vm = new VM();
xml.writeClass(vm);
vmlistModel.addElement(vm.name);
vms.add(vm);
vmfiles.add(file);
}
private void listVMs() {
clearVM();
vmlistModel.clear();
vms.clear();
vmfiles.clear();
try {
File myVMs = new File(JF.getUserPath() + "/jfqemu/");
myVMs.mkdirs();
File folders[] = myVMs.listFiles();
for(int a=0;a<folders.length;a++) {
if (!folders[a].exists()) return;
if (!folders[a].isDirectory()) return;
File xml = new File(folders[a].getAbsolutePath() + "/jfqemu.xml");
if (xml.exists()) listVM(xml);
}
} catch (Exception e) {
JFLog.log(e);
}
}
private boolean isServiceActive(int id) {
//just check if qemu is listening on the port
try {
Socket s = new Socket("127.0.0.1", 5900 + id);
s.close();
return true;
} catch (Exception e) {
return false;
}
}
private void clearVM() {
name.setText("");
os.setText("");
state.setText("");
startVM.setEnabled(false);
editVM.setEnabled(false);
startVMservice.setEnabled(false);
connectVMservice.setEnabled(false);
}
private void loadVM(int idx) {
VM vm = vms.get(idx);
clearVM();
name.setText(vm.name);
os.setText(vm.os);
startVM.setEnabled(true);
editVM.setEnabled(true);
if (vm.serviceID != -1) {
if (isServiceActive(vm.serviceID)) {
editVM.setEnabled(false);
startVM.setEnabled(false);
startVMservice.setEnabled(false);
connectVMservice.setEnabled(true);
state.setText("Active");
} else {
startVMservice.setEnabled(true);
state.setText("Not Active");
}
}
}
private void newVM() {
VMDialog dialog = new VMDialog(null, true, null);
dialog.setVisible(true);
if (!dialog.accepted) return;
VM vm = new VM();
dialog.getValues(vm);
try {
File vmPath = new File(vm.folder);
vmPath.mkdirs();
File vmXML = new File(vm.folder + "/jfqemu.xml");
FileOutputStream fos = new FileOutputStream(vmXML);
XML xml = new XML();
xml.readClass("vm", vm);
xml.write(fos);
fos.close();
if (vm.serviceID != -1) {
addVMasService(vmXML.getAbsolutePath());
}
} catch (Exception e) {
JFLog.log(e);
JF.showError("Error", "Failed to create VM");
}
listVMs();
}
private void editVM(int idx) {
VM vm = vms.get(idx);
int oldServiceID = vm.serviceID;
VMDialog dialog = new VMDialog(null, true, vm);
dialog.setVisible(true);
if (!dialog.accepted) return;
dialog.getValues(vm);
try {
File vmXML = new File(vm.folder + "/jfqemu.xml");
FileOutputStream fos = new FileOutputStream(vmXML);
XML xml = new XML();
xml.readClass("vm", vm);
xml.write(fos);
fos.close();
if (oldServiceID != vm.serviceID) {
//serviceID is changing
removeVMasService(vmXML.getAbsolutePath());
if (vm.serviceID != -1) {
addVMasService(vmXML.getAbsolutePath());
}
}
} catch (Exception e) {
JFLog.log(e);
JF.showError("Error", "Failed to edit VM");
}
listVMs();
}
private void startVM(int idx) {
String cmd[] = vms.get(idx).getCMD(false);
for(int a=0;a<cmd.length;a++) {
System.out.print(cmd[a] + " ");
}
System.out.println("");
try {
Process p = Runtime.getRuntime().exec(cmd);
System.exit(0);
} catch (Exception e) {
JFLog.log(e);
JF.showError("Error", "Failed to start VM");
}
}
private void addVMasService(String xml) {
try {
jbusClient.call("org.jflinux.service.jfqemu", "addVM", "\"" + xml + "\"");
} catch (Exception e) {
JFLog.log(e);
}
}
private void removeVMasService(String xml) {
try {
jbusClient.call("org.jflinux.service.jfqemu", "removeVM", "\"" + xml + "\"");
} catch (Exception e) {
JFLog.log(e);
}
}
private void startVMasService(String xml) {
try {
jbusClient.call("org.jflinux.service.jfqemu", "startVM", "\"" + xml + "\"");
} catch (Exception e) {
JFLog.log(e);
}
}
private void connectVMasService(int idx) {
VM vm = vms.get(idx);
//use a java-based vnc client of course
String cmd[] = {"jvnc", "127.0.0.1:" + vm.serviceID};
try {
Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
JFLog.log(e);
JF.showError("Error", "Failed to start as service");
}
}
public class JBusMethods {
}
}