summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/drakupdate_fstab
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/standalone/drakupdate_fstab')
-rwxr-xr-xperl-install/standalone/drakupdate_fstab80
1 files changed, 51 insertions, 29 deletions
diff --git a/perl-install/standalone/drakupdate_fstab b/perl-install/standalone/drakupdate_fstab
index 77c07ef89..fde9fa585 100755
--- a/perl-install/standalone/drakupdate_fstab
+++ b/perl-install/standalone/drakupdate_fstab
@@ -31,9 +31,23 @@ $::isStandalone = 1; #- not using standalone.pm which generates too many logs fo
log::l("drakupdate_fstab called with @ARGV\n");
-$::testing = $ARGV[0] eq '--test' && shift @ARGV;
-$::auto = $ARGV[0] eq '--auto' && shift @ARGV;
-my $no_flag = $ARGV[0] eq '--no-flag' && shift @ARGV;
+my ($no_flag, $debug, $removed);
+
+my %args = (
+ '--auto' => \$::auto,
+ '--debug' => \$debug,
+ '--no-flag' => \$no_flag,
+ '--test' => \$::testing,
+ );
+
+each_index {
+ if ($args{$_}) {
+ ${$args{$_}} = 1;
+ splice @ARGV, $::i - $removed, 1;
+ $removed++;
+ }
+} @ARGV;
+
my ($raw_action, $device_name) = @ARGV;
my ($action) = $raw_action =~ /^--(add|del)/;
@@ -47,8 +61,8 @@ sub check_hard_drives {
#- do not do anything if there are many partitions
#- otherwise we may add main extended partitions
- if ($name =~ s|/part\d+$||) {
- my @parts = grep { /part/ } all($name);
+ if (my ($path, $prefix) = $name =~ m!^(.*)/(\w+)\d+$!) {
+ my @parts = grep { /^\Q$prefix\E\d+$/ } all($path);
@parts <= 1;
} else {
1;
@@ -60,45 +74,47 @@ sub device_name_to_entry {
$name =~ s|/dev/||;
$name =~ /fd[01]/ && !$::auto and return { device => $name };
my @l = detect_devices::get();
+ if ($debug) {
+ require Data::Dumper;
+ output("/tmp/drakdump_devices-$action", Data::Dumper->Dump([ \@l ], [ qw($l) ]));
+ }
- my ($e, $nb);
- if ((my $devfs_prefix, $nb) = $name =~ m,(.*)/(?:cd|disc|part(\d+))$,) {
+ my $e;
+ if (my ($devfs_prefix, $nb) = $name =~ m,(.*)/(?:cd|disc|part(\d+))$,) {
$e = find { $_->{devfs_prefix} eq $devfs_prefix } @l;
- } else {
- if ($e = find { $name eq $_->{device} } @l) {
- $nb = '';
+ $e->{part_number} = $nb;
+ $e->{devfs_prefix} ||= $devfs_prefix;
+ $e->{devfs_device} = $e->{devfs_prefix} . '/part' . $nb;
+ if ($e->{devfs_device} eq $name) {
+ $e->{prefer_devfs_name} = 1;
} else {
- (my $prefix, $nb) = $name =~ m/^(.*?)(\d*)$/;
+ $e->{devfs_device} = $e->{device} = $name;
+ }
+ } else {
+ unless ($e = find { $name eq $_->{device} } @l) {
+ my ($prefix) = $name =~ m/^(.*?)\d*$/;
$e = find { $prefix eq ($_->{prefix} || $_->{device}) } @l;
+ $e->{device} = $name;
}
}
- if ($nb) {
- $e->{devfs_device} = $e->{devfs_prefix} . '/part' . $nb;
- $e->{device} = ($e->{prefix} || $e->{device}) . $nb;
- }
- $e ||= {};
- if ($e->{devfs_device} eq $name) {
- $e->{prefer_devfs_name} = 1;
- } else {
- $e->{device} = $name; #- keeping the exact name given (often is the devfs name)
- }
$e->{media_type} = 'fd' if $name =~ /fd[01]/;
$e;
}
sub set_options {
- my ($part, $useSupermount) = @_;
+ my ($part, $useSupermount, $o_sync) = @_;
$part->{is_removable} = 1; #- force removable flag
- fs::set_default_options($part,
+ fs::mount_options::set_default($part,
useSupermount => $useSupermount,
security => security::level::get(),
lang::fs_options(lang::read()));
- my ($options, $unknown) = fs::mount_options_unpack($part);
+ my ($options, $unknown) = fs::mount_options::unpack($part);
+ $options->{sync} = $o_sync if defined($o_sync);
$options->{kudzu} = 1 if !$no_flag;
- fs::mount_options_pack($part, $options, $unknown);
+ fs::mount_options::pack($part, $options, $unknown);
}
sub set_mount_point {
@@ -108,7 +124,7 @@ sub set_mount_point {
$mntpoint = "/mnt/$mntpoint";
foreach ('', 2 .. 10) {
- next if fsedit::mntpoint2part("$mntpoint$_", $fstab);
+ next if fs::get::mntpoint2part("$mntpoint$_", $fstab);
$part->{mntpoint} = "$mntpoint$_";
return 1;
}
@@ -134,15 +150,21 @@ sub main {
my $fstab = [ fs::read_fstab('', '/etc/fstab', 'keep_freq_passno', 'keep_devfs_name', 'verbatim_credentials') ];
my ($existing_fstab_entries, $fstab_) = partition { fsedit::is_same_hd($_, $part) } @$fstab;
+ if ($debug) {
+ require Data::Dumper;
+ output("/tmp/drakdump_entries-$action", Data::Dumper->Dump([ \@ARGV, $part, $fstab, $fstab_, $existing_fstab_entries ],
+ [ qw($ARGV $part $fstab $fstab_ $existing_fstab_entries) ]));
+ }
if ($action eq 'add') {
if (@$existing_fstab_entries) {
print STDERR "Already in fstab\n" if $::testing;
return;
}
- my $useSupermount = ${{ getVarsFromSh('/etc/sysconfig/dynamic') }}{SUPERMOUNT} eq 'no' ? '' : 'magicdev';
- set_options($part, $useSupermount);
+ my %dynamic = getVarsFromSh('/etc/sysconfig/dynamic');
+ my $useSupermount = $dynamic{SUPERMOUNT} eq 'yes' ? 'magicdev' : '';
+ set_options($part, $useSupermount, to_bool($dynamic{SYNC} ne 'no'));
set_mount_point($part, $fstab) or return;
-
+
my ($line) = fs::prepare_write_fstab([$part]);
if ($line) {
append_to_file($fstab_file, $line);