Package ch.rakudave.jnetmap.plugins

Source Code of ch.rakudave.jnetmap.plugins.UbuntuNotifier

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();
  }
}
TOP

Related Classes of ch.rakudave.jnetmap.plugins.UbuntuNotifier

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.