diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2013-11-08 23:27:33 +0100 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2013-11-08 23:27:33 +0100 |
commit | af69f3ba0ab44c76ac745f40761aaf092162a94d (patch) | |
tree | 1a06503b6c0c5b491062ef833b965efd8240f763 | |
parent | eb1c9c63dfddcc10408423165aad38eb5da28543 (diff) | |
download | itzks-systems-af69f3ba0ab44c76ac745f40761aaf092162a94d.tar.gz itzks-systems-af69f3ba0ab44c76ac745f40761aaf092162a94d.tar.bz2 itzks-systems-af69f3ba0ab44c76ac745f40761aaf092162a94d.zip |
Add standardskriver script, provided by linuxavdelingen.no.
-rwxr-xr-x | bin/itzks-standardskriver | 150 | ||||
-rw-r--r-- | debian/changelog | 10 | ||||
-rw-r--r-- | debian/itzks-systems-common.install | 2 | ||||
-rw-r--r-- | etc/standardskriver.cfg | 9 |
4 files changed, 169 insertions, 2 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) + + diff --git a/debian/changelog b/debian/changelog index 9ab82ee..c0ae27f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,15 @@ -itzks-systems (2013.09.18.1) UNRELEASED; urgency=low +itzks-systems (2013.11.09.1) UNRELEASED; urgency=low + + * Add standardskriver script, provided by linuxavdelingen.no. + + -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Fri, 08 Nov 2013 23:26:10 +0100 + +itzks-systems (2013.09.24.1) squeeze-backports; urgency=low * /debian/control: - Add dependency for workstations: network-manager-gnome. - -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Wed, 18 Sep 2013 08:46:21 +0200 + -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Tue, 24 Sep 2013 20:47:17 +0200 itzks-systems (2013.08.07.1) squeeze-backports; urgency=low diff --git a/debian/itzks-systems-common.install b/debian/itzks-systems-common.install index 223bdb4..2d3ba3c 100644 --- a/debian/itzks-systems-common.install +++ b/debian/itzks-systems-common.install @@ -2,5 +2,7 @@ etc/debian-edu/* etc/debian-edu/ etc/network/* etc/network/ etc/apt/* etc/apt/ etc/iceweasel/* etc/iceweasel/ +etc/standardskriver.cfg etc/ bin/passwd usr/bin/ +bin/itzks-standardskriver usr/bin/ sbin/itzks-systems.do_preseed
\ No newline at end of file diff --git a/etc/standardskriver.cfg b/etc/standardskriver.cfg new file mode 100644 index 0000000..fd0eb71 --- /dev/null +++ b/etc/standardskriver.cfg @@ -0,0 +1,9 @@ +[settings] +order = machine groups +delete lpoptions = yes + +[machine] +<host-1> = printer-A +<host-2> = printer-B + +[groups] |