/* * $Id$ * * Copyright (C) 2003-2015 JNode.org * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; If not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.jnode.command.net; import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; import java.net.UnknownHostException; import org.acplt.oncrpc.OncRpcException; import org.acplt.oncrpc.OncRpcPortmapClient; import org.acplt.oncrpc.OncRpcProtocols; import org.acplt.oncrpc.OncRpcServerIdent; import org.jnode.shell.AbstractCommand; import org.jnode.shell.syntax.Argument; import org.jnode.shell.syntax.HostNameArgument; /** * rpcinfo command makes an RPC call to an RPC server and reports what it finds. * * @author Andrei Dore */ public class RpcInfoCommand extends AbstractCommand { private static final String help_host = "the host to be probed"; private static final String help_super = "Probe the portmapper on host, and print a list of all registered RPS " + "programs."; private static final String fmt_list_serv = "%1$10s %2$10s %3$10s %4$10s %5$10s"; private static final String str_program = "Program"; private static final String str_version = "Version"; private static final String str_protocol = "Protocol"; private static final String str_port = "Port"; private static final String str_name = "Name"; private static final String str_portmapper = "portmapper"; private static final String str_nfs = "nfs"; private static final String str_mountd = "mountd"; private static final String str_nlockmgr = "nlockmgr"; private static final String str_status = "status"; private static final String str_tcp = "tcp"; private static final String str_udp = "udp"; private static final String err_call = "Cannot make the rpc call to host %s%n"; private static final String err_host = "Unknown hostname %s%n"; private static final String err_connect = "Cannot connect to host %s%n"; private static final String fmt_unknown = "unknown service (%d)"; private final HostNameArgument argHost; public RpcInfoCommand() { super(help_super); argHost = new HostNameArgument("host", Argument.MANDATORY, help_host); registerArguments(argHost); } public static void main(String[] args) throws Exception { new RpcInfoCommand().execute(args); } public void execute() { OncRpcPortmapClient client = null; String hostname = argHost.getValue(); PrintWriter out = getOutput().getPrintWriter(); PrintWriter err = getError().getPrintWriter(); try { InetAddress host = InetAddress.getByName(hostname); client = new OncRpcPortmapClient(host, OncRpcProtocols.ONCRPC_UDP); OncRpcServerIdent[] servers = client.listServers(); out.printf(fmt_list_serv, str_program, str_version, str_protocol, str_port, str_name); out.println(); for (OncRpcServerIdent server : servers) { out.printf(fmt_list_serv, server.program, server.version, server.protocol == 6 ? str_tcp : str_udp, server.port, getName(server.program)); out.println(); } } catch (OncRpcException e) { err.format(err_call, hostname); exit(1); } catch (UnknownHostException e) { err.format(err_host, hostname); exit(1); } catch (IOException e) { err.format(err_connect, hostname); exit(1); } finally { if (client != null) { try { client.close(); } catch (OncRpcException e) { // Ignore exception on close } } } } private String getName(int program) { switch (program) { case 100000: return str_portmapper; case 100003: return str_nfs; case 100005: return str_mountd; case 100021: return str_nlockmgr; case 100024: return str_status; default: return String.format(fmt_unknown, program); } } }