#!/usr/bin/perl -w # harddrake2 This service runs the HardDrake hardware probe. # # chkconfig: 345 05 95 # description: This runs the hardware probe, and optionally configures \ # changed hardware. # TODO: start/stop/status/ use lib qw(/usr/lib/libDrakX); use strict; use standalone; #- warning, standalone must be loaded very first, for 'explanations' use MDK::Common; use POSIX; use interactive; use harddrake::data; use Data::Dumper; my $hw_sysconfdir = "/etc/sysconfig/harddrake2"; my $last_boot_config = "$hw_sysconfdir/previous_hw"; my $str = '#!/usr/bin/perl -w # # Special file generated by harddrake service (cvs revision $Revision$). # Do not alter it; it\'ll be overwritten by harddrake2 service # # Format is : { Config_class_ID => { # Device => { # _Fields => values} ...} ...} # '; my $in = 'interactive'->vnew('su'); # first run ? if not read old hw config my $previous_config = -f $last_boot_config ? do $last_boot_config : {}; my %config; # For each hw, class, detect device, compare and offer to reconfigure if # needed foreach (@data::tree) { my ($Ident, $item, undef, $configurator, $detector) = @$_; # No detector ? (should never happen but who know ?) ref($detector) eq 'CODE' or next; my %ID = map { my $i = $_; my $name = do { if ($item eq "Mouse") { $i->{media_type} = "MOUSE"; $i->{device}; } elsif (defined $i->{device}) { $i->{media_type} = "MASS_STORAGE_MEDIA"; $i->{device}; } else { join ':', map { $i->{$_} } qw(vendor id subvendor subid); } }; $name => $i; } &$detector; $config{$Ident} = \%ID; my $oldconfig = $previous_config->{$Ident}; my $msg; my @was_removed = difference2([ keys %$oldconfig ], [ keys %ID ]); $msg .= _("Some devices in the \"%s\" hardware class were removed:\n", $item) if @was_removed; $msg .= "- $_ was removed\n" foreach @was_removed; my @added = difference2([ keys %ID ], [ keys %$oldconfig ]); $msg .= _("\nSome devices in the %s class were added:\n", $item) if @added; $msg .= "- $_ was added\n" foreach @added; @added || @was_removed or next; if ($in->ask_okcancel("Hardware changes in $Ident class", $msg . "\nDo you want to run the appropriate config tool ?", 1)) { if (my $pid = fork) { POSIX::wait(); } else { exec($configurator) or die "$configurator missing\n"; } } } $Data::Dumper::Terse = 1; # don't output names where feasible $Data::Dumper::Purity = 1; # fill in the holes for eval # output new hw config output("$last_boot_config", $str . Dumper(\%config) . ";\n");