it.jnrpe.plugin.CheckTime.java Source code

Java tutorial

Introduction

Here is the source code for it.jnrpe.plugin.CheckTime.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2014 Massimiliano Ziccardi
 *
 * 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 it.jnrpe.plugin;

import it.jnrpe.ICommandLine;
import it.jnrpe.Status;
import it.jnrpe.plugins.Metric;
import it.jnrpe.plugins.MetricGatheringException;
import it.jnrpe.plugins.PluginBase;
import it.jnrpe.plugins.annotations.Option;
import it.jnrpe.plugins.annotations.Plugin;
import it.jnrpe.plugins.annotations.PluginOptions;
import it.jnrpe.utils.BadThresholdException;
import it.jnrpe.utils.Elapsed;
import it.jnrpe.utils.TimeUnit;
import it.jnrpe.utils.thresholds.ThresholdsEvaluatorBuilder;

import java.io.IOException;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.apache.commons.net.time.TimeTCPClient;
import org.apache.commons.net.time.TimeUDPClient;

/**
 * Checks the time on a specified host.
 * 
 * @author Frederico Campos
 */

@Plugin(name = "CHECK_TIME", description = "Checks time on a specified host.")
@PluginOptions({
        @Option(shortName = "H", longName = "hostname", description = "Host name or IP Address", required = true, hasArgs = true, argName = "hostname", optionalArgs = false, option = "hostname"),
        @Option(shortName = "p", longName = "port", description = "Port number (default is 37)", required = false, hasArgs = true, argName = "port", optionalArgs = false, option = "port"),
        @Option(shortName = "u", longName = "udp", description = "Use udp instead of tcp to connect.", required = false, hasArgs = false, argName = "udp", optionalArgs = false, option = "udp"),
        @Option(shortName = "c", longName = "critical-variance", description = "Time difference (sec.) necessary to result in a critical status", required = false, hasArgs = true, argName = "critical-variance", optionalArgs = false, option = "critical-variance"),
        @Option(shortName = "w", longName = "warning-variance", description = "Time difference (sec.) necessary to result in a warning status", required = false, hasArgs = true, argName = "warning", optionalArgs = false, option = "warning"),
        @Option(shortName = "C", longName = "critical-connect", description = "Return critical if elapsed time exceeds value. Default off", required = false, hasArgs = true, argName = "critical", optionalArgs = false, option = "critical"),
        @Option(shortName = "W", longName = "warning-connect", description = "Return warning if elapsed time exceeds value. Default off", required = false, hasArgs = true, argName = "warning", optionalArgs = false, option = "warning"),
        @Option(shortName = "t", longName = "timeout", description = "Seconds before connection times out (default: 10)", required = false, hasArgs = true, argName = "timeout", optionalArgs = false, option = "timeout"), })
public class CheckTime extends PluginBase {

    private static final int DEFAULT_TIMEOUT = 10;

    private static final int DEFAULT_PORT = 37;

    @Override
    protected final String getPluginName() {
        return "CHECK_TIME";
    }

    @Override
    protected final void configureThresholdEvaluatorBuilder(final ThresholdsEvaluatorBuilder thrb,
            final ICommandLine cl) throws BadThresholdException {
        String criticalConnect = cl.getOptionValue("critical-connect");
        String warningConnect = cl.getOptionValue("warning-connect");
        thrb.withLegacyThreshold("time", null, warningConnect, criticalConnect);

        String critical = cl.getOptionValue("critical-variance");
        String warning = cl.getOptionValue("warning-variance");
        thrb.withLegacyThreshold("offset", null, warning, critical);

    }

    @Override
    protected final Collection<Metric> gatherMetrics(final ICommandLine cl) throws MetricGatheringException {
        List<Metric> metrics = new ArrayList<Metric>();
        String host = cl.getOptionValue("hostname");
        int timeout = DEFAULT_TIMEOUT;
        if (cl.getOptionValue("timeout") != null) {
            timeout = Integer.parseInt(cl.getOptionValue("timeout"));
        }
        int port = DEFAULT_PORT;
        if (cl.getOptionValue("port") != null) {
            port = Integer.parseInt(cl.getOptionValue("port"));
        }
        try {
            Date date = null;
            long then = System.currentTimeMillis();
            if (cl.hasOption("udp")) {
                date = getTimeUDP(host, timeout);
            } else {
                date = getTimeTCP(host, timeout, port);
            }
            long elapsed = (System.currentTimeMillis() - then);

            Date now = new Date();

            analyze(metrics, elapsed, now, date);

        } catch (IOException e) {
            throw new MetricGatheringException(e.getMessage(), Status.CRITICAL, e);
        }

        return metrics;
    }

    /**
     * Analizes the data and produces the metrics.
     * 
     * @param metrics
     *            produced metrics
     * @param elapsed
     *            elapsed time
     * @param now
     *            date as of now
     * @param date
     */
    private void analyze(final List<Metric> metrics, final long elapsed, final Date now, final Date date) {
        long diff = 0;

        boolean behind = false;
        if (now.before(date)) {
            behind = true;
            diff = date.getTime() - now.getTime();
        } else if (now.after(date)) {
            diff = now.getTime() - date.getTime();
        }

        Elapsed elapsedTime = new Elapsed(diff, TimeUnit.MILLISECOND);

        String msg = getMessage(elapsedTime);
        if (diff > TimeUnit.SECOND.convert(1)) {
            if (behind) {
                msg += "behind";
            } else {
                msg += "ahead";
            }
        }
        metrics.add(new Metric("offset", msg, new BigDecimal(TimeUnit.MILLISECOND.convert(diff, TimeUnit.SECOND)),
                null, null));
        metrics.add(new Metric("time", "", new BigDecimal(TimeUnit.MILLISECOND.convert(elapsed, TimeUnit.SECOND)),
                null, null));
    }

    private String getMessage(final Elapsed elapsed) {

        StringBuilder msg = new StringBuilder(String.valueOf(elapsed.getSeconds())).append(" seconds ");

        if (elapsed.getMinutes() > 0) {
            msg.append(String.valueOf(elapsed.getMinutes())).append(" minutes ");
        }
        if (elapsed.getHours() > 0) {
            msg.append(String.valueOf(elapsed.getHours())).append(" hours ");
        }
        if (elapsed.getDays() > 0) {
            msg.append(String.valueOf(elapsed.getDays())).append(" days ");
        }

        return msg.append("difference ").toString();
    }

    private Date getTimeTCP(String host, int timeout, int port) throws IOException {
        TimeTCPClient client = new TimeTCPClient();
        client.setDefaultPort(port);
        client.setDefaultTimeout((int) TimeUnit.SECOND.convert(timeout));
        client.connect(host);
        Date date = client.getDate();
        client.disconnect();
        return date;

    }

    private Date getTimeUDP(String host, int timeout) throws IOException {
        TimeUDPClient client = new TimeUDPClient();
        client.setDefaultTimeout((int) TimeUnit.SECOND.convert(timeout));
        client.open();
        Date date = client.getDate(InetAddress.getByName(host));
        client.close();
        return date;
    }
}