package hudson.model; import hudson.Extension; import hudson.ExtensionList; import hudson.ExtensionPoint; import java.io.IOException; import java.net.InetAddress; import java.util.logging.Logger; /** * A way to see if a computer is reachable. * * @since 1.378 */ public abstract class ComputerPinger implements ExtensionPoint { /** * Is the specified address reachable? * * @param ia The address to check. * @param timeout Timeout in seconds. */ public abstract boolean isReachable(InetAddress ia, int timeout) throws IOException; /** * Get all registered instances. */ public static ExtensionList<ComputerPinger> all() { return Hudson.getInstance().getExtensionList(ComputerPinger.class); } /** * Is this computer reachable via the given address? * * @param ia The address to check. * @param timeout Timeout in seconds. */ public static boolean checkIsReachable(InetAddress ia, int timeout) throws IOException { for (ComputerPinger pinger : ComputerPinger.all()) { try { if (pinger.isReachable(ia, timeout)) { return true; } } catch (IOException e) { LOGGER.fine("Error checking reachability with " + pinger + ": " + e.getMessage()); } } return false; } /** * Default pinger - use Java built-in functionality. This doesn't always work, * a host may be reachable even if this returns false. */ @Extension public static class BuiltInComputerPinger extends ComputerPinger { @Override public boolean isReachable(InetAddress ia, int timeout) throws IOException { return ia.isReachable(timeout * 1000); } } private static final Logger LOGGER = Logger.getLogger(ComputerPinger.class.getName()); }