Imprimer en 5000 depuis les PC du clubs

Portrait de minijackson

Si vous voulez imprimer en 5000, c'est le moment de réviser la commande lp. Si on combine ça avec ssh et scp, on peut facilement imprimer depuis n'importe quel ordi connecté sur le réseau de l'ESIEE. Il faut savoir aussi que les ordis sur lesquels on peut se ssh sont les ordis allumés sous Linux. On a aussi besoin que ces ordis aient la bonne imprimante ajoutée (ps5003a). Pour rappel, la commande lp s'utillise comme ça:

$ lp -d <imprimante> -o <option[=valeur]> <fichier texte, pdf, ou ps>

J'ai rajouté les options car il y en a des intéressantes comme Stapling qui permet de choisir la position des agrafes (les valeurs possible sont: "Off", "LL", "LR", "MB", "ML", "MR", "MT", "SS", "UL" et "UR"). Vous pouvez regardez les options et leurs valeurs actuelles avec la commande lpoption ou lpoption -l pour voir aussi toutes les valeurs possibles. Attention: une partie des options disponibles changent en fonction de l'imprimante.

Bref, trêve de bavardages, voici le script:

  1. #!/bin/bash
  2.  
  3. # http://redsymbol.net/articles/unofficial-bash-strict-mode/
  4. set -euo pipefail
  5. IFS=$'\n\t'
  6.  
  7. if [ $# -lt 2 ]; then
  8. echo "Usage: $0 <file> <login> [lp options]"
  9. exit 1
  10. fi
  11.  
  12. if [ ! -f "$1" ]; then
  13. echo "No such file: '$1'"
  14. exit 1
  15. fi
  16.  
  17. FILE=$1
  18. LOGIN=$2
  19.  
  20. shift
  21. shift
  22.  
  23. MIMETYPE="$(file -b --mime-type "$FILE")"
  24.  
  25. if [[ ! ("$MIMETYPE" =~ ^text || "$MIMETYPE" == "application/pdf" || $MIMETYPE == "application/postscript") ]]; then
  26. echo "Warning: printing supported only with pdf, ps or text files."
  27. echo "Found: $MIMETYPE"
  28. echo "Continuing anyway..."
  29. echo
  30. fi
  31.  
  32. BASENAME="$(basename "$FILE")"
  33.  
  34. echo "Destination file? [default='~/$BASENAME']"
  35. read DESTINATION
  36.  
  37. if [ -z "$DESTINATION" ]; then
  38. DESTINATION="~/$BASENAME"
  39. fi
  40.  
  41. echo "Trying 5008 computers"
  42. for i in a b c d e f g h i j k l m; do
  43. HOST="pc5008${i}.esiee.fr"
  44. if scp "-o" "ConnectTimeout=1" "$FILE" "$LOGIN@$HOST:$DESTINATION"; then
  45. ssh "-o" "ConnectTimeout=1" "$LOGIN@$HOST" "lp -d ps5003a $@ $DESTINATION"
  46. break
  47. fi
  48. done

Les lignes 4 et 5 mettent Bash en mode "strict" (non officiel). Il s'agit d'options très sympas pour que le le langage soit plus strict et donc de sauver des heures de debugging. Pour plus d'informations sur comment ça marche, allez voir le site.

Les lignes de 7 à 18 vérifient simplement les arguments passés en ligne de commande et stockent le nom du fichier à imprimer et le login ESIEE.

Pour les shift ligne 20 et 21, cela permet décaler les arguments: l'argument 1 disparaît, l'argument 2 devient l'argument 1, l'argument 3 devient l'argument 2, etc…

De la ligne 23 à 30 le script vérifie que le fichier est bien un fichier texte, pdf ou postscript mais affiche seulement un warning si ça n'est pas le cas.

De la ligne 32 à la ligne 39 le script récupère le nom de fichier (enlève le chemin s'il y est) et propose de spécifier un autre chemin pour stocker le fichier sur la machine distante

Le cœur du script est situé entre les lignes 41 à 48. On va essayer de scp le fichier sur toutes les machines situées en 5008 (pc5008a, pc5008b, pc5008c, etc…) et si jamais ça marche, on lance la commande lp via ssh, avec les options rajoutées via la ligne de commande, qui sont représentées par la variable $@ (ce qui explique l'intérêt des deux shift) et on sort de la boucle.

Tadaa ! La magie (qui n'est pas vraiment de la magie en fait) est faite !