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;
|