package jfconfig; /** * Created : Mar 9, 2012 * * @author pquiring */ import java.io.*; import java.util.*; import javax.swing.*; import javaforce.*; import javaforce.linux.*; public class ApachePanel extends javax.swing.JPanel { /** * Creates new form ApachePanel */ public ApachePanel() { initComponents(); loadConfig(); ConfigApp.This.setTitle("Config : Apache"); Linux.detectDistro(); if (Linux.distro != Linux.DistroTypes.Ubuntu) { runWizard.setEnabled(false); runWizard.setToolTipText("Requires Ubuntu"); } } /** * 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(); addvhost = new javax.swing.JButton(); delvhost = new javax.swing.JButton(); save = new javax.swing.JButton(); apply = new javax.swing.JButton(); restart = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); hosts = new javax.swing.JList(); jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel1 = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); docPath = new javax.swing.JTextField(); domains = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); port = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); name = new javax.swing.JTextField(); ssl = new javax.swing.JCheckBox(); enabled = new javax.swing.JCheckBox(); cgi = new javax.swing.JCheckBox(); manageFiles = new javax.swing.JButton(); jLabel7 = new javax.swing.JLabel(); wizards = new javax.swing.JComboBox(); runWizard = new javax.swing.JButton(); jLabel9 = new javax.swing.JLabel(); wizardsDest = new javax.swing.JComboBox(); jButton1 = new javax.swing.JButton(); enableSSL = new javax.swing.JButton(); 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); addvhost.setText("Add Virtual Host"); addvhost.setFocusable(false); addvhost.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); addvhost.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); addvhost.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addvhostActionPerformed(evt); } }); jToolBar1.add(addvhost); delvhost.setText("Delete Virtual Host"); delvhost.setFocusable(false); delvhost.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); delvhost.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); delvhost.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { delvhostActionPerformed(evt); } }); jToolBar1.add(delvhost); 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); hosts.setModel(hostsModel); hosts.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); hosts.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { hostsValueChanged(evt); } }); jScrollPane1.setViewportView(hosts); jLabel4.setText("Documents"); docPath.setText("/var/www"); domains.setText("*"); jLabel3.setText("Domains"); jLabel3.setToolTipText("Domains (comma list)"); port.setText("80"); jLabel1.setText("Port"); jLabel5.setText("Name"); name.setEditable(false); name.setText("Default"); ssl.setText("SSL (Secure)"); enabled.setText("Enabled"); cgi.setText("Enable CGI Support (/usr/lib/cgi-bin)"); manageFiles.setText("Manage Files..."); manageFiles.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { manageFilesActionPerformed(evt); } }); jLabel7.setText("Load:"); wizards.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "WordPress", "Drupal", "myPHPAdmin" })); runWizard.setText("Execute"); runWizard.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { runWizardActionPerformed(evt); } }); jLabel9.setText("as"); wizardsDest.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Entire Website", "Virtual Folder" })); jButton1.setText("Launch SSL Key Manager..."); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); enableSSL.setText("Enable SSL Module"); enableSSL.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { enableSSLActionPerformed(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() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(ssl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(port)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(domains)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(docPath)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(name)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel7) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(wizards, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel9) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(wizardsDest, 0, 95, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(runWizard)) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(enabled) .addComponent(jButton1) .addComponent(cgi) .addComponent(manageFiles) .addComponent(enableSSL)) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(enabled) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel5) .addComponent(name, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(port, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(domains, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(docPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ssl) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(cgi) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(manageFiles) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel7) .addComponent(wizards, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(runWizard) .addComponent(jLabel9) .addComponent(wizardsDest, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(enableSSL) .addContainerGap(357, Short.MAX_VALUE)) ); jTabbedPane1.addTab("General", jPanel1); 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() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) ); 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) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1) .addComponent(jTabbedPane1))) ); }// </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 hostsValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_hostsValueChanged int idx = hosts.getSelectedIndex(); if (idx == -1) return; loadHost(idx); }//GEN-LAST:event_hostsValueChanged private void addvhostActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addvhostActionPerformed String name = JF.getString("Enter Virtual Host Name", ""); if (name == null) return; addHost(name); }//GEN-LAST:event_addvhostActionPerformed private void delvhostActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_delvhostActionPerformed int idx = hosts.getSelectedIndex(); if (idx == -1) return; delHost(idx); }//GEN-LAST:event_delvhostActionPerformed private void applyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_applyActionPerformed apply(); }//GEN-LAST:event_applyActionPerformed private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed saveConfig(); }//GEN-LAST:event_saveActionPerformed private void restartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_restartActionPerformed restart(); }//GEN-LAST:event_restartActionPerformed private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed int idx = hosts.getSelectedIndex(); if (idx == -1) { return; } Host host = config.host[idx]; String folder = "/etc/jconfig.d/apache/" + host.name; OpenSSLApp dialog = new OpenSSLApp(new String[]{folder, "apache"}); dialog.setVisible(true); }//GEN-LAST:event_jButton1ActionPerformed private void runWizardActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_runWizardActionPerformed int idx = hosts.getSelectedIndex(); if (idx == -1) { return; } Host host = config.host[idx]; switch (wizards.getSelectedIndex()) { case 0: //install WordPress if (!JF.showConfirm("Warning", "You are about to install WordPress CMS")) { return; } if (!Linux.installPackage("wordpress", "WordPress")) { JF.showError("Error", "Failed to install WordPress"); return; } if (wizardsDest.getSelectedIndex() == 0) { host.docPath = "/usr/share/wordpress"; } else { //TODO : create virtual folder } break; case 1: //install Drupal if (!JF.showConfirm("Warning", "You are about to install Drupal CMS")) { return; } if (!Linux.installPackage("drupal6", "Drupal")) { JF.showError("Error", "Failed to install WordPress"); return; } if (wizardsDest.getSelectedIndex() == 0) { host.docPath = "/usr/share/drupal6"; } else { //create virtual folder (link) String folder = JF.getString("Enter virtual name", ""); if ((folder == null) || (folder.length() == 0)) { break; } Linux.runScript(new String[]{ "ln -s /usr/share/drupal6 " + host.docPath + "/" + folder }); } break; case 2: //install myPHPAdmin if (!JF.showConfirm("Warning", "You are about to install myPHPAdmin")) { return; } if (!Linux.installPackage("myphpadmin", "myPHPAdmin")) { JF.showError("Error", "Failed to install myPHPAdmin"); return; } if (wizardsDest.getSelectedIndex() == 0) { host.docPath = "/usr/share/myphpadmin"; } else { //create virtual folder (link) String folder = JF.getString("Enter virtual name", ""); if ((folder == null) || (folder.length() == 0)) { break; } Linux.runScript(new String[]{ "ln -s /usr/share/myphpadmin " + host.docPath + "/" + folder }); } break; } }//GEN-LAST:event_runWizardActionPerformed private void manageFilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_manageFilesActionPerformed JF.showError("Note", "Not implemented yet"); //pending jfile }//GEN-LAST:event_manageFilesActionPerformed private void enableSSLActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enableSSLActionPerformed if (!Linux.runScript(new String[] {"a2enmod", "ssl"})) { JF.showError("Error", "Failed to enable mod_ssl"); } else { JF.showMessage("Notice", "Enabled mod_ssl"); } }//GEN-LAST:event_enableSSLActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addvhost; private javax.swing.JButton apply; private javax.swing.JButton back; private javax.swing.JCheckBox cgi; private javax.swing.JButton delvhost; private javax.swing.JTextField docPath; private javax.swing.JTextField domains; private javax.swing.JButton enableSSL; private javax.swing.JCheckBox enabled; private javax.swing.JList hosts; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel9; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JButton manageFiles; private javax.swing.JTextField name; private javax.swing.JTextField port; private javax.swing.JButton restart; private javax.swing.JButton runWizard; private javax.swing.JButton save; private javax.swing.JCheckBox ssl; private javax.swing.JComboBox wizards; private javax.swing.JComboBox wizardsDest; // End of variables declaration//GEN-END:variables private DefaultListModel hostsModel = new DefaultListModel(); private String configFolder = "/etc/jconfig.d/"; private String configFile = "apache.xml"; public static class Host { public boolean enabled, cgi, ssl; public String name, domains, docPath; public int port; } public static class Config { public Host host[]; } private Config config = new Config(); private int currentIdx = -1; private void loadConfig() { 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(); } updateConfig(); } private void defaultConfig() { //creates the init default config Host host1 = new Host(); host1.name = "default"; host1.port = 80; host1.domains = "*"; host1.docPath = "/var/www"; host1.enabled = true; Host host2 = new Host(); host2.name = "default-ssl"; host2.port = 443; host2.ssl = true; host2.domains = "_default_"; host2.docPath = "/var/www"; host2.enabled = false; config.host = new Host[2]; config.host[0] = host1; config.host[1] = host2; } private void updateConfig() { //update hosts to config data hosts.clearSelection(); hostsModel.clear(); int cnt = config.host.length; for(int a=0;a<cnt;a++) { hostsModel.addElement(config.host[a].name); } resetHost(); } private void resetHost() { name.setText(""); port.setText(""); ssl.setSelected(false); domains.setText(""); docPath.setText(""); currentIdx = -1; } private void loadHost(int idx) { saveHost(currentIdx); Host host = config.host[idx]; enabled.setSelected(host.enabled); name.setText(host.name); port.setText("" + host.port); ssl.setSelected(host.ssl); domains.setText(host.domains); docPath.setText(host.docPath); cgi.setSelected(host.cgi); currentIdx = idx; } private void saveHost(int idx) { if (idx == -1) return; Host host = config.host[idx]; host.name = name.getText(); host.enabled = enabled.isSelected(); host.port = JF.atoi(port.getText()); host.ssl = ssl.isSelected(); host.domains = domains.getText(); host.docPath = docPath.getText(); host.cgi = cgi.isSelected(); if (host.docPath.endsWith("/")) { host.docPath = host.docPath.substring(0, host.docPath.length()-1); } } private void addHost(String name) { name = name.trim().replaceAll("\"", ""); name = name.replaceAll(" ", "-"); if (name.length() == 0) return; for(int a=0;a<config.host.length;a++) { if (config.host[a].name.equalsIgnoreCase(name)) { JF.showError("Error", "That name already exists"); return; } } //copy default values Host newhost = new Host(); Host def = config.host[0]; newhost.name = name; newhost.port = def.port; newhost.ssl = def.ssl; newhost.docPath = def.docPath; newhost.domains = def.domains; config.host = Arrays.copyOf(config.host, config.host.length + 1); config.host[config.host.length-1] = newhost; updateConfig(); } private void delHost(int idx) { if (idx <= 1) {JF.showError("Error", "Can not delete 'Default' host"); return;} Host host = config.host[idx]; if (!JF.showConfirm("Confirm", "Are you sure you want to delete '" + host.name + "'?")) return; int len = config.host.length; Host newList[] = new Host[len-1]; System.arraycopy(config.host, 0, newList, 0, idx); System.arraycopy(config.host, idx+1, newList, idx, len - idx - 1); config.host = newList; updateConfig(); } private void saveConfig() { //save config to configFile saveHost(currentIdx); try { XML xml = new XML(); File tmpFile = File.createTempFile("apache", ".xml"); FileOutputStream fos = new FileOutputStream(tmpFile); xml.readClass("apache", 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 void applyHost(Host host, OutputStream os) throws Exception { byte data[] = null; if (!host.ssl) { data = JF.readAll(this.getClass().getClassLoader().getResourceAsStream("apache-default.conf")); } else { data = JF.readAll(this.getClass().getClassLoader().getResourceAsStream("apache-ssl.conf")); } String str = new String(data); str = str.replaceAll("[$]DOMAINS", host.domains); str = str.replaceAll("[$]PORT", "" + host.port); str = str.replaceAll("[$]EMAIL", "webmaster@localhost"); str = str.replaceAll("[$]DOCPATH", host.docPath); str = str.replaceAll("[$]PUBLICKEY", "/etc/jconfig.d/apache/" + host.name + "/public.crt"); str = str.replaceAll("[$]PRIVATEKEY", "/etc/jconfig.d/apache/" + host.name + "/private.key"); if (host.cgi) { byte cgi[] = JF.readAll(this.getClass().getClassLoader().getResourceAsStream("apache-cgi.conf")); str = str.replaceAll("[$]CGI", new String(cgi)); } else { str = str.replaceAll("[$]CGI", ""); } os.write(str.getBytes()); } private void apply() { //save each vhost to /etc/apache2/sites-available try { for(int a=0;a<config.host.length;a++) { Host host = config.host[a]; File tmpFile = File.createTempFile("apache", ".conf"); FileOutputStream fos = new FileOutputStream(tmpFile); applyHost(host, fos); fos.close(); if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/apache2/sites-available/" + host.name)) { tmpFile.delete(); throw new Exception("file io error"); } tmpFile.delete(); if (host.enabled) { Linux.createLink("/etc/apache2/sites-available/" + host.name, "/etc/apache2/sites-enabled/" + host.name); } else { Linux.deleteFile("/etc/apache2/sites-enabled/" + host.name); } } JF.showMessage("Notice", "Please restart server to make changes effective."); } catch (Exception e) { JFLog.log(e); } } private void restart() { if (Linux.restartService("apache2")) JF.showMessage("Notice", "Apache Service Restarted"); else JF.showError("Error", "Failed to Restart Apache Service"); } }