1package FusionInventory::Agent::Task::Inventory::Generic::Printers;
2
3use strict;
4use warnings;
5
6use parent 'FusionInventory::Agent::Task::Inventory::Module';
7
8use English qw(-no_match_vars);
9use UNIVERSAL::require;
10
11use FusionInventory::Agent::Tools;
12
13sub isEnabled {
14    my (%params) = @_;
15
16    return 0 if $params{no_category}->{printer};
17
18    # we use system profiler on MacOS
19    return 0 if $OSNAME eq 'darwin';
20
21    # we use WMI on Windows
22    return 0 if $OSNAME eq 'MSWin32';
23
24    Net::CUPS->require();
25    if ($EVAL_ERROR) {
26        $params{logger}->debug(
27            "Net::CUPS Perl module not available, unable to retrieve printers"
28        );
29        return 0;
30    }
31
32    if ($Net::CUPS::VERSION < 0.60) {
33        $params{logger}->debug(
34            "Net::CUPS Perl module too old " .
35            "(available: $Net::CUPS::VERSION, required: 0.60), ".
36            "unable to retrieve printers"
37        );
38        return 0;
39    }
40
41    return 1;
42}
43
44sub doInventory {
45    my (%params) = @_;
46
47    my $inventory = $params{inventory};
48
49    my $cups = Net::CUPS->new();
50    my @printers = $cups->getDestinations();
51
52    foreach my $printer (@printers) {
53        my $uri = $printer->getUri();
54        my $name = $uri;
55        $name =~ s/^.*\/\/([^\.]*).*$/$1/eg ;
56        $name =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
57        $inventory->addEntry(
58            section => 'PRINTERS',
59            entry   => {
60                NAME        => $name,
61                PORT        => $uri,
62                DESCRIPTION => $printer->getDescription(),
63                DRIVER      => $printer->getOptionValue(
64                                   "printer-make-and-model"
65                               ),
66            }
67        );
68    }
69
70}
71
721;
73