/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.plugins.platform;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.event.Event;
import org.rhq.core.pluginapi.inventory.ResourceContext;
/**
* Listens for syslog messages coming in over a socket.
*
* @author Greg Hinkle
* @author John Mazzitelli
*/
public class SyslogListenerEventLogDelegate extends SyslogProcessor implements Runnable {
private final Log log = LogFactory.getLog(SyslogListenerEventLogDelegate.class);
private String host;
private int port;
private ServerSocket serverSocket;
private Thread thread;
private boolean run = true;
public SyslogListenerEventLogDelegate(ResourceContext resourceContext, PropertyMap logProperties) {
super(resourceContext, logProperties, "port#" + getPortFromPropertyMap(logProperties));
this.host = logProperties.getSimpleValue(LinuxPlatformComponent.PLUGIN_CONFIG_EVENT_TRACKING_BIND_ADDR,
"127.0.0.1");
this.port = getPortFromPropertyMap(logProperties);
try {
this.thread = new Thread(this, "Syslog Listener-" + this.host + ':' + this.port);
this.thread.setDaemon(true);
this.serverSocket = new ServerSocket(this.port, 100, InetAddress.getByName(this.host));
} catch (Exception e) {
throw new RuntimeException("Failed attempt to bind syslog listener.", e);
}
this.thread.start();
return;
}
private static Integer getPortFromPropertyMap(PropertyMap logProperties) {
return logProperties.getSimple(LinuxPlatformComponent.PLUGIN_CONFIG_EVENT_TRACKING_PORT).getIntegerValue();
}
public void run() {
while (this.run) {
try {
Socket socket = this.serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = reader.readLine(); // prime the pump and read the first line
try {
while (this.run && line != null) {
Event e = convertLine(line);
if (e != null) {
getEventContext().publishEvent(e);
}
line = reader.readLine(); // read the next line
}
} finally {
try {
socket.close(); // closes the input stream too
} catch (Throwable t) {
log.debug("Failed to close syslog input socket stream: " + t);
}
}
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug("Failed to read syslog message: " + e);
}
}
}
return;
}
public void shutdown() {
this.run = false;
this.thread.interrupt();
try {
this.serverSocket.close();
} catch (Throwable t) {
log.warn("Failed to close syslog listener server socket: " + t);
}
return;
}
}