source: branches/3.2/MondoRescue/lib/MondoRescue/Kernel.pm @ 3250

Last change on this file since 3250 was 3250, checked in by Bruno Cornec, 6 years ago
  • The mr-kernel-get-modules program now returns all the full paths for all modules passed in parameters with their dependencies. Which is

exactly what needs mindi

File size: 4.0 KB
Line 
1#!/usr/bin/perl -w
2#
3# Subroutines related to Kernel brought by the MondoRescue project
4#
5# $Id$
6#
7# Copyright B. Cornec 2008-2014
8# Provided under the GPL v2
9
10package MondoRescue::Kernel;
11
12use strict 'vars';
13use Data::Dumper;
14use POSIX "uname";
15use lib qw (lib);
16use ProjectBuilder::Base;
17use ProjectBuilder::Conf;
18use MondoRescue::Base;
19use MondoRescue::Inventory;
20
21# Inherit from the "Exporter" module which handles exporting functions.
22
23use Exporter;
24
25# Export, by default, all the functions into the namespace of
26# any code which uses this module.
27
28our @ISA = qw(Exporter);
29our @EXPORT = qw(mr_kernel_get_version mr_kernel_get_modules);
30
31=pod
32
33=head1 NAME
34
35MondoRescue::Kernel, part of the mondorescue.org
36
37=head1 DESCRIPTION
38
39This modules provides low level functions for Kernel support in the Mondorescue project
40
41=head1 USAGE
42
43=over 4
44
45=item B<mr_kernel_get_version>
46
47This function checks the kernel and returns back its version
48
49=cut
50
51sub mr_kernel_get_version {
52
53my ($os,$ver,$kernelver,$rest);
54
55# By default we don't know how it works for other OSes
56$kernelver = "unknown";
57
58my ($sysname, $nodename, $release, $version, $machine ) = uname();
59$kernelver = $release if (defined $release);
60
61return($kernelver);
62}
63
64
65=item B<mr_kernel_get_modules>
66
67Tis function takes as input the kernel version to examined (can be undef in which case the running kernel is used) and a list of modules names to examined as well (can be undef in which case all modules ar taken)
68This function returns back the modules path as a first argument and the list of relative modules path for the modules names passed.
69
70Example:
71mr_kernel_get_modules("3.8.13.4-desktop-1.mga3","ext3") returns
72("/lib/modules/3.8.13.4-desktop-1.mga3", "kernel/fs/ext3/ext3.ko.xz","kernel/fs/jbd/jbd.ko.xz")
73
74=cut
75
76sub mr_kernel_get_modules {
77
78my @allmodules = @_;
79my $ver = shift @allmodules;
80$ver = mr_kernel_get_version() if (not defined ($ver));
81
82my $module = ""; 
83my %modlist;
84my $void = "";
85my @allmodpaths;
86my $modulepath = "";
87
88#print Dumper(@allmodules);
89
90# If no module names list passed as parameter, the work on all modules of the system
91if (not defined $allmodules[0]) {
92    open(LSMOD, "/sbin/lsmod |") or die "Unable to launch lsmod";
93    while (<LSMOD>) {
94        next if (/^Module/);
95        ($module, $void) = split(/ /);
96        print "***$module***|***$void***\n";
97        push @allmodules,$module;
98    }
99    close(LSMOD);
100}
101#print Dumper(@allmodules);
102
103open(DEPMOD, "/sbin/depmod -n $ver |") or die "Unable to launch depmod";
104while (<DEPMOD>) {
105    ($module, $void) = split(/:/);
106    last if ($module =~ /^#/);
107    chomp($void);
108    $void =~ s/\s+//;
109    $modlist{$module} = $void;
110    pb_log(2,"Depmod on $module gives $void\n");
111}
112close(DEPMOD);
113
114#print Dumper(%modlist)."\n";
115
116my $lib;
117my $modulep;
118my $kernelv;
119my $modpath;
120
121foreach my $m (@allmodules) {
122    pb_log(1,"Analyzing $m\n");
123    open(MODINFO, "/sbin/modinfo -n -k $ver $m 2>/dev/null |") or die "Unable to launch modinfo";
124    $module = <MODINFO>;
125    close(MODINFO);
126    if ((not defined $module) || ($module =~ '^$')) {
127        pb_log(1,"WARNING: No modinfo for module $m\n");
128        next;
129    }
130    chomp($module);
131    ($void,$lib,$modulep,$kernelv,$modpath) = split(/\//,$module,5);
132    next if (not defined $modpath);
133    $modulepath = "/$lib/$modulep/$kernelv";
134    pb_log(2,"modpath: $modulepath/$modpath\n");
135    push @allmodpaths,"$modulepath/$modpath",map { "$modulepath/".$_ } split(/ /,$modlist{$modpath});
136}
137pb_log(1,"all modpaths: ".join(' ',@allmodpaths)."\n");
138# From List::More
139my %seen = ();
140return(grep { not $seen{$_}++ } @allmodpaths);
141}
142
143=back
144
145=head1 WEB SITES
146
147The main Web site of the project is available at L<http://www.mondorescue.org/>. Bug reports should be filled using the trac instance of the project at L<http://trac.mondorescue.org/>.
148
149=head1 USER MAILING LIST
150
151The mailing list of the project is available at L<mailto:mondo@lists.sf.net>
152 
153=head1 AUTHORS
154
155The Mondorescue.org team L<http://www.mondorescue.org/> lead by Bruno Cornec L<mailto:bruno@mondorescue.org>.
156
157=head1 COPYRIGHT
158
159This module is distributed under the GPL v2.0 license
160described in the file C<COPYING> included with the distribution.
161
162=cut
163
1641;
165
Note: See TracBrowser for help on using the repository browser.