/* * JBoss, Home of Professional Open Source. * Copyright 2013, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.logging; import static org.jboss.as.logging.CommonAttributes.ENABLED; import static org.jboss.as.logging.CommonAttributes.LEVEL; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.DefaultAttributeMarshaller; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.operations.validation.EnumValidator; import org.jboss.as.controller.operations.validation.IntRangeValidator; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder; import org.jboss.as.logging.HandlerOperations.HandlerAddOperationStepHandler; import org.jboss.as.logging.HandlerOperations.LogHandlerWriteAttributeHandler; import org.jboss.as.logging.resolvers.ModelNodeResolver; import org.jboss.as.logging.validators.Validators; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; import org.jboss.logmanager.handlers.SyslogHandler; import org.jboss.logmanager.handlers.SyslogHandler.Facility; import org.jboss.logmanager.handlers.SyslogHandler.SyslogType; /** * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ class SyslogHandlerResourceDefinition extends TransformerResourceDefinition { static final String SYSLOG_HANDLER = "syslog-handler"; static final PathElement SYSLOG_HANDLER_PATH = PathElement.pathElement(SYSLOG_HANDLER); static final PropertyAttributeDefinition APP_NAME = PropertyAttributeDefinition.Builder.of("app-name", ModelType.STRING, true) .setAllowExpression(true) .setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER) .setPropertyName("appName") .setValidator(Validators.NOT_EMPTY_NULLABLE_STRING_VALIDATOR) .build(); static final PropertyAttributeDefinition FACILITY = PropertyAttributeDefinition.Builder.of("facility", ModelType.STRING, true) .setAllowExpression(true) .setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER) .setDefaultValue(new ModelNode(FacilityAttribute.USER_LEVEL.toString())) .setResolver(FacilityResolver.INSTANCE) .setValidator(EnumValidator.create(FacilityAttribute.class, true, true)) .build(); static final PropertyAttributeDefinition HOSTNAME = PropertyAttributeDefinition.Builder.of("hostname", ModelType.STRING, true) .setAllowExpression(true) .setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER) .setValidator(Validators.NOT_EMPTY_NULLABLE_STRING_VALIDATOR) .build(); static final PropertyAttributeDefinition PORT = PropertyAttributeDefinition.Builder.of("port", ModelType.INT, true) .setAllowExpression(true) .setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER) .setDefaultValue(new ModelNode(514)) .setValidator(new IntRangeValidator(0, 65535, true, true)) .build(); static final PropertyAttributeDefinition SERVER_ADDRESS = PropertyAttributeDefinition.Builder.of("server-address", ModelType.STRING, true) .setAllowExpression(true) .setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER) .setDefaultValue(new ModelNode("localhost")) .setPropertyName("serverHostname") .setValidator(Validators.NOT_EMPTY_NULLABLE_STRING_VALIDATOR) .build(); static final PropertyAttributeDefinition SYSLOG_FORMATTER = PropertyAttributeDefinition.Builder.of("syslog-format", ModelType.STRING, true) .setAllowExpression(true) .setAttributeMarshaller(new DefaultAttributeMarshaller() { @Override public void marshallAsElement(final AttributeDefinition attribute, final ModelNode resourceModel, final boolean marshallDefault, final XMLStreamWriter writer) throws XMLStreamException { if (isMarshallable(attribute, resourceModel, marshallDefault)) { writer.writeStartElement(AbstractHandlerDefinition.FORMATTER.getXmlName()); writer.writeStartElement(attribute.getXmlName()); final String content = resourceModel.get(attribute.getName()).asString(); writer.writeAttribute(Attribute.SYSLOG_TYPE.getLocalName(), content); writer.writeEndElement(); writer.writeEndElement(); } } }) .setDefaultValue(new ModelNode(SyslogType.RFC5424.name())) .setPropertyName("syslogType") .setValidator(EnumValidator.create(SyslogType.class, true, true)) .build(); /* * Attributes */ static final AttributeDefinition[] ATTRIBUTES = { APP_NAME, ENABLED, FACILITY, HOSTNAME, LEVEL, PORT, SERVER_ADDRESS, SYSLOG_FORMATTER }; static final HandlerAddOperationStepHandler ADD_HANDLER = new HandlerAddOperationStepHandler(SyslogHandler.class, ATTRIBUTES); static final LogHandlerWriteAttributeHandler WRITE_HANDLER = new LogHandlerWriteAttributeHandler(ATTRIBUTES); static final SyslogHandlerResourceDefinition INSTANCE = new SyslogHandlerResourceDefinition(); public SyslogHandlerResourceDefinition() { super(SYSLOG_HANDLER_PATH, LoggingExtension.getResourceDescriptionResolver(SYSLOG_HANDLER), ADD_HANDLER, HandlerOperations.REMOVE_HANDLER); } @Override public void registerAttributes(final ManagementResourceRegistration resourceRegistration) { for (AttributeDefinition def : ATTRIBUTES) { resourceRegistration.registerReadWriteAttribute(def, null, WRITE_HANDLER); } } @Override public void registerTransformers(final KnownModelVersion modelVersion, final ResourceTransformationDescriptionBuilder rootResourceBuilder, final ResourceTransformationDescriptionBuilder loggingProfileBuilder) { // } static enum FacilityAttribute { KERNEL("kernel"), USER_LEVEL("user-level"), MAIL_SYSTEM("mail-system"), SYSTEM_DAEMONS("system-daemons"), SECURITY("security"), SYSLOGD("syslogd"), LINE_PRINTER("line-printer"), NETWORK_NEWS("network-news"), UUCP("uucp"), CLOCK_DAEMON("clock-daemon"), SECURITY2("security2"), FTP_DAEMON("ftp-daemon"), NTP("ntp"), LOG_AUDIT("log-audit"), LOG_ALERT("log-alert"), CLOCK_DAEMON2("clock-daemon2"), LOCAL_USE_0("local-use-0"), LOCAL_USE_1("local-use-1"), LOCAL_USE_2("local-use-2"), LOCAL_USE_3("local-use-3"), LOCAL_USE_4("local-use-4"), LOCAL_USE_5("local-use-5"), LOCAL_USE_6("local-use-6"), LOCAL_USE_7("local-use-7"); private static final Map<String, FacilityAttribute> MAP; static { MAP = new HashMap<String, FacilityAttribute>(); for (FacilityAttribute facilityAttribute : values()) { MAP.put(facilityAttribute.toString(), facilityAttribute); } } private final Facility facility; private final String value; FacilityAttribute(final String value) { this.value = value; this.facility = Facility.valueOf(value.replace("-", "_").toUpperCase(Locale.ENGLISH)); } public Facility getFacility() { return facility; } public String getValue() { return value; } @Override public String toString() { return value; } static FacilityAttribute fromString(final String value) { return MAP.get(value); } } static class FacilityResolver implements ModelNodeResolver<String> { static final FacilityResolver INSTANCE = new FacilityResolver(); @Override public String resolveValue(final OperationContext context, final ModelNode value) throws OperationFailedException { return FacilityAttribute.fromString(value.asString()).getFacility().name(); } } }