summaryrefslogtreecommitdiffstats
path: root/perl-install/printer/cups.pm
blob: ab9e28b217a896b5ab0678826f24a3c984786c02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package printer::cups;

use strict;

use printer::data;
use run_program;
use common;


#------------------------------------------------------------------------------

sub lpstat_lpv() {

    # Get a list of remotely defined print queues, with "Description" and
    # "Location"

    # Info to return
    my @items;

    # Hash to simplify the adding of the URIs
    my $itemshash;

    # Run the "lpstat" command in a mode to give as much info about the
    # print queues as possible
    my @lpstat = run_program::rooted_get_stdout
	($::prefix, 'lpstat', '-l', '-p', '-v');
    
    my $currentitem = -1;
    for my $line (@lpstat) {
	chomp ($line);
	if (!($line =~ m!^\s*$!)) {
	    if ($line =~ m!^printer\s+(\S+)\s+(\S.*)$!) {
		# Beginning of new printer's entry
		my $name = $1;
		push(@items, {});
		$currentitem = $#items;
		$itemshash->{$name} = $currentitem;
		$items[$currentitem]{queuename} ||= $name;
	    } elsif ($line =~ m!^\s+Description:\s+(\S.*)$!) {
		# Description field
		if ($currentitem != -1) {
		    $items[$currentitem]{description} ||= $1;
		}
	    } elsif ($line =~ m!^\s+Location:\s+(\S.*)$!) {
		# Location field
		if ($currentitem != -1) {
		    $items[$currentitem]{location} ||= $1;
		}
	    } elsif ($line =~ m!^device\s+for\s+(\S+):\s+(\S.*)$!) {
		# "device for ..." line, extract URI
		my $name = $1;
		my $uri = $2;
		if (defined($itemshash->{$name})) {
		    if ($uri !~ /:/) {$uri = "file:" . $uri};
		    $currentitem = $itemshash->{$name};
		    if (($currentitem <= $#items) &&
			($items[$currentitem]{queuename} eq $name)) {
			$items[$currentitem]{uri} ||= $uri;
			if ($uri =~ m!^ipp://([^/:]+)[:/]!) {
			    $items[$currentitem]{ipp} = $1;
			}
		    }
		}
	    }
	}
    }
    return @items;
}

sub lpstat_v() {
    map {
	if (my ($queuename, $uri) = m/^\s*device\s+for\s+([^:\s]+):\s*(\S+)\s*$/) {
	    +{ queuename => $queuename, uri => $uri, if_($uri =~ m!^ipp://([^/:]+)[:/]!, ipp => $1) };
	} else {
	    ();
	}
    } run_program::rooted_get_stdout($::prefix, 'lpstat', '-v');
}

sub lpinfo_v() {
    map {
	if (my ($type, $uri) = m/^\s*(\S+)\s+(\S+)\b/) {
	    if ($uri =~ m!:/!) {
		$uri;
	    } elsif ($type =~ m/network/i) {
		"$uri://";
	    } else {
		"$uri:/";
	    }
	} else {
	    ();
	}
    } run_program::rooted_get_stdout($::prefix, 'lpinfo', '-v');
}

sub read_printer_list {
    my ($printer) = @_;
    # This function reads in a list of all printers which the local CUPS
    # daemon currently knows, including remote ones.
    map {
	my $comment = 
	  $_->{ipp} && !$printer->{configured}{$_->{queuename}} ?
	    N("(on %s)", $_->{ipp}) : N("(on this machine)");
	"$_->{queuename} $comment";
    } lpstat_v();
}

sub get_formatted_remote_queues {
    my ($printer) = @_;

    # This function reads in a list of all remote printers which the local 
    # CUPS daemon knows due to broadcasting of remote servers or 
    # "BrowsePoll" entries in the local /etc/cups/cupsd.conf/
    map {
	join('!', if_($printer->{expert}, N("CUPS")), N("Configured on other machines"), $_);
    } map {
	my $comment = N("On CUPS server \"%s\"", $_->{ipp}) . ($_->{queuename} eq $printer->{DEFAULT} ? N(" (Default)") : "");
	"$_->{queuename}: $comment";
    } grep { 
	$_->{ipp} && !$printer->{configured}{$_->{queuename}};
    } lpstat_v();
}

sub get_remote_queues {
    my ($printer) = @_;
    # The following code reads in a list of all remote printers which the
    # local CUPS daemon knows due to broadcasting of remote servers or 
    # "BrowsePoll" entries in the local /etc/cups/cupsd.conf
    map {
	"$_->{queuename}|$_->{ipp}";
    } grep { 
	$_->{ipp} && !$printer->{configured}{$_->{queuename}};
    } lpstat_v();
}

1;