############################################################ # # $Id: Linux.pm 364 2006-03-23 15:22:19Z nicolaw $ # Sys::Filesystem - Retrieve list of filesystems and their properties # # Copyright 2004,2005,2006 Nicola Worthington # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ############################################################ package Sys::Filesystem::Linux; # vim:ts=4:sw=4:tw=78 use strict; use FileHandle; use Carp qw(croak); use vars qw($VERSION); $VERSION = '1.13' || sprintf('%d', q$Revision: 364 $ =~ /(\d+)/g); sub new { ref(my $class = shift) && croak 'Class name required'; my %args = @_; my $self = { }; # Defaults $args{fstab} ||= '/etc/fstab'; $args{mtab} ||= '/etc/mtab'; $args{xtab} ||= '/etc/lib/nfs/xtab'; # Default fstab and mtab layout my @keys = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno); # Read the fstab my $fstab = new FileHandle; if ($fstab->open($args{fstab})) { while (<$fstab>) { next if (/^\s*#/ || /^\s*$/); my @vals = split(/\s+/, $_); if ($vals[0] =~ /^\s*LABEL=(.+)\s*$/) { $self->{$vals[1]}->{label} = $1; } $self->{$vals[1]}->{mount_point} = $vals[1]; $self->{$vals[1]}->{device} = $vals[0]; $self->{$vals[1]}->{unmounted} = 1; $self->{$vals[1]}->{special} = 1 if grep(/^$vals[2]$/,qw(swap proc devpts tmpfs)); for (my $i = 0; $i < @keys; $i++) { $self->{$vals[1]}->{$keys[$i]} = $vals[$i]; } } $fstab->close; } else { croak "Unable to open fstab file ($args{fstab})\n"; } # Read the mtab my $mtab = new FileHandle; if ($mtab->open($args{mtab})) { while (<$mtab>) { next if /^\s*\#/; next if /^\s*$/; my @vals = split(/\s+/, $_); delete $self->{$vals[1]}->{unmounted} if exists $self->{$vals[1]}->{unmounted}; $self->{$vals[1]}->{mounted} = 1; $self->{$vals[1]}->{mount_point} = $vals[1]; $self->{$vals[1]}->{device} = $vals[0]; $self->{$vals[1]}->{special} = 1 if grep(/^$vals[2]$/,qw(swap proc devpts tmpfs)); for (my $i = 0; $i < @keys; $i++) { $self->{$vals[1]}->{$keys[$i]} = $vals[$i]; } } $mtab->close; } else { croak "Unable to open mtab file ($args{mtab})\n"; } # Bless and return bless($self,$class); return $self; } 1; =pod =head1 NAME Sys::Filesystem::Linux - Return Linux filesystem information to Sys::Filesystem =head1 SYNOPSIS See L. =head1 METHODS The following is a list of filesystem properties which may be queried as methods through the parent L object. =over 4 =item fs_spec Dscribes the block special device or remote filesystem to be mounted. For ordinary mounts it will hold (a link to) a block special device node (as created by L) for the device to be mounted, like /dev/cdrom’ or ‘/dev/sdb7’. For NFS mounts one will have :, e.g., ‘knuth.aeb.nl:/’. For procfs, use ‘proc’. Instead of giving the device explicitly, one may indicate the (ext2 or xfs) filesystem that is to be mounted by its UUID or volume label (cf. L or L), writing LABEL=