{"id":803,"date":"2005-07-22T02:00:00","date_gmt":"2005-07-22T09:00:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=803"},"modified":"2005-07-22T02:00:00","modified_gmt":"2005-07-22T09:00:00","slug":"echando-codigo-%c2%bfcomo-monitorear-a-nfs-usando-java-hablemos-onc-rpc-i","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2005\/07\/22\/echando-codigo-%c2%bfcomo-monitorear-a-nfs-usando-java-hablemos-onc-rpc-i\/","title":{"rendered":"Echando c\u00f3digo: \u00bfComo monitorear a NFS usando Java? (hablemos ONC RPC, I)"},"content":{"rendered":"<p><a href=\"http:\/\/www.flickr.com\/photos\/josevnz\/13912434\/\" title=\"Photo Sharing\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/photos14.flickr.com\/13912434_9bd941bd3f.jpg\" alt=\"Manhattan\" height=\"500\" width=\"375\" \/><br \/>Muchas aplicaciones dependen de NFS para funcionar correctamente, como bloques uno encima de el otro. \u00bfComo asegurarse de que este servicio est\u00e1 trabajando como se debe?<\/a><\/p>\n<p>Si no sabe que es NFS, entonces <a href=\"http:\/\/www.marquezetelecom.com\/LuCAS\/Tutoriales\/NISNFS\/nis-nfs98.doc.gz\">lease primero este tutorial<\/a> y despu\u00e9s vuelva aqu\u00ed. Tambi\u00e9n para este articulo yo asumo que usted ya ha escrito programas en Java con anterioridad y que sabe algunos conceptos b\u00e1sicos de redes.<\/p>\n<p>Es una pregunta interesante, ya que <a href=\"http:\/\/www.faqs.org\/rfcs\/rfc1094.html\">NFS<\/a> utiliza <a href=\"http:\/\/www.ietf.org\/rfc\/rfc1831.txt\">RPC<\/a> como protocolo principal (<span style=\"font-style: italic;\">m\u00e1s abajo est\u00e1n UDP o TCP pero eso es otra cosa<\/span>); As\u00ed que quizas los m\u00e1s f\u00e1cil es simular una transacci\u00f3n sintetica (como por ejemplo para monitorear una base de datos podemos hablar <a href=\"http:\/\/elangelnegro.blogspot.com\/2004\/11\/echando-cdigo-obteniendo-la-metadata.html\">JDBC y preguntar por la metada <\/a>directamente). Se me ocurre que pedir un listado de archivos en el directorio exportado puede ser una prueba decente (limitando el n\u00famero de archivos a cierto n\u00famero, por si el directorio es grande).<\/p>\n<p>Usted se puede estar preguntando lo siguiente: \u00bfNo es m\u00e1s eficiente preguntar estas cosas por <a href=\"http:\/\/elangelnegro.blogspot.com\/2005\/01\/echando-cdigo-monitoreando-la-carga-de.html\">SNMP<\/a> (quizas <a href=\"http:\/\/elangelnegro.blogspot.com\/2005\/03\/trucos-unix-como-saber-si-un-demonio.html\">extendiendo la configuraci\u00f3n de el agente<\/a> para que llame a los comandos nativos <a style=\"font-style: italic;\" href=\"http:\/\/linuxcommand.org\/man_pages\/nfsstat8.html\">nfstat<\/a><span style=\"font-style: italic;\"> o <\/span><a style=\"font-style: italic;\" href=\"http:\/\/linuxcommand.org\/man_pages\/showmount8.html\">showmount<\/a><span style=\"font-style: italic;\"> por ejemplo<\/span>)? Quizas s\u00ed, despu\u00e9s de todo RPC es un protoclo m\u00e1s pesado que SNMP. Pero por otro lado si usted no puede instalar demonios adicionales en la m\u00e1quina o su organizaci\u00f3n no soporta SNMP, entonces \u00bfque alternativa le queda?<\/p>\n<p>Despu\u00e9s de mucho buscar, me consegui con una librer\u00eda GPL llamada &#8220;<a href=\"http:\/\/remotetea.sourceforge.net\/\">Remote Tea<\/a>&#8220;. Ya hay varias implementaciones (entre ellas <a href=\"http:\/\/members.aol.com\/_ht_a\/markmitche11\/jnfsd.htm\">un demonio de NFS<\/a>) as\u00ed que quizas esto es lo que estaba buscando.<\/p>\n<p>Lo primero que hacemos es preparar a un servidor NFS de pruebas. Si usted utiliza Linux quizas pudiera hacer algo como esto (necesita ser root, para el ejemplo asumo que su red interna es 192.168.0.0\/24 y que est\u00e1 compartiendo \/usr\/local\/src.):<\/p>\n<blockquote  style=\"font-family:courier new;\"><p><span style=\"font-size:85%;\">[root@localhost ~]# <span style=\"color: rgb(204, 0, 0);\">cat \/etc\/exports<\/span><br \/>\/usr\/local\/src 127.0.0.1\/255.0.0.0(ro) 192.168.0.0\/255.255.255.0(ro)<br \/>[root@localhost ~]# \/etc\/init.d\/nfs restart<br \/>Shutting down NFS mountd:                                 <span style=\"color: rgb(51, 204, 0);\"> [  OK  ]<\/span><br \/>Shutting down NFS daemon:                                 <span style=\"color: rgb(51, 204, 0);\"> [  OK  ]<\/span><br \/>Shutting down NFS quotas:                                    <span style=\"color: rgb(51, 204, 0);\">[  OK  ]<\/span><br \/>Shutting down NFS services:                                  <span style=\"color: rgb(51, 204, 0);\">[  OK  ]<\/span><br \/>Starting NFS services:                                    <span style=\"color: rgb(51, 204, 0);\"> [  OK  ]<\/span><br \/>Starting NFS quotas:                                         <span style=\"color: rgb(51, 204, 0);\">[  OK  ]<\/span><br \/>Starting NFS daemon:                                         <span style=\"color: rgb(51, 204, 0);\">[  OK  ]<\/span><br \/>Starting NFS mountd:                                      <span style=\"color: rgb(51, 204, 0);\"> [  OK  ]<\/span><br \/>[root@localhost ~]# s<span style=\"color: rgb(204, 0, 0);\">howmount -e localhost<\/span><br \/>Export list for localhost:<br \/>\/usr\/local\/src 192.168.0.0\/255.255.255.0<br \/>[root@localhost ~]#<\/span><\/p><\/blockquote>\n<p>Y para estar completamente seguros (\u00bflos demonios se registraron con RPC?):<\/p>\n<blockquote  style=\"font-family:courier new;\"><p><span style=\"font-size:85%;\">[root@localhost ~]# <span style=\"color: rgb(255, 0, 0);\">rpcinfo -p localhost<\/span><br \/><span style=\"color: rgb(0, 153, 0);\">program vers proto   port<\/span><br \/>100000    2   tcp    111  portmapper<br \/>100000    2   udp    111  portmapper<br \/>100024    1   udp  32829  status<br \/>100024    1   tcp  32771  status<br \/>100011    1   udp    912  rquotad<br \/>100011    2   udp    912  rquotad<br \/>100011    1   tcp    915  rquotad<br \/>100011    2   tcp    915  rquotad<br \/>100003    2   udp   2049  nfs<br \/>100003    3   udp   2049  nfs<br \/>100003    4   udp   2049  nfs<br \/>100003    2   tcp   2049  nfs<br \/>100003    3   tcp   2049  nfs<br \/><span style=\"color: rgb(255, 0, 0);\">100003    4   tcp   2049  nfs<\/span><br \/>100021    1   udp  32839  nlockmgr<br \/>100021    3   udp  32839  nlockmgr<br \/>100021    4   udp  32839  nlockmgr<br \/>100021    1   tcp  32777  nlockmgr<br \/>100021    3   tcp  32777  nlockmgr<br \/>100021    4   tcp  32777  nlockmgr<br \/>100005    1   udp    924  mountd<br \/>100005    1   tcp    927  mountd<br \/>100005    2   udp    924  mountd<br \/>100005    2   tcp    927  mountd<br \/>100005    3   udp    924  mountd<br \/>100005    3   tcp    927  mountd<\/span><\/p><\/blockquote>\n<p>Note que rpcinfo nos da informaci\u00f3n muy importante acerca de el demonio que queremos contactar. <span style=\"font-style: italic;\">En este caso es el n\u00famero de el programa, la versi\u00f3n, el protocolo y el nombre<\/span>. Anotelo en alg\u00fan lado, ya que esto ser\u00e1 requerido en cuanto nos intentemos conectar.<\/p>\n<p>Para nuestro experimiento, vamos a asegurarnos que nos podemos conectar a nuestra propia m\u00e1quina Linux sin restricciones de seguridad. Para ello el archivo &#8216;\/etc\/hosts.allow&#8217; debe decir:<\/p>\n<blockquote><p>ALL:localhost.localdomain,127.0.0.1<\/p><\/blockquote>\n<p>Y el archivo &#8216;\/etc\/hosts.deny&#8217;:<\/p>\n<blockquote><p>ALL:ALL<\/p><\/blockquote>\n<p>Hay una limitaci\u00f3n de seguridad con nuestro cliente. Como no lo vamos a correr como root sino como un usuario no privilegiado, el cliente no va a poder abrir <span style=\"font-style: italic;\">puertos menores a 1024<\/span>. Mountd no le va a permitir a usted conectarse desde un puerto inseguro (mayor que 1024):<\/p>\n<blockquote><p>Jul 20 22:55:15 localhost rpc.mountd: refused mount request from localhost.localdomain for \/usr\/local\/src (\/usr\/local\/src): <span style=\"color: rgb(255, 0, 0);\">illegal port 32791<\/span><\/p><\/blockquote>\n<p>La cura es f\u00e1cil (<span style=\"font-style: italic;\">\/etc\/exports<\/span>, puede revisar los mensajes de autenticaci\u00f3n exitosos con &#8216;t<span style=\"font-style: italic;\">ail -f \/var\/log\/messages<\/span>&#8216;):<\/p>\n<blockquote><p>\/usr\/local\/src 127.0.0.1\/255.0.0.0(insecure,ro) 192.168.0.0\/255.255.255.0(insecure,ro)<\/p><\/blockquote>\n<p>Una vez que el demonio de NFS est\u00e1 arriba y que vemos que funciona entonces podemos empezar a jugar con el cliente de monitoreo. Lo primero que tiene que hacer es desempacar el archivo zip que se encuentra en Source Forge, y ponga los archivos JAR en el ClassPath.<\/p>\n<p>La pregunta es, para alguien que no sabe nada de ONC RPC (<span style=\"font-style: italic;\">yo por ejemplo<\/span>), <span style=\"font-style: italic;\">\u00bfque tan dificil puede ser hacer un programa que haga ping, basandose s\u00f3lo en los RFC?<\/span>. Primero que nada vamos a hacer un &#8220;<span style=\"font-style: italic;\">hola mundo<\/span>&#8220;, el cual s\u00f3lo va a tratar de conectarse al demonio apropiado de RPC (para ello vea las lineas que resalt\u00e9 en rojo en el paso anterior). El c\u00f3digo es el siguiente (basado en los m\u00e9todos descritos en el JavaDoc):<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">package<\/span> com.blogspot.elangelnegro.nfs;<br \/><span class=\"gutter\">   2:<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax9\">import<\/span> java.net.InetAddress;<br \/><span class=\"gutter\">   4:<\/span><br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax9\">import<\/span> java.io.IOException;<br \/><span class=\"gutter\">   6:<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax9\">import<\/span> org.acplt.oncrpc.OncRpcClient;<br \/><span class=\"gutter\">   8:<\/span><span class=\"syntax9\">import<\/span> org.acplt.oncrpc.OncRpcProgramNotRegisteredException;<br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax9\">import<\/span> org.acplt.oncrpc.OncRpcException;<br \/><span class=\"gutterH\">  10:<\/span><span class=\"syntax9\">import<\/span> org.acplt.oncrpc.OncRpcProtocols;<br \/><span class=\"gutter\">  11:<\/span><br \/><span class=\"gutter\">  12:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax8\">final<\/span> <span class=\"syntax10\">class<\/span> Ping <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  13:<\/span><br \/><span class=\"gutter\">  14:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Error<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">exit<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">code<\/span><br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  17:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax8\">final<\/span> <span class=\"syntax10\">int<\/span> ERROR_EXIT_CODE<span class=\"syntax18\">=<\/span><span class=\"syntax5\">192<\/span>;<br \/><span class=\"gutter\">  18:<\/span><br \/><span class=\"gutter\">  19:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutterH\">  20:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">RPC<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">program<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">ID<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">NFSD<\/span><br \/><span class=\"gutter\">  21:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  22:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax8\">final<\/span> <span class=\"syntax10\">int<\/span> RPC_PROGRAM_NFSD<span class=\"syntax18\">=<\/span><span class=\"syntax5\">100003<\/span>;<br \/><span class=\"gutter\">  23:<\/span><br \/><span class=\"gutter\">  24:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutterH\">  25:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">The<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">RPC<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">program<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">version<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">for<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">NFSD<\/span><br \/><span class=\"gutter\">  26:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  27:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax8\">final<\/span> <span class=\"syntax10\">int<\/span> RPC_PROGRAM_NFSD_VERSION<span class=\"syntax18\">=<\/span><span class=\"syntax5\">4<\/span>;<br \/><span class=\"gutter\">  28:<\/span><br \/><span class=\"gutter\">  29:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">main<\/span>(String [] args) <span class=\"syntax8\">throws<\/span> Exception <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  30:<\/span>                OncRpcClient client <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;<br \/><span class=\"gutter\">  31:<\/span>                <span class=\"syntax8\">if<\/span> ( <span class=\"syntax18\">!<\/span> ( (args <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">&<\/span><span class=\"syntax18\">&amp;<\/span> (args[<span class=\"syntax5\">0<\/span>] <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>)) ) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  32:<\/span>                        <span class=\"syntax8\">throw<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">IllegalArgumentException<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Please<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">specify<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">host<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">where<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">NFS<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">daemon<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">is<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">running!<\/span><span class=\"syntax13\">\"<\/span>);<br \/><span class=\"gutter\">  33:<\/span>                <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  34:<\/span>                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  35:<\/span>                     client <span class=\"syntax18\">=<\/span> OncRpcClient.<span class=\"syntax6\">newOncRpcClient<\/span>(<br \/><span class=\"gutter\">  36:<\/span>                         InetAddress.<span class=\"syntax6\">getByName<\/span>(args[<span class=\"syntax5\">0<\/span>]),<br \/><span class=\"gutter\">  37:<\/span>                                 RPC_PROGRAM_NFSD,<br \/><span class=\"gutter\">  38:<\/span>                                 RPC_PROGRAM_NFSD_VERSION,<br \/><span class=\"gutter\">  39:<\/span>                         OncRpcProtocols.ONCRPC_TCP);<br \/><span class=\"gutterH\">  40:<\/span>                         client.call(0, XdrVoid.XDR_VOID, XdrVoid.XDR_VOID);<br \/><span class=\"gutter\">  41:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> ( OncRpcProgramNotRegisteredException exp) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  42:<\/span>                     System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">ONC\/RPC<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">program<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">server<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">not<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">found<\/span><span class=\"syntax13\">\"<\/span>);<br \/><span class=\"gutter\">  43:<\/span>                     <span class=\"syntax8\">throw<\/span> exp;<br \/><span class=\"gutter\">  44:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (OncRpcException exp) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  45:<\/span>                     System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Could<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">not<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">contact<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">portmapper:<\/span><span class=\"syntax13\">\"<\/span>);<br \/><span class=\"gutter\">  46:<\/span>                     exp.<span class=\"syntax6\">printStackTrace<\/span>(System.out);<br \/><span class=\"gutter\">  47:<\/span>                         <span class=\"syntax8\">throw<\/span> exp;<br \/><span class=\"gutter\">  48:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException exp) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  49:<\/span>                     System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Could<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">not<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">contact<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">portmapper:<\/span><span class=\"syntax13\">\"<\/span>);<br \/><span class=\"gutterH\">  50:<\/span>                     exp.<span class=\"syntax6\">printStackTrace<\/span>(System.out);<br \/><span class=\"gutter\">  51:<\/span>                         <span class=\"syntax8\">throw<\/span> exp;<br \/><span class=\"gutter\">  52:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">finally<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  53:<\/span>                         <span class=\"syntax8\">if<\/span> (client <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  54:<\/span>                                 <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  55:<\/span>                                         client.<span class=\"syntax6\">close<\/span>();                     <br \/><span class=\"gutter\">  56:<\/span>                                 <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (Exception ignore) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  57:<\/span>                                         <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Do<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">nothing<\/span><br \/><span class=\"gutter\">  58:<\/span>                                 <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  59:<\/span>                         <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  60:<\/span>                <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  61:<\/span>        System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">NFS<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">daemon<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">is<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">registered<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">with<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">RPC<\/span><span class=\"syntax13\">\"<\/span>);<br \/><span class=\"gutter\">  62:<\/span><span class=\"syntax18\">      }<\/span><br \/><span class=\"gutter\">  63:<\/span><br \/><span class=\"gutter\">  64:<\/span><span class=\"syntax18\">}<\/span><br \/><\/pre>\n<p>Compilamos el programa, lo corremos y si todo est\u00e1 bien deberiamos ver lo siguiente:<\/p>\n<blockquote><p><span style=\"color: rgb(51, 204, 0);\">java com.blogspot.elangelnegro.nfs.Ping localhost<\/span><br \/><span style=\"color: rgb(0, 0, 153);\">NFS daemon is registered with RPC<\/span><\/p><\/blockquote>\n<p>Pero, \u00bf<span style=\"font-style: italic;\">Y se puede hacer algo m\u00e1s interesante, como leer que archivos hay en el directorio que est\u00e1 siendo exportado usando NFS<\/span>?. No hay almuerzo gr\u00e1tis as\u00ed que hacemos una pausa y nos leemos los RFC relacionados (<a href=\"http:\/\/www.ietf.org\/rfc\/rfc1831.txt\">RFC1831<\/a> y <a href=\"http:\/\/www.faqs.org\/rfcs\/rfc1094.html\">RFC1094<\/a>).<\/p>\n<p>Haciendo un resumen ultra violento, nos encontramos que:<\/p>\n<ol>\n<li>Primero debemos hablar con el protocolo mount el cual nos va a dar el punto de partida para poder conectarnos a NFS. <span style=\"font-style: italic;\">Vea el apendice A del RFC 1094 para m\u00e1s detalles<\/span>.<\/li>\n<li>Una vez obtenido los valores con Mount, es entonces que usamos NFS.<\/li>\n<\/ol>\n<p> No se asuste, las analog\u00edas con como usted utiliza mount son identicas; Mount se encarga de lidiar con problemas de permisolog\u00eda, autenticaci\u00f3n, etc y luego es con NFS que usted puede empezar a trabajar con sus archivos, pero una vez que el directorio est\u00e1 montado.<\/p>\n<p>Si estamos utilizando un servidor bajo Linux, quizas lo m\u00e1s f\u00e1cil es utilizar el compilador de archivos X el cual nos dar\u00e1 las clases de Java necesarias (les muestro un peque\u00f1o wrapper, usted haga los cambios necesarios):<\/p>\n<blockquote  style=\"font-family:courier new;\"><p><span style=\"font-size:85%;\"><span style=\"font-size:100%;\">#!\/bin\/bash<br \/># Check the IBM RedBook: http:\/\/www.redbooks.ibm.com\/redpapers\/pdfs\/redp3882.pdf<br \/># Author: josevnz@users.sourceforge.net<br \/># Blog: El Angel Negro &#8211; http:\/\/elangelnegro.blogspot.com<br \/>#<br \/>CLASSPATH=<span style=\"color: rgb(0, 0, 153);\">\/home\/josevnz\/jars\/jrpcgen.jar:\/home\/josevnz\/jars\/oncrpc.jar:\/home\/josevnz\/jars\/portmap.jar:.<\/span><br \/>DESTDIR=\/home\/josevnz\/java\/NFSPing\/src\/com\/blogspot\/elangelnegro\/nfs\/client\/<br \/>mkdir -p $DESTDIR &#038;&amp; rm -f $DESTDIR\/* &#038;&amp; cd \/usr\/include\/rpcsvc &#038;&amp; for stub in nfs_prot.x mount.x ; do<br \/>  <span style=\"color: rgb(0, 153, 0);\">\/usr\/java\/jdk1.5.0_03\/bin\/java -jar \/home\/josevnz\/jars\/<span style=\"color: rgb(255, 0, 0);\">jrpcgen.jar<\/span> -p com.blogspot.elangelnegro.nfs.client -withcallinfo -d $DESTDIR $stub<\/span><br \/>done<\/span><br \/><\/span><\/p><\/blockquote>\n<p>Esto va a generar un mont\u00f3n de clases en Java, las cuales van a ser utilizadas por nuestra aplicaci\u00f3n. Busque por aquellas que dicen &#8220;<span style=\"font-style: italic;\">client*.java<\/span>&#8221; ya que con ellas llamaremos a nuestro servidor RPC. Lo otro que notar\u00e1 en el c\u00f3digo es que cada uno de los m\u00e9todos remotos descritos en el RFC tiene su contraparte en las clases clientes de Java. Por ejemplo, esto es lo que tengo en mi directorio despu\u00e9s de correr el script.<\/p>\n<blockquote  style=\"font-family:courier new;\"><p><span style=\"font-size:100%;\">[josevnz@localhost ~]$ cd java\/NFSPing\/src\/com\/blogspot\/elangelnegro\/nfs\/client\/[josevnz@localhost<br \/><\/span>  <span style=\"font-size:100%;\">client]$ ls<br \/>attrstat.java    groupnode.java           nfsstat.java<br \/>createargs.java  groups.java              nfstime.java<br \/>dirlist.java     linkargs.java            readargs.java<br \/>diropargs.java   mountbody.java           readdirargs.java<br \/>diropokres.java <span style=\"color: rgb(255, 0, 0);\"> mountClient.java<\/span>         readdirres.java<br \/>diropres.java    mount.java               readlinkres.java<br \/>dirpath.java     mountlist.java           readokres.java<br \/>entry.java       mountServerStub.java     readres.java<br \/>exportnode.java  name.java                renameargs.java<br \/>exports.java     nfscookie.java           sattrargs.java<br \/>fattr.java       nfs_fh.java              sattr.java<br \/>fhandle.java     nfspath.java             statfsokres.java<br \/>fhstatus.java    <span style=\"color: rgb(255, 0, 0);\">nfs_protClient.java<\/span>      statfsres.java<br \/>filename.java    nfs_prot.java            symlinkargs.java<br \/>ftype.java       nfs_protServerStub.java  writeargs.java<br \/>[josevnz@localhost client]$<\/span><\/p><\/blockquote>\n<p>Bueno, espero que esta peque\u00f1o articulo le haya resultado \u00fatil y entretenido.  Consegu\u00ed un tutorial muy bueno de <a href=\"http:\/\/www.cs.arizona.edu\/computer.help\/policy\/DIGITAL_unix\/AA-Q0R5B-TET1_html\/onc-rpc2.html\">ONC RPC<\/a> y la gente de IBM m<a href=\"http:\/\/www.redbooks.ibm.com\/redpapers\/pdfs\/redp3882.pdf\">uestra m\u00e1s de como usar Remote Tea con sus servidores<\/a>.<\/p>\n<p><span style=\"font-style: italic;\">En una segunda entrega<\/span> les mostrar\u00e9 el c\u00f3digo cliente de NFSPing, as\u00ed como un enlace para que se baje el c\u00f3digo.<\/p>\n<p><span style=\"font-style: italic;\">Etiquetas en Technorrati<\/span>:<a href=\"http:\/\/technorati.com\/tag\/nfs\" rel=\"tag\"> nfs<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Muchas aplicaciones dependen de NFS para funcionar correctamente, como bloques uno encima de el otro. \u00bfComo asegurarse de que este servicio est\u00e1 trabajando como se debe? Si no sabe que es NFS, entonces lease primero este tutorial y despu\u00e9s vuelva aqu\u00ed. Tambi\u00e9n para este articulo yo asumo que usted ya ha escrito programas en Java <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2005\/07\/22\/echando-codigo-%c2%bfcomo-monitorear-a-nfs-usando-java-hablemos-onc-rpc-i\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/803"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=803"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/803\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=803"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}