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

Last change on this file since 3250 was 3250, checked in by Bruno Cornec, 10 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
RevLine 
[3219]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;
[3249]14use POSIX "uname";
[3219]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);
[3249]29our @EXPORT = qw(mr_kernel_get_version mr_kernel_get_modules);
[3219]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
[3249]58my ($sysname, $nodename, $release, $version, $machine ) = uname();
59$kernelver = $release if (defined $release);
[3219]60
61return($kernelver);
62}
63
[3249]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
[3250]78my @allmodules = @_;
79my $ver = shift @allmodules;
[3249]80$ver = mr_kernel_get_version() if (not defined ($ver));
81
82my $module = "";
83my %modlist;
84my $void = "";
85my @allmodpaths;
86my $modulepath = "";
87
[3250]88#print Dumper(@allmodules);
89
[3249]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(/ /);
[3250]96 print "***$module***|***$void***\n";
[3249]97 push @allmodules,$module;
98 }
99 close(LSMOD);
100}
[3250]101#print Dumper(@allmodules);
[3249]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);
[3250]108 $void =~ s/\s+//;
[3249]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);
[3250]133 $modulepath = "/$lib/$modulep/$kernelv";
134 pb_log(2,"modpath: $modulepath/$modpath\n");
135 push @allmodpaths,"$modulepath/$modpath",map { "$modulepath/".$_ } split(/ /,$modlist{$modpath});
[3249]136}
137pb_log(1,"all modpaths: ".join(' ',@allmodpaths)."\n");
[3250]138# From List::More
139my %seen = ();
140return(grep { not $seen{$_}++ } @allmodpaths);
[3249]141}
142
[3219]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.