Initial version of cups module.
This commit is contained in:
parent
d016eeecb2
commit
610f33e506
20 changed files with 615 additions and 0 deletions
43
cups/files/drivers/cups6.inf
Normal file
43
cups/files/drivers/cups6.inf
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
;
|
||||||
|
; "$Id: cups6.inf,v 1.1 2005/06/16 20:42:20 mike Exp $"
|
||||||
|
;
|
||||||
|
; INF file for CUPS driver for Windows
|
||||||
|
;
|
||||||
|
; Copyright 2001-2005 by Easy Software Products
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
[Version]
|
||||||
|
Signature="$Windows NT$"
|
||||||
|
Provider=Easy Software Products
|
||||||
|
LayoutFile=ntprint.inf
|
||||||
|
ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}
|
||||||
|
Class=Printer
|
||||||
|
DriverVer=06/16/2005
|
||||||
|
|
||||||
|
[Manufacturer]
|
||||||
|
"Easy Software Products"
|
||||||
|
|
||||||
|
[Easy Software Products]
|
||||||
|
"CUPS Test Driver v6" = CUPS6.PS
|
||||||
|
|
||||||
|
[CUPS6.PS]
|
||||||
|
CopyFiles=@CUPS6.PPD
|
||||||
|
CopyFiles=@CUPS6.INI
|
||||||
|
CopyFiles=@CUPSPS6.DLL
|
||||||
|
CopyFiles=@CUPSUI6.DLL
|
||||||
|
DataSection=PSCRIPT_DATA
|
||||||
|
DataFile=CUPS6.PPD
|
||||||
|
Include=NTPRINT.INF
|
||||||
|
Needs=PSCRIPT.OEM
|
||||||
|
|
||||||
|
[DestinationDirs]
|
||||||
|
DefaultDestDir=66000
|
||||||
|
|
||||||
|
[ControlFlags]
|
||||||
|
ExcludeFromSelect = 2369
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; End of "$Id: cups6.inf,v 1.1 2005/06/16 20:42:20 mike Exp $".
|
||||||
|
;
|
5
cups/files/drivers/cups6.ini
Normal file
5
cups/files/drivers/cups6.ini
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[OEMFiles]
|
||||||
|
OEMConfigFile1=CUPSUI6.DLL
|
||||||
|
OEMDriverFile1=CUPSPS6.DLL
|
||||||
|
|
||||||
|
|
BIN
cups/files/drivers/cupsps6.dll
Normal file
BIN
cups/files/drivers/cupsps6.dll
Normal file
Binary file not shown.
BIN
cups/files/drivers/cupsui6.dll
Normal file
BIN
cups/files/drivers/cupsui6.dll
Normal file
Binary file not shown.
BIN
cups/files/drivers/ps5ui.dll
Normal file
BIN
cups/files/drivers/ps5ui.dll
Normal file
Binary file not shown.
BIN
cups/files/drivers/pscript.hlp
Normal file
BIN
cups/files/drivers/pscript.hlp
Normal file
Binary file not shown.
BIN
cups/files/drivers/pscript.ntf
Normal file
BIN
cups/files/drivers/pscript.ntf
Normal file
Binary file not shown.
BIN
cups/files/drivers/pscript5.dll
Normal file
BIN
cups/files/drivers/pscript5.dll
Normal file
Binary file not shown.
52
cups/files/drivers/x64/cups6.inf
Normal file
52
cups/files/drivers/x64/cups6.inf
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
;
|
||||||
|
; "$Id: cups6.inf,v 1.1 2005/06/16 20:42:20 mike Exp $"
|
||||||
|
;
|
||||||
|
; INF file for CUPS driver for Windows
|
||||||
|
;
|
||||||
|
; Copyright 2001-2005 by Easy Software Products
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
[Version]
|
||||||
|
Signature="$Windows NT$"
|
||||||
|
Provider=Easy Software Products
|
||||||
|
LayoutFile=ntprint.inf
|
||||||
|
ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}
|
||||||
|
Class=Printer
|
||||||
|
DriverVer=06/27/2009
|
||||||
|
|
||||||
|
[Manufacturer]
|
||||||
|
"Easy Software Products"=Easy Software Products,NTx86,NTamd64,NTia64
|
||||||
|
|
||||||
|
[Easy Software Products]
|
||||||
|
"CUPS Test Driver v6" = CUPS6.PS
|
||||||
|
|
||||||
|
[Easy Software Products.NTx86]
|
||||||
|
"CUPS Test Driver v6 for x86 (i386)" = CUPS6.PS
|
||||||
|
|
||||||
|
[Easy Software Products.NTamd64]
|
||||||
|
"CUPS Test Driver v6 for x64 (amd64)" = CUPS6.PS
|
||||||
|
|
||||||
|
[Easy Software Products.NTia64]
|
||||||
|
"CUPS Test Driver v6 for IA64" = CUPS6.PS
|
||||||
|
|
||||||
|
[CUPS6.PS]
|
||||||
|
CopyFiles=@CUPS6.PPD
|
||||||
|
CopyFiles=@CUPS6.INI
|
||||||
|
CopyFiles=@CUPSPS6.DLL
|
||||||
|
CopyFiles=@CUPSUI6.DLL
|
||||||
|
DataSection=PSCRIPT_DATA
|
||||||
|
DataFile=CUPS6.PPD
|
||||||
|
Include=NTPRINT.INF
|
||||||
|
Needs=PSCRIPT.OEM
|
||||||
|
|
||||||
|
[DestinationDirs]
|
||||||
|
DefaultDestDir=66000
|
||||||
|
|
||||||
|
[ControlFlags]
|
||||||
|
ExcludeFromSelect = 2369
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; End of "$Id: cups6.inf,v 1.1 2005/06/16 20:42:20 mike Exp $".
|
||||||
|
;
|
5
cups/files/drivers/x64/cups6.ini
Normal file
5
cups/files/drivers/x64/cups6.ini
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[OEMFiles]
|
||||||
|
OEMConfigFile1=CUPSUI6.DLL
|
||||||
|
OEMDriverFile1=CUPSPS6.DLL
|
||||||
|
|
||||||
|
|
BIN
cups/files/drivers/x64/cupsps6.dll
Executable file
BIN
cups/files/drivers/x64/cupsps6.dll
Executable file
Binary file not shown.
BIN
cups/files/drivers/x64/cupsui6.dll
Executable file
BIN
cups/files/drivers/x64/cupsui6.dll
Executable file
Binary file not shown.
BIN
cups/files/drivers/x64/ps5ui.dll
Normal file
BIN
cups/files/drivers/x64/ps5ui.dll
Normal file
Binary file not shown.
BIN
cups/files/drivers/x64/pscript.hlp
Normal file
BIN
cups/files/drivers/x64/pscript.hlp
Normal file
Binary file not shown.
BIN
cups/files/drivers/x64/pscript.ntf
Normal file
BIN
cups/files/drivers/x64/pscript.ntf
Normal file
Binary file not shown.
BIN
cups/files/drivers/x64/pscript5.dll
Normal file
BIN
cups/files/drivers/x64/pscript5.dll
Normal file
Binary file not shown.
296
cups/files/printer-details.py
Executable file
296
cups/files/printer-details.py
Executable file
|
@ -0,0 +1,296 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
# Copyright (c) 2009 Timo Makinen
|
||||||
|
# All rights reserved.
|
||||||
|
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# 3. The name of the author may not be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
import cups
|
||||||
|
from optparse import OptionParser
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
from subprocess import Popen, PIPE
|
||||||
|
import sys
|
||||||
|
from time import strftime
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
os.environ['LANG'] = 'en_US'
|
||||||
|
parser = OptionParser()
|
||||||
|
parser.add_option('-v', '--verbose',
|
||||||
|
action='store_true', dest='verbose', default=False,
|
||||||
|
help='run in verbose mode')
|
||||||
|
parser.add_option('-t', '--templates',
|
||||||
|
dest='templates', default='/usr/share/cups/templates',
|
||||||
|
help='cups template directory')
|
||||||
|
parser.add_option('-d', '--datadir',
|
||||||
|
dest='datadir', default='/usr/share/doc/cups-1.3.7/details',
|
||||||
|
help='directory where to store html pages')
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
c = cups.Connection()
|
||||||
|
printers = []
|
||||||
|
for (name, details) in c.getPrinters().items():
|
||||||
|
if len(args) > 0 and name not in args:
|
||||||
|
continue
|
||||||
|
m = re.match('^([a-z]+)://(\S+):\d+.*', details['device-uri'])
|
||||||
|
if m is None or m.group(1) not in ('http', 'ipp', 'lpd', 'socket'):
|
||||||
|
continue
|
||||||
|
printers.append( (name, m.group(2)) )
|
||||||
|
|
||||||
|
for (name, addr) in printers:
|
||||||
|
if options.verbose:
|
||||||
|
print 'retrieving data for printer %s (%s)' % (name, addr)
|
||||||
|
data = getdata(name, addr, options.templates)
|
||||||
|
outfile = os.path.join(options.datadir, '%s.html' % name)
|
||||||
|
if data is None:
|
||||||
|
if options.verbose:
|
||||||
|
print ' failed to retrieve snmp data'
|
||||||
|
print ' updating last check timestamp'
|
||||||
|
data = ''
|
||||||
|
r = re.compile('(<strong>Last updated: </strong>\d+-\d+-\d+ \d+:\d+:\d+)(.*)<br />')
|
||||||
|
try:
|
||||||
|
for l in open(outfile, 'r').readlines():
|
||||||
|
l = r.sub(r'\1 (last checked ' \
|
||||||
|
+ strftime('%Y-%m-%d %H:%M:%S') \
|
||||||
|
+ ')<br />\n', l)
|
||||||
|
data += l
|
||||||
|
except IOError:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
if options.verbose:
|
||||||
|
print ' saving data to %s' % outfile
|
||||||
|
savedata(outfile, data)
|
||||||
|
|
||||||
|
|
||||||
|
def getdata(name, addr, templates):
|
||||||
|
data = readtemplate(os.path.join(templates, 'header.tmpl'),
|
||||||
|
title='%s details' % name)
|
||||||
|
data += '<h1>%s</h1>\n' % name
|
||||||
|
|
||||||
|
oids = (
|
||||||
|
('Product Name', '.1.3.6.1.2.1.25.3.2.1.3.1'),
|
||||||
|
('Printer Serial Number', '.1.3.6.1.2.1.43.5.1.1.17.1'),
|
||||||
|
('Page Count', '.1.3.6.1.2.1.43.10.2.1.4.1.1'),
|
||||||
|
)
|
||||||
|
snmpdata = snmpget('public', addr, *map(lambda x: x[1], oids))
|
||||||
|
if len(snmpdata) == 0:
|
||||||
|
return None
|
||||||
|
data += '<h2>Printer Information</h2>\n'
|
||||||
|
data += '<p>\n'
|
||||||
|
for (k, v) in oids:
|
||||||
|
try:
|
||||||
|
data += '<strong>%s: </strong>%s<br />\n' % (k, snmpdata[v])
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
snmpdata = snmpwalk('public', addr, '.1.3.6.1.2.1.43.13.4.1.10')
|
||||||
|
duplex = 'Not installed'
|
||||||
|
for key, value in snmpdata.items():
|
||||||
|
if re.search('Duplex', value):
|
||||||
|
duplex = 'Installed'
|
||||||
|
data += '<strong>Duplexer: </strong>%s<br />\n' % duplex
|
||||||
|
snmpdata = snmpwalk('public', addr, '.1.3.6.1.4.1.11.2.3.9.4.2.1.1.4.1')
|
||||||
|
totalmemory = 0
|
||||||
|
memoryslots = []
|
||||||
|
for key, value in snmpdata.items():
|
||||||
|
if re.match('^\.1\.3\.6\.1\.4\.1\.11\.2\.3\.9\.4\.2\.1\.1\.4\.1\.\d+\.5\.0$', key):
|
||||||
|
totalmemory += int(value) / 1024 / 1024
|
||||||
|
memoryslots.append('%s MB' % str(int(value) / 1024 / 1024))
|
||||||
|
if totalmemory > 0:
|
||||||
|
data += '<strong>Installed memory: </strong>%s MB total (%s)<br />\n' % (
|
||||||
|
totalmemory, ', '.join(memoryslots))
|
||||||
|
data += '<strong>Last updated: </strong>%s<br />\n' % (
|
||||||
|
strftime('%Y-%m-%d %H:%M:%S'))
|
||||||
|
data += '</p>\n'
|
||||||
|
data += '\n'
|
||||||
|
|
||||||
|
baseoid = '.1.3.6.1.2.1.43.11.1.1'
|
||||||
|
data += '<h2>Supplies</h2>\n'
|
||||||
|
snmpdata = snmpwalk('public', addr, baseoid)
|
||||||
|
keys = map(lambda x: x[-1], filter(lambda x: x.startswith(
|
||||||
|
baseoid + '.6.1'), snmpdata.keys()))
|
||||||
|
data += '<table>\n'
|
||||||
|
for k in keys:
|
||||||
|
data += '<tr>\n'
|
||||||
|
data += ' <td>%s:</td>\n' % (
|
||||||
|
snmpdata[baseoid + '.6.1.' + k])
|
||||||
|
data += ' %s\n' % getstatus(snmpdata['%s.9.1.%s' % (baseoid, k)],
|
||||||
|
snmpdata['%s.8.1.%s' % (baseoid, k)])
|
||||||
|
data += '</tr>\n'
|
||||||
|
data += '</table>\n'
|
||||||
|
data += '\n'
|
||||||
|
|
||||||
|
baseoid = '.1.3.6.1.2.1.43.8.2.1'
|
||||||
|
data += '<h2>Paper trays</h2>\n'
|
||||||
|
snmpdata = snmpwalk('public', addr, baseoid)
|
||||||
|
keys = list(set(map(lambda x: int(x.split('.')[-1]), snmpdata.keys())))
|
||||||
|
data += '<table>\n'
|
||||||
|
for idx in keys:
|
||||||
|
data += '<tr>\n'
|
||||||
|
if '%s.18.1.%s' % (baseoid, idx) in snmpdata:
|
||||||
|
description = snmpdata['%s.18.1.%s' % (baseoid, idx)]
|
||||||
|
elif '%s.13.1.%s' % (baseoid, idx) in snmpdata:
|
||||||
|
description = snmpdata['%s.13.1.%s' % (baseoid, idx)]
|
||||||
|
else:
|
||||||
|
description = 'Unknown'
|
||||||
|
if '%s.12.1.%s' % (baseoid, idx) in snmpdata:
|
||||||
|
description += ' (%s)' % snmpdata['%s.12.1.%s' % (baseoid, idx)]
|
||||||
|
data += ' <td>%s</td>\n' % description
|
||||||
|
data += ' %s' % getstatus(snmpdata['%s.10.1.%s' % (baseoid, idx)],
|
||||||
|
snmpdata['%s.9.1.%s' % (baseoid, idx)])
|
||||||
|
data += '</tr>\n'
|
||||||
|
data += '</table>\n'
|
||||||
|
data += '\n'
|
||||||
|
|
||||||
|
baseoid = '.1.3.6.1.4.1.11.2.3.9.4.2.1.1.11'
|
||||||
|
snmpdata = snmpwalk('public', addr, baseoid)
|
||||||
|
keys = list(set(map(lambda x: int(x.split('.')[-3]), snmpdata.keys())))
|
||||||
|
if len(keys) > 0:
|
||||||
|
data += '<h2>Event Log</h2>\n'
|
||||||
|
keys.sort(lambda x, y: y-x)
|
||||||
|
data += '<table>\n'
|
||||||
|
data += '<tr>\n'
|
||||||
|
data += ' <th>Number</th>\n'
|
||||||
|
data += ' <th>Page Count</th>\n'
|
||||||
|
data += ' <th>Error code</th>\n'
|
||||||
|
data += '</tr>\n'
|
||||||
|
for idx in keys:
|
||||||
|
if snmpdata['%s.%s.1.0' % (baseoid, idx)] == 0:
|
||||||
|
continue
|
||||||
|
data += '<tr>\n'
|
||||||
|
data += ' <td>%s</td>\n' % idx
|
||||||
|
data += ' <td>%s</td>\n' % snmpdata['%s.%s.1.0' % (baseoid, idx)]
|
||||||
|
error = hex(snmpdata['%s.%s.2.0' % (baseoid, idx)])
|
||||||
|
if len(error) == 7:
|
||||||
|
error = '%s.%s.%s\n' % (str(long(error[0:3], 16)),
|
||||||
|
error[3:5], error[5:7])
|
||||||
|
else:
|
||||||
|
error = '%s.%s.%s\n' % (str(long(error[0:4], 16)),
|
||||||
|
error[4:6], error[6:8])
|
||||||
|
data += ' <td>%s</td>\n' % error.upper()
|
||||||
|
data += '</tr>\n'
|
||||||
|
data += '</table>\n'
|
||||||
|
data += '\n'
|
||||||
|
|
||||||
|
data += readtemplate(os.path.join(templates, 'trailer.tmpl'))
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def getstatus(cur, max):
|
||||||
|
if cur > 0 and max > 0:
|
||||||
|
used = cur*100/max
|
||||||
|
ret = ' <td>%s percent left</td>\n' % used
|
||||||
|
ret += ' <td style="width: 100px; border: 1px solid black;">\n'
|
||||||
|
if used < 10:
|
||||||
|
color = 'red'
|
||||||
|
elif used < 30:
|
||||||
|
color = 'yellow'
|
||||||
|
else:
|
||||||
|
color = 'green'
|
||||||
|
ret += ' <div style="background: %s; width: %spx;"> </div>\n' % (
|
||||||
|
color, used)
|
||||||
|
ret += ' </td>\n'
|
||||||
|
else:
|
||||||
|
if cur == -3:
|
||||||
|
cur = '<div style="color: green;">OK</div>'
|
||||||
|
elif cur == -2:
|
||||||
|
cur = 'OK'
|
||||||
|
elif cur == 0:
|
||||||
|
cur = '<div style="color: red;">Empty</div>'
|
||||||
|
ret = ' <td colspan="2">%s</td>\n' % cur
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def savedata(name, data):
|
||||||
|
f = open(name, 'w')
|
||||||
|
f.write(data)
|
||||||
|
f.close()
|
||||||
|
os.chmod(name, 0644)
|
||||||
|
|
||||||
|
|
||||||
|
## cups related functions
|
||||||
|
def readtemplate(name, *args, **kwargs):
|
||||||
|
f = open(name, 'r')
|
||||||
|
ret = ''
|
||||||
|
for line in f.readlines():
|
||||||
|
for (k, v) in kwargs.items():
|
||||||
|
line = re.sub('{%s}' % k, v, line)
|
||||||
|
line = re.sub('{.+\?.+:}', '', line)
|
||||||
|
ret += line
|
||||||
|
f.close()
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
## snmp functions
|
||||||
|
def snmpget(community, hostname, *args):
|
||||||
|
cmdline = [ 'snmpget', '-On', '-v', '1', '-c', community, hostname ]
|
||||||
|
for o in args:
|
||||||
|
cmdline.append(o)
|
||||||
|
ret = {}
|
||||||
|
cmd = Popen(cmdline, stdout=PIPE, stderr=PIPE, close_fds=True)
|
||||||
|
for line in cmd.stdout.readlines():
|
||||||
|
line = snmpparse(line)
|
||||||
|
if line is not None:
|
||||||
|
ret[line[0]] = line[1]
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def snmpwalk(community, hostname, oid):
|
||||||
|
cmdline = [ 'snmpwalk', '-On', '-v', '1', '-c', community, hostname, oid ]
|
||||||
|
ret = {}
|
||||||
|
cmd = Popen(cmdline, stdout=PIPE, stderr=PIPE, close_fds=True)
|
||||||
|
for line in cmd.stdout.readlines():
|
||||||
|
line = snmpparse(line)
|
||||||
|
if line is not None:
|
||||||
|
ret[line[0]] = line[1]
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def snmpparse(data):
|
||||||
|
data = data.strip().split(' ', 3)
|
||||||
|
try:
|
||||||
|
if data[2] in ('INTEGER:', 'Counter32:'):
|
||||||
|
ret = int(data[3])
|
||||||
|
elif data[2] == 'STRING:':
|
||||||
|
if data[3][0] == '"' and data[3][-1] == '"':
|
||||||
|
data[3] = data[3][1:-1]
|
||||||
|
ret = data[3]
|
||||||
|
elif data[2] == 'Hex-STRING:':
|
||||||
|
ret = data[3]
|
||||||
|
elif data[2] == 'NULL':
|
||||||
|
ret = None
|
||||||
|
elif data[2] == '""':
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
raise ValueError('Invalid value type %s' % data[2][0:-1])
|
||||||
|
except IndexError:
|
||||||
|
return None
|
||||||
|
return (data[0], ret)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
sys.exit(1)
|
91
cups/files/update-printer-inf.sh
Normal file
91
cups/files/update-printer-inf.sh
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Copyright (c) 2009 Timo Makinen
|
||||||
|
# All rights reserved.
|
||||||
|
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# 3. The name of the author may not be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
# read samba config with testparm and determine path to print$ share
|
||||||
|
samba_driver_dir() {
|
||||||
|
(echo "" | testparm) 2> /dev/null | awk '
|
||||||
|
{
|
||||||
|
if (/^\[print\$\]/) {
|
||||||
|
sect=1
|
||||||
|
} else if (/^\[/) {
|
||||||
|
sect=0
|
||||||
|
}
|
||||||
|
if (sect == 1 && /^[ \t]*path = /) {
|
||||||
|
print $3
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# function which replaces printer specific values from cups driver
|
||||||
|
parse_driver_inf() {
|
||||||
|
cat "$1" | sed \
|
||||||
|
-e "s/CUPS6\.\(PPD\|PS\)/${printer}.\1/g" \
|
||||||
|
-e "s/CUPS Test Driver v\([0-9]*\)/CUPS Driver for ${printer}/"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CUPSDRIVERS="/usr/share/cups/drivers"
|
||||||
|
if [ ! -d "${CUPSDRIVERS}" ]; then
|
||||||
|
echo "ERR: Cannot find CUPS driver directory ${CUPSDRIVERS}" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
SAMBADRIVERS="`samba_driver_dir`"
|
||||||
|
if [ "${SAMBADRIVERS}" = "" ]; then
|
||||||
|
echo 'ERR: Cannot find directory for share print$' 1>&2
|
||||||
|
exit 1
|
||||||
|
elif [ ! -d "${SAMBADRIVERS}" ]; then
|
||||||
|
echo 'ERR: Directory for share print$ does not exist' 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# loop through printers
|
||||||
|
lpstat -p | sed -n 's/^printer \(.*\) is .*$/\1/p' | while read printer ; do
|
||||||
|
for platform in "W32X86" "x64" "ia64" ; do
|
||||||
|
# skip platform if no samba drivers are installed
|
||||||
|
[ -d "${SAMBADRIVERS}/${platform}" ] || continue
|
||||||
|
# set source inf and check that it's found
|
||||||
|
if [ "${platform}" = "W32X86" ]; then
|
||||||
|
source="${CUPSDRIVERS}/cups6.inf"
|
||||||
|
else
|
||||||
|
source="${CUPSDRIVERS}/${platform}/cups6.inf"
|
||||||
|
fi
|
||||||
|
[ -f "${source}" ] || continue
|
||||||
|
|
||||||
|
# create new inf if needed
|
||||||
|
target="${SAMBADRIVERS}/${platform}/3/${printer}.inf"
|
||||||
|
if [ -f "${target}" ]; then
|
||||||
|
parse_driver_inf "${source}" | diff "${target}" - > /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "Updating driver INF file ${target}"
|
||||||
|
parse_driver_inf "${source}" > "${target}"
|
||||||
|
done
|
||||||
|
done
|
119
cups/manifests/init.pp
Normal file
119
cups/manifests/init.pp
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
|
||||||
|
# Install and configure cups client
|
||||||
|
#
|
||||||
|
class cups::client {
|
||||||
|
|
||||||
|
package { "cups":
|
||||||
|
ensure => installed,
|
||||||
|
}
|
||||||
|
|
||||||
|
file { "/etc/cups/client.conf":
|
||||||
|
ensure => present,
|
||||||
|
content => template("cups/client.conf.erb"),
|
||||||
|
mode => 0644,
|
||||||
|
owner => root,
|
||||||
|
group => lp,
|
||||||
|
require => Package["cups"],
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install cups server
|
||||||
|
#
|
||||||
|
class cups::server inherits cups::client {
|
||||||
|
|
||||||
|
package { [ "ghostscript", "system-config-printer" ]:
|
||||||
|
ensure => installed,
|
||||||
|
}
|
||||||
|
|
||||||
|
service { "cups":
|
||||||
|
ensure => running,
|
||||||
|
enable => true,
|
||||||
|
require => Package["cups"],
|
||||||
|
}
|
||||||
|
|
||||||
|
File["/etc/cups/client.conf"] {
|
||||||
|
content => "ServerName 127.0.0.1\n",
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Install samba support into cups
|
||||||
|
#
|
||||||
|
class cups::samba {
|
||||||
|
|
||||||
|
include samba::server
|
||||||
|
|
||||||
|
file { [ "/etc/samba/drivers",
|
||||||
|
"/usr/share/cups/drivers",
|
||||||
|
"/usr/share/cups/drivers/x64", ]:
|
||||||
|
ensure => directory,
|
||||||
|
mode => 0755,
|
||||||
|
owner => root,
|
||||||
|
group => root,
|
||||||
|
require => [ Package["samba"],
|
||||||
|
Package["cups"], ],
|
||||||
|
}
|
||||||
|
|
||||||
|
define driverfile() {
|
||||||
|
file { "/usr/share/cups/drivers/${name}":
|
||||||
|
ensure => present,
|
||||||
|
source => "puppet:///cups/drivers/${name}",
|
||||||
|
mode => 0644,
|
||||||
|
owner => root,
|
||||||
|
group => root,
|
||||||
|
require => [ File["/usr/share/cups/drivers"],
|
||||||
|
File["/usr/share/cups/drivers/x64"], ],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
driverfile { "cups6.inf": }
|
||||||
|
driverfile { "cups6.ini": }
|
||||||
|
driverfile { "cupsps6.dll": }
|
||||||
|
driverfile { "cupsui6.dll": }
|
||||||
|
|
||||||
|
driverfile { "ps5ui.dll": }
|
||||||
|
driverfile { "pscript.hlp": }
|
||||||
|
driverfile { "pscript.ntf": }
|
||||||
|
driverfile { "pscript5.dll": }
|
||||||
|
|
||||||
|
driverfile { "x64/cups6.inf": }
|
||||||
|
driverfile { "x64/cups6.ini": }
|
||||||
|
driverfile { "x64/cupsps6.dll": }
|
||||||
|
driverfile { "x64/cupsui6.dll": }
|
||||||
|
|
||||||
|
driverfile { "x64/ps5ui.dll": }
|
||||||
|
driverfile { "x64/pscript.hlp": }
|
||||||
|
driverfile { "x64/pscript.ntf": }
|
||||||
|
driverfile { "x64/pscript5.dll": }
|
||||||
|
|
||||||
|
file { "/etc/cron.hourly/update-printer-inf.sh":
|
||||||
|
ensure => present,
|
||||||
|
source => "puppet:///cups/update-printer-inf.sh",
|
||||||
|
mode => 0755,
|
||||||
|
owner => root,
|
||||||
|
group => root,
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Install SNMP polling into cups server
|
||||||
|
#
|
||||||
|
class cups::snmp {
|
||||||
|
|
||||||
|
package { "net-snmp-utils":
|
||||||
|
ensure => installed,
|
||||||
|
}
|
||||||
|
|
||||||
|
file { "/etc/cron.hourly/printer-details.py":
|
||||||
|
ensure => present,
|
||||||
|
source => "puppet:///cups/printer-details.py",
|
||||||
|
mode => 0755,
|
||||||
|
owner => root,
|
||||||
|
group => root,
|
||||||
|
require => Package["net-snmp-utils"],
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
cups/templates/client.conf.erb
Normal file
4
cups/templates/client.conf.erb
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
ServerName <%= cups_server %>
|
||||||
|
<% if cups_ssl -%>
|
||||||
|
Encryption Required
|
||||||
|
<% end -%>
|
Loading…
Add table
Reference in a new issue