package jfparted; /** * * Created : Apr 13, 2012 * * @author pquiring */ import java.io.*; import javax.swing.table.*; import java.util.*; import javaforce.*; public class PartitionEditorPanel extends IPanel { /** * Creates new form Partition */ public PartitionEditorPanel(boolean mountNow) { initComponents(); tableModel = (DefaultTableModel)table.getModel(); this.mountNow = mountNow; showPartitions(); } /** * 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(); add = new javax.swing.JButton(); delete = new javax.swing.JButton(); change = new javax.swing.JButton(); rescan = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); image = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); add.setText("Add"); add.setFocusable(false); add.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); add.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); add.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addActionPerformed(evt); } }); jToolBar1.add(add); delete.setText("Delete"); delete.setFocusable(false); delete.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); delete.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); delete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteActionPerformed(evt); } }); jToolBar1.add(delete); change.setText("Change"); change.setFocusable(false); change.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); change.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); change.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { changeActionPerformed(evt); } }); jToolBar1.add(change); rescan.setText("Rescan"); rescan.setFocusable(false); rescan.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); rescan.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); rescan.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { rescanActionPerformed(evt); } }); jToolBar1.add(rescan); jLabel1.setFont(new java.awt.Font("Ubuntu", 0, 12)); // NOI18N jLabel1.setText("Note : All operations are applied instantly."); jToolBar1.add(jLabel1); image.setLayout(new java.awt.GridLayout(1, 0)); table.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Device", "Type", "Moint Point", "Size" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); table.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { tableMouseClicked(evt); } }); table.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { tableKeyTyped(evt); } }); jScrollPane1.setViewportView(table); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jToolBar1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 666, Short.MAX_VALUE) .addComponent(jScrollPane1)) .addContainerGap()) .addComponent(image, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(image, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 335, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void addActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addActionPerformed addPart(); }//GEN-LAST:event_addActionPerformed private void deleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteActionPerformed deletePart(); }//GEN-LAST:event_deleteActionPerformed private void changeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_changeActionPerformed changePart(); }//GEN-LAST:event_changeActionPerformed private void tableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableMouseClicked updateDeviceImage(); }//GEN-LAST:event_tableMouseClicked private void tableKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tableKeyTyped updateDeviceImage(); }//GEN-LAST:event_tableKeyTyped private void rescanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rescanActionPerformed showPartitions(); }//GEN-LAST:event_rescanActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton add; private javax.swing.JButton change; private javax.swing.JButton delete; private javax.swing.JPanel image; private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JButton rescan; private javax.swing.JTable table; // End of variables declaration//GEN-END:variables private DefaultTableModel tableModel; private ArrayList<Object> rows; private ArrayList<Data.Device> devices2; private boolean mountNow; //Device, Type(filesys), MountPoint, Size public void showPartitions() { Data.getDevices(); for(int idx=0;idx<Data.devices.size();idx++) { if (Data.devices.get(idx).uninit) { if (JF.showConfirm("Warning", "Device " + Data.devices.get(idx).dev + " needs a partition table.\rCreate it now?")) { Data.createPartTable(Data.devices.get(idx).dev); showPartitions(); } return; } } Data.getPartitions(); String mounts[] = null; if (mountNow) { ShellProcess sp = new ShellProcess(); String output = sp.run(new String[] {"mount"}, false); mounts = output.split("\n"); } while (tableModel.getRowCount() > 0) tableModel.removeRow(0); rows = new ArrayList<Object>(); for(int d=0;d<Data.devices.size();d++) { Data.Device device = Data.devices.get(d); tableModel.addRow(new Object[] {device.dev,"","",device.size}); rows.add(device); for(int p=0;p<device.parts.size();p++) { Data.Partition part = device.parts.get(p); if ((part.number != -1) && (devices2 != null)) { //copy over mount points for(int d2=0;d2<devices2.size();d2++) { Data.Device device2 = devices2.get(d2); for(int p2=0;p2<device2.parts.size();p2++) { Data.Partition part2 = device2.parts.get(p2); if ((part.device.dev + part.device).equals(part2.device.dev + part2.number)) { part.mount = part2.mount; } } } } if ((mountNow) && (part.number != -1)) { for(int m=0;m<mounts.length;m++) { String f[] = mounts[m].split(" "); if (f.length != 6) continue; //0=dev 1="on" 2=mount 3="type" 4=fstype 5=options if (f[0].equals(part.device.dev + part.number)) { part.mount = f[2]; } } } tableModel.addRow( new Object[] {(part.number == -1) ? "" : part.device.dev + part.number, part.filesys,part.mount,part.size}); rows.add(part); } } devices2 = Data.devices; //backup for next rescan } public void showDeviceImage(Data.Device device) { try { DeviceImage di = new DeviceImage(device); image.add(di); image.revalidate(); image.repaint(); } catch (Exception e) { e.printStackTrace(); } } private void updateDeviceImage() { image.removeAll(); if (table.getSelectedRowCount() != 1) return; int idx = table.getSelectedRow(); while (idx >= 0) { Object obj = rows.get(idx); if (obj instanceof Data.Device) { showDeviceImage((Data.Device)obj); return; } idx--; } } private void addPart() { if (table.getSelectedRowCount() != 1) return; int idx = table.getSelectedRow(); Object obj = rows.get(idx); if (obj instanceof Data.Device) return; Data.Partition part = (Data.Partition)obj; if (part.number != -1) return; String orgMountPoint = part.mount; ModifyPartition dialog = new ModifyPartition(null, true, part, false, mountNow); dialog.setVisible(true); if (!dialog.accepted) return; if (!Data.createPart(part.device, dialog.gettype(), dialog.getfilesys(), dialog.getstart(), dialog.getend())) { JF.showError("Error", "Failed to create Partition"); } String mount = dialog.getmount(); if (mount.equals("none")) mount = ""; part.mount = ""; for(int d=0;d<Data.devices.size();d++) { Data.Device device = Data.devices.get(d); for(int p=0;p<device.parts.size();p++) { Data.Partition part2 = device.parts.get(p); if (part2.number == -1) continue; if (part2.mount.length() == 0) continue; if (part2.mount.equals(mount)) { JF.showError("Warning", "That mount point is already in use"); mount = ""; } } } part.mount = mount; part.filesys = dialog.getfilesys(); part.label = dialog.getlabel(); if (dialog.getformat()) { formatPart(part, orgMountPoint); } if (mountNow) { if (!mount(orgMountPoint, part)) JF.showError("Warning", "Failed to update mount point"); } showPartitions(); //rescan if (mountNow) { if (dialog.getgenfstab()) genfstab(); } } private boolean mount(String orgMountPoint, Data.Partition part) { if (orgMountPoint.equals(part.mount)) return true; if (orgMountPoint.length() > 0) { //try to unmount it ShellProcess sp = new ShellProcess(); sp.run(new String[] {"sudo", "umount", part.device.dev + part.number}, false); if (sp.getErrorLevel() > 0) return false; } if (part.mount.length() == 0) return true; ShellProcess sp = new ShellProcess(); sp.run(new String[] {"sudo", "mount", part.device.dev + part.number, part.mount}, false); if (sp.getErrorLevel() > 0) return false; return true; } private void deletePart() { if (table.getSelectedRowCount() != 1) return; int idx = table.getSelectedRow(); Object obj = rows.get(idx); if (obj instanceof Data.Device) return; Data.Partition part = (Data.Partition)obj; if (part.number == -1) return; //can not delete if ((mountNow) && (part.mount.length() > 0)) { JF.showError("Error", "Unmount partition first"); return; } if (!JF.showConfirm("Confirm", "Are you sure you want to delete '" + part.device.dev + part.number + "' ?" + "\nThis action will be performed now and can not be undone.")) return; if (!Data.deletePart(part)) { JF.showError("Error", "Failed to delete Partition"); } showPartitions(); //rescan } private void changePart() { if (table.getSelectedRowCount() != 1) return; int idx = table.getSelectedRow(); Object obj = rows.get(idx); if (obj instanceof Data.Device) return; Data.Partition part = (Data.Partition)obj; if (part.number == -1) return; //can not modify String orgMountPoint = part.mount; ModifyPartition dialog = new ModifyPartition(null, true, part, true, mountNow); dialog.setVisible(true); if (!dialog.accepted) return; String mount = dialog.getmount(); if (mount.equals("none")) mount = ""; part.mount = ""; for(int d=0;d<Data.devices.size();d++) { Data.Device device = Data.devices.get(d); for(int p=0;p<device.parts.size();p++) { Data.Partition part2 = device.parts.get(p); if (part2.number == -1) continue; if (part2.mount.length() == 0) continue; if (part2.mount.equals(mount)) { JF.showError("Warning", "That mount point is already in use"); mount = ""; } } } part.mount = mount; part.filesys = dialog.getfilesys(); part.label = dialog.getlabel(); if (dialog.getformat()) { formatPart(part, orgMountPoint); } if (mountNow) { if (!mount(orgMountPoint, part)) JF.showError("Warning", "Failed to update mount point"); } showPartitions(); //rescan if (mountNow) { if (dialog.getgenfstab()) genfstab(); } } private void formatPart(Data.Partition part, String orgMountPoint) { JFLog.log("formatPart:" + part.device.dev + part.number + " with " + part.filesys); JFTask task = new JFTask() { private Data.Partition part; private int total = 25, done = 0; public boolean work() { this.part = (Data.Partition)this.getProperty("part"); this.setLabel("Formating partition..."); boolean status = Data.format(part, this); setProgress(100); if (!status) { setLabel("Error : Failed to format parition"); } else { setLabel("Success : Partition formatted"); } return status; } public void shellProcessOutput(String str) { JFLog.log(str); done += str.split("\n").length - 1; if (done > total) total += 25; setProgress(done * 100 / total); } }; task.setProperty("part", part); ProgressDialog dialog = new ProgressDialog(null, true, task); dialog.setVisible(true); if (!dialog.getStatus()) { JF.showError("Error", "Failed to format partition"); return; } if (mountNow) { if (!mount(orgMountPoint, part)) JF.showError("Warning", "Failed to update mount point"); } } private boolean genfstab() { //generate fstab records Data.clearfstab(); for(int d=0;d<Data.devices.size();d++) { Data.Device device = Data.devices.get(d); for(int p=0;p<device.parts.size();p++) { Data.Partition part = device.parts.get(p); if (part.number != -1) { if (part.mount.length() == 0) continue; if (part.mount.equals("/")) { Data.root = part; Data.addfstab(part.device.dev + part.number, part.mount, part.filesys, "errors=remount-ro", 0, 1); } else if (part.mount.equals("swap")) { Data.swap = part; part.mount = "none"; Data.addfstab(part.device.dev + part.number, part.mount, part.filesys, "sw", 0, 0); } else { Data.addfstab(part.device.dev + part.number, part.mount, part.filesys, "rw", 0, 0); } } } } try { File tmpFile = new File("/tmp/fstab"); FileOutputStream fos = new FileOutputStream(tmpFile); fos.write("#fstab generated by jinstall\n".getBytes()); for(int a=0;a<Data.fstab.size();a++) { fos.write((Data.fstab.get(a) + "\n").getBytes()); } fos.close(); ShellProcess sp = new ShellProcess(); ArrayList<String> cmd = new ArrayList<String>(); cmd.add("sudo"); cmd.add("cp"); cmd.add("/tmp/fstab"); cmd.add("/mnt/install/etc/fstab"); String output = sp.run(cmd, false); if ((output == null) || (sp.getErrorLevel() != 0)) { JFLog.log("ErrorLevel=" + sp.getErrorLevel()); return false; } tmpFile.delete(); } catch (Exception e) { JFLog.log(e); return false; } return true; } //these methods are overridden in jinstall.CustomPartitioning public IPanel next() { return null; } public IPanel prev() { return null; } public IPanel getThis() { return this; } }