source: branches/3.2/MondoRescue/lib/MondoRescue/Disk.pm @ 3447

Last change on this file since 3447 was 3447, checked in by Bruno Cornec, 5 years ago
  • Adds a mr-device-mounted binary to MondoRescue? (replaces the code of the C function is_this_device_mounted) and the corresponding perl function (mr_device_mounted) to handle cases where a mounted device has a different name than the one seen on mount (e.g. /dev/rhel/root and /dev/mapper/rhel-root)
  • Adds perl function mr_file_copy_and_erase_hash to empty the hash generated in mr_file_read_all_link and thus avoid filling the hash it generates, which is useful for a recursive function, but not when called multiple times from another perl script. To be improved later on.
  • Adapt build procedure to the new binary (tested on Mageia 5 and RHEL7)
File size: 2.4 KB
Line 
1#!/usr/bin/perl -w
2#
3# Disk subroutines brought by the MondoRescue project
4#
5# $Id$
6#
7# Copyright B. Cornec 2008-2015
8# Provided under the GPL v2
9
10package MondoRescue::Disk;
11
12use strict 'vars';
13use ProjectBuilder::Base;
14use English;
15use MondoRescue::File;
16
17# Inherit from the "Exporter" module which handles exporting functions.
18
19use Exporter;
20
21# Export, by default, all the functions into the namespace of
22# any code which uses this module.
23
24our @ISA = qw(Exporter);
25our @EXPORT = qw(mr_disk_type mr_device_mounted);
26
27=pod
28
29=head1 NAME
30
31MondoRescue::Disk, part of the mondorescue.org
32
33=head1 DESCRIPTION
34
35This modules provides disk related functions for the Mondorescue project
36
37=head1 USAGE
38
39=over 4
40
41=item B<mr_disk_type>
42
43This function uses fdisk to determine the type of disk whose device is passed as a parameter
44It returns either msdos for MBR type or gpt for GPT type
45
46=cut
47
48sub mr_disk_type {
49
50my $device = shift;
51# MBR by default
52my $type = "msdos";
53
54my $fdisk = pb_check_req("fdisk",0);
55
56open(FDISK, "$fdisk -l $device 2>/dev/null |") || die "Unable to read from $fdisk";
57while (<FDISK>) {
58    if (($_ =~ /EFI GPT/) || ($_ =~ / GPT /)) {
59        $type= "gpt";
60        last;
61    }
62}
63close(FDISK);
64pb_log(2,"Found a $type partition format\n");
65return ($type);
66}
67
68
69=item B<mr_device_mounted>
70
71This function returns the mount point if a device is mounted and undef if not.
72
73=cut
74
75sub mr_device_mounted {
76
77my $device = shift;
78
79return(1) if ((not defined $device) || ($device =~ "^/sys|^/proc"));
80
81my $h = mr_file_read_all_link($device);
82# Preserve that hash locally before earsing it to reuse another one
83my $h2 = mr_file_copy_and_erase_hash($h);
84
85foreach my $f (keys %$h2) {
86    pb_log(2,"Working on device $f\n");
87    # TODO: get them from a conf file - FreeBSD needs swapinfo for swap request
88    foreach my $dev ("mount","cat /proc/swaps") {
89        # Look for the device in the command result
90        open(MOUNT,"$dev|") || die "Unable to execute the $dev command";
91        while (<MOUNT>) {
92            my ($mntp,$void) = split('\s',$_,2);
93            $h = mr_file_read_all_link($mntp);
94            foreach my $m (keys %$h) {
95                pb_log(2,"== Working on mounted device $m\n");
96                if ($m eq $f) {
97                    # Find the mountpoint and return it
98                    my ($void1,$mountpoint,$void2) = split('\s',$void);
99                    pb_log(2,"*** Found $m on $mountpoint\n") if (defined $mountpoint);
100                    return($mountpoint);
101                }
102            }
103            my $h3 = mr_file_copy_and_erase_hash($h);
104        }
105        close(MOUNT);
106    }
107}
108
109# Not found
110return(undef);
111}
Note: See TracBrowser for help on using the repository browser.