package jfqemu;
/**
* Created : July 8, 2012
*
* @author pquiring
*/
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.io.*;
import java.util.*;
import javaforce.*;
public class NetworkDialog extends javax.swing.JDialog {
/**
* Creates new form NetworkDialog
*/
public NetworkDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
setPosition();
listIFs();
listBRs();
listTAPs();
}
/**
* 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() {
jLabel1 = new javax.swing.JLabel();
jPanel1 = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
tapID = new javax.swing.JTextField();
jLabel4 = new javax.swing.JLabel();
tapBridge = new javax.swing.JComboBox();
createTAP = new javax.swing.JButton();
close = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
brID = new javax.swing.JTextField();
createBridge = new javax.swing.JButton();
jLabel5 = new javax.swing.JLabel();
ifName = new javax.swing.JComboBox();
jPanel3 = new javax.swing.JPanel();
tapSelect = new javax.swing.JComboBox();
deleteTAP = new javax.swing.JButton();
jPanel4 = new javax.swing.JPanel();
bridgeSelect = new javax.swing.JComboBox();
deleteBridge = new javax.swing.JButton();
help = new javax.swing.JButton();
netmgr = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Bridge/TAP Config");
setResizable(false);
jLabel1.setText("From here you can create TAPs (virtual NIC) and bridge them to real NICs.");
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Create TAP"));
jLabel3.setText("ID #");
tapID.setText("0");
jLabel4.setText("Add to Bridge");
createTAP.setText("Create");
createTAP.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
createTAPActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tapID, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tapBridge, javax.swing.GroupLayout.PREFERRED_SIZE, 99, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(createTAP)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(tapID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel4)
.addComponent(tapBridge, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(createTAP))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
close.setText("Close");
close.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
closeActionPerformed(evt);
}
});
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Create Bridge"));
jLabel2.setText("ID #");
brID.setText("0");
createBridge.setText("Create");
createBridge.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
createBridgeActionPerformed(evt);
}
});
jLabel5.setText("Bind to Interface");
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(brID, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ifName, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(createBridge)
.addContainerGap())
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(brID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(createBridge)
.addComponent(jLabel5)
.addComponent(ifName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Delete TAP"));
tapSelect.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
deleteTAP.setText("Delete");
deleteTAP.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteTAPActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(tapSelect, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(deleteTAP)
.addContainerGap())
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(tapSelect, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(deleteTAP))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Delete Bridge"));
bridgeSelect.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
deleteBridge.setText("Delete");
deleteBridge.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteBridgeActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
jPanel4.setLayout(jPanel4Layout);
jPanel4Layout.setHorizontalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup()
.addContainerGap()
.addComponent(bridgeSelect, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(deleteBridge)
.addContainerGap())
);
jPanel4Layout.setVerticalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(bridgeSelect, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(deleteBridge))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
help.setText("Help");
help.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
helpActionPerformed(evt);
}
});
netmgr.setText("Network Manager");
netmgr.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
netmgrActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(netmgr)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(help)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(close))
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addGap(18, 18, 18)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(23, 23, 23)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(close)
.addComponent(help)
.addComponent(netmgr))
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void createBridgeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createBridgeActionPerformed
createBridge();
}//GEN-LAST:event_createBridgeActionPerformed
private void createTAPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createTAPActionPerformed
createTAP();
}//GEN-LAST:event_createTAPActionPerformed
private void deleteTAPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteTAPActionPerformed
deleteTAP();
}//GEN-LAST:event_deleteTAPActionPerformed
private void deleteBridgeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteBridgeActionPerformed
deleteBridge();
}//GEN-LAST:event_deleteBridgeActionPerformed
private void closeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeActionPerformed
dispose();
}//GEN-LAST:event_closeActionPerformed
private void helpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpActionPerformed
try {
Runtime.getRuntime().exec(new String[] {"jhelp", "jfqemu"});
} catch (Exception e) {}
}//GEN-LAST:event_helpActionPerformed
private void netmgrActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_netmgrActionPerformed
try {
Runtime.getRuntime().exec(new String[] {"jconfig", "interfaces"});
} catch (Exception e) {}
}//GEN-LAST:event_netmgrActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTextField brID;
private javax.swing.JComboBox bridgeSelect;
private javax.swing.JButton close;
private javax.swing.JButton createBridge;
private javax.swing.JButton createTAP;
private javax.swing.JButton deleteBridge;
private javax.swing.JButton deleteTAP;
private javax.swing.JButton help;
private javax.swing.JComboBox ifName;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JButton netmgr;
private javax.swing.JComboBox tapBridge;
private javax.swing.JTextField tapID;
private javax.swing.JComboBox tapSelect;
// End of variables declaration//GEN-END:variables
private void listIFs() {
ifName.removeAllItems();
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"ifconfig", "-a"}, false);
String lns[] = output.split("\n");
for(int a=0;a<lns.length;a++) {
if (!lns[a].startsWith(" ")) {
int idx = lns[a].indexOf(" ");
if (idx == -1) continue;
String name = lns[a].substring(0,idx);
if (name.startsWith("br")) continue;
if (name.startsWith("tap")) continue;
if (name.equals("lo")) continue;
ifName.addItem(name);
}
}
}
private void listBRs() {
tapBridge.removeAllItems();
bridgeSelect.removeAllItems();
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"ifconfig", "-a"}, false);
String lns[] = output.split("\n");
for(int a=0;a<lns.length;a++) {
if (!lns[a].startsWith(" ")) {
int idx = lns[a].indexOf(" ");
if (idx == -1) continue;
String name = lns[a].substring(0,idx);
if (!name.startsWith("br")) continue;
tapBridge.addItem(name);
bridgeSelect.addItem(name);
}
}
}
private void listTAPs() {
tapSelect.removeAllItems();
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"ifconfig", "-a"}, false);
String lns[] = output.split("\n");
for(int a=0;a<lns.length;a++) {
if (!lns[a].startsWith(" ")) {
int idx = lns[a].indexOf(" ");
if (idx == -1) continue;
String name = lns[a].substring(0,idx);
if (!name.startsWith("tap")) continue;
tapSelect.addItem(name);
}
}
}
private void createBridge() {
String iface = (String)ifName.getSelectedItem();
if (iface == null) return;
//create a script to do this
try {
int id = Integer.valueOf(brID.getText());
File file = File.createTempFile("netcfg", ".sh", new File("/tmp"));
FileOutputStream fos = new FileOutputStream(file);
fos.write("#!/bin/bash\n".getBytes());
fos.write(("ifconfig " + iface + " 0.0.0.0 down\n").getBytes());
fos.write(("brctl addbr br" + id + "\n").getBytes());
fos.write(("brctl addif br" + id + " " + iface + "\n").getBytes());
fos.close();
file.setExecutable(true);
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"sudo", file.getAbsolutePath()}, true);
file.delete();
JF.showMessage("Notice", "Bridge added, please goto Network Manager and config/enable the bridge adapter");
} catch (Exception e) {
JF.showError("Error", "Exception : " + e);
JFLog.log(e);
}
listBRs();
}
private void createTAP() {
String bridge = (String)tapBridge.getSelectedItem();
if (bridge == null) return;
//create a script to do this
try {
int id = Integer.valueOf(tapID.getText());
File file = File.createTempFile("netcfg", ".sh", new File("/tmp"));
FileOutputStream fos = new FileOutputStream(file);
fos.write("#!/bin/bash\n".getBytes());
fos.write(("ip tuntap add dev tap" + id + " mode tap\n").getBytes());
fos.write(("brctl addif " + bridge + " tap" + id + "\n").getBytes());
fos.close();
file.setExecutable(true);
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"sudo", file.getAbsolutePath()}, true);
file.delete();
JF.showMessage("Notice", "TAP added, please goto Network Manager and config/enable the TAP adapter");
} catch (Exception e) {
JF.showError("Error", "Exception : " + e);
JFLog.log(e);
}
listTAPs();
}
private void deleteBridge() {
String bridge = (String)bridgeSelect.getSelectedItem();
if (bridge == null) return;
//create a script to do this
try {
File file = File.createTempFile("netcfg", ".sh", new File("/tmp"));
FileOutputStream fos = new FileOutputStream(file);
fos.write("#!/bin/bash\n".getBytes());
fos.write(("ifconfig " + bridge + " 0.0.0.0 down\n").getBytes());
fos.write(("brctl delbr " + bridge + "\n").getBytes());
fos.close();
file.setExecutable(true);
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"sudo", file.getAbsolutePath()}, true);
file.delete();
JF.showMessage("Notice", "Bridge deleted!");
} catch (Exception e) {
JF.showError("Error", "Exception : " + e);
JFLog.log(e);
}
listBRs();
}
private void deleteTAP() {
String tap = (String)tapSelect.getSelectedItem();
if (tap == null) return;
//create a script to do this
try {
File file = File.createTempFile("netcfg", ".sh", new File("/tmp"));
FileOutputStream fos = new FileOutputStream(file);
fos.write("#!/bin/bash\n".getBytes());
fos.write(("ifconfig " + tap + " 0.0.0.0 down\n").getBytes());
fos.write(("ip tuntap del dev " + tap + " mode tap\n").getBytes());
fos.close();
file.setExecutable(true);
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"sudo", file.getAbsolutePath()}, true);
// file.delete();
JF.showMessage("Notice", "TAP deleted!");
} catch (Exception e) {
JF.showError("Error", "Exception : " + e);
JFLog.log(e);
}
listTAPs();
}
private void setPosition() {
Dimension d = getSize();
Rectangle s = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
setLocation(s.width/2 - d.width/2, s.height/2 - d.height/2);
}
}