/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.ignite.internal.visor.misc;
import java.net.InetAddress;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.ignite.IgniteException;
import org.apache.ignite.internal.processors.task.GridInternal;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.visor.VisorJob;
import org.apache.ignite.internal.visor.VisorOneNodeTask;
import org.apache.ignite.lang.IgniteBiTuple;
/**
* Task that resolve host name for specified IP address from node.
*/
@GridInternal
public class VisorResolveHostNameTask extends VisorOneNodeTask<Void, Map<String, String>> {
/** */
private static final long serialVersionUID = 0L;
/** {@inheritDoc} */
@Override protected VisorResolveHostNameJob job(Void arg) {
return new VisorResolveHostNameJob(arg, debug);
}
/**
* Job that resolve host name for specified IP address.
*/
private static class VisorResolveHostNameJob extends VisorJob<Void, Map<String, String>> {
/** */
private static final long serialVersionUID = 0L;
/**
* Create job.
*
* @param arg List of IP address for resolve.
* @param debug Debug flag.
*/
private VisorResolveHostNameJob(Void arg, boolean debug) {
super(arg, debug);
}
/** {@inheritDoc} */
@Override protected Map<String, String> run(Void arg) {
Map<String, String> res = new HashMap<>();
try {
IgniteBiTuple<Collection<String>, Collection<String>> addrs =
IgniteUtils.resolveLocalAddresses(InetAddress.getByName("0.0.0.0"), true);
assert (addrs.get1() != null);
assert (addrs.get2() != null);
Iterator<String> ipIt = addrs.get1().iterator();
Iterator<String> hostIt = addrs.get2().iterator();
while (ipIt.hasNext() && hostIt.hasNext()) {
String ip = ipIt.next();
String hostName = hostIt.next();
if (hostName == null || hostName.trim().isEmpty()) {
try {
if (InetAddress.getByName(ip).isLoopbackAddress())
res.put(ip, "localhost");
}
catch (Exception ignore) {
//no-op
}
}
else if (!hostName.equals(ip))
res.put(ip, hostName);
}
}
catch (Exception e) {
throw new IgniteException("Failed to resolve host name", e);
}
return res;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(VisorResolveHostNameJob.class, this);
}
}
}