package jfconfig; /** * Created : Mar 7, 2012 * * @author pquiring */ import java.util.*; import java.io.*; import javax.swing.*; import javaforce.*; public class GroupsPanel extends javax.swing.JPanel { /** * Creates new form GroupsPanel */ public GroupsPanel() { initComponents(); loadGroups(); loadUsers(); } /** * 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(); addGroup = new javax.swing.JButton(); deleteGroup = new javax.swing.JButton(); jSplitPane1 = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); groups = new javax.swing.JList(); jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel2 = new javax.swing.JPanel(); jScrollPane2 = new javax.swing.JScrollPane(); members = new javax.swing.JList(); addUserCombo = new javax.swing.JComboBox(); addUser = new javax.swing.JButton(); removeUser = 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); addGroup.setText("Add Group"); addGroup.setFocusable(false); addGroup.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); addGroup.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); addGroup.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addGroupActionPerformed(evt); } }); jToolBar1.add(addGroup); deleteGroup.setText("Delete Group"); deleteGroup.setFocusable(false); deleteGroup.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); deleteGroup.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); deleteGroup.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteGroupActionPerformed(evt); } }); jToolBar1.add(deleteGroup); jSplitPane1.setDividerLocation(164); groups.setModel(groupsModel); groups.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); groups.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { groupsValueChanged(evt); } }); jScrollPane1.setViewportView(groups); jSplitPane1.setLeftComponent(jScrollPane1); members.setModel(membersModel); members.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane2.setViewportView(members); addUser.setText("Add User"); addUser.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addUserActionPerformed(evt); } }); removeUser.setText("Remove User"); removeUser.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeUserActionPerformed(evt); } }); 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) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 827, Short.MAX_VALUE) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(addUserCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(addUser) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(removeUser) .addGap(0, 655, Short.MAX_VALUE))) .addContainerGap()) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 352, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(addUserCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(addUser) .addComponent(removeUser)) .addContainerGap()) ); jTabbedPane1.addTab("Members", jPanel2); jSplitPane1.setRightComponent(jTabbedPane1); 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) .addComponent(jSplitPane1) ); 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(jSplitPane1)) ); }// </editor-fold>//GEN-END:initComponents private void groupsValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_groupsValueChanged int idx = groups.getSelectedIndex(); if (idx == -1) return; loadGroup(idx); }//GEN-LAST:event_groupsValueChanged private void addUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addUserActionPerformed int idx = groups.getSelectedIndex(); if (idx == -1) return; String userName = (String)addUserCombo.getSelectedItem(); if (userName == null) return; ShellProcess sp = new ShellProcess(); ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("usermod"); cmd.add("-a"); //append group cmd.add("-G"); cmd.add((String)groupsModel.getElementAt(idx)); cmd.add(userName); String output = sp.run(cmd, false); if (output == null) { JF.showError("Error", "Failed to add user to group."); return; } loadGroups(); groups.setSelectedIndex(idx); }//GEN-LAST:event_addUserActionPerformed private void removeUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeUserActionPerformed int idx = groups.getSelectedIndex(); if (idx == -1) return; String userName = (String)members.getSelectedValue(); if (userName == null) return; ShellProcess sp = new ShellProcess(); ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("usermod"); cmd.add("-G"); cmd.add(getUserGroups(userName, idx)); cmd.add(userName); String output = sp.run(cmd, false); if (output == null) { JF.showError("Error", "Failed to remove user from group."); return; } loadGroups(); groups.setSelectedIndex(idx); }//GEN-LAST:event_removeUserActionPerformed private void backActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backActionPerformed ConfigApp.setPanel(new MainPanel()); }//GEN-LAST:event_backActionPerformed private void addGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addGroupActionPerformed addGroup(); }//GEN-LAST:event_addGroupActionPerformed private void deleteGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteGroupActionPerformed delGroup(); }//GEN-LAST:event_deleteGroupActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addGroup; private javax.swing.JButton addUser; private javax.swing.JComboBox addUserCombo; private javax.swing.JButton back; private javax.swing.JButton deleteGroup; private javax.swing.JList groups; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JList members; private javax.swing.JButton removeUser; // End of variables declaration//GEN-END:variables private class ListModel extends DefaultListModel { public ArrayList<String[]> fields = new ArrayList<String[]>(); } private ListModel groupsModel = new ListModel(), membersModel = new ListModel(); private void loadGroups() { groupsModel.clear(); groupsModel.fields.clear(); try { FileInputStream fis = new FileInputStream("/etc/group"); int len = fis.available(); byte buf[] = new byte[len]; int pos = 0; while (pos < len) { int read = fis.read(buf, pos, len-pos); if (read <= 0) throw new Exception("file error"); pos += read; } fis.close(); String group = new String(buf); String lns[] = group.split("\n"); for(int a=0;a<lns.length;a++) { String f[] = lns[a].split(":", -1); //0=group : 1=x : 2=gid : 3=users String u[] = f[3].split(","); groupsModel.addElement(f[0]); groupsModel.fields.add(f); } } catch (Exception e) { JFLog.log(e); } groups.repaint(); } private void loadGroup(int idx) { membersModel.clear(); if (idx == -1) return; String groupMembers[] = groupsModel.fields.get(idx)[3].split(","); for(int a=0;a < groupMembers.length;a++) { membersModel.addElement(groupMembers[a]); } members.repaint(); } private void loadUsers() { addUserCombo.removeAllItems(); try { FileInputStream fis = new FileInputStream("/etc/passwd"); int len = fis.available(); byte buf[] = new byte[len]; int pos = 0; while (pos < len) { int read = fis.read(buf, pos, len-pos); if (read <= 0) throw new Exception("file error"); pos += read; } fis.close(); String passwd = new String(buf); String lns[] = passwd.split("\n"); for(int a=0;a<lns.length;a++) { String f[] = lns[a].split(":", -1); //0=user : 1=x : 2=uid : 3=gid : 4=comment : 5=home : 6=shell if (f[0].equals("root")) continue; if (!f[6].equals("/bin/bash")) continue; addUserCombo.addItem(f[0]); } } catch (Exception e) { JFLog.log(e); } } /** Returns groups that user is in, excluding gidx.*/ private String getUserGroups(String userName, int gidx) { StringBuffer out = new StringBuffer(); for(int a=0;a<groupsModel.size();a++) { if (a == gidx) continue; //exclude deleted one String f[] = groupsModel.fields.get(a); boolean ok = false; for(int b=0;b<f.length;b++) { if (f[b].equals(userName)) {ok = true; break;} } if (ok) { if (out.length() > 0) out.append(","); out.append((String)groupsModel.getElementAt(a)); } } return out.toString(); } private void addGroup() { String name = JF.getString("Enter group name", ""); if ((name == null) || (name.trim().length() == 0)) return; name = name.trim(); ShellProcess sp = new ShellProcess(); ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("groupadd"); cmd.add(name); String output = sp.run(cmd, false); if (output == null) { JF.showError("Error", "Failed to exec groupadd."); } loadGroups(); } private void delGroup() { int idx = groups.getSelectedIndex(); if (idx == -1) return; String name = (String)groupsModel.getElementAt(idx); if (!JF.showConfirm("Confirm", "Are you sure you want to delete group '" + name + "'?")) return; ShellProcess sp = new ShellProcess(); ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("groupdel"); cmd.add(name); String output = sp.run(cmd, false); if (output == null) { JF.showError("Error", "Failed to exec groupdel."); } loadGroups(); } }