-
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 =~ s/^.+?;(Beskrivelse;)/$1/;
-
- my @f = split(/\;/, $line);
- @f = @f[13 .. $#f];
- my $lastend = "";
- while ($f[3] eq "DELL") {
- my ($type, $startstr, $endstr, $days) = @f[0, 5, 7, 10];
-
- my $start = POSIX::strftime("%Y-%m-%d",
- localtime(str2time($startstr)));
- my $end = POSIX::strftime("%Y-%m-%d",
- localtime(str2time($endstr)));
- $str .= "$type $start -> $end ";
- @f = @f[14 .. $#f];
- $lastend = $end if ($end gt $lastend);
- }
- my $today = POSIX::strftime("%Y-%m-%d", localtime(time));
- tag_machine_unsupported($machine)
- if ($lastend 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 / ) {
- # This code ignore extended support contracts.
- 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 few computers to administer. :)
-
-
Update 2009-03-06: The IBM page do not include extended support
-contracts, so it is useless in that case. The original Dell code do
-not handle extended support contracts either, but has been updated to
-do so.
+
My
+testing
+of Debian upgrades from Lenny to Squeeze continues, and I've
+finally made the upgrade logs available from
+http://people.skolelinux.org/pere/debian-upgrade-testing/.
+I am now testing dist-upgrade of Gnome and KDE in a chroot using both
+apt and aptitude, and found their differences interesting. This time
+I will only focus on their removal plans.
+
+
After installing a Gnome desktop and the laptop task, apt-get wants
+to remove 72 packages when dist-upgrading from Lenny to Squeeze. The
+surprising part is that it want to remove xorg and all
+xserver-xorg-video* drivers. Clearly not a good choice, but I am not
+sure why. When asking aptitude to do the same, it want to remove 129
+packages, but most of them are library packages I suspect are no
+longer needed. Both of them want to remove bluetooth packages, which
+I do not know. Perhaps these bluetooth packages are obsolete?
+
+
For KDE, apt-get want to remove 82 packages, among them kdebase
+which seem like a bad idea and xorg the same way as with Gnome. Asking
+aptitude for the same, it wants to remove 192 packages, none which are
+too surprising.
+
+
I guess the removal of xorg during upgrades should be investigated
+and avoided, and perhaps others as well. Here are the complete list
+of planned removals. The complete logs is available from the URL
+above. Note if you want to repeat these tests, that the upgrade test
+for kde+apt-get hung in the tasksel setup because of dpkg asking
+conffile questions. No idea why. I worked around it by using
+'echo >> /proc/pidofdpkg/fd/0' to tell dpkg to
+continue.
+
+
apt-get gnome 72
+
bluez-gnome cupsddk-drivers deskbar-applet gnome
+ gnome-desktop-environment gnome-network-admin gtkhtml3.14
+ iceweasel-gnome-support libavcodec51 libdatrie0 libgdl-1-0
+ libgnomekbd2 libgnomekbdui2 libmetacity0 libslab0 libxcb-xlib0
+ nautilus-cd-burner python-gnome2-desktop python-gnome2-extras
+ serpentine swfdec-mozilla update-manager xorg xserver-xorg
+ xserver-xorg-core xserver-xorg-input-all xserver-xorg-input-evdev
+ xserver-xorg-input-kbd xserver-xorg-input-mouse
+ xserver-xorg-input-synaptics xserver-xorg-input-wacom
+ xserver-xorg-video-all xserver-xorg-video-apm xserver-xorg-video-ark
+ xserver-xorg-video-ati xserver-xorg-video-chips
+ xserver-xorg-video-cirrus xserver-xorg-video-cyrix
+ xserver-xorg-video-dummy xserver-xorg-video-fbdev
+ xserver-xorg-video-glint xserver-xorg-video-i128
+ xserver-xorg-video-i740 xserver-xorg-video-imstt
+ xserver-xorg-video-intel xserver-xorg-video-mach64
+ xserver-xorg-video-mga xserver-xorg-video-neomagic
+ xserver-xorg-video-nsc xserver-xorg-video-nv
+ xserver-xorg-video-openchrome xserver-xorg-video-r128
+ xserver-xorg-video-radeon xserver-xorg-video-radeonhd
+ xserver-xorg-video-rendition xserver-xorg-video-s3
+ xserver-xorg-video-s3virge xserver-xorg-video-savage
+ xserver-xorg-video-siliconmotion xserver-xorg-video-sis
+ xserver-xorg-video-sisusb xserver-xorg-video-tdfx
+ xserver-xorg-video-tga xserver-xorg-video-trident
+ xserver-xorg-video-tseng xserver-xorg-video-v4l
+ xserver-xorg-video-vesa xserver-xorg-video-vga
+ xserver-xorg-video-vmware xserver-xorg-video-voodoo xulrunner-1.9
+ xulrunner-1.9-gnome-support
+
+
aptitude gnome 129
+
+
bluez-gnome bluez-utils cpp-4.3 cupsddk-drivers dhcdbd
+ djvulibre-desktop finger gnome-app-install gnome-mount
+ gnome-network-admin gnome-spell gnome-vfs-obexftp
+ gnome-volume-manager gstreamer0.10-gnomevfs gtkhtml3.14 libao2
+ libavahi-compat-libdnssd1 libavahi-core5 libavcodec51 libbluetooth2
+ libcamel1.2-11 libcdio7 libcucul0 libcupsys2 libcurl3 libdatrie0
+ libdirectfb-1.0-0 libdvdread3 libedataserver1.2-9 libeel2-2.20
+ libeel2-data libepc-1.0-1 libepc-ui-1.0-1 libfaad0 libgail-common
+ libgd2-noxpm libgda3-3 libgda3-common libgdl-1-0 libgdl-1-common
+ libggz2 libggzcore9 libggzmod4 libgksu1.2-0 libgksuui1.0-1 libgmyth0
+ libgnomecups1.0-1 libgnomekbd2 libgnomekbdui2 libgnomeprint2.2-0
+ libgnomeprint2.2-data libgnomeprintui2.2-0 libgnomeprintui2.2-common
+ libgnomevfs2-bin libgpod3 libgraphviz4 libgtkhtml2-0
+ libgtksourceview-common libgtksourceview1.0-0 libgucharmap6
+ libhesiod0 libicu38 libiw29 libkpathsea4 libltdl3 libmagick++10
+ libmagick10 libmalaga7 libmetacity0 libmtp7 libmysqlclient15off
+ libnautilus-burn4 libneon27 libnm-glib0 libnm-util0 libopal-2.2
+ libosp5 libparted1.8-10 libpoppler-glib3 libpoppler3 libpt-1.10.10
+ libpt-1.10.10-plugins-alsa libpt-1.10.10-plugins-v4l libraw1394-8
+ libsensors3 libslab0 libsmbios2 libsoup2.2-8 libssh2-1
+ libsuitesparse-3.1.0 libswfdec-0.6-90 libtalloc1 libtotem-plparser10
+ libtrackerclient0 libxalan2-java libxalan2-java-gcj libxcb-xlib0
+ libxerces2-java libxerces2-java-gcj libxklavier12 libxtrap6
+ libxxf86misc1 libzephyr3 mysql-common nautilus-cd-burner
+ openoffice.org-writer2latex openssl-blacklist p7zip
+ python-4suite-xml python-eggtrayicon python-gnome2-desktop
+ python-gnome2-extras python-gtkhtml2 python-gtkmozembed
+ python-numeric python-sexy serpentine svgalibg1 swfdec-gnome
+ swfdec-mozilla totem-gstreamer update-manager wodim
+ xserver-xorg-video-cyrix xserver-xorg-video-imstt
+ xserver-xorg-video-nsc xserver-xorg-video-v4l xserver-xorg-video-vga
+ zip
+
+
apt-get kde 82
+
+
cupsddk-drivers karm kaudiocreator kcoloredit kcontrol kde kde-core
+ kdeaddons kdeartwork kdebase kdebase-bin kdebase-bin-kde3
+ kdebase-kio-plugins kdesktop kdeutils khelpcenter kicker
+ kicker-applets knewsticker kolourpaint konq-plugins konqueror korn
+ kpersonalizer kscreensaver ksplash libavcodec51 libdatrie0 libkiten1
+ libxcb-xlib0 quanta superkaramba texlive-base-bin xorg xserver-xorg
+ xserver-xorg-core xserver-xorg-input-all xserver-xorg-input-evdev
+ xserver-xorg-input-kbd xserver-xorg-input-mouse
+ xserver-xorg-input-synaptics xserver-xorg-input-wacom
+ xserver-xorg-video-all xserver-xorg-video-apm xserver-xorg-video-ark
+ xserver-xorg-video-ati xserver-xorg-video-chips
+ xserver-xorg-video-cirrus xserver-xorg-video-cyrix
+ xserver-xorg-video-dummy xserver-xorg-video-fbdev
+ xserver-xorg-video-glint xserver-xorg-video-i128
+ xserver-xorg-video-i740 xserver-xorg-video-imstt
+ xserver-xorg-video-intel xserver-xorg-video-mach64
+ xserver-xorg-video-mga xserver-xorg-video-neomagic
+ xserver-xorg-video-nsc xserver-xorg-video-nv
+ xserver-xorg-video-openchrome xserver-xorg-video-r128
+ xserver-xorg-video-radeon xserver-xorg-video-radeonhd
+ xserver-xorg-video-rendition xserver-xorg-video-s3
+ xserver-xorg-video-s3virge xserver-xorg-video-savage
+ xserver-xorg-video-siliconmotion xserver-xorg-video-sis
+ xserver-xorg-video-sisusb xserver-xorg-video-tdfx
+ xserver-xorg-video-tga xserver-xorg-video-trident
+ xserver-xorg-video-tseng xserver-xorg-video-v4l
+ xserver-xorg-video-vesa xserver-xorg-video-vga
+ xserver-xorg-video-vmware xserver-xorg-video-voodoo xulrunner-1.9
+
+
aptitude kde 192
+
bluez-utils cpp-4.3 cupsddk-drivers cvs dcoprss dhcdbd
+ djvulibre-desktop dosfstools eyesapplet fifteenapplet finger gettext
+ ghostscript-x imlib-base imlib11 indi kandy karm kasteroids
+ kaudiocreator kbackgammon kbstate kcoloredit kcontrol kcron kdat
+ kdeadmin-kfile-plugins kdeartwork-misc kdeartwork-theme-window
+ kdebase-bin-kde3 kdebase-kio-plugins kdeedu-data
+ kdegraphics-kfile-plugins kdelirc kdemultimedia-kappfinder-data
+ kdemultimedia-kfile-plugins kdenetwork-kfile-plugins
+ kdepim-kfile-plugins kdepim-kio-plugins kdeprint kdesktop kdessh
+ kdict kdnssd kdvi kedit keduca kenolaba kfax kfaxview kfouleggs
+ kghostview khelpcenter khexedit kiconedit kitchensync klatin
+ klickety kmailcvt kmenuedit kmid kmilo kmoon kmrml kodo kolourpaint
+ kooka korn kpager kpdf kpercentage kpf kpilot kpoker kpovmodeler
+ krec kregexpeditor ksayit ksim ksirc ksirtet ksmiletris ksmserver
+ ksnake ksokoban ksplash ksvg ksysv ktip ktnef kuickshow kverbos
+ kview kviewshell kvoctrain kwifimanager kwin kwin4 kworldclock
+ kxsldbg libakode2 libao2 libarts1-akode libarts1-audiofile
+ libarts1-mpeglib libarts1-xine libavahi-compat-libdnssd1
+ libavahi-core5 libavc1394-0 libavcodec51 libbluetooth2
+ libboost-python1.34.1 libcucul0 libcurl3 libcvsservice0 libdatrie0
+ libdirectfb-1.0-0 libdjvulibre21 libdvdread3 libfaad0 libfreebob0
+ libgail-common libgd2-noxpm libgraphviz4 libgsmme1c2a libgtkhtml2-0
+ libicu38 libiec61883-0 libindex0 libiw29 libk3b3 libkcal2b libkcddb1
+ libkdeedu3 libkdepim1a libkgantt0 libkiten1 libkleopatra1 libkmime2
+ libkpathsea4 libkpimexchange1 libkpimidentities1 libkscan1
+ libksieve0 libktnef1 liblockdev1 libltdl3 libmagick10 libmimelib1c2a
+ libmozjs1d libmpcdec3 libneon27 libnm-util0 libopensync0 libpisock9
+ libpoppler-glib3 libpoppler-qt2 libpoppler3 libraw1394-8 libsmbios2
+ libssh2-1 libsuitesparse-3.1.0 libtalloc1 libtiff-tools
+ libxalan2-java libxalan2-java-gcj libxcb-xlib0 libxerces2-java
+ libxerces2-java-gcj libxtrap6 mpeglib networkstatus
+ openoffice.org-writer2latex pmount poster psutils quanta quanta-data
+ superkaramba svgalibg1 tex-common texlive-base texlive-base-bin
+ texlive-common texlive-doc-base texlive-fonts-recommended
+ xserver-xorg-video-cyrix xserver-xorg-video-imstt
+ xserver-xorg-video-nsc xserver-xorg-video-v4l xserver-xorg-video-vga
+ xulrunner-1.9
+