Traducido a 9 de Octubre de 1996 Samba COMO
 David Wood, [email protected]
 Traducido por: Ricardo Javier C�rdenes Medina,
 [email protected]
 v1.0, 10 de Agosto de 1996

 Este documento describe la manera de usar el paquete Samba, que dota a
 Linux de soporte para el protocolo Session Message Block (SMB),
 tambi�n llamado NetBIOS o LanManager.
 ______________________________________________________________________

 �ndice General:

 1.      Introducci�n

 2.      M�s Informaci�n

 3.      Instalaci�n

 4.      Ejecutando los demonios

 5.      Configuraci�n General ( /etc/smb.conf )

 6.      Compartiendo Una Unidad Linux Con M�quinas Windows

 7.      Compartiendo Una Unidad Windows Con M�quinas Linux

 8.      Compartiendo Una Impresora Linux Con M�quinas Windows

 9.      Compartiendo Una Impresora Windows Con M�quinas Linux

 10.     Copyright

 11.     Reconocimientos

 12.     Notas sobre/del traductor

 13.     Anexo: El INSFLUG
 ______________________________________________________________________

 1.  Introducci�n

 Este el es SMB COMO. Describe c�mo usar el protocolo Session Message
 Block (SMB), tambi�n llamado protocolo NetBIOS o LanManager, con el
 Linux.

 Este documento es mantenido por David Wood ([email protected]).
 Cualquier a�adido, modificaci�n o correcci�n puedes enviarla aqu� para
 incluirla en la siguiente entrega.

 El protocolo SMB es usado por Microsoft Windows 3.11, NT y 95 para
 compartir discos e impresoras. Usando el paquete de herramientas Samba
 creado por Andrew Tridgell, las m�quinas UNIX (incluyendo Linux)
 pueden compartir discos e impresoras con servidores Windows.

 Hay cuatro cosas que uno puede hacer con Samba:

 1. Compartir una unidad de Linux con m�quinas Windows.

 2. Compartir una unidad de Windows con m�quinas Linux.

 3. Compartir una impresora de Linux con m�quinas Windows.

 4. Compartir una impresora de Windows con m�quinas Linux.

 Todos estos puntos est�n cubiertos en este documento.

 Excusatorio: Los procedimientos y scripts le funcionan al autor o se
 sabe que les funciona a la gente que los don�. Algunas configuraciones
 pueden dar problemas con la informaci�n que aqu� se da. Si te
 encuentras en tal situaci�n, puedes mandar un e-mail al autor con
 sugerencias para mejorar este documento, pero el autor no garantiza
 nada. �Qu� esperabas? El autor tambi�n es un experto, despu�s de
 todo...

 2.  M�s Informaci�n

 Este COMO intenta explicar la configuraci�n de servicios SMB b�sicos
 de ficheros e impresoras en una m�quina Linux. Samba es un paquete muy
 complejo y completo.  No deber�a haber raz�n para duplicar toda la
 documentaci�n de Samba aqu�.

 Para mayor informaci�n, por favor lee alguno de estos documentos:

 �  La documentaci�n de Samba, disponible en el paquete de distribuci�n
    del Samba. El paquete est� disponible en:
    ftp://nimbus.anu.edu.au/pub/tridge/samba/

 �  El COMO "Imprimiendo en Linux". (Linux Printing HOWTO)

 �  El Mini-HOWTO Print2Win.

 3.  Instalaci�n

 La �ltima versi�n del c�digo de Samba est� disponible en:

 ftp://nimbus.anu.edu.au/pub/tridge/samba/

 De todas maneras, si has instalado la distribuci�n RedHat de Linux,
 tienes la opci�n de instalarlo como paquete. Algunas otras
 distribuciones tambi�n incluyen los ejecutables de Samba.

 Se requieren los dos demonios siguientes para el paquete Samba. Se
 suelen instalar en /usr/sbin y se pueden ejecutar tanto desde los
 scripts de arranque del sistema como desde inetd. Algunos scripts de
 ejemplo los puedes ver en ``Ejecutando los demonios''.

 �  smbd (El demonio de SMB)

 �  nmbd (Provee un nameserver de NetBIOS para soporte de clientes)

 Habitualmente, se instalan en /usr/bin los siguientes ejecutables de
 Samba, aunque la localizaci�n (como de costumbre) es opcional.

 �  smbclient       (Un cliente SMB para maquinas UNIX)

 �  smbprint        (Un script para imprimir a una impresora en un
    servidor SMB)

 �  smbprint.sysv   (Como el de encima, pero para m�quinas UNIX SVR4)

 �  smbstatus       (Lista de las conexiones SMB en marcha en el
    servidor local)

 �  smbrun          (Un script 'cola' para facilitar la ejecuci�n de
    aplicaciones en servidores )

 Adicionalmente, se incluye en este COMO un script llamado 'print', que
 sirve como un �til front end para el script smbprint.

 El paquete Samba es sencillo de instalar. Simplemente consigue el
 c�digo fuente del servidor que nombramos antes, y lee el fichero
 README de la distribuci�n.  Hay tambi�n un fichero llamado
 docs/INSTALL.txt en la distribuci�n que te da un sencillo conjunto de
 instrucciones paso a paso.

 Siguiendo con la instalaci�n, pon los demonios en /usr/sbin y los
 ejecutables en /usr/bin. Instala las p�ginas del manual en
 /usr/local/man.

 Cuando compiles el paquete Samba, deber�as especificar en el Makefile
 la localizaci�n del fichero de configuraci�n, smb.conf. Generalmente
 deber�a estar en /etc, pero puedes ponerlo donde quieras. A estas
 alturas, presumimos que especificaste la localizaci�n del fichero de
 configuraci�n como /etc/smb.conf, el fichero de registro como
 /var/log/samba-log.%m y el directorio de bloqueo como /var/lock/samba

 Instala el fichero de configuraci�n, smb.conf. Ve al directorio donde
 se compil� el Samba. Mira en el directorio examples/simple y lee el
 fichero README. En ese directorio encontrar�s el fichero smb.conf.
 C�pialo en /etc. �TEN CUIDADO! Si tienes una distribuci�n de Linux que
 tiene el Samba instalado ya, puede que ya tengas un fichero de
 configuraci�n en /etc. Probablemente deber�as usar el antiguo.

 Si no quieres que tu configuraci�n est� en /etc, ponla donde quieras y
 luego pon un enlace simb�lico en /etc:

              ln -s /path/to/smb.conf /etc/smb.conf

 4.  Ejecutando los demonios

 Los dos demonios de SMB son /usr/bin/smbd y /usr/sbin/nmbd.

 Puedes ejecutar los demonios de Samba desde inetd o como procesos
 independientes . Si est�s configurando un servidor de ficheros
 permanente, deber�an ejecutarse desde inetd para que sean reejecutados
 si 'mueren'. Si solo quieres usar los servicios SMB de vez en cuando o
 como ayuda a la administraci�n del sistema, puedes ejecutarlos con un
 script en /etc/rc.d/init.d o incluso a mano cuando los necesites.

 Para ejecutar los demonios desde inetd, pon las siguientes l�neas en
 el fichero de configuraci�n de inetd, /etc/inetd.conf:

          # Servicios SAMBA NetBIOS (para compartici�n de ficheros e impresoras en PC)
          netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
          netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd

 Entonces reejecuta inetd con el siguiente comando:

          kill -HUP 1

 Para ejecutarlos desde los scripts de inicio del sistema, pon las
 siguientes l�neas en /etc/rc.d/init.d/smb y hazle un enlace simb�lico
 con los ficheros indicados en los comentarios:

      ______________________________________________________________________
          #!/bin/sh
          #
          # /etc/rc.d/init.d/smb - comienza y termina los servicios SMB.
          #
          # Se deben crear los siguientes ficheros como enlaces simbolicos a este fichero:
          # symlinks: /etc/rc.d/rc1.d/K35smb  (Termina los servicios SMB al cerrar el sistema)
          #           /etc/rc.d/rc3.d/S91smb  (Comienza los servicios SMB en modo multiusuario)
          #           /etc/rc.d/rc6.d/K35smb  (Termina los servicios SMB al hacer un reboot)
          #

          # Libreria de funciones
          . /etc/rc.d/init.d/functions

          # Configuracion de red
          . /etc/sysconfig/network

          # Asegurarse que la red esta a punto
          [ ${NETWORKING} = "no" ] && exit 0

          # Comprobar como fuimos llamados
          case "$1" in
            empezar)
              echo -n "Poniendo en marcha los servicios SMB: "
              daemon smbd -D
              daemon nmbd -D
              echo
              touch /var/lock/subsys/smb
              ;;
            parar)
              echo -n "Terminando los servicios SMB: "
              killproc smbd
              killproc nmbd
              rm -f /var/lock/subsys/smb
              echo ""
              ;;
            *)
              echo "Modo de uso: smb {empezar|parar}"
              exit 1
          esac

      ______________________________________________________________________

 5.  Configuraci�n General ( /etc/smb.conf )

 La configuraci�n de Samba en un Linux (u otra m�quina UNIX) es
 controlada por un solo fichero, /etc/smb.conf. Este fichero determina
 qu� recursos del sistema quieres compartir con el mundo exterior y que
 restricciones deseas poner en ellos.

 Como las siguientes secciones 'direccionar�n' la compartici�n de
 unidades e impresoras de Linux con m�quinas Windows, el fichero
 smb.conf mostrado en esta secci�n es lo m�s simple posible, solo para
 prop�sitos introductorios.

 No te preocupes por los detalles, a�n. Otras secciones m�s adelante
 introducir�n los conceptos m�s importantes.

 Cada secci�n del fichero empieza con una cabecera como [global],
 [impresoras], etc.

 La secci�n [global] define unas pocas variables que Samba usar� para
 definir la compartici�n de todos los recursos.

 La secci�n [homes] permite a los usuarios remotos acceder a sus
 respectivos directorios principales en la m�quina Linux local (cada
 uno al suyo nada m�s). Esto es, si un usuario de Windows intenta
 conectar a este recurso desde su m�quina Windows, ser� conectado a su
 directorio personal. A tener en cuenta que para hacer esto, tiene que
 tener una cuenta en la m�quina Linux. ;-)

 El fichero smb.conf que viene debajo como ejemplo permite a los
 usuarios remotos acceder a su directorio principal en la m�quina local
 y escribir en un directorio temporal. Para que un usuario de Windows
 vea estos recursos, la m�quina Linux debe estar en la red local.
 Entonces el usuario simplemente conecta una unidad de red desde el
 Explorador de Windows o el Windows File Manager.

 F�jate que en las siguientes secciones, se dar�n entradas adicionales
 a este fichero para permitir la compartici�n de m�s recursos.

 ______________________________________________________________________

 ; /etc/smb.conf
 ;
 ; Reinicia el servidor cada vez que hagas cambios a este fichero, ej:
 ; /etc/rc.d/init.d/smb parar
 ; /etc/rc.d/init.d/smb empezar

 [global]
 ; Quita el comentario a la siguiente linea si quieres cuentas de invitado
 ; guest account = nobody
    log file = /var/log/samba-log.%m
    lock directory = /var/lock/samba
    share modes = yes

 [homes]
    comment = Directorios principales
    browseable = no
    read only = no
    create mode = 0750

 [tmp]
    comment = Espacio de ficheros temporales
    path = /tmp
    read only = no
    public = yes

 ______________________________________________________________________

 6.  Compartiendo Una Unidad Linux Con M�quinas Windows

 Como se muestra en el fichero smb.conf anterior, compartir una unidad
 Linux con usuarios Windows es f�cil. De todas maneras, como todo lo
 dem�s con Samba, puedes tener las cosas MUY controladas. Aqu� tienes
 unos pocos ejemplos:

 Para compartir un directorio con todo el mundo, crea una copia de la
 secci�n [tmp] a�adiendo algo como esto al smb.conf:

      ______________________________________________________________________

      [public]
         comment = Cosas publicas
         path = /home/public
         public = yes
         writable = yes
         printable = yes

      ______________________________________________________________________

 Para que este directorio lo pueda leer todo el mundo, pero que s�lo lo
 puedan cambiar gente del grupo 'laborales', modifica la entrada de
 esta manera:

      ______________________________________________________________________

      [public]
         comment = Cosas publicas
         path = /home/public
         public = yes
         writable = yes
         printable = no
         write list = @laborales

      ______________________________________________________________________

 Para aprender otros truquillos con que jugar con las unidades
 compartidas, mira la documentaci�n de Samba o las p�ginas del man.

 7.  Compartiendo Una Unidad Windows Con M�quinas Linux

 Se incluye un programa cliente de SMB para m�quinas UNIX con la
 distribuci�n de Samba. Provee un interfaz estilo ftp para la l�nea de
 comandos. Puedes usar esta utilidad para transferir ficheros entre un
 'servidor' Windows y un cliente unix.

 Para ver qu� recursos est�n disponibles en un host dado, ejecuta:

          /usr/sbin/smbclient -L host

 donde 'host' es el nombre de la m�quina que quieres 'ver'. Esto
 devolver� un lista de nombres de 'servicios' --esto es, nombres de
 unidades o impresoras que puede compartir contigo--. A menos que el
 servidor SMB no tenga la seguridad configurada, te preguntar� por una
 clave. Dale la clave de la cuenta de 'invitados' o de tu cuenta
 personal en esa m�quina.

 Por ejemplo:

          smbclient -L zimmerman

 La salida de este comando deber�a ser algo parecido a esto:

 Server time is Sat Aug 10 15:58:27 1996
 Timezone is UTC+10.0
 Password:
 Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]

 Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[]

         Sharename      Type      Comment
         ---------      ----      -------
         ADMIN$         Disk      Remote Admin
         public         Disk      Public
         C$             Disk      Default share
         IPC$           IPC       Remote IPC
         OReilly        Printer   OReilly
         print$         Disk      Printer Drivers

 This machine has a browse list:

         Server               Comment
         ---------            -------
         HOPPER               Samba 1.9.15p8
         KERNIGAN             Samba 1.9.15p8
         LOVELACE             Samba 1.9.15p8
         RITCHIE              Samba 1.9.15p8
         ZIMMERMAN

 La lista muestra otros servidores SMB con recursos para compartir con
 la red.

 Para usar el cliente, ejecuta:

          /usr/sbin/smbclient servicio <password>

 donde 'servicio' es una m�quina y un servicio. Por ejemplo, si est�s
 intentando entrar en un directorio que ha sido compartido como
 'public' en una m�quina llamada zimmerman, el servicio deber�a
 llamarse \\zimmerman\public. De todas maneras, debido a restricciones
 del shell, necesitar�s poner las barras invertidas con secuencias de
 escape, por lo que al final saldr� algo parecido a esto:

          /usr/sbin/smbclient \\\\zimmerman\\public miclave

 donde 'miclave' es una cadena literal con tu password.

 Entonces te aparecer� el 'prompt' del smbclient:

 Server time is Sat Aug 10 15:58:44 1996
 Timezone is UTC+10.0
 Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
 smb: \>

 Escribe 'h' para obtener una ayuda de como usar el cliente:

      smb: \> h
      ls             dir            lcd            cd             pwd
      get            mget           put            mput           rename
      more           mask           del            rm             mkdir
      md             rmdir          rd             prompt         recurse
      translate      lowercase      print          printmode      queue
      cancel         stat           quit           q              exit
      newer          archive        tar            blocksize      tarmode
      setmode        help           ?              !
      smb: \>

 Si sabes usar el ftp, no deber�as necesitar las p�ginas del man del
 smbclient.

 8.  Compartiendo Una Impresora Linux Con M�quinas Windows

 Para compartir una impresora Linux con m�quinas Windows, necesitas
 asegurarte de que la impresora est� preparada para trabajar bajo
 Linux. Si puedes imprimir desde Linux, preparar una 'compartici�n' SMB
 de la impresora es autom�tico.

 M�rate el COMO Imprimir (Printing HOWTO) para poner a punto la
 impresora con Linux.

 Como el autor usa una impresora conectada a una m�quina Windows NT,
 esta secci�n no deber�a ser vista como algo definitivo, sino como mera
 sugerencia.  Cualquiera que tenga detalles que compartir con el autor,
 por favor, que los mande a [email protected] para que esta secci�n
 pueda ser completada.

 A�ade la configuraci�n de la impresora a tu smb.conf:

 ______________________________________________________________________

 [global]
    printing = bsd
    printcap name = /etc/printcap
    load printers = yes
    log file = /var/log/samba-log.%m
    lock directory = /var/lock/samba

 [printers]
    comment = Todas las impresoras
    security = server
    path = /var/spool/lpd/lp
    browseable = no
    printable = yes
    public = yes
    writable = no
    create mode = 0700

 [ljet]
    security = server
    path = /var/spool/lpd/lp
    printer name = lp
    writable = yes
    public = yes
    printable = yes
    print command = lpr -r -h -P %p %s

 ______________________________________________________________________

 �Aseg�rate de que el 'path' de la impresora (en este caso bajo [ljet])
 se corresponde al directorio de 'spool' en /etc/printcap!

 NOTA: Hay algunos problemas compartiendo impresoras conectadas a UNIX
 con m�quinas Windows NT usando Samba. Un problema es que NT 'vea' la
 impresora compartida correctamente. Para conseguirlo, m�rate las notas
 en la distribuci�n de Samba en el fichero docs/WinNT.txt. El otro va
 con problemas con las claves. M�rate los comentarios en ese mismo
 fichero para conseguir una molesta ganancia de conocimientos y fallos
 (jejeje) para arreglar el problema.

 9.  Compartiendo Una Impresora Windows Con M�quinas Linux

 Para compartir una impresora en una m�quina Windows, debes hacer lo
 siguiente:

 a) Debes tener las entradas adecuadas en /etc/printcap y deben
 corresponderse a la estructura de directorios local (el directorio de
 spool, etc)

 b) Debes tener el script /usr/bin/smbprint. Viene con las fuentes de
 Samba, pero no con la distribuci�n de ejecutables del Samba. M�s abajo
 comentamos una copia ligeramente modificada.

 c) Si quieres convertir ficheros ASCII a PostScript, debes tener el
 'nenscript' o su equivalente. nenscript es un conversor de PostScript
 y habitualmente est� instalado en /usr/bin.

 d) Puedes desear que las impresiones de Samba sean m�s sencillas
 teniendo un front end f�cil de usar. M�s abajo tienes un sencillo
 script en perl para manejar ASCII, PostScript o PostScript generado.
 La entrada para /etc/printcap que tenemos debajo es para una impresora
 HP 5MP en un host Windows NT. Las entradas son las siguientes:

 ______________________________________________________________________

         cm - comentario
         lp - nombre del dispositivo a abrir para salida
         sd - el directorio de spool de la impresora (en la m�quina local)
         af - el fichero de cuentas
         mx - el tamano maximo del fichero (cero es ilimitado)
         if - nombre del fichero de entrada (script)

 ______________________________________________________________________

 Para m�s informaci�n, lee el COMO Imprimir (Printing HOWTO) o la
 p�gina del man de printcap.

      ______________________________________________________________________

      # /etc/printcap
      #
      # //zimmerman/oreilly via smbprint
      #
      lp:\
              :cm=HP 5MP PostScript OReilly en zimmerman:\
              :lp=/dev/lp1:\
              :sd=/var/spool/lpd/lp:\
              :af=/var/spool/lpd/lp/acct:\
              :mx#0:\
              :if=/usr/bin/smbprint:

      ______________________________________________________________________

 Aseg�rate de que los directorios de spool y cuentas existe y se puede
 escribir en ellos. Asegura tambi�n que la l�nea 'if' tiene el path
 adecuado para el script smbprint (que damos debajo) y que apunta al
 dispositivo adecuado. (el fichero /dev especial).

 Lo siguiente es el propio script smbprint. Normalmente est� en
 /usr/bin y es atribuible a Andrew Tridgell, la persona que cre� el
 Samba (que yo sepa). Viene con la distribuci�n de las fuentes del
 Samba, pero est� ausente de algunas distribuciones de ejecutables, por
 lo que lo he recreado aqu�.

 Te podr�a interesar mirarlo con cuidado. Hay algunas peque�as
 alteraciones que han demostrado ser �tiles.

 ______________________________________________________________________

 #!/bin/sh -x

 # Este script es un filtro de entrada para la impresion de printcap en
 # una maquina unix. Usa el programa smbclient para imprimir un fichero
 # en el servidor y servicio basados en smb especificados.
 # Por ejemplo, puedes tener una entrada en printcap como esta
 #
 # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
 #
 # que creara una impresora unix llamada "smb" que imprimira a traves de
 # este script. Necesitarras crear el directorio de spool /usr/spool/smb
 # con los permisos y pertenencias apropiados para tu sistema.

 # Ahora preparalos con el servidor y servicio en que quieras imprimir
 # En este ejemplo tengo un PC WfWg llamado "lapland" que tiene una
 # impresora exportada llamada "printer" sin password.

 #
 # Script alterado por [email protected] (Michael Hamilton)
 # para que servicio, servidor y clave puedan ser leidos desde un
 # fichero /usr/var/spool/lpd/PRINTNAME/.config
 #
 # Para que esto funcione la entrada en /etc/printcap debe incluir un
 # fichero de cuentas (af=...):
 #
 #   cdcolour:\
 #       :cm=CD IBM Colorjet on 6th:\
 #       :sd=/var/spool/lpd/cdcolour:\
 #       :af=/var/spool/lpd/cdcolour/acct:\
 #       :if=/usr/local/etc/smbprint:\
 #       :mx=0:\
 #       :lp=/dev/null:
 #
 # El fichero /usr/var/spool/lpd/PRINTNAME/.config deberia contener:
 #   servidor=SERVIDOR_PC
 #   servicio=NOMBRE_IMP
 #   clave="clave"
 #
 # Ej.
 #   servidor=PAULS_PC
 #   servicio=CJET_371
 #   clave=""

 #
 # Fichero de registro para correcciones, cambiar a /dev/null si se quiere
 #
 fichreg=/tmp/smb-print.log
 # fichreg=/dev/null

 #
 # El ultimo parametro para el filtro es el nombre del fichero de
 # cuentas
 #
 dir_spool=/var/spool/lpd/lp
 fich_config=$dir_spool/.config

 # Deberia leer las siguientes variables activadas en el fichero de
 # configuracion:
 #   servidor
 #   servicio
 #   clave
 #   usuario
 eval `cat $fich_config`
 #
 # Algo de ayuda en la correccion de errores. Cambia el >> por > si
 # quieres salvar algo de espacio.
 #
 echo "servidor $servidor, servicio $servicio" >> $fichreg

 (
 # NOTA: Puede que quieras anadir la linea `echo translate' si quieres CR/LF
 # automatico cuando imprimes.
         echo translate
         echo "print -"
         cat
 ) | /usr/bin/smbclient "\\\\$servidor\\$servicio" $clave -U $usuario -N -P >> $fichreg

 ______________________________________________________________________

 La mayor�a de las distribuciones de Linux vienen con el nenscript para
 convertir los documentos ASCII a Postscript. El siguiente script perl
 hace la vida m�s f�cil dando un interfaz sencillo para que linux
 imprima a trav�s de smbprint.

 ______________________________________________________________________

 Forma de uso: print [-a|c|p] <nombre_fichero>
               -a imprime <nombre_fichero> como ASCII
               -c imprime <nombre_fichero> formateado como codigo fuente
               -p imprime <nombre_fichero> como Postscript
       Si no se pasa ningun parametro, print intenta
       averiguar el tipo de fichero e imprimirlo
       adecuadamente.

 ______________________________________________________________________

 smbprint tiende a truncar las l�neas demasiado largas cuando imprime
 ficheros ASCII. Este rompe las l�neas largas donde haya un espacio en
 blanco (en lugar de en mitad de una palabra), si es posible.

 El formateado de c�digo fuente se hace con nenscript. Coge un fichero
 ASCII y lo formatea en 2 columnas con una cabecera mu' mona (fecha,
 nombre de fichero , etc). Adem�s enumera las l�neas. Us�ndolo como
 ejemplo, se pueden lograr otros tipos de formateado.

 Los documentos Postscript tambi�n se imprimen correctamente, por lo
 que pasan directamente.

 ______________________________________________________________________

 #!/usr/bin/perl

 # Script:   print
 # Autores:  Brad Marshall, David Wood
 #           Plugged In Communications
 # Fecha:    960808
 # Cambios:  Ricardo Javier Cardenes Medina
 # Razon:        Traduccion de comentarios y codigo a espanol para
 #               mayor comprension.
 # Fecha:    961109 (Sab 9 de Noviembre de 1996)
 #
 # Script para imprimir a Oreilly que esta actualmente en zimmerman.
 # Proposito: Toma ficheros de varios tipos como parametros y
 # los procesa apropiadamente para mandarlos al script de impresion de Samba.
 #
 # Tipos soportados actualmente:
 #
 # ASCII      - Asegura que las lineas con mas de $largo_linea caracteres seran
 #              divididas aprovechando los espacios en blanco.
 # PostScript - No hace nada.
 # Codigo     - Lo formatea en PostScript (usando nenscript) para una mejor
 #              presentacion (fuente, etc...).
 #

 # Maxima longitud permitida para cada linea de texto ASCII.
 $largo_linea = 76;

 # Path y nombre del script 'print' de Samba.
 $prog_print = "/usr/bin/smbprint";

 # Path y nombre del nenscript (el convertidor ASCII-->PostScript)
 $nenscript = "/usr/bin/nenscript";

 unless ( -f $prog_print ) {
         die "�No encuentro $prog_print!";
 }
 unless ( -f $nenscript ) {
         die "�No encuentro $nenscript!";
 }

 &InterpLinCom(@ARGV);

 # DBG
 print "El tipo de fichero es $tipofich\n";

 if ($tipofich eq "ASCII") {
         &Rompe($largo_linea);
 } elsif ($tipofich eq "codigo") {
         &FormateaCodigo;
 } elsif ($tipofich eq "postscript") {
         &CreaTabla;
 } else {
         print "Lo siento..tipo de fichero desconocido.\n";
         exit 0;
 }
 # Enviar el array a smbprint
 open(IMPRESORA, "|$prog_print") || die "�No puedo abrir $prog_print: $!\n";
 foreach $linea (@newlines) {
         print IMPRESORA $linea;
 }
 # Enviar un avance de linea extra en caso de que el fichero tenga una
 # ultima linea incompleta.
 print IMPRESORA "\n";
 close(IMPRESORA);
 print "Terminado\n";
 exit 0;

 # --------------------------------------------------- #
 #         Todo lo de debajo es una subrutina          #
 # --------------------------------------------------- #

 sub InterpLinCom {
         # Interpreta la linea de comando, averiguando el tipo de fichero

         # Toma $par y $fich como parametro (si existe) y nombre del
         # fichero.
         if ($#_ < 0) {
                 &FormaUso;
         }
         # DBG
         #       foreach $elemento (@_) {
         #               print "*$elemento* \n";
         #       }

         $par = shift(@_);
         if ($par =~ /\-./) {
                 $com = $par;
         # DBG
         #       print "\Encontrado $com.\n";

                 $fich = shift(@_);
         } else {
                 $fich = $par;
         }

         # Defining the file type
         unless ($com) {
                 # No tenemos par�metro

                 if ($fich =~ /\.ps$/) {
                         $tipofich = "postscript";
                 } elsif ($fich =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) {
                         $tipofich = "codigo";
                 } else {
                         $tipofich = "ASCII";
                 }

                 # Procesa $fich buscando el tipo y devuelve $tipofich
         } else {
                 # Tenemos el tipo en $par
                 if ($com =~ /^-p$/) {
                         $tipofich = "postscript";
                 } elsif ($com =~ /^-c$/) {
                         $tipofich = "codigo";
                 } elsif ($com =~ /^-a$/) {
                         $tipofich = "ASCII"
                 }
         }
 }

 sub FormaUso {
         print "
 Forma de uso: print [-a|c|p] <nombre_fichero>
               -a imprime <nombre_fichero> como ASCII
               -c imprime <nombre_fichero> formateado como codigo fuente
               -p imprime <nombre_fichero> como Postscript
       Si no se pasa ningun parametro, print intenta
       averiguar el tipo de fichero e imprimirlo
       adecuadamente.\n
 ";
         exit(0);
 }

 sub Rompe {
         # Crea una tabla con las lineas del fichero, donde cada linea es
         # menor que el numero de caracteres especificado, y las rompe
         # solo en los espacios en blanco

         # Toma el numero de caracteres a los que limitar la linea.
         $limite = pop(@_);

         # DBG
         #print "Entrando en la subrutina Rompe\n";
         #print "El limite de caracteres es $limit\n";

         # Lee en el fichero, lo interpreta y pone en la tabla.
         open(FICHERO, "<$fich") || die "�No puedo abrir $fich: $!\n";
         while(<FICHERO>) {
                 $linea = $_;

                 # DBG
                 #print "La linea es:\n$linea\n";

                 # Rompe la linea si se pasa del limite.
                 while ( length($linea) > $limite ) {

                         # DBG
                         #print "Rompiendo...";

                         # Toma los primeros $limite +1 caracteres.
                         $cacho = substr($linea,0,$limite +1);

                         # DBG
                         #print "La linea parcial es:\n$cacho\n";

                         # Mira a ver si el ultimo caracter es un espacio.
                         $ultimo_car = substr($cacho,-1, 1);
                         if ( " " eq $ultimo_car ) {
                             # Si lo es, imprime el resto.

                             # DBG
                             #print "El ultimo caracter era un espacio\n";

                             substr($linea,0,$limite + 1) = "";
                             substr($cacho,-1,1) = "";
                             push(@newlines,"$cacho\n");
                         } else {
                              # Si no lo es, busca el ultimo espacio en la
                              # sub-linea e imprime hasta alli.

                             # DBG
                             #print "El ultimo caracter no era un espacio\n";

                              # Borra el ultimo caracter que pasa de $limite
                              substr($cacho,-1,1) = "";
                              # Da la vuelta a la linea para hacer mas
                              # sencillo buscar el espacio.
                              $cachoreves = reverse($cacho);
                              $indice = index($revpart," ");
                              if ( $indice > 0 ) {
                                substr($linea,0,$limite-$indice) = "";
                                push(@newlines,substr($cacho,0,$limite-$indice)
                                    . "\n");
                              } else {
                                  # No hay espacios en la linea, por lo que
                                  # se imprime hasta $limite.
                                substr($linea,0,$limite) = "";
                                push(@newlines,substr($cacho,0,$limite)
                                    . "\n");
                              }
                         }
                 }
                 push(@newlines,$linea);
         }
         close(FICHERO);
 }

 sub FormateaCodigo {
         # Llama a la subrutina Rompe cuando filtra a traves de nenscript
         &Rompe($largo_linea);

         # Manda los resultados a traves de nenscript para crear un
         # fichero Postscript que de una forma decente a nuestro codigo
         # fuente para imprimirlo (fuente Courier, numero de lineas, ...).
         # E imprime todo esto a un fichero temporal.
         $fichtmp = "/tmp/nenscript$$";
         open(FICHERO, "|$nenscript -2G -i$fich -N -p$fichtmpfich -r") ||
                 die "�No pude abrir nenscript: $!\n";
         foreach $linea (@newlines) {
                 print FICHERO $linea;
         }
         close(FICHERO);

         # Vuelca el fichero temporal en una tabla para que pueda
         # ser pasado al script de impresion de Samba.
         @newlines = ("");
         open(FICHERO, "<$fichtmp") || die "�No puedo abrir $fichtmp: $!\n";
         while(<FICHERO>) {
                 push(@newlines,$_);
         }
         close(FICHERO);
         system("rm $fichtmp");
 }

 sub CreaTabla {
         # Crear la tabla para postscript
         open(FICHERO, "<$fich") || die "�No puedo abrir $fich: $!\n";
         while(<FICHERO>) {
                 push(@newlines,$_);
         }
         close(FICHERO);
 }

 ______________________________________________________________________

 10.  Copyright

 This HOWTO is copyright 1996 by David Wood.  It may be reproduced in
 any form and freely distributed as long as the file stays intact,
 including this statement.

 Este COMO tiene un copyright de 1996 por David Wood. Puede ser
 reproducido en cualquier forma y distribuido libremente mientras el
 fichero se mantenga intacto , incluyendo esta l�nea.

 11.  Reconocimientos

 Tan pronto como me mandes sugerencias, te pondr� aqu� en la siguiente
 entrega.

 12.  Notas sobre/del traductor

 Este es mi primer trabajo para el INSFLUG, grupo del que tuve
 conocimiento esta misma semana (esto fue escrito el s�bado 9 de
 noviembre de 1996). Para que ve�is que aqu� nos damos prisa con las
 cosas y que esto va r�pido.

 Ricardo C�rdenes es un simple estudiante de la E.U. de Inform�tica en
 la ULPGC (Universidad de Las Palmas de Gran Canaria).

 Ahora mismo est� en su tercer a�o y tiene dos cosas que agradecer a la
 uni: Internet y el LiNUX. La primera la tiene presente desde el primer
 mes en la escuela. El segundo lo descubri� y empez� a quererlo y
 mimarlo desde que se vio obligado a ceder casi la mitad de su disco
 duro (210MB -sigh!-) para poder cumplir con unas pr�cticas de S.
 Operativos en mitad del segundo curso (hasta ahora no se ha
 arrepentido)

 Cualquier donaci�n para la compra de un nuevo disco duro y poder
 rebajar el 88-95% de ocupaci�n que se mantiene constantemente en las
 particiones, y as� poder dedicarse con m�s holgura a la traducci�n de
 COMOs, FAQs y cosas de esas que tan bien os vienen, ser� bien recibida
 }8-)))))

 Si quieres contactar con �l por alguna de esas extra�as razones de la
 vida (por ejemplo, una donaci�n para su nuevo disco duro 8-))))),
 pod�is dejarle un mensaje aqu�: [email protected]

 13.  Anexo: El INSFLUG

 El INSFLUG forma parte del grupo internacional Linux Documentation
 Project, encarg�ndose de las traducciones al castellano de los Howtos
 (Comos), as� como la producci�n de documentos originales en aquellos
 casos en los que no existe an�logo en ingl�s.

 En el INSFLUG se orienta preferentemente a la traducci�n de documentos
 breves, como los COMOs y PUFs (Preguntas de Uso Frecuente, las FAQs.
 :) ), etc.

 Dir�jase a la sede del INSFLUG para m�s informaci�n al respecto.

 En la sede del INSFLUG encontrar� siempre las �ltimas versiones de las
 traducciones:  www.insflug.org. Aseg�rese de comprobar cu�l es la
 �ltima versi�n disponible en el Insflug antes de bajar un documento de
 un servidor r�plica.

 Se proporciona tambi�n una lista de los servidores r�plica (mirror)
 del Insflug m�s cercanos a Vd., e informaci�n relativa a otros
 recursos en castellano.

 Francisco Jos� Montilla, [email protected].