SAP Drucker automatisch anlegen lassen

In dem Artikel Drucker semiautomatisch im SAP anlegen habe ich beschrieben wie man sich im Handumdrehen 100 Drucker für den Import ins SAP vorbereiten lassen kann. Was fehlt noch? Richtig! Der Import an sich. Dieser wurde in der aktuellen Version mit implementiert. 

Die Basis des bereits bekannten Scripts wurde erweitert und verteilt per SCP/SSH die Drucker auf die entsprechenden Systeme und setzt dabei auf einen bereits angelegtes SAP Event und einen entsprechend eventgesteuerten Batchjob, der sich um den automatischen Import der Drucker kümmert.

Hier zunächst das neue Script:

#!/usr/bin/ksh
#Script zum Anlegen von Druckern im SAP
#Patrick Wessel, 07/2014
#Konstanten
TIME=`date "+%Y%m%d%H%M%S"`
SCRIPT=$1
WORK=$(pwd)
INPUT=$WORK/input.txt
OUTPUT=$WORK/output.txt
SAPPRINTER=""
KOMMENTAR=""
HOSTPRINTER=""
PRINTERDISABLE="" #Drucker deaktivieren=X
SLEEP=60 #Wartezeit Loeschen der Datei

SSHSERVERDEV[1]="server1:d01adm:D01:00"
SSHSERVERDEV[2]="server2:e01adm:E01:00"
SSHSERVERDEV[3]="server3:q01adm:Q01:00"

### Pruefen ob Input File existiert und PRINTERDISABLE setzen
[ ! -f $INPUT ] && echo "Es wurde keine Input Datei gefunden. Das Script wird beendet." && exit 1

### Pruefen ob altes Output File existiert und umbenennen
if [ -f $OUTPUT ]
then
mv $OUTPUT $OUTPUT.old
touch $OUTPUT
chmod 666 $OUTPUT
fi

### Printer Disable parsen
[ -f $INPUT.grep ] && rm $INPUT.grep
grep '.' $INPUT > $INPUT.grep
mv $INPUT.grep $INPUT

echo "\n### 1. Druckerdefinitionsdatei generieren ###"

case $(grep -v "#" $INPUT | grep PRINTERDISABLE | awk -F= '{print $2}') in
X|x)
PRINTERDISABLE="X"
echo "Die Drucker werden als deaktiviert gekennzeichnet."
;;
*)
PRINTERDISABLE=""
echo "Die Drucker werden als aktiviert gekennzeichnet."
;;
esac

### Output Header schreiben
echo "VERSION = \"0.1\"\nTIME = \"${TIME}\"\nSYSTEM = \"D01\"\nRELEASE = \"700\"" >>$OUTPUT

#Drucker konfiguration parsen und ausgeben
cat $INPUT |grep -v PRINTERDISABLE | while read ZEILE
do
#SAP-Drucker, Drucker und Kommenatar parsen
SAPPRINTER=""
HOSTPRINTER=""
KOMMENTAR=""

SAPPRINTER=$(echo ${ZEILE} | awk -F';' '{print $1}')
HOSTPRINTER=$(echo ${ZEILE} | awk -F';' '{print $2}')
KOMMENTAR=$(echo ${ZEILE} | awk -F';' '{print $3}')

echo "Erzeuge Konfiguration fuer SAP Drucker $SAPPRINTER"

echo "* DEVICE = {" >>$OUTPUT
echo " NAME = \"${SAPPRINTER}\"" >>$OUTPUT
echo " PADEST = \"${SAPPRINTER}\"" >>$OUTPUT
echo " PATYPE = \"TREIBER\"" >>$OUTPUT
echo " PAMODEL = \"TYP\"" >>$OUTPUT
echo " PACLASS = \"\"" >>$OUTPUT
echo " PAARCHIVER = \"\"" >>$OUTPUT
echo " PALANGU = \"D\"" >>$OUTPUT
echo " PADISABLED = \"${PRINTERDISABLE}\"" >>$OUTPUT
echo " PANOQUERY = \"X\"" >>$OUTPUT
echo " PADUPCOPY = \"\"" >>$OUTPUT
echo " PADUPLEX = \"\"" >>$OUTPUT
echo " PASTORELOC = \"\"" >>$OUTPUT
echo " PADFLTUTTL = \"\"" >>$OUTPUT
echo " PADFLTSTTL = \"\"" >>$OUTPUT
echo " PASYNC = \"X\"" >>$OUTPUT
echo " PAMONI = \"\"" >>$OUTPUT
echo " PASTANDORT = \"${KOMMENTAR}\"" >>$OUTPUT
echo " PAMSG = \"${KOMMENTAR}\"" >>$OUTPUT
echo " PAMSSERVER = \"server_D01_00\"" >>$OUTPUT
echo " PAMETHOD = \"E\"" >>$OUTPUT
echo " PAPROSNAME = \"${HOSTPRINTER}\"" >>$OUTPUT
echo " PALOMS = \"PMCPOL\"" >>$OUTPUT
echo " PALPRCMD = \"\"" >>$OUTPUT
echo " PALPDHOST = \"\"" >>$OUTPUT
echo " PALPDPORT = \"0\"" >>$OUTPUT
echo " PACONNTIME = \"0\"" >>$OUTPUT
echo " PAREADTIME = \"0\"" >>$OUTPUT
echo " PATRAYS = \"0\"" >>$OUTPUT
echo " PAXSHIFT = \"0\"" >>$OUTPUT
echo " PAYSHIFT = \"0\"" >>$OUTPUT
echo " PAXSHUNIT = \"MM\"" >>$OUTPUT
echo " PAYSHUNIT = \"MM\"" >>$OUTPUT
echo " PACRYPTMOD = \"\"" >>$OUTPUT
echo " PACRYPTMET = \"\"" >>$OUTPUT
echo " PANOVSERVR = \"\"" >>$OUTPUT
echo " PAPOOLART = \"\"" >>$OUTPUT
echo " PATRACE2 = \"\"" >>$OUTPUT
echo " PATRACEF = \"\"" >>$OUTPUT
echo " PAPROTDATA = \"\"" >>$OUTPUT
echo " PAPROTCMD = \"\"" >>$OUTPUT
echo " PAPROTRES = \"\"" >>$OUTPUT
echo " PAKEEPFILE = \"\"" >>$OUTPUT
echo " CHGNAME1 = \"SAPBENUTZER\"" >>$OUTPUT
echo " CHGTSTMP1 = \"${TIME}\"" >>$OUTPUT
echo " CHGSAPREL1 = \"700\"" >>$OUTPUT
echo " CHGSAPSYS1 = \"D01\"" >>$OUTPUT
echo " PADEVGRP = \"\"" >>$OUTPUT
echo " COLORPRT = \"\"" >>$OUTPUT
echo " PRINTMODE = \"\"" >>$OUTPUT
echo " INPUTTRAY = \"\"" >>$OUTPUT
echo " PANOCHOICE = \"\"" >>$OUTPUT
echo "}" >>$OUTPUT
done

echo "*** Druckerdefinitionsdatei erfolgreich erzeugt.***"

echo "\n### 2. Uebertragung der Druckerdefinitionsdatei und import ins SAP ###"
MAXSYSTEME=${#SSHSERVERDEV[*]}
echo "Es sind $MAXSYSTEME SAP Systeme fuer die Einrichtung konfiguriert (siehe Scriptheader)."
let MAXSYSTEME=MAXSYSTEME+1
SYSZAEHLER=1
while [ $SYSZAEHLER -lt $MAXSYSTEME ]
do
HOST=$(echo ${SSHSERVERDEV[$SYSZAEHLER]} | awk -F':' '{print $1}')
USER=$(echo ${SSHSERVERDEV[$SYSZAEHLER]} | awk -F':' '{print $2}')
SYSTEM=$(echo ${SSHSERVERDEV[$SYSZAEHLER]} | awk -F':' '{print $3}')
SYSTEMNR=$(echo ${SSHSERVERDEV[$SYSZAEHLER]} | awk -F':' '{print $4}')

echo "### Ziel $HOST\nKopiere $OUTPUT auf $HOST..."
scp $OUTPUT $HOST:/tmp
ssh $HOST "ls -al /tmp/output.txt"
echo "\nStarte Druckerimport auf $HOST per Event INSTALL_PRINTER"
ssh $HOST "sudo su - $USER -c '/usr/sap/${SYSTEM}/SYS/exe/run/sapevt INSTALL_PRINTER name=${SYSTEM} nr=${SYSTEMNR}'"
echo "\nWarte $SLEEP Sekunden bis der JOB fertig ist und loesche $i:/tmp/output.txt"
sleep $SLEEP
ssh $HOST "rm /tmp/output.txt"
echo "*** Druckerimport auf $HOST abgeschlossen. ***\n\n"
let SYSZAEHLER=SYSZAEHLER+1
done

exit 0

Das Script drucker_anlegen.sh gibt es natürlich auch zum Download.

Die Datei input.txt kann jetzt mit dem Parameter „PRINTERDISABLE=X“ erweitert werden. Somit muss das Script nicht immer wieder editiert werden. Sofern hier ein x/X gesetzt ist werden die Drucker direkt beim Import deaktiviert. Ist das Schlüsselwort nicht vorhanden oder per # deaktiviert wird es ignoriert. Da hier keine Überprüfung auf Umlaute oder exotische Sonderzeichen vorgenommen wird könnte deren Verwendung zu Problemen beim Import führen und z.B. zu einem Unicode Konversationsfehler führen.

cat input.txt
PRINTERDISABLE=X
P001;printer-ffm-p001;Zentraldrucker Rechnungswesen (IP: 172.128.1.20)

Um neue Systeme hinzuzufügen muss das Script editiert werden. Hier einfach den entsprechenden neuen Parameter setzen: SSHSERVERDEV[] Das Format entspricht:

 

Auf dem entsprechenden Zielsystem muss für die Verarbeitung ein neues Batch Event angelegt werden.
Hierzu öffnet man die Transaktion SM62, wechselt auf den Reiter Batch Event und legt ein neues Event an:

EREIGNIS: INSTALL_PRINTER
BEDEUTUNG: Drucker aus /tmp/output.txt importieren

Anschließend muss noch ein entsprechender Batchjob angelegt werden, der auf den Event reagiert und den Import vornimmt. Hierzu bediene ich mich des Reports „RSPOXDEV“, für den ich eine entsprechende Variante „DRUCKER_IMPORT“ angelegt habe. Die Variante sieht wie folgt aus:

Server: /tmp/output.txt
Import
Import ausführen (Unicode)
Protokoll erzeugen

Zum Anlegen des Jobs wechselt man in die Transaktion SM36:

Jobname: SPAD_INSTALL_PRINTER
Ausführungsziel -> INSTANZNUMMER aus der SSHSERVER Config (siehe oben)
Start nach Ereignis: INSTALL_PRINTER
Startart Eventperiodisch

Step: 
ABAP Programm RSPOXDEV
Variante: DRUCKER_IMPORT

Sollte es auf dem System größere Verzögerungen geben was die Batchläufe betrifft müsste der SLEEP Timeout im Script entsprechend erhöht werden, da ansonsten das Script die bereitgestellte Datei löscht bevor der durch den Event gestartete Batchjob die Datei einlesen konnte.