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

io.cloudslang.content.utilities.services.localping.SunOsPingCommand Maven / Gradle / Ivy

There is a newer version: 0.1.24
Show newest version
/*
 * (c) Copyright 2017 EntIT Software LLC, a Micro Focus company, L.P.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Apache License v2.0 which accompany this distribution.
 *
 * The Apache License is available 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 io.cloudslang.content.utilities.services.localping;

import io.cloudslang.content.utilities.entities.LocalPingInputs;

import java.util.HashMap;
import java.util.Map;

import static io.cloudslang.content.constants.OtherValues.EMPTY_STRING;
import static io.cloudslang.content.constants.OutputNames.RETURN_RESULT;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.DEFAULT_PACKET_COUNT;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.DEFAULT_PACKET_SIZE;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.INVALID_ARGUMENT_IP_VERSION;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.IP_VERSION_4;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.IP_VERSION_6;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.PACKETS_RECEIVED;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.PACKETS_SENT;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.PACKET_COUNT_SHOULD_HAVE_A_NUMERIC_VALUE;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.PACKET_SIZE_SHOULD_HAVE_A_NUMERIC_VALUE;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.PERCENTAGE_PACKETS_LOST;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.SLASH;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.TIMEOUT_SHOULD_HAVE_A_NUMERIC_VALUE;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.TRANSMISSION_TIME_AVG;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.TRANSMISSION_TIME_MAX;
import static io.cloudslang.content.utilities.entities.constants.LocalPingConstants.TRANSMISSION_TIME_MIN;
import static io.cloudslang.content.utilities.util.CommandOutputParser.extractValue;
import static io.cloudslang.content.utils.NumberUtilities.isValidInt;
import static io.cloudslang.content.utils.NumberUtilities.isValidLong;
import static java.lang.Long.parseLong;
import static java.lang.String.format;
import static java.lang.String.valueOf;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;

/**
 * Created by pinteae on 1/12/2018.
 */
public class SunOsPingCommand implements LocalPingCommand {

    @Override
    public String createCommand(LocalPingInputs localPingInputs) {
        StringBuilder command = new StringBuilder();
        command.append("ping ");

        final String timeout = localPingInputs.getTimeout();
        if (isNotEmpty(timeout)) {
            if (!isValidLong(timeout)) {
                throw new RuntimeException(TIMEOUT_SHOULD_HAVE_A_NUMERIC_VALUE);
            }

            //transform timeout value from milliseconds to seconds
            final Long timeoutValue = parseLong(timeout) / 1000;

            command.append(localPingInputs.getTargetHost())
                    .append(" ")
                    .append(valueOf(timeoutValue));
        } else {
            final String ipVersion = localPingInputs.getIpVersion();
            if (isNotEmpty(ipVersion)) {
                if (ipVersion.equals(IP_VERSION_6)) {
                    command.append("-A inet6 ");
                } else if (ipVersion.equals(IP_VERSION_4)) {
                    command.append("-A inet ");
                } else {
                    throw new IllegalArgumentException(format(INVALID_ARGUMENT_IP_VERSION, ipVersion));
                }
            }

            command.append(format("-s %s", localPingInputs.getTargetHost()));

            final String packetSize = localPingInputs.getPacketSize();
            if (isNotEmpty(packetSize)) {
                if (!isValidInt(packetSize)) {
                    throw new RuntimeException(PACKET_SIZE_SHOULD_HAVE_A_NUMERIC_VALUE);
                }
                command.append(format(" %s ", packetSize));
            } else {
                command.append(format(" %s ", DEFAULT_PACKET_SIZE));
            }

            final String packetCount = localPingInputs.getPacketCount();
            if (isNotEmpty(packetCount)) {
                if (!isValidLong(packetCount)) {
                    throw new RuntimeException(PACKET_COUNT_SHOULD_HAVE_A_NUMERIC_VALUE);
                }
                command.append(format("%s", packetCount));
            } else {
                command.append(format("%s", DEFAULT_PACKET_COUNT));
            }
        }

        return command.toString();
    }

    @Override
    public Map parseOutput(String output) {
        Map resultMap = new HashMap<>();

        resultMap.put(RETURN_RESULT, output);
        resultMap.put(PACKETS_SENT, extractValue(output, "---\n", " packets transmitted, "));
        resultMap.put(PACKETS_RECEIVED, extractValue(output, "packets transmitted, ", " packets received, "));
        resultMap.put(PERCENTAGE_PACKETS_LOST, extractValue(output, " received, ", "% packet loss"));

        final String minAvgMax = extractValue(output, "round-trip (ms)  min/avg/max/stddev = ");

        if (isNotEmpty(minAvgMax)) {
            final String[] roundTripTime = minAvgMax.split(SLASH);

            resultMap.put(TRANSMISSION_TIME_MIN, roundTripTime[0]);
            resultMap.put(TRANSMISSION_TIME_AVG, roundTripTime[1]);
            resultMap.put(TRANSMISSION_TIME_MAX, roundTripTime[2]);
        } else {
            resultMap.put(TRANSMISSION_TIME_MIN, EMPTY_STRING);
            resultMap.put(TRANSMISSION_TIME_AVG, EMPTY_STRING);
            resultMap.put(TRANSMISSION_TIME_MAX, EMPTY_STRING);
        }

        return resultMap;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy