Table of Contents

CUPS Printer Installation

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/

cupsprinter.ins

[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

delcupsprinter.ins

[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$"