/**
* Created : Mar 31, 2012
*
* @author pquiring
*
* BUG : Currently the check-boxes don't do anything.
*
*/
import javax.swing.table.*;
import javaforce.*;
import javaforce.jbus.*;
import javaforce.linux.*;
public class MainPanel extends javax.swing.JPanel {
/**
* Creates new form MainPanel
*/
public MainPanel() {
initComponents();
Linux.detectDistro();
if (Linux.distro == Linux.DistroTypes.Unknown) {
JF.showError("Error", "Unsupported distro");
System.exit(0);
}
if (Linux.distro == Linux.DistroTypes.Fedora) {
upgradeAll.setVisible(false);
}
new Thread() {
public void run() {
listUpgrades();
}
}.start();
}
/**
* 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() {
jScrollPane1 = new javax.swing.JScrollPane();
packages = new javax.swing.JTable();
upgrade = new javax.swing.JButton();
check = new javax.swing.JButton();
progress = new javax.swing.JProgressBar();
status = new javax.swing.JTextField();
upgradeAll = new javax.swing.JCheckBox();
packages.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"upgrade", "package", "desc"
}
) {
Class[] types = new Class [] {
java.lang.Boolean.class, java.lang.String.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
true, false, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jScrollPane1.setViewportView(packages);
packages.getColumnModel().getColumn(0).setPreferredWidth(20);
packages.getColumnModel().getColumn(1).setPreferredWidth(20);
packages.getColumnModel().getColumn(2).setPreferredWidth(300);
upgrade.setText("Upgrade");
upgrade.setEnabled(false);
upgrade.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
upgradeActionPerformed(evt);
}
});
check.setText("Check");
check.setEnabled(false);
check.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkActionPerformed(evt);
}
});
status.setEditable(false);
upgradeAll.setText("Upgrade kept back");
upgradeAll.setEnabled(false);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(progress, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 613, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(upgradeAll)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(check)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(upgrade))
.addComponent(status))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 689, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(progress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(status, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(upgrade)
.addComponent(check)
.addComponent(upgradeAll))
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void checkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkActionPerformed
new Thread() {
public void run() {
check();
}
}.start();
}//GEN-LAST:event_checkActionPerformed
private void upgradeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upgradeActionPerformed
new Thread() {
public void run() {
upgrade();
}
}.start();
}//GEN-LAST:event_upgradeActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton check;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable packages;
private javax.swing.JProgressBar progress;
private javax.swing.JTextField status;
private javax.swing.JButton upgrade;
private javax.swing.JCheckBox upgradeAll;
// End of variables declaration//GEN-END:variables
private final int NA = 0;
private final int SHOULD = 1;
private final int MUST = 2;
private Object needReboot[][] = {
{"linux-headers-.+", SHOULD},
{"linux-image-.+", SHOULD},
{"jdesktop", MUST},
{"jlogon", MUST},
};
private void listUpgrades() {
progress.setIndeterminate(true);
status.setText("Getting list of available upgrades...");
switch (Linux.distro) {
case Ubuntu:
ubuntu_listUpgrades();
break;
case Fedora:
fedora_listUpgrades();
break;
}
progress.setIndeterminate(false);
}
private void ubuntu_listUpgrades() {
upgradeAll.setSelected(false);
upgradeAll.setEnabled(false);
ShellProcess sp = new ShellProcess();
sp.removeEnvironmentVariable("TERM");
sp.addEnvironmentVariable("DEBIAN_FRONTEND", "noninteractive");
String output = sp.run(new String[] {"sudo", "-E", "apt-get", "--yes", "upgrade", "-s"}, false);
String lns[] = output.split("\n");
int keptBack = -1;
int upgrades = -1;
int cnts = -1;
for(int a=0;a<lns.length;a++) {
if (lns[a].startsWith("The following packages have been kept back")) {
keptBack = a+1;
continue;
}
if (lns[a].startsWith("The following packages will be upgraded")) {
upgrades = a+1;
continue;
}
if (lns[a].indexOf("upgraded") != -1 && lns[a].indexOf("newly installed") != -1 && lns[a].indexOf("to remove") != -1) {
cnts = a;
continue;
}
}
if (cnts == -1) {
status.setText("Error:Counts not found");
return;
}
int i1 = lns[cnts].indexOf("and");
int i2 = lns[cnts].indexOf("not");
int notUpgradedCnt = JF.atoi(lns[cnts].substring(i1+3, i2).trim());
int i3 = lns[cnts].indexOf(" ");
int upgradedCnt = JF.atoi(lns[cnts].substring(0, i3));
String str = "" + upgradedCnt + " upgrades available\n";
if (notUpgradedCnt > 0) {
str += " (" + notUpgradedCnt + " kept back)\n";
upgradeAll.setEnabled(true);
}
status.setText(str);
DefaultTableModel model = (DefaultTableModel)packages.getModel();
model.setRowCount(0);
if (upgrades != -1) {
for(int a=upgrades;a<cnts;a++) {
String pkgs[] = lns[a].trim().split(" ");
for(int b=0;b<pkgs.length;b++) {
model.addRow(new Object[] {true, pkgs[b], Linux.getPackageDesc(pkgs[b])});
}
}
}
check.setEnabled(true);
upgrade.setEnabled(true);
sendCounts(upgradedCnt);
}
private void fedora_listUpgrades() {
upgradeAll.setSelected(false);
upgradeAll.setEnabled(false);
ShellProcess sp = new ShellProcess();
sp.removeEnvironmentVariable("TERM");
String output = sp.run(new String[] {"sudo", "-E", "yum", "--assumeno", "update"}, false);
String lns[] = output.split("\n");
int end = -1;
int cnts = -1;
boolean summary = false;
for(int a=0;a<lns.length;a++) {
if (lns[a].startsWith("Transaction Summary")) {
end = a-1;
summary = true;
}
if (!summary) continue;
if (lns[a].startsWith("Upgrade")) {
cnts = a;
}
}
if (cnts == -1) {
status.setText("No Updates found");
check.setEnabled(true);
return;
}
String f[] = lns[cnts].split(" +"); //greedy spaces
int upgradedCnt = JF.atoi(f[1]);
String str = "" + upgradedCnt + " upgrades available\n";
status.setText(str);
DefaultTableModel model = (DefaultTableModel)packages.getModel();
model.setRowCount(0);
boolean installing = false, updating = false;
for(int a=0;a<end;a++) {
if (lns[a].length() == 0) continue;
if (lns[a].startsWith("Installing:")) {installing = true; continue;} //these are dependancies to updates (ignored)
if (lns[a].startsWith("Installing for dependencies:")) {installing = true; continue;} //these are dependancies to updates (ignored)
if (lns[a].startsWith("Updating:")) {updating = true; continue;}
if (lns[a].startsWith("Transaction Summary")) break;
if (!updating) continue;
if (lns[a].startsWith(" ")) continue; //continuation from last line
String pkgs[] = lns[a].trim().split(" +"); //greedy spaces
if (pkgs[0].trim().length() == 0) continue;
model.addRow(new Object[] {true, pkgs[0], Linux.getPackageDesc(pkgs[0])});
}
check.setEnabled(true);
upgrade.setEnabled(true);
sendCounts(upgradedCnt);
}
private void check() {
progress.setIndeterminate(true);
status.setText("Checking for upgrades...");
switch (Linux.distro) {
case Ubuntu:
ubuntu_check();
break;
case Fedora:
fedora_check();
break;
}
progress.setIndeterminate(false);
}
private void ubuntu_check() {
check.setEnabled(false);
upgrade.setEnabled(false);
ShellProcess sp = new ShellProcess();
sp.removeEnvironmentVariable("TERM");
sp.addEnvironmentVariable("DEBIAN_FRONTEND", "noninteractive");
String output = sp.run(new String[] {"sudo", "-E", "apt-get", "--yes", "update"}, true);
if (output == null) {
JF.showError("Error", "Failed to exec apt-get");
check.setEnabled(true);
upgrade.setEnabled(true);
} else {
listUpgrades();
}
}
private void fedora_check() {
check.setEnabled(false);
upgrade.setEnabled(false);
ShellProcess sp = new ShellProcess();
sp.removeEnvironmentVariable("TERM");
String output = sp.run(new String[] {"sudo", "-E", "yum", "-y", "check-update", null}, false);
if (output == null) {
JF.showError("Error", "Failed to exec yum");
check.setEnabled(true);
upgrade.setEnabled(true);
} else {
listUpgrades();
}
}
private void upgrade() {
progress.setIndeterminate(true);
status.setText("Upgrading packages...");
boolean ok = false;
int action = NA;
for(int a=0;a<packages.getRowCount();a++) {
for(int b=0;b<needReboot.length;b++) {
if (((String)needReboot[b][0]).matches((String)packages.getValueAt(a, 1))) {
int value = (Integer)needReboot[b][1];
if (value > action) action = value;
}
}
}
switch (Linux.distro) {
case Ubuntu:
ok = ubuntu_upgrade();
break;
case Fedora:
ok = fedora_upgrade();
break;
}
progress.setIndeterminate(false);
ShellProcess sp = new ShellProcess();
if (ok) {
switch (action) {
case NA:
break;
case SHOULD:
if (JF.showConfirm("Notice", "An important package was upgraded, you SHOULD reboot now. Close all other apps before accepted")) {
sp.run(new String[] {"sudo", "reboot"}, false);
}
break;
case MUST:
JF.showMessage("Notice", "A critical package was upgraded, you MUST reboot now. Close all other apps and press OK");
sp.run(new String[] {"sudo", "reboot"}, false);
}
}
}
private boolean ubuntu_upgrade() {
check.setEnabled(false);
upgrade.setEnabled(false);
ShellProcess sp = new ShellProcess();
sp.removeEnvironmentVariable("TERM");
sp.addEnvironmentVariable("DEBIAN_FRONTEND", "noninteractive");
sp.run(new String[] {"sudo", "-E", "apt-get", "--yes", (upgradeAll.isSelected() ? "dist-upgrade" : "upgrade")}, true);
if (sp.getErrorLevel() != 0) {
JF.showError("Error", "Failed to exec apt-get");
check.setEnabled(true);
upgrade.setEnabled(true);
return false;
} else {
sp.run(new String[] {"sudo", "rm", "/etc/upgrade.cnts"}, true);
check();
return true;
}
}
private boolean fedora_upgrade() {
check.setEnabled(false);
upgrade.setEnabled(false);
ShellProcess sp = new ShellProcess();
sp.removeEnvironmentVariable("TERM");
String output = sp.run(new String[] {"sudo", "-E", "yum", "-y", "update", null}, false);
/*
//TODO - get status code ??? assume ok for now
if (sp.getErrorLevel() != 0) {
JF.showError("Error", "Failed to exec yum");
check.setEnabled(true);
upgrade.setEnabled(true);
return false;
} else {*/
sp.run(new String[] {"sudo", "rm", "/etc/upgrade.cnts"}, true);
check();
return true;
// }
}
private static void sendCounts(int upgrade) {
JBusClient client = new JBusClient(null, null);
client.start();
client.call("org.jflinux.jfsystemmgr", "upgradesAvailable", "" + upgrade);
client.close();
}
}