package jfconfig; /** * Created : Mar 17, 2012 * * @author pquiring */ import java.io.*; import java.util.*; import javax.swing.*; import javaforce.*; import javaforce.linux.*; public class DHCPPanel extends javax.swing.JPanel { /** * Creates new form DHCPPanel */ public DHCPPanel() { initComponents(); loadPools(); updatePools(); } /** * 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() { jToolBar1 = new javax.swing.JToolBar(); back = new javax.swing.JButton(); addPool = new javax.swing.JButton(); editPool = new javax.swing.JButton(); delPool = new javax.swing.JButton(); save = new javax.swing.JButton(); apply = new javax.swing.JButton(); restart = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); pools = new javax.swing.JList(); 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); addPool.setText("Add Pool"); addPool.setFocusable(false); addPool.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); addPool.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); addPool.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addPoolActionPerformed(evt); } }); jToolBar1.add(addPool); editPool.setText("Edit Pool"); editPool.setFocusable(false); editPool.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); editPool.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); editPool.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editPoolActionPerformed(evt); } }); jToolBar1.add(editPool); delPool.setText("Del Pool"); delPool.setFocusable(false); delPool.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); delPool.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); delPool.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { delPoolActionPerformed(evt); } }); jToolBar1.add(delPool); save.setText("Save"); save.setFocusable(false); save.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); save.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); save.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveActionPerformed(evt); } }); jToolBar1.add(save); apply.setText("Apply"); apply.setFocusable(false); apply.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); apply.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); apply.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { applyActionPerformed(evt); } }); jToolBar1.add(apply); restart.setText("Restart Server"); restart.setFocusable(false); restart.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); restart.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); restart.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { restartActionPerformed(evt); } }); jToolBar1.add(restart); pools.setModel(poolsModel); pools.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane1.setViewportView(pools); 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, 499, Short.MAX_VALUE) .addComponent(jScrollPane1) ); 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.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 453, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents private void backActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backActionPerformed ConfigApp.This.setPanel(new ServersPanel()); }//GEN-LAST:event_backActionPerformed private void addPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addPoolActionPerformed addPool(); }//GEN-LAST:event_addPoolActionPerformed private void editPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editPoolActionPerformed int idx = pools.getSelectedIndex(); if (idx == -1) return; editPool(idx); }//GEN-LAST:event_editPoolActionPerformed private void delPoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_delPoolActionPerformed int idx = pools.getSelectedIndex(); if (idx == -1) return; delPool(idx); }//GEN-LAST:event_delPoolActionPerformed private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed savePools(); }//GEN-LAST:event_saveActionPerformed private void applyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_applyActionPerformed apply(); }//GEN-LAST:event_applyActionPerformed private void restartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_restartActionPerformed restart(); }//GEN-LAST:event_restartActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addPool; private javax.swing.JButton apply; private javax.swing.JButton back; private javax.swing.JButton delPool; private javax.swing.JButton editPool; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JList pools; private javax.swing.JButton restart; private javax.swing.JButton save; // End of variables declaration//GEN-END:variables /* * /etc/dhcp/dhcpd.conf * * man dhcpd.conf * man dhcp-options * * subnet <ip> netmask <mask> { * option routers <ip>; * option domain-name <domain>; * option domain-name-servers <ip1>,<ip2>,<ip3>; * option netbios-name-servers <ip1>,...; * max-lease-time <sec>; //600 * default-lease-time <sec>; //7200 * * range <ipfirst> <iplast>; * } * */ private DefaultListModel poolsModel = new DefaultListModel(); public static class Pool { public boolean enabled; public String ip, mask; public String ipfirst, iplast; //range public String router; public String domain; public String dns; public String wins; public String extra; //extra options } public static class Config { public Pool pool[]; } private Config config; private String configFolder = "/etc/jconfig.d/"; private String configFile = "dhcp.xml"; private void loadPools() { config = new Config(); config.pool = new Pool[0]; 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.pool = new Pool[0]; } private void savePools() { try { XML xml = new XML(); File tmpFile = File.createTempFile("dhcp", ".xml"); FileOutputStream fos = new FileOutputStream(tmpFile); xml.readClass("dhcp", 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 String getPoolString(Pool pool) { return pool.ip + " " + pool.mask; } private void updatePools() { poolsModel.clear(); for(int a=0;a<config.pool.length;a++) { poolsModel.addElement(getPoolString(config.pool[a])); } } private void addPool() { DHCPPoolDialog dialog = new DHCPPoolDialog(ConfigApp.This, true, null); dialog.setVisible(true); if (!dialog.accepted) return; Pool newPool = new Pool(); newPool.enabled = dialog.getEnabled(); newPool.ip = dialog.getIP(); newPool.mask = dialog.getMask(); newPool.ipfirst = dialog.getIPFirst(); newPool.iplast = dialog.getIPLast(); newPool.router = dialog.getRouter(); newPool.domain = dialog.getDomain(); newPool.dns = dialog.getDNS(); newPool.wins = dialog.getWINS(); newPool.extra = dialog.getExtra(); config.pool = Arrays.copyOf(config.pool, config.pool.length + 1); config.pool[config.pool.length-1] = newPool; updatePools(); } private void editPool(int idx) { Pool pool = config.pool[idx]; DHCPPoolDialog dialog = new DHCPPoolDialog(ConfigApp.This, true, pool); dialog.setVisible(true); if (!dialog.accepted) return; pool.enabled = dialog.getEnabled(); pool.ip = dialog.getIP(); pool.mask = dialog.getMask(); pool.ipfirst = dialog.getIPFirst(); pool.iplast = dialog.getIPLast(); pool.router = dialog.getRouter(); pool.domain = dialog.getDomain(); pool.dns = dialog.getDNS(); pool.wins = dialog.getWINS(); pool.extra = dialog.getExtra(); updatePools(); } private void delPool(int idx) { Pool pool = config.pool[idx]; if (!JF.showConfirm("Confirm", "Are you sure you want to delete '" + pool.ip + "'?")) return; int len = config.pool.length; Pool newList[] = new Pool[len-1]; System.arraycopy(config.pool, 0, newList, 0, idx); System.arraycopy(config.pool, idx+1, newList, idx, len - idx - 1); config.pool = newList; updatePools(); } private void restart() { if (Linux.restartService("isc-dhcp-server")) JF.showMessage("Notice", "DHCP Service Restarted"); else JF.showError("Error", "Failed to Restart DHCP Service"); } /*subnet <ip> netmask <mask> { * option routers <ip>; * option domain-name <domain>; * option domain-name-servers <ip1>,<ip2>,<ip3>; * option netbios-name-servers <ip1>,...; * max-lease-time <sec>; //600 * default-lease-time <sec>; //7200 * * range <ipfirst> <iplast>; * } */ private void applyPool(Pool pool, OutputStream os) throws Exception { if (!pool.enabled) return; StringBuilder str = new StringBuilder(); str.append("subnet " + pool.ip + " netmask " + pool.mask + " {\n"); if (pool.domain.length() > 0) str.append(" option domain-name " + pool.domain + ";\n"); if (pool.router.length() > 0) str.append(" option routers " + pool.router + ";\n"); if (pool.dns.length() > 0) str.append(" option domain-name-servers " + pool.dns + ";\n"); if (pool.wins.length() > 0) str.append(" option netbios-name-servers " + pool.wins + ";\n"); // str.append(" max-lease-time 28800;\n"); //8 hrs // str.append(" default-lease-time 432000;\n"); //12 hrs if (pool.extra.length() > 0) str.append(pool.extra + "\n"); str.append(" range " + pool.ipfirst + " " + pool.iplast + ";\n"); str.append("}\n"); os.write(str.toString().getBytes()); } private void apply() { //save config to /etc/dhcp/dhcpd.conf try { File tmpFile = File.createTempFile("dhcp", ".xml"); FileOutputStream fos = new FileOutputStream(tmpFile); for(int a=0;a<config.pool.length;a++) applyPool(config.pool[a], fos); fos.close(); //copy tmpFile to /etc/dhcp/dhcpd.conf if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/dhcp/dhcpd.conf")) throw new Exception("file copy error"); JF.showMessage("Notice", "Settings have been applied, please restart server."); } catch (Exception e) { JFLog.log(e); JF.showError("Error", "Failed to apply settings."); } } }