package jfconfig; /** * Created : Apr 3, 2012 * * @author pquiring */ import java.io.*; import java.util.*; import javax.swing.*; import javaforce.*; import javaforce.linux.*; public class InterfacePanel extends javax.swing.JPanel { /** * Creates new form InterfacePanel */ public InterfacePanel() { initComponents(); listIFs(); loadConfig(); } /** * 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(); jToolBar1 = new javax.swing.JToolBar(); back = new javax.swing.JButton(); edit = new javax.swing.JButton(); enable = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); list = new javax.swing.JList(); status = new javax.swing.JLabel(); jLabel1.setText("jLabel1"); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); back.setText("< Back"); back.setFocusable(false); back.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); back.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); back.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { backActionPerformed(evt); } }); jToolBar1.add(back); edit.setText("Edit"); edit.setEnabled(false); edit.setFocusable(false); edit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); edit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); edit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editActionPerformed(evt); } }); jToolBar1.add(edit); enable.setText("Enable"); enable.setEnabled(false); enable.setFocusable(false); enable.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); enable.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); enable.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { enableActionPerformed(evt); } }); jToolBar1.add(enable); list.setModel(model); list.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { listValueChanged(evt); } }); jScrollPane1.setViewportView(list); status.setText("Status : n/a"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE) .addComponent(status, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(status) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void backActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backActionPerformed ConfigApp.setPanel(new NetworkPanel()); }//GEN-LAST:event_backActionPerformed private void enableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enableActionPerformed toggleIF(); }//GEN-LAST:event_enableActionPerformed private void editActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editActionPerformed String eth = (String)list.getSelectedValue(); if (eth == null) return; Interface iface = getInterface(eth); InterfaceEditDialog dialog = new InterfaceEditDialog(ConfigApp.This, true, iface); dialog.setVisible(true); if (dialog.accepted) saveConfig(); }//GEN-LAST:event_editActionPerformed private void listValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_listValueChanged isInterfaceActive(); }//GEN-LAST:event_listValueChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton back; private javax.swing.JButton edit; private javax.swing.JButton enable; private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JList list; private javax.swing.JLabel status; // End of variables declaration//GEN-END:variables private DefaultListModel model = new DefaultListModel(); private boolean active; public static class Interface { public String dev; public boolean dhcp4 = true, dhcp6 = false; public boolean disableIP6 = true; public String ip4, mask4, gateway4; public String ip6, gateway6; } public static class Config { public Interface iface[]; public String dns1, dns2, dns3; public String hostname, domain; } private Config config; private String configFolder = "/etc/jconfig.d/"; private String configFile = "network.xml"; private void loadConfig() { defaultConfig(); try { XML xml = new XML(); FileInputStream fis = new FileInputStream(configFolder + configFile); xml.read(fis); xml.writeClass(config); } catch (FileNotFoundException e1) { defaultConfig(); } catch (Exception e2) { JFLog.log(e2); defaultConfig(); } } private void defaultConfig() { config = new Config(); config.iface = new Interface[0]; config.hostname = "localhost"; config.domain = "localdomain"; config.dns1 = ""; config.dns2 = ""; config.dns3 = ""; } private void saveConfig() { try { XML xml = new XML(); File tmpFile = File.createTempFile("network", ".xml"); FileOutputStream fos = new FileOutputStream(tmpFile); xml.readClass("network", config); xml.write(fos); fos.close(); Linux.mkdir(configFolder); if (!Linux.copyFile(tmpFile.getAbsolutePath(), configFolder + configFile)) { tmpFile.delete(); throw new Exception("file io error"); } tmpFile.delete(); } catch (Exception e) { JFLog.log(e); } } private Interface getInterface(String dev) { for(int a=0;a<config.iface.length;a++) { if (config.iface[a].dev.equals(dev)) return config.iface[a]; } Interface iface = new Interface(); iface.dev = dev; config.iface = Arrays.copyOf(config.iface, config.iface.length + 1); config.iface[config.iface.length-1] = iface; return iface; } private void listIFs() { model.clear(); 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 ifName = lns[a].substring(0,idx); if (ifName.endsWith(":")) ifName = ifName.substring(0, ifName.length()-1); model.addElement(ifName); } } } private void isInterfaceActive() { String eth = (String)list.getSelectedValue(); if (eth == null) { enable.setText("Enable"); enable.setEnabled(false); edit.setEnabled(false); status.setText("Status : n/a"); return; } ShellProcess sp = new ShellProcess(); String output = sp.run(new String[] {"ifconfig"}, false); String lns[] = output.split("\n"); active = false; for(int a=0;a<lns.length;a++) { if (lns[a].startsWith(eth)) { active = true; } } enable.setText( (active ? "Disable" : "Enable")); enable.setEnabled(true); edit.setEnabled(true); status.setText( (active ? "Active" : "Inactive")); } private void toggleIF() { String eth = (String)list.getSelectedValue(); if (eth == null) return; if (false) { //exec : sudo ifconfig [eth?] up/down ShellProcess sp = new ShellProcess(); String output = sp.run(new String[] {"sudo", "ifconfig", eth, (active ? "down" : "up")}, false); } else { //use jnetworkmgr instead ConfigApp.jbusClient.call("org.jflinux.jnetworkmgr", (active ? "ifDown" : "ifUp"), '\"' + eth + '\"'); JF.sleep(250); } isInterfaceActive(); } }