Perl Script to Convert CUPS /etc/cups/printers.conf to CSV

Written by James McDonald

April 18, 2012

I’m currently transferring a Formtrap Forms Server to a later version and I want to run the new and old servers in parrallel for a while so I have added a heap of printers onto a Redhat 5.5 Server pointing to the new server.

The trouble is that all the settings aren’t visible in one view so I wanted to export printers.conf to CSV so I can view it in a spreadsheet.

Below is a Perl script that I wrote to do the conversion. IANAP so YMMV.

You may have to copy /etc/cups/printers.conf somewhere it is accessible.

The following script converts this:


Info Pallet Label Printer
Location Palletizing Area
DeviceURI lpd://print-server/cabpl
State Idle
StateTime 1334710494
Accepting Yes
Shared No
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy stop-printer


Info SSCC Label Print Test
DeviceURI lpd://print-server/printer2
State Idle
StateTime 1298006302
Accepting Yes
Shared No
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy stop-printer

To this:

Accepting,DeviceURI,ErrorPolicy,Info,JobSheets,KLimit,Location,OpPolicy,PageLimit,QuotaPeriod,Shared,State,StateMessage,StateTime,name,
Yes,lpd://print-server/bottpl,stop-printer,Formtrap Bottling Pallet Label Printer,none none,,Bottling Palletizing,default,,,No,Idle,,1334547108,cabpl,
Yes,lpd://print-server/cabpl,stop-printer,Formtrap Margarine Pallet Label Printer,none none,,Marg Palletizing,default,,,No,Idle,,1334710494,printer2,

Here is the Perl Script
You need edit the filenames in the script to match your input and output filename preferences

use strict;
use warnings;
 
my %printer_hash = ();
my $hash_key = '';
my %settings = ( name => 1 ); # store all possible settings
my $sep = $/; # store the current separator
my $input_file = 'printers.txt';
my $output_file = 'printer.csv';
#$/ = "\r\n";  # this is for a printer.conf with windows CRLF adjust as nessary for unix LF format
 
 
 
open ( FH, "< $input_file") or die "$? $!\n";
 
 
while (  ) {
	chomp($_);

	if ( $_ =~ //i ) {
		$printer_hash{$1}{name} = $1;
		$hash_key = $1;
		print "$printer_hash{$hash_key}{name}\n";
	} elsif ( $_ =~ /^(\w+)\s(.*)$/i ) {
 
		$printer_hash{$hash_key}{$1} = $2;
		#print "Printer : $hash_key Key : $1 Value : $2\n";
		$settings{$1} = 1;
	}
 
}
 
close (FH);
 
open ( CSV, ">$output_file") or die "$? $!\n";
 
 
foreach my $setting( sort keys %settings ) {
		 print CSV "$setting,";
	 }
print CSV "\n";
 
foreach my $key ( sort keys %printer_hash ) {
	#print "$key\n";
	foreach my $setting( sort keys %settings ) {
 
		 print CSV $printer_hash{$key}{$setting} ? "$printer_hash{$key}{$setting}" : "" ;
		 print CSV ',';
	 }
	 print CSV "\n";
}

2 Comments

  1. elvis

    should be if ( $_ =~ //i ) { without the space between the word and the regex.

    Reply
    • admin

      Thanks fixed it.

      Reply

Leave a Reply to admin Cancel reply

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.

You May Also Like…

Network speed test host to host

On Ubuntu / Debian apt-get install iperf3 On Windows download it from https://iperf.fr/iperf-download.php#windows Make...

Clear HSTS Settings in CHrome

Open chrome://net-internals/#hsts enter the domain in the query field and click Query to confirm it has HSTS settings...