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

Last change on this file since 3254 was 3254, checked in by bruno, 5 years ago
  • Removes duplicate log in mindi
  • Plan for a log of live modules vs extra modules
File size: 4.2 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 @alllivemodules;
86my @allmodpaths;
87my $modulepath = "";
88
89#print Dumper(@allmodules);
90
91# First compute the list of "live" modules - run on the system
92open(LSMOD, "cat /proc/modules |") or die "Unable to launch lsmod";
93while (<LSMOD>) {
94    next if (/^Module/);
95    ($module, $void) = split(/ /);
96    print "***$module***|***$void***\n";
97    push @alllivemodules,$module;
98}
99close(LSMOD);
100
101# If no module name list passed as parameter, then work on all modules of the system
102if (not defined $allmodules[0]) {
103    @allmodules = @alllivemodules;
104}
105#print Dumper(@allmodules);
106
107# Now computes the dependencies of each module and store them in %modlist
108open(DEPMOD, "/sbin/depmod -n $ver |") or die "Unable to launch depmod";
109while (<DEPMOD>) {
110    ($module, $void) = split(/:/);
111    last if ($module =~ /^#/);
112    chomp($void);
113    $void =~ s/\s+//;
114    $modlist{$module} = $void;
115    pb_log(2,"Depmod on $module gives $void\n");
116}
117close(DEPMOD);
118
119#print Dumper(%modlist)."\n";
120
121my $lib;
122my $modulep;
123my $kernelv;
124my $modpath;
125
126# Analyze each module to find its full path name
127foreach my $m (@allmodules) {
128    pb_log(1,"Analyzing $m\n");
129    open(MODINFO, "/sbin/modinfo -n -k $ver $m 2>/dev/null |") or die "Unable to launch modinfo";
130    $module = <MODINFO>;
131    close(MODINFO);
132    if ((not defined $module) || ($module =~ '^$')) {
133        pb_log(1,"WARNING: No modinfo for module $m\n");
134        next;
135    }
136    chomp($module);
137    ($void,$lib,$modulep,$kernelv,$modpath) = split(/\//,$module,5);
138    next if (not defined $modpath);
139    $modulepath = "/$lib/$modulep/$kernelv";
140    pb_log(2,"modpath: $modulepath/$modpath\n");
141    push @allmodpaths,"$modulepath/$modpath",map { "$modulepath/".$_ } split(/ /,$modlist{$modpath});
142}
143pb_log(1,"all modpaths: ".join(' ',@allmodpaths)."\n");
144# From List::More
145my %seen = ();
146return(grep { not $seen{$_}++ } @allmodpaths);
147}
148
149=back
150
151=head1 WEB SITES
152
153The 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/>.
154
155=head1 USER MAILING LIST
156
157The mailing list of the project is available at L<mailto:mondo@lists.sf.net>
158 
159=head1 AUTHORS
160
161The Mondorescue.org team L<http://www.mondorescue.org/> lead by Bruno Cornec L<mailto:bruno@mondorescue.org>.
162
163=head1 COPYRIGHT
164
165This module is distributed under the GPL v2.0 license
166described in the file C<COPYING> included with the distribution.
167
168=cut
169
1701;
171
Note: See TracBrowser for help on using the repository browser.