diff options
Diffstat (limited to 'perl-install/standalone')
-rwxr-xr-x | perl-install/standalone/harddrake2 | 6 | ||||
-rwxr-xr-x | perl-install/standalone/service_harddrake | 97 |
2 files changed, 103 insertions, 0 deletions
diff --git a/perl-install/standalone/harddrake2 b/perl-install/standalone/harddrake2 new file mode 100755 index 000000000..b41cf2374 --- /dev/null +++ b/perl-install/standalone/harddrake2 @@ -0,0 +1,6 @@ +#!/usr/bin/perl -w + +use strict; +use harddrake::ui; + +ui->run; diff --git a/perl-install/standalone/service_harddrake b/perl-install/standalone/service_harddrake new file mode 100755 index 000000000..d0e8ae386 --- /dev/null +++ b/perl-install/standalone/service_harddrake @@ -0,0 +1,97 @@ +#!/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"); |