Skip to content

Commit 165bf96

Browse files
committed
fix: Filter invalid firmware date for at least HP peripherals
Closes #781
1 parent 15cea42 commit 165bf96

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

Changes

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ netdiscovery/netinventory:
4040
* fix #769: Added Intelbras devices support
4141
* don't send discovery xml to server target for remoteinventory task event initiated
4242
from toolbox
43+
* fix #781: Filter invalid firmware date on HP peripherals
4344

4445
deploy:
4546
* Fix checks on command run and clarify reason of success or failure. This fixes

lib/GLPI/Agent/SNMP/Device.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ sub getFirmwareDateByMibSupport {
144144

145145
return unless $self->{MIBSUPPORT};
146146

147-
return $self->{MIBSUPPORT}->getMethod('getFirmwareDate');
147+
return getCanonicalDate($self->{MIBSUPPORT}->getMethod('getFirmwareDate'));
148148
}
149149

150150
sub getMacAddressByMibSupport {
@@ -333,7 +333,7 @@ sub setFirmware {
333333
NAME => $self->{MODEL} || 'device',
334334
DESCRIPTION => 'device firmware',
335335
TYPE => 'device',
336-
DATE => $self->getFirmwareDateByMibSupport(),
336+
DATE => $self->getFirmwareDateByMibSupport() // undef,
337337
VERSION => $self->{FIRMWARE},
338338
MANUFACTURER => $self->{MANUFACTURER}
339339
});

lib/GLPI/Agent/Tools/SNMP.pm

+58
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ our @EXPORT = qw(
1515
getCanonicalConstant
1616
getCanonicalMemory
1717
getCanonicalCount
18+
getCanonicalDate
1819
isInteger
1920
getRegexpOidMatch
2021
);
@@ -150,6 +151,63 @@ sub getRegexpOidMatch {
150151
return qr/^$match/;
151152
}
152153

154+
my %M = qw(Jan 1 Feb 2 Mar 3 Apr 4 May 5 Jun 6 Jul 7 Aug 8 Sep 9 Oct 10 Nov 11 Dec 12);
155+
my $months = join('|', keys(%M));
156+
my $days = "Mon|Tue|Wed|Thu|Fri|Sat|Sun";
157+
my $first = join("|", map { "0?$_" } 1..9);
158+
my $month = join("|", $first, 10..12);
159+
my $month2 = join("|", map { sprintf("%02d", $_) } 1..12);
160+
my $day = join("|", $first, 10..31);
161+
my $day2 = join("|", map { sprintf("%02d", $_) } 1..31);
162+
my $hour = join("|", map { sprintf("%02d", $_) } 0..23);
163+
my $min = join("|", map { sprintf("%02d", $_) } 0..59);
164+
my $sec = $min;
165+
my $year = "[1-9][0-9]{3}";
166+
167+
# Return date if possible
168+
sub getCanonicalDate {
169+
my ($value) = @_;
170+
171+
return if empty($value);
172+
173+
# Match on 'D M d H:i:s Y'
174+
if ($value =~ /^(?:$days) ($months) +($day) (?:$hour):(?:$min):(?:$sec) .*($year)$/) {
175+
return sprintf("%4d-%02d-%02d", $3, $M{$1}, $2);
176+
}
177+
178+
# Match 'D M d, Y H:i:s' as in "Wed Aug 01, 2012 05:50:43PM"
179+
if ($value =~ /^(?:$days) ($months) +($day), ($year) /) {
180+
return sprintf("%4d-%02d-%02d", $3, $M{$1}, $2);
181+
}
182+
183+
# Match on 'Y-m-d\TH:i:sZ' and others with same prefix
184+
if ($value =~ /^($year)-($month)-($day)/) {
185+
return sprintf("%4d-%02d-%02d", $1, $2, $3);
186+
}
187+
188+
# Match on 'd/m/Y H:i:s' and others
189+
if ($value =~ m{^($day)/($month)/($year)} ) {
190+
return sprintf("%4d-%02d-%02d", $3, $2, $1);
191+
}
192+
193+
# Match on 'm/d/Y'
194+
if ($value =~ m{^($month)/($day)/($year)} ) {
195+
return sprintf("%4d-%02d-%02d", $3, $1, $2);
196+
}
197+
198+
# Match on 'd.m.Y'
199+
if ($value =~ /^($day)\.($month)\.($year)/ ) {
200+
return sprintf("%4d-%02d-%02d", $3, $2, $1);
201+
}
202+
203+
# Match on 'Ymd'
204+
if ($value =~ /^($year)($month2)($day2)$/ ) {
205+
return sprintf("%4d-%02d-%02d", $1, $2, $3);
206+
}
207+
208+
return;
209+
}
210+
153211
1;
154212
__END__
155213

0 commit comments

Comments
 (0)