summaryrefslogtreecommitdiff
path: root/bin/itzks-standardskriver
diff options
context:
space:
mode:
Diffstat (limited to 'bin/itzks-standardskriver')
-rwxr-xr-xbin/itzks-standardskriver150
1 files changed, 150 insertions, 0 deletions
diff --git a/bin/itzks-standardskriver b/bin/itzks-standardskriver
new file mode 100755
index 0000000..6b3aa35
--- /dev/null
+++ b/bin/itzks-standardskriver
@@ -0,0 +1,150 @@
+#!/usr/bin/python
+
+# Copyright (C) 2013, John Sigurd Skogtvedt <jss@linuxavdelingen.no>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# /etc/xdg/autostart/standardskriver.desktop eksempel:
+# [Desktop Entry]
+# Type=Application
+# Exec=standardskriver
+# Name=standardskriver
+# StartupNotify=false
+
+CFG_FILE = '/etc/standardskriver.cfg'
+CFG_FILE_EXAMPLE = '''[settings]
+order = machine groups
+delete lpoptions = yes
+
+# MAC address or IP = printer
+# hostname = printer
+# hostname.domain = printer
+# LTSP client IP = printer
+# (globbing works)
+[machine]
+00:01:02:03:04:05 = printer01
+172.16.34.64 = printer02
+hostname = printer01
+hostname.domain = printer02
+
+# group name = printer
+# (globbing works)
+[groups]
+group1 = printer01
+group2 = printer02
+'''
+from glob import glob
+from fnmatch import fnmatchcase
+
+import sys
+import os
+import subprocess
+import re
+from socket import gethostname, getfqdn
+from optparse import OptionParser
+from ConfigParser import RawConfigParser
+
+macaddrs = [open(a).read().replace(':', '').strip().lower() for a in glob('/sys/class/net/*/address')]
+macaddrs = [a for a in macaddrs if a]
+
+parser = OptionParser()
+parser.add_option('-n', '--dryrun', action='store_true', help='only show what would be done')
+options, args = parser.parse_args()
+
+if not os.path.exists(CFG_FILE):
+ print >>sys.stderr, 'Configuration file %s is missing.' % CFG_FILE
+ print >>sys.stderr, 'To create it, redirect the following example to %s and edit the file.' % CFG_FILE
+ print CFG_FILE_EXAMPLE
+ sys.exit(1)
+
+cfg = RawConfigParser()
+# hack: mac addrs contain :, which clashes with cfg syntax
+cfg.OPTCRE = re.compile(
+ r'(?P<option>[^=\s][^=]*)' # very permissive!
+ r'\s*(?P<vi>[=])\s*' # any number of space/tab,
+ # followed by separator
+ # (=), followed
+ # by any # space/tab
+ r'(?P<value>.*)$' # everything up to eol
+ )
+cfg.readfp(open(CFG_FILE, 'rb'))
+
+for x in cfg.get('settings', 'order').split():
+ if not x in ('machine', 'groups'):
+ print 'invalid value %s in settings/order' % s
+ sys.exit(1)
+
+hostnames = []
+hostnames.append(gethostname())
+hostnames.append(getfqdn())
+
+re_ipaddr = re.compile(r'inet addr:(\S+)')
+ipaddrs = []
+try:
+ ipaddrs.append(os.environ['SSH_CLIENT'].split()[0])
+except KeyError:
+ pass
+p = subprocess.Popen(['/sbin/ifconfig'], stdout=subprocess.PIPE)
+for line in p.stdout:
+ m = re_ipaddr.search(line)
+ if m:
+ ipaddrs.append(m.group(1))
+p.wait()
+
+p = subprocess.Popen(['id', '-Gn'], stdout=subprocess.PIPE)
+groups = p.stdout.read().split()
+p.wait()
+#print groups
+
+def get_group_match():
+ for group, printer in cfg.items('groups'):
+ if group.strip('@') in groups: return printer
+ return None
+
+def get_machine_match():
+ for machine, printer in cfg.items('machine'):
+ if any(fnmatchcase(macaddr, machine.replace('-', '').replace(':', '')) for macaddr in macaddrs) or \
+ any(fnmatchcase(ipaddr, machine) for ipaddr in ipaddrs) or \
+ any(fnmatchcase(hostname, machine) for hostname in hostnames):
+ return printer
+ return None
+
+matches = []
+for item in cfg.get('settings', 'order').split():
+ if item == 'machine': matches.append(get_machine_match())
+ elif item == 'groups': matches.append(get_group_match())
+ else: raise ValueError('%s is not machine or groups' % item)
+
+try:
+ printer = [x for x in matches if x][0]
+except IndexError: # no match
+ if cfg.getboolean('settings', 'delete lpoptions'):
+ lpoptions_filename = os.path.expanduser('~/.cups/lpoptions')
+ if options.dryrun:
+ print 'would delete %s' % lpoptions_filename
+ else:
+ try:
+ os.unlink(lpoptions_filename)
+ except OSError:
+ pass
+ sys.exit(0)
+
+args = ['lpoptions', '-d', printer]
+if options.dryrun:
+ print 'would call %s' % (' '.join(args))
+else:
+ subprocess.call(args)
+
+