All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.rhq.enterprise.agent.AgentConfiguration Maven / Gradle / Ivy

The newest version!
/*
 * 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.enterprise.agent;

import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;

import mazz.i18n.Logger;

import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.util.obfuscation.ObfuscatedPreferences;
import org.rhq.enterprise.agent.i18n.AgentI18NFactory;
import org.rhq.enterprise.agent.i18n.AgentI18NResourceKeys;
import org.rhq.enterprise.communications.ServiceContainerConfiguration;
import org.rhq.enterprise.communications.command.client.ClientCommandSenderConfiguration;
import org.rhq.enterprise.communications.command.client.PersistentFifo;
import org.rhq.enterprise.communications.util.SecurityUtil;

/**
 * Just provides some convienence methods to extract agent configuration properties.
 *
 * @author John Mazzitelli
 */
public class AgentConfiguration {
    /**
     * Logger
     */
    private static final Logger LOG = AgentI18NFactory.getLogger(AgentConfiguration.class);

    /**
     * This is a static utility method that builds a full remote endpoint string that combines
     * the given transport, server bind address, server bind port and server transport params.
     * This is used to get the {@link #getServerLocatorUri() full server URI} but can be used to
     * any other caller if they happen to have those four pieces of data.
     *
     * @param transport
     * @param bind_address
     * @param bind_port
     * @param transport_params
     *
     * @return a locator URI that can be used to try to communicate with an endpoint
     */
    public static String buildServerLocatorUri(String transport, String bind_address, int bind_port,
        String transport_params) {

        transport_params = transport_params.trim(); // just for my sanity

        String locator_uri = transport + "://" + bind_address + ":" + bind_port;

        if (transport_params.length() > 0) {
            // For some transports (e.g. servlet) the params will actually be the rest of the URL with optional query string.
            // To denote that we don't want to start the query string immediately after host:port, the params can start with /
            if (transport_params.startsWith("/")) {
                locator_uri += transport_params;
            } else {
                locator_uri += "/?" + transport_params;
            }
        }

        return locator_uri;
    }

    /**
     * The agent configuration properties this object wraps. This should be the agent preferences node.
     */
    private final Preferences m_preferences;

    /**
     * Wraps a preferences object in this instance.
     *
     * @param  prefs the agent configuration preferences
     *
     * @throws IllegalArgumentException if props is null
     */
    public AgentConfiguration(Preferences prefs) {
        if (prefs == null) {
            throw new IllegalArgumentException(LOG.getMsgString(AgentI18NResourceKeys.PREFS_MUST_NOT_BE_NULL));
        }

        m_preferences = new ObfuscatedPreferences(prefs, AgentConfigurationConstants.class);
    }

    /**
     * Returns the raw preferences containing the agent configuration.
     *
     * @return the agent configuration preferences
     */
    public Preferences getPreferences() {
        return m_preferences;
    }

    /**
     * Returns the service container configuration object that provides strongly typed methods to retrieve the
     * server-side communications preferences as configured by the agent.
     *
     * @return server-side communications preferences
     */
    public ServiceContainerConfiguration getServiceContainerPreferences() {
        return new ServiceContainerConfiguration(m_preferences);
    }

    /**
     * Returns the version of the configuration schema.
     *
     * @return configuration version; if the configuration isn't versioned, 0 is returned
     */
    public int getAgentConfigurationVersion() {
        int value = m_preferences.getInt(AgentConfigurationConstants.CONFIG_SCHEMA_VERSION, 0);

        return value;
    }

    /**
     * This tags the existing preferences by setting the configuration schema version preference appropriately.
     */
    public void tagWithAgentConfigurationVersion() {
        m_preferences.putInt(AgentConfigurationConstants.CONFIG_SCHEMA_VERSION,
            AgentConfigurationConstants.CURRENT_CONFIG_SCHEMA_VERSION);
        flush(AgentConfigurationConstants.CONFIG_SCHEMA_VERSION);
    }

    /**
     * This returns true if the agent has already been setup - meaning the user has properly configured the
     * agent with the appropriate preferences. This is done either through custom configuration file or the setup prompt
     * command.
     *
     * @return true if the agent configuration was already setup, false if it has not been
     *         setup
     */
    public boolean isAgentConfigurationSetup() {
        boolean value = m_preferences.getBoolean(AgentConfigurationConstants.CONFIG_SETUP, false);
        return value;
    }

    /**
     * Sets the flag to indicate if the agent configuration has already been setup or not. true means the
     * agent has already been setup with the user-provided configuration preference values. false means the
     * user has not setup the agent.
     *
     * @param flag
     */
    public void setAgentConfigurationSetup(boolean flag) {
        m_preferences.putBoolean(AgentConfigurationConstants.CONFIG_SETUP, flag);
        flush(AgentConfigurationConstants.CONFIG_SETUP);
    }

    /**
     * Returns the unique name that this agent will be known as. This name is unique among all other agents in the
     * system. This value is usually, but doesn't have to be, the agent platform's fully qualified domain name. If the
     * agent configuration doesn't explicitly define the agent's name null will be returned, which is
     * usually a bad condition. An agent should never be started unless it had an agent name defined.
     *
     * @return the agent's name
     */
    public String getAgentName() {
        String name = m_preferences.get(AgentConfigurationConstants.NAME, null);
        return name;
    }

    /**
     * Returns the RHQ Server's transport type (socket, http, etc).
     *
     * @return the server transport type
     */
    public String getServerTransport() {
        String value = m_preferences.get(AgentConfigurationConstants.SERVER_TRANSPORT,
            AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT);
        return value;
    }

    /**
     * Returns the RHQ Server's bind address on which it is listening for incoming commands.
     * If the preference value isn't set, this will look up a default hostname for the
     * default server address to use. If that isn't available or defined, the local host
     * address will be used.
     *
     * @return the RHQ Server bind address
     */
    public String getServerBindAddress() {
        String address = m_preferences.get(AgentConfigurationConstants.SERVER_BIND_ADDRESS, null);
        if (address == null) {
            String alias = m_preferences.get(AgentConfigurationConstants.SERVER_ALIAS, null);
            if (alias != null) {
                try {
                    address = InetAddress.getByName(alias).getCanonicalHostName();
                } catch (Exception e1) {
                    LOG.debug(AgentI18NResourceKeys.SERVER_ALIAS_UNKNOWN, alias, e1);
                    address = null;
                }
            }

            if (address == null) {
                try {
                    address = InetAddress.getLocalHost().getHostAddress();
                } catch (UnknownHostException e2) {
                    address = "127.0.0.1";
                }
            }
        }
        return address;
    }

    /**
     * Returns the RHQ Server's bind port on which it is listening for incoming commands.
     *
     * @return the RHQ Server's bind port
     */
    public int getServerBindPort() {
        int value = m_preferences.getInt(AgentConfigurationConstants.SERVER_BIND_PORT,
            AgentConfigurationConstants.DEFAULT_SERVER_BIND_PORT);
        return value;
    }

    /**
     * Returns the RHQ Server's transport parameters which are used to further customize the RHQ Server and its
     * transport subsystem.
     *
     * @return the RHQ Server transport parameters
     */
    public String getServerTransportParams() {
        String value = m_preferences.get(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS,
            AgentConfigurationConstants.DEFAULT_SERVER_TRANSPORT_PARAMS);

        // see BZ 1166383
        final String requiredParamName = "generalizeSocketException";
        if (value != null) {
            if (!value.contains(requiredParamName)) {
                if (value.startsWith("/")) {
                    if (!value.contains("/?")) {
                        if (!value.endsWith("/")) {
                            value += "/";
                        }
                        value += "?";
                    } else {
                        value += "&";
                    }
                } else {
                    value += "&";
                }
                value += requiredParamName + "=true";
            }
        } else {
            value = requiredParamName + "=true";
        }

        return value;
    }

    /**
     * This is a convienence method that builds a full remote endpoint string that combines
     * {@link #getServerTransport()}, {@link #getServerBindAddress()}, {@link #getServerBindPort()}, and
     * {@link #getServerTransportParams()}.
     *
     * @return the locator URI that should be used to try to communicate with the RHQ Server.
     *
     * @see #buildServerLocatorUri(String, String, int, String)
     */
    public String getServerLocatorUri() {
        String transport = getServerTransport();
        String bind_address = getServerBindAddress();
        int bind_port = getServerBindPort();
        String transport_params = getServerTransportParams();

        return buildServerLocatorUri(transport, bind_address, bind_port, transport_params);
    }

    /**
     * Convienence method that sets the transport, bind address, bind port and transport parameters
     * for a new server endpoint.  This should be used only when the agent needs to switch to a
     * new server.
     *
     * @param transport see {@link #getServerTransport()}
     * @param bindAddress see {@link #getServerBindAddress()}
     * @param bindPort see {@link #getServerBindPort()}
     * @param transportParams see {@link #getServerTransportParams()}
     */
    public void setServerLocatorUri(String transport, String bindAddress, int bindPort, String transportParams) {
        m_preferences.put(AgentConfigurationConstants.SERVER_TRANSPORT, transport);
        m_preferences.put(AgentConfigurationConstants.SERVER_BIND_ADDRESS, bindAddress);
        m_preferences.putInt(AgentConfigurationConstants.SERVER_BIND_PORT, bindPort);
        m_preferences.put(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, transportParams);
        flush("ServerLocatorUri");
        return;
    }

    /**
     * Returns the auto-detection flag that, if true, tells the agent to attempt to auto-detect the RHQ Server coming
     * online and going offline.
     *
     * @return true if the agent should listen for the server coming online and going offline; 
     *         false if the agent won't attempt to auto-discover the server (which means some other mechanism
     *         must be used to know when the client command sender should start and stop sending messages)
     */
    public boolean isServerAutoDetectionEnabled() {
        boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.SERVER_AUTO_DETECTION,
            AgentConfigurationConstants.DEFAULT_SERVER_AUTO_DETECTION);

        return flag;
    }

    /**
     * Returns true if the agent should register itself with the RHQ Server when the agent starts up. If
     * false, the agent will not automatically attempt to register itself at startup - in which case the
     * agent will assume it is either already registered or it will get registered by some other mechanism.
     *
     * @return true if the agent should try to register itself when it starts up
     */
    public boolean isRegisterWithServerAtStartupEnabled() {
        boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.REGISTER_WITH_SERVER_AT_STARTUP,
            AgentConfigurationConstants.DEFAULT_REGISTER_WITH_SERVER_AT_STARTUP);

        return flag;
    }

    /**
     * This defines how many milliseconds the agent should wait at startup for the RHQ Server to be detected. If the RHQ
     * Server has not started up in the given amount of time, the agent will continue initializing and expect the server
     * to come up later. If this is 0, the agent will not wait at all.
     *
     * @return wait time in milliseconds
     *
     * @see    #getClientCommandSenderConfiguration()
     */
    public long getWaitForServerAtStartupMsecs() {
        long value = m_preferences.getLong(AgentConfigurationConstants.WAIT_FOR_SERVER_AT_STARTUP_MSECS,
            AgentConfigurationConstants.DEFAULT_WAIT_FOR_SERVER_AT_STARTUP_MSECS);
        return value;
    }

    /**
     * Returns true if the agent is allowed to apply updates to itself. This means that
     * the agent will be enabled to process agent update binaries, effectively upgrading the agent
     * to a newer version.
     *
     * @return true if the agent is allowed to update itself
     */
    public boolean isAgentUpdateEnabled() {
        boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.AGENT_UPDATE_ENABLED,
            AgentConfigurationConstants.DEFAULT_AGENT_UPDATE_ENABLED);
        return flag;
    }

    /**
     * This will return the URL that the agent should use when it needs to find out
     * the version information of the latest agent update binary.
     *
     * @return version URL if defined, null if not defined
     */
    public String getAgentUpdateVersionUrlIfDefined() {
        String str = m_preferences.get(AgentConfigurationConstants.AGENT_UPDATE_VERSION_URL, null);

        return str;
    }

    /**
     * This will return the URL that the agent should use when it needs to find out
     * the version information of the latest agent update binary.
     * 

* If the URL is not defined, this will return a default URL that points to this agent's server. * If the {@link #getServerTransport() server transport} is secure, the URL returned * will be over "https", otherwise, it will go over "http". The * {@link #getServerBindAddress() server address} and {@link #getServerBindPort() server port} * will be the same regardless of the security transport. *

* * @return version URL */ public String getAgentUpdateVersionUrl() { String str = m_preferences.get(AgentConfigurationConstants.AGENT_UPDATE_VERSION_URL, null); if (str == null) { String transport = SecurityUtil.isTransportSecure(getServerTransport()) ? "https" : "http"; String address = getServerBindAddress(); int port = getServerBindPort(); str = transport + "://" + address + ":" + port + "/agentupdate/version"; } return str; } /** * This will return the URL that the agent should use when it needs to download * the latest agent update binary. * * @return download URL if defined, null if not defined */ public String getAgentUpdateDownloadUrlIfDefined() { String str = m_preferences.get(AgentConfigurationConstants.AGENT_UPDATE_DOWNLOAD_URL, null); return str; } /** * This will return the URL that the agent should use when it needs to download * the latest agent update binary. *

* If the URL is not defined, this will return a default URL that points to this agent's server. * If the {@link #getServerTransport() server transport} is secure, the URL returned * will be over "https", otherwise, it will go over "http". The * {@link #getServerBindAddress() server address} and {@link #getServerBindPort() server port} * will be the same regardless of the security transport. *

* * @return version URL */ public String getAgentUpdateDownloadUrl() { String str = m_preferences.get(AgentConfigurationConstants.AGENT_UPDATE_DOWNLOAD_URL, null); if (str == null) { String transport = SecurityUtil.isTransportSecure(getServerTransport()) ? "https" : "http"; String address = getServerBindAddress(); int port = getServerBindPort(); str = transport + "://" + address + ":" + port + "/agentupdate/download"; } return str; } /** * This defines how many milliseconds the agent should wait between each check that ensures it is connected * to the primary server, as opposed to one of its failure servers. * * @return check interval time in milliseconds */ public long getPrimaryServerSwitchoverCheckIntervalMsecs() { long value = m_preferences.getLong(AgentConfigurationConstants.PRIMARY_SERVER_SWITCHOVER_CHECK_INTERVAL_MSECS, AgentConfigurationConstants.DEFAULT_PRIMARY_SERVER_SWITCHOVER_CHECK_INTERVAL_MSECS); return value; } /** * This defines how many milliseconds the agent should wait between each check that determines * if the VM is healthy or not (such as if the VM is critically low on memory). * * @return check interval time in milliseconds */ public long getVMHealthCheckIntervalMsecs() { long value = m_preferences.getLong(AgentConfigurationConstants.VM_HEALTH_CHECK_INTERVAL_MSECS, AgentConfigurationConstants.DEFAULT_VM_HEALTH_CHECK_INTERVAL_MSECS); return value; } /** * This defines when the VM health check will consider the heap memory to be critically low. * This is a percentage of used heap memory to max heap - when used heap is larger than this * percentage of max, the VM will be considered critically low on heap memory. * * @return threshold percentage, as a float */ public float getVMHealthCheckLowHeapMemThreshold() { float value = m_preferences.getFloat(AgentConfigurationConstants.VM_HEALTH_CHECK_LOW_HEAP_MEM_THRESHOLD, AgentConfigurationConstants.DEFAULT_VM_HEALTH_CHECK_LOW_HEAP_MEM_THRESHOLD); return value; } /** * This defines when the VM health check will consider the nonheap memory to be critically low. * This is a percentage of used nonheap memory to max nonheap - when used nonheap is larger than this * percentage of max, the VM will be considered critically low on nonheap memory. * * @return threshold percentage, as a float */ public float getVMHealthCheckLowNonHeapMemThreshold() { float value = m_preferences.getFloat(AgentConfigurationConstants.VM_HEALTH_CHECK_LOW_NONHEAP_MEM_THRESHOLD, AgentConfigurationConstants.DEFAULT_VM_HEALTH_CHECK_LOW_NONHEAP_MEM_THRESHOLD); return value; } /** * Returns true if the agent should update its plugins when the agent starts up. If false, * the agent will not automatically update the plugins and will use it current plugins. Note that the side effect of * this being true is that the agent will block waiting for at least one plugin to be available before * the plugin container starts. In other words, if this flag is true, a newly installed agent will not * fully complete its startup until it has downloaded its plugins. * * @return true if the agent should try to update its plugins at startup */ public boolean isUpdatePluginsAtStartupEnabled() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.UPDATE_PLUGINS_AT_STARTUP, AgentConfigurationConstants.DEFAULT_UPDATE_PLUGINS_AT_STARTUP); return flag; } /** * Returns true if the agent should test connectivity to all servers in * its failover list. Warning messages will be logged if one or more servers cannot be * connected to. * * @return true if the agent should try to test connectivity to all servers in the failover list. */ public boolean isTestFailoverListAtStartupEnabled() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.TEST_FAILOVER_LIST_AT_STARTUP, AgentConfigurationConstants.DEFAULT_TEST_FAILOVER_LIST_AT_STARTUP); return flag; } /** * Returns the data directory where all internally persisted data can be written to. If the data directory does not * exist, it will be created. * *

Because this does alittle extra work, it may not be suitable to call if you just want to get the value of the * data directory or if you just want to know if its defined or not. In those instances, use * {@link #getDataDirectoryIfDefined()} instead.

* * @return the data directory */ public File getDataDirectory() { String dir_str = m_preferences.get(AgentConfigurationConstants.DATA_DIRECTORY, AgentConfigurationConstants.DEFAULT_DATA_DIRECTORY); File dir = new File(dir_str); if (!dir.exists()) { dir.mkdirs(); } return dir; } /** * This will return the data directory string as found in the preferences. If the data directory is not defined in * the preferences, null is returned. * * @return the data directory string as defined in the preferences or null if it is not defined * * @see #getDataDirectory() */ public String getDataDirectoryIfDefined() { String dir_str = m_preferences.get(AgentConfigurationConstants.DATA_DIRECTORY, null); return dir_str; } /** * Returns true if the native system should be disabled and not used by the agent or its plugin * container. false means the agent/plugin container is allowed to load in and use the native * libraries. * * @return true if the native system should not be loaded or used */ public boolean isNativeSystemDisabled() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.DISABLE_NATIVE_SYSTEM, AgentConfigurationConstants.DEFAULT_DISABLE_NATIVE_SYSTEM); return flag; } /** * Returns the client sender queue size which determines how many commands can be queued up for sending. If this is * 0 or less, it means the queue is unbounded. * * @return queue size * * @see #getClientCommandSenderConfiguration() */ public int getClientSenderQueueSize() { int value = m_preferences.getInt(AgentConfigurationConstants.CLIENT_SENDER_QUEUE_SIZE, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_QUEUE_SIZE); return value; } /** * Returns the maximum number of concurrent commands that the client sender will send at any one time. * * @return max concurrent value * * @see #getClientCommandSenderConfiguration() */ public int getClientSenderMaxConcurrent() { int value = m_preferences.getInt(AgentConfigurationConstants.CLIENT_SENDER_MAX_CONCURRENT, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_MAX_CONCURRENT); if (value < 1) { LOG.warn(AgentI18NResourceKeys.PREF_MUST_BE_GREATER_THAN_0, AgentConfigurationConstants.CLIENT_SENDER_MAX_CONCURRENT, value, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_MAX_CONCURRENT); value = AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_MAX_CONCURRENT; } return value; } /** * Returns the default timeout that the client sender will wait for a command to be processed by the server. The * timeout may be less than or equal to zero in which case the default will be to never timeout commands. * * @return timeout in milliseconds * * @see #getClientCommandSenderConfiguration() */ public long getClientSenderCommandTimeout() { long value = m_preferences.getLong(AgentConfigurationConstants.CLIENT_SENDER_COMMAND_TIMEOUT, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_COMMAND_TIMEOUT); return value; } /** * Returns the interval the client sender should wait in between polling the server. If this value is 0 or less, * server polling should be disabled. * * @return server polling interval in milliseconds * * @see #getClientCommandSenderConfiguration() */ public long getClientSenderServerPollingInterval() { long value = m_preferences.getLong(AgentConfigurationConstants.CLIENT_SENDER_SERVER_POLLING_INTERVAL, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SERVER_POLLING_INTERVAL); return value; } /** * Returns the time in milliseconds the client sender should wait in between retries of commands that have failed. * This is a minimum but by no means is the limit before the command must be retried. The command may, in fact, be * retried any amount of time after this retry interval. * * @return retry interval in milliseconds * * @see #getClientCommandSenderConfiguration() */ public long getClientSenderRetryInterval() { long value = m_preferences.getLong(AgentConfigurationConstants.CLIENT_SENDER_RETRY_INTERVAL, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_RETRY_INTERVAL); return value; } /** * Returns the number of times a guaranteed message is retried, if it fails for a reason other than a "cannot * connect" to server. * * @return maximum number of retry attempts that will be made to send a guaranteed delivery message when it fails * for some reason other than being unable to communicate with the server. * * @see #getClientCommandSenderConfiguration() */ public int getClientSenderMaxRetries() { int value = m_preferences.getInt(AgentConfigurationConstants.CLIENT_SENDER_MAX_RETRIES, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_MAX_RETRIES); return value; } /** * This will return the name of the command spool file (to be located in the * {@link #getDataDirectory() data directory}). If this is not defined, null is returned to indicate * that commands should not be spooled to disk (thus implicitly disabling guaranteed delivery). * * @return the command spool file name or null if it is not defined */ public String getClientSenderCommandSpoolFileName() { String dir_str = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_COMMAND_SPOOL_FILE_NAME, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_COMMAND_SPOOL_FILE_NAME); return dir_str; } /** * Returns an array of command spool file parameters. The first element of the array is the maximum file size * threshold. The second element is the purge percentage. See {@link PersistentFifo} for the meanings of these * settings. * *

Because this is a weakly typed method (i.e. you have to know what the elements in the returned array * represent), it is recommended that you call {@link #getClientCommandSenderConfiguration()} because it will return * all the configuration, including the spool file parameters, in a more strongly typed data object.

* * @return array of command spool file parameters * * @see #getClientCommandSenderConfiguration() */ public long[] getClientSenderCommandSpoolFileParams() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_COMMAND_SPOOL_FILE_PARAMS, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_COMMAND_SPOOL_FILE_PARAMS); long[] ret_params = isClientSenderCommandSpoolFileParamsValueValid(value); // If the config was invalid, immediately fall back to our default just so we don't bomb out with a NPE later. // We are guaranteed not to get a null returned if we pass in the hardcoded default params. // The above method will have already logged a warning for us. if (ret_params == null) { ret_params = isClientSenderCommandSpoolFileParamsValueValid(AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_COMMAND_SPOOL_FILE_PARAMS); } return ret_params; } /** * Given a command spool file parameters value, will determine if its valid or not. If its valid, its individual * parameter values are returned. If not valid, null is returned. * * @param pref_value the command spool file parameters value * * @return the individual parameters values or null if not valid */ public long[] isClientSenderCommandSpoolFileParamsValueValid(String pref_value) { long[] ret_params = null; try { String[] numbers = pref_value.split("\\s*:\\s*"); if (numbers.length == 2) { ret_params = new long[2]; ret_params[0] = Long.parseLong(numbers[0]); ret_params[1] = Long.parseLong(numbers[1]); if (ret_params[0] < 10000L) { throw new NumberFormatException(LOG .getMsgString(AgentI18NResourceKeys.COMMAND_SPOOL_INVALID_MAX_SIZE)); } if ((ret_params[1] < 0L) || (ret_params[1] >= 100L)) { throw new NumberFormatException(LOG .getMsgString(AgentI18NResourceKeys.COMMAND_SPOOL_INVALID_PURGE_PERCENTAGE)); } } else { throw new NumberFormatException(LOG.getMsgString(AgentI18NResourceKeys.COMMAND_SPOOL_INVALID_FORMAT)); } } catch (Exception e) { ret_params = null; LOG.warn(AgentI18NResourceKeys.BAD_COMMAND_SPOOL_PREF, AgentConfigurationConstants.CLIENT_SENDER_COMMAND_SPOOL_FILE_PARAMS, pref_value, e); } return ret_params; } /** * Returns the command spool file compression flag that, if true, indicates the data in the command spool file * should be compressed. * * @return true if the command spool file should compress its data; false means the data * should be stored in its uncompressed format. */ public boolean isClientSenderCommandSpoolFileCompressed() { boolean flag = m_preferences.getBoolean( AgentConfigurationConstants.CLIENT_SENDER_COMMAND_SPOOL_FILE_COMPRESSED, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_COMMAND_SPOOL_FILE_COMPRESSED); return flag; } /** * Returns an array of send throttling parameters or null if send throttling is to be disabled. The * first element of the array is the maximum number of commands that can be sent before the quiet period must start. * The second element is the length of time (in milliseconds) that each quiet period lasts. Once that time period * expires, commands can again be sent, up to the maximum (and the cycle repeats). * *

Because this is a weakly typed method (i.e. you have to know what the elements in the returned array * represent), it is recommended that you call {@link #getClientCommandSenderConfiguration()} because it will return * all the configuration, including the throttling configuration, in a more strongly typed data object.

* * @return array of send throttling parameters, null if send throttling is disabled * * @see #getClientCommandSenderConfiguration() */ public long[] getClientSenderSendThrottling() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SEND_THROTTLING, null); long[] ret_throttling_params = isClientSenderSendThrottlingValueValid(value); return ret_throttling_params; } /** * Given a send throttling parameters value, will determine if its valid or not. If its valid, its individual * parameter values are returned. If not valid, null is returned. Note that if pref_value * is null, then null will be immediately returned. * * @param pref_value the send throttling parameters value * * @return the individual parameters values or null if not valid or the preference value was * null */ public long[] isClientSenderSendThrottlingValueValid(String pref_value) { long[] ret_throttling_params = null; if (pref_value != null) { try { String[] numbers = pref_value.split("\\s*:\\s*"); if (numbers.length == 2) { ret_throttling_params = new long[2]; ret_throttling_params[0] = Long.parseLong(numbers[0]); ret_throttling_params[1] = Long.parseLong(numbers[1]); if (ret_throttling_params[0] <= 0L) { throw new NumberFormatException(LOG .getMsgString(AgentI18NResourceKeys.SEND_THROTTLE_INVALID_MAX)); } if (ret_throttling_params[1] < 100L) { throw new NumberFormatException(LOG.getMsgString( AgentI18NResourceKeys.SEND_THROTTLE_INVALID_QUIET_PERIOD, 100L)); } } else { throw new NumberFormatException(LOG .getMsgString(AgentI18NResourceKeys.SEND_THROTTLE_INVALID_FORMAT)); } } catch (Exception e) { ret_throttling_params = null; LOG.warn(AgentI18NResourceKeys.BAD_SEND_THROTTLE_PREF, AgentConfigurationConstants.CLIENT_SENDER_SEND_THROTTLING, pref_value, e); } } return ret_throttling_params; } /** * Returns an array of queue throttling parameters or null if queue throttling is to be disabled. The * first element of the array is the maximum number of commands that can be dequeued in a burst period before the * client sender must pause (i.e. cannot dequeue any more commands). The second element is the length of time (in * milliseconds) that each burst period lasts. Once that time period expires, commands can again be dequeued, up to * the maximum (and the cycle repeats). * *

Because this is a weakly typed method (i.e. you have to know what the elements in the returned array * represent), it is recommended that you call {@link #getClientCommandSenderConfiguration()} because it will return * all the configuration, including the throttling configuration, in a more strongly typed data object.

* * @return array of queue throttling parameters, null if queue throttling is disabled * * @see #getClientCommandSenderConfiguration() */ public long[] getClientSenderQueueThrottling() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_QUEUE_THROTTLING, null); long[] ret_throttling_params = isClientSenderQueueThrottlingValueValid(value); return ret_throttling_params; } /** * Given a queue throttling parameters value, will determine if its valid or not. If its valid, its individual * parameter values are returned. If not valid, null is returned. Note that if pref_value * is null, then null will be immediately returned. * * @param pref_value the queue throttling parameters value * * @return the individual parameters values or null if not valid or the preference value was * null */ public long[] isClientSenderQueueThrottlingValueValid(String pref_value) { long[] ret_throttling_params = null; if (pref_value != null) { try { String[] numbers = pref_value.split("\\s*:\\s*"); if (numbers.length == 2) { ret_throttling_params = new long[2]; ret_throttling_params[0] = Long.parseLong(numbers[0]); ret_throttling_params[1] = Long.parseLong(numbers[1]); if (ret_throttling_params[0] <= 0L) { throw new NumberFormatException(LOG .getMsgString(AgentI18NResourceKeys.QUEUE_THROTTLE_INVALID_MAX)); } if (ret_throttling_params[1] < 100L) { throw new NumberFormatException(LOG.getMsgString( AgentI18NResourceKeys.QUEUE_THROTTLE_INVALID_BURST_PERIOD, 100L)); } } else { throw new NumberFormatException(LOG .getMsgString(AgentI18NResourceKeys.QUEUE_THROTTLE_INVALID_FORMAT)); } } catch (Exception e) { ret_throttling_params = null; LOG.warn(AgentI18NResourceKeys.BAD_QUEUE_THROTTLE_PREF, AgentConfigurationConstants.CLIENT_SENDER_QUEUE_THROTTLING, pref_value, e); } } return ret_throttling_params; } /** * This will return the fully qualified class name of the command preprocessor object that the sender will use to * preprocess all commands that are to be queued and sent. If this returns an empty string, no preprocessing will be * performed by the sender. Note that the returned string may consist of multiple class names, in which case they * will be separated from one another via colon characters (:). * * @return the command preprocessor class name (may be null) */ public String getClientSenderCommandPreprocessors() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_COMMAND_PREPROCESSORS, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_COMMAND_PREPROCESSORS); return value; } /** * This is a convienence method that returns the full client sender configuration. It combines all the * getClientSenderXXX methods and puts all the data in the returned data object. * * @return the full client sender configuration */ public ClientCommandSenderConfiguration getClientCommandSenderConfiguration() { ClientCommandSenderConfiguration config = new ClientCommandSenderConfiguration(); config.defaultTimeoutMillis = getClientSenderCommandTimeout(); config.maxConcurrent = getClientSenderMaxConcurrent(); config.queueSize = getClientSenderQueueSize(); config.dataDirectory = getDataDirectory(); config.serverPollingIntervalMillis = getClientSenderServerPollingInterval(); config.commandSpoolFileCompressData = isClientSenderCommandSpoolFileCompressed(); config.retryInterval = getClientSenderRetryInterval(); config.maxRetries = getClientSenderMaxRetries(); config.commandSpoolFileName = getClientSenderCommandSpoolFileName(); config.commandPreprocessors = getClientSenderCommandPreprocessors(); long[] cmd_spool_file_params = getClientSenderCommandSpoolFileParams(); config.commandSpoolFileMaxSize = cmd_spool_file_params[0]; config.commandSpoolFilePurgePercentage = (int) cmd_spool_file_params[1]; // cast is fine, we've ensured this is between 0 and 99 long[] queue_throttling = getClientSenderQueueThrottling(); if (queue_throttling != null) { config.enableQueueThrottling = true; config.queueThrottleMaxCommands = queue_throttling[0]; config.queueThrottleBurstPeriodMillis = queue_throttling[1]; } else { config.enableQueueThrottling = false; } long[] send_throttling = getClientSenderSendThrottling(); if (send_throttling != null) { config.enableSendThrottling = true; config.sendThrottleMaxCommands = send_throttling[0]; config.sendThrottleQuietPeriodDurationMillis = send_throttling[1]; } else { config.enableSendThrottling = false; } // get the security settings - the client sender probably won't need these // these are actually set as part of the RemoteCommunicator configuration (which is passed to remoting Client) config.securityServerAuthMode = isClientSenderSecurityServerAuthMode(); config.securityKeystoreFile = getClientSenderSecurityKeystoreFile(); config.securityKeystoreType = getClientSenderSecurityKeystoreType(); config.securityKeystoreAlgorithm = getClientSenderSecurityKeystoreAlgorithm(); config.securityKeystorePassword = getClientSenderSecurityKeystorePassword(); config.securityKeystoreKeyPassword = getClientSenderSecurityKeystoreKeyPassword(); config.securityKeystoreAlias = getClientSenderSecurityKeystoreAlias(); config.securityTruststoreFile = getClientSenderSecurityTruststoreFile(); config.securityTruststoreType = getClientSenderSecurityTruststoreType(); config.securityTruststoreAlgorithm = getClientSenderSecurityTruststoreAlgorithm(); config.securityTruststorePassword = getClientSenderSecurityTruststorePassword(); config.securitySecureSocketProtocol = getClientSenderSecuritySocketProtocol(); return config; } /** * Returns the protocol used over the secure socket. * * @return protocol name */ public String getClientSenderSecuritySocketProtocol() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_SOCKET_PROTOCOL, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_SOCKET_PROTOCOL); return value; } /** * Returns the alias to the client's key in the keystore. * * @return alias name */ public String getClientSenderSecurityKeystoreAlias() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_KEYSTORE_ALIAS, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_KEYSTORE_ALIAS); return value; } /** * Returns the path to the keystore file. This returns a String as opposed to File since * some underlying remoting code may allow for this filepath to be relative to a jar inside the classloader. * * @return keystore file path */ public String getClientSenderSecurityKeystoreFile() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_KEYSTORE_FILE, null); if (value == null) { value = new File(getDataDirectory(), AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_KEYSTORE_FILE_NAME).getAbsolutePath(); } return value; } /** * Returns the algorithm used to manage the keys in the keystore. * * @return algorithm name */ public String getClientSenderSecurityKeystoreAlgorithm() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_KEYSTORE_ALGORITHM, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_KEYSTORE_ALGORITHM); return value; } /** * Returns the type of the keystore file. * * @return keystore file type */ public String getClientSenderSecurityKeystoreType() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_KEYSTORE_TYPE, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_KEYSTORE_TYPE); return value; } /** * Returns the password of the keystore file itself. * * @return keystore file password */ public String getClientSenderSecurityKeystorePassword() { String value = m_preferences .get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_KEYSTORE_PASSWORD, "rhqpwd"); return value; } /** * Returns the password to gain access to the key in the keystore. If no key password is configured, this returns * the {@link #getClientSenderSecurityKeystorePassword() keystore password}. * * @return password to the key */ public String getClientSenderSecurityKeystoreKeyPassword() { String value = m_preferences .get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_KEYSTORE_KEY_PASSWORD, null); if (value == null) { value = getClientSenderSecurityKeystorePassword(); } return value; } /** * Returns the path to the truststore file. This returns a String as opposed to File since * some underlying remoting code may allow for this filepath to be relative to a jar inside the classloader. * * @return truststore file path */ public String getClientSenderSecurityTruststoreFile() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_TRUSTSTORE_FILE, null); if (value == null) { value = new File(getDataDirectory(), AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_TRUSTSTORE_FILE_NAME).getAbsolutePath(); } return value; } /** * Returns the algorithm used to manage the keys in the truststore. * * @return algorithm name */ public String getClientSenderSecurityTruststoreAlgorithm() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_TRUSTSTORE_ALGORITHM, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_TRUSTSTORE_ALGORITHM); return value; } /** * Returns the type of the truststore file. * * @return truststore file type */ public String getClientSenderSecurityTruststoreType() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_TRUSTSTORE_TYPE, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_TRUSTSTORE_TYPE); return value; } /** * Returns the password of the truststore file itself. * * @return truststore file password */ public String getClientSenderSecurityTruststorePassword() { String value = m_preferences.get(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_TRUSTSTORE_PASSWORD, null); return value; } /** * Returns true if the server authentication mode is enabled. If this is enabled, it means when using * secure communications, the server certificate will be authenticated with the certificates found in the agent's * truststore. If this is false, the server does not have to authenticate itself with a trusted * certificate; the agent will trust any remote server (in other words, the secure communications repo will only * be used for encryption and not authentication). * * @return server authenticate mode */ public boolean isClientSenderSecurityServerAuthMode() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.CLIENT_SENDER_SECURITY_SERVER_AUTH_MODE, AgentConfigurationConstants.DEFAULT_CLIENT_SENDER_SECURITY_SERVER_AUTH_MODE); return flag; } /** * This will return all the individual plugin container configuration preferences in a configuration object. * * @return plugin container configuration */ public PluginContainerConfiguration getPluginContainerConfiguration() { // get the plugins directory String plugin_dir_str = m_preferences.get(AgentConfigurationConstants.PLUGINS_DIRECTORY, AgentConfigurationConstants.DEFAULT_PLUGINS_DIRECTORY); File plugin_dir = new File(plugin_dir_str); if (!plugin_dir.exists()) { plugin_dir.mkdirs(); } // get the time interval in which server discoveries run long server_discovery_period = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_SERVER_DISCOVERY_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_SERVER_DISCOVERY_PERIOD); long server_discovery_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_SERVER_DISCOVERY_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_SERVER_DISCOVERY_INITIAL_DELAY); // get the time interval in which service discoveries run long service_discovery_period = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_SERVICE_DISCOVERY_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_SERVICE_DISCOVERY_PERIOD); long service_discovery_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_SERVICE_DISCOVERY_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_SERVICE_DISCOVERY_INITIAL_DELAY); long childResourceDiscoveryDelay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_CHILD_RESOURCE_DISOVERY_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_CHILD_RESOURCE_DISCOVERY_PERIOD); // get the time interval in which availability scans run long avail_scan_period = m_preferences.getLong(AgentConfigurationConstants.PLUGINS_AVAILABILITY_SCAN_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_AVAILABILITY_SCAN_PERIOD); long avail_scan_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_AVAILABILITY_SCAN_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_AVAILABILITY_SCAN_INITIAL_DELAY); // get the avail thread pool size int avail_scan_threadpool_size = m_preferences.getInt( AgentConfigurationConstants.PLUGINS_AVAILABILITY_SCAN_THREADPOOL_SIZE, AgentConfigurationConstants.DEFAULT_PLUGINS_AVAILABILITY_SCAN_THREADPOOL_SIZE); // get the initial delay before measurement collections begin long meas_scan_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_MEASUREMENT_COLLECTION_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_MEASUREMENT_COLLECTION_INITIAL_DELAY); // determine if the plugin container should explicitly be told its name String name = getAgentName(); // determine how many measurement collection threads should be in the measurement threadpool int meas_threadpool_size = m_preferences.getInt( AgentConfigurationConstants.PLUGINS_MEASUREMENT_COLL_THREADPOOL_SIZE, AgentConfigurationConstants.DEFAULT_PLUGINS_MEASUREMENT_COLL_THREADPOOL_SIZE); // get the drift settings long drift_period = m_preferences.getLong(AgentConfigurationConstants.PLUGINS_DRIFT_DETECTION_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_DRIFT_DETECTION_PERIOD); long drift_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_DRIFT_DETECTION_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_DRIFT_DETECTION_INITIAL_DELAY); // determine how many operation invoker threads should be in the threadpool that is used to execute operations int op_threadpool_size = m_preferences.getInt( AgentConfigurationConstants.PLUGINS_OPERATION_INVOKER_THREADPOOL_SIZE, AgentConfigurationConstants.DEFAULT_PLUGINS_OPERATION_INVOKER_THREADPOOL_SIZE); // determine the default operation invocation timeout long op_timeout = m_preferences.getLong(AgentConfigurationConstants.PLUGINS_OPERATION_INVOCATION_TIMEOUT, AgentConfigurationConstants.DEFAULT_PLUGINS_OPERATION_INVOCATION_TIMEOUT); // get the content discovery settings long con_period = m_preferences.getLong(AgentConfigurationConstants.PLUGINS_CONTENT_DISCOVERY_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_CONTENT_DISCOVERY_PERIOD); long con_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_CONTENT_DISCOVERY_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_CONTENT_DISCOVERY_INITIAL_DELAY); int con_threadpool_size = m_preferences.getInt( AgentConfigurationConstants.PLUGINS_CONTENT_DISCOVERY_THREADPOOL_SIZE, AgentConfigurationConstants.DEFAULT_PLUGINS_CONTENT_DISCOVERY_THREADPOOL_SIZE); // get configuration discovery settings long config_discovery_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_CONFIGURATION_DISCOVERY_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_CONFIGURATION_DISCOVERY_INITIAL_DELAY); long config_discovery_interval = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_CONFIGURATION_DISCOVERY_INTERVAL, AgentConfigurationConstants.DEFAULT_PLUGINS_CONFIGURATION_DISCOVERY_INTERVAL); long config_discovery_period = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_CONFIGURATION_DISCOVERY_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_CONFIGURATION_DISCOVERY_PERIOD); long config_discovery_limit = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_CONFIGURATION_DISCOVERY_LIMIT, AgentConfigurationConstants.DEFAULT_PLUGINS_CONFIGURATION_DISCOVERY_LIMIT); // get event sender/report settings long event_sender_initial_delay = m_preferences.getLong( AgentConfigurationConstants.PLUGINS_EVENT_SENDER_INITIAL_DELAY, AgentConfigurationConstants.DEFAULT_PLUGINS_EVENT_SENDER_INITIAL_DELAY); long event_sender_period = m_preferences.getLong(AgentConfigurationConstants.PLUGINS_EVENT_SENDER_PERIOD, AgentConfigurationConstants.DEFAULT_PLUGINS_EVENT_SENDER_PERIOD); int event_report_max_per_src = m_preferences.getInt( AgentConfigurationConstants.PLUGINS_EVENT_REPORT_MAX_PER_SOURCE, AgentConfigurationConstants.DEFAULT_PLUGINS_EVENT_REPORT_MAX_PER_SOURCE); int event_report_max_total = m_preferences.getInt(AgentConfigurationConstants.PLUGINS_EVENT_REPORT_MAX_TOTAL, AgentConfigurationConstants.DEFAULT_PLUGINS_EVENT_REPORT_MAX_TOTAL); // determine the data and tmp directories to use File data_directory = getDataDirectory(); File tmp_directory = new File(data_directory, "tmp"); if (!tmp_directory.exists()) { tmp_directory.mkdir(); } // determine what, if any, plugins are to be enabled String enabled_pref = m_preferences.get(AgentConfigurationConstants.PLUGINS_ENABLED, null); List enabled_plugins = null; if (enabled_pref != null) { String[] array = enabled_pref.split(","); enabled_plugins = new ArrayList(Arrays.asList(array)); } // determine what, if any, plugins are to be disabled String disabled_pref = m_preferences.get(AgentConfigurationConstants.PLUGINS_DISABLED, null); List disabled_plugins = null; if (disabled_pref != null) { String[] array = disabled_pref.split(","); disabled_plugins = new ArrayList(Arrays.asList(array)); } // determine what, if any, resource types are to be disabled String disabled_types_pref = m_preferences.get(AgentConfigurationConstants.PLUGINS_DISABLED_RESOURCE_TYPES, null); List disabled_types = null; if (disabled_types_pref != null) { String[] array = disabled_types_pref.split("\\|"); disabled_types = new ArrayList(Arrays.asList(array)); } // Define what plugin container/agent classes are to be hidden from our plugins. String clRegex = m_preferences.get(AgentConfigurationConstants.PLUGINS_ROOT_PLUGIN_CLASSLOADER_REGEX, null); if (clRegex == null) { clRegex = PluginContainerConfiguration.getDefaultClassLoaderFilter(); } // now that we have all the individual preferences, let's squirrel them away in a config object PluginContainerConfiguration config = new PluginContainerConfiguration(); config.setInsideAgent(true); config.setPluginDirectory(plugin_dir); config.setDataDirectory(data_directory); config.setTemporaryDirectory(tmp_directory); config.setDisabledPlugins(disabled_plugins); config.setEnabledPlugins(enabled_plugins); config.setDisabledResourceTypes(disabled_types); config.setRootPluginClassLoaderRegex(clRegex); config.setServerDiscoveryInitialDelay(server_discovery_initial_delay); config.setServerDiscoveryPeriod(server_discovery_period); config.setServiceDiscoveryInitialDelay(service_discovery_initial_delay); config.setServiceDiscoveryPeriod(service_discovery_period); config.setChildResourceDiscoveryDelay(childResourceDiscoveryDelay); config.setAvailabilityScanInitialDelay(avail_scan_initial_delay); config.setAvailabilityScanPeriod(avail_scan_period); config.setAvailabilityScanThreadPoolSize(avail_scan_threadpool_size); config.setMeasurementCollectionThreadPoolSize(meas_threadpool_size); config.setMeasurementCollectionInitialDelay(meas_scan_initial_delay); config.setDriftDetectionInitialDelay(drift_initial_delay); config.setDriftDetectionPeriod(drift_period); config.setOperationInvokerThreadPoolSize(op_threadpool_size); config.setOperationInvocationTimeout(op_timeout); config.setContentDiscoveryThreadPoolSize(con_threadpool_size); config.setContentDiscoveryInitialDelay(con_initial_delay); config.setContentDiscoveryPeriod(con_period); config.setConfigurationDiscoveryInitialDelay(config_discovery_initial_delay); config.setConfigurationDiscoveryInterval(config_discovery_interval); config.setConfigurationDiscoveryPeriod(config_discovery_period); config.setConfigurationDiscoveryLimit(config_discovery_limit); config.setEventSenderInitialDelay(event_sender_initial_delay); config.setEventSenderPeriod(event_sender_period); config.setEventReportMaxPerSource(event_report_max_per_src); config.setEventReportMaxTotal(event_report_max_total); if (name != null) { config.setContainerName(name); } return config; } /** * This returns the agent's security token that it needs to send with its commands to the server. If * null, it means the agent has not yet been registered with the server. * * @return security token the agent has been given by the server when it registered (may be null) */ public String getAgentSecurityToken() { String value = m_preferences.get(AgentConfigurationConstants.AGENT_SECURITY_TOKEN, null); return value; } /** * Sets the agent's security token that was received from the server during agent registration. This may be set to * null which removes the agent token; however, this does not mean the agent itself is no longer * registered with the server. The server will still maintain a registration for the agent. * * @param value */ public void setAgentSecurityToken(String value) { if (value != null) { m_preferences.put(AgentConfigurationConstants.AGENT_SECURITY_TOKEN, value); flush(AgentConfigurationConstants.AGENT_SECURITY_TOKEN); } else { m_preferences.remove(AgentConfigurationConstants.AGENT_SECURITY_TOKEN); } } /** * If true is returned, this will tell the agent it should not create its management services. In this * case, the agent cannot monitor itself, since the agent plugin will need these management MBean services. * *

This is usually used only during testing - not really of practical use.

* * @return plugin container startup flag */ public boolean doNotEnableManagementServices() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.DO_NOT_ENABLE_MANAGEMENT_SERVICES, false); return flag; } /** * If true is returned, this will tell the agent it should not start the Plugin Container at startup. * In this case, the only way for the agent to start the plugin container would be with the plugin container prompt * command via the agent command line. * *

This is usually used only during testing - not really of practical use.

* * @return plugin container startup flag */ public boolean doNotStartPluginContainerAtStartup() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.DO_NOT_START_PLUGIN_CONTAINER_AT_STARTUP, false); return flag; } /** * If true is returned, this will tell the agent it should not tell the server that the agent is * shutting down. In this case, the agent shutdown will be faster because it won't try to send a message to the * server, however, it will cause the server to not know of the agent's unavailability. * *

This is usually used only during testing - not really of practical use.

* * @return server shutdown notification flag */ public boolean doNotNotifyServerOfShutdown() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.DO_NOT_NOTIFY_SERVER_OF_SHUTDOWN, false); return flag; } /** * If true is returned, this will tell the agent it should not overlay system properties over the agent * configuration preferences. The default is that the agent will look at system properties and, if there is one that * is the same name as a preference, the system property will take effect and override the preference. If this is * true, system properties will be ignored and never override preferences. * * @return system property override flag */ public boolean doNotOverridePreferencesWithSystemProperties() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.DO_NOT_OVERRIDE_PREFS_WITH_SYSPROPS, false); return flag; } /** * The default (false) is that the agent will install a shutdown hook so it can detect * a VM shutdown request and be able to properly shut itself down. * However, if this returns true, it is assumed the agent itself is embedded in a container * and that container will ensure that it tells the agent to shut itself down at the proper time. * * @return the shutdown hook install flag, if true is returned, this will tell the agent it * should not install its own shutdown hook. */ public boolean doNotInstallShutdownHook() { boolean flag = m_preferences.getBoolean(AgentConfigurationConstants.DO_NOT_INSTALL_SHUTDOWN_HOOK, false); return flag; } /** * @see java.lang.Object#toString() */ @Override public String toString() { StringBuilder buf = new StringBuilder(m_preferences.absolutePath()); buf.append('['); try { String[] keys = m_preferences.keys(); for (int i = 0; i < keys.length; i++) { String key = keys[i]; buf.append(key); buf.append('='); buf.append(m_preferences.get(key, LOG.getMsgString(AgentI18NResourceKeys.UNKNOWN))); if ((i + 1) < keys.length) { buf.append(','); } } } catch (BackingStoreException e) { buf.append(LOG.getMsgString(AgentI18NResourceKeys.CANNOT_GET_PREFERENCES, e)); } buf.append(']'); return buf.toString(); } /** * Forces the preferences to flush so they get written to the backing store. * * @param changedPreference the name of the preference that was changed to * cause flush to be called (used for error log message) */ private void flush(String changedPreference) { try { m_preferences.flush(); } catch (Exception e) { LOG.warn(AgentI18NResourceKeys.CANNOT_STORE_PREFERENCES, changedPreference, e); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy