summaryrefslogtreecommitdiffstats
path: root/perl-install/fs.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/fs.pm')
-rw-r--r--perl-install/fs.pm245
1 files changed, 3 insertions, 242 deletions
diff --git a/perl-install/fs.pm b/perl-install/fs.pm
index 391981307..e84c9d938 100644
--- a/perl-install/fs.pm
+++ b/perl-install/fs.pm
@@ -11,6 +11,7 @@ use devices;
use fs::type;
use fs::get;
use fs::format;
+use fs::mount_options;
use run_program;
use detect_devices;
use modules;
@@ -87,12 +88,12 @@ sub read_fstab {
require network::smb;
#- remove credentials=file with username=foo,password=bar,domain=zoo
#- the other way is done in fstab_to_string
- my ($options, $unknown) = mount_options_unpack($h);
+ my ($options, $unknown) = fs::mount_options::unpack($h);
my $file = delete $options->{'credentials='};
my $credentials = network::smb::read_credentials_raw($file);
if ($credentials->{username}) {
$options->{"$_="} = $credentials->{$_} foreach qw(username password domain);
- mount_options_pack($h, $options, $unknown);
+ fs::mount_options::pack($h, $options, $unknown);
}
}
@@ -337,246 +338,6 @@ sub auto_fs() {
grep { chop; $_ && !/nodev/ } cat_("/etc/filesystems");
}
-sub mount_options() {
- my %non_defaults = (
- sync => 'async', noatime => 'atime', noauto => 'auto', ro => 'rw',
- user => 'nouser', nodev => 'dev', noexec => 'exec', nosuid => 'suid',
- );
- my @user_implies = qw(noexec nodev nosuid);
- \%non_defaults, \@user_implies;
-}
-
-sub mount_options_unpack {
- my ($part) = @_;
- my $packed_options = $part->{options};
-
- my ($non_defaults, $user_implies) = mount_options();
-
- my @auto_fs = auto_fs();
- my %per_fs = (
- iso9660 => [ qw(unhide) ],
- vfat => [ qw(umask=0 umask=0022) ],
- ntfs => [ qw(umask=0 umask=0022) ],
- nfs => [ qw(rsize=8192 wsize=8192) ],
- smbfs => [ qw(username= password=) ],
- davfs => [ qw(username= password= uid= gid=) ],
- reiserfs => [ 'notail' ],
- );
- push @{$per_fs{$_}}, 'usrquota', 'grpquota' foreach 'ext2', 'ext3', 'xfs';
-
- while (my ($fs, $l) = each %per_fs) {
- $part->{fs_type} eq $fs || $part->{fs_type} eq 'auto' && member($fs, @auto_fs) or next;
- $non_defaults->{$_} = 1 foreach @$l;
- }
-
- $non_defaults->{encrypted} = 1 if !$part->{isFormatted} || isSwap($part);
-
- $non_defaults->{supermount} = 1 if $part->{fs_type} =~ /:/ || member($part->{fs_type}, 'auto', @auto_fs);
-
- my $defaults = { reverse %$non_defaults };
- my %options = map { $_ => '' } keys %$non_defaults;
- my @unknown;
- foreach (split(",", $packed_options)) {
- if ($_ eq 'user') {
- $options{$_} = 1 foreach 'user', @$user_implies;
- } elsif (exists $non_defaults->{$_}) {
- $options{$_} = 1;
- } elsif ($defaults->{$_}) {
- $options{$defaults->{$_}} = 0;
- } elsif (/(.*?=)(.*)/) {
- $options{$1} = $2;
- } else {
- push @unknown, $_;
- }
- }
- # merge those, for cleaner help
- $options{'rsize=8192,wsize=8192'} = delete $options{'rsize=8192'} && delete $options{'wsize=8192'}
- if exists $options{'rsize=8192'};
-
- my $unknown = join(",", @unknown);
- \%options, $unknown;
-}
-
-sub mount_options_pack_ {
- my ($_part, $options, $unknown) = @_;
-
- my ($non_defaults, $user_implies) = mount_options();
- my @l;
-
- my @umasks = map {
- if (/^umask=/) {
- my $v = delete $options->{$_};
- /^umask=(.+)/ ? if_($v, $1) : $v;
- } else { () }
- } keys %$options;
- if (@umasks) {
- push @l, 'umask=' . min(@umasks);
- }
-
- if (delete $options->{user}) {
- push @l, 'user';
- foreach (@$user_implies) {
- if (!delete $options->{$_}) {
- # overriding
- $options->{$non_defaults->{$_}} = 1;
- }
- }
- }
- push @l, map_each { if_($::b, $::a =~ /=$/ ? "$::a$::b" : $::a) } %$options;
- push @l, $unknown;
-
- join(",", uniq(grep { $_ } @l));
-}
-sub mount_options_pack {
- my ($part, $options, $unknown) = @_;
- $part->{options} = mount_options_pack_($part, $options, $unknown);
- noreturn();
-}
-
-# update me on each util-linux new release:
-sub mount_options_help() {
- (
-
- 'grpquota' => '',
-
- 'noatime' => N("Do not update inode access times on this file system
-(e.g, for faster access on the news spool to speed up news servers)."),
-
- 'noauto' => N("Can only be mounted explicitly (i.e.,
-the -a option will not cause the file system to be mounted)."),
-
- 'nodev' => N("Do not interpret character or block special devices on the file system."),
-
- 'noexec' => N("Do not allow execution of any binaries on the mounted
-file system. This option might be useful for a server that has file systems
-containing binaries for architectures other than its own."),
-
- 'nosuid' => N("Do not allow set-user-identifier or set-group-identifier
-bits to take effect. (This seems safe, but is in fact rather unsafe if you
-have suidperl(1) installed.)"),
-
- 'ro' => N("Mount the file system read-only."),
-
- 'sync' => N("All I/O to the file system should be done synchronously."),
-
- 'supermount' => '',
-
- 'user' => N("Allow an ordinary user to mount the file system. The
-name of the mounting user is written to mtab so that he can unmount the file
-system again. This option implies the options noexec, nosuid, and nodev
-(unless overridden by subsequent options, as in the option line
-user,exec,dev,suid )."),
-
- 'usrquota' => '',
-
- 'umask=0' => N("Give write access to ordinary users"),
-
- 'umask=0022' => N("Give read-only access to ordinary users"),
- );
-}
-
-
-sub rationalize_options {
- my ($part) = @_;
-
- my ($options, $unknown) = mount_options_unpack($part);
-
- if ($part->{fs_type} ne 'reiserfs') {
- $options->{notail} = 0;
- }
-
- mount_options_pack($part, $options, $unknown);
-}
-
-sub set_default_options {
- my ($part, %opts) = @_;
- #- opts are: useSupermount security iocharset codepage
-
- my ($options, $unknown) = mount_options_unpack($part);
-
- if ($part->{is_removable} && !member($part->{mntpoint}, qw(/ /usr /var /boot))) {
- $options->{supermount} = $opts{useSupermount} && !($opts{useSupermount} eq 'magicdev' && $part->{media_type} eq 'cdrom');
- $part->{fs_type} = !$options->{supermount} ? 'auto' :
- $part->{media_type} eq 'cdrom' ? 'udf:iso9660' : 'ext2:vfat';
- }
-
- if ($part->{media_type} eq 'cdrom') {
- $options->{ro} = 1;
- }
-
- if ($part->{media_type} eq 'fd') {
- # slow device so don't loose time, write now!
- $options->{sync} = 1;
- }
-
- if (isTrueFS($part)) {
- #- noatime on laptops (do not wake up the hd)
- #- Do not update inode access times on this
- #- file system (e.g, for faster access on the
- #- news spool to speed up news servers).
- $options->{noatime} = detect_devices::isLaptop();
- }
- if ($part->{fs_type} eq 'nfs') {
- put_in_hash($options, {
- nosuid => 1, 'rsize=8192,wsize=8192' => 1, soft => 1,
- });
- }
- if ($part->{fs_type} eq 'smbfs') {
- add2hash($options, { 'username=' => '%' }) if !$options->{'credentials='};
- }
- if (member('vfat', split(':', $part->{fs_type})) || $part->{fs_type} eq 'auto') {
-
- put_in_hash($options, {
- user => 1, noexec => 0,
- }) if $part->{is_removable};
-
- put_in_hash($options, {
- 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4,
- 'iocharset=' => $opts{iocharset}, 'codepage=' => $opts{codepage},
- });
- }
- if ($part->{fs_type} eq 'ntfs') {
- put_in_hash($options, { ro => 1, 'nls=' => $opts{iocharset},
- 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4,
- });
- }
- if (member('iso9660', split(':', $part->{fs_type})) || $part->{fs_type} eq 'auto') {
- put_in_hash($options, { user => 1, noexec => 0, 'iocharset=' => $opts{iocharset} });
- }
- if ($part->{fs_type} eq 'reiserfs') {
- $options->{notail} = 1;
- }
- if (isLoopback($part) && !isSwap($part)) { #- no need for loop option for swap files
- $options->{loop} = 1;
- }
-
- # rationalize: no need for user
- if ($options->{autofs} || $options->{supermount}) {
- $options->{user} = 0;
- }
-
- # have noauto when we have user
- $options->{noauto} = 1 if $options->{user};
-
- if ($options->{user}) {
- # ensure security (user_implies - noexec as noexec is not a security matter)
- $options->{$_} = 1 foreach 'nodev', 'nosuid';
- }
-
- mount_options_pack($part, $options, $unknown);
-
- rationalize_options($part);
-}
-
-sub set_all_default_options {
- my ($all_hds, %opts) = @_;
- #- opts are: useSupermount security iocharset codepage
-
- foreach my $part (fs::get::really_all_fstab($all_hds)) {
- set_default_options($part, %opts);
- }
-}
-
sub set_removable_mntpoints {
my ($all_hds) = @_;