]> pere.pagekite.me Git - homepage.git/commitdiff
Generated.
authorPetter Reinholdtsen <pere@hungry.com>
Sat, 28 Feb 2009 22:50:59 +0000 (22:50 +0000)
committerPetter Reinholdtsen <pere@hungry.com>
Sat, 28 Feb 2009 22:50:59 +0000 (22:50 +0000)
55 files changed:
blog/Amigafolket_holder_ut.html
blog/Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html [new file with mode: 0644]
blog/Det_vanskelige_Lisensvalget___ikke_lag_din_egen.html
blog/Devcamp_brought_us_closer_to_the_Lenny_based_Debian_Edu_release.html
blog/Elektronikkbyggesettet_for_reprapen_sporet_opp.html
blog/Elektronikkbyggesettet_kommer_fram_p___andre_fors__k.html
blog/Endelig_er_Debian_Lenny_gitt_ut.html
blog/Endelig_norsk_stavekontroll_med_st__tte_for_ord_med_bindestrek.html
blog/FAD_lanserer_reiseregningsskjema_som_fri_programvare.html
blog/F__rste_vellykkede_videostr__m_fra_NUUG.html
blog/Fiksgatami_begynner____ta_form.html
blog/Fri__og___pen_standard__slik_Digistan_ser_det.html
blog/Intellektuelt_privilegium___et_bedre_IP_begrep.html
blog/Jeg_vil_beholde_tusenlappen___jeg_bruker_den.html
blog/Kart_over_overv__kningskamera_i_Norge.html
blog/Mekanikk_delen_av_reprap_byggesettet_i_hus.html
blog/Mekanikk_delen_av_reprap_byggesettet_p___vei.html
blog/Mens_vi_venter_p___3D_skriveren.html
blog/Min_reprap_tar_sakte_form.html
blog/Norge_trenger_en_personvernforening.html
blog/ODF_bruk_i_staten__ikke_helt_p___plass.html
blog/Reprap_pakke_tapt_i_posten.html
blog/Software_video_mixer_on_a_USB_stick.html
blog/Tester_blog.html
blog/The_sorry_state_of_multimedia_browser_plugins_in_Debian.html
blog/Transendentalt_tullball_og_en_funksjonell_tiln__rming.html
blog/Using_bar_codes_at_a_computing_center.html
blog/When_web_browser_developers_make_a_video_player___.html
blog/archive/2008/11/index.html
blog/archive/2008/12/index.html
blog/archive/2009/01/index.html
blog/archive/2009/02/02.rss
blog/archive/2009/02/index.html
blog/data/2009-02-18-protokoll-og-format.txt [new file with mode: 0644]
blog/index.html
blog/index.rss
blog/tags/3d-printer/index.html
blog/tags/amiga/index.html
blog/tags/aros/index.html
blog/tags/debian edu/index.html
blog/tags/debian/index.html
blog/tags/english/english.rss
blog/tags/english/index.html
blog/tags/fiksgatami/index.html
blog/tags/ltsp/index.html
blog/tags/multimedia/index.html
blog/tags/norsk/index.html
blog/tags/nuug/index.html
blog/tags/nuug/nuug.rss
blog/tags/personvern/index.html
blog/tags/reprap/index.html
blog/tags/rss/index.html
blog/tags/stavekontroll/index.html
blog/tags/video/index.html
blog/tags/web/index.html

index a0193180d287c7c07156d5ddc72ea2f36f6555d6..bd46de5a06716b5418baf8e857ce20e32dc1d8ec 100644 (file)
@@ -50,7 +50,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -80,7 +80,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -90,7 +90,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
diff --git a/blog/Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html b/blog/Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html
new file mode 100644 (file)
index 0000000..530b7e7
--- /dev/null
@@ -0,0 +1,244 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+ <head>
+  <title>Petter Reinholdtsen: Checking server hardware support status for Dell, HP and IBM servers</title>
+  <link rel="stylesheet" type="text/css" media="screen" href="style.css">
+ </head>
+ <body>
+
+ <div class="title">
+  <h1>
+       <a href="">Petter Reinholdtsen</a>
+      
+  </h1>
+  
+ </div>
+
+
+ <div class="entry">
+  <div class="title">Checking server hardware support status for Dell, HP and IBM servers</div>
+  <div class="date">2009-02-28 23:50</div>
+  <div class="body">
+<p>At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I've recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.</p>
+
+<p>I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:</p>
+
+<p><pre>
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        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";
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/<[^>]+?>/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = "$3-$1-$2";
+            my $end = "$6-$4-$5";
+            $str = "$start -> $end";
+            my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize->new();
+        my $url =
+            'http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do';
+        $mech->get($url);
+        my $fields = {
+            'BODServiceID' => 'NA',
+            'RegisteredPurchaseDate' => '',
+            'country' => 'NO',
+            'productNumber' => $productnumber,
+            'serialNumber1' => $serial,
+        };
+        $mech->submit_form( form_number => 2,
+                            fields      => $fields );
+        # Next step is screen scraping
+        my $content = $mech->content();
+
+        $content =~ s/<[^>]+?>/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime("%Y-%m-%d",
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime("%Y-%m-%d",
+                                      localtime(str2time($stopstr)));
+
+            $str .= "$type ($status) $start -> $end ";
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype && $serial) {
+            my $content =
+                get("http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&brandind=5000008&Submit=Submit&type=$producttype&serial=$serial");
+            if ($content) {
+                $content =~ s/<[^>]+?>/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= "($status) -> $end ";
+
+                my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+</pre></p>
+
+<p>Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.</p>
+
+<p><pre>
+print get_support_info("hp.host", "HP ProLiant BL460c G1", "1234567890"
+                       "447707-B21");
+print get_support_info("dell.host", "Dell Inc. PowerEdge 2950", "1234567");
+print get_support_info("ibm.host", "IBM eserver xSeries 345 -[867061X]-",
+                       "1234567");
+</pre></p>
+
+<p>I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)</p>
+</div>
+  
+  <div class="tags">Tags: <a href="tags/english">english</a>, <a href="tags/nuug">nuug</a>.</div>
+   
+  </div>
+
+
+
+
+
+
+<div id="sidebar">
+
+<h2>Archive</h2>
+<ul>
+
+<li>2009
+<ul>
+
+<li><a href="archive/2009/01/">January (8)</a></li>
+
+<li><a href="archive/2009/02/">February (8)</a></li>
+
+</ul></li>
+
+<li>2008
+<ul>
+
+<li><a href="archive/2008/11/">November (5)</a></li>
+
+<li><a href="archive/2008/12/">December (7)</a></li>
+
+</ul></li>
+
+</ul>
+
+
+
+<h2>Tags</h2>
+<ul>
+
+ <li><a href="tags/3d-printer">3d-printer (7)</a></li>
+
+ <li><a href="tags/amiga">amiga (1)</a></li>
+
+ <li><a href="tags/aros">aros (1)</a></li>
+
+ <li><a href="tags/debian">debian (3)</a></li>
+
+ <li><a href="tags/debian edu">debian edu (4)</a></li>
+
+ <li><a href="tags/english">english (6)</a></li>
+
+ <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
+
+ <li><a href="tags/ltsp">ltsp (1)</a></li>
+
+ <li><a href="tags/multimedia">multimedia (2)</a></li>
+
+ <li><a href="tags/norsk">norsk (22)</a></li>
+
+ <li><a href="tags/nuug">nuug (20)</a></li>
+
+ <li><a href="tags/personvern">personvern (3)</a></li>
+
+ <li><a href="tags/reprap">reprap (7)</a></li>
+
+ <li><a href="tags/rss">rss (1)</a></li>
+
+ <li><a href="tags/stavekontroll">stavekontroll (1)</a></li>
+
+ <li><a href="tags/video">video (3)</a></li>
+
+ <li><a href="tags/web">web (2)</a></li>
+
+</ul>
+
+</div>
+ </body>
+</html>
index 7b6b79bfaf626443af654689d6989be113ec06d2..7f4b76b05ea7aff8cada2f06611b2a32ad48d478 100644 (file)
@@ -137,7 +137,7 @@ og endrer på betingelsene.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -167,7 +167,7 @@ og endrer på betingelsene.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -177,7 +177,7 @@ og endrer på betingelsene.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 0cf9673fc5a284873fca93f53d052d414aaaef0e..ce05dce8a3e2da92757d8e7de322c7474f9ae59a 100644 (file)
@@ -55,7 +55,7 @@ of these cards.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -85,7 +85,7 @@ of these cards.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -95,7 +95,7 @@ of these cards.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 2a65e1ededfa73abfdfd7611065e401de5adc851..8803600a86c335e3c97adb8760288c4abb4fc52d 100644 (file)
@@ -57,7 +57,7 @@ jul.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -87,7 +87,7 @@ jul.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -97,7 +97,7 @@ jul.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index eba1a0821bc1b6b3a4d9c6b8621d7602f16e7c6c..9c80066172fdf36b12880cfe6906c2984364c964 100644 (file)
@@ -80,7 +80,7 @@ påstår det skulle skje i 2008.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -110,7 +110,7 @@ påstår det skulle skje i 2008.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -120,7 +120,7 @@ påstår det skulle skje i 2008.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index b013b451545a970a2cbe6ffebfa8a59ac9537939..70f46d8061f88be8ba2c3db35976528b8b7b0852 100644 (file)
@@ -53,7 +53,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -83,7 +83,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -93,7 +93,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index b69bf11f817b2012af7a31a96cbfc7b3e9917f12..47b71c0106c46941695777a64ebabb131d0a2881 100644 (file)
@@ -64,7 +64,7 @@ stavekontrollen.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -94,7 +94,7 @@ stavekontrollen.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -104,7 +104,7 @@ stavekontrollen.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 22f013a5d7c505f3ffd63d28fe8df055ea625026..8c9aea5a6eba4f937ca81977a289c2041ac8a718 100644 (file)
@@ -118,7 +118,7 @@ gjorde det litt vanskeligere for brukeren.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -148,7 +148,7 @@ gjorde det litt vanskeligere for brukeren.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -158,7 +158,7 @@ gjorde det litt vanskeligere for brukeren.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 7c0628c6cb46a69597bc69debd20d116bb8f7ac4..a15d39527cf60519082b55accc72d7109ccfa58a 100644 (file)
@@ -51,7 +51,7 @@ webserver og komprimert.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -81,7 +81,7 @@ webserver og komprimert.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -91,7 +91,7 @@ webserver og komprimert.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 56b23b710d7ff4d3e4f0ba7a8135becad9b87fe2..92c20132a34e6752b5980c20e94d3e2eb3ad8976 100644 (file)
@@ -59,7 +59,7 @@ med dem.  Dette blir bra.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -89,7 +89,7 @@ med dem.  Dette blir bra.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -99,7 +99,7 @@ med dem.  Dette blir bra.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 0fe0e326ae3c3414324fa12f4663633d57e1318c..961be39384e6a78bd61efbe13c8cf145f79dd66b 100644 (file)
@@ -92,7 +92,7 @@ produkter basert på standarden.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -122,7 +122,7 @@ produkter basert på standarden.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -132,7 +132,7 @@ produkter basert på standarden.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index ad48d0c7525459fa0d26fd042b0e60b25b49fe74..23c52196f8aa6cd1405eea9fd36af70fbe659388 100644 (file)
@@ -61,7 +61,7 @@ forretningshemmeligheter framover.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -91,7 +91,7 @@ forretningshemmeligheter framover.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -101,7 +101,7 @@ forretningshemmeligheter framover.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 53d91efa80c7fa7cbbac06e62f17fe82c3271b73..a88e4af1d79e189aafbe0a7250a6b93048a2faf5 100644 (file)
@@ -90,7 +90,7 @@ kontanter for noen dager siden.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -120,7 +120,7 @@ kontanter for noen dager siden.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -130,7 +130,7 @@ kontanter for noen dager siden.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 501b11d199af5f0b4e9b46fc27ad3ecd059c4a2f..1288183f32ccdba8b28d85c3ec7575307e884bb2 100644 (file)
@@ -59,7 +59,7 @@ automatisk over i spesialkartet.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -89,7 +89,7 @@ automatisk over i spesialkartet.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -99,7 +99,7 @@ automatisk over i spesialkartet.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 4f2c39eb7e2fbf76a6f4c311636c8a55159b9d0a..5a26b7e114a7cdc0d2a51784e35fd5a40d3d9e1b 100644 (file)
@@ -58,7 +58,7 @@ og kan melde seg på aktive@nuug.no.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -88,7 +88,7 @@ og kan melde seg på aktive@nuug.no.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -98,7 +98,7 @@ og kan melde seg på aktive@nuug.no.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index e15440d0793576c3c565128d342c1ccf1d50e8d9..32f927eac8718d3f5a45a7dbba192d7bf16f0068 100644 (file)
@@ -50,7 +50,7 @@ bort første pakke.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -80,7 +80,7 @@ bort første pakke.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -90,7 +90,7 @@ bort første pakke.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index c1720881329775496ee13a0561aaf7b0e66c6522..3635f9a62fc59faebd1b2ce6700c4c83abf13b59 100644 (file)
@@ -62,7 +62,7 @@ håper det ikke går tapt på samme vis.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -92,7 +92,7 @@ håper det ikke går tapt på samme vis.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -102,7 +102,7 @@ håper det ikke går tapt på samme vis.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index e318157dd4e0be5190b076d2a8999160cd2d18e6..0ce65034bede9f665a87ba555d46a6340c4221b7 100644 (file)
@@ -72,7 +72,7 @@ arbeidet.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -102,7 +102,7 @@ arbeidet.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -112,7 +112,7 @@ arbeidet.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 9bf9d7a751eefb0d6eb6935dae1e8e47bf5e5ab4..65c44843f853431909acb1f5857a87798a153b64 100644 (file)
@@ -54,7 +54,7 @@ nå får vi se om noen er enig.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -84,7 +84,7 @@ nå får vi se om noen er enig.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -94,7 +94,7 @@ nå får vi se om noen er enig.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 8ccf185796916111716d1909ee8804a9454fbb01..045dbaa168efe6b7f17e0a20c466000f949994e9 100644 (file)
@@ -54,7 +54,7 @@ Kjenner kun til ufullstendige løsninger for slikt.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -84,7 +84,7 @@ Kjenner kun til ufullstendige løsninger for slikt.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -94,7 +94,7 @@ Kjenner kun til ufullstendige løsninger for slikt.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index d471eaf5630fa027e0fee3bcb5e64983a0d5af31..a951a27cedc751ec693e8e328f9626c96f6166f4 100644 (file)
@@ -50,7 +50,7 @@ lenge alt er klart til <a href="http://www.goopen.no/">Go Open
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -80,7 +80,7 @@ lenge alt er klart til <a href="http://www.goopen.no/">Go Open
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -90,7 +90,7 @@ lenge alt er klart til <a href="http://www.goopen.no/">Go Open
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index f4c6b2e32a1f0f48f183cbc53b68d7552ddff047..e36e6fffa0c352a357c8cfe2a28a913cea9936a3 100644 (file)
@@ -65,7 +65,7 @@ larger stick as well.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -95,7 +95,7 @@ larger stick as well.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -105,7 +105,7 @@ larger stick as well.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 45ae3a7b0fce6a0bab0387750e4ddcf7a8dfdeab..d80c390e018a859d5f3e3829e026baa7cfeda1c7 100644 (file)
@@ -44,7 +44,7 @@ forsøk.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -74,7 +74,7 @@ forsøk.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -84,7 +84,7 @@ forsøk.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 8bba95c1de59dcc02ef9a47404be9f1f7d5b9f7d..51076d0b1651106b26d1b765bd8c458ae5a9f309 100644 (file)
@@ -59,7 +59,7 @@ be the only one fitting our needs. :/</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -89,7 +89,7 @@ be the only one fitting our needs. :/</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -99,7 +99,7 @@ be the only one fitting our needs. :/</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index e12e779e4fd24d437240b9ea9cf489d40b131f86..bbab58d58e01396cc175e294690a72fbf3ee7911 100644 (file)
@@ -60,7 +60,7 @@ oppløsning.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -90,7 +90,7 @@ oppløsning.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -100,7 +100,7 @@ oppløsning.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 40fdee05f16a8fbb059f21ebdbda3eabe13df895..667b665514c1dc0d6e35ce37f61c6a625a878cfc 100644 (file)
@@ -82,7 +82,7 @@ easier automatic tracking of computers.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -112,7 +112,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -122,7 +122,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 49d8eabba6f13d58584fd56c76cd488d68de00e1..286d30bd1d066ef5af6da7ddcbecd3da074baaa4 100644 (file)
@@ -83,7 +83,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -113,7 +113,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -123,7 +123,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index be127e5e9150485ae24554d3f22951a31d5632cb..e71d4f591af15560222a78fe33007d58491870b9 100644 (file)
@@ -204,7 +204,7 @@ lenge alt er klart til <a href="http://www.goopen.no/">Go Open
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -234,7 +234,7 @@ lenge alt er klart til <a href="http://www.goopen.no/">Go Open
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../../tags/english">english (5)</a></li>
+ <li><a href="../../../tags/english">english (6)</a></li>
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -244,7 +244,7 @@ lenge alt er klart til <a href="http://www.goopen.no/">Go Open
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
index 3bf8e2a8b25c41bd02dcd21b0cb9a957895759a7..21abbd0c10cb6163a0f22ffce9f8cff7ee6ce3f3 100644 (file)
@@ -368,7 +368,7 @@ larger stick as well.</p>
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -398,7 +398,7 @@ larger stick as well.</p>
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../../tags/english">english (5)</a></li>
+ <li><a href="../../../tags/english">english (6)</a></li>
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -408,7 +408,7 @@ larger stick as well.</p>
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
index cb2547e92ccfb50084a38fd4909ff2aafcc5fd3c..e8e63629c123e73ea3693775123029c7fea20bfe 100644 (file)
@@ -537,7 +537,7 @@ produkter basert på standarden.</p>
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -567,7 +567,7 @@ produkter basert på standarden.</p>
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../../tags/english">english (5)</a></li>
+ <li><a href="../../../tags/english">english (6)</a></li>
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -577,7 +577,7 @@ produkter basert på standarden.</p>
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
index 600f3830912169892275f33615be8e4729590c44..b6364f1a32fc512a8b7312f90e9164b950c12f65 100644 (file)
@@ -214,5 +214,156 @@ easier automatic tracking of computers.&lt;/p&gt;
 </description>
        </item>
        
 </description>
        </item>
        
+       <item>
+               <title>Checking server hardware support status for Dell, HP and IBM servers</title>
+               <link>../../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</link>        
+               <guid isPermaLink="true">../../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</guid>
+                <pubDate>Sat, 28 Feb 2009 23:50:00 +0100</pubDate>
+               <description>
+&lt;p&gt;At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I&#39;ve recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.&lt;/p&gt;
+
+&lt;p&gt;I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        my $url = &quot;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&quot;;
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = &quot;$3-$1-$2&quot;;
+            my $end = &quot;$6-$4-$5&quot;;
+            $str = &quot;$start -&gt; $end&quot;;
+            my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize-&gt;new();
+        my $url =
+            &#39;http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do&#39;;
+        $mech-&gt;get($url);
+        my $fields = {
+            &#39;BODServiceID&#39; =&gt; &#39;NA&#39;,
+            &#39;RegisteredPurchaseDate&#39; =&gt; &#39;&#39;,
+            &#39;country&#39; =&gt; &#39;NO&#39;,
+            &#39;productNumber&#39; =&gt; $productnumber,
+            &#39;serialNumber1&#39; =&gt; $serial,
+        };
+        $mech-&gt;submit_form( form_number =&gt; 2,
+                            fields      =&gt; $fields );
+        # Next step is screen scraping
+        my $content = $mech-&gt;content();
+
+        $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                      localtime(str2time($stopstr)));
+
+            $str .= &quot;$type ($status) $start -&gt; $end &quot;;
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype &amp;&amp; $serial) {
+            my $content =
+                get(&quot;http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&amp;brandind=5000008&amp;Submit=Submit&amp;type=$producttype&amp;serial=$serial&quot;);
+            if ($content) {
+                $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= &quot;($status) -&gt; $end &quot;;
+
+                my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+print get_support_info(&quot;hp.host&quot;, &quot;HP ProLiant BL460c G1&quot;, &quot;1234567890&quot;
+                       &quot;447707-B21&quot;);
+print get_support_info(&quot;dell.host&quot;, &quot;Dell Inc. PowerEdge 2950&quot;, &quot;1234567&quot;);
+print get_support_info(&quot;ibm.host&quot;, &quot;IBM eserver xSeries 345 -[867061X]-&quot;,
+                       &quot;1234567&quot;);
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)&lt;/p&gt;
+</description>
+       </item>
+       
         </channel>
 </rss>
         </channel>
 </rss>
index 8c0ac400166db57f57c0524f6cde4c965c259487..1175b02540b00565738c4013dc974c053c445fa7 100644 (file)
@@ -313,6 +313,170 @@ easier automatic tracking of computers.</p>
  
 
  
  
 
  
+  Tags: <a href="../../../tags/english">english</a>, <a href="../../../tags/nuug">nuug</a>.
+ </div>
+</div>
+ <div class="padding"></div>
+
+<div class="entry">
+ <div class="title">
+ <a href="../../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html">Checking server hardware support status for Dell, HP and IBM servers</a>
+ </div>
+ <div class="date">
+  2009-02-28 23:50
+ </div>
+
+ <div class="body">
+  
+<p>At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I've recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.</p>
+
+<p>I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:</p>
+
+<p><pre>
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        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";
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/<[^>]+?>/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = "$3-$1-$2";
+            my $end = "$6-$4-$5";
+            $str = "$start -> $end";
+            my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize->new();
+        my $url =
+            'http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do';
+        $mech->get($url);
+        my $fields = {
+            'BODServiceID' => 'NA',
+            'RegisteredPurchaseDate' => '',
+            'country' => 'NO',
+            'productNumber' => $productnumber,
+            'serialNumber1' => $serial,
+        };
+        $mech->submit_form( form_number => 2,
+                            fields      => $fields );
+        # Next step is screen scraping
+        my $content = $mech->content();
+
+        $content =~ s/<[^>]+?>/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime("%Y-%m-%d",
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime("%Y-%m-%d",
+                                      localtime(str2time($stopstr)));
+
+            $str .= "$type ($status) $start -> $end ";
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype && $serial) {
+            my $content =
+                get("http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&brandind=5000008&Submit=Submit&type=$producttype&serial=$serial");
+            if ($content) {
+                $content =~ s/<[^>]+?>/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= "($status) -> $end ";
+
+                my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+</pre></p>
+
+<p>Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.</p>
+
+<p><pre>
+print get_support_info("hp.host", "HP ProLiant BL460c G1", "1234567890"
+                       "447707-B21");
+print get_support_info("dell.host", "Dell Inc. PowerEdge 2950", "1234567");
+print get_support_info("ibm.host", "IBM eserver xSeries 345 -[867061X]-",
+                       "1234567");
+</pre></p>
+
+<p>I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)</p>
+
+ </div>
+ <div class="tags">
+
   Tags: <a href="../../../tags/english">english</a>, <a href="../../../tags/nuug">nuug</a>.
  
  </div>
   Tags: <a href="../../../tags/english">english</a>, <a href="../../../tags/nuug">nuug</a>.
  
  </div>
@@ -333,7 +497,7 @@ easier automatic tracking of computers.</p>
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -363,7 +527,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../../tags/english">english (5)</a></li>
+ <li><a href="../../../tags/english">english (6)</a></li>
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -373,7 +537,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../../tags/personvern">personvern (3)</a></li>
 
diff --git a/blog/data/2009-02-18-protokoll-og-format.txt b/blog/data/2009-02-18-protokoll-og-format.txt
new file mode 100644 (file)
index 0000000..8441553
--- /dev/null
@@ -0,0 +1,25 @@
+Title: Standardize on protocols and formats, not vendors and applications
+Tags: english
+Date: 2009-02-18 11:50
+Publish: 2010-01-01
+
+Where I work, one of the decisions 
+
+ - on network protocols and exchange formats
+   - open standards is a clear advantage
+ - give support on applications
+  - allow other apps
+ - allow us to change clients and keep the servers, or replace the
+   servers and keep the clients
+
+ - smtp
+ - imap
+ - nfs
+ - ldap
+ - ntp
+ - X11
+ - syslog
+ - ODF
+ - text
+ - html
+ - rst
index 95f2871c877cbf7d3f692ddeb0ca47399742c706..09f494e8af4d4da49f832acce84ddd980561e0d1 100644 (file)
 
 
  
 
 
  
+ <div class="entry">
+  <div class="title"><a href="Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html">Checking server hardware support status for Dell, HP and IBM servers</a></div>
+  <div class="date">2009-02-28 23:50</div>
+  <div class="body">
+<p>At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I've recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.</p>
+
+<p>I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:</p>
+
+<p><pre>
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        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";
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/<[^>]+?>/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = "$3-$1-$2";
+            my $end = "$6-$4-$5";
+            $str = "$start -> $end";
+            my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize->new();
+        my $url =
+            'http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do';
+        $mech->get($url);
+        my $fields = {
+            'BODServiceID' => 'NA',
+            'RegisteredPurchaseDate' => '',
+            'country' => 'NO',
+            'productNumber' => $productnumber,
+            'serialNumber1' => $serial,
+        };
+        $mech->submit_form( form_number => 2,
+                            fields      => $fields );
+        # Next step is screen scraping
+        my $content = $mech->content();
+
+        $content =~ s/<[^>]+?>/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime("%Y-%m-%d",
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime("%Y-%m-%d",
+                                      localtime(str2time($stopstr)));
+
+            $str .= "$type ($status) $start -> $end ";
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype && $serial) {
+            my $content =
+                get("http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&brandind=5000008&Submit=Submit&type=$producttype&serial=$serial");
+            if ($content) {
+                $content =~ s/<[^>]+?>/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= "($status) -> $end ";
+
+                my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+</pre></p>
+
+<p>Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.</p>
+
+<p><pre>
+print get_support_info("hp.host", "HP ProLiant BL460c G1", "1234567890"
+                       "447707-B21");
+print get_support_info("dell.host", "Dell Inc. PowerEdge 2950", "1234567");
+print get_support_info("ibm.host", "IBM eserver xSeries 345 -[867061X]-",
+                       "1234567");
+</pre></p>
+
+<p>I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)</p>
+</div>
+  <div class="tags">
+   
+
+   
+   Tags: <a href="tags/english">english</a>, <a href="tags/nuug">nuug</a>. 
+  
+  </div>
+ </div>
+ <div class="padding"></div>
  <div class="entry">
   <div class="title"><a href="Using_bar_codes_at_a_computing_center.html">Using bar codes at a computing center</a></div>
   <div class="date">2009-02-20 08:50</div>
  <div class="entry">
   <div class="title"><a href="Using_bar_codes_at_a_computing_center.html">Using bar codes at a computing center</a></div>
   <div class="date">2009-02-20 08:50</div>
@@ -363,34 +520,6 @@ oppløsning.</p>
    
 
    
    
 
    
-   Tags: <a href="tags/norsk">norsk</a>, <a href="tags/nuug">nuug</a>. 
-  
-  </div>
- </div>
- <div class="padding"></div>
- <div class="entry">
-  <div class="title"><a href="ODF_bruk_i_staten__ikke_helt_p___plass.html">ODF-bruk i staten, ikke helt på plass</a></div>
-  <div class="date">2009-01-22 23:00</div>
-  <div class="body">
-<p>I går publiserte
-<a href="http://universitas.no/nyhet/52776/">Universitas</a>,
-<a href="http://www.dagensit.no/trender/article1588462.ece">Dagens-IT</a>
-og <a href="http://www.idg.no/computerworld/article118622.ece">Computerworld
-Norge</a> en sak om at de ansatte ved Universitetet i Oslo ikke følger
-regjeringens pålegg om å publisere i HTML, PDF eller ODF.  Det er bra
-at det kommer litt fokus på dette, og jeg håper noen journalister tar
-en titt på de andre statlige instansene også.</p>
-
-<p>Skulle ønske det var en enkel måte å sjekke om ODF-dokumenter er i
-henholdt til ODF-spesifikasjonen, og en måte å teste om programmer som
-hevder å støtte ODF forstår alle delene av ODF-spesifikasjonen.
-Kjenner kun til ufullstendige løsninger for slikt.</p>
-</div>
-  <div class="tags">
-   
-
-   
    Tags: <a href="tags/norsk">norsk</a>, <a href="tags/nuug">nuug</a>. 
   
   </div>
    Tags: <a href="tags/norsk">norsk</a>, <a href="tags/nuug">nuug</a>. 
   
   </div>
@@ -413,7 +542,7 @@ Kjenner kun til ufullstendige løsninger for slikt.</p>
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="archive/2009/01/">January (8)</a></li>
 
-<li><a href="archive/2009/02/">February (7)</a></li>
+<li><a href="archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -443,7 +572,7 @@ Kjenner kun til ufullstendige løsninger for slikt.</p>
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="tags/english">english (5)</a></li>
+ <li><a href="tags/english">english (6)</a></li>
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -453,7 +582,7 @@ Kjenner kun til ufullstendige løsninger for slikt.</p>
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="tags/norsk">norsk (22)</a></li>
 
- <li><a href="tags/nuug">nuug (19)</a></li>
+ <li><a href="tags/nuug">nuug (20)</a></li>
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="tags/personvern">personvern (3)</a></li>
 
index 07e4a9b7b4997d046c6f434b0cb7989bb41d324a..c593ae74dfbb66d7836cc7a413177054a62e3af0 100644 (file)
@@ -6,6 +6,157 @@
                 <link></link>
                 <atom:link href="index.rss" rel="self" type="application/rss+xml" />
        
                 <link></link>
                 <atom:link href="index.rss" rel="self" type="application/rss+xml" />
        
+       <item>
+               <title>Checking server hardware support status for Dell, HP and IBM servers</title>
+               <link>Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</link>
+               <guid isPermaLink="true">Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</guid>
+                <pubDate>Sat, 28 Feb 2009 23:50:00 +0100</pubDate>
+               <description>
+&lt;p&gt;At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I&#39;ve recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.&lt;/p&gt;
+
+&lt;p&gt;I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        my $url = &quot;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&quot;;
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = &quot;$3-$1-$2&quot;;
+            my $end = &quot;$6-$4-$5&quot;;
+            $str = &quot;$start -&gt; $end&quot;;
+            my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize-&gt;new();
+        my $url =
+            &#39;http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do&#39;;
+        $mech-&gt;get($url);
+        my $fields = {
+            &#39;BODServiceID&#39; =&gt; &#39;NA&#39;,
+            &#39;RegisteredPurchaseDate&#39; =&gt; &#39;&#39;,
+            &#39;country&#39; =&gt; &#39;NO&#39;,
+            &#39;productNumber&#39; =&gt; $productnumber,
+            &#39;serialNumber1&#39; =&gt; $serial,
+        };
+        $mech-&gt;submit_form( form_number =&gt; 2,
+                            fields      =&gt; $fields );
+        # Next step is screen scraping
+        my $content = $mech-&gt;content();
+
+        $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                      localtime(str2time($stopstr)));
+
+            $str .= &quot;$type ($status) $start -&gt; $end &quot;;
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype &amp;&amp; $serial) {
+            my $content =
+                get(&quot;http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&amp;brandind=5000008&amp;Submit=Submit&amp;type=$producttype&amp;serial=$serial&quot;);
+            if ($content) {
+                $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= &quot;($status) -&gt; $end &quot;;
+
+                my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+print get_support_info(&quot;hp.host&quot;, &quot;HP ProLiant BL460c G1&quot;, &quot;1234567890&quot;
+                       &quot;447707-B21&quot;);
+print get_support_info(&quot;dell.host&quot;, &quot;Dell Inc. PowerEdge 2950&quot;, &quot;1234567&quot;);
+print get_support_info(&quot;ibm.host&quot;, &quot;IBM eserver xSeries 345 -[867061X]-&quot;,
+                       &quot;1234567&quot;);
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)&lt;/p&gt;
+</description>
+       </item>
+       
        <item>
                <title>Using bar codes at a computing center</title>
                <link>Using_bar_codes_at_a_computing_center.html</link>
        <item>
                <title>Using bar codes at a computing center</title>
                <link>Using_bar_codes_at_a_computing_center.html</link>
@@ -302,27 +453,5 @@ oppløsning.&lt;/p&gt;
 </description>
        </item>
        
 </description>
        </item>
        
-       <item>
-               <title>ODF-bruk i staten, ikke helt på plass</title>
-               <link>ODF_bruk_i_staten__ikke_helt_p___plass.html</link>
-               <guid isPermaLink="true">ODF_bruk_i_staten__ikke_helt_p___plass.html</guid>
-                <pubDate>Thu, 22 Jan 2009 23:00:00 +0100</pubDate>
-               <description>
-&lt;p&gt;I går publiserte
-&lt;a href=&quot;http://universitas.no/nyhet/52776/&quot;&gt;Universitas&lt;/a&gt;,
-&lt;a href=&quot;http://www.dagensit.no/trender/article1588462.ece&quot;&gt;Dagens-IT&lt;/a&gt;
-og &lt;a href=&quot;http://www.idg.no/computerworld/article118622.ece&quot;&gt;Computerworld
-Norge&lt;/a&gt; en sak om at de ansatte ved Universitetet i Oslo ikke følger
-regjeringens pålegg om å publisere i HTML, PDF eller ODF.  Det er bra
-at det kommer litt fokus på dette, og jeg håper noen journalister tar
-en titt på de andre statlige instansene også.&lt;/p&gt;
-
-&lt;p&gt;Skulle ønske det var en enkel måte å sjekke om ODF-dokumenter er i
-henholdt til ODF-spesifikasjonen, og en måte å teste om programmer som
-hevder å støtte ODF forstår alle delene av ODF-spesifikasjonen.
-Kjenner kun til ufullstendige løsninger for slikt.&lt;/p&gt;
-</description>
-       </item>
-       
         </channel>
 </rss>
         </channel>
 </rss>
index f662d1f8000d68fa7065157afdaca2eb89d65cc6..3639b95d5a94a87b84741f61d2ff2ef99b58796a 100644 (file)
@@ -332,7 +332,7 @@ arbeidet.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -362,7 +362,7 @@ arbeidet.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -372,7 +372,7 @@ arbeidet.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 24ca55a90d143179e98d67f083ad01ad93e5d2bf..9678eba4f57cd998d3091d74da857f5f0fde6e4f 100644 (file)
@@ -67,7 +67,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -97,7 +97,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -107,7 +107,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 8be1ee098679c12e35470cd9a49800116ad43e8d..63b5714faf102737db4e89eec72e1907c031919b 100644 (file)
@@ -67,7 +67,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -97,7 +97,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -107,7 +107,7 @@ pakke.  Kanskje Aros kunne vært interessant for et NUUG-foredrag?</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 3fa83523fffa4a4a066e793e5073c0865ac50092..f6d78719f17a424cba74721309e4a8fb0163ea9e 100644 (file)
@@ -191,7 +191,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -221,7 +221,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -231,7 +231,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 3ca7fda4da0ef922643c1bc4565f072dcaa7d671..55c055364f5e377521fcd8c69a3d039c9297d769 100644 (file)
@@ -146,7 +146,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -176,7 +176,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -186,7 +186,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index b44bf92226dc12f7268633c283d924b12e515fd8..f329c7b6b6c6050360b2a86287ccaf9010f41b95 100644 (file)
@@ -190,5 +190,156 @@ easier automatic tracking of computers.&lt;/p&gt;
 </description>
        </item>
        
 </description>
        </item>
        
+       <item>
+               <title>Checking server hardware support status for Dell, HP and IBM servers</title>
+               <link>../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</link>        
+               <guid isPermaLink="true">../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</guid>
+                <pubDate>Sat, 28 Feb 2009 23:50:00 +0100</pubDate>
+               <description>
+&lt;p&gt;At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I&#39;ve recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.&lt;/p&gt;
+
+&lt;p&gt;I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        my $url = &quot;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&quot;;
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = &quot;$3-$1-$2&quot;;
+            my $end = &quot;$6-$4-$5&quot;;
+            $str = &quot;$start -&gt; $end&quot;;
+            my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize-&gt;new();
+        my $url =
+            &#39;http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do&#39;;
+        $mech-&gt;get($url);
+        my $fields = {
+            &#39;BODServiceID&#39; =&gt; &#39;NA&#39;,
+            &#39;RegisteredPurchaseDate&#39; =&gt; &#39;&#39;,
+            &#39;country&#39; =&gt; &#39;NO&#39;,
+            &#39;productNumber&#39; =&gt; $productnumber,
+            &#39;serialNumber1&#39; =&gt; $serial,
+        };
+        $mech-&gt;submit_form( form_number =&gt; 2,
+                            fields      =&gt; $fields );
+        # Next step is screen scraping
+        my $content = $mech-&gt;content();
+
+        $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                      localtime(str2time($stopstr)));
+
+            $str .= &quot;$type ($status) $start -&gt; $end &quot;;
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype &amp;&amp; $serial) {
+            my $content =
+                get(&quot;http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&amp;brandind=5000008&amp;Submit=Submit&amp;type=$producttype&amp;serial=$serial&quot;);
+            if ($content) {
+                $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= &quot;($status) -&gt; $end &quot;;
+
+                my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+print get_support_info(&quot;hp.host&quot;, &quot;HP ProLiant BL460c G1&quot;, &quot;1234567890&quot;
+                       &quot;447707-B21&quot;);
+print get_support_info(&quot;dell.host&quot;, &quot;Dell Inc. PowerEdge 2950&quot;, &quot;1234567&quot;);
+print get_support_info(&quot;ibm.host&quot;, &quot;IBM eserver xSeries 345 -[867061X]-&quot;,
+                       &quot;1234567&quot;);
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)&lt;/p&gt;
+</description>
+       </item>
+       
         </channel>
 </rss>
         </channel>
 </rss>
index 2edc1c0aa9864aa4bbb1694c82dcafad9a689d00..039f4510cb0cbdbb5033776c18564afad71fd653 100644 (file)
@@ -264,6 +264,170 @@ easier automatic tracking of computers.</p>
  
 
  
  
 
  
+  Tags: <a href="../../tags/english">english</a>, <a href="../../tags/nuug">nuug</a>.
+ </div>
+</div>
+<div class="padding"></div>
+
+<div class="entry">
+ <div class="title">
+ <a href="../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html">Checking server hardware support status for Dell, HP and IBM servers</a>
+ </div>
+ <div class="date">
+  2009-02-28 23:50
+ </div>
+
+ <div class="body">
+  
+<p>At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I've recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.</p>
+
+<p>I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:</p>
+
+<p><pre>
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        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";
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/<[^>]+?>/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = "$3-$1-$2";
+            my $end = "$6-$4-$5";
+            $str = "$start -> $end";
+            my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize->new();
+        my $url =
+            'http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do';
+        $mech->get($url);
+        my $fields = {
+            'BODServiceID' => 'NA',
+            'RegisteredPurchaseDate' => '',
+            'country' => 'NO',
+            'productNumber' => $productnumber,
+            'serialNumber1' => $serial,
+        };
+        $mech->submit_form( form_number => 2,
+                            fields      => $fields );
+        # Next step is screen scraping
+        my $content = $mech->content();
+
+        $content =~ s/<[^>]+?>/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime("%Y-%m-%d",
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime("%Y-%m-%d",
+                                      localtime(str2time($stopstr)));
+
+            $str .= "$type ($status) $start -> $end ";
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype && $serial) {
+            my $content =
+                get("http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&brandind=5000008&Submit=Submit&type=$producttype&serial=$serial");
+            if ($content) {
+                $content =~ s/<[^>]+?>/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= "($status) -> $end ";
+
+                my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+</pre></p>
+
+<p>Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.</p>
+
+<p><pre>
+print get_support_info("hp.host", "HP ProLiant BL460c G1", "1234567890"
+                       "447707-B21");
+print get_support_info("dell.host", "Dell Inc. PowerEdge 2950", "1234567");
+print get_support_info("ibm.host", "IBM eserver xSeries 345 -[867061X]-",
+                       "1234567");
+</pre></p>
+
+<p>I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)</p>
+
+ </div>
+ <div class="tags">
+
   Tags: <a href="../../tags/english">english</a>, <a href="../../tags/nuug">nuug</a>.
  
  </div>
   Tags: <a href="../../tags/english">english</a>, <a href="../../tags/nuug">nuug</a>.
  
  </div>
@@ -285,7 +449,7 @@ easier automatic tracking of computers.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -315,7 +479,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -325,7 +489,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 46d5d163952a4176932d34d953c0c50aa7e39631..0fb79a5d6342ea23ee024df1831f350c4d7f2702 100644 (file)
@@ -76,7 +76,7 @@ med dem.  Dette blir bra.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -106,7 +106,7 @@ med dem.  Dette blir bra.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -116,7 +116,7 @@ med dem.  Dette blir bra.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index a7243da93e51825d9cbe1ed79258bc2bfc50921d..14c2e008007f37beafe7a7843fb1ba4655c9e964 100644 (file)
@@ -72,7 +72,7 @@ of these cards.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -102,7 +102,7 @@ of these cards.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -112,7 +112,7 @@ of these cards.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index cb31002246e5e7a189b942bca3f31518a7497f85..fa097a88e3ce4ce21e361feb65f09e92a8c3d055 100644 (file)
@@ -140,7 +140,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -170,7 +170,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -180,7 +180,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 5df4482c75d0871e1164260832308bb88a73e927..4cff29b406c12c0e1a0f5b52656a51c98459c36b 100644 (file)
@@ -1093,7 +1093,7 @@ automatisk over i spesialkartet.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -1123,7 +1123,7 @@ automatisk over i spesialkartet.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -1133,7 +1133,7 @@ automatisk over i spesialkartet.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 8232c2db9d4863a93a33ae9c0dadd657c9baf84e..4ae881dc31a0b96a98146357e58d171f4e857c8f 100644 (file)
@@ -995,6 +995,170 @@ easier automatic tracking of computers.</p>
  
 
  
  
 
  
+  Tags: <a href="../../tags/english">english</a>, <a href="../../tags/nuug">nuug</a>.
+ </div>
+</div>
+<div class="padding"></div>
+
+<div class="entry">
+ <div class="title">
+ <a href="../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html">Checking server hardware support status for Dell, HP and IBM servers</a>
+ </div>
+ <div class="date">
+  2009-02-28 23:50
+ </div>
+
+ <div class="body">
+  
+<p>At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I've recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.</p>
+
+<p>I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:</p>
+
+<p><pre>
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        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";
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/<[^>]+?>/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = "$3-$1-$2";
+            my $end = "$6-$4-$5";
+            $str = "$start -> $end";
+            my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize->new();
+        my $url =
+            'http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do';
+        $mech->get($url);
+        my $fields = {
+            'BODServiceID' => 'NA',
+            'RegisteredPurchaseDate' => '',
+            'country' => 'NO',
+            'productNumber' => $productnumber,
+            'serialNumber1' => $serial,
+        };
+        $mech->submit_form( form_number => 2,
+                            fields      => $fields );
+        # Next step is screen scraping
+        my $content = $mech->content();
+
+        $content =~ s/<[^>]+?>/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime("%Y-%m-%d",
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime("%Y-%m-%d",
+                                      localtime(str2time($stopstr)));
+
+            $str .= "$type ($status) $start -> $end ";
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype && $serial) {
+            my $content =
+                get("http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&brandind=5000008&Submit=Submit&type=$producttype&serial=$serial");
+            if ($content) {
+                $content =~ s/<[^>]+?>/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= "($status) -> $end ";
+
+                my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+</pre></p>
+
+<p>Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.</p>
+
+<p><pre>
+print get_support_info("hp.host", "HP ProLiant BL460c G1", "1234567890"
+                       "447707-B21");
+print get_support_info("dell.host", "Dell Inc. PowerEdge 2950", "1234567");
+print get_support_info("ibm.host", "IBM eserver xSeries 345 -[867061X]-",
+                       "1234567");
+</pre></p>
+
+<p>I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)</p>
+
+ </div>
+ <div class="tags">
+
   Tags: <a href="../../tags/english">english</a>, <a href="../../tags/nuug">nuug</a>.
  
  </div>
   Tags: <a href="../../tags/english">english</a>, <a href="../../tags/nuug">nuug</a>.
  
  </div>
@@ -1016,7 +1180,7 @@ easier automatic tracking of computers.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -1046,7 +1210,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -1056,7 +1220,7 @@ easier automatic tracking of computers.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 0d5295e7dcf3a26d37c7f128e9758abf7931c53a..e49d9f436f92be372b68c02d7010a63b63f71ef9 100644 (file)
@@ -739,5 +739,156 @@ easier automatic tracking of computers.&lt;/p&gt;
 </description>
        </item>
        
 </description>
        </item>
        
+       <item>
+               <title>Checking server hardware support status for Dell, HP and IBM servers</title>
+               <link>../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</link>        
+               <guid isPermaLink="true">../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html</guid>
+                <pubDate>Sat, 28 Feb 2009 23:50:00 +0100</pubDate>
+               <description>
+&lt;p&gt;At work, we have a few hundred Linux servers, and with that amount
+of hardware it is important to keep track of when the hardware support
+contract expire for each server.  We have a machine (and service)
+register, which until recently did not contain much useful besides the
+machine room location and contact information for the system owner for
+each machine.  To make it easier for us to track support contract
+status, I&#39;ve recently spent time on extending the machine register to
+include information about when the support contract expire, and to tag
+machines with expired contracts to make it easy to get a list of such
+machines.  I extended a perl script already being used to import
+information about machines into the register, to also do some screen
+scraping off the sites of Dell, HP and IBM (our majority of machines
+are from these vendors), and automatically check the support status
+for the relevant machines.  This make the support status information
+easily available and I hope it will make it easier for the computer
+owner to know when to get new hardware or renew the support contract.
+The result of this work documented that 27% of the machines in the
+registry is without a support contract, and made it very easy to find
+them.  27% might seem like a lot, but I see it more as the case of us
+using machines a bit longer than the 3 years a normal support contract
+last, to have test machines and a platform for less important
+services.  After all, the machines without a contract are working fine
+at the moment and the lack of contract is only a problem if any of
+them break down.  When that happen, we can either fix it using spare
+parts from other machines or move the service to another old
+machine.&lt;/p&gt;
+
+&lt;p&gt;I believe the code for screen scraping the Dell site was originally
+written by Trond Hasle Amundsen, and later adjusted by me and Morten
+Werner Forsbring.  The HP scraping was written by me after reading a
+nice article in ;login: about how to use WWW::Mechanize, and the IBM
+scraping was written by me based on the Dell code.  I know the HTML
+parsing could be done using nice libraries, but did not want to
+introduce more dependencies.  This is the current incarnation:&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+use LWP::Simple;
+use POSIX;
+use WWW::Mechanize;
+use Date::Parse;
+[...]
+sub get_support_info {
+    my ($machine, $model, $serial, $productnumber) = @_;
+    my $str;
+
+    if ( $model =~ m/^Dell / ) {
+        # fetch website from Dell support
+        my $url = &quot;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&quot;;
+        my $webpage = get($url);
+        return undef unless ($webpage);
+
+        my $daysleft = -1;
+        my @lines = split(/\n/, $webpage);
+        foreach my $line (@lines) {
+            next unless ($line =~ m/Beskrivelse/);
+            $line =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+            $line =~ m%;(\d{2})/(\d{2})/(\d{4});+(\d{2})/(\d{2})/(\d{4});%g;
+            my $start = &quot;$3-$1-$2&quot;;
+            my $end = &quot;$6-$4-$5&quot;;
+            $str = &quot;$start -&gt; $end&quot;;
+            my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^HP / ) {
+        my $mech = WWW::Mechanize-&gt;new();
+        my $url =
+            &#39;http://www1.itrc.hp.com/service/ewarranty/warrantyInput.do&#39;;
+        $mech-&gt;get($url);
+        my $fields = {
+            &#39;BODServiceID&#39; =&gt; &#39;NA&#39;,
+            &#39;RegisteredPurchaseDate&#39; =&gt; &#39;&#39;,
+            &#39;country&#39; =&gt; &#39;NO&#39;,
+            &#39;productNumber&#39; =&gt; $productnumber,
+            &#39;serialNumber1&#39; =&gt; $serial,
+        };
+        $mech-&gt;submit_form( form_number =&gt; 2,
+                            fields      =&gt; $fields );
+        # Next step is screen scraping
+        my $content = $mech-&gt;content();
+
+        $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+        $content =~ s/\s+/ /gm;
+        $content =~ s/;\s*;/;;/gm;
+        $content =~ s/;[\s;]+/;/gm;
+
+        my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+
+        while ($content =~ m/;Warranty Type;/) {
+            my ($type, $status, $startstr, $stopstr) = $content =~
+                m/;Warranty Type;([^;]+);.+?;Status;(\w+);Start Date;([^;]+);End Date;([^;]+);/;
+            $content =~ s/^.+?;Warranty Type;//;
+            my $start = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                        localtime(str2time($startstr)));
+            my $end = POSIX::strftime(&quot;%Y-%m-%d&quot;,
+                                      localtime(str2time($stopstr)));
+
+            $str .= &quot;$type ($status) $start -&gt; $end &quot;;
+
+            tag_machine_unsupported($machine)
+                if ($end lt $today);
+        }
+    } elsif ( $model =~ m/^IBM / ) {
+        my ($producttype) = $model =~ m/.*-\[(.{4}).+\]-/;
+        if ($producttype &amp;&amp; $serial) {
+            my $content =
+                get(&quot;http://www-947.ibm.com/systems/support/supportsite.wss/warranty?action=warranty&amp;brandind=5000008&amp;Submit=Submit&amp;type=$producttype&amp;serial=$serial&quot;);
+            if ($content) {
+                $content =~ s/&lt;[^&gt;]+?&gt;/;/gm;
+                $content =~ s/\s+/ /gm;
+                $content =~ s/;\s*;/;;/gm;
+                $content =~ s/;[\s;]+/;/gm;
+
+                $content =~ s/^.+?;Warranty status;//;
+                my ($status, $end) = $content =~ m/;Warranty status;([^;]+)\s*;Expiration date;(\S+) ;/;
+
+                $str .= &quot;($status) -&gt; $end &quot;;
+
+                my $today = POSIX::strftime(&quot;%Y-%m-%d&quot;, localtime(time));
+                tag_machine_unsupported($machine)
+                    if ($end lt $today);
+            }
+        }
+    }
+    return $str;
+}
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;Here are some examples on how to use the function, using fake
+serial numbers.  The information passed in as arguments are fetched
+from dmidecode.&lt;/p&gt;
+
+&lt;p&gt;&lt;pre&gt;
+print get_support_info(&quot;hp.host&quot;, &quot;HP ProLiant BL460c G1&quot;, &quot;1234567890&quot;
+                       &quot;447707-B21&quot;);
+print get_support_info(&quot;dell.host&quot;, &quot;Dell Inc. PowerEdge 2950&quot;, &quot;1234567&quot;);
+print get_support_info(&quot;ibm.host&quot;, &quot;IBM eserver xSeries 345 -[867061X]-&quot;,
+                       &quot;1234567&quot;);
+&lt;/pre&gt;&lt;/p&gt;
+
+&lt;p&gt;I would recommend this approach for tracking support contracts for
+everyone with more than a new computers to administer. :)&lt;/p&gt;
+</description>
+       </item>
+       
         </channel>
 </rss>
         </channel>
 </rss>
index 8411c1a77df61179613249bae695ce0a718156d4..30e6d47615080d52e9f969c9204c32813acea86b 100644 (file)
@@ -182,7 +182,7 @@ automatisk over i spesialkartet.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -212,7 +212,7 @@ automatisk over i spesialkartet.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -222,7 +222,7 @@ automatisk over i spesialkartet.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 33829e0122eecb39402e967ac574dfcd69bf7175..99b7bd4818df688d3823c31b14d45534eb230bf5 100644 (file)
@@ -332,7 +332,7 @@ arbeidet.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -362,7 +362,7 @@ arbeidet.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -372,7 +372,7 @@ arbeidet.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index f3dea560e752684be945c6b3acc5abaa4f09ad72..884e4a18f5a92e34edc23aec6293bc44684ec9ba 100644 (file)
@@ -61,7 +61,7 @@ forsøk.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -91,7 +91,7 @@ forsøk.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -101,7 +101,7 @@ forsøk.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 4b55de002b3320fa07b66ce1c2baddc5ab56d41f..9e044e04d11fec0e9a2b7956fda457f34f9c6a92 100644 (file)
@@ -81,7 +81,7 @@ stavekontrollen.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -111,7 +111,7 @@ stavekontrollen.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -121,7 +121,7 @@ stavekontrollen.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 07ed9a570c9e42b11d9b9198ba68d7e968d14a0b..a9754b4f881fa03f0887a95ed3655fbbfde6957e 100644 (file)
@@ -178,7 +178,7 @@ webserver og komprimert.</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -208,7 +208,7 @@ webserver og komprimert.</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -218,7 +218,7 @@ webserver og komprimert.</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
index 6f9e84ca6b6df22aefc2e5393c7e8eaba349fb9b..ecdaa5c9e3a0c9458ec349b1a60587aabe3ff907 100644 (file)
@@ -140,7 +140,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
 
 <li><a href="../../archive/2009/01/">January (8)</a></li>
 
-<li><a href="../../archive/2009/02/">February (7)</a></li>
+<li><a href="../../archive/2009/02/">February (8)</a></li>
 
 </ul></li>
 
 
 </ul></li>
 
@@ -170,7 +170,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
 
  <li><a href="../../tags/debian edu">debian edu (4)</a></li>
 
- <li><a href="../../tags/english">english (5)</a></li>
+ <li><a href="../../tags/english">english (6)</a></li>
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
 
  <li><a href="../../tags/fiksgatami">fiksgatami (1)</a></li>
 
@@ -180,7 +180,7 @@ sure hope it was using the announced Ogg Theora support. :)</p>
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
 
  <li><a href="../../tags/norsk">norsk (22)</a></li>
 
- <li><a href="../../tags/nuug">nuug (19)</a></li>
+ <li><a href="../../tags/nuug">nuug (20)</a></li>
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>
 
 
  <li><a href="../../tags/personvern">personvern (3)</a></li>