package jfconfig; /** * Created : Mar 18, 2012 * * @author pquiring */ import java.io.*; import java.util.*; import javaforce.*; import javaforce.linux.*; public class SambaPanel extends javax.swing.JPanel { /** * Creates new form SambaPanel */ public SambaPanel() { initComponents(); 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() { jToolBar1 = new javax.swing.JToolBar(); back = new javax.swing.JButton(); restart = new javax.swing.JButton(); jPanel1 = new javax.swing.JPanel(); usershareowneronly = new javax.swing.JCheckBox(); apply = new javax.swing.JButton(); jLabel7 = new javax.swing.JLabel(); workgroup = new javax.swing.JTextField(); wins = new javax.swing.JCheckBox(); winsip = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); realm = new javax.swing.JTextField(); jLabel6 = new javax.swing.JLabel(); security = new javax.swing.JComboBox(); jPanel2 = new javax.swing.JPanel(); join = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); username = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); password = new javax.swing.JPasswordField(); unjoin = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); server = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); debugLevel = new javax.swing.JComboBox(); jButton1 = 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); restart.setText("Restart Servers"); 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); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Configuration")); usershareowneronly.setText("Users can only share files they own"); usershareowneronly.setToolTipText("Often required on NTFS volumes."); apply.setText("Apply"); apply.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { applyActionPerformed(evt); } }); jLabel7.setText("Workgroup/Domain:"); workgroup.setText("WORKGROUP"); wins.setText("Enable WINS Support : IP ="); jLabel1.setText("Realm/FQDN:"); jLabel6.setText("Security Mode:"); security.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "User", "ADS" })); 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) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(apply)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(wins) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(winsip)) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel7) .addComponent(jLabel1) .addComponent(jLabel6)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(realm) .addComponent(workgroup, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE) .addComponent(security, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addComponent(usershareowneronly, javax.swing.GroupLayout.DEFAULT_SIZE, 518, Short.MAX_VALUE)) .addContainerGap()) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel7) .addComponent(workgroup, 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(realm, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel6) .addComponent(security, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(usershareowneronly) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(wins) .addComponent(winsip, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(apply) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Join Domain")); join.setText("Join"); join.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { joinActionPerformed(evt); } }); jLabel2.setText("Username"); jLabel3.setText("Password"); unjoin.setText("Unjoin"); unjoin.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { unjoinActionPerformed(evt); } }); jLabel4.setText("Server"); jLabel5.setText("Debug Level"); debugLevel.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" })); 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() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(jLabel4) .addGap(19, 19, 19) .addComponent(server)) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(username, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(password, javax.swing.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE)) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(unjoin) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(join)) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(debugLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(server, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(username, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel3) .addComponent(password, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel5) .addComponent(debugLevel, 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(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(unjoin) .addComponent(join)) .addContainerGap()) ); jButton1.setText("Help"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(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) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(jButton1))) .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) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel2, 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) .addComponent(jButton1) .addContainerGap()) ); }// </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 applyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_applyActionPerformed saveConfig(); apply(); }//GEN-LAST:event_applyActionPerformed private void restartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_restartActionPerformed restart(); }//GEN-LAST:event_restartActionPerformed private void joinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_joinActionPerformed join(); }//GEN-LAST:event_joinActionPerformed private void unjoinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unjoinActionPerformed unjoin(); }//GEN-LAST:event_unjoinActionPerformed private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed try { Runtime.getRuntime().exec("jhelp jconfig-samba"); } catch (Exception e) { } }//GEN-LAST:event_jButton1ActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton apply; private javax.swing.JButton back; private javax.swing.JComboBox debugLevel; private javax.swing.JButton jButton1; 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.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JToolBar jToolBar1; private javax.swing.JButton join; private javax.swing.JPasswordField password; private javax.swing.JTextField realm; private javax.swing.JButton restart; private javax.swing.JComboBox security; private javax.swing.JTextField server; private javax.swing.JButton unjoin; private javax.swing.JTextField username; private javax.swing.JCheckBox usershareowneronly; private javax.swing.JCheckBox wins; private javax.swing.JTextField winsip; private javax.swing.JTextField workgroup; // End of variables declaration//GEN-END:variables //[global]usershare owner only = false public static class Config { public String workgroup, realm, security; public boolean usershareowneronly; public boolean wins; public String winsip; } private Config config; private String configFolder = "/etc/jconfig.d/"; private String configFile = "samba.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(); } workgroup.setText(config.workgroup); realm.setText(config.realm); if (config.security == null) config.security = "USER"; if (config.security.equals("USER")) security.setSelectedIndex(0); if (config.security.equals("ADS")) security.setSelectedIndex(1); usershareowneronly.setSelected(config.usershareowneronly); wins.setSelected(config.wins); winsip.setText(config.winsip); } private void defaultConfig() { config = new Config(); config.workgroup = "WORKGROUP"; config.security = "USER"; config.realm = ""; config.winsip = ""; } private void saveConfig() { config.workgroup = workgroup.getText(); config.realm = realm.getText(); config.security = (String)security.getSelectedItem(); config.usershareowneronly = usershareowneronly.isSelected(); config.wins = wins.isSelected(); config.winsip = winsip.getText(); try { XML xml = new XML(); File tmpFile = File.createTempFile("samba", ".xml"); FileOutputStream fos = new FileOutputStream(tmpFile); xml.readClass("samba", 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 apply() { //save config to /etc/samba/smb.conf try { String str = new String(JF.readAll(this.getClass().getClassLoader().getResourceAsStream("smb.conf"))); File tmpFile = File.createTempFile("smb", ".conf"); FileOutputStream fos = new FileOutputStream(tmpFile); str = str.replaceAll("[$]WORKGROUP", config.workgroup); str = str.replaceAll("[$]USERSHAREOWNERONLY", "" + config.usershareowneronly); str = str.replaceAll("[$]WINS", "" + config.wins); str = str.replaceAll("[$]WINSIP", config.winsip); str = str.replaceAll("[$]REALM", "" + config.realm); str = str.replaceAll("[$]SECURITY", "" + config.security); fos.write(str.getBytes()); fos.close(); if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/samba/smb.conf")) { tmpFile.delete(); throw new Exception("file io error"); } tmpFile.delete(); JF.showMessage("Notice", "Please restart server to make changes effective."); } catch (Exception e) { JFLog.log(e); } } private boolean valid(boolean checkDomain) { if (checkDomain) { if (realm.getText().length() == 0) return false; } if (server.getText().length() == 0) return false; if (username.getText().length() == 0) return false; if (password.getPassword().length == 0) return false; return true; } private void join() { if (!valid(true)) return; ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("net"); cmd.add("ads"); cmd.add("join"); char first = server.getText().charAt(0); if ((first >= '0') && (first <= '9')) cmd.add("-I"); else cmd.add("-S"); cmd.add(server.getText()); cmd.add("-U"); cmd.add(username.getText() + "%" + new String(password.getPassword())); //workgroup.getText() + "\\\\" + if (debugLevel.getSelectedIndex() > 0) { cmd.add("-d"); cmd.add("" + debugLevel.getSelectedIndex()); } // net dom join ... // cmd.add("domain=" + realm.getText()); // cmd.add("account=" + realm.getText() + "\\\\" + username.getText()); // cmd.add("password=" + password.getPassword()); try { ShellProcess sp = new ShellProcess(); String output = sp.run(cmd, false); if (sp.getErrorLevel() != 0) { JF.showError("Error", "Join Failed: Command=" + sp.command + "\n" + "Output=" + output); return; } JFLog.log("Samba:Join Output=" + output); //add to /etc/domains.lst File tmpFile = File.createTempFile("domains", ".lst", new File("/tmp")); String lst = ""; if (new File("/etc/domains.lst").exists()) { lst = new String(JF.readAll(new FileInputStream("/etc/domains.lst"))); if (!lst.endsWith("\n")) lst += "\n"; } boolean added = false; String lns[] = lst.split("\n"); for(int a=0;a<lns.length;a++) { if (lns[a].indexOf(workgroup.getText()) != -1) {added = true; break;} } if (!added) { FileOutputStream fos = new FileOutputStream(tmpFile); lst += "domain=" + workgroup.getText() + ",server=" + server.getText() + "\n"; fos.write(lst.getBytes()); fos.close(); if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/domains.lst")) { JF.showError("Error", "Join Successful but failed to update /etc/domains.lst"); return; } } FixStuffPanel.fixSamba(true); tmpFile.delete(); JF.showMessage("Notice", "Join Successful!"); } catch (Exception e) { JFLog.log(e); } } private void unjoin() { if (!valid(false)) return; ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("net"); cmd.add("ads"); cmd.add("leave"); char first = server.getText().charAt(0); if ((first >= '0') && (first <= '9')) cmd.add("-I"); else cmd.add("-S"); cmd.add(server.getText()); cmd.add("-U"); cmd.add(realm.getText() + "\\\\" + username.getText() + "%" + password.getPassword()); // net dom unjoin ... // cmd.add("account=" + username.getText()); // cmd.add("password=" + password.getPassword()); try { ShellProcess sp = new ShellProcess(); String output = sp.run(cmd, false); if (sp.getErrorLevel() != 0) { JF.showError("Error", "UnJoin Failed:" + output); return; } //remove domain from /etc/domains.lst File tmpFile = File.createTempFile("domains", ".lst", new File("/tmp")); FileOutputStream fos = new FileOutputStream(tmpFile); String lst = ""; if (new File("/etc/domains.lst").exists()) { lst = new String(JF.readAll(new FileInputStream("/etc/domains.lst"))); if (!lst.endsWith("\n")) lst += "\n"; } String lns[] = lst.split("\n"); String domainString = realm.getText(); for(int a=0;a<lns.length;a++) { if (lns[a].equalsIgnoreCase(domainString)) { lst = ""; for(int b=0;b<lns.length;b++) { if (b != a) lst += lns[b] + "\n"; } break; } } fos.write(lst.getBytes()); fos.close(); if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/domains.lst")) { JF.showError("Error", "UnJoin Successful but failed to update /etc/domains.lst"); return; } JF.showMessage("Notice", "UnJoin Successful"); } catch (Exception e) { JFLog.log(e); } } private void restart() { boolean ok = true; if (!Linux.restartService("smbd")) { JF.showError("Error", "Failed to Restart smbd"); ok = false; } if (!Linux.restartService("nmbd")) { JF.showError("Error", "Failed to Restart nmbd"); ok = false; } if (ok) JF.showMessage("Notice", "Samba restarted"); } }