]> pere.pagekite.me Git - homepage.git/blob - blog/Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html
Generated.
[homepage.git] / blog / Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html
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">
4 <head>
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" />
9
10
11 </head>
12 <body>
13 <div class="title">
14 <h1>
15 <a href="http://people.skolelinux.org/pere/blog/">Petter Reinholdtsen</a>
16
17 </h1>
18
19 </div>
20
21
22 <div class="entry">
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
50 machine.</p>
51
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>
59
60 <pre>
61 use LWP::Simple;
62 use POSIX;
63 use WWW::Mechanize;
64 use Date::Parse;
65 [...]
66 sub get_support_info {
67 my ($machine, $model, $serial, $productnumber) = @_;
68 my $str;
69
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&amp;cs=nodhs1&amp;l=no&amp;s=dhs&amp;ServiceTag=$serial";
73 my $webpage = get($url);
74 return undef unless ($webpage);
75
76 my $daysleft = -1;
77 my @lines = split(/\n/, $webpage);
78 foreach my $line (@lines) {
79 next unless ($line =~ m/Beskrivelse/);
80 $line =~ s/&lt;[^>]+?>/;/gm;
81 $line =~ s/^.+?;(Beskrivelse;)/$1/;
82
83 my @f = split(/\;/, $line);
84 @f = @f[13 .. $#f];
85 my $lastend = "";
86 while ($f[3] eq "DELL") {
87 my ($type, $startstr, $endstr, $days) = @f[0, 5, 7, 10];
88
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 ";
94 @f = @f[14 .. $#f];
95 $lastend = $end if ($end gt $lastend);
96 }
97 my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
98 tag_machine_unsupported($machine)
99 if ($lastend lt $today);
100 }
101 } elsif ( $model =~ m/^HP / ) {
102 my $mech = WWW::Mechanize->new();
103 my $url =
104 'http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do';
105 $mech->get($url);
106 my $fields = {
107 'BODServiceID' => 'NA',
108 'RegisteredPurchaseDate' => '',
109 'country' => 'NO',
110 'productNumber' => $productnumber,
111 'serialNumber1' => $serial,
112 };
113 $mech->submit_form( form_number => 2,
114 fields => $fields );
115 # Next step is screen scraping
116 my $content = $mech->content();
117
118 $content =~ s/&lt;[^>]+?>/;/gm;
119 $content =~ s/\s+/ /gm;
120 $content =~ s/;\s*;/;;/gm;
121 $content =~ s/;[\s;]+/;/gm;
122
123 my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
124
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)));
133
134 $str .= "$type ($status) $start -> $end ";
135
136 tag_machine_unsupported($machine)
137 if ($end lt $today);
138 }
139 } elsif ( $model =~ m/^IBM / ) {
140 # This code ignore extended support contracts.
141 my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
142 if ($producttype &amp;&amp; $serial) {
143 my $content =
144 get("http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&amp;brandind=5000008&amp;Submit=Submit&amp;type=$producttype&amp;serial=$serial");
145 if ($content) {
146 $content =~ s/&lt;[^>]+?>/;/gm;
147 $content =~ s/\s+/ /gm;
148 $content =~ s/;\s*;/;;/gm;
149 $content =~ s/;[\s;]+/;/gm;
150
151 $content =~ s/^.+?;Warranty status;//;
152 my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
153
154 $str .= "($status) -> $end ";
155
156 my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
157 tag_machine_unsupported($machine)
158 if ($end lt $today);
159 }
160 }
161 }
162 return $str;
163 }
164 </pre>
165
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
168 from dmidecode.</p>
169
170 <pre>
171 print get_support_info("hp.host", "HP ProLiant BL460c G1", "1234567890"
172 "447707-B21");
173 print get_support_info("dell.host", "Dell Inc. PowerEdge 2950", "1234567");
174 print get_support_info("ibm.host", "IBM eserver xSeries 345 -[867061X]-",
175 "1234567");
176 </pre>
177
178 <p>I would recommend this approach for tracking support contracts for
179 everyone with more than a few computers to administer. :)</p>
180
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
184 do so.</p>
185 </div>
186
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>
188
189
190 </div>
191
192
193
194
195 <div id="sidebar">
196
197
198
199 <h2>Archive</h2>
200 <ul>
201
202 <li>2013
203 <ul>
204
205 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/01/">January (11)</a></li>
206
207 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/02/">February (9)</a></li>
208
209 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/03/">March (9)</a></li>
210
211 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/04/">April (6)</a></li>
212
213 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/05/">May (6)</a></li>
214
215 </ul></li>
216
217 <li>2012
218 <ul>
219
220 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/01/">January (7)</a></li>
221
222 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/02/">February (10)</a></li>
223
224 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/03/">March (17)</a></li>
225
226 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/04/">April (12)</a></li>
227
228 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/05/">May (12)</a></li>
229
230 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/06/">June (20)</a></li>
231
232 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/07/">July (17)</a></li>
233
234 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/08/">August (6)</a></li>
235
236 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/09/">September (9)</a></li>
237
238 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/10/">October (17)</a></li>
239
240 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/11/">November (10)</a></li>
241
242 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/12/">December (7)</a></li>
243
244 </ul></li>
245
246 <li>2011
247 <ul>
248
249 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/01/">January (16)</a></li>
250
251 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/02/">February (6)</a></li>
252
253 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/03/">March (6)</a></li>
254
255 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/04/">April (7)</a></li>
256
257 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/05/">May (3)</a></li>
258
259 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/06/">June (2)</a></li>
260
261 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/07/">July (7)</a></li>
262
263 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/08/">August (6)</a></li>
264
265 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/09/">September (4)</a></li>
266
267 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/10/">October (2)</a></li>
268
269 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/11/">November (3)</a></li>
270
271 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/12/">December (1)</a></li>
272
273 </ul></li>
274
275 <li>2010
276 <ul>
277
278 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/01/">January (2)</a></li>
279
280 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/02/">February (1)</a></li>
281
282 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/03/">March (3)</a></li>
283
284 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/04/">April (3)</a></li>
285
286 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/05/">May (9)</a></li>
287
288 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/06/">June (14)</a></li>
289
290 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/07/">July (12)</a></li>
291
292 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/08/">August (13)</a></li>
293
294 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/09/">September (7)</a></li>
295
296 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/10/">October (9)</a></li>
297
298 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/11/">November (13)</a></li>
299
300 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/12/">December (12)</a></li>
301
302 </ul></li>
303
304 <li>2009
305 <ul>
306
307 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/01/">January (8)</a></li>
308
309 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/02/">February (8)</a></li>
310
311 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/03/">March (12)</a></li>
312
313 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/04/">April (10)</a></li>
314
315 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/05/">May (9)</a></li>
316
317 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/06/">June (3)</a></li>
318
319 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/07/">July (4)</a></li>
320
321 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/08/">August (3)</a></li>
322
323 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/09/">September (1)</a></li>
324
325 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/10/">October (2)</a></li>
326
327 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/11/">November (3)</a></li>
328
329 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/12/">December (3)</a></li>
330
331 </ul></li>
332
333 <li>2008
334 <ul>
335
336 <li><a href="http://people.skolelinux.org/pere/blog/archive/2008/11/">November (5)</a></li>
337
338 <li><a href="http://people.skolelinux.org/pere/blog/archive/2008/12/">December (7)</a></li>
339
340 </ul></li>
341
342 </ul>
343
344
345
346 <h2>Tags</h2>
347 <ul>
348
349 <li><a href="http://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (13)</a></li>
350
351 <li><a href="http://people.skolelinux.org/pere/blog/tags/amiga">amiga (1)</a></li>
352
353 <li><a href="http://people.skolelinux.org/pere/blog/tags/aros">aros (1)</a></li>
354
355 <li><a href="http://people.skolelinux.org/pere/blog/tags/bankid">bankid (4)</a></li>
356
357 <li><a href="http://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (7)</a></li>
358
359 <li><a href="http://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (12)</a></li>
360
361 <li><a href="http://people.skolelinux.org/pere/blog/tags/bsa">bsa (2)</a></li>
362
363 <li><a href="http://people.skolelinux.org/pere/blog/tags/debian">debian (74)</a></li>
364
365 <li><a href="http://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (127)</a></li>
366
367 <li><a href="http://people.skolelinux.org/pere/blog/tags/digistan">digistan (10)</a></li>
368
369 <li><a href="http://people.skolelinux.org/pere/blog/tags/docbook">docbook (9)</a></li>
370
371 <li><a href="http://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (4)</a></li>
372
373 <li><a href="http://people.skolelinux.org/pere/blog/tags/english">english (192)</a></li>
374
375 <li><a href="http://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (21)</a></li>
376
377 <li><a href="http://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (12)</a></li>
378
379 <li><a href="http://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (11)</a></li>
380
381 <li><a href="http://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (11)</a></li>
382
383 <li><a href="http://people.skolelinux.org/pere/blog/tags/intervju">intervju (33)</a></li>
384
385 <li><a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (6)</a></li>
386
387 <li><a href="http://people.skolelinux.org/pere/blog/tags/kart">kart (18)</a></li>
388
389 <li><a href="http://people.skolelinux.org/pere/blog/tags/ldap">ldap (8)</a></li>
390
391 <li><a href="http://people.skolelinux.org/pere/blog/tags/lenker">lenker (6)</a></li>
392
393 <li><a href="http://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (1)</a></li>
394
395 <li><a href="http://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (25)</a></li>
396
397 <li><a href="http://people.skolelinux.org/pere/blog/tags/norsk">norsk (232)</a></li>
398
399 <li><a href="http://people.skolelinux.org/pere/blog/tags/nuug">nuug (152)</a></li>
400
401 <li><a href="http://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (8)</a></li>
402
403 <li><a href="http://people.skolelinux.org/pere/blog/tags/open311">open311 (2)</a></li>
404
405 <li><a href="http://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (44)</a></li>
406
407 <li><a href="http://people.skolelinux.org/pere/blog/tags/personvern">personvern (65)</a></li>
408
409 <li><a href="http://people.skolelinux.org/pere/blog/tags/raid">raid (1)</a></li>
410
411 <li><a href="http://people.skolelinux.org/pere/blog/tags/reprap">reprap (11)</a></li>
412
413 <li><a href="http://people.skolelinux.org/pere/blog/tags/rfid">rfid (2)</a></li>
414
415 <li><a href="http://people.skolelinux.org/pere/blog/tags/robot">robot (7)</a></li>
416
417 <li><a href="http://people.skolelinux.org/pere/blog/tags/rss">rss (1)</a></li>
418
419 <li><a href="http://people.skolelinux.org/pere/blog/tags/ruter">ruter (4)</a></li>
420
421 <li><a href="http://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (2)</a></li>
422
423 <li><a href="http://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (29)</a></li>
424
425 <li><a href="http://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (4)</a></li>
426
427 <li><a href="http://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (4)</a></li>
428
429 <li><a href="http://people.skolelinux.org/pere/blog/tags/standard">standard (42)</a></li>
430
431 <li><a href="http://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (3)</a></li>
432
433 <li><a href="http://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (7)</a></li>
434
435 <li><a href="http://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (15)</a></li>
436
437 <li><a href="http://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (1)</a></li>
438
439 <li><a href="http://people.skolelinux.org/pere/blog/tags/valg">valg (7)</a></li>
440
441 <li><a href="http://people.skolelinux.org/pere/blog/tags/video">video (38)</a></li>
442
443 <li><a href="http://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (4)</a></li>
444
445 <li><a href="http://people.skolelinux.org/pere/blog/tags/web">web (26)</a></li>
446
447 </ul>
448
449
450 </div>
451 <p style="text-align: right">
452 Created by <a href="http://steve.org.uk/Software/chronicle">Chronicle v4.6</a>
453 </p>
454
455 </body>
456 </html>