From 8daa83a594a2e98f39d764422bfbdbc62c9efd44 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 19:20:00 +0200 Subject: Adding upstream version 2:4.20.0+dfsg. Signed-off-by: Daniel Baumann --- examples/printing/VampireDriversFunctions | 1656 +++++++++++++++++++++++++++++ examples/printing/prtpub.c | 237 +++++ examples/printing/readme.prtpub | 12 + examples/printing/smbprint.sysv | 52 + 4 files changed, 1957 insertions(+) create mode 100644 examples/printing/VampireDriversFunctions create mode 100644 examples/printing/prtpub.c create mode 100644 examples/printing/readme.prtpub create mode 100644 examples/printing/smbprint.sysv (limited to 'examples/printing') diff --git a/examples/printing/VampireDriversFunctions b/examples/printing/VampireDriversFunctions new file mode 100644 index 0000000..b06e365 --- /dev/null +++ b/examples/printing/VampireDriversFunctions @@ -0,0 +1,1656 @@ +#!/bin/bash + +##################################################################### +## +## smb.conf parser class +## +## Copyright (C) Kurt Pfeifle , 2004. +## +## 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 3 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, see . +## +###################################################################### + +###################################################################### +## Here an example calling sequence +##!/bin/sh +## set -x +## source VampireDriversFunctions + +## +## Start local variables +## +## You must define these variable (possibly in a source script) + +## nthost=192.168.17.1 +## printeradmin=Administrator +## adminpasswd=not4you + +## smbhost=knoppix +## smbprinteradmin=knoppix +## smbadminpasswd=knoppix +## +## End of local variables +## + +## +## functions to call +## + +## fetchenumdrivers3listfromNThost # repeat, if no success at first +## createdrivernamelist +## createprinterlistwithUNCnames # repeat, if no success at first +## createmapofprinterstodriver +## splitenumdrivers3list +## makesubdirsforWIN40driverlist +## splitWIN40fileintoindividualdriverfiles +## fetchtheWIN40driverfiles +## uploadallWIN40drivers +## makesubdirsforW32X86driverlist +## splitW32X86fileintoindividualdriverfiles +## fetchtheW32X86driverfiles +## uploadallW32X86drivers + +## End of example calling sequence +###################################################################### + + +# ----------------------------------------------------------------------------- +# ----------------------------------------------------------------------------- +function vampiredrivers_readme() +{ +echo -e " \n\ +############################################################################ +# +# About the \"Vampire Printer Drivers\" set of functions.... +# -------------------------------------------------------- +# +# (C) Kurt Pfeifle , 2004 +# License: GPL +# +# ------------------------------------------------------------ +# +# Version: 0.8 (largely \"self-documented\" now, but not yet +# completely -- if it ever will be....) +# +# Thanks a lot to Fabian Franz for helping me with some important +# Bash-Scripting-Questions! +# +# This set of functions provides a framework to snatch all printer +# driver info and related files from a Windows NT print server. +# It then uploads and installs the drivers to a Samba server. (The +# Samba server needs to be prepared for this: a valid [print$] +# share, with write access set for a user with SePrintOperatorPrivilege.) +# +# The main commands used are \"smbclient\" and \"rpcclient\" combined +# with \"grep\", \"sed\" and \"awk\". Probably a Perl or Python script +# would be better suited to do this, mainly because we have to cope +# with printer and driver names which are containing spaces in +# them, so a lot of shell escaping is required to handle these. +# Also, I am not very savvy in scripting, so I invented some very +# obscure methods to work around my knowledge gaps. When I download +# the driver files from the Windows NT box, I put all related driver +# files into their own sub directory, using the same name as the +# driver. Also, driver versions \"0\", \"2\" and \"3\" are placed in +# further subdirectories. +# +# +# Known problems: +# --------------- +# +# 1) I found one printer driver containing a \"slash\" which is not +# handled by this script: \"HP Color LaserJet 5/5M PS\". (There +# are more of these in the wild, of course.) -- The reason: I +# didn't find a way to create a Unix directory containing a \"slash\". +# UPDATE: The script replaces the \"/\" with a \"_\" and also renames +# the drivername accordingly, when it is uploaded to the Samba +# [print$] share.... +# +# 2) There is an unsolved problem in case a real file name deviates +# in its case sensitive spelling from how it is displayed by the +# \"rpcclient enumdrivers\" command. I encountered cases where +# rpcclient displayed \"PS5UI.DLL\" as a file name, but \"smbclient +# mget\" retrieved \"ps5ui.dll\" from the NT printserver, and the +# driverinstallation failed because \"smbclient mput\" tried to put +# \"PS5UI.DLL\" back onto the Samba server where UNIX only had +# \"ps5ui.dll\" available (which of course failed). -- UPDATE: this +# is now solved. All files are renamed now to the same +# case-sensitive spelling as \"rpcclient ... enumdrivers 3\" +# announces. This includes renaming into both, uppercase or +# lowercase, as the case might be.... +# +# 3) This script is probably not portable at all and relies on lots +# of Bash-isms. +# +# 4) This script runs with rpcclient from Samba-3.0.2a (or later) only +# (because it uses the \"Version\" parameter for \"adddriver\"). +# +# The following functions use a few external variables to log +# into the 2 hosts. We suggest that you create a file which +# contains the variables and that you source that file at the +# beginning of this script... +# +# ################################################################# +# +# ntprinteradmin=Administrator # any account on the NT host +# # with SePrintOperatorPrivilege privileges +# ntadminpasswd=not4you # the printer admin password on +# # the NT print server +# nthost=windowsntprintserverbox # the netbios name of the NT print +# # server +# +# smbprinteradmin=knoppix # an account on the Samba server +# # with SePrintOperatorPrivilege privileges +# smbadminpasswd=2secret4you # the printer admin password on +# # the Samba server +# smbhost=knoppix # the netbios name of the Samba +# # print server +# +# ################################################################# +# +# +# NOTE: these functions also work for 2 NT print servers: snatch all +# drivers from the first, and upload them to the second server (which +# takes the role of the \"Samba\" server). Of course they also work +# for 2 Samba servers: snatch all drivers from the first (which takes +# the role of the NT print server) and upload them to the second.... +# +# +# ............PRESS \"q\" TO QUIT............" \ +|less +} + + +#set -x + + +# ----------------------------------------------------------------------------- +# ----------- print a little help... ------------------------------------------ +# ----------------------------------------------------------------------------- + +function helpwithvampiredrivers() +{ +if stringinstring help "$@"; then +helpwithvampiredrivers ; +else + echo " "; + echo " 1. Run the functions of this script one by one."; + echo " "; + echo " 2. List all functions with the \"enumallfunctions\" call."; + echo " "; + echo " 3. After each functions' run, check if it completed successfully."; + echo " "; + echo " 4. For each function, you can ask for separate help by typing"; + echo " \" --help\"." + echo " "; + echo " 5. Often network conditions prevent the MS-RPC calls" + echo " implemented by Samba to succeed at the first attempt." + echo " You may have more joy if you try more than once or twice...."; + echo " "; + echo " 6. I can not support end-users who have problems with this script." + echo " However, we are available for paid, professional consulting," + echo " training and troubleshooting work."; + echo " "; + echo " "; +fi +} + +# ----------------------------------------------------------------------------- +# ----------- enumerate all builtin functions... ------------------------------ +# ----------------------------------------------------------------------------- +function enumallfunctions() +{ +if stringinstring help "$@"; then +helpwithvampiredrivers ; +else + echo " " + echo " " + echo "--> Running now function enumallfunctions()..." + echo "==============================================" + echo -e " \n\ + + NOTE: run the listed functions in the same order as listed below. + + EXAMPLE: \"knoppix@ttyp6[knoppix]$ helpwithvampiredrivers\" + + HELP: the \"--help\" parameter prints usage hints regarding a function. + + EXAMPLE: \"knoppix@ttyp6[knoppix]$ fetchenumdrivers3listfromNThost --help\" + + + function vampiredrivers_readme() + function enumallfunctions() + function helpwithvampiredrivers() + function fetchenumdrivers3listfromNThost() # repeat, if no success at first + function createdrivernamelist() + function createprinterlistwithUNCnames() # repeat, if no success at first + function createmapofprinterstodrivers() + function splitenumdrivers3list() + function makesubdirsforW32X86driverlist() + function splitW32X86fileintoindividualdriverfiles() + function fetchallW32X86driverfiles() + function uploadallW32X86drivers() + function makesubdirsforWIN40driverlist() + function splitWIN40fileintoindividualdriverfiles() + function fetchallWIN40driverfiles() + function uploadallWIN40drivers()" + echo " " +fi +} + +# this is a helperfunction (Thanks to Fabian Franz!) +function stringinstring() +{ + case "$2" in *$1*) + return 0 + ;; + esac + return 1 +} + +# ----------------------------------------------------------------------------- +# ----------- Create an "enumprinters 3" list --------------------- ----------- +# ----------------------------------------------------------------------------- +# + +function helpwithfetchenumdrivers3listfromNThost() +{ +echo -e " \n\ +################################################################################ +# +# About fetchenumdrivers3listfromNThost().... +# ------------------------------------------- +# +# PRECONDITIONS: 1) This function expects write access to the current directory. +# 2) This function expects to have the '\$nthosts', +# '\$ntprinteradmin' and '\$ntadminpasswd' variables set to +# according values. +# +# WHAT IT DOES: This function connects to the '\$nthost' (using the credentials +# '\$ntprinteradmin' with '\$ntadminpasswd', retrieves a list of +# drivers (with related file names) from that host, and saves the +# list under the name of '\${nthost}/enumdrivers3list.txt' (ie. it +# also creates the '\$nthost' subdirectory in the current one). It +# further prints some more info to stdout. +# +# IF IT DOESN'T WORK: It may happen that the function doesn't work at the first +# time (there may be a connection problem). Just repeat a +# few times. It may work then. You will recognize if it +# does. +# +# HINT: The current values: 'nthost'=\"$nthost\" +# 'ntprinteradmin'=\"$ntprinteradmin\" +# 'ntadminpasswd'= +# +################################################################################" +echo " " +} + +# ----------------------------------------------------------------------------- + +function fetchenumdrivers3listfromNThost() +{ +if stringinstring help "$@"; then +helpwithfetchenumdrivers3listfromNThost; +else + echo " " + echo " " + echo "--> Running now function fetchenumdrivers3listfromNThost" + echo "========================================================" + [ -d ${nthost} ] || mkdir "${nthost}"; + rpcclient -U${ntprinteradmin}%${ntadminpasswd} -c 'enumdrivers 3' ${nthost} \ + | sed -e '/^.*Driver Name: \[.*\]/ y/\//_/' \ + | tee \ + ${nthost}/enumdrivers3list.txt; + + NUMBEROFDIFFERENTDRIVERNAMES=$( grep "Driver Name:" ${nthost}/enumdrivers3list.txt \ + | sort -f \ + | uniq \ + | wc -l ); + + echo " "; + echo "--> Finished in running function fetchenumdrivers3listfromNThost...."; + echo "====================================================================" + echo "NUMBEROFDIFFERENTDRIVERNAMES retrieved from \"${nthost}\" is $NUMBEROFDIFFERENTDRIVERNAMES".; + echo " --> If you got \"0\" you may want to try again. <---"; + echo "================================================================"; + echo " "; + enumdrivers3list=`cat ${nthost}/enumdrivers3list.txt`; +fi +} + + +# ----------------------------------------------------------------------------- +# ----------- Create a list of all available drivers installed ---------------- +# ------------------------on the NT print server------------------------------- +# ----------------------------------------------------------------------------- +# + +function helpwithcreatedrivernamelist() +{ +echo -e " \n\ +################################################################################ +# +# About createdrivernamelist()... +# ------------------------------- +# +# PRECONDITIONS: 1) This function expects to find the subdirectory '\$nthost' +# and the file '\${nthost}/enumdrivers3list.txt' to exist. +# 2) This function expects to have the '\$nthosts' variable set +# to an according value. +# +# WHAT IT DOES: This function dissects the '\${nthost}/enumdrivers3list.txt' +# and creates other textfiles from its contents: +# - '\${nthost}/drvrlst.txt' +# - '\${nthost}/completedriverlist.txt' +# and further prints some more info to stdout. +# +# HINT: The current value: 'nthost'=\"$nthost\" +# +################################################################################" +} + +# ----------------------------------------------------------------------------- + +function createdrivernamelist() +{ +if stringinstring help "$@"; then +helpwithcreatedrivernamelist; +else + echo " "; + echo " "; + echo "--> Running now function createdrivernamelist...."; + echo "================================================="; + cat ${nthost}/enumdrivers3list.txt \ + | grep "Driver Name:" \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | sort -f \ + | uniq \ + | tr / _ \ + | sed -e 's/$/\"/' -e 's/^ */\"/' \ + | tee \ + ${nthost}/drvrlst.txt; + drvrlst=$(echo ${nthost}/drvrlst.txt); + + cat ${nthost}/enumdrivers3list.txt \ + | grep "Driver Name:" \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | sort -f \ + | uniq \ + | sed -e 's/$/\"/' \ + | cat -n \ + | sed -e 's/^ */DRIVERNAME/' -e 's/\t/\="/' \ + | tee \ + ${nthost}/completedriverlist.txt; + + NUMBEROFDRIVERS=`cat ${nthost}/completedriverlist.txt| wc -l`; + echo " "; + echo "--> Finished in running function createdrivernamelist...."; + echo "===============================================================================" + echo "NUMBEROFDRIVERS retrieve-able from \"${nthost}\" is $NUMBEROFDRIVERS".; + echo " --> If you got \"0\" you may want to run \"fetchenumdrivers3listfromNThost\"" + echo " again. <---"; + echo "==============================================================================="; + echo " "; + driverlist=`cat ${nthost}/completedriverlist.txt`; + + # alternative method suggested by Fabian Franz: + # | awk 'BEGIN {n=1} { print "DRIVERNAME"n"=\""$0"\""; n=n+1 } ' +fi +} + + + +# ----------------------------------------------------------------------------- +# ----------- Create a list of all available printers ------------------------- +# ----------------------------------------------------------------------------- +# + +function helpwithcreateprinterlistwithUNCnames() +{ +echo -e " \n\ +################################################################################ +# +# About createprinterlistwithUNCnames()... +# ---------------------------------------- +# +# PRECONDITIONS: 1) This function expects write access to the current directory. +# 2) This function expects to have the '\$nthost', +# '\$ntprinteradmin' and '\$ntadminpasswd' variables set to +# according values. +# +# WHAT IT DOES: This function connects to the '\$nthost' (using the credentials +# '\$ntprinteradmin' with '\$ntadminpasswd'), retrieves a list of +# printqueues (with associated driver names) from that host (with +# the help of the 'rpcclient ... enumprinters' utility, and saves +# it under name and path '\${nthost}/printerlistwithUNCnames.txt' +# (ie. it also creates the '\$nthost' subdirectory in the current +# one). It further prints some more info to stdout. +# +# IF IT DOESN'T WORK: It may happen that the function doesn't work at the first +# time (there may be a connection problem). Just repeat a +# few times. It may work then. You will recognize if it does. +# +# HINT: The current values: 'nthost'=\"$nthost\" +# 'ntprinteradmin'=\"$ntprinteradmin\" +# 'ntadminpasswd'= +# +################################################################################" +} + +# ----------------------------------------------------------------------------- + +function createprinterlistwithUNCnames() +{ +if stringinstring help "$@"; then +helpwithcreateprinterlistwithUNCnames ; +else + [ -d ${nthost} ] || mkdir -p ${nthost}; + echo " " + echo " " + echo " " + echo "--> Running now function createprinterlistwithUNCnames()...." + echo "============================================================" + rpcclient -U"${ntprinteradmin}%${ntadminpasswd}" -c 'enumprinters' ${nthost} \ + | grep "description:" \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | sort -f \ + | uniq \ + | tee \ + ${nthost}/printerlistwithUNCnames.txt; + + NUMBEROFPRINTERS=`cat ${nthost}/printerlistwithUNCnames.txt| wc -l`; + echo " "; + echo "--> Finished in running function createprinterlistwithUNCnames...."; + echo "==========================================================================" + echo "NUMBEROFPRINTERS retrieved from \"${nthost}\" is $NUMBEROFPRINTERS".; + echo " --> If you got \"0\" you may want to try again. <---"; + echo "=========================================================================="; + echo " "; + printerlistwithUNCnames=`cat ${nthost}/printerlistwithUNCnames.txt`; +fi +} + + +# ----------------------------------------------------------------------------- +# ----------- Create a list of all printers which have (no) drivers ----------- +# ----------------------------------------------------------------------------- +# + +function helpwithcreatemapofprinterstodrivers() +{ +echo -e " \n\ +################################################################################ +# +# About createmapofprinterdrivers()... +# ------------------------------------ +# +# PRECONDITIONS: 1) This function expects to find a subdirectory '\$nthost' and +# the file '\${nthost}/printerlistwithUNCnames.txt' to exist. +# 2) This functions expects to have the '\$nthosts' variable set +# to an according value. +# +# WHAT IT DOES: This function dissects '\${nthost}/printerlistwithUNCnames.txt' +# and creates some other textfiles from its contents: +# - '\${nthost}/allprinternames.txt' +# - '\${nthost}/alldrivernames.txt' +# - '\${nthost}/allnonrawprinters.txt' +# - '\${nthost}/allrawprinters.txt' +# - '\${nthost}/printertodrivermap.txt' +# and further prints some more info to stdout. +# +# HINT: You currently have defined: 'nthost'=\"$nthost\", which resolves above +# mentioned paths to: +# - '${nthost}/allprinternames.txt' +# - '${nthost}/alldrivernames.txt' +# - '${nthost}/allnonrawprinters.txt' +# - '${nthost}/allrawprinters.txt' +# - '${nthost}/printertodrivermap.txt' +# +################################################################################" +} + +# ----------------------------------------------------------------------------- + +function createmapofprinterstodrivers() +{ +if stringinstring help "$@"; then +helpwithcreatemapofprinterstodrivers ; +else + echo " " + echo " " + echo "--> Running now function createmapofprinterstodrivers()...." + echo "===========================================================" + echo " " + echo " " + echo "ALL PRINTERNAMES:" + echo "=================" + echo " " + cat ${nthost}/printerlistwithUNCnames.txt \ + | awk -F "\\" '{ print $4 }' \ + | awk -F "," '{print $1}' \ + | sort -f \ + | uniq \ + | tee \ + ${nthost}/allprinternames.txt; + + echo " " + echo " " + echo "ALL non-RAW PRINTERS:" + echo "=====================" + echo " " + cat ${nthost}/printerlistwithUNCnames.txt \ + | grep -v ",," \ + | awk -F "\\" '{ print $4 }' \ + | awk -F "," '{print $1}' \ + | sort -f \ + | uniq \ + | tee \ + ${nthost}/allnonrawprinters.txt; + + echo " " + echo " " + echo "ALL RAW PRINTERS:" + echo "================" + echo " " + cat ${nthost}/printerlistwithUNCnames.txt \ + | grep ",," \ + | awk -F "\\" '{ print $4 }' \ + | awk -F "," '{print $1}' \ + | sort -f \ + | uniq \ + | tee \ + ${nthost}/allrawprinters.txt; + + echo " " + echo " " + echo "THE DRIVERNAMES:" + echo "================" + cat ${nthost}/printerlistwithUNCnames.txt \ + | awk -F "," '{print $2 }' \ + | grep -v "^$" \ + | tee \ + ${nthost}/alldrivernames.txt; + + echo " " + echo " " + echo "THE PRINTER-TO-DRIVER-MAP-FOR-non-RAW-PRINTERS:" + echo "===============================================" + cat ${nthost}/printerlistwithUNCnames.txt \ + | awk -F "\\" '{ print $4 }' \ + | awk -F "," '{ print "\"" $1 "\":\"" $2 "\"" }' \ + | grep -v ":\"\"$" \ + | tee \ + ${nthost}/printertodrivermap.txt + echo -e "##########################\n# printer:driver #" >> ${nthost}/printertodrivermap.txt +fi +} + + +# ----------------------------------------------------------------------------- +# ----------- Create a list of all printers which have drivers ---------------- +# ----------------------------------------------------------------------------- +# + +function helpwithgetdrivernamelist() +{ +echo -e " \n\ +################################################################################ +# +# About getdrivernamelist()... +# ---------------------------- +# +# PRECONDITIONS: 1) This function expects to find the subdirectory '\$nthost\' +# otherwise it creates it... +# +# WHAT IT DOES: This function creates the '\${nthost}/printernamelist.txt' +# and also prints it to . To do so, it must contact the +# '\$nthost' via rpcclient (which in turn needs '\$ntprinteradmin' +# '\$ntadminpasswd' to log in....). +# +# HINT: The current values: 'nthost'=\"$nthost\" +# 'ntprinteradmin'=\"$ntprinteradmin\" +# 'ntadminpasswd'= +# which resolves above mentioned path to: +# - '${nthost}/printernamelist.txt' +# +################################################################################" +} + +# ----------------------------------------------------------------------------- + +function getdrivernamelist() +{ +if stringinstring help "$@"; then +helpwithgetdrivernamelist ; +else + [ -d ${nthost} ] || mkdir -p ${nthost}; + echo " " + echo " " + echo "--> Running now function getdrivernamelist()...." + echo "================================================" + rpcclient -U${ntprinteradmin}%${ntadminpasswd} -c 'enumprinters' ${nthost} \ + | grep "description:" \ + | grep -v ",," \ + | awk -F "," '{ print $2 }' \ + | sort -f \ + | uniq \ + | tee \ + ${nthost}/drivernamelist.txt +fi +} + + +# ----------------------------------------------------------------------------- +# ----------- Split the driverfile listing between the architectures ---------- +# ----------------------------------------------------------------------------- +# + +function helpwithsplitenumdrivers3list() +{ +echo -e " \n\ +################################################################################ +# +# About splitenumdrivers3list()... +# -------------------------------- +# +# PRECONDITIONS: 1) This function expects write access to the current directory +# and its subdirs '\$nthost/*'. +# 2) This function expects to have the '\$nthost' variable set to +# the according value. +# +# WHAT IT DOES: This function dissects the '\$nthost/enumdrivers3list.txt' +# (using "sed", "cat", "awk" and "grep"). It splits the list up +# into two different files representing a complete list of drivers +# and files for each of the 2 supported architectures. It creates +# '\${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt' +# and '\${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt'. +# +# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" may not +# have been run successfully. This is a precondition for +# the current function. +# +# HINT: You currently have defined: 'nthost'=\"$nthost\", which resolves above +# mentioned paths to: +# - '${nthost}/WIN40/${nthost}-enumdrivers3list-NTx86.txt' +# - '${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt' +# +################################################################################" +} + +# ----------------------------------------------------------------------------- + +function splitenumdrivers3list() +{ +if stringinstring help "$@"; then +helpwithsplitenumdrivers3list ; +else + echo " " + echo " " + echo "--> Running now function splitenumdrivers3list()...." + echo "====================================================" + + [ -d ${nthost}/WIN40 ] || mkdir -p ${nthost}/WIN40; + [ -d ${nthost}/W32X86 ] || mkdir -p ${nthost}/W32X86; + + cat ${nthost}/enumdrivers3list.txt \ + | sed -e '/^\[Windows NT x86\]/,$ d' \ + | tee \ + ${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt ; + + cat ${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt \ + | grep Version \ + | sort -f \ + | uniq \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | tee ${nthost}/WIN40/availableversionsWIN40.txt ; + +# cd ${nthost}/WIN40/ ; +# mkdir $( cat availableversionsWIN40.txt ) 2> /dev/null ; +# cd - ; + + cat ${nthost}/enumdrivers3list.txt \ + | sed -e '/^\[Windows NT x86\]/,$! d' \ + | tee \ + ${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt ; + + cat ${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt \ + | grep Version \ + | sort -f \ + | uniq \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | tee ${nthost}/W32X86/availableversionsW32X86.txt ; + +# cd ${nthost}/W32X86/ ; +# mkdir $( cat availableversionsW32X86.txt ) 2> /dev/null ; +# cd - ; +fi +} + + +# ----------------------------------------------------------------------------- +# ---------- Make subdirs in ./${sambahost}/WIN40/ for each driver.... ------- +# ----------------------------------------------------------------------------- +# + +function helpwithmakesubdirsforWIN40driverlist() +{ +echo -e " \n\ +################################################################################ +# +# About makesubdirsforWIN40driverlist() and makesubdirsforWIN40driverlist ()... +# ----------------------------------------------------------------------------- +# +# PRECONDITIONS: 1) These functions expect write access to the current directory +# 2) These functions expect to have the '\$nthost' variable set +# to the according value. +# 3) These functions expect to find the two files +# '\${nthost}/WIN40/\${nthost}-enumdrivers3list-WIN40.txt' and +# '\${nthost}/W32X86/\${nthost}-enumdrivers3list-NTx86.txt' to +# work on. +# +# WHAT IT DOES: These functions dissect the '$nthost/enumdrivers3list.txt' +# (using "sed", "cat", "awk" and "grep"). They split the input +# files up into individual files representing driver(version)s and +# create appropriate subdirectories for each driver and version +# underneath './\$nthost/'. They use the drivernames +# (including spaces) for the directory names. ("/" -- slashes -- +# in drivernames are converted to underscores). +# +# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" and +# consecutive ones may not have been run successfully. This +# is a precondition for the current function. +# +# HINT: You currently have defined: 'nthost'=\"$nthost\", which resolves above +# mentioned paths to: +# - '\${nthost}/WIN40/\${nthost}-enumdrivers3list-NTx86.txt' +# - '\${nthost}/W32X86/\${nthost}-enumdrivers3list-NTx86.txt' +# +################################################################################ +# ............PRESS \"q\" TO QUIT............" \ +|less +} + +# ----------------------------------------------------------------------------- + +function makesubdirsforWIN40driverlist() +{ +if stringinstring help "$@"; then +helpwithmakesubdirsforWIN40driverlist ; +else + cat ${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt \ + | grep "Driver Name:" \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | sort -f \ + | uniq \ + | tr / _ \ + | sed -e 's/$/\"/' \ + | sed -e 's/^/mkdir -p '"\"${nthost}"'\/WIN40\//' \ + | tee \ + ${nthost}/makesubdirsforWIN40driverlist.txt; + + sh -x ${nthost}/makesubdirsforWIN40driverlist.txt; + +# rm ${nthost}/makesubdirsforWIN40driverlist.txt; +fi +} + + +# ----------------------------------------------------------------------------- +# ---------- Make subdirs in ./${sambahost}/W32X86/ for each driver.... ------- +# ----------------------------------------------------------------------------- +# + +function makesubdirsforW32X86driverlist() +{ +if stringinstring help "$@"; then +helpwithvampiredrivers ; +else + cat ${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt \ + | grep "Driver Name:" \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | sort -f \ + | uniq \ + | tr / _ \ + | sed -e 's/$/\"/' \ + | sed -e 's/^ */mkdir '\""${nthost}"'\/W32X86\//' \ + | tee \ + ${nthost}/makesubdirsforW32X86driverlist.txt; + + sh -x ${nthost}/makesubdirsforW32X86driverlist.txt; + +# rm ${nthost}/makesubdirsforW32X86driverlist.txt; +fi +} + + + + +# ----------------------------------------------------------------------------- +# ----------- Split the WIN40 driverfile listing of each architecture --------- +# ------------------------ into individual drivers ---------------------------- +# ----------------------------------------------------------------------------- +# + +function helpwithmakesubdirsforWIN40driverlist() +{ +echo -e " \n\ +################################################################################ +# +# About splitWIN40fileintoindividualdriverfiles() and +# splitW32X86fileintoindividualdriverfiles()... +# --------------------------------------------------- +# +# PRECONDITIONS: 1) These functions expect write access to the current directory +# and its subdirs '\$nthost/*/'. +# 2) These functions expect to have the '\$nthost' variable set +# to the according value. +# 3) These functions expect to find the two files +# '\${nthost}/WIN40/\${nthost}-enumdrivers3list-WIN40.txt' and +# '\${nthost}/W32X86/\${nthost}-enumdrivers3list-NTx86.txt' to +# work on. +# +# WHAT IT DOES: 1) These functions create a directory for each printer driver. +# The directory name is identical to the driver name. +# 2) For each supported driver version (\"0\", \"2\" and \"3\") it +# creates a subdirectory as required underneath +# './\$nthost/'. +# 3) The directories use the drivernames (including spaces) for +# their names. ("/" - slashes - in drivernames are converted to +# underscores). +# 4) In each subdirectory they dissect the original +# '\$nthost/enumdrivers3list.txt' (using "sed", "cat", "awk" +# and "grep") and store that part describing the related driver +# (under the name \"driverfilesversion.txt\". +# 5) For each driver the files \"Drivername\", \"DriverPath\", +# \"Drivername\", \"Configfile\", \"Helpfile\", \"AllFiles\" and +# \"Dependentfilelist\" are stored in the according directory +# which hold contend that is used by other (downstream) +# functions. +# 6) It creates a file named \"AllFilesIAskFor\" which holds the +# case sensitive names of files it wanted to download. It also +# creates a file named \"AllFilesIGot\" which holds the case +# sensitive spelling of the downloaded files. (Due to +# Microsoft's ingenious file naming tradition, you may have +# asked for a \"PS5UI.DLL\" but gotten a \"ps5ui.dll\". +# 7) The 2 files from 6) will be later compared with the help of +# the \"sdiff\" utility to decide how to re-name the files so +# that the subsequent driver upload command's spelling +# convention is met. +# +# IF IT DOESN'T WORK: The function \"fetchenumdrivers3listfromNThost\" and +# consecutive ones may not have been run successfully. This +# is a precondition for the current function. +# +# HINT: You currently have defined: 'nthost'=\"$nthost\". +# +################################################################################ +# ............PRESS \"q\" TO QUIT............" \ +|less +} + +# ----------------------------------------------------------------------------- + +function splitWIN40fileintoindividualdriverfiles() +{ +if stringinstring help "$@"; then +helpwithmakesubdirsforWIN40driverlist ; +else + echo " " + echo " " + echo "--> Running now function splitWIN40fileintoindividualdriverfiles()..." + echo "=====================================================================" + + for i in ${nthost}/WIN40/*/; do + CWD1="$( pwd )" ; + cd "${i}" ; + echo " " + echo " " + echo " ###########################################################################################" + echo " " + echo " Next driver is \"$( basename "$( pwd)" )\"" + echo " " + echo " ###########################################################################################" + +##### echo "yes" | cp -f ../../../${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt . 2> /dev/null ; + ln -s -f ../${nthost}-enumdrivers3list-WIN40.txt ${nthost}-enumdrivers3list-WIN40.lnk ; + + tac ${nthost}-enumdrivers3list-WIN40.lnk \ + | sed -e '/'"$(basename "$(echo "$PWD")")"'/,/Version/ p' -n \ + | grep Version \ + | uniq \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print "mkdir \"" $1 "\"" }' \ + | tee mkversiondir.txt ; + + sh mkversiondir.txt 2> /dev/null ; + + cat ${nthost}-enumdrivers3list-WIN40.lnk \ + | sed -e '/\['"$(basename "$(echo "$PWD")")"'\]/,/Monitor/ w alldriverfiles.txt' -n ; + + for i in */; do + CWD2="$( pwd )" ; + cd "${i}"; + echo "yes" | cp ../alldriverfiles.txt . 2> /dev/null ; + + cat alldriverfiles.txt \ + | egrep '(\\'"$(basename "$( pwd )")"'\\|Driver Name)' \ + | tee driverfilesversion.txt ; + + Drivername=$( grep "Driver Name:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | sort -f \ + | uniq \ + | tee Drivername ) ; + + DriverPath=$( grep "Driver Path:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "WIN40" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${DriverPath}" \ + | tee DriverPath ; + + Datafile=$( grep "Datafile:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "WIN40" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${Datafile}" \ + | tee Datafile ; + + Configfile=$( grep "Configfile:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "WIN40" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${Configfile}" \ + | tee Configfile ; + + Helpfile=$( grep "Helpfile:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "WIN40" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${Helpfile}" \ + | tee Helpfile ; + + Dependentfilelist=$( grep "Dependentfiles:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "WIN40" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + + Dependentfiles=$( echo $Dependentfilelist \ + | sed -e 's/ /,/g ' ) ; + + echo "${Dependentfiles}" \ + | tee Dependentfiles + + AllFiles=$( echo ${Dependentfilelist}; echo ${Helpfile}; echo ${Configfile}; echo ${Datafile}; echo ${DriverPath} ); + + echo "${AllFiles}" \ + | sort -f \ + | uniq \ + | tee AllFiles ; + + for i in $( cat AllFiles ); do echo ${i}; done \ + | sort -f \ + | uniq \ + | tee AllFilesIAskFor ; + + cd "${CWD2}" 1> /dev/null ; + done + +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "adddriver \"${Architecture}\" \"${DriverName}:${DriverPath}:${Datafile}:${Configfile}:${Helpfile}:NULL:RAW:${Dependentfiles}\" ${Version}" \ ${smbhost} + +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setdriver \"${printername}\" \"${DriverName}\"" \ +# ${smbhost} +# +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (utilized by Kurt Pfeifle\'s set of \"Vampire Printerdrivers\" scripts from Linux)\"" \ +# ${smbhost} + + cd "${CWD1}" 1> /dev/null ; + done; +fi +} + + + + +# ----------------------------------------------------------------------------- +# ---------- Split the W32X86 driverfile listing of each architecture --------- +# ------------------------ into individual drivers ---------------------------- +# ----------------------------------------------------------------------------- +# + +function splitW32X86fileintoindividualdriverfiles() +{ +if stringinstring help "$@"; then +helpwithmakesubdirsforWIN40driverlist ; +else + echo " " + echo " " + echo "--> Running now function splitW32X86fileintoindividualdriverfiles()..." + echo "======================================================================" + + for i in ${nthost}/W32X86/*/; do + CWD1="$( pwd )" ; + cd "${i}" ; + echo " " + echo " " + echo " ###########################################################################################" + echo " " + echo " Next driver is \"$( basename "$( pwd)" )\"" + echo " " + echo " ###########################################################################################" + +###### echo "yes" | cp -f ../../../${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt . 2> /dev/null ; + ln -s -f ../${nthost}-enumdrivers3list-NTx86.txt ${nthost}-enumdrivers3list-NTx86.lnk ; + + tac ${nthost}-enumdrivers3list-NTx86.lnk \ + | sed -e '/'"$(basename "$(echo "$PWD")")"'/,/Version/ p' -n \ + | grep Version \ + | uniq \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print "mkdir \"" $1 "\"" }' \ + | tee mkversiondir.txt ; + + sh mkversiondir.txt 2> /dev/null ; + + cat ${nthost}-enumdrivers3list-NTx86.lnk \ + | sed -e '/\['"$(basename "$(echo "$PWD")")"'\]/,/Monitor/ w alldriverfiles.txt' -n ; + + for i in */; do + CWD2="$( pwd )" ; + cd "${i}"; + echo "yes" | cp ../alldriverfiles.txt . 2> /dev/null ; + + cat alldriverfiles.txt \ + | egrep '(\\'"$(basename "$( pwd )")"'\\|Driver Name)' \ + | tee driverfilesversion.txt ; + + Drivername=$( grep "Driver Name:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | sort -f \ + | uniq \ + | tee Drivername ) ; +# echo "${Drivername}" \ +# | tee Drivername ; + + + DriverPath=$( grep "Driver Path:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "W32X86" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${DriverPath}" \ + | tee DriverPath ; + + Datafile=$( grep "Datafile:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "W32X86" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${Datafile}" \ + | tee Datafile ; + + Configfile=$( grep "Configfile:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "W32X86" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${Configfile}" \ + | tee Configfile ; + + Helpfile=$( grep "Helpfile:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "W32X86" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + echo "${Helpfile}" \ + | tee Helpfile ; + + Dependentfilelist=$( grep "Dependentfiles:" driverfilesversion.txt \ + | awk -F "[" '{ print $2 }' \ + | awk -F "]" '{ print $1 }' \ + | awk -F "W32X86" '{ print $2 }' \ + | awk -F "\\" '{ print $3 }' \ + | sort -f \ + | uniq ) ; + + Dependentfiles=$( echo $Dependentfilelist \ + | sed -e 's/ /,/g ' ) ; + + echo "${Dependentfiles}" \ + | tee Dependentfiles + + AllFiles=$( echo ${Dependentfilelist}; echo ${Helpfile}; echo ${Configfile}; echo ${Datafile}; echo ${DriverPath} ) ; + + echo "${AllFiles}" \ + | sort -f \ + | uniq \ + | tee AllFiles ; + + for i in $( cat AllFiles ); do echo ${i}; done \ + | sort -f \ + | uniq \ + | tee AllFilesIAskFor ; + + cd "${CWD2}" 1> /dev/null ; + done + +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "adddriver \"${Architecture}\" \"${DriverName}:${DriverPath}:${Datafile}:${Configfile}:${Helpfile}:NULL:RAW:${Dependentfiles}\" ${Version}" \ ${smbhost} + +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setdriver \"${printername}\" \"${DriverName}\"" \ +# ${smbhost} +# +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (utilized by Kurt Pfeifle\'s set of \"Vampire Printerdrivers\" scripts from Linux)\"" \ +# ${smbhost} + + cd "${CWD1}" 1> /dev/null ; + done; +fi +} + + + +# ----------------------------------------------------------------------------- +# ------------------ First download the driverfiles........... ---------------- +# ----------------------------------------------------------------------------- +# + +function helpwithfetchallW32X86driverfiles() +{ +echo -e " \n\ +################################################################################ +# +# About fetchallW32X86driverfiles()... +# ------------------------------------ +# +# PRECONDITIONS: 1) This function expects to have the \'\$nthost\' variable set +# to the according value. +# 2) This function expects to find files \"AllFiles\", +# \"AllFilesIAskFor\", and \"AllFilesIGot\" in the directories +# \'\${nthost}////\'. +# +# WHAT IT DOES: These functions use \"smbclient\" to connect to the NT print +# server \"\$nthost\" and download the printer driver files from +# there. To achieve that in an orderly fashion, the previously +# created subdirectories (named like the drivers to fetch) are +# visited in turn and the related files are downloaded for each +# driver/directory. +# +# IF IT DOESN'T WORK: The function \"fetchenumdrivers3listfromNThost\" and +# consecutive ones may not have been run successfully. This +# is a precondition for the current function. +# +# HINT: The current values: 'nthost'=\"$nthost\" +# 'ntprinteradmin'=\"$ntprinteradmin\" +# 'ntadminpasswd'= +# +################################################################################" +} + +# ----------------------------------------------------------------------------- + +function fetchallW32X86driverfiles() +{ +if stringinstring help "$@"; then +helpwithfetchallW32X86driverfiles ; +else + echo " " + echo " " + echo "--> Running now function fetchallW32X86driverfiles()...." + echo "========================================================" + + CURRENTWD=${PWD} ; + for i in ${nthost}/W32X86/*/*/ ; do \ + cd "${i}"; + + driverversion="$(basename "$(echo "$PWD")")" ; + echo "$(basename "$(echo "$PWD")")" > driverversion ; + + AllFiles=$( cat AllFiles ) ; + + [ -d TheFiles ] || mkdir TheFiles; + + cd TheFiles; + + echo " " + echo "====================================================" + echo "Downloading files now to ${PWD}...."; + echo "====================================================" + echo " " + + # Fetch the Driver files from the Windoze box (printserver) + smbclient -U"${ntprinteradmin}%${ntadminpasswd}" -d 2 \ + //${nthost}/print\$ -c \ + "cd W32X86\\${driverversion};prompt;mget ${AllFiles}" + + ls -1 \ + | sort -f \ + | uniq \ + | tee ../AllFilesIGot ; + + cd ${CURRENTWD} ; + + done ; +fi +} + + +# ----------------------------------------------------------------------------- +# -------------- Now upload the driverfiles and activate them! ---------------- +# Upload files into root "Architecture" directory of Samba'a [print$] share... +# ----------------------------------------------------------------------------- +# + +function helpwithuploadallW32X86drivers() +{ +echo -e " \n\ +################################################################################ +# +# About uploadallW32X86drivers()... +# --------------------------------- +# +# PRECONDITIONS: 1) This function expects to have the '\$nthost', +# '\$ntprinteradmin' and '\$ntadminpasswd' variables set to +# according values. +# 2) This function expects to find the files \"AllFiles\", +# \"AllFilesIGot\" and \"AllFilesIAskFor\" in the +# \"\${nthost}/W32X86//TheFiles\" +# subdirectory. +# +# WHAT IT DOES: This function uses "smbclient" to connect to the new Samba print +# server "\$nthost" and upload the printer driver files into the +# \"[print\$]\" share there. To achieve that in orderly fashion, +# the previously created subdirectories (named like the drivers +# fetched previously from \$smbhost) are visited in turn and the +# related files are uploaded for each driver/directory. For this +# to really succeed, the files \"AllFilesIGot\" and \"AllFilesIAskFor\" +# are compared with the help of the \"sdiff\" utility to decide +# how to re-name the mis-matching filenams, so that the used +# driver upload command's spelling convention is met.... +# +# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" and +# consecutive ones may not have been run successfully. This +# is a precondition for the current function. +# +# HINT: The current values: 'nthost'=\"$nthost\" +# 'ntprinteradmin'=\"$ntprinteradmin\" +# 'ntadminpasswd'= +# +################################################################################ +# ............PRESS \"q\" TO QUIT............" \ +|less +} + +# ----------------------------------------------------------------------------- + +function uploadallW32X86drivers() +{ +if stringinstring help "$@"; then +helpwithuploadallW32X86drivers ; +else + echo " " + echo " " + echo "--> Running now function uploadallW32X86drivers()...." + echo "=====================================================" + + for i in ${nthost}/W32X86/*/*/; do \ + CURRENTWD=${PWD} ; + cd "${i}" ; + # we are now in [..]/W32X86/[drvrname]/[2|3]/ + + driverversion="$(basename "$(echo "$PWD")")" ; + + echo "$(basename "$(echo "$PWD")")" > driverversion ; + + cd TheFiles ; + # we are now in [..]/W32X86/[drvrname]/[2|3]/TheFiles + echo " " + echo "====================================================" + echo "Uploading driverfiles now from ${PWD}...."; + echo "====================================================" + echo " " + set -x ; + + smbclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \ + //${smbhost}/print\$ \ + -c "mkdir W32X86;cd W32X86;prompt;mput $( cat ../AllFilesIGot )"; + + cd .. ; + # we are now in [..]/W32X86/[drvrname]/[2|3]/ + +# Now tell Samba that those files are *printerdriver* files.... +# The "adddriver" command will move them to the "0" subdir and create or +# update the associated *.tdb files (faking the MS Windows Registry on Samba) + Drivername="$( cat Drivername )" + + set -x ; + [ x"$( cat Dependentfiles)" == x"" ] && echo NULL > Dependentfiles; + + sdiff -s AllFilesIGot AllFilesIAskFor \ + | tee sdiff-of-Requested-and-Received.txt ; + + [ -s sdiff-of-Requested-and-Received.txt ] \ + || rm -f sdiff-of-Requested-and-Received.txt \ + && cat sdiff-of-Requested-and-Received.txt > ../sdiff-of-Requested-and-Received.txt ; + + cat sdiff-of-Requested-and-Received.txt \ + | sed -e 's/^/mv /' \ + | sed -e 's/ *|/ /' \ + | tee rename-Received-to-Requested-case.txt ; + + sh -x rename-Received-to-Requested-case.txt ; + + mv rename-Received-to-Requested-case.txt rename-Received-to-Requested-case.done ; + + echo " ################ B E G I N DEBUGGING STATEMENT ############" + echo "rpcclient -U\"${smbprinteradmin}%${smbadminpasswd}\" -d 2 \ + -c \'adddriver \"Windows NT x86\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \ + ${smbhost} \' ; + echo " ################ E N D DEBUGGING STATEMENT ################" + + rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \ + -c "adddriver \"Windows NT x86\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \ + ${smbhost} ; + + set +x ; + + cd ${CURRENTWD} ; + # we are now back to where we started + done; + set +x ; +fi +} + +# Now tell Samba which printqueue this driver is associated with.... +# The "setdriver" command will do just that and create or +# update the associated *.tdb files (faking the MS Windows Registry on Samba) +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setdriver \"${printername}\" \"${DriverName}\"" \ +# ${smbhost} +# -- NOT YET IMPLEMENTED IN THIS SCRIPT --- +# + +# Now set a nice printer comment and let the world know what we've done +# (or not.... ;-) +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (rpcclient commandline from Linux)\"" \ +# ${smbhost} +# -- NOT YET IMPLEMENTED IN THIS SCRIPT --- +# + + +# ----------------------------------------------------------------------------- +# ------------------ First download the driverfiles........... ---------------- +# ----------------------------------------------------------------------------- +# + +function helpwithfetchallWIN40driverfiles() +{ +echo -e " \n\ +################################################################################ +# +# About fetchallWIN40driverfiles()... +# ----------------------------------- +# +# PRECONDITIONS: 1) This function expects to have the \$nthost variable set to +# the according value. +# 2) This function expects to find the \"AllFiles\" file in +# \"\${nthost}/WIN40//TheFiles\". +# +# WHAT IT DOES: These functions use "smbclient" to connect to the NT print server +# "\$nthost" and download the printer driver files from there. To +# achieve that in an orderly fashion, the previously created +# subdirectories (named like the drivers to fetch) are visited in +# turn and the related files are downloaded for each +# driver/directory. +# +# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" and +# consecutive ones may not have been run successfully. This +# is a precondition for the current function. +# +# HINT: The current values: 'nthost'=\"$nthost\" +# 'ntprinteradmin'=\"$ntprinteradmin\" +# 'ntadminpasswd'= +# +################################################################################ +# ............PRESS \"q\" TO QUIT............" \ +|less +} + +# ----------------------------------------------------------------------------- + +function fetchallWIN40driverfiles() +{ +if stringinstring help "$@"; then +helpwithfetchallWIN40driverfiles ; +else + echo " " + echo " " + echo "--> Running now function fetchallWIN40driverfiles()...." + echo "=======================================================" + + CURRENTWD=${PWD} ; + + for i in ${nthost}/WIN40/*/*/; do \ + cd "${i}"; + + driverversion="$(basename "$(echo "$PWD")")" ; + echo "$(basename "$(echo "$PWD")")" > driverversion ; + + AllFiles=$( cat AllFiles ) ; + + [ -d TheFiles ] || mkdir TheFiles; + + cd TheFiles; + + echo " " + echo "====================================================" + echo "Downloading files now to ${PWD}...."; + echo "====================================================" + echo " " + + # Fetch the Driver files from the Windoze box (printserver) + smbclient -U"${ntprinteradmin}%${ntadminpasswd}" -d 2 \ + //${nthost}/print\$ -c \ + "cd WIN40\\${driverversion};prompt;mget ${AllFiles}" ; + + ls -1 \ + | sort -f \ + | uniq \ + | tee ../AllFilesIGot ; + + cd ${CURRENTWD} ; + + done ; +fi +} + + +# ----------------------------------------------------------------------------- +# -------------- Now upload the driverfiles and activate them! ---------------- +# Upload files into root "Architecture" directory of Samba'a [print$] share... +# ----------------------------------------------------------------------------- +# + +function helpwithuploadallWIN40drivers() +{ +echo -e " \n\ +################################################################################ +# +# About uploadallWIN40drivers()... +# -------------------------------- +# +# PRECONDITIONS: 1) This function expects to have '\$smbhost', '\$smbprinteradmin' +# and '\$smbadminpasswd' variables set to according values. +# 2) This function expects to find \"AllFiles\", \"AllFilesIGot\" +# and \"AllFilesIAskFor\" in the subdirectory +# \"\${nthost}/WINI40///TheFiles\". +# +# WHAT IT DOES: These function uses \"smbclient\" to connect to the new Samba +# print server "\$nthost" and upload the printer driver files into +# the \"[print\$]\" share there. +# To achieve that in an orderly fashion, the previously created +# subdirectories (named like the drivers fetched previously from +# \$smbhost) are visited in turn and the related files are +# uploaded for each driver/directory. +# For this to really succeed, \"AllFilesIGot\" and \"AllFilesIAskFor\" +# are compared with the help of the \"sdiff\" utility to decide +# how to re-name the mis-matching filenams, so that the used +# driver upload command's spelling convention is met.... +# +# IF IT DOESN'T WORK: The function \"fetchenumdrivers3listfromNThost\" and +# consecutive ones may not have been run successfully. This +# is a precondition for the current function. +# +# HINT: The current values: 'nthost'=\"$nthost\" +# 'ntprinteradmin'=\"$ntprinteradmin\" +# 'ntadminpasswd'= +# +################################################################################ +# ............PRESS \"q\" TO QUIT............" \ +|less +} +function uploadallWIN40drivers() +{ +if stringinstring help "$@"; then +helpwithuploadallWIN40drivers ; +else + echo " " + echo " " + echo "--> Running now function uploadallWIN40drivers()...." + echo "====================================================" + + for i in ${nthost}/WIN40/*/*/; do \ + CURRENTWD=${PWD} ; + cd "${i}" ; + # we are now in [..]/WIN40/[drvrname]/[0]/ + + driverversion="$(basename "$(echo "$PWD")")" ; + + echo "$(basename "$(echo "$PWD")")" > driverversion ; + + cd TheFiles ; + # we are now in [..]/WIN40/[drvrname]/[0]/TheFiles + echo " " + echo "====================================================" + echo "Uploading driverfiles now from ${PWD}...."; + echo "====================================================" + echo " " + set -x ; + + smbclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \ + //${smbhost}/print\$ \ + -c "mkdir WIN40;cd WIN40;prompt;mput $( cat ../AllFilesIGot )"; + + cd .. ; + # we are now in [..]/WIN40/[drvrname]/[0]/ + +# Now tell Samba that those files are *printerdriver* files.... +# The "adddriver" command will move them to the "0" subdir and create or +# update the associated *.tdb files (faking the MS Windows Registry on Samba) + Drivername="$( cat Drivername )" + + set -x ; + [ x"$( cat Dependentfiles)" == x"" ] && echo NULL > Dependentfiles; + + sdiff -s AllFilesIGot AllFilesIAskFor \ + | tee sdiff-of-Requested-and-Received.txt ; + + [ -s sdiff-of-Requested-and-Received.txt ] \ + || rm -f sdiff-of-Requested-and-Received.txt \ + && cat sdiff-of-Requested-and-Received.txt > ../sdiff-of-Requested-and-Received.txt ; + + cat sdiff-of-Requested-and-Received.txt \ + | sed -e 's/^/mv /' \ + | sed -e 's/ *|/ /' \ + | tee rename-Received-to-Requested-case.txt ; + + sh -x rename-Received-to-Requested-case.txt ; + + mv rename-Received-to-Requested-case.txt rename-Received-to-Requested-case.done ; + + echo " ################ DEBUGGING STATEMENT " + echo "rpcclient -U\"${smbprinteradmin}%${smbadminpasswd}\" -d 2 \ + -c \'adddriver \"Windows NT x86\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \ + ${smbhost}\' ; + echo " ################ DEBUGGING STATEMENT " + + rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \ + -c "adddriver \"Windows 4.0\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \ + ${smbhost} ; + + set +x ; + cd ${CURRENTWD} ; + # we are now back to where we started + done; +fi +} + +# Now tell Samba which printqueue this driver is associated with.... +# The "setdriver" command will do just that and create or +# update the associated *.tdb files (faking the MS Windows Registry on Samba) +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setdriver \"${printername}\" \"${DriverName}\"" \ +# ${smbhost} +# -- NOT YET IMPLEMENTED IN THIS SCRIPT --- +# +# Now set a nice printer comment and let the world know what we've done +# (or not.... ;-) +# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \ +# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (rpcclient commandline from Linux)\"" \ +# ${smbhost} +# -- NOT YET IMPLEMENTED IN THIS SCRIPT --- +# + + +#source ${0} ; + +enumallfunctions; diff --git a/examples/printing/prtpub.c b/examples/printing/prtpub.c new file mode 100644 index 0000000..2839940 --- /dev/null +++ b/examples/printing/prtpub.c @@ -0,0 +1,237 @@ +/* + * Set printer capabilities in DsDriver Keys on remote printer + * Copyright (C) Jim McDonough 2002. + * + * 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 3 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, see . + */ + +/* This needs to be defined for certain compilers */ +#define WINVER 0x0500 + +#include +#include +#include + +#define SAMBA_PORT _T("Samba") + +TCHAR *PrintLastError(void) +{ + static TCHAR msgtxt[1024*sizeof(TCHAR)]; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, + NULL, GetLastError(), + 0, msgtxt, 0, NULL); + + return msgtxt; +} + +void map_orientation(HANDLE ph, TCHAR *printer, TCHAR *port) +{ + DWORD rot; + TCHAR portrait_only[] = _T("PORTRAIT\0"); + TCHAR both[] = _T("LANDSCAPE\0PORTRAIT\0"); + + /* orentation of 90 or 270 indicates landscape supported, 0 means it isn't */ + rot = DeviceCapabilities(printer, port, DC_BINNAMES, NULL, NULL); + + printf("printOrientationsSupported:\n"); + + if (rot) { + printf("\tPORTRAIT\n\tLANDSCAPE\n"); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printOrientationsSupported"), REG_MULTI_SZ, + both, sizeof(both)); + } else { + printf("\tPORTRAIT\n"); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printOrientationsSupported"), REG_MULTI_SZ, + portrait_only, sizeof(portrait_only)); + } +} + +void map_resolution(HANDLE ph, TCHAR *printer, TCHAR *port) +{ + DWORD num, *res, maxres = 0, i; + + num = DeviceCapabilities(printer, port, DC_ENUMRESOLUTIONS, NULL, NULL); + if ((DWORD) -1 == num) + return; + res = malloc(num*2*sizeof(DWORD)); + num = DeviceCapabilities(printer, port, DC_ENUMRESOLUTIONS, (BYTE *) res, NULL); + for (i=0; i < num*2; i++) { + maxres = (res[i] > maxres) ? res[i] : maxres; + } + printf("printMaxResolutionSupported: %d\n", maxres); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMaxResolutionSupported"), REG_DWORD, + (BYTE *) &maxres, sizeof(maxres)); +} + +void map_extents(HANDLE ph, TCHAR *printer, TCHAR *port) +{ + DWORD extentval, xval, yval; + + extentval = DeviceCapabilities(printer, port, DC_MINEXTENT, NULL, NULL); + xval = (DWORD) (LOWORD(extentval)); + yval = (DWORD) (HIWORD(extentval)); + printf("printMinXExtent: %d\n", xval); + printf("printMinYExtent: %d\n", yval); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMinXExtent"), REG_DWORD, (BYTE *) &xval, sizeof(xval)); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMinYExtent"), REG_DWORD, (BYTE *) &yval, sizeof(yval)); + extentval = DeviceCapabilities(printer, port, DC_MAXEXTENT, NULL, NULL); + xval = (DWORD) (LOWORD(extentval)); + yval = (DWORD) (HIWORD(extentval)); + printf("printMaxXExtent: %d\n", xval); + printf("printMaxYExtent: %d\n", yval); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMaxXExtent"), REG_DWORD, (BYTE *) &xval, sizeof(xval)); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMaxYExtent"), REG_DWORD, (BYTE *) &yval, sizeof(yval)); +} + +void map_printrateunit(HANDLE ph, TCHAR *printer, TCHAR *port) +{ + DWORD unit; + TCHAR ppm[] = _T("PagesPerMinute"); + TCHAR ipm[] = _T("InchesPerMinute"); + TCHAR lpm[] = _T("LinesPerMinute"); + TCHAR cps[] = _T("CharactersPerSecond"); + + unit = DeviceCapabilities(printer, port, DC_PRINTRATEUNIT, NULL, NULL); + switch(unit) { + case PRINTRATEUNIT_PPM: + printf("printRateUnit: %s\n", ppm); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, ppm, sizeof(ppm)); + break; + case PRINTRATEUNIT_IPM: + printf("printRateUnit: %s\n", ipm); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, ipm, sizeof(ipm)); + break; + case PRINTRATEUNIT_LPM: + printf("printRateUnit: %s\n", lpm); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, lpm, sizeof(lpm)); + break; + case PRINTRATEUNIT_CPS: + printf("printRateUnit: %s\n", cps); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, cps, sizeof(cps)); + break; + default: + printf("printRateUnit: unknown value %d\n", unit); + } +} + +void map_generic_boolean(HANDLE ph, TCHAR *printer, TCHAR *port, WORD cap, TCHAR *key) +{ + BYTE boolval; + /* DeviceCapabilities doesn't always return 1 for true...just nonzero */ + boolval = (BYTE) (DeviceCapabilities(printer, port, cap, NULL, NULL) ? 1 : 0); + printf("%s: %s\n", key, boolval ? "TRUE" : "FALSE"); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, key, REG_BINARY, &boolval, sizeof(boolval)); +} + +void map_generic_dword(HANDLE ph, TCHAR *printer, TCHAR *port, WORD cap, TCHAR *key) +{ + DWORD dword; + + dword = DeviceCapabilities(printer, port, cap, NULL, NULL); + if ((DWORD) -1 == dword) + return; + + printf("%s: %d\n", key, dword); + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, key, REG_DWORD, (BYTE *) &dword, sizeof(dword)); +} + +void map_generic_multi_sz(HANDLE ph, TCHAR *printer, TCHAR *port, WORD cap, TCHAR *key, int size) +{ + TCHAR *strings_in; + TCHAR *strings_out, *strings_cur; + DWORD num_items, i; + + num_items = DeviceCapabilities(printer, port, cap, NULL, NULL); + if ((DWORD) -1 == num_items) + return; + strings_in = malloc(num_items * size); + strings_out = calloc(num_items, size); + num_items = DeviceCapabilities(printer, port, cap, strings_in, NULL); + printf("%s:\n", key); + for (i=0, strings_cur = strings_out; i < num_items; i++) { + _tcsncpy(strings_cur, &strings_in[i*size], size); + printf("\t%s\n", strings_cur); + strings_cur += _tcslen(strings_cur) + 1; + } + + SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, key, REG_MULTI_SZ, strings_out, + (strings_cur - strings_out + 1) * sizeof(TCHAR)); + + free(strings_in); + free(strings_out); +} + +int main(int argc, char *argv[]) +{ + HANDLE ph; + BYTE *driver_info; + DWORD needed; + TCHAR *printer; + TCHAR *port = SAMBA_PORT; + PRINTER_DEFAULTS admin_access = {NULL, NULL, PRINTER_ACCESS_ADMINISTER}; + PRINTER_INFO_7 publish = {NULL, DSPRINT_PUBLISH}; + + if (argc < 2) { + printf("Usage: %s \n", argv[0]); + return -1; + } + + printer = argv[1]; + + if (!(OpenPrinter(printer, &ph, &admin_access))) { + printf("OpenPrinter failed, error = %s\n", PrintLastError()); + return -1; + } + + GetPrinterDriver(ph, NULL, 1, NULL, 0, &needed); + if (!needed) { + printf("GetPrinterDriver failed, error = %s\n", PrintLastError()); + ClosePrinter(ph); + return -1; + } + driver_info = malloc(needed); + if (!(GetPrinterDriver(ph, NULL, 1, driver_info, needed, &needed))) { + printf("GetPrinterDriver failed, error = %s\n", PrintLastError()); + ClosePrinter(ph); + return -1; + } + + map_generic_multi_sz(ph, printer, port, DC_BINNAMES, _T("printBinNames"), 24); + map_generic_boolean(ph, printer, port, DC_COLLATE, _T("printCollate")); + map_generic_dword(ph, printer, port, DC_COPIES, _T("printMaxCopies")); + map_generic_dword(ph, printer, port, DC_DRIVER, _T("driverVersion")); + map_generic_boolean(ph, printer, port, DC_DUPLEX, _T("printDuplexSupported")); + map_extents(ph, printer, port); + map_resolution(ph, printer, port); + map_orientation(ph, printer, port); + map_generic_multi_sz(ph, printer, port, DC_PAPERNAMES, _T("printMediaSupported"), 64); +#if (WINVER >= 0x0500) + map_generic_boolean(ph, printer, port, DC_COLORDEVICE, _T("printColor")); + map_generic_multi_sz(ph, printer, port, DC_PERSONALITY, _T("printLanguage"), 64); + map_generic_multi_sz(ph, printer, port, DC_MEDIAREADY, _T("printMediaReady"),64); + map_generic_dword(ph, printer, port, DC_PRINTERMEM, _T("printMemory")); + map_generic_dword(ph, printer, port, DC_PRINTRATE, _T("printRate")); + map_printrateunit(ph, printer, port); +#ifdef DC_STAPLE + map_generic_boolean(ph, printer, port, DC_STAPLE, _T("printStaplingSupported")); +#endif +#ifdef DC_PRINTRATEPPM + map_generic_dword(ph, printer, port, DC_PRINTRATEPPM, _T("printPagesPerMinute")); +#endif +#endif + SetPrinter(ph, 7, (BYTE *) &publish, 0); + ClosePrinter(ph); + return 0; +} diff --git a/examples/printing/readme.prtpub b/examples/printing/readme.prtpub new file mode 100644 index 0000000..319ce60 --- /dev/null +++ b/examples/printing/readme.prtpub @@ -0,0 +1,12 @@ +prtpub.c contains a program which, when compiled with Visual C, can +download a driver for a printer, query the capabilities of the driver, +then write back the DsDriver keys necessary to publish all the fields +of a printer in the directory. After writing back the fields, it issues +a SetPrinter with info level 7, telling the server to publish the +printer. + +It also writes the fields to stdout. + +In order to be distributed, it should be compiled using DLLs for C runtime. + +The program takes the UNC name of a printer as the only argument. diff --git a/examples/printing/smbprint.sysv b/examples/printing/smbprint.sysv new file mode 100644 index 0000000..11fea21 --- /dev/null +++ b/examples/printing/smbprint.sysv @@ -0,0 +1,52 @@ +#!/bin/sh +# +# @(#) smbprint.sysv version 1.0 Ross Wakelin +# +# Version 1.0 13 January 1995 +# modified from the original smbprint (bsd) script +# +# this script is a System 5 printer interface script. It +# uses the smbclient program to print the file to the specified smb-based +# server and service. +# +# To add this to your lp system, copy this file into your samba directory +# (the example here is /opt/samba), modify the server and service variables +# and then execute the following command (as root) +# +# lpadmin -punixprintername -v/dev/null -i/opt/samba/smbprint +# +# where unixprintername is the name that the printer will be known as +# on your unix box. +# +# the script smbprint will be copied into your printer administration +# directory (/usr/lib/lp or /etc/lp) as a new interface +# (interface/unixprintername) +# Then you have to enable unixprintername and accept unixprintername +# +# This script will then be called by the lp service to print the files +# This script will have 6 or more parameters passed to it by the lp service. +# The first five will contain details of the print job, who queued it etc, +# while parameters 6 onwards are a list of files to print. We just +# cat these at the samba client. +# +# Set these to the server and service you wish to print to +# In this example I have a WfWg PC called "lapland" that has a printer +# exported called "printer" with no password. +# +# clear out the unwanted parameters +shift;shift;shift;shift;shift +# now the argument list is just the files to print + +server=admin +service=hplj2 +password="" + +( +# NOTE You may wish to add the line `echo translate' if you want automatic +# CR/LF translation when printing. + echo translate + echo "print -" + cat $* +) | /opt/samba/smbclient "\\\\$server\\$service" $password -N > /dev/null +exit $? + -- cgit v1.2.3