From: Petter Reinholdtsen Date: Sat, 28 Feb 2009 22:50:59 +0000 (+0000) Subject: Generated. X-Git-Url: http://pere.pagekite.me/gitweb/homepage.git/commitdiff_plain/a93d61e1567d5836402fdadf90f5380108df5d0b?ds=sidebyside Generated. --- diff --git a/blog/Amigafolket_holder_ut.html b/blog/Amigafolket_holder_ut.html index a0193180d2..bd46de5a06 100644 --- a/blog/Amigafolket_holder_ut.html +++ b/blog/Amigafolket_holder_ut.html @@ -50,7 +50,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -80,7 +80,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -90,7 +90,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • 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 index 0000000000..530b7e7315 --- /dev/null +++ b/blog/Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html @@ -0,0 +1,244 @@ + + + + Petter Reinholdtsen: Checking server hardware support status for Dell, HP and IBM servers + + + + +
    +

    + Petter Reinholdtsen + +

    + +
    + + +
    +
    Checking server hardware support status for Dell, HP and IBM servers
    +
    2009-02-28 23:50
    +
    +

    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.

    + +

    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:

    + +

    +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;
    +}
    +

    + +

    Here are some examples on how to use the function, using fake +serial numbers. The information passed in as arguments are fetched +from dmidecode.

    + +

    +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");
    +

    + +

    I would recommend this approach for tracking support contracts for +everyone with more than a new computers to administer. :)

    +
    + +
    Tags: english, nuug.
    + +
    + + + + + + + + + diff --git a/blog/Det_vanskelige_Lisensvalget___ikke_lag_din_egen.html b/blog/Det_vanskelige_Lisensvalget___ikke_lag_din_egen.html index 7b6b79bfaf..7f4b76b05e 100644 --- a/blog/Det_vanskelige_Lisensvalget___ikke_lag_din_egen.html +++ b/blog/Det_vanskelige_Lisensvalget___ikke_lag_din_egen.html @@ -137,7 +137,7 @@ og endrer på betingelsene.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -167,7 +167,7 @@ og endrer pÃ¥ betingelsene.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -177,7 +177,7 @@ og endrer pÃ¥ betingelsene.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Devcamp_brought_us_closer_to_the_Lenny_based_Debian_Edu_release.html b/blog/Devcamp_brought_us_closer_to_the_Lenny_based_Debian_Edu_release.html index 0cf9673fc5..ce05dce8a3 100644 --- a/blog/Devcamp_brought_us_closer_to_the_Lenny_based_Debian_Edu_release.html +++ b/blog/Devcamp_brought_us_closer_to_the_Lenny_based_Debian_Edu_release.html @@ -55,7 +55,7 @@ of these cards.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -85,7 +85,7 @@ of these cards.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -95,7 +95,7 @@ of these cards.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Elektronikkbyggesettet_for_reprapen_sporet_opp.html b/blog/Elektronikkbyggesettet_for_reprapen_sporet_opp.html index 2a65e1eded..8803600a86 100644 --- a/blog/Elektronikkbyggesettet_for_reprapen_sporet_opp.html +++ b/blog/Elektronikkbyggesettet_for_reprapen_sporet_opp.html @@ -57,7 +57,7 @@ jul.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -87,7 +87,7 @@ jul.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -97,7 +97,7 @@ jul.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Elektronikkbyggesettet_kommer_fram_p___andre_fors__k.html b/blog/Elektronikkbyggesettet_kommer_fram_p___andre_fors__k.html index eba1a0821b..9c80066172 100644 --- a/blog/Elektronikkbyggesettet_kommer_fram_p___andre_fors__k.html +++ b/blog/Elektronikkbyggesettet_kommer_fram_p___andre_fors__k.html @@ -80,7 +80,7 @@ pÃ¥stÃ¥r det skulle skje i 2008.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -110,7 +110,7 @@ pÃ¥stÃ¥r det skulle skje i 2008.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -120,7 +120,7 @@ pÃ¥stÃ¥r det skulle skje i 2008.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Endelig_er_Debian_Lenny_gitt_ut.html b/blog/Endelig_er_Debian_Lenny_gitt_ut.html index b013b45154..70f46d8061 100644 --- a/blog/Endelig_er_Debian_Lenny_gitt_ut.html +++ b/blog/Endelig_er_Debian_Lenny_gitt_ut.html @@ -53,7 +53,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -83,7 +83,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -93,7 +93,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Endelig_norsk_stavekontroll_med_st__tte_for_ord_med_bindestrek.html b/blog/Endelig_norsk_stavekontroll_med_st__tte_for_ord_med_bindestrek.html index b69bf11f81..47b71c0106 100644 --- a/blog/Endelig_norsk_stavekontroll_med_st__tte_for_ord_med_bindestrek.html +++ b/blog/Endelig_norsk_stavekontroll_med_st__tte_for_ord_med_bindestrek.html @@ -64,7 +64,7 @@ stavekontrollen.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -94,7 +94,7 @@ stavekontrollen.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -104,7 +104,7 @@ stavekontrollen.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/FAD_lanserer_reiseregningsskjema_som_fri_programvare.html b/blog/FAD_lanserer_reiseregningsskjema_som_fri_programvare.html index 22f013a5d7..8c9aea5a6e 100644 --- a/blog/FAD_lanserer_reiseregningsskjema_som_fri_programvare.html +++ b/blog/FAD_lanserer_reiseregningsskjema_som_fri_programvare.html @@ -118,7 +118,7 @@ gjorde det litt vanskeligere for brukeren.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -148,7 +148,7 @@ gjorde det litt vanskeligere for brukeren.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -158,7 +158,7 @@ gjorde det litt vanskeligere for brukeren.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/F__rste_vellykkede_videostr__m_fra_NUUG.html b/blog/F__rste_vellykkede_videostr__m_fra_NUUG.html index 7c0628c6cb..a15d39527c 100644 --- a/blog/F__rste_vellykkede_videostr__m_fra_NUUG.html +++ b/blog/F__rste_vellykkede_videostr__m_fra_NUUG.html @@ -51,7 +51,7 @@ webserver og komprimert.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -81,7 +81,7 @@ webserver og komprimert.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -91,7 +91,7 @@ webserver og komprimert.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Fiksgatami_begynner____ta_form.html b/blog/Fiksgatami_begynner____ta_form.html index 56b23b710d..92c20132a3 100644 --- a/blog/Fiksgatami_begynner____ta_form.html +++ b/blog/Fiksgatami_begynner____ta_form.html @@ -59,7 +59,7 @@ med dem. Dette blir bra.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -89,7 +89,7 @@ med dem. Dette blir bra.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -99,7 +99,7 @@ med dem. Dette blir bra.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Fri__og___pen_standard__slik_Digistan_ser_det.html b/blog/Fri__og___pen_standard__slik_Digistan_ser_det.html index 0fe0e326ae..961be39384 100644 --- a/blog/Fri__og___pen_standard__slik_Digistan_ser_det.html +++ b/blog/Fri__og___pen_standard__slik_Digistan_ser_det.html @@ -92,7 +92,7 @@ produkter basert pÃ¥ standarden.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -122,7 +122,7 @@ produkter basert pÃ¥ standarden.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -132,7 +132,7 @@ produkter basert pÃ¥ standarden.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Intellektuelt_privilegium___et_bedre_IP_begrep.html b/blog/Intellektuelt_privilegium___et_bedre_IP_begrep.html index ad48d0c752..23c52196f8 100644 --- a/blog/Intellektuelt_privilegium___et_bedre_IP_begrep.html +++ b/blog/Intellektuelt_privilegium___et_bedre_IP_begrep.html @@ -61,7 +61,7 @@ forretningshemmeligheter framover.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -91,7 +91,7 @@ forretningshemmeligheter framover.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -101,7 +101,7 @@ forretningshemmeligheter framover.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Jeg_vil_beholde_tusenlappen___jeg_bruker_den.html b/blog/Jeg_vil_beholde_tusenlappen___jeg_bruker_den.html index 53d91efa80..a88e4af1d7 100644 --- a/blog/Jeg_vil_beholde_tusenlappen___jeg_bruker_den.html +++ b/blog/Jeg_vil_beholde_tusenlappen___jeg_bruker_den.html @@ -90,7 +90,7 @@ kontanter for noen dager siden.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -120,7 +120,7 @@ kontanter for noen dager siden.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -130,7 +130,7 @@ kontanter for noen dager siden.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Kart_over_overv__kningskamera_i_Norge.html b/blog/Kart_over_overv__kningskamera_i_Norge.html index 501b11d199..1288183f32 100644 --- a/blog/Kart_over_overv__kningskamera_i_Norge.html +++ b/blog/Kart_over_overv__kningskamera_i_Norge.html @@ -59,7 +59,7 @@ automatisk over i spesialkartet.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -89,7 +89,7 @@ automatisk over i spesialkartet.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -99,7 +99,7 @@ automatisk over i spesialkartet.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Mekanikk_delen_av_reprap_byggesettet_i_hus.html b/blog/Mekanikk_delen_av_reprap_byggesettet_i_hus.html index 4f2c39eb7e..5a26b7e114 100644 --- a/blog/Mekanikk_delen_av_reprap_byggesettet_i_hus.html +++ b/blog/Mekanikk_delen_av_reprap_byggesettet_i_hus.html @@ -58,7 +58,7 @@ og kan melde seg pÃ¥ aktive@nuug.no.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -88,7 +88,7 @@ og kan melde seg pÃ¥ aktive@nuug.no.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -98,7 +98,7 @@ og kan melde seg pÃ¥ aktive@nuug.no.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Mekanikk_delen_av_reprap_byggesettet_p___vei.html b/blog/Mekanikk_delen_av_reprap_byggesettet_p___vei.html index e15440d079..32f927eac8 100644 --- a/blog/Mekanikk_delen_av_reprap_byggesettet_p___vei.html +++ b/blog/Mekanikk_delen_av_reprap_byggesettet_p___vei.html @@ -50,7 +50,7 @@ bort første pakke.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -80,7 +80,7 @@ bort første pakke.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -90,7 +90,7 @@ bort første pakke.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Mens_vi_venter_p___3D_skriveren.html b/blog/Mens_vi_venter_p___3D_skriveren.html index c172088132..3635f9a62f 100644 --- a/blog/Mens_vi_venter_p___3D_skriveren.html +++ b/blog/Mens_vi_venter_p___3D_skriveren.html @@ -62,7 +62,7 @@ hÃ¥per det ikke gÃ¥r tapt pÃ¥ samme vis.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -92,7 +92,7 @@ hÃ¥per det ikke gÃ¥r tapt pÃ¥ samme vis.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -102,7 +102,7 @@ hÃ¥per det ikke gÃ¥r tapt pÃ¥ samme vis.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Min_reprap_tar_sakte_form.html b/blog/Min_reprap_tar_sakte_form.html index e318157dd4..0ce65034be 100644 --- a/blog/Min_reprap_tar_sakte_form.html +++ b/blog/Min_reprap_tar_sakte_form.html @@ -72,7 +72,7 @@ arbeidet.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -102,7 +102,7 @@ arbeidet.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -112,7 +112,7 @@ arbeidet.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Norge_trenger_en_personvernforening.html b/blog/Norge_trenger_en_personvernforening.html index 9bf9d7a751..65c44843f8 100644 --- a/blog/Norge_trenger_en_personvernforening.html +++ b/blog/Norge_trenger_en_personvernforening.html @@ -54,7 +54,7 @@ nÃ¥ fÃ¥r vi se om noen er enig.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -84,7 +84,7 @@ nÃ¥ fÃ¥r vi se om noen er enig.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -94,7 +94,7 @@ nÃ¥ fÃ¥r vi se om noen er enig.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/ODF_bruk_i_staten__ikke_helt_p___plass.html b/blog/ODF_bruk_i_staten__ikke_helt_p___plass.html index 8ccf185796..045dbaa168 100644 --- a/blog/ODF_bruk_i_staten__ikke_helt_p___plass.html +++ b/blog/ODF_bruk_i_staten__ikke_helt_p___plass.html @@ -54,7 +54,7 @@ Kjenner kun til ufullstendige løsninger for slikt.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -84,7 +84,7 @@ Kjenner kun til ufullstendige løsninger for slikt.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -94,7 +94,7 @@ Kjenner kun til ufullstendige løsninger for slikt.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Reprap_pakke_tapt_i_posten.html b/blog/Reprap_pakke_tapt_i_posten.html index d471eaf563..a951a27ced 100644 --- a/blog/Reprap_pakke_tapt_i_posten.html +++ b/blog/Reprap_pakke_tapt_i_posten.html @@ -50,7 +50,7 @@ lenge alt er klart til Go Open
  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -80,7 +80,7 @@ lenge alt er klart til Go Open
  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -90,7 +90,7 @@ lenge alt er klart til Go Open
  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Software_video_mixer_on_a_USB_stick.html b/blog/Software_video_mixer_on_a_USB_stick.html index f4c6b2e32a..e36e6fffa0 100644 --- a/blog/Software_video_mixer_on_a_USB_stick.html +++ b/blog/Software_video_mixer_on_a_USB_stick.html @@ -65,7 +65,7 @@ larger stick as well.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -95,7 +95,7 @@ larger stick as well.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -105,7 +105,7 @@ larger stick as well.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Tester_blog.html b/blog/Tester_blog.html index 45ae3a7b0f..d80c390e01 100644 --- a/blog/Tester_blog.html +++ b/blog/Tester_blog.html @@ -44,7 +44,7 @@ forsøk.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -74,7 +74,7 @@ forsøk.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -84,7 +84,7 @@ forsøk.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/The_sorry_state_of_multimedia_browser_plugins_in_Debian.html b/blog/The_sorry_state_of_multimedia_browser_plugins_in_Debian.html index 8bba95c1de..51076d0b16 100644 --- a/blog/The_sorry_state_of_multimedia_browser_plugins_in_Debian.html +++ b/blog/The_sorry_state_of_multimedia_browser_plugins_in_Debian.html @@ -59,7 +59,7 @@ be the only one fitting our needs. :/

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -89,7 +89,7 @@ be the only one fitting our needs. :/

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -99,7 +99,7 @@ be the only one fitting our needs. :/

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Transendentalt_tullball_og_en_funksjonell_tiln__rming.html b/blog/Transendentalt_tullball_og_en_funksjonell_tiln__rming.html index e12e779e4f..bbab58d58e 100644 --- a/blog/Transendentalt_tullball_og_en_funksjonell_tiln__rming.html +++ b/blog/Transendentalt_tullball_og_en_funksjonell_tiln__rming.html @@ -60,7 +60,7 @@ oppløsning.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -90,7 +90,7 @@ oppløsning.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -100,7 +100,7 @@ oppløsning.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/Using_bar_codes_at_a_computing_center.html b/blog/Using_bar_codes_at_a_computing_center.html index 40fdee05f1..667b665514 100644 --- a/blog/Using_bar_codes_at_a_computing_center.html +++ b/blog/Using_bar_codes_at_a_computing_center.html @@ -82,7 +82,7 @@ easier automatic tracking of computers.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -112,7 +112,7 @@ easier automatic tracking of computers.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -122,7 +122,7 @@ easier automatic tracking of computers.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/When_web_browser_developers_make_a_video_player___.html b/blog/When_web_browser_developers_make_a_video_player___.html index 49d8eabba6..286d30bd1d 100644 --- a/blog/When_web_browser_developers_make_a_video_player___.html +++ b/blog/When_web_browser_developers_make_a_video_player___.html @@ -83,7 +83,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -113,7 +113,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -123,7 +123,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/archive/2008/11/index.html b/blog/archive/2008/11/index.html index be127e5e91..e71d4f591a 100644 --- a/blog/archive/2008/11/index.html +++ b/blog/archive/2008/11/index.html @@ -204,7 +204,7 @@ lenge alt er klart til Go Open
  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -234,7 +234,7 @@ lenge alt er klart til Go Open
  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -244,7 +244,7 @@ lenge alt er klart til Go Open
  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/archive/2008/12/index.html b/blog/archive/2008/12/index.html index 3bf8e2a8b2..21abbd0c10 100644 --- a/blog/archive/2008/12/index.html +++ b/blog/archive/2008/12/index.html @@ -368,7 +368,7 @@ larger stick as well.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -398,7 +398,7 @@ larger stick as well.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -408,7 +408,7 @@ larger stick as well.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/archive/2009/01/index.html b/blog/archive/2009/01/index.html index cb2547e92c..e8e63629c1 100644 --- a/blog/archive/2009/01/index.html +++ b/blog/archive/2009/01/index.html @@ -537,7 +537,7 @@ produkter basert pÃ¥ standarden.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -567,7 +567,7 @@ produkter basert pÃ¥ standarden.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -577,7 +577,7 @@ produkter basert pÃ¥ standarden.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/archive/2009/02/02.rss b/blog/archive/2009/02/02.rss index 600f383091..b6364f1a32 100644 --- a/blog/archive/2009/02/02.rss +++ b/blog/archive/2009/02/02.rss @@ -214,5 +214,156 @@ easier automatic tracking of computers.</p> + + Checking server hardware support status for Dell, HP and IBM servers + ../../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + ../../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + Sat, 28 Feb 2009 23:50:00 +0100 + +<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> + + + diff --git a/blog/archive/2009/02/index.html b/blog/archive/2009/02/index.html index 8c0ac40016..1175b02540 100644 --- a/blog/archive/2009/02/index.html +++ b/blog/archive/2009/02/index.html @@ -313,6 +313,170 @@ easier automatic tracking of computers.

    + Tags: english, nuug. + + + +
    + +
    + +
    + 2009-02-28 23:50 +
    + +
    + +

    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.

    + +

    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:

    + +

    +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;
    +}
    +

    + +

    Here are some examples on how to use the function, using fake +serial numbers. The information passed in as arguments are fetched +from dmidecode.

    + +

    +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");
    +

    + +

    I would recommend this approach for tracking support contracts for +everyone with more than a new computers to administer. :)

    + +
    +
    + + + Tags: english, nuug.
    @@ -333,7 +497,7 @@ easier automatic tracking of computers.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -363,7 +527,7 @@ easier automatic tracking of computers.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -373,7 +537,7 @@ easier automatic tracking of computers.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • 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 index 0000000000..8441553234 --- /dev/null +++ b/blog/data/2009-02-18-protokoll-og-format.txt @@ -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 diff --git a/blog/index.html b/blog/index.html index 95f2871c87..09f494e8af 100644 --- a/blog/index.html +++ b/blog/index.html @@ -19,6 +19,163 @@ +
    + +
    2009-02-28 23:50
    +
    +

    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.

    + +

    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:

    + +

    +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;
    +}
    +

    + +

    Here are some examples on how to use the function, using fake +serial numbers. The information passed in as arguments are fetched +from dmidecode.

    + +

    +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");
    +

    + +

    I would recommend this approach for tracking support contracts for +everyone with more than a new computers to administer. :)

    +
    +
    + + + + Tags: english, nuug. + +
    +
    +
    +
    2009-02-20 08:50
    @@ -363,34 +520,6 @@ oppløsning.

    - Tags: norsk, nuug. - -
    -
    -
    - -
    - -
    2009-01-22 23:00
    -
    -

    I går publiserte -Universitas, -Dagens-IT -og Computerworld -Norge 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å.

    - -

    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.

    -
    -
    - - - Tags: norsk, nuug.
    @@ -413,7 +542,7 @@ Kjenner kun til ufullstendige løsninger for slikt.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -443,7 +572,7 @@ Kjenner kun til ufullstendige løsninger for slikt.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -453,7 +582,7 @@ Kjenner kun til ufullstendige løsninger for slikt.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/index.rss b/blog/index.rss index 07e4a9b7b4..c593ae74df 100644 --- a/blog/index.rss +++ b/blog/index.rss @@ -6,6 +6,157 @@ + + Checking server hardware support status for Dell, HP and IBM servers + Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + Sat, 28 Feb 2009 23:50:00 +0100 + +<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> + + + Using bar codes at a computing center Using_bar_codes_at_a_computing_center.html @@ -302,27 +453,5 @@ oppløsning.</p> - - ODF-bruk i staten, ikke helt pÃ¥ plass - ODF_bruk_i_staten__ikke_helt_p___plass.html - ODF_bruk_i_staten__ikke_helt_p___plass.html - Thu, 22 Jan 2009 23:00:00 +0100 - -<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> - - - diff --git a/blog/tags/3d-printer/index.html b/blog/tags/3d-printer/index.html index f662d1f800..3639b95d5a 100644 --- a/blog/tags/3d-printer/index.html +++ b/blog/tags/3d-printer/index.html @@ -332,7 +332,7 @@ arbeidet.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -362,7 +362,7 @@ arbeidet.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -372,7 +372,7 @@ arbeidet.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/amiga/index.html b/blog/tags/amiga/index.html index 24ca55a90d..9678eba4f5 100644 --- a/blog/tags/amiga/index.html +++ b/blog/tags/amiga/index.html @@ -67,7 +67,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -97,7 +97,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -107,7 +107,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/aros/index.html b/blog/tags/aros/index.html index 8be1ee0986..63b5714faf 100644 --- a/blog/tags/aros/index.html +++ b/blog/tags/aros/index.html @@ -67,7 +67,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -97,7 +97,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -107,7 +107,7 @@ pakke. Kanskje Aros kunne vært interessant for et NUUG-foredrag?

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/debian edu/index.html b/blog/tags/debian edu/index.html index 3fa83523ff..f6d78719f1 100644 --- a/blog/tags/debian edu/index.html +++ b/blog/tags/debian edu/index.html @@ -191,7 +191,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -221,7 +221,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -231,7 +231,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/debian/index.html b/blog/tags/debian/index.html index 3ca7fda4da..55c055364f 100644 --- a/blog/tags/debian/index.html +++ b/blog/tags/debian/index.html @@ -146,7 +146,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -176,7 +176,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -186,7 +186,7 @@ bootsekvens tilgjengelig i stabil utgave, vha pakken
  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/english/english.rss b/blog/tags/english/english.rss index b44bf92226..f329c7b6b6 100644 --- a/blog/tags/english/english.rss +++ b/blog/tags/english/english.rss @@ -190,5 +190,156 @@ easier automatic tracking of computers.</p> + + Checking server hardware support status for Dell, HP and IBM servers + ../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + ../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + Sat, 28 Feb 2009 23:50:00 +0100 + +<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> + + + diff --git a/blog/tags/english/index.html b/blog/tags/english/index.html index 2edc1c0aa9..039f4510cb 100644 --- a/blog/tags/english/index.html +++ b/blog/tags/english/index.html @@ -264,6 +264,170 @@ easier automatic tracking of computers.

    + Tags: english, nuug. + +
    + +
    + +
    + +
    + 2009-02-28 23:50 +
    + +
    + +

    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.

    + +

    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:

    + +

    +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;
    +}
    +

    + +

    Here are some examples on how to use the function, using fake +serial numbers. The information passed in as arguments are fetched +from dmidecode.

    + +

    +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");
    +

    + +

    I would recommend this approach for tracking support contracts for +everyone with more than a new computers to administer. :)

    + +
    +
    + + + Tags: english, nuug.
    @@ -285,7 +449,7 @@ easier automatic tracking of computers.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -315,7 +479,7 @@ easier automatic tracking of computers.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -325,7 +489,7 @@ easier automatic tracking of computers.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/fiksgatami/index.html b/blog/tags/fiksgatami/index.html index 46d5d16395..0fb79a5d63 100644 --- a/blog/tags/fiksgatami/index.html +++ b/blog/tags/fiksgatami/index.html @@ -76,7 +76,7 @@ med dem. Dette blir bra.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -106,7 +106,7 @@ med dem. Dette blir bra.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -116,7 +116,7 @@ med dem. Dette blir bra.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/ltsp/index.html b/blog/tags/ltsp/index.html index a7243da93e..14c2e00800 100644 --- a/blog/tags/ltsp/index.html +++ b/blog/tags/ltsp/index.html @@ -72,7 +72,7 @@ of these cards.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -102,7 +102,7 @@ of these cards.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -112,7 +112,7 @@ of these cards.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/multimedia/index.html b/blog/tags/multimedia/index.html index cb31002246..fa097a88e3 100644 --- a/blog/tags/multimedia/index.html +++ b/blog/tags/multimedia/index.html @@ -140,7 +140,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -170,7 +170,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -180,7 +180,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/norsk/index.html b/blog/tags/norsk/index.html index 5df4482c75..4cff29b406 100644 --- a/blog/tags/norsk/index.html +++ b/blog/tags/norsk/index.html @@ -1093,7 +1093,7 @@ automatisk over i spesialkartet.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -1123,7 +1123,7 @@ automatisk over i spesialkartet.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -1133,7 +1133,7 @@ automatisk over i spesialkartet.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/nuug/index.html b/blog/tags/nuug/index.html index 8232c2db9d..4ae881dc31 100644 --- a/blog/tags/nuug/index.html +++ b/blog/tags/nuug/index.html @@ -995,6 +995,170 @@ easier automatic tracking of computers.

    + Tags: english, nuug. + +
    + +
    + +
    + +
    + 2009-02-28 23:50 +
    + +
    + +

    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.

    + +

    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:

    + +

    +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;
    +}
    +

    + +

    Here are some examples on how to use the function, using fake +serial numbers. The information passed in as arguments are fetched +from dmidecode.

    + +

    +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");
    +

    + +

    I would recommend this approach for tracking support contracts for +everyone with more than a new computers to administer. :)

    + +
    +
    + + + Tags: english, nuug.
    @@ -1016,7 +1180,7 @@ easier automatic tracking of computers.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -1046,7 +1210,7 @@ easier automatic tracking of computers.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -1056,7 +1220,7 @@ easier automatic tracking of computers.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/nuug/nuug.rss b/blog/tags/nuug/nuug.rss index 0d5295e7dc..e49d9f436f 100644 --- a/blog/tags/nuug/nuug.rss +++ b/blog/tags/nuug/nuug.rss @@ -739,5 +739,156 @@ easier automatic tracking of computers.</p> + + Checking server hardware support status for Dell, HP and IBM servers + ../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + ../../Checking_server_hardware_support_status_for_Dell__HP_and_IBM_servers.html + Sat, 28 Feb 2009 23:50:00 +0100 + +<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> + + + diff --git a/blog/tags/personvern/index.html b/blog/tags/personvern/index.html index 8411c1a77d..30e6d47615 100644 --- a/blog/tags/personvern/index.html +++ b/blog/tags/personvern/index.html @@ -182,7 +182,7 @@ automatisk over i spesialkartet.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -212,7 +212,7 @@ automatisk over i spesialkartet.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -222,7 +222,7 @@ automatisk over i spesialkartet.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/reprap/index.html b/blog/tags/reprap/index.html index 33829e0122..99b7bd4818 100644 --- a/blog/tags/reprap/index.html +++ b/blog/tags/reprap/index.html @@ -332,7 +332,7 @@ arbeidet.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -362,7 +362,7 @@ arbeidet.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -372,7 +372,7 @@ arbeidet.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/rss/index.html b/blog/tags/rss/index.html index f3dea560e7..884e4a18f5 100644 --- a/blog/tags/rss/index.html +++ b/blog/tags/rss/index.html @@ -61,7 +61,7 @@ forsøk.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -91,7 +91,7 @@ forsøk.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -101,7 +101,7 @@ forsøk.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/stavekontroll/index.html b/blog/tags/stavekontroll/index.html index 4b55de002b..9e044e04d1 100644 --- a/blog/tags/stavekontroll/index.html +++ b/blog/tags/stavekontroll/index.html @@ -81,7 +81,7 @@ stavekontrollen.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -111,7 +111,7 @@ stavekontrollen.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -121,7 +121,7 @@ stavekontrollen.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/video/index.html b/blog/tags/video/index.html index 07ed9a570c..a9754b4f88 100644 --- a/blog/tags/video/index.html +++ b/blog/tags/video/index.html @@ -178,7 +178,7 @@ webserver og komprimert.

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -208,7 +208,7 @@ webserver og komprimert.

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -218,7 +218,7 @@ webserver og komprimert.

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)
  • diff --git a/blog/tags/web/index.html b/blog/tags/web/index.html index 6f9e84ca6b..ecdaa5c9e3 100644 --- a/blog/tags/web/index.html +++ b/blog/tags/web/index.html @@ -140,7 +140,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • January (8)
  • -
  • February (7)
  • +
  • February (8)
  • @@ -170,7 +170,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • debian edu (4)
  • -
  • english (5)
  • +
  • english (6)
  • fiksgatami (1)
  • @@ -180,7 +180,7 @@ sure hope it was using the announced Ogg Theora support. :)

  • norsk (22)
  • -
  • nuug (19)
  • +
  • nuug (20)
  • personvern (3)