<!-- 0,1 -->
<!-- Samba,0 -->
<!-- David,Wood,dwood@plugged.net.au -->
<!-- 1.0,1996-08-10 -->
<!-- SMB -->
<!-- Ricardo Javier,Cárdenes Medina,a1402@correo.dis.ulpgc.es -->
<!-- 1.0,1996-10-09 -->
<!-- netbios,samba,smb,windows -->
<!-- Software,Protocolos,SMB -->

<!doctype linuxdoc system>

<article>

<title>Samba COMO

<author>David Wood, <tt><htmlurl url="mailto:dwood@plugged.net.au" name="dwood@plugged.net.au"></tt> &nl;
Traducido por: Ricardo Javier Cárdenes Medina, <tt><htmlurl url="mailto:a1402@correo.dis.ulpgc.es" name="a1402@correo.dis.ulpgc.es"></tt>

<date>v1.0, 10 de Agosto de 1996
Traducido a 9 de Octubre de 1996

<abstract>
Este documento describe la manera de usar el paquete Samba, que dota a Linux
de soporte para el protocolo
<it>Session Message Block (SMB)</it>, también llamado 
<it>NetBIOS</it> o <it>LanManager</it>.
</abstract>

<!-- Tabla de contenidos -->
<toc>

<!-- Inicio del documento -->

<sect>Introducción

<p>

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

Este documento es mantenido por David Wood (<tt><htmlurl url="mailto:dwood@plugged.net.au" name="dwood@plugged.net.au"></tt>). 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 <it/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 <it/Samba/:

<enum>
<item>Compartir una unidad de Linux con máquinas Windows.
<item>Compartir una unidad de Windows con máquinas Linux.
<item>Compartir una impresora de Linux con máquinas Windows.
<item>Compartir una impresora de Windows con máquinas Linux.
</enum>

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...

<sect>Más Información

<P>

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

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

<itemize>
<item>La documentación de <it/Samba/, disponible en el paquete de distribución del 
<it/Samba/. El paquete está disponible en:
<tt><htmlurl url="ftp://nimbus.anu.edu.au/pub/tridge/samba/"
	    name="ftp://nimbus.anu.edu.au/pub/tridge/samba/"></tt>
<item>El COMO "Imprimiendo en Linux". (Linux Printing HOWTO)
<item>El Mini-HOWTO Print2Win.
</itemize>


<sect>Instalación

<P>

La última versión del código de <it/Samba/ está disponible en:

	<tt><htmlurl url="ftp://nimbus.anu.edu.au/pub/tridge/samba/"
	    name="ftp://nimbus.anu.edu.au/pub/tridge/samba/"></tt>

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

Se requieren los dos demonios siguientes para el paquete <it/Samba/. Se suelen instalar en <tt>/usr/sbin</tt> y se pueden ejecutar tanto desde los scripts de 
arranque del sistema como desde <tt/inetd/. Algunos scripts de ejemplo los 
puedes ver en <ref id="sec-daemons" name=
"Ejecutando los demonios">.

<itemize>
<item><tt/smbd/ (El demonio de SMB)
<item><tt/nmbd/ (Provee un nameserver de NetBIOS para soporte de clientes)
</itemize>

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

<itemize>
<item><tt/smbclient/       (Un cliente SMB para maquinas UNIX)
<item><tt/smbprint/        (Un script para imprimir a una impresora en un servidor SMB)
<item><tt/smbprint.sysv/   (Como el de encima, pero para máquinas UNIX SVR4)
<item><tt/smbstatus/       (Lista de las conexiones SMB en marcha en el servidor local)
<item><tt/smbrun/          (Un script 'cola' para facilitar la ejecución de 
aplicaciones en servidores )
</itemize>

Adicionalmente, se incluye en este COMO un script llamado '<tt/print/', que 
sirve como un útil <it/front end/ para el script <tt/smbprint/.

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

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

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

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

Si no quieres que tu configuración esté en <tt>/etc</tt>, ponla donde quieras 
y luego pon un enlace simbólico en <tt>/etc</tt>:

<tscreen><verb>
	ln -s /path/to/smb.conf /etc/smb.conf
</verb></tscreen>

<sect>Ejecutando los demonios<label id="sec-daemons">

<P>

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

Puedes ejecutar los demonios de <it/Samba/ desde <tt/inetd/ o como procesos independientes
. Si estás configurando un servidor de ficheros permanente, deberían ejecutarse
 desde <tt/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 <tt>/etc/rc.d/init.d</tt> o incluso a mano 
cuando los necesites.

Para ejecutar los demonios desde <tt/inetd/, pon las siguientes líneas en el 
fichero de configuración de <tt/inetd/, <tt>/etc/inetd.conf</tt>:

<tscreen><verb>
    # 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
</verb></tscreen>

Entonces reejecuta <tt/inetd/ con el siguiente comando:

<tscreen><verb>
    kill -HUP 1
</verb></tscreen>

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

<tscreen><code>
    #!/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" ] &ero;&ero; 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


</code></tscreen>

<sect>Configuración General (<tt>/etc/smb.conf</tt>)

<P>

La configuración de <it/Samba/ en un Linux (u otra máquina UNIX) es controlada por un
 solo fichero, <tt>/etc/smb.conf</tt>. 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 <tt/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 <tt>[global], [impresoras]</tt>, etc.

La sección <tt>[global]</tt> define unas pocas variables que <it/Samba/ usará para 
definir la compartición de todos los recursos.

La sección <tt>[homes]</tt> 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 <tt>smb.conf</tt> 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 <it/Explorador de Windows/ o el <it/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.

<tscreen><code>

; /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


</code></tscreen>


<sect>Compartiendo Una Unidad Linux Con Máquinas Windows

<P>

Como se muestra en el fichero <tt/smb.conf/ anterior, compartir una unidad 
Linux con usuarios Windows es fácil. De todas maneras, como todo lo demás con 
<it/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 <tt>[tmp]</tt> añadiendo algo como esto al <tt/smb.conf/:

<tscreen><code>

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


</code></tscreen>

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:

<tscreen><code>

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


</code></tscreen>

Para aprender otros truquillos con que jugar con las unidades compartidas, 
mira la documentación de <it/Samba/ o las páginas del man.


<sect>Compartiendo Una Unidad Windows Con Máquinas Linux

<P>

Se incluye un programa cliente de SMB para máquinas UNIX con la distribución de <it/Samba/. Provee un interfaz estilo <tt/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:

<tscreen><verb>
    /usr/sbin/smbclient -L host
</verb></tscreen>

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:

<tscreen><verb>
    smbclient -L zimmerman
</verb></tscreen>

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

<tscreen><verb>
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            
</verb></tscreen>

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

Para usar el cliente, ejecuta:

<tscreen><verb>
    /usr/sbin/smbclient servicio <password>
</verb></tscreen>

donde 'servicio' es una máquina y un servicio. Por ejemplo, si estás intentando
 entrar en un directorio que ha sido compartido como '<tt/public/' en una 
máquina llamada <tt/zimmerman/, el servicio debería llamarse &bsol;&bsol;zimmerman&bsol;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:

<tscreen><verb>
    /usr/sbin/smbclient \\\\zimmerman\\public miclave
</verb></tscreen>

donde '<tt/miclave/' es una cadena literal con tu password.

Entonces te aparecerá el 'prompt' del smbclient:

<tscreen><verb>
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: \> 
</verb></tscreen>

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

<tscreen><verb>
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: \> 
</verb></tscreen>

Si sabes usar el ftp, no deberías necesitar las páginas del man del <tt/smbclient/.


<sect>Compartiendo Una Impresora Linux Con Máquinas Windows

<P>

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
       <tt><htmlurl url="mailto:dwood@plugged.net.au"
		  name="dwood@plugged.net.au"></tt>
para que esta sección pueda ser completada.

Añade la configuración de la impresora a tu <tt/smb.conf/:

<tscreen><code>

[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


</code></tscreen>

¡Asegúrate de que el 'path' de la impresora (en este caso bajo <tt>[ljet]</tt>)
 se corresponde al directorio de '<it/spool/' en <tt>/etc/printcap</tt>!

NOTA: Hay algunos problemas compartiendo impresoras conectadas a UNIX con 
máquinas Windows NT usando <it/Samba/. Un problema es que NT 'vea' la impresora 
compartida correctamente. Para conseguirlo, mírate las notas en la distribución 
de <it/Samba/ en el fichero <tt>docs/WinNT.txt</tt>. 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.

<sect>Compartiendo Una Impresora Windows Con Máquinas Linux

<P>

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

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

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

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

d) Puedes desear que las impresiones de <it/Samba/ sean más sencillas teniendo un 
<it/front end/ fácil de usar. Más abajo tienes un sencillo script en <it/perl/ 
para manejar ASCII, PostScript o PostScript generado.

La entrada para <tt>/etc/printcap</tt> que tenemos debajo es para una 
impresora HP 5MP en un host Windows NT. Las entradas son las siguientes:

<code>

	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)


</code>

Para más información, lee el <it/COMO Imprimir (Printing HOWTO)/ o la página del
 man de <tt/printcap/.

<tscreen><code>

# /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:


</code></tscreen>

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

Lo siguiente es el propio script <tt/smbprint/. Normalmente está en <tt>/usr/bin</tt> y es atribuible a Andrew Tridgell, la persona que creó el <it/Samba/ (que yo 
sepa). Viene con la distribución de las fuentes del <it/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.

<tscreen><code>

#!/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 hamilton@ecnz.co.nz (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


</code></tscreen>

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

<code>

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.


</code>

<tt/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 <tt/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.

<tscreen><code>

#!/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!";
}

&ero;InterpLinCom(@ARGV);

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

if ($tipofich eq "ASCII") {
	&ero;Rompe($largo_linea);
} elsif ($tipofich eq "codigo") {
	&ero;FormateaCodigo;
} elsif ($tipofich eq "postscript") {
	&ero;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) {
		&ero;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
	&ero;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);
}


</code></tscreen>


<sect>Copyright

<P>

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.

<sect>Reconocimientos

<P>

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

<sect>Notas sobre/del traductor

<P>

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í: <tt><htmlurl url="mailto:a1402@correo.dis.ulpgc.es" name="a1402@correo.dis.ulpgc.es"></tt>

<sect>Anexo: El INSFLUG <label id="Grupos">
<p>

El <em/INSFLUG/ forma parte del grupo internacional 
<it/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 <bf/INSFLUG/ se orienta preferentemente a la traducción de documentos
breves, como los <em/COMOs/ y <em/PUFs/ (<bf/P/reguntas de
<bf/U/so <bf/F/recuente, las <it/FAQs/. <tt/:)/ ), etc.

Diríjase a la sede del INSFLUG para más información al respecto.

En la sede del INSFLUG encontrará siempre las <bf/últimas/ versiones 
de las traducciones:  <tt><htmlurl url="http://www.insflug.org" 
name="www.insflug.org"></tt>. 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 (<it/mirror/) del Insflug más cercanos a Vd.,  
e información relativa a otros recursos en castellano.

Francisco José Montilla, <tt><htmlurl url="mailto:pacopepe@insflug.org"
name="pacopepe@insflug.org"></tt>.

</article>
