Hi there,

Here's an update that enables CUPS to run on boxes which
usually read-only mount both /usr & /usr/local

The current rc script alters /usr, /etc & /dev on each start/stop.

Inspiration taken from the postfix-{en,dis}able,install scripts:
Much moved out of the rc script and into 'cups-toggle (enable|disable)'.

Freely adjust to your better experience!

I'm not sure if the script needs a copyright notice or not, here anyway.


? files
? pkg/MESSAGE-main
Index: Makefile
===================================================================
RCS file: /cvs/ports/print/cups/Makefile,v
retrieving revision 1.197
diff -u -p -r1.197 Makefile
--- Makefile    9 Jun 2015 08:01:13 -0000       1.197
+++ Makefile    13 Jun 2015 18:24:58 -0000
@@ -10,7 +10,7 @@ EXTRACT_SUFX=         .tar.bz2
 PKGNAME-main=          cups-${VERSION}
 PKGNAME-libs=          cups-libs-${VERSION}
 
-REVISION-main=         0
+REVISION-main=         1
 REVISION-libs=         0
 
 CATEGORIES=            print sysutils
@@ -124,6 +124,8 @@ post-install:
 # Remove files now part of cups-filters
        rm -f ${PREFIX}/share/cups/banners/*
        rm -f ${PREFIX}/share/cups/data/testprint
+       ${SUBST_CMD} -c -g ${BINGRP} -o ${BINOWN} -m ${BINMODE} 
${FILESDIR}/cups-toggle ${PREFIX}/sbin/cups-toggle
+
 
 # Remove desktop file and icons; we don't really need them (it's just a
 # launcher for http://localhost:631 and we may actually want to
Index: pkg/PLIST-main
===================================================================
RCS file: /cvs/ports/print/cups/pkg/PLIST-main,v
retrieving revision 1.18
diff -u -p -r1.18 PLIST-main
--- pkg/PLIST-main      9 Jun 2015 07:39:14 -0000       1.18
+++ pkg/PLIST-main      13 Jun 2015 18:24:58 -0000
@@ -2,6 +2,7 @@
 @conflict LPRng-*
 @pkgpath print/cups
 @pkgpath print/cups,ldap
+@extraunexec ${TRUEPREFIX}/sbin/cups-toggle disable
 @extraunexec rm -rf ${SYSCONFDIR}/cups/*.conf.O /var/log/cups
 @bin bin/cancel
 @bin bin/cupstestdsc
@@ -118,6 +119,7 @@ sbin/accept
 @bin sbin/cupsaccept
 @bin sbin/cupsaddsmb
 @bin sbin/cupsctl
+sbin/cups-toggle
 @mode 0500
 @bin sbin/cupsd
 @mode
Index: pkg/cupsd.rc
===================================================================
RCS file: /cvs/ports/print/cups/pkg/cupsd.rc,v
retrieving revision 1.21
diff -u -p -r1.21 cupsd.rc
--- pkg/cupsd.rc        6 Dec 2014 11:12:44 -0000       1.21
+++ pkg/cupsd.rc        13 Jun 2015 18:24:58 -0000
@@ -4,75 +4,27 @@
 
 daemon="${TRUEPREFIX}/sbin/cupsd"
 
-. /etc/rc.d/rc.subr
+. ${RCDIR}/rc.subr
 
 pexp="${daemon}"
 
-_lpfiles="/usr/bin/lpq /usr/bin/lpr /usr/bin/lprm /usr/sbin/lpc \
-         /usr/sbin/lpd /usr/share/man/man1/lpq.1 /usr/share/man/man1/lpr.1 \
-         /usr/share/man/man1/lprm.1 /usr/share/man/man8/lpc.8 \
-         /usr/share/man/man8/lpd.8"
 
-rc_pre() {
-       # rcexec is needed if openfiles limits are bumped and cupsd(8)
-       # runs in debug mode to prevent MaxClients warnings in logs
-       ${rcexec} "${daemon} ${daemon_flags} -t" || return 1
-       [ -e /dev/lpt0 ] && chown _cups /dev/lp[a,t][0-2]
-       # XXX cups-driverd(8) can crash when setting up a printer driver
-       rm -f /var/cache/cups/*
-
-       if [ -e /usr/sbin/lpd.pre-cups -a ! -f /usr/sbin/lpd -a -L 
/usr/sbin/lpc ]; then
-               return
-       elif [ ! -e /usr/sbin/lpd ]; then
-               return
-       else
-               for i in ${_lpfiles}; do
-                       if [ -f $i -a ! -L $i ]; then
-                               mv -f $i $i.pre-cups
-                       fi
-               done
-       fi
-       if [ -e /etc/printcap ]; then
-               if [ ! -e /etc/printcap.pre-cups ]; then
-                       mv /etc/printcap /etc/printcap.pre-cups
-                       ln -s ${SYSCONFDIR}/cups/printcap /etc/printcap
-               fi
-       else
-               ln -s ${SYSCONFDIR}/cups/printcap /etc/printcap
-       fi
-       for i in lpq lpr lprm; do
-               rm -f /usr/bin/$i
-               ln -s ${TRUEPREFIX}/bin/$i /usr/bin/$i
+rc_pre()
+{
+       for _lpfile in /usr/bin/lp{q,r,rm} /usr/sbin/lp{c,d} 
${SYSCONFDIR}/printcap
+       do
+               [[ -h ${_lpfile} ]] && continue
+               print -u2 "${_lpfile} isn't a symlink - run 'cups-toggle 
enable'"
+               return 1
        done
-       rm -f /usr/sbin/lpc
-       ln -s ${TRUEPREFIX}/sbin/lpc /usr/sbin/lpc
-}
 
-rc_post() {
-       if [ ! -L /usr/sbin/lpc ]; then
-               return
-       else
-               for i in lpq lpr lprm; do
-                       rm -f /usr/bin/$i
-               done
-
-               rm -f /usr/sbin/lpc
-
-               if [ ! -e /usr/sbin/lpd.pre-cups ]; then
-                       return
-               else
-                       if [ -L /etc/printcap ]; then
-                               rm /etc/printcap
-                       fi
-                       for i in ${_lpfiles} /etc/printcap; do
-                               if [ -e $i.pre-cups ]; then
-                                       mv -f $i.pre-cups $i
-                               fi
-                       done
-               fi
-       fi
+       # XXX cups-driverd(8) can crash when setting up a printer driver
+       # find /var/cache/cups -type f -name ppds.dat -exec rm -- {} \;
 
-       [ -e /dev/lpt0 ] && chown root /dev/lp[a,t][0-2]
+       # rcexec is needed if openfiles limits are bumped and cupsd(8)
+       # runs in debug mode to prevent MaxClients warnings in logs
+       ${rcexec} "${daemon} ${daemon_flags} -t"
 }
+
 
 rc_cmd $1
--- /dev/null   Sat Jun 13 19:28:37 2015
+++ pkg/MESSAGE-main    Sat Jun 13 16:41:13 2015
@@ -0,0 +1,10 @@
+CUPS can be set up to replace lpd entirely.
+
+To backup the lp* tools and symlink in the CUPS replacements, do:
+
+    ${PREFIX}/sbin/cups-toggle enable
+
+To revert to the base lp* tools, do:
+
+    ${PREFIX}/sbin/cups-toggle disable
+    
--- /dev/null   Sat Jun 13 19:29:04 2015
+++ files/cups-toggle   Sat Jun 13 19:17:39 2015
@@ -0,0 +1,161 @@
+#!/bin/ksh
+#
+# $OpenBSD$
+#
+#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+#
+# Copyright (c) 2015 Craig Skinner <[email protected]>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+#
+
+
+EX_USAGE='64'
+BINARIES='/usr/bin/lp{q,r,rm} /usr/sbin/lp{c,d}'
+MAN_PAGES='/usr/share/man/man1/lp{q,r,rm}.1 /usr/share/man/man8/lp{c,d}.8'
+
+readonly EX_USAGE BINARIES MAN_PAGES
+
+
+function enable
+{
+       print "$0()"
+
+       ${RCDIR}/lpd check &&
+       {
+               ${RCDIR}/lpd stop || return
+       }
+
+       print -n 'Backing up:'
+       for _lpfile in ${BINARIES} ${MAN_PAGES} ${SYSCONFDIR}/printcap
+       do
+               [[ -f ${_lpfile} ]] || continue
+               [[ -h ${_lpfile} ]] && continue
+               [[ -f ${_lpfile}.pre-cups ]] && continue
+               print -n " ${_lpfile##*/}"
+               mv ${_lpfile} ${_lpfile}.pre-cups || return
+       done
+       print '.'
+
+       [[ -h ${SYSCONFDIR}/printcap ]] ||
+       {
+               print -n 'Symlinking ${SYSCONFDIR}/printcap'
+               ln -s ${SYSCONFDIR}/cups/printcap ${SYSCONFDIR}/printcap || 
return
+               print '.'
+       }
+
+       print -n 'Symlinking binaries:'
+       for binary in ${BINARIES}
+       do
+               [[ -h ${binary} ]] && continue
+               [[ -f ${TRUEPREFIX}/bin/${binary##*/} ]] &&
+               {
+                       print -n " ${binary##*/}"
+                       ln -s ${TRUEPREFIX}/bin/${binary##*/} ${binary} || 
return
+                       continue
+               }
+               [[ -f ${TRUEPREFIX}/sbin/${binary##*/} ]] &&
+               {
+                       print -n " ${binary##*/}"
+                       ln -s ${TRUEPREFIX}/sbin/${binary##*/} ${binary} || 
return
+                       continue
+               }
+               print -n " ${binary##*/}"
+               ln -s /usr/bin/false ${binary} || return
+       done
+       print '.'
+
+       chown_lp_devs _cups
+}
+
+
+function disable
+{
+       print "$0()"
+
+       ${RCDIR}/cups_browsed check &&
+       {
+               ${RCDIR}/cups_browsed stop || return
+       }
+       ${RCDIR}/cupsd check &&
+       {
+               ${RCDIR}/cupsd stop || return
+       }
+
+       print -n 'Reverting to base:'
+       for _lpfile in ${BINARIES} ${MAN_PAGES} ${SYSCONFDIR}/printcap
+       do
+               [[ -h ${_lpfile} ]] &&
+               {
+                       rm ${_lpfile} || return
+               }
+               [[ -f ${_lpfile}.pre-cups ]] || continue
+               print -n " ${_lpfile##*/}"
+               mv ${_lpfile}.pre-cups ${_lpfile} || return
+       done
+       print '.'
+
+       chown_lp_devs root
+}
+
+
+function usage
+{
+       print -u2 "usage: ${0##*/} (enable|disable)"
+       exit ${EX_USAGE}
+}
+
+
+function chown_lp_devs
+{
+       print "$0() $1"
+       userinfo -e $1 || return
+
+       lp_devs='/dev/lp[a,t][0-2]'
+       log_devs_are=$(mktemp)
+       ls -l ${lp_devs} > ${log_devs_are}
+
+       for lp_dev in ${lp_devs}
+       do
+               [[ -c ${lp_dev} ]] || continue
+               [[ $(stat -f "%Su" ${lp_dev}) == $1 ]] && continue
+               chown $1 ${lp_dev} || return
+       done
+
+       log_devs_now=$(mktemp)
+       ls -l ${lp_devs} > ${log_devs_now}
+       cmp -s ${log_devs_are} ${log_devs_now} ||
+       {
+               print 'devices are:'
+               cat ${log_devs_are}
+               print 'devices now:'
+               cat ${log_devs_now}
+       }
+       rm ${log_devs_are} ${log_devs_now}
+}
+
+
+[[ $# -eq 1 ]] || usage
+[[ $1 == 'enable' || $1 == 'disable' ]] || usage
+
+
+$1 || exit
+
+for _lpfile in ${BINARIES} ${MAN_PAGES} ${SYSCONFDIR}/printcap
+do
+       _lpfiles="${_lpfiles} ${_lpfile}*"
+done
+ls -lF ${_lpfiles}
+

Reply via email to