/* * Copyright (C) 2005-2008 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ifsoft.jmxweb.plugin; import org.jivesoftware.openfire.XMPPServer; import org.jivesoftware.openfire.container.Plugin; import org.jivesoftware.openfire.container.PluginManager; import org.jivesoftware.openfire.spi.ConnectionManagerImpl; import org.jivesoftware.util.*; import org.jivesoftware.openfire.http.HttpBindManager; import java.io.File; import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.jasper.servlet.JasperInitializer; import org.eclipse.jetty.plus.annotation.ContainerInitializer; import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.util.security.*; import org.eclipse.jetty.security.*; import org.eclipse.jetty.security.authentication.*; import java.io.File; import com.javamonitor.JmxHelper; import com.javamonitor.openfire.mbeans.CoreThreadPool; import com.javamonitor.openfire.mbeans.DatabasePool; import com.javamonitor.openfire.mbeans.Openfire; import com.javamonitor.openfire.mbeans.PacketCounter; import com.ifsoft.jmxweb.plugin.EmailScheduler; import org.apache.tomcat.InstanceManager; import org.apache.tomcat.SimpleInstanceManager; public class JmxWebPlugin implements Plugin { private static Logger Log = LoggerFactory.getLogger("JmxWebPlugin"); private static final String NAME = "jmxweb"; private static final String DESCRIPTION = "JmxWeb Plugin for Openfire"; private static final String NAMEBASE = "com.javamonitor.openfire.plugin:"; public final static String OBJECTNAME_OPENFIRE = NAMEBASE + "type=Openfire"; private Openfire openfire = null; private final static String OBJECTNAME_PACKET_COUNTER = NAMEBASE + "type=packetCounter"; private PacketCounter packetCounter = null; private final static String OBJECTNAME_CORE_CLIENT_THREADPOOL = NAMEBASE + "type=coreThreadpool,poolname=client"; private CoreThreadPool client = null; private final static String OBJECTNAME_DATABASEPOOL = NAMEBASE + "type=databasepool"; private DatabasePool database = null; private EmailScheduler emailScheduler = null; private WebAppContext context; private WebAppContext context2; public void initializePlugin(PluginManager manager, File pluginDirectory) { Log.info( "["+ NAME + "] initialize " + NAME + " plugin resources"); try { openfire = new Openfire(); openfire.start(); JmxHelper.register(openfire, OBJECTNAME_OPENFIRE); Log.info( "["+ NAME + "] .. started openfire server detector."); } catch (Exception e) { Log.debug("cannot start openfire server detector: " + e.getMessage(), e); } try { packetCounter = new PacketCounter(); packetCounter.start(); JmxHelper.register(packetCounter, OBJECTNAME_PACKET_COUNTER); Log.info( "["+ NAME + "] .. started stanza counter."); } catch (Exception e) { Log.debug("cannot start stanza counter: " + e.getMessage(), e); } try { client = new CoreThreadPool(((ConnectionManagerImpl) XMPPServer .getInstance().getConnectionManager()).getSocketAcceptor()); client.start(); JmxHelper.register(client, OBJECTNAME_CORE_CLIENT_THREADPOOL); Log.info( "["+ NAME + "] .. started client thread pool monitor."); } catch (Exception e) { Log.debug("cannot start client thread pool monitor: " + e.getMessage(), e); } try { database = new DatabasePool(); database.start(); JmxHelper.register(database, OBJECTNAME_DATABASEPOOL); Log.info( "["+ NAME + "] .. started database pool monitor."); } catch (Exception e) { Log.debug("cannot start database pool monitor: " + e.getMessage(), e); } try { try { Log.info( "["+ NAME + "] starting jolokia"); context = new WebAppContext(null, pluginDirectory.getPath(), "/jolokia"); final List<ContainerInitializer> initializers = new ArrayList<>(); initializers.add(new ContainerInitializer(new JasperInitializer(), null)); context.setAttribute("org.eclipse.jetty.containerInitializers", initializers); context.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); context.setWelcomeFiles(new String[]{"index.html"}); Log.info( "["+ NAME + "] starting hawtio"); context2 = new WebAppContext(null, pluginDirectory.getPath() + "/classes/hawtio", "/hawtio"); final List<ContainerInitializer> initializers2 = new ArrayList<>(); initializers2.add(new ContainerInitializer(new JasperInitializer(), null)); context2.setAttribute("org.eclipse.jetty.containerInitializers", initializers2); context2.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); context2.setWelcomeFiles(new String[]{"index.html"}); if (JiveGlobals.getBooleanProperty("xmpp.jmx.secure", true)) { SecurityHandler securityHandler = basicAuth("jmxweb"); if (securityHandler != null) context.setSecurityHandler(securityHandler); SecurityHandler securityHandler2 = basicAuth("jmxweb"); if (securityHandler2 != null) context2.setSecurityHandler(securityHandler2); } HttpBindManager.getInstance().addJettyHandler( context ); HttpBindManager.getInstance().addJettyHandler( context2 ); } catch(Exception e) { Log.error( "An error has occurred", e ); } } catch (Exception e) { Log.error("Error initializing JmxWeb Plugin", e); } if (JiveGlobals.getBooleanProperty("jmxweb.email.monitoring", true)) { Log.info( "["+ NAME + "] starting email monitoring"); emailScheduler = new EmailScheduler(); emailScheduler.startMonitoring(); Log.info( "["+ NAME + "] started monitoring"); } } public void destroyPlugin() { Log.info( "["+ NAME + "] destroy " + NAME + " plugin resources"); if (database != null) { database.stop(); JmxHelper.unregister(OBJECTNAME_DATABASEPOOL); } if (client != null) { client.stop(); JmxHelper.unregister(OBJECTNAME_CORE_CLIENT_THREADPOOL); } if (packetCounter != null) { packetCounter.stop(); JmxHelper.unregister(OBJECTNAME_PACKET_COUNTER); } if (openfire != null) { openfire.stop(); JmxHelper.unregister(OBJECTNAME_OPENFIRE); } if (emailScheduler != null) { emailScheduler.stopMonitoring(); } HttpBindManager.getInstance().removeJettyHandler( context ); HttpBindManager.getInstance().removeJettyHandler( context2 ); Log.info("["+ NAME + "] plugin fully destroyed."); } public String getName() { return NAME; } public String getDescription() { return DESCRIPTION; } private static final SecurityHandler basicAuth(String realm) { OpenfireLoginService l = new OpenfireLoginService(); l.setName(realm); Constraint constraint = new Constraint(); constraint.setName(Constraint.__BASIC_AUTH); constraint.setRoles(new String[]{"jmxweb"}); constraint.setAuthenticate(true); ConstraintMapping cm = new ConstraintMapping(); cm.setConstraint(constraint); cm.setPathSpec("/*"); ConstraintSecurityHandler csh = new ConstraintSecurityHandler(); csh.setAuthenticator(new BasicAuthenticator()); csh.setRealmName(realm); csh.addConstraintMapping(cm); csh.setLoginService(l); return csh; } }