]> pere.pagekite.me Git - homepage.git/blobdiff - blog/index.html
Generated.
[homepage.git] / blog / index.html
index b306442cf4dbbfcbc85a72f59e7cdb9633eeadb3..ec4a8d732cc6ec63a692cf1e8217b61fc9ad3950 100644 (file)
 
 
     
+    <div class="entry">
+      <div class="title"><a href="http://people.skolelinux.org/pere/blog/Automatically_upgrading_server_firmware_on_Dell_PowerEdge.html">Automatically upgrading server firmware on Dell PowerEdge</a></div>
+      <div class="date">21st November 2011</div>
+      <div class="body"><p>At work we have heaps of servers.  I believe the total count is
+around 1000 at the moment.  To be able to get help from the vendors
+when something go wrong, we want to keep the firmware on the servers
+up to date.  If the firmware isn't the latest and greatest, the
+vendors typically refuse to start debugging any problems until the
+firmware is upgraded.  So before every reboot, we want to upgrade the
+firmware, and we would really like everyone handling servers at the
+university to do this themselves when they plan to reboot a machine.
+For that to happen we at the unix server admin group need to provide
+the tools to do so.</p>
+
+<p>To make firmware upgrading easier, I am working on a script to
+fetch and install the latest firmware for the servers we got.  Most of
+our hardware are from Dell and HP, so I have focused on these servers
+so far.  This blog post is about the Dell part.</P>
+
+<p>On the Dell FTP site I was lucky enough to find
+<a href="ftp://ftp.us.dell.com/catalog/Catalog.xml.gz">an XML file</a>
+with firmware information for all 11th generation servers, listing
+which firmware should be used on a given model and where on the FTP
+site I can find it.  Using a simple perl XML parser I can then
+download the shell scripts Dell provides to do firmware upgrades from
+within Linux and reboot when all the firmware is primed and ready to
+be activated on the first reboot.</p>
+
+<p>This is the Dell related fragment of the perl code I am working on.
+Are there anyone working on similar tools for firmware upgrading all
+servers at a site?  Please get in touch and lets share resources.</p>
+
+<p><pre>
+#!/usr/bin/perl
+use strict;
+use warnings;
+use File::Temp qw(tempdir);
+BEGIN {
+    # Install needed RHEL packages if missing
+    my %rhelmodules = (
+        'XML::Simple' => 'perl-XML-Simple',
+        );
+    for my $module (keys %rhelmodules) {
+        eval "use $module;";
+        if ($@) {
+            my $pkg = $rhelmodules{$module};
+            system("yum install -y $pkg");
+            eval "use $module;";
+        }
+    }
+}
+my $errorsto = 'pere@hungry.com';
+
+upgrade_dell();
+
+exit 0;
+
+sub run_firmware_script {
+    my ($opts, $script) = @_;
+    unless ($script) {
+        print STDERR "fail: missing script name\n";
+        exit 1
+    }
+    print STDERR "Running $script\n\n";
+
+    if (0 == system("sh $script $opts")) { # FIXME correct exit code handling
+        print STDERR "success: firmware script ran succcessfully\n";
+    } else {
+        print STDERR "fail: firmware script returned error\n";
+    }
+}
+
+sub run_firmware_scripts {
+    my ($opts, @dirs) = @_;
+    # Run firmware packages
+    for my $dir (@dirs) {
+        print STDERR "info: Running scripts in $dir\n";
+        opendir(my $dh, $dir) or die "Unable to open directory $dir: $!";
+        while (my $s = readdir $dh) {
+            next if $s =~ m/^\.\.?/;
+            run_firmware_script($opts, "$dir/$s");
+        }
+        closedir $dh;
+    }
+}
+
+sub download {
+    my $url = shift;
+    print STDERR "info: Downloading $url\n";
+    system("wget --quiet \"$url\"");
+}
+
+sub upgrade_dell {
+    my @dirs;
+    my $product = `dmidecode -s system-product-name`;
+    chomp $product;
+
+    if ($product =~ m/PowerEdge/) {
+
+        # on RHEL, these pacakges are needed by the firwmare upgrade scripts
+        system('yum install -y compat-libstdc++-33.i686 libstdc++.i686 libxml2.i686 procmail');
+
+        my $tmpdir = tempdir(
+            CLEANUP => 1
+            );
+        chdir($tmpdir);
+        fetch_dell_fw('catalog/Catalog.xml.gz');
+        system('gunzip Catalog.xml.gz');
+        my @paths = fetch_dell_fw_list('Catalog.xml');
+        # -q is quiet, disabling interactivity and reducing console output
+        my $fwopts = "-q";
+        if (@paths) {
+            for my $url (@paths) {
+                fetch_dell_fw($url);
+            }
+            run_firmware_scripts($fwopts, $tmpdir);
+        } else {
+            print STDERR "error: Unsupported Dell model '$product'.\n";
+            print STDERR "error: Please report to $errorsto.\n";
+        }
+        chdir('/');
+    } else {
+        print STDERR "error: Unsupported Dell model '$product'.\n";
+        print STDERR "error: Please report to $errorsto.\n";
+    }
+}
+
+sub fetch_dell_fw {
+    my $path = shift;
+    my $url = "ftp://ftp.us.dell.com/$path";
+    download($url);
+}
+
+# Using ftp://ftp.us.dell.com/catalog/Catalog.xml.gz, figure out which
+# firmware packages to download from Dell.  Only work for Linux
+# machines and 11th generation Dell servers.
+sub fetch_dell_fw_list {
+    my $filename = shift;
+
+    my $product = `dmidecode -s system-product-name`;
+    chomp $product;
+    my ($mybrand, $mymodel) = split(/\s+/, $product);
+
+    print STDERR "Finding firmware bundles for $mybrand $mymodel\n";
+
+    my $xml = XMLin($filename);
+    my @paths;
+    for my $bundle (@{$xml->{SoftwareBundle}}) {
+        my $brand = $bundle->{TargetSystems}->{Brand}->{Display}->{content};
+        my $model = $bundle->{TargetSystems}->{Brand}->{Model}->{Display}->{content};
+        my $oscode;
+        if ("ARRAY" eq ref $bundle->{TargetOSes}->{OperatingSystem}) {
+            $oscode = $bundle->{TargetOSes}->{OperatingSystem}[0]->{osCode};
+        } else {
+            $oscode = $bundle->{TargetOSes}->{OperatingSystem}->{osCode};
+        }
+        if ($mybrand eq $brand && $mymodel eq $model && "LIN" eq $oscode)
+        {
+            @paths = map { $_->{path} } @{$bundle->{Contents}->{Package}};
+        }
+    }
+    for my $component (@{$xml->{SoftwareComponent}}) {
+        my $componenttype = $component->{ComponentType}->{value};
+
+        # Drop application packages, only firmware and BIOS
+        next if 'APAC' eq $componenttype;
+
+        my $cpath = $component->{path};
+        for my $path (@paths) {
+            if ($cpath =~ m%/$path$%) {
+                push(@paths, $cpath);
+            }
+        }
+    }
+    return @paths;
+}
+</pre>
+
+<p>The code is only tested on RedHat Enterprise Linux, but I suspect
+it could work on other platforms with some tweaking.  Anyone know a
+index like Catalog.xml is available from HP for HP servers?  At the
+moment I maintain a similar list manually and it is quickly getting
+outdated.</p>
+</div>
+      <div class="tags">
+        
+        
+        Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>. 
+        
+        
+      </div>
+    </div>
+    <div class="padding"></div>
+    
     <div class="entry">
       <div class="title"><a href="http://people.skolelinux.org/pere/blog/St_tt_Digitalt_Personvern_.html">Støtt Digitalt Personvern!</a></div>
       <div class="date"> 9th November 2011</div>
@@ -552,78 +746,6 @@ Jeg håper det blir bedre etter flytting i oktober.</p>
     </div>
     <div class="padding"></div>
     
-    <div class="entry">
-      <div class="title"><a href="http://people.skolelinux.org/pere/blog/Elektronisk_stemmegiving_over_Internet_og_datalagringsdirektivet.html">Elektronisk stemmegiving over Internet og datalagringsdirektivet</a></div>
-      <div class="date"> 7th August 2011</div>
-      <div class="body"><p>I dag slo det meg hvordan Datalagringsdirektivet vil kunne gjøre
-det enklere å vite hvem som har stemt hva med elektronisk stemmegiving
-slik den planlegges gjennomført i Norge i høst.</p>
-
-<p>Litt bakgrunnsinformasjon er kanskje nødvendig.  Siden før 2006 har
-<a href="http://www.regjeringen.no/nb/dep/krd/prosjekter/E-valg-2011-prosjektet.html">staten
-jobbet med å få på plass elektronisk stemmegiving</a> i Norge, der
-borgerne kan stemme via en datamaskin i et stemmelokale eller via en
-nettleser over Internet.  Slike valg
-<a href="http://www.nuug.no/dokumenter/valg-horing-2006-09.pdf">er
-mindre demokratiske</a> enn de valgene vi har hatt i Norge de siste
-årene.  En kan anta at for hver stemme som blir registrert i et slikt
-system vil det notert tidspunktet stemmen ble registrert.</p>
-
-<p>I mars i år vedtok stortinget å innføre
-<a href="http://bsdly.blogspot.com/2010/12/ikke-styrket-personvern-men-brev-og.html">elektronisk
-brev- og besøkskontroll av hele Norges befolkning</a>, da en vedtok at
-EUs datalagringsdirektiv skulle innlemmes i det norske lovverket.
-Denne kommunikasjonskontrollen innebærer blant annet at oppkoblinger
-med nettleser blir registert.  Det som ble vedtatt i mars innebærer
-ikke at det blir registrert hvilken nettside en besøkte, men det vil
-bli registrert en forbindelse mellom datamaskinene som er involvert.
-Dvs. når en besøker http://www.nuug.no/aktiviteter/20110809-forgerock/
-fra sin maskin med adressen cm-84.208.83.178.getinternet.no (tilfeldig
-valgt adresse for Get-kunde), så vil tidspunktet, og adressene
-www.nuug.no og cm-84.208.83.178.getinternet.no bli registrert.  En kan
-bruke adressen cm-*.getinternet.no til å identifisere
-kunde/husstand.</p>
-
-<p>Gitt at elektronisk stemmegiving via nettleser over Internet vil
-koble seg opp til datamaskinen som samler inn stemmer, så vil en altså
-ha et register over hver enkelt stemme knyttet mot tidspunkt, og et
-annet register som viser når kunder/husstander koblet seg opp mot
-datamaskinen som samler inn stemmer.  Ved å koble disse registrene ved
-hjelp av tidspunktet registrert i begge vil det ofte være mulig å
-finne ut hva kunder/husstander har stemt, uten å måtte knekke
-kryptering involvert i selve stemmesankingsystemet.  Det vil være
-mindre treffsikkert hvis flere stemmer blir registrert på samme
-tidspunkt, hvis stemmene er gitt til forskjellige partier, men en vil
-ha en viss ide hvilke partier det må ha vært ved å se hvilke partier
-som fikk stemmer på det aktuelle tidspunktet.</p>
-
-<p>Hvordan kan en vite at dette ikke blir gjort i dag?  Det vil være
-umulig for en borger å kontrollere hva som skjer på datamaskinen som
-samler inn stemmer.  De som står bak den norske elektroniske
-stemmegivingsløsningen har gitt ut kildekode som hevdes å være
-identisk med den som brukes til innsamling av stemmer, men det er ikke
-mulig for innbyggerne i Norge å kontrollere at den kildekoden er brukt
-til å lage programmene som brukes.  Det vil f.eks. være trivielt for
-de som kontrollerer denne datamaskinen å legge inn ekstra kode som
-sender kopi av alle stemmer til en annen database utenfor valgstyrenes
-kontroll.  Det påstås fra USA at det ble gjort med noen av de
-elektroniske stemmegivingsboksene der.  Kanskje det påstås at
-stemmetellings-systemet ikke vil notere tidspunkt for hver enkelt
-stemme, men også dette vil det være umulig for oss innbyggerne å
-egenhendig kontrollere.  Jeg vil ha valgsystemer som hver enkelt
-innbygger kan kontrollere, ikke et der vi må stole på påstander om
-systemet som ikke kan kontrolleres av hver enkelt innbygger.</p>
-</div>
-      <div class="tags">
-        
-        
-        Tags: <a href="http://people.skolelinux.org/pere/blog/tags/norsk">norsk</a>, <a href="http://people.skolelinux.org/pere/blog/tags/personvern">personvern</a>, <a href="http://people.skolelinux.org/pere/blog/tags/valg">valg</a>. 
-        
-        
-      </div>
-    </div>
-    <div class="padding"></div>
-    
     <p style="text-align: right;"><a href="index.rss"><img src="http://people.skolelinux.org/pere/blog/xml.gif" alt="RSS feed" width="36" height="14" /></a></p>
     <div id="sidebar">
       
@@ -655,7 +777,7 @@ systemet som ikke kan kontrolleres av hver enkelt innbygger.</p>
 
 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/10/">October (2)</a></li>
 
-<li><a href="http://people.skolelinux.org/pere/blog/archive/2011/11/">November (2)</a></li>
+<li><a href="http://people.skolelinux.org/pere/blog/archive/2011/11/">November (3)</a></li>
 
 </ul></li>
 
@@ -745,13 +867,13 @@ systemet som ikke kan kontrolleres av hver enkelt innbygger.</p>
 
  <li><a href="http://people.skolelinux.org/pere/blog/tags/bsa">bsa (2)</a></li>
 
- <li><a href="http://people.skolelinux.org/pere/blog/tags/debian">debian (53)</a></li>
+ <li><a href="http://people.skolelinux.org/pere/blog/tags/debian">debian (54)</a></li>
 
  <li><a href="http://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (63)</a></li>
 
  <li><a href="http://people.skolelinux.org/pere/blog/tags/digistan">digistan (7)</a></li>
 
- <li><a href="http://people.skolelinux.org/pere/blog/tags/english">english (97)</a></li>
+ <li><a href="http://people.skolelinux.org/pere/blog/tags/english">english (98)</a></li>
 
  <li><a href="http://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (13)</a></li>