SMB HOWTO
 David Wood, [email protected]
 [email protected], 28 Avril 1997.
 v1.0, 10 Ao�t 1996

 Voici le SMB-HOWTO, d�crivant comment utiliser sous Linux le protocole
 SMB (� Session Message Block �) �galement appel� le protocole NetBIOS
 ou LanManager.
 ______________________________________________________________________

 Table des mati�res


 1. Introduction

 2. Pour plus d'informations

 3. Installation

 4. Lancer les daemons

 5. Configuration g�n�rale (/etc/smb.conf)

 6. Partager un lecteur Linux avec des machines Windows

 7. Partager un r�pertoire Windows pour des machines Linux

 8. Partager une imprimante Linux pour des stations Windows

 9. Partager une imprimante Windows pour des clients Linux

 10. Copyright

 11. Remerciements



 ______________________________________________________________________

 11..  IInnttrroodduuccttiioonn

 Voici le SMB-HOWTO, d�crivant comment utiliser sous Linux le protocole
 SMB (� Session Message Block �) �galement appel� le protocole NetBIOS
 ou LanManager.

 Ce document est maintenu par David Wood ([email protected]).
 Veuillez envoyer vos ajouts, modifications ou corrections � cette
 adresse, pour qu'ils soient inclus dans la version suivante.

 Le protocole SMB est utilis� par Microsoft Windows 3.11, NT et 95 pour
 partager des disques et des imprimantes. En utilisant les outils Samba
 d'Andrew Tridgell, les syst�mes Unix (Linux inclus) peuvent �galement
 partager des disques et des imprimantes avec des h�tes Windows.

 Vous pouvez faire quatre choses avec Samba :


 1. Partager un disque Linux pour des machines Windows ;

 2. Acc�der � disque Windows depuis une machine Linux ;

 3. Partager une imprimante Linux pour des machines Windows ;

 4. Utiliser une imprimante Windows � partir d'un h�te Linux.


 Tous ces points sont abord�s dans ce document.

 Mise en garde : Les proc�dures d�crites et les scripts pr�sent�s
 fonctionnent pour l'auteur ou les personnes qui les ont �crits. Les
 informations donn�es dans ce document peuvent ne pas fonctionner sur
 une configuration diff�rente. Si vous rencontrez un probl�me, �crivez
 un mail � l'auteur avec vos suggestions pour l'am�lioration de ce
 document, mais l'auteur ne garantit rien. Qu'attendiez-vous ? Apr�s
 tout, l'auteur n'est qu'un consultant...


 22..  PPoouurr pplluuss dd''iinnffoorrmmaattiioonnss

 Cet HOWTO tente d'expliquer comment configurer de mani�re basique les
 services SMB de partage de fichier et d'imprimantes sous Linux. Samba
 est un ensemble de programme tr�s complet, et tr�s complexe �galement.
 Cela ne servirait � rien de recopier la documentation de Samba dans ce
 document.

 Pour de plus amples informations, veuillez vous r�f�rer aux documents
 suivants :


 �  La documentation de Samba, disponible au sein de la distribution de
    Samba. Cette distribution est disponible � :
    ftp://nimbus.anu.edu.au/pub/tridge/samba/
    <ftp://nimbus.anu.edu.au/pub/tridge/samba/>
    r�cup�rer les sources de Samba sur ftp.ibp.fr

 �  Le Printing-HOWTO.

 �  Le Print2Win Mini-HOWTO.



 33..  IInnssttaallllaattiioonn

 Les sources de la derni�re version de Samba sont disponibles sur :

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

 Cependant, si vous avez install� la distribution RedHat de Linux, vous
 pour pouvez l'installer comme paquetage. Certaines autres
 distributions proposent �galement un paquetage Samba (NdT : dont
 Slackware et Debian).

 Les deux � daemons � suivant sont n�cessaires pour Samba. Ils sont
 g�n�ralement install� dans le r�pertoire /usr/sbin et sont lanc�s soit
 au d�marrage soit par inetd. Des scripts d'exemple sont pr�sent�s dans
 la section ``Lancer les daemons''.


    ssmmbbdd
       Le daemon SMB ;


    nnmmbbdd
       Propose le support du serveur de nom NetBIOS aux clients.

 En g�n�ral, les binaires Samba suivant sont install�s dans /usr/bin,
 bien que leur emplacement soit variable.


    ssmmbbcclliieenntt
       Un client SMB pour machines Unix ;
    ssmmbbpprriinntt
       Un script pour imprimer sur l'imprimante d'un h�te SMB ;


    ssmmbbpprriinntt..ssyyssvv
       Comme ci-dessus, mais pour des Unix SVR4 ;


    ssmmbbssttaattuuss
       Liste les connexions SMB pr�sentes sur localhost ;


    ssmmbbrruunn
       Un script pour faciliter le lancement d'applications sur des
       h�tes SMB.

 De plus, un script nomm� � print � est inclus dans cet HOWTO. Il sert
 d'interface au script smbprint.

 Le paquetage Samba est simple � installer. Il suffit de r�cup�rer les
 sources depuis les sites mentionn�s plus haut, et de lire les fichiers
 README fournis dans la distribution. Le fichier docs/INSTALL.txt
 fourni un ensemble d'instruction simple pour une configuration pas �
 pas.

 Installez les daemons dans /usr/sbin et les autres programmes dans
 /usr/bin. Installez les pages _m_a_n dans /usr/local/man.

 Lors de la compilation du paquetage Samba, vous avez d� sp�cifier dans
 le Makefile l'emplacement du fichier de configuration, smb.conf. Il se
 trouve g�n�ralement dans /etc, mais vous pouvez le placer o� bon vous
 semble. Dans la suite du document, nous consid�rerons que ce fichier
 de configuration est /etc/smb.conf, que le fichier de log est
 /var/log/samba.log.%m (valeur de � logfile � dans le Makefile) et que
 le r�pertoire des _l_o_c_k_s (verrous) est /var/lock/samba (� lock
 directory � dans le Makefile).

 Installez le fichier de configuration, smb.conf.  Allez dans le
 r�pertoire dans lequel vous avez compil� Samba. Consultez le fichier
 README dans le r�pertoire examples/simple. Copiez le fichier smb.conf
 de ce r�pertoire vers /etc. ATTENTION !  Si vous utilisez une
 distribution Linux et que vous avez d�j� install� Samba, il doit d�j�
 exister un fichier smb.conf dans /etc. Vous devriez sans doute
 commencer avec celui-l�.

 Si vous ne d�sirez pas placer votre fichier de configuration dans
 /etc, mettez le dans le r�pertoire que de votre choix, et faites un
 lien symbolique dans /etc :



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





 44..  LLaanncceerr lleess ddaaeemmoonnss

 Les deux daemons SMB sont /ust/sbin/smbd et /usr/sbin/nmb.

 Vous pouvez lancer les daemons Samba depuis l'inetd ou en tant que
 processus ind�pendants. Si vous �tes en train de configurer un serveur
 de fichier, ils devraient �tre lanc�s depuis l'inetd afin de pouvoir
 �tre red�marrez s'ils sont tu�s. Si vous comptez simplement utiliser
 les services SMB occasionnellement, vous pouvez d�marrer les d�mons
 depuis un script /etc/rc.d/init.d ou m�me les lancer � la main lorsque
 vous en avez besoin.

 Pour lancer les daemons depuis l'inetd, mettez les lignes suivantes
 dans le fichier de configuration d'inetd, /etc/inetd.conf :



      # SAMBA NetBIOS services (for PC file and print sharing)
      netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
      netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd




 Et relancez le daemon inetd avec la commande :


     killall -HUP inetd



 Pour lancer les daemons depuis les scripts de d�marrage, copier le
 script suivant sous le nom /etc/rc.d/init.d/smb et faites des liens
 depuis les fichiers sp�cifi�s dans les commentaire sur ce script :









































 #!/bin/sh

 #
 # /etc/rc.d/init.d/smb - d�marre et stoppe les services SMB.
 #
 # Les fichiers suivants doivent �tre des liens symboliques vers ce fichier~:
 #    /etc/rc.d/rc1.d/K35smb  (Kille les services SMB � l'extinction)
 #    /etc/rc.d/rc3.d/S91smb  (D�marre les services SMB en mode
 #                             multi-utilisateur)
 #    /etc/rc.d/rc6.d/K35smb  (Kille les services SMB au red�marrage)

 # Charge la librairie de fonctions
 . /etc/rc.d/init.d/functions

 # Charge la configuration r�seau
 . /etc/sysconfig/network

 # V�rifie que le r�seau fonctionne
 [ ${NETWORKING} = "no" ] && exit 0

 # Traite les arguments
 case "$1" in
    start)
       echo -n "Starting SMB services: "
       daemon smbd -D
       daemon nmbd -D
       echo
       touch /var/lock/subsys/smb
      ~;;
    stop)
       echo -n "Shutting down SMB services: "
       killproc smbd
       killproc nmbd
       rm -f /var/lock/subsys/smb
       echo ""
      ~;;
    *)
       echo "Usage: smb {start|stop}"
       exit 1
 esac






 55..  CCoonnffiigguurraattiioonn gg��nn��rraallee ((//eettcc//ssmmbb..ccoonnff))

 La configuration de Samba sur une machine Linux (ou sur un autre Unix)
 est contr�l�e par un seul fichier, /etc/smb.conf. Ce fichier indique
 quelle ressources syst�me vous d�sirez partager avec le monde
 ext�rieur, et quelle restrictions vous voulez mettre dessus.

 Puisque les chapitres suivants vont traiter du partage de fichier et
 d'imprimantes avec des machines Windows, le fichier smb.conf pr�sent�
 dans ce chapitre est aussi simple que possible, en guise
 d'introduction.

 Ne vous inqui�tez pas pour les d�tails, en tout cas pas encore. Les
 chapitres suivants vont pr�senter les concepts fondamentaux.

 Chaque partie du fichier commence par une ent�te, comme par exemple
 [global], [homes], [printers], etc...

 La section [global] d�finit quelques variables communes pour le
 partage de toutes les ressources.
 La section [homes] permet � un utilisateur distant d'acc�der � son
 r�pertoire d'accueil (et uniquement aux sien) sur la machine Linux
 locale. C'est-�-dire que si un utilisateur Windows essaye de se
 connecter � ce r�pertoire partag� depuis sa machine Windows, il sera
 connect� sur sa r�pertoire d'accueil personnel. Notez que pour cela,
 il doit poss�der un compte sur l'h�te Linux.

 Le fichier smb.conf suivant donn� en exemple permet � des utilisateurs
 distants d'acc�der � leur r�pertoire _h_o_m_e sur la machine local et
 d'�crire dans un r�pertoire temporaire. Pour qu'un utilisateur Windows
 puisse voir ces partages, il faut que l'h�te Linux soit sur le r�seau
 local. Ainsi l'utilisateur connecte un lecteur r�seau depuis le
 gestionnaire de fichiers Windows ou l'Explorateur.

 Veuillez noter que dans les chapitres suivants, des champs seront
 ajout�s � ce fichier pour permettre � plus de ressources d'�tre
 partag�es.



      ; /etc/smb.conf
      ;
      ; Assurez vous de relancer le serveur apr�s avoir fait des changement , dans
      ; ce fichier. Par exemple~:
      ; /etc/rc.d/init.d/smb stop
      ; /etc/rc.d/init.d/smb start

      [global]
      ; d�commentez cette ligne si vous d�sirez autoriser les invit�s (comptes
      ; "guest") � se connecter
      ; guest account = nobody
         log file = /var/log/samba-log.%m
         lock directory = /var/lock/samba
         share modes = yes

      [homes]
         comment = R�pertoire homes
         browseable = no
         read only = no
         create mode = 0750

      [tmp]
         comment = Espace disque temporaire
         path = /tmp
         read only = no
         public = yes






 66..  PPaarrttaaggeerr uunn lleecctteeuurr LLiinnuuxx aavveecc ddeess mmaacchhiinneess WWiinnddoowwss

 Comme vous pouvez le constater avec le fichier smb.conf ci-dessus,
 partager des disques Linux avec des utilisateurs est simple.
 N�anmoins, comme pour tout avec Samba, vous pouvez tout contr�ler
 finement. Voici quelques exemples :

 Pour partager un r�pertoire public, cr�ez un clone de la section [tmp]
 ci-dessus en ajoutant le code suivant dans le smb.conf :





 [public]
    comment = Partage public
    path = /home/public
    public = yes
    writable = yes
    printable = yes




 Pour que le r�pertoire ci-dessus soit en lecture pour tout le monde
 mais uniquement en �criture pour les personnes du groupe staff,
 modifiez l'entr�e comme ci-dessous :



      [public]
         comment = Partage public
         path = /home/public
         public = yes
         writable = yes
         printable = no
         write list = @staff




 Pour d'autres trucs et astuces concernant les partages de r�pertoires,
 conf�rez vous � la documentation de Samba ou aux pages de manuel.


 77..  PPaarrttaaggeerr uunn rr��ppeerrttooiirree WWiinnddoowwss ppoouurr ddeess mmaacchhiinneess LLiinnuuxx

 Un client SMB pour un h�te Unix est inclus dans la distribution de
 Samba. Il fournit une interface semblable au ftp, en ligne de
 commande. Vous pouvez utiliser cette utilitaire pour transf�rer des
 fichiers entre un � serveur � Windows et un client Linux.

 Pour voir ce que partage une machine donn�e, utilisez :


 /usr/sbin/smbclient -L h�te



 o� � h�te � est le nom NetBIOS de la machine dont vous voulez voir les
 partages. Vous obtiendrez une liste des � services � en partage,
 c'est-�-dire le nom des r�pertoires ou des machines qu'il partage pour
 vous. A moins que le serveur SMB n'aient aucune protection, vous allez
 devoir saisir un mot de passe. Utilisez le mot de passe pour le compte
 d'invit� ou pour votre compte personnel sur cette machine.

 Par exemple :


     smbclient -L zimmerman



 Ce qui devrait donner quelque chose comme cela :






 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 � browse list � (liste des machines) montre quels sont les autres
 serveurs SMB partageant des ressources sur le r�seau.

 Pour utiliser le client, lancez :


 /usr/sbin/smbclient service <mot de passe>



 ou � service � est une machine et un nom de partage. Par exemple, si
 vous essayez d'acc�der � un r�pertoire en acc�s public sur une machine
 appel�e zimmerman, le service sera nomm� \\zimmerman\public.
 N�anmoins, � cause des restrictions de l'interpr�teur de commandes (le
 _s_h_e_l_l), vous allez devoir redoubler les _b_a_c_k_s_l_a_s_h_s, pour obtenir la
 ligne suivante :


 /usr/sbin/smbclient \\\\zimmerman\\public mon_mot_de_passe



 o� � mon_mot_de_passe � est votre mot de passe �crit tel quel.

 Vous allez obtenir la ligne de commande suivante :



      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: \>




 Tapez � h � pour obtenir de l'aide sur smbclient :



      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 vous savez utiliser ftp, vous ne devriez pas avoir besoin de lire
 la page de manuel de smbclient.



 88..  PPaarrttaaggeerr uunnee iimmpprriimmaannttee LLiinnuuxx ppoouurr ddeess ssttaattiioonnss WWiinnddoowwss

 Pour partager une imprimante Linux pour des stations Windows, vous
 devez �tre s�r que votre imprimante est configur�e pour fonctionner
 sous Linux. Si vous savez imprimer depuis Linux, la mise en place d'un
 partage de l'imprimante par SMB est quasi-automatique.

 Veuillez vous r�f�rer au Printing HOWTO pour la configuration de
 l'imprimante.

 Puisque l'auteur utilise une imprimante connect�e � une machine sous
 Windows NT, cette section ne doit pas �tre prise � la lettre, mais
 simplement comme une suggestion. Quiconque ayant des d�tails sur ce
 point est invit� � les envoyer � [email protected] afin que ce
 chapitre puisse �tre compl�t�.

 Ajoutez la configuration d'impression � votre 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 = Toutes les imprimantes
    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




 Assurez vous que le � path � (dans cet exemple, � l'int�rieur de la
 section [ljet]) corresponde au r�pertoire de _s_p_o_o_l d�fini dans
 /etc/printcap !

 NB : On constate quelques probl�mes pour le partage d'imprimante sur
 des des serveurs Unix, utilisant Samba, pour des clients sous Windows
 NT. Un des probl�mes est que NT ne voit pas l'imprimante partag�e
 correctement. Pour r�soudre ce probl�me, lisez les remarques dans le
 fichier docs/WinNT.txt de la distribution de Samba. Un autre probl�me
 existe avec les mots de passe. Voyez �galement dans ce fichier comment
 r�soudre le probl�me.


 99..  PPaarrttaaggeerr uunnee iimmpprriimmaannttee WWiinnddoowwss ppoouurr ddeess cclliieennttss LLiinnuuxx

 Pour partager une imprimante sur une machine Windows, vous devez
 suivre les points suivants :


 1. Vous devez avoir les entr�es correspondantes � l'imprimante dans
    /etc/printcap et elles doivent correspondre � la structure locale
    des r�pertoires (pour le r�pertoire de _s_p_o_o_l, etc...).

 2. Vous devez avoir le script /usr/bin/smbprint. Il est fournit avec
    les sources de Samba, mais pas avec toutes les distributions
    binaires. Une version l�g�rement modifi�e de ce script est
    pr�sent�e plus loin.

 3. Si vous voulez convertir des fichiers ASCII en Postscript, vous
    devez avoir nenscript, ou �quivalent. nenscript est un
    convertisseur Postscript et se trouve g�n�ralement dans /usr/bin.

 4. Vous voudrez peut-�tre simplifier l'impression � l'aide de Samba en
    utilisant une interface simple d'emploi. Un script simple, �crit en
    perl, pour g�rer l'ASCII ou le PostScript est pr�sent� ci-dessous.


 L'entr�e dans /etc/printcap est pour une imprimante HP 5 MP sur une
 machine utilisant Windows NT. Les entr�es sont comme suit :


 cm - commentaire
 lp - nom du p�riph�rique � ouvrir en �criture
 sd - le r�pertoire de spool de l'imprimante (sur la machine locale)
 af - le fichier d'accounting
 mx - la taille maximum de fichier (z�ro pour aucune limite)
 if - le nom du filtre en entr�e (un script)



 Pour plus ample information, lisez le Printing HOWTO ou la page de
 manuel de printcap.



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




 Assurez que le r�pertoire de spool et celui d'accounting existent et
 son accessibles en �criture, que le chemin correct vers le script
 smbprint (donn� ci-dessous) est indiqu� par la ligne � if � et que
 vous avez s�lectionn� le bon fichier de p�riph�rique (le fichier
 sp�cial dans /dev).

 Vient ensuite le script smbprint. Il est g�n�ralement mis dans le
 r�pertoire /usr/bin et a �t� cr�� par Andre Tridgell, le cr�ateur de
 Samba pour autant que je sache. Il est fourni avec la distribution
 sous forme de code source de Samba, mais est absent de certaines
 distribution binaires. Je l'ai donc recopi� ici.

 Examinez le avec attention. Certains changement fait � ce script se
 sont av�r�es �tre utiles.



















 #!/bin/sh -x

 # Ce script est un filtre d'entr�e sur l'impression avec printcap sur une
 # machine Linux. Il utilise le programme smbclient pour imprimer le fichier au
 # serveur et service sp�cifi�.
 # Par exemple, vous pouvez avoir une entr�e printcap comme celle-ci~:
 #
 # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
 #
 # qui cr�erai une imprimante Unix appel�e "smb" qui imprimerait par
 # l'interm�diaire de ce script. Vous devrez cr�er le r�pertoire de spool,
 # /usr/spool/smb avec les permissions qui conviennent et le bon propri�taire,
 # pour votre syst�me.

 # Mettez les valeurs pour le serveur et le service sur lequel vous voulez
 # imprimer.  Dans cet exemple, j'utilise un PC sous Windows pour Workgroups
 # nomm� "laplan" ayant une imprimante appel�e "printer" sans mot de passe.

 #
 # Script modifi� par [email protected] (Michael Hamilton) afin que le
 # serveur, le service et le mot de passe puissent �tre lus depuis un fichier
 # /usr/var/spool/lpd/PRINTNAME/.config
 #
 # Pour que ceci puisse fonctionner, l'entr�e du /etc/printcap doit inclure un
 # fichier d'accounting (af=...)~:
 #
 #   cdcolour:\
 #       :cm=CD IBM Colorjet au 6eme etage:\
 #       :sd=/var/spool/lpd/cdcolour:\
 #       :af=/var/spool/lpd/cdcolour/acct:\
 #       :if=/usr/local/etc/smbprint:\
 #       :mx=0:\
 #       :lp=/dev/null:
 #
 # Le fichier /usr/var/spool/lpd/PRINTNAME/.config devrait contenir~:
 #   server=SERVEUR_PC
 #   service=NOM_IMPRIMANTE
 #   password="mot_de_passe"
 #
 # Pas exemple~:
 #   server=MON_BO_PC
 #   service=CJET_371
 #   password=""

 #
 # Fichier de log pour debuggage, changez le � /dev/null si vous le voulez
 #
 logfile=/tmp/smb-print.log
 # logfile=/dev/null


 #
 # Le dernier param�tre du filtre est le nom du fichier d'accounting
 #
 spool_dir=/var/spool/lpd/lp
 config_file=$spool_dir/.config

 # Les variables suivantes devraient �tre lues depuis le fichier de
 # configuration~:
 #   server
 #   service
 #   password
 #   user
 eval `cat $config_file`

 #
 # Des informations de d�bogage, changez le >> en > si vous voulez �conomiser
 # de la place.
 #
 echo "server $server, service $service" >> $logfile

 (
 # NOTE Vous voudrez peut �tre ajouter la ligne "echo translate" si vous voulez
 # une conversion automatiques des CR/LF lors de l'impression
         echo translate
         echo "print -"
         cat
 ) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile




 La plupart des distributions Linux sont fournies avec nenscript pour
 convertir des documents ASCII en Postscript. Le script perl qui suit
 simplifie la vie en fournissant une interface simple � smbprint pour
 l'impression sous Linux.


 Usage: print [-a|c|p] <fichier>
        -a imprime <fichier> comme un fichier ASCII
        -c imprime <fichier> formatt� en code source
        -p imprime <fichier> en tant que fichier Postscript
        Si aucun param�tre n'est donn�, print tente de
        deviner le type de fichier et imprime en cons�quence.



 smbprint a tendance � tronquer les longues lignes lors de l'impression
 de fichiers ASCII. Ce script coupe les longues lignes sur les espaces
 (plut�t qu'au milieu d'un mot), si possible.

 Le formatage en code source est r�alis� par nenscript.Il prend en
 entr�e un fichier ASCII et le formatte sur deux colonnes avec une
 ent�te (date, nom du fichier, etc...). Il num�rote �galement les
 lignes. En prenant ce script comme exemple, on peut faire d'autres
 types de formatage.

 Les documents sont d�j� correctement format�s, donc ils passent
 directement � travers le filtre.























 #!/usr/bin/perl

 # Script:   print
 # Auteurs:  Brad Marshall, David Wood
 #           Plugged In Communications
 # Date:     960808
 #
 # Script pour imprimer sur oreilly qui est pour l'instant connect�e sur
 # zimmerman.
 # But:      Prendre diff�rentes sortes de fichier en argument et les
 #  traiter pour les injecter dans le script d'impression de Samba.
 #
 # Types de fichier support�s pour l'instant~:
 #
 # ASCII      - v�rifie que les lignes plus longues que $line_length
 #              caract�res sont coup�s sur un espace.
 # Postscript - Aucune action.
 # Code       - Formatte en Postscript (� l'aide de nenscript) pour un
 #              affichage correct (orientation, fonte, etc...).
 #

 # Fixe la longueur maximale d'une ligne de texte ASCII
 $line_length = 76;

 # Le chemin d'acc�s vers le script d'impression de Samba
 $print_prog = "/usr/bin/smbprint";

 # Le chemin vers le programme nenscript (le convertisseur
 # ASCII->Postscript)
 $nenscript = "/usr/bin/nenscript";

 unless ( -f $print_prog ) {
         die "Je ne peux pas trouver $print_prog!";
 }
 unless ( -f $nenscript ) {
         die "Je ne peux pas trouver $nenscript!";
 }

 &ParseCmdLine(@ARGV);

 # D�bug
 print "filetype is $filetype\n";

 if ($filetype eq "ASCII") {
         &wrap($line_length);
 } elsif ($filetype eq "code") {
         &codeformat;
 } elsif ($filetype eq "ps") {
         &createarray;
 } else {
         print "D�sol�, ce n'est pas un type de fichier que je connais";
         exit 0;
 }
 # Envoie le tableau � smbprint
 open(PRINTER, "|$print_prog")
          || die "Je ne peux pas ouvrir $print_prog: $!\n";

 foreach $line (@newlines) {
         print PRINTER $line;
 }
 # Envoie un retour � la ligne suppl�mentaire si jamais le fichier a sa
 # derni�re ligne incompl�te
 print PRINTER "\n";
 close(PRINTER);
 print "Achev�\n";
 exit 0;
 # --------------------------------------------------- #
 #       Tout ce qui suit est un sous programme        #
 # --------------------------------------------------- #

 sub ParseCmdLine {
         # Traite la ligne de commande, d�termine le type de fichier

         # $arg et $file sont respectivement les arguments (s'ils
         # existent) et le nom de fichier
         if ($#_ < 0) {
                 &usage;
         }
         # D�bug
 #       foreach $element (@_) {
 #               print "*$element* \n";
 #       }

         $arg = shift(@_);
         if ($arg =~ /\-./) {
                 $cmd = $arg;
         # D�bug
 #       print "\$cmd trouv�.\n";

                 $file = shift(@_);
         } else {
                 $file = $arg;
         }

         # D�finition du type de fichier
         unless ($cmd) {
                 # Aucun argument

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

                 # Traite $file selon le type de fichier et retourne
                 # le type de fichier ($filetype)
         } else {
                 # Nous utilisons ltype de fichier d�crit dans $arg
                 if ($cmd =~ /^-p$/) {
                         $filetype = "ps";
                 } elsif ($cmd =~ /^-c$/) {
                         $filetype = "code";
                 } elsif ($cmd =~ /^-a$/) {
                         $filetype = "ASCII"
                 }
         }
 }

 sub usage {
         print "
 Usage: print [-a|c|p] <fichier>
        -a imprime <fichier> comme un fichier ASCII
        -c imprime <fichier> format� en code source
        -p imprime <fichier> en tant que fichier Postscript
        Si aucun param�tre n'est donn�, print tente de
        deviner le type de fichier et imprime en cons�quence.\n
 ";
         exit(0);
 }

 sub wrap {
         # Cr�e un table contenant les lignes du fichier, avec chaque
         # ligne ayant une longueur < au nombre de caract�res
         # sp�cifi�s, et coup�e uniquement sur un espace.

         # R�cup�re la longueur maximum d'une ligne
         $limit = pop(@_);

         # D�bug
         #print "Entr�e dans la proc�dure wrap\n";
         #print "La longueur maximum d'une ligne est $limit\n";

         # Lit le fichier, le traite et le stocke dans le tableau
         open(FILE, "<$file") || die "Impossible d'ouvrir $file: $!\n";
         while(<FILE>) {
                 $line = $_;

                 # D�bug
                 #print "La ligne est~:\n$line\n";

                 # Coupe la ligne si celle-ci d�passe la limite
                 while ( length($line) > $limit ) {

                         # D�bug
                         #print "Je coupe...";

                         # Prend les premiers $limit +1 caract�res.
                         $part = substr($line,0,$limit +1);

                         # D�bug
                         #print "La ligne partielle est~:\n$part\n";

                         # V�rifie si le dernier caract�re est un
                         # espace
                         $last_char = substr($part,-1, 1);
                         if ( " " eq $last_char ) {
                             # Oui, on imprime le reste

                             # D�bug
                             #print "Le dernier caract�re �tait un espace\n";

                             substr($line,0,$limit + 1) = "";
                             substr($part,-1,1) = "";
                             push(@newlines,"$part\n");
                         } else {
                             # Non, on cherche le dernier espace de la
                             # ligne et on imprime jusqu'� lui

                             # D�bug
                             #print "Le dernier caract�re n'�tait pas un espace\n";

                             # Supprime le caract�re apr�s $limit
                             substr($part,-1,1) = "";
                             # Inverse la ligne pour trouver plus
                             # facilement l'espace
                             $revpart = reverse($part);
                             $index = index($revpart," ");
                             if ( $index > 0 ) {
                               substr($line,0,$limit-$index) = "";
                               push(@newlines,substr($part,0,$limit-$index)
                                   . "\n");
                             } else {
                                # Aucun espace dans la ligne
                                # Imprime jusqu'� $limit
                                substr($line,0,$limit) = "";
                                push(@newlines,substr($part,0,$limit)
                                    . "\n");
                              }
                         }
                 }
                 push(@newlines,$line);
         }
         close(FILE);
 }

 sub codeformat {
         # Appelle la proc�dure wrap et filtre par nenscript
         &wrap($line_length);

         # Envoie le r�sultat � nenscript pour cr�er un fichier
         # Postscript qui respecte un format d�cent d'impression pour
         # du code source (orientation paysage, font Courier,
         # num�rotation des lignes).
         # Imprime d'abord dans un fichier temporaire.
         $tmpfile = "/tmp/nenscript$$";
         open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") ||
                 die "Je ne peux pas ouvrir nenscript~: $!\n";
         foreach $line (@newlines) {
                 print FILE $line;
         }
         close(FILE);

         # Relis le fichier temporaire dans un tableau pour pouvoir
         # �tre pass� au script smbprint de Samba.
         @newlines = ("");
         open(FILE, "<$tmpfile") || die "Je ne peux pas ouvrir $file~: $!\n";
         while(<FILE>) {
                 push(@newlines,$_);
         }
         close(FILE);
         system("rm $tmpfile");
 }

 sub createarray {
         # Cr�e le tableau pour un fichier postscript
         open(FILE, "<$file") || die "Can't open $file: $!\n";
         while(<FILE>) {
                 push(@newlines,$_);
         }
         close(FILE);
 }






 1100..  CCooppyyrriigghhtt

 Cet HOWTO est copyright � 1996 par David Wood. Il peut �tre reproduit
 sous quelque forme que ce soit et �tre distribu� gratuitement aussi
 longtemps que le fichier reste intact, cette notice y compris.


 1111..  RReemmeerrcciieemmeennttss

 D�s que vous m'enverrez des suggestions, je vous remercierai ici dans
 la prochaine version du document.