summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/service_harddrake
blob: 87574e35d2530de9a7b5c117452ccb9d122f40c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/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 (@harddrake::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};
    next if is_empty_hash_ref %$previous_config;

    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;
   
    next unless (-x $configurator);

    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");