diff options
author | Pascal Rigaux <pixel@mandriva.com> | 1999-11-09 03:02:37 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 1999-11-09 03:02:37 +0000 |
commit | 950fe7395621dc21885ac3e1280e007248646608 (patch) | |
tree | e3016a95189ee4c75a05b816d91dd22f071bd2c0 /perl-install/raid.pm | |
parent | c7df31b71335c18d60cdb8a7f5fee24d56cca4b8 (diff) | |
download | drakx-950fe7395621dc21885ac3e1280e007248646608.tar drakx-950fe7395621dc21885ac3e1280e007248646608.tar.gz drakx-950fe7395621dc21885ac3e1280e007248646608.tar.bz2 drakx-950fe7395621dc21885ac3e1280e007248646608.tar.xz drakx-950fe7395621dc21885ac3e1280e007248646608.zip |
no_comment
Diffstat (limited to 'perl-install/raid.pm')
-rw-r--r-- | perl-install/raid.pm | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/perl-install/raid.pm b/perl-install/raid.pm new file mode 100644 index 000000000..7cc2eb7d6 --- /dev/null +++ b/perl-install/raid.pm @@ -0,0 +1,112 @@ +package raid; + +use diagnostics; +use strict; + +#-###################################################################################### +#- misc imports +#-###################################################################################### +use common qw(:common :functional); +use run_program; +use devices; +use fs; + +sub nb($) { + my ($nb) = @_; + first((ref $nb ? $nb->{device} : $nb) =~ /(\d+)/); +} + +sub is($) { + my ($part) = @_; + $part->{device} =~ /^md/; +} + +sub new($$) { + my ($raid, $part) = @_; + my $nb = @$raid; + $raid->[$nb] = { 'chunk-size' => "64k", type => 0x83, disks => [ $part ], device => "md$nb", notFormatted => 1 }; + $part->{raid} = $nb; +} + +sub add($$$) { + my ($raid, $part, $nb) = @_; + $raid->[$nb]{isMounted} and die _("Can't add a partition to _formatted_ RAID md%d", $nb); + $part->{raid} = $nb; + push @{$raid->[$nb]{disks}}, $part; +} + +sub delete($$) { + my ($raid, $nb) = @_; + $nb = nb($nb); + + delete $_->{raid} foreach @{$raid->[$nb]{disks}}; + $raid->[$nb] = undef; +} + +sub removeDisk($$) { + my ($raid, $part) = @_; + my $nb = nb($part->{raid}); + delete $part->{raid}; + @{$raid->[$nb]{disks}} = grep { $_ != $part } @{$raid->[$nb]{disks}}; + update($raid->[$nb]); +} + +sub updateSize($) { + my ($part) = @_; + local $_ = $part->{level}; + my @l = map { $_->{size} } @{$part->{disks}}; + + $part->{size} = do { + if (/0|linear/) { sum @l } + elsif (/1/ ) { min @l } + elsif (/4|5/) { min(@l) * $#l } + }; +} + +sub updateIsFormatted($) { + my ($part) = @_; + $part->{isFormatted} = and_ map { $_->{isFormatted} } @{$part->{disks}}; + $part->{notFormatted} = and_ map { $_->{notFormatted} } @{$part->{disks}}; +} +sub update($) { + &updateSize; + &updateIsFormatted; +} + +sub write($) { + my ($raid, $file) = @_; + local *F; + local $\ = "\n"; + + foreach (grep {$_} @$raid) { + open F, ">$file" or die _("Can't write file $file"); + print F <<"EOF"; +raiddev /dev/$_->{device} +raid-level $_->{level} +chunk-size $_->{'chunk-size'} +persistent-superblock 1 +EOF + print F "nr-raid-disks ", int @{$_->{disks}}; + map_index { + print F " device /dev/$_->{device}"; + print F " raid-disk $::i"; + } @{$_->{disks}}; + } +} + +sub make($$) { + my ($raid, $part) = @_; + my $dev = devices::make($part->{device}); + run_program::run("raidstop", $dev); + &write($raid, "/etc/raidtab"); + run_program::run("mkraid", "--really-force", $dev); + run_program::run("raidstart", $dev); +} + +sub format_part($$) { + my ($raid, $part) = @_; + make($raid->{raid}, $part) if is($part); + fs::format_part($part); +} + +1; |