// Copyright 2017 JanusGraph Authors
//
// 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 com.baidu.hugegraph.util;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

/*
 *  This doesn't really belong here.  It's only used in the zipfile
 *  distribution to check whether Gremlin Server or ES are listening on
 *  their respective TCP ports.    But it's so tiny that I don't want
 *  to reorganize the repo to accommodate it (yet).
 *
 *  Many widely available *NIX programs do this task better (e.g.
 *  netcat, telnet, nmap, socat, ... we could even use netstat since
 *  we're interested only in the status of local ports).  But we want
 *  to keep the JanusGraph distribution self-contained insofar as is
 *  reasonable.
 */
public final class CheckSocket {

    private static final int E_USAGE = 1;
    private static final int E_FAILED = 2;
    private static final String MSG_USAGE =
            "Usage: " + CheckSocket.class.getSimpleName() + " hostname port";

    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println(MSG_USAGE);
            System.exit(E_USAGE);
        }
        try {
            Socket s = new Socket(InetAddress.getByName(args[0]),
                                  Integer.parseInt(args[1]));
            s.close();
            System.exit(0);
        } catch (IOException ignored) {
            System.err.println(ignored.toString());
            System.exit(E_FAILED);
        }
    }
}
