package ch.rakudave.jnetmap.plugins;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import net.xeoh.plugins.base.annotations.PluginImplementation;
import ch.rakudave.jnetmap.model.Map;
import ch.rakudave.jnetmap.model.IF.NetworkIF;
import ch.rakudave.jnetmap.model.device.Device;
import ch.rakudave.jnetmap.model.device.DeviceEvent;
import ch.rakudave.jnetmap.model.device.DeviceEvent.Type;
import ch.rakudave.jnetmap.net.status.Status;
import ch.rakudave.jnetmap.util.Base64;
import ch.rakudave.jnetmap.util.DeviceEventFilter;
import ch.rakudave.jnetmap.util.IO;
import ch.rakudave.jnetmap.util.Icons;
import ch.rakudave.jnetmap.util.Lang;
import ch.rakudave.jnetmap.util.SwingHelper;
import ch.rakudave.jnetmap.util.logging.Logger;
import ch.rakudave.jnetmap.view.preferences.PreferencePanel;
@PluginImplementation
public class UbuntuNotifier implements Notifier {
private String name;
private DeviceEventFilter filter = new DeviceEventFilter();
@Override
public void statusChanged(DeviceEvent e, Map m) {
boolean match = filter.matches(e);
Logger.debug("Attempting to send ubuntu notification, filtered: " + !match);
if (!match) return;
Device d = e.getItem();
String icon = new File(IO.userDir, "cisco/"+d.getType().toString().toLowerCase()+".png").getAbsolutePath();
StringBuffer sb = new StringBuffer();
if (Type.INTERFACE_STATUS_CHANGED.equals(e.getType())) {
NetworkIF nif = (NetworkIF) e.getSubject();
sb.append(nif.getName()).append(" ");
sb.append(nif.getAddress()).append(": ");
sb.append(nif.getStatus().getMessage());
libnotify(new String[] {"notify-send", "-i", icon, sb.toString(), Lang.get("device")+": "+d.getName()});
} else {
for (Iterator<NetworkIF> it = d.getInterfaces().iterator(); it.hasNext();) {
formatIF(sb, (NetworkIF) it.next());
if (it.hasNext()) sb.append("\n");
}
libnotify(new String[] {"notify-send", "-i", icon, d.getName()+": "+d.getStatus().getMessage(), sb.toString()});
}
}
private void formatIF(StringBuffer sb, NetworkIF nif) {
if (sb == null || nif == null) return;
sb.append(nif.getName()).append(" ");
sb.append(nif.getAddress()).append(": ");
sb.append(nif.getStatus().getMessage());
}
public boolean libnotify(String[] commandAndArgs) {
Logger.trace("notify-send command: "+Arrays.toString(commandAndArgs));
Process process = null;
try {
process = Runtime.getRuntime().exec(commandAndArgs);
return process.waitFor() == 0;
} catch (Exception ex) {
Logger.warn("Unable to execute notify-send");
return false;
} finally {
if (process != null) process.destroy();
}
}
@SuppressWarnings("serial")
@Override
public void showPropertiesWindow(Frame owner, boolean isSetup) {
final JDialog d = new JDialog(owner, getPluginName() + " - " + name, ModalityType.DOCUMENT_MODAL);
d.setLayout(new BorderLayout(5, 5));
final JTextField nameField = new JTextField(name);
JPanel notifyWrapper = new JPanel(new GridLayout(0, 2, 5, 5));;
JLabel notifyCheck = new JLabel();
JButton notifyTest = new JButton(new AbstractAction("Test") {
@Override
public void actionPerformed(ActionEvent e) {
String icon = new File(IO.userDir, "cisco/"+Device.Type.Workstation.toString().toLowerCase()+".png").getAbsolutePath();
libnotify(new String[] {"notify-send", "-i", icon,
"test_device: "+Status.UP.getMessage(), "eth0 /127.0.0.1: "+Status.UP.getMessage()});
}
});
if (libnotify(new String[] {"notify-send", "--version"})) {
notifyCheck.setText("libnotify-bin is installed");
notifyCheck.setIcon(Icons.get("ok"));
} else {
notifyCheck.setText("libnotify-bin not installed");
notifyCheck.setIcon(Icons.get("cancel"));
notifyTest.setEnabled(false);
}
notifyWrapper.add(notifyCheck);
notifyWrapper.add(notifyTest);
JPanel centerWrapper = new JPanel();
centerWrapper.setLayout(new BoxLayout(centerWrapper, BoxLayout.PAGE_AXIS));
centerWrapper.add(notifyWrapper);
centerWrapper.add(filter.settingsPanel());
JPanel bottomRow = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
JButton cancel = new JButton(Lang.get("action.cancel"), Icons.get("cancel"));
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
d.dispose();
}
});
JButton ok = new JButton(Lang.get("action.ok"), Icons.get("ok"));
ok.setPreferredSize(cancel.getPreferredSize());
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
name = nameField.getText();
d.dispose();
}
});
if (!isSetup)
bottomRow.add(cancel);
bottomRow.add(ok);
d.add(nameField, BorderLayout.NORTH);
d.add(centerWrapper, BorderLayout.CENTER);
d.add(bottomRow, BorderLayout.SOUTH);
d.pack();
SwingHelper.centerTo(owner, d);
d.setVisible(true);
}
@Override
public String getName() {
return name;
}
@Override
public String getPluginName() {
return "Ubuntu Notify";
}
@Override
public String getAuthor() {
return "rakudave";
}
@Override
public String getDescription() {
return "Shows a desktop-notification when a device/interface changes its status";
}
@Override
public Icon getIcon() {
try {
return new ImageIcon(Base64.decode("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGjSURBVDiNldM/aJNRFAXw36ttINEgYtNYUCeHuhSHUHBTHKRpKQ4ODqKDUUQQBwcXHcRRQXARtIMFnZVS08HRQYhxEUERwaXQprFYrHTQmueQr6T1q9VeePDuv/PuO5cTYoz+12qh2I/JxB0bio3Z7r9WV3LHcRcHsYTb5OdQSipG8bAr1VgtrBa8wZ7knseFnmxrGvXkTEFY94XnhREhPCOUlRsvVHKXcW8N/JNkqu/YaXy51gGYLOT1hM+i3Xgv1xz0OBuxA3txCmewPwH7goEOQLV4kXg/STb8+DngxNfFP3g5gLfIJpGbXSq5fpXceVPfpvAIRNdSzTC+/Ak31kRGQjyXfa3NbN3J7ae1wgfh1z7DCzMpgA0svYUtWjfGMCoTp7XCLdDadgwTGzXUQvEq7iRufUsk1kIxReKma6wd7fvnGjscjDWXtOJZrBCuOBJXcAmLeIfreKlN+ABGhmJjIaTEVC2UlJv1Wij24iN2JZmZQxPxcKbX09Unledn01soN+vJbRCvMKctpgeZXsPJBCVtMUlPsJlV+9bJWXl+9jfNJZmRyWDNXwAAAABJRU5ErkJggg=="));
} catch (IOException e) {
return Icons.get("plugin");
}
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public PreferencePanel getSettingsPanel() {
return null;
}
@Override
public Notifier create() {
return new UbuntuNotifier();
}
}