package jfconfig; /** * Created : Mar 14, 2012 * * @author pquiring */ import java.io.*; import java.util.*; import javaforce.*; import javaforce.linux.*; public class FixStuffPanel extends javax.swing.JPanel { /** * Creates new form FixStuffPanel */ public FixStuffPanel() { initComponents(); } /** * 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(); jLabel2 = new javax.swing.JLabel(); fixTomcat = new javax.swing.JButton(); jTextArea1 = new javax.swing.JTextArea(); jLabel3 = new javax.swing.JLabel(); fixSSHslow = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); nopasswd = new javax.swing.JButton(); jLabel5 = new javax.swing.JLabel(); samba = new javax.swing.JButton(); jLabel6 = new javax.swing.JLabel(); grub_mkconfig = new javax.swing.JButton(); jLabel7 = new javax.swing.JLabel(); initramfs = 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); jLabel2.setText("Allow Tomcat to Listen on ports below 1024 (setcap)"); fixTomcat.setText("Fix it"); fixTomcat.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fixTomcatActionPerformed(evt); } }); jTextArea1.setColumns(20); jTextArea1.setEditable(false); jTextArea1.setRows(5); jTextArea1.setText("Another solution is to use a port forwarding rule in the Firewall\n module to redirect port 80 to 8080 (443 -> 8443)."); jTextArea1.setFocusable(false); jLabel3.setText("Establishing SSH connections are VERY slow. (Ubuntu)"); fixSSHslow.setText("Fix it"); fixSSHslow.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fixSSHslowActionPerformed(evt); } }); jLabel4.setText("Stop asking for password to run admin tasks (sudoers)"); jLabel4.setToolTipText("You will be prompted twice for your password to do this."); nopasswd.setText("Fix it"); nopasswd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { nopasswdActionPerformed(evt); } }); jLabel5.setText("Add Samba to authentication configuration (nsswitch.conf)"); samba.setText("Fix it"); samba.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { sambaActionPerformed(evt); } }); jLabel6.setText("Reconfigure Boot Options (grub-mkconfig)"); grub_mkconfig.setText("Fix it"); grub_mkconfig.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { grub_mkconfigActionPerformed(evt); } }); jLabel7.setText("Rebuild Boot Image (update-initramfs)"); initramfs.setText("Fix it"); initramfs.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { initramfsActionPerformed(evt); } }); 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) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(fixTomcat)) .addGroup(layout.createSequentialGroup() .addGap(12, 12, 12) .addComponent(jTextArea1)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(fixSSHslow)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(nopasswd)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 94, Short.MAX_VALUE) .addComponent(samba)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(grub_mkconfig)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel7) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(initramfs))) .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.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(nopasswd)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(fixTomcat)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(fixSSHslow)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel5) .addComponent(samba)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel6) .addComponent(grub_mkconfig)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel7) .addComponent(initramfs)) .addContainerGap(78, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents private void backActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backActionPerformed ConfigApp.This.setPanel(new MainPanel()); }//GEN-LAST:event_backActionPerformed private void fixTomcatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fixTomcatActionPerformed Linux.detectDistro(); switch (Linux.distro) { case Ubuntu: if (!Linux.isInstalled("libcap2-bin")) { if (!Linux.installPackage("libcap2-bin", "setcap tool")) { JF.showError("Error", "Failed to install required tool"); return; } } break; case Fedora: if (!Linux.isInstalled("libcap")) { if (!Linux.installPackage("libcap", "setcap tool")) { JF.showError("Error", "Failed to install required tool"); return; } } break; default: JF.showError("Error", "Unsupported distro"); return; } String javabin = ""; try { File file = new File("/usr/bin/java"); javabin = file.getCanonicalPath(); //resolves symlinks } catch (Exception e) { JFLog.log(e); JF.showError("Error", "Failed to find java binary"); return; } ShellProcess sp = new ShellProcess(); ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("setcap"); cmd.add("'cap_net_bind_service=ep'"); cmd.add(javabin); String output = sp.run(cmd, false); if (output == null) { JFLog.log("Failed to exec setcap"); JF.showError("Error", "Failed to exec setcap."); return; } JF.showMessage("Notice", "Privledges granted. You will have to do this again if the Java package is upgraded."); }//GEN-LAST:event_fixTomcatActionPerformed private void fixSSHslowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fixSSHslowActionPerformed //This is a fix for Ubuntu /* edit /etc/ssh/ssh/ssh_config * and comment these lines: * GSSAPIAuthentication yes * GSSAPIDelegateCredentials no */ try { //copy /etc/ssh/ssh_config to tmpFile changing settings on the fly File tmpFile = File.createTempFile("ssh_config", ""); FileOutputStream fos = new FileOutputStream(tmpFile); FileInputStream fis = new FileInputStream("/etc/ssh/ssh_config"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String ln; while ((ln = br.readLine()) != null) { if (ln.trim().startsWith("GSSAPI")) ln = "#" + ln; //comment them out fos.write(ln.getBytes()); fos.write("\n".getBytes()); } fos.close(); fis.close(); //copy tmpFile back to /etc/ssh/ssh_config if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/ssh/ssh_config")) throw new Exception("file copy error"); JF.showMessage("Notice", "SSH Config has been fixed."); } catch (Exception e) { JFLog.log(e); JF.showError("Error", "Failed to apply settings."); } }//GEN-LAST:event_fixSSHslowActionPerformed private void nopasswdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nopasswdActionPerformed /* edit /etc/sudoers * %wheel for Fedora * %sudo for Ubuntu 11.10- * %admin for Ubuntu 12.04+ */ try { //copy /etc/sudoers to tmpFile File tmpFile_org = File.createTempFile("sudoers", "org"); if (!Linux.copyFile("/etc/sudoers", tmpFile_org.getAbsolutePath())) throw new Exception("file copy error"); File tmpFile_new = File.createTempFile("sudoers", "new"); FileOutputStream fos = new FileOutputStream(tmpFile_new); FileInputStream fis = new FileInputStream(tmpFile_org); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String ln; while ((ln = br.readLine()) != null) { if (ln.startsWith("%sudo") || ln.startsWith("%wheel") || ln.startsWith("%admin")) { if (ln.indexOf("NOPASSWD") == -1) { int idx = ln.indexOf(")"); if (idx != -1) { ln = ln.substring(0, idx+1) + " NOPASSWD: " + ln.substring(idx+1); } } } fos.write((ln + "\n").getBytes()); } fos.close(); fis.close(); //copy tmpFile back to /etc/sudoers if (!Linux.copyFile(tmpFile_new.getAbsolutePath(), "/etc/sudoers")) throw new Exception("file copy error"); JF.showMessage("Notice", "sudoers has been patched."); } catch (Exception e) { JFLog.log(e); JF.showError("Error", "Failed to apply settings."); } }//GEN-LAST:event_nopasswdActionPerformed private void sambaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sambaActionPerformed fixSamba(false); }//GEN-LAST:event_sambaActionPerformed private void grub_mkconfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_grub_mkconfigActionPerformed if (!Linux.runScript(new String[] { "grub-mkconfig --output=/boot/grub/grub.cfg" })) { JF.showError("Error", "Failed to recreate boot options"); } else { JF.showMessage("Notice", "Boot Options reconfigured"); } }//GEN-LAST:event_grub_mkconfigActionPerformed private void initramfsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_initramfsActionPerformed if (!Linux.runScript(new String[] { "update-initramfs -u" })) { JF.showError("Error", "Failed to recreate initramfs"); } else { JF.showMessage("Notice", "Boot Image recreated"); } }//GEN-LAST:event_initramfsActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton back; private javax.swing.JButton fixSSHslow; private javax.swing.JButton fixTomcat; private javax.swing.JButton grub_mkconfig; private javax.swing.JButton initramfs; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JTextArea jTextArea1; private javax.swing.JToolBar jToolBar1; private javax.swing.JButton nopasswd; private javax.swing.JButton samba; // End of variables declaration//GEN-END:variables public static void fixSamba(boolean quiet) { //add winbind to passwd, group and shadow //also fixes hosts lookup order try { //copy /etc/nsswitch.conf to tmpFile File tmpFile = File.createTempFile("nsswitch-new", ".conf"); FileOutputStream fos = new FileOutputStream(tmpFile); FileInputStream fis = new FileInputStream("/etc/nsswitch.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String ln; while ((ln = br.readLine()) != null) { if (ln.startsWith("passwd:") || ln.startsWith("group:") || ln.startsWith("shadow:")) { if (ln.indexOf("winbind") == -1) { ln = ln + " winbind"; } } if (ln.startsWith("hosts:")) { ln = "hosts: files dns mdns4_minimal [NOTFOUND=return] mdns4"; } fos.write((ln + "\n").getBytes()); } fos.close(); fis.close(); //copy tmpFile back to /etc/nsswitch.conf if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/nsswitch.conf")) throw new Exception("file copy error"); if (!quiet) JF.showMessage("Notice", "Configuration patched successfully!"); } catch (Exception e) { JFLog.log(e); JF.showError("Error", "Failed to fix /etc/nsswitch.conf"); } } }