X-Git-Url: https://pere.pagekite.me/gitweb/homepage.git/blobdiff_plain/23cf16347af04bdc0d06d0b120e5760a378938e2..0a57ed08838f2dd34370b8a8ced2ef6b38e7a515:/blog/index.rss diff --git a/blog/index.rss b/blog/index.rss index 905dc728d9..7e34d83157 100644 --- a/blog/index.rss +++ b/blog/index.rss @@ -6,6 +6,194 @@ http://people.skolelinux.org/pere/blog/ + + Automatically upgrading server firmware on Dell PowerEdge + http://people.skolelinux.org/pere/blog/Automatically_upgrading_server_firmware_on_Dell_PowerEdge.html + http://people.skolelinux.org/pere/blog/Automatically_upgrading_server_firmware_on_Dell_PowerEdge.html + Mon, 21 Nov 2011 12:00:00 +0100 + <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> + + + Støtt Digitalt Personvern! http://people.skolelinux.org/pere/blog/St_tt_Digitalt_Personvern_.html @@ -485,71 +673,5 @@ Jeg håper det blir bedre etter flytting i oktober.</p> - - Elektronisk stemmegiving over Internet og datalagringsdirektivet - http://people.skolelinux.org/pere/blog/Elektronisk_stemmegiving_over_Internet_og_datalagringsdirektivet.html - http://people.skolelinux.org/pere/blog/Elektronisk_stemmegiving_over_Internet_og_datalagringsdirektivet.html - Sun, 7 Aug 2011 10:00:00 +0200 - <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> - - -