/* * Copyright 2009 NCHOVY * * 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 org.krakenapps.syslog.impl; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.charset.Charset; import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.UnsupportedCharsetException; import org.krakenapps.api.Script; import org.krakenapps.api.ScriptArgument; import org.krakenapps.api.ScriptContext; import org.krakenapps.api.ScriptUsage; import org.krakenapps.syslog.SyslogProfile; import org.krakenapps.syslog.SyslogServer; import org.krakenapps.syslog.SyslogServerRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SyslogScript implements Script { private final Logger logger = LoggerFactory.getLogger(SyslogScript.class.getName()); private ScriptContext context; private SyslogServerRegistry syslogRegistry; public SyslogScript(SyslogServerRegistry syslogRegistry) { this.syslogRegistry = syslogRegistry; } @Override public void setScriptContext(ScriptContext context) { this.context = context; } public void servers(String[] args) { context.println("Syslog Servers"); context.println("----------------"); for (String name : syslogRegistry.getNames()) { SyslogServer server = syslogRegistry.getServer(name); context.println(server); } } @ScriptUsage(description = "open persistent syslog server", arguments = { @ScriptArgument(name = "server name", type = "string", description = "unique server name"), @ScriptArgument(name = "port", type = "int", description = "syslog port number", optional = true), @ScriptArgument(name = "address", type = "string", description = "syslog bind address. 0.0.0.0 by default", optional = true), @ScriptArgument(name = "charset", type = "string", description = "character set name. utf-8 by default", optional = true), @ScriptArgument(name = "queue size", type = "int", description = "buffering queue size. 20000 by default", optional = true) }) public void open(String[] args) { SyslogProfile profile = new SyslogProfile(); try { String name = args[0]; if (syslogRegistry.getServer(name) != null) { context.println("duplicated name. use other name."); return; } int port = 514; if (args.length > 1) port = Integer.valueOf(args[1]); String host = "0.0.0.0"; if (args.length > 2) host = args[2]; String charsetName = "utf-8"; if (args.length > 3) charsetName = args[3]; int queueSize = 20000; if (args.length > 4) queueSize = Integer.valueOf(args[4]); InetAddress.getByName(host); if (port < 1 || port > 65535) { context.println("invalid port number."); return; } // check charset Charset.forName(charsetName); profile.setName(name); profile.setAddress(host); profile.setPort(port); profile.setCharset(charsetName); profile.setQueueSize(queueSize); syslogRegistry.open(profile); context.println("opened " + profile.getListenAddress()); } catch (UnknownHostException e) { context.println("invalid syslog bind address."); } catch (NumberFormatException e) { context.println("invalid port format. integer required."); } catch (IllegalCharsetNameException e) { context.println("illegal charset name."); } catch (UnsupportedCharsetException e) { context.println("unsupported charset name."); } catch (IllegalThreadStateException e) { context.println("thread already started."); } catch (SocketException e) { context.println("cannot open server: " + e.getMessage()); logger.error("kraken syslog: cannot open server with " + profile, e); } } @ScriptUsage(description = "close syslog server", arguments = { @ScriptArgument(name = "server name", type = "string", description = "the name of syslog server instance") }) public void close(String[] args) { String name = args[0]; SyslogServer server = syslogRegistry.getServer(name); if (server == null) { context.println("server not found"); return; } syslogRegistry.close(name); context.println("closed"); } @ScriptUsage(description = "trace a syslog receiver.", arguments = { @ScriptArgument(name = "server name", type = "string", description = "the name of syslog server instance") }) public void trace(String[] args) { String name = args[0]; SyslogServer server = syslogRegistry.getServer(name); if (server == null) { context.println("server not found."); return; } SyslogTracer tracer = new SyslogTracer(); tracer.setScriptContext(context); server.addListener(tracer); context.println("press ctrl-c to stop"); context.println("------------------------"); try { while (true) { context.readLine(); } } catch (InterruptedException e) { context.println("interrupted"); } finally { server.removeListener(tracer); } } }