2009-02-25
Script by uib Gmbh
Comments and improvements welcome
id: cupsprinter
name: CUPS Printer Installation
description: Installiert auf dem Server verfuegbare Drucker als CUPS-Postscript-Drucker
advice: Ueber CUPS neu angelegte Drucker werden erst nach etwa 10 Minuten erfolgreich erkannt.
full package: http://download.uib.de/opsi4.0/products/contribute/
[Initial] ; NOTE: ; If a new cups printer is added, it will take some time ; before the printer is published by samba (default 750s) ; use smb.conf paramter "printcap cache time" to change printer reload interval ; ; Message at install time: Message=Installiere CUPS-Drucker ... LogLevel=2 ; Log Errors in Logfile but don't abort: ExitOnError=false ; Show syntax errors in the script: ScriptErrorMessages=on ; Dont trace step by step through the script: TraceMode=off ; let started programs run in front of the winst window StayOnTop=false [Aktionen] DefVar $ProductId$ Set $ProductId$ = "cupsprinter" DefStringlist $list1$ DefStringlist $list2$ DefStringlist $list3$ DefStringlist $CupsPrinterNames$ DefVar $tmpDir$ DefVar $tmpPrinters$ DefVar $DriverOnly$ DefVar $UsePrinterPPD$ DefVar $PrintServerName$ DefVar $PrintProtocol$ DefVar $DefaultPrinterName$ DefVar $DomainName$ DefVar $WindowsPrinterName$ DefVar $DriverPath$ DefVar $TmpDriverPath$ DefVar $InfFile$ DefVar $ServerAddress$ DefVar $PrinterAddress$ DefVar $PrinterNameInInfFile$ set $tmpDir$ = "%systemdrive%\tmp\cupsprinter" set $DriverOnly$ = "false" set $UsePrinterPPD$ = "true" set $PrintServerName$ = "server" set $PrintProtocol$ = "smb" set $DefaultPrinterName$ = "" if ( GetOS = "Windows_NT") ; - - - - - - - - - - - - - - - - - - - - - - - ; - show product picture - ; - - - - - - - - - - - - - - - - - - - - - - - ShowBitmap /3 "%scriptpath%\"+$ProductId$+".bmp" $ProductId$ set $PrintServerName$ = IniVar('printserver') set $DriverOnly$ = IniVar('driver_only') set $UsePrinterPPD$ = IniVar('use_printer_ppd') set $PrintProtocol$ = IniVar('print_protocol') comment "=== Product properties =================================" comment " $PrintServerName$ = " + $PrintServerName$ comment " $DriverOnly$ = " + $DriverOnly$ comment " $UsePrinterPPD$ = " + $UsePrinterPPD$ comment " $PrintProtocol$ = " + $PrintProtocol$ comment "========================================================" ; - - - - - - - - - - - - - - - - - - - - - - - ; - uninstall first - ; - - - - - - - - - - - - - - - - - - - - - - - if not ($DriverOnly$ = "true") comment "Deleting printers" Message=Deinstalliere CUPS-Drucker ... set $list1$ = getOutStreamFromSection ('DosInAnIcon_list_installed_server_printers') for $a$ in $list1$ do sub_delete_installed_server_printers endif ; - - - - - - - - - - - - - - - - - - - - - - - ; - start install - ; - - - - - - - - - - - - - - - - - - - - - - - Message=Installiere CUPS-Drucker ... ; - - - - - - - - - - - - - - - - - - - - - - - ; - get domainname - ; - - - - - - - - - - - - - - - - - - - - - - - comment "Getting domain name from service" Set $list1$ = getReturnListFromSection('opsiservicecall_getDomain') Set $DomainName$ = takestring(0, $list1$) ; - - - - - - - - - - - - - - - - - - - - - - - ; - common printer settings - ; - - - - - - - - - - - - - - - - - - - - - - - ; Address of the cups server set $ServerAddress$ = $PrintServerName$ + "." + $DomainName$ ; Name of to printer model exactly as it is in the inf-file below set $PrinterNameInInfFile$ ="CUPS Test Driver v6" ; full path to the printer driver set $DriverPath$ = "%ScriptPath%\cups-windows" ; full path to the inf-file to use set $InfFile$ = $DriverPath$+"\cups6.inf" ; - - - - - - - - - - - - - - - - - - - - - - - ; - install all available printers - ; - - - - - - - - - - - - - - - - - - - - - - - comment "Getting available samba printers from server " + $PrintServerName$ set $list1$ = getOutStreamFromSection ('DosInAnIcon_list_available_cups_printers') for $a$ in $list1$ do sub_get_cups_printer_names ; for $a$ in $CupsPrinterNames$ do sub_get_default_printer for $a$ in $CupsPrinterNames$ do sub_install_cups_printers if not ($DefaultPrinterName$ = "") sub_set_default_printer endif endif [opsiservicecall_getDomain] "method": "getDomain" "params": [ ] [Winbatch_autohotkey_driver_signing] %ScriptPath%\autohotkey.exe %ScriptPath%\driver_signing.ahk [Winbatch_sleep] %ScriptPath%\sleep.exe 2 [DosInAnIcon_list_available_cups_printers] @echo off net view \\$PrintServerName$ | findstr Drucker [sub_get_cups_printer_names] set $list2$ = splitStringOnWhitespace ("$a$") if takestring(1, $list2$) = "Drucker" if not ($tmpPrinters$ = "") Set $tmpPrinters$ = $tmpPrinters$ + "|" endif comment "Found printer: " + takestring(0, $list2$) Set $tmpPrinters$ = $tmpPrinters$ + takestring(0, $list2$) endif Set $CupsPrinterNames$ = splitString($tmpPrinters$, "|") [sub_install_cups_printers] set $WindowsPrinterName$ = "$a$" comment "Installing printer: " + $WindowsPrinterName$ if ($PrintProtocol$ = "ipp") set $PrinterAddress$ = "http://"+$ServerAddress$+":631/printers/"+$WindowsPrinterName$ else set $PrinterAddress$ = "\\" + $PrintServerName$ + "\"+ $WindowsPrinterName$ endif if ($UsePrinterPPD$ = "true") comment "Using PPD from CUPS for printer: " + $WindowsPrinterName$ comment "Deleting temp driver directory" Files_delete_tmp_driver comment "Copying driver to temp driver directory" Files_copy_tmp_driver set $TmpDriverPath$ = $DriverPath$ set $DriverPath$ = $tmpDir$ set $InfFile$ = $DriverPath$+"\cups6.inf" comment "Downloading PPD for printer: " + $WindowsPrinterName$ DosInAnIcon_download_ppd comment "Patching inf to use new PPD" PatchTextFile_cups_driver_inf $InfFile$ set $PrinterNameInInfFile$ = "CUPS Driver - " + $WindowsPrinterName$ endif Winbatch_autohotkey_driver_signing /LetThemGo Winbatch_sleep if ($DriverOnly$ = "true") comment "Installing printer driver" DosInAnIcon_install_printer_driver else comment "Installing printer" DosInAnIcon_install_printer endif killtask "autohotkey.exe" if ($UsePrinterPPD$ = "true") comment "Deleting temp driver directory" Files_delete_tmp_driver set $DriverPath$ = $TmpDriverPath$ set $InfFile$ = $DriverPath$+"\cups6.inf" endif [Files_copy_tmp_driver] Copy -s "$DriverPath$\*" "$tmpDir$\" [Files_delete_tmp_driver] Delete -sf "$tmpDir$" [DosInAnIcon_download_ppd] "%ScriptPath%\wget\wget.exe" "http://$ServerAddress$:631/printers/$WindowsPrinterName$.ppd" -O "$DriverPath$\\$WindowsPrinterName$.ppd" [PatchTextFile_cups_driver_inf] GoToTop FindLine_StartingWith '"CUPS Test Driver v6" = CUPS6.PS' DeleteTheLine InsertLine '"CUPS Driver - $WindowsPrinterName$" = CUPS6.PS' GoToTop FindLine_StartingWith 'CopyFiles=@CUPS6.PPD' DeleteTheLine InsertLine 'CopyFiles=@$WindowsPrinterName$.ppd' GoToTop FindLine_StartingWith 'DataFile=' DeleteTheLine InsertLine 'DataFile=$WindowsPrinterName$.ppd' [sub_get_default_printer] set $WindowsPrinterName$ = "$a$" if ($WindowsPrinterName$ = "oben") or (takestring(1, splitString($WindowsPrinterName$, "_")) = "oben") set $DefaultPrinterName$ = $WindowsPrinterName$ endif [DosInAnIcon_install_printer] rundll32 printui.dll,PrintUIEntry /q /if /x /n "" /b "$WindowsPrinterName$" /m "$PrinterNameInInfFile$" /r "$PrinterAddress$" /f "$InfFile$" /l "$DriverPath$" [DosInAnIcon_install_printer_driver] rundll32 printui.dll,PrintUIEntry /q /ia /x /n "" /b "$WindowsPrinterName$" /m "$PrinterNameInInfFile$" /r "$PrinterAddress$" /f "$InfFile$" /l "$DriverPath$" [sub_delete_installed_server_printers] set $list2$ = splitStringOnWhitespace ("$a$") if takestring(0, $list2$) = "Druckername" set $list3$ = splitString("$a$", "Druckername ") set $WindowsPrinterName$ = takestring(1, $list3$) endif if takestring(0, $list2$) = "Anschlussname" set $list3$ = splitString (takestring(1, $list2$), "/") ; CUPS printer if takestring(0, $list3$) = "http:" DosInAnIcon_delete_printer endif set $list3$ = splitString (takestring(1, $list2$), "\") ; Samba printer on server (\\server\xyz) if takestring(2, $list3$) = $PrintServerName$ DosInAnIcon_delete_printer endif endif [DosInAnIcon_list_installed_server_printers] @echo off cscript "%ScriptPath%\prnmngr.vbs" -l [DosInAnIcon_delete_printer] rundll32 printui.dll,PrintUIEntry /q /dl /n "$WindowsPrinterName$" [sub_set_default_printer] Files_copy_autostart_files DosInAnIcon_write_autostart_cmd [Files_copy_autostart_files] copy %SCRIPTPATH%\cups.lnk "C:\Dokumente und Einstellungen\username\Startmenü\Programme\Autostart" [DosInAnIcon_write_autostart_cmd] echo del "C:\Dokumente und Einstellungen\username\Startm~1\Programme\Autostart\cups.lnk" > c:\windows\temp\cups.cmd echo rundll32 printui.dll,PrintUIEntry /y /n "$DefaultPrinterName$" >> c:\windows\temp\cups.cmd
[Initial] ; NOTE: ; If a new cups printer is added, it will take some time ; before the printer is published by samba (default 750s) ; use smb.conf paramter "printcap cache time" to change printer reload interval ; ; Message at install time: Message=Deinstalliere CUPS-Drucker ... LogLevel=2 ; Log Errors in Logfile but don't abort: ExitOnError=false ; Show syntax errors in the script: ScriptErrorMessages=on ; Dont trace step by step through the script: TraceMode=off ; let started programs run in front of the winst window StayOnTop=false [Aktionen] DefVar $ProductId$ Set $ProductId$ = "cupsprinter" DefStringlist $list1$ DefStringlist $list2$ DefStringlist $list3$ DefVar $WindowsPrinterName$ DefVar $PrintServerName$ set $PrintServerName$ = "server" if ( GetOS = "Windows_NT") ; - - - - - - - - - - - - - - - - - - - - - - - ; - show product picture - ; - - - - - - - - - - - - - - - - - - - - - - - ShowBitmap /3 "%scriptpath%\"+$ProductId$+".bmp" $ProductId$ set $PrintServerName$ = IniVar('printserver') ; - - - - - - - - - - - - - - - - - - - - - - - ; - uninstall - ; - - - - - - - - - - - - - - - - - - - - - - - Message=Deinstalliere CUPS-Drucker ... set $list1$ = getOutStreamFromSection ('DosInAnIcon_list_installed_server_printers') for $a$ in $list1$ do sub_delete_installed_server_printers endif [sub_delete_installed_server_printers] set $list2$ = splitStringOnWhitespace ("$a$") if takestring(0, $list2$) = "Druckername" set $list3$ = splitString("$a$", "Druckername ") set $WindowsPrinterName$ = takestring(1, $list3$) endif if takestring(0, $list2$) = "Anschlussname" set $list3$ = splitString (takestring(1, $list2$), "/") ; CUPS printer if takestring(0, $list3$) = "http:" DosInAnIcon_delete_printer endif set $list3$ = splitString (takestring(1, $list2$), "\") ; Samba printer on server (\\server\xyz) if takestring(2, $list3$) = $PrintServerName$ DosInAnIcon_delete_printer endif endif [DosInAnIcon_list_installed_server_printers] @echo off cscript c:\windows\system32\prnmngr.vbs -l [DosInAnIcon_delete_printer] rundll32 printui.dll,PrintUIEntry /q /dl /n "$WindowsPrinterName$"