1 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns=
"http://www.w3.org/1999/xhtml" dir=
"ltr">
5 <meta http-equiv=
"Content-Type" content=
"text/html;charset=utf-8" />
6 <title>Petter Reinholdtsen: Checking server hardware support status for Dell, HP and IBM servers
</title>
7 <link rel=
"stylesheet" type=
"text/css" media=
"screen" href=
"http://people.skolelinux.org/pere/blog/style.css" />
8 <link rel=
"stylesheet" type=
"text/css" media=
"screen" href=
"http://people.skolelinux.org/pere/blog/vim.css" />
15 <a href=
"http://people.skolelinux.org/pere/blog/">Petter Reinholdtsen
</a>
23 <div class=
"title">Checking server hardware support status for Dell, HP and IBM servers
</div>
24 <div class=
"date">28th February
2009</div>
25 <div class=
"body"><p>At work, we have a few hundred Linux servers, and with that amount
26 of hardware it is important to keep track of when the hardware support
27 contract expire for each server. We have a machine (and service)
28 register, which until recently did not contain much useful besides the
29 machine room location and contact information for the system owner for
30 each machine. To make it easier for us to track support contract
31 status, I've recently spent time on extending the machine register to
32 include information about when the support contract expire, and to tag
33 machines with expired contracts to make it easy to get a list of such
34 machines. I extended a perl script already being used to import
35 information about machines into the register, to also do some screen
36 scraping off the sites of Dell, HP and IBM (our majority of machines
37 are from these vendors), and automatically check the support status
38 for the relevant machines. This make the support status information
39 easily available and I hope it will make it easier for the computer
40 owner to know when to get new hardware or renew the support contract.
41 The result of this work documented that
27% of the machines in the
42 registry is without a support contract, and made it very easy to find
43 them.
27% might seem like a lot, but I see it more as the case of us
44 using machines a bit longer than the
3 years a normal support contract
45 last, to have test machines and a platform for less important
46 services. After all, the machines without a contract are working fine
47 at the moment and the lack of contract is only a problem if any of
48 them break down. When that happen, we can either fix it using spare
49 parts from other machines or move the service to another old
52 <p>I believe the code for screen scraping the Dell site was originally
53 written by Trond Hasle Amundsen, and later adjusted by me and Morten
54 Werner Forsbring. The HP scraping was written by me after reading a
55 nice article in ;login: about how to use WWW::Mechanize, and the IBM
56 scraping was written by me based on the Dell code. I know the HTML
57 parsing could be done using nice libraries, but did not want to
58 introduce more dependencies. This is the current incarnation:
</p>
66 sub get_support_info {
67 my ($machine, $model, $serial, $productnumber) = @_;
70 if ( $model =~ m/^Dell / ) {
71 # fetch website from Dell support
72 my $url = "http://support.euro.dell.com/support/topics/topic.aspx/emea/shared/support/my_systems_info/no/details?c=no
&cs=nodhs1
&l=no
&s=dhs
&ServiceTag=$serial";
73 my $webpage = get($url);
74 return undef unless ($webpage);
77 my @lines = split(/\n/, $webpage);
78 foreach my $line (@lines) {
79 next unless ($line =~ m/Beskrivelse/);
80 $line =~ s/
<[^
>]+
?>/;/gm;
81 $line =~ s/^.+?;(Beskrivelse;)/$
1/;
83 my @f = split(/\;/, $line);
86 while ($f[
3] eq "DELL") {
87 my ($type, $startstr, $endstr, $days) = @f[
0,
5,
7,
10];
89 my $start = POSIX::strftime("%Y-%m-%d",
90 localtime(str2time($startstr)));
91 my $end = POSIX::strftime("%Y-%m-%d",
92 localtime(str2time($endstr)));
93 $str .= "$type $start -
> $end ";
95 $lastend = $end if ($end gt $lastend);
97 my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
98 tag_machine_unsupported($machine)
99 if ($lastend lt $today);
101 } elsif ( $model =~ m/^HP / ) {
102 my $mech = WWW::Mechanize-
>new();
104 'http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do';
107 'BODServiceID' =
> 'NA',
108 'RegisteredPurchaseDate' =
> '',
110 'productNumber' =
> $productnumber,
111 'serialNumber1' =
> $serial,
113 $mech-
>submit_form( form_number =
> 2,
115 # Next step is screen scraping
116 my $content = $mech-
>content();
118 $content =~ s/
<[^
>]+
?>/;/gm;
119 $content =~ s/\s+/ /gm;
120 $content =~ s/;\s*;/;;/gm;
121 $content =~ s/;[\s;]+/;/gm;
123 my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
125 while ($content =~ m/;Warranty Type;/) {
126 my ($type, $status, $startstr, $stopstr) = $content =~
127 m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
128 $content =~ s/^.+?;Warranty Type;//;
129 my $start = POSIX::strftime("%Y-%m-%d",
130 localtime(str2time($startstr)));
131 my $end = POSIX::strftime("%Y-%m-%d",
132 localtime(str2time($stopstr)));
134 $str .= "$type ($status) $start -
> $end ";
136 tag_machine_unsupported($machine)
139 } elsif ( $model =~ m/^IBM / ) {
140 # This code ignore extended support contracts.
141 my ($producttype) = $model =~ m/.*-\[(.{
4}).+\]-/;
142 if ($producttype
&& $serial) {
144 get("http://www-
947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty
&brandind=
5000008&Submit=Submit
&type=$producttype
&serial=$serial");
146 $content =~ s/
<[^
>]+
?>/;/gm;
147 $content =~ s/\s+/ /gm;
148 $content =~ s/;\s*;/;;/gm;
149 $content =~ s/;[\s;]+/;/gm;
151 $content =~ s/^.+?;Warranty status;//;
152 my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
154 $str .= "($status) -
> $end ";
156 my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
157 tag_machine_unsupported($machine)
166 <p>Here are some examples on how to use the function, using fake
167 serial numbers. The information passed in as arguments are fetched
171 print get_support_info("hp.host", "HP ProLiant BL460c G1", "
1234567890"
173 print get_support_info("dell.host", "Dell Inc. PowerEdge
2950", "
1234567");
174 print get_support_info("ibm.host", "IBM eserver xSeries
345 -[
867061X]-",
178 <p>I would recommend this approach for tracking support contracts for
179 everyone with more than a few computers to administer. :)
</p>
181 <p>Update
2009-
03-
06: The IBM page do not include extended support
182 contracts, so it is useless in that case. The original Dell code do
183 not handle extended support contracts either, but has been updated to
187 <div class=
"tags">Tags:
<a href=
"http://people.skolelinux.org/pere/blog/tags/english">english
</a>,
<a href=
"http://people.skolelinux.org/pere/blog/tags/nuug">nuug
</a>.
</div>
205 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/01/">January (
2)
</a></li>
207 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/02/">February (
3)
</a></li>
209 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/03/">March (
4)
</a></li>
216 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/01/">January (
11)
</a></li>
218 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/02/">February (
9)
</a></li>
220 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/03/">March (
9)
</a></li>
222 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/04/">April (
6)
</a></li>
224 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/05/">May (
9)
</a></li>
226 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/06/">June (
10)
</a></li>
228 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/07/">July (
7)
</a></li>
230 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/08/">August (
3)
</a></li>
232 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/09/">September (
5)
</a></li>
234 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/10/">October (
7)
</a></li>
236 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/11/">November (
9)
</a></li>
238 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/12/">December (
3)
</a></li>
245 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/01/">January (
7)
</a></li>
247 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/02/">February (
10)
</a></li>
249 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/03/">March (
17)
</a></li>
251 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/04/">April (
12)
</a></li>
253 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/05/">May (
12)
</a></li>
255 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/06/">June (
20)
</a></li>
257 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/07/">July (
17)
</a></li>
259 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/08/">August (
6)
</a></li>
261 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/09/">September (
9)
</a></li>
263 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/10/">October (
17)
</a></li>
265 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/11/">November (
10)
</a></li>
267 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/12/">December (
7)
</a></li>
274 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/01/">January (
16)
</a></li>
276 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/02/">February (
6)
</a></li>
278 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/03/">March (
6)
</a></li>
280 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/04/">April (
7)
</a></li>
282 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/05/">May (
3)
</a></li>
284 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/06/">June (
2)
</a></li>
286 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/07/">July (
7)
</a></li>
288 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/08/">August (
6)
</a></li>
290 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/09/">September (
4)
</a></li>
292 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/10/">October (
2)
</a></li>
294 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/11/">November (
3)
</a></li>
296 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/12/">December (
1)
</a></li>
303 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/01/">January (
2)
</a></li>
305 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/02/">February (
1)
</a></li>
307 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/03/">March (
3)
</a></li>
309 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/04/">April (
3)
</a></li>
311 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/05/">May (
9)
</a></li>
313 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/06/">June (
14)
</a></li>
315 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/07/">July (
12)
</a></li>
317 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/08/">August (
13)
</a></li>
319 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/09/">September (
7)
</a></li>
321 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/10/">October (
9)
</a></li>
323 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/11/">November (
13)
</a></li>
325 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/12/">December (
12)
</a></li>
332 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/01/">January (
8)
</a></li>
334 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/02/">February (
8)
</a></li>
336 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/03/">March (
12)
</a></li>
338 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/04/">April (
10)
</a></li>
340 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/05/">May (
9)
</a></li>
342 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/06/">June (
3)
</a></li>
344 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/07/">July (
4)
</a></li>
346 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/08/">August (
3)
</a></li>
348 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/09/">September (
1)
</a></li>
350 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/10/">October (
2)
</a></li>
352 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/11/">November (
3)
</a></li>
354 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/12/">December (
3)
</a></li>
361 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2008/11/">November (
5)
</a></li>
363 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2008/12/">December (
7)
</a></li>
374 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (
13)
</a></li>
376 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/amiga">amiga (
1)
</a></li>
378 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/aros">aros (
1)
</a></li>
380 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bankid">bankid (
4)
</a></li>
382 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (
8)
</a></li>
384 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (
14)
</a></li>
386 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bsa">bsa (
2)
</a></li>
388 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/chrpath">chrpath (
2)
</a></li>
390 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/debian">debian (
95)
</a></li>
392 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (
145)
</a></li>
394 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/digistan">digistan (
10)
</a></li>
396 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/docbook">docbook (
10)
</a></li>
398 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (
4)
</a></li>
400 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/english">english (
238)
</a></li>
402 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (
21)
</a></li>
404 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (
12)
</a></li>
406 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (
12)
</a></li>
408 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (
6)
</a></li>
410 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (
11)
</a></li>
412 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/intervju">intervju (
39)
</a></li>
414 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (
7)
</a></li>
416 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/kart">kart (
18)
</a></li>
418 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ldap">ldap (
9)
</a></li>
420 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/lenker">lenker (
7)
</a></li>
422 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (
1)
</a></li>
424 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (
7)
</a></li>
426 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (
25)
</a></li>
428 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/norsk">norsk (
242)
</a></li>
430 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/nuug">nuug (
162)
</a></li>
432 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (
11)
</a></li>
434 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/open311">open311 (
2)
</a></li>
436 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (
45)
</a></li>
438 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/personvern">personvern (
69)
</a></li>
440 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/raid">raid (
1)
</a></li>
442 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/reprap">reprap (
11)
</a></li>
444 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/rfid">rfid (
2)
</a></li>
446 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/robot">robot (
9)
</a></li>
448 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/rss">rss (
1)
</a></li>
450 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ruter">ruter (
4)
</a></li>
452 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (
2)
</a></li>
454 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (
35)
</a></li>
456 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (
4)
</a></li>
458 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (
4)
</a></li>
460 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/standard">standard (
44)
</a></li>
462 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (
3)
</a></li>
464 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (
9)
</a></li>
466 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (
22)
</a></li>
468 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (
1)
</a></li>
470 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/valg">valg (
8)
</a></li>
472 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/video">video (
39)
</a></li>
474 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (
4)
</a></li>
476 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/web">web (
29)
</a></li>
482 <p style=
"text-align: right">
483 Created by
<a href=
"http://steve.org.uk/Software/chronicle">Chronicle v4.6
</a>