|Building Samba Printing Packages|
Now that most of the options have been described, it is time to show some examples of how packages can be constructed. These examples will proceed from easy demonstrations where no override options are needed to examples where override options are required due to mkprintpkg.pl being unable to infer one of the pieces of information described in the previous section.
The first example is to build a package for the HP 4050 printer that will provide files for both Windows 95/98 and Windows NT. As such, the first step was to go to www.hp.com and download two driver distributions. The files in question are lj582en.exe and lj586en.exe. Both are self-extracting zip files and there will be no need to unpack them into temporary directories before invoking mkprintpkg.pl. We now need to decide upon the name and version for this Samba printing package. Since the package will be for HP 4050 printers, it makes sense to choose "hp4050" as the package name and 1.00 for the version number. We can now invoke mkprintpkg.pl as follows:
$ mkprintpkg.pl --name="hp4050" --version=1.00 --display-name="HP 4050" lj582en.exe lj586en.exe Package: hp4050-1.00.tar.gz Display Name: HP 4050 Using archive lj582en.exe for files. Using file hpbfdf1.inf for INF information. Architecture: Windows NT X86 (detected from INF) Manufacturer: HP (detected from INF) Model: HP LaserJet 4050 Series PCL 6 (detected from INF) Using archive lj586en.exe for files. Using file HP4050P6.INF for INF information. Architecture: Windows 95/98 (detected from INF) Manufacturer: HP (detected from INF) Model: HP LaserJet 4050 Series PCL 6 (detected from INF) $
As you can see from this example, the architecture, INF file, manufacturer, and model were all detected from the archives without any intervention by the user. The resulting output for the package is the file hp4050-1.00.tar.gz. This file can be placed on a Samba printing package retrieval server or moved to a machine with Samba for final installation.
The second example is bit more advanced since it will require two override options because two pieces of information will not be inferred by mkprintpkg.pl. We will build a printing package containing the Windows 95/98 drivers for a Canon BJC-1000 printer. In preparation, the self-extracting ZIP file BJV631.EXE was downloaded from the Canon Web site. The name of the package will be "bjc1000" and the version number will be 0.0.1. The display name will be "Canon BJC-1000". For a first try, we can just try invoking mkprintpkg.pl in a similar manner to what we did for the HP 4050 drivers:
$ mkprintpkg.pl --name="bjc1000" --version=0.0.1 --display-name "BJC 1000" BJV631.EXE Package: bjc1000-0.0.1.tar.gz Display Name: BJC 1000 Using archive BJV631.EXE for files. ERROR: Unable to infer which INF file to use. ERROR: Use the -i option with one of the following files: BJUSBPRN.INF CJOEM95.INF $
However, you will notice that this first try did not work since there was more than one INF file. The CJOEM95.INF has a name that sounds like it is the main INF file so we will try specifying that file using the -i override option. All override options must be in front of the archive or temporary directory that they apply to. We can now try a second attempt at building the Canon BJC-1000 package:
$ mkprintpkg.pl --name="bjc1000" --version=0.0.1 --display-name "BJC 1000" -i CJOEM95.INF BJV631.EXE Package: bjc1000-0.0.1.tar.gz Display Name: BJC 1000 Using archive BJV631.EXE for files. Architecture: Windows 95/98 (detected from INF) Manufacturer: Canon (detected from INF) ERROR: Unable to infer which model to use. ERROR: Use the -d option to specify one of the following:. "Canon BJC-6000" "Canon BJC-6100" "Canon BJC-8000" "Canon BJC-6200" "Canon BJC-8200" "Canon BJC-8500" "Canon BJC-85" "Canon BJC-1000" "Canon BJC-7000 Series" "Canon BJC-2000" "Canon BJC-2100" "Canon LR1" "Canon BJC-3000" $
This second attempt to build the package has failed because the INF file contains more than one model name under the "Canon" manufacturer heading. Since we want to build a printing package for the BJC-1000 printer, it makes sense to use the "Canon BJC-1000" string in the override option. Thus, we come to the third successful try:
$ mkprintpkg.pl --name="bjc1000" --version=0.0.1 --display-name "BJC 1000" -i CJOEM95.INF -d "Canon BJC-1000" BJV631.EXE Package: bjc1000-0.0.1.tar.gz Display Name: BJC 1000 Using archive BJV631.EXE for files. Architecture: Windows 95/98 (detected from INF) Manufacturer: Canon (detected from INF) Model: Canon BJC-1000 $
Both of the previous two examples have only dealt with creating packages from vendor archives. For this next example, it will be instructive to actually unpack a vendor archive into its own temporary directory before invoking mkprintpkg.pl. For this example, we will again use the printer drivers downloaded for the HP 4050. When unpacking the archive, you should first obtain a list of files in it to see how it will unpack:
$ unzip -l lj582en.exe Archive: lj582en.exe Length Date Time Name -------- ---- ---- ---- 45056 11-17-99 16:38 hpbafd32.dll 10512 11-17-99 16:38 hpbfdf0.dll 94480 11-17-99 16:38 hpbfdf1.dll 51685 11-17-99 16:38 hpbfdf1.hlp 2688 11-17-99 16:38 hpbfdf1.inf 909072 11-17-99 16:38 hpbfdf2.dll 736528 11-17-99 16:38 hpbfdf3.dll 279824 11-17-99 16:38 hpbfdf5.dll 68873 11-17-99 16:38 hpbfdf5.pmd 152336 11-17-99 16:38 hpbfdf6.dll 99328 11-17-99 16:38 hpbftm32.dll 58368 12-04-98 17:49 hpdcmon.dll 6020 10-07-96 15:53 HPLicEN.txt 459264 11-17-99 16:38 mtl70um.dll -------- ------- 2974034 14 files $
From this file listing, we can see that all of the files will unpack into a single subdirectory. This is the situation that we want since mkprintpkg.pl expects all of the files from the vendor archive to be in the same directory. As we will see later, some vendor's archives have subdirectories. There is no common naming convention so it is easier to require that you, the package builder, unpack the vendor archives into a common subdirectory then have code to try and guess which subdirectory a particular file is stored in. Next, we will make a temporary subdirectory and unpack the files there. mkprintpkg.pl can then be invoked with the temporary directory instead of an archive name and the Samba printing package will still be created as in the first example.
$ mkdir /tmp/unpacked-archive $ unzip lj582en.exe -d /tmp/unpacked-archive/ Archive: lj582en.exe inflating: /tmp/unpacked-archive/hpbafd32.dll inflating: /tmp/unpacked-archive/hpbfdf0.dll inflating: /tmp/unpacked-archive/hpbfdf1.dll inflating: /tmp/unpacked-archive/hpbfdf1.hlp inflating: /tmp/unpacked-archive/hpbfdf1.inf inflating: /tmp/unpacked-archive/hpbfdf2.dll inflating: /tmp/unpacked-archive/hpbfdf3.dll inflating: /tmp/unpacked-archive/hpbfdf5.dll inflating: /tmp/unpacked-archive/hpbfdf5.pmd inflating: /tmp/unpacked-archive/hpbfdf6.dll inflating: /tmp/unpacked-archive/hpbftm32.dll inflating: /tmp/unpacked-archive/hpdcmon.dll inflating: /tmp/unpacked-archive/HPLicEN.txt inflating: /tmp/unpacked-archive/mtl70um.dll $ mkprintpkg.pl --name="hp4050" --version=1.00 --display-name="HP 4050" /tmp/unpacked-archive lj586en.exe Package: hp4050-1.00.tar.gz Display Name: HP 4050 Location: /tmp/unpacked-archive Using file hpbfdf1.inf for INF information. Architecture: Windows NT X86 (detected from INF) Manufacturer: HP (detected from INF) Model: HP LaserJet 4050 Series PCL 6 (detected from INF) Using archive lj586en.exe for files. Using file HP4050P6.INF for INF information. Architecture: Windows 95/98 (detected from INF) Manufacturer: HP (detected from INF) Model: HP LaserJet 4050 Series PCL 6 (detected from INF) $
As you can see, we can combine both an unpacked work directory and an archive into the same command and end up with the same result as just passing both archives.
The next example will provide a case where the vendor archive does not unpack neatly into a single directory. If we examine the lj586en.exe self-extracting ZIP file from the previous example, we obtain the following list of files:
[tdyas@lexicon driver-downloads]$ unzip -l lj586en.exe Archive: lj586en.exe Length Date Time Name -------- ---- ---- ---- 0 07-13-99 11:21 DISK1/ 4956 05-06-99 10:20 DISK1/HP4050P6.INF 4469 12-16-98 10:34 DISK1/HPBPST.HL_ 60105 12-16-98 10:58 DISK1/HPBST16.DL_ 31000 12-04-98 18:28 DISK1/HPDCMON.DL_ 19634 09-15-98 15:17 DISK1/HPEXPAND.DL_ 13812 12-04-98 18:31 DISK1/HPNRA.EX_ 12268 11-24-98 17:01 DISK1/HPSETUP.HL_ 15069 12-04-98 18:31 DISK1/HPTDPI.TD_ 29372 12-04-98 18:30 DISK1/HPTDS.DL_ 33867 03-29-99 14:22 DISK1/HPUNINST.EX_ 5876 12-24-98 15:04 DISK1/LICENSE.TXT 63616 12-11-98 19:16 DISK1/READ4050.WRI 531 07-13-99 11:22 DISK1/README.PER 195 09-15-98 15:17 DISK1/RUNONCE.ST_ 126976 09-15-98 15:17 DISK1/SETUP.EXE 664 07-13-99 11:11 DISK1/SETUP.LST 6194 07-13-99 11:11 DISK1/SETUP.STT 57344 03-29-99 14:22 DISK1/SETUPRES.DLL 179978 04-13-99 20:06 DISK1/SETUPUI.DL_ 926 09-15-98 15:17 DISK1/UNINSTAL.ST_ 1519 06-04-99 16:53 DISK1/UNINSTAL.UN_ 14823 07-13-99 11:22 DISK1/XLDRIVER.PER 552042 01-12-99 14:50 DISK1/_SETUP32.DL_ 0 07-13-99 11:21 DISK3/ 10286 05-06-99 10:11 DISK3/HP4050P6.CAT 7498 06-04-99 10:16 DISK3/HPBAFD16.DL_ 23075 06-04-99 10:16 DISK3/HPBFAB.DD_ 943 06-04-99 10:16 DISK3/HPBFAB16.DL_ 11228 06-04-99 10:16 DISK3/HPBFAB32.DL_ 769683 06-04-99 10:16 DISK3/HPBFDB1.DR_ 37341 06-04-99 10:16 DISK3/HPBFDB1.HL_ 48802 06-04-99 10:16 DISK3/HPBFDB2.DL_ 14671 06-04-99 10:16 DISK3/HPBFDB5.PM_ 879 06-04-99 10:16 DISK3/HPBFTM16.DL_ 61212 06-04-99 10:16 DISK3/HPBFTM32.DL_ -------- ------- 2220854 36 files $
As you can see, all of the files are stored in two subdirectories called DISK1 and DISK3. We must make sure that the files end up in a single directory with no subdirectories before the unpacked work directory is passed to mkprintpkg.pl. The first method for unpacking into a single directory uses the special -j option of the unzip utility. The -j option forces the unzip utility to unpack everything into a single subdirectory. It is used as follows:
$ mkdir /tmp/unpacked-archive $ unzip -j lj586en.exe -d /tmp/unpacked-archive/ Archive: lj586en.exe inflating: /tmp/unpacked-archive/HP4050P6.INF inflating: /tmp/unpacked-archive/HPBPST.HL_ inflating: /tmp/unpacked-archive/HPBST16.DL_ inflating: /tmp/unpacked-archive/HPDCMON.DL_ inflating: /tmp/unpacked-archive/HPEXPAND.DL_ inflating: /tmp/unpacked-archive/HPNRA.EX_ inflating: /tmp/unpacked-archive/HPSETUP.HL_ inflating: /tmp/unpacked-archive/HPTDPI.TD_ inflating: /tmp/unpacked-archive/HPTDS.DL_ inflating: /tmp/unpacked-archive/HPUNINST.EX_ inflating: /tmp/unpacked-archive/LICENSE.TXT inflating: /tmp/unpacked-archive/READ4050.WRI inflating: /tmp/unpacked-archive/README.PER extracting: /tmp/unpacked-archive/RUNONCE.ST_ inflating: /tmp/unpacked-archive/SETUP.EXE inflating: /tmp/unpacked-archive/SETUP.LST inflating: /tmp/unpacked-archive/SETUP.STT inflating: /tmp/unpacked-archive/SETUPRES.DLL inflating: /tmp/unpacked-archive/SETUPUI.DL_ inflating: /tmp/unpacked-archive/UNINSTAL.ST_ inflating: /tmp/unpacked-archive/UNINSTAL.UN_ inflating: /tmp/unpacked-archive/XLDRIVER.PER inflating: /tmp/unpacked-archive/_SETUP32.DL_ inflating: /tmp/unpacked-archive/HP4050P6.CAT inflating: /tmp/unpacked-archive/HPBAFD16.DL_ inflating: /tmp/unpacked-archive/HPBFAB.DD_ inflating: /tmp/unpacked-archive/HPBFAB16.DL_ inflating: /tmp/unpacked-archive/HPBFAB32.DL_ inflating: /tmp/unpacked-archive/HPBFDB1.DR_ inflating: /tmp/unpacked-archive/HPBFDB1.HL_ inflating: /tmp/unpacked-archive/HPBFDB2.DL_ inflating: /tmp/unpacked-archive/HPBFDB5.PM_ inflating: /tmp/unpacked-archive/HPBFTM16.DL_ inflating: /tmp/unpacked-archive/HPBFTM32.DL_
As you can see, the -j option has unpacked everything into a single subdirectory. A second method for moving all the files into a single subdirectory is to just use standard shell commands to move each file. For example, the following sequence of commands could have been used to move the files into place:
$ mkdir /tmp/unpacked-archive $ unzip lj586en.exe -d /tmp/unpacked-archive/ Archive: lj586en.exe creating: /tmp/unpacked-archive/DISK1/ inflating: /tmp/unpacked-archive/DISK1/HP4050P6.INF inflating: /tmp/unpacked-archive/DISK1/HPBPST.HL_ inflating: /tmp/unpacked-archive/DISK1/HPBST16.DL_ inflating: /tmp/unpacked-archive/DISK1/HPDCMON.DL_ inflating: /tmp/unpacked-archive/DISK1/HPEXPAND.DL_ inflating: /tmp/unpacked-archive/DISK1/HPNRA.EX_ inflating: /tmp/unpacked-archive/DISK1/HPSETUP.HL_ inflating: /tmp/unpacked-archive/DISK1/HPTDPI.TD_ inflating: /tmp/unpacked-archive/DISK1/HPTDS.DL_ inflating: /tmp/unpacked-archive/DISK1/HPUNINST.EX_ inflating: /tmp/unpacked-archive/DISK1/LICENSE.TXT inflating: /tmp/unpacked-archive/DISK1/READ4050.WRI inflating: /tmp/unpacked-archive/DISK1/README.PER extracting: /tmp/unpacked-archive/DISK1/RUNONCE.ST_ inflating: /tmp/unpacked-archive/DISK1/SETUP.EXE inflating: /tmp/unpacked-archive/DISK1/SETUP.LST inflating: /tmp/unpacked-archive/DISK1/SETUP.STT inflating: /tmp/unpacked-archive/DISK1/SETUPRES.DLL inflating: /tmp/unpacked-archive/DISK1/SETUPUI.DL_ inflating: /tmp/unpacked-archive/DISK1/UNINSTAL.ST_ inflating: /tmp/unpacked-archive/DISK1/UNINSTAL.UN_ inflating: /tmp/unpacked-archive/DISK1/XLDRIVER.PER inflating: /tmp/unpacked-archive/DISK1/_SETUP32.DL_ creating: /tmp/unpacked-archive/DISK3/ inflating: /tmp/unpacked-archive/DISK3/HP4050P6.CAT inflating: /tmp/unpacked-archive/DISK3/HPBAFD16.DL_ inflating: /tmp/unpacked-archive/DISK3/HPBFAB.DD_ inflating: /tmp/unpacked-archive/DISK3/HPBFAB16.DL_ inflating: /tmp/unpacked-archive/DISK3/HPBFAB32.DL_ inflating: /tmp/unpacked-archive/DISK3/HPBFDB1.DR_ inflating: /tmp/unpacked-archive/DISK3/HPBFDB1.HL_ inflating: /tmp/unpacked-archive/DISK3/HPBFDB2.DL_ inflating: /tmp/unpacked-archive/DISK3/HPBFDB5.PM_ inflating: /tmp/unpacked-archive/DISK3/HPBFTM16.DL_ inflating: /tmp/unpacked-archive/DISK3/HPBFTM32.DL_ $ cd /tmp/unpacked-archive $ ls DISK1 DISK3 $ mv DISK1/* . $ mv DISK3/* . $ rmdir DISK1 $ rmdir DISK3 $ ls HP4050P6.CAT HPBFDB1.HL_ HPDCMON.DL_ LICENSE.TXT SETUPRES.DLL HP4050P6.INF HPBFDB2.DL_ HPEXPAND.DL_ READ4050.WRI SETUPUI.DL_ HPBAFD16.DL_ HPBFDB5.PM_ HPNRA.EX_ README.PER UNINSTAL.ST_ HPBFAB.DD_ HPBFTM16.DL_ HPSETUP.HL_ RUNONCE.ST_ UNINSTAL.UN_ HPBFAB16.DL_ HPBFTM32.DL_ HPTDPI.TD_ SETUP.EXE XLDRIVER.PER HPBFAB32.DL_ HPBPST.HL_ HPTDS.DL_ SETUP.LST _SETUP32.DL_ HPBFDB1.DR_ HPBST16.DL_ HPUNINST.EX_ SETUP.STT $
Either method will work to get all of the files into a single subdirectory. Finally, we can wrap up this example by actually building the package:
$ mkprintpkg.pl --name="hp4050" --version=1.00 --display-name="HP 4050" /tmp/unpacked-archive lj582en.exe Package: hp4050-1.00.tar.gz Display Name: HP 4050 Location: /tmp/unpacked-archive Using file HP4050P6.INF for INF information. Architecture: Windows 95/98 (detected from INF) Manufacturer: HP (detected from INF) Model: HP LaserJet 4050 Series PCL 6 (detected from INF) Using archive lj582en.exe for files. Using file hpbfdf1.inf for INF information. Architecture: Windows NT X86 (detected from INF) Manufacturer: HP (detected from INF) Model: HP LaserJet 4050 Series PCL 6 (detected from INF) $
And with that, the package is built.