aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Youri/Submit/Action/DkmsModuleInfo.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Youri/Submit/Action/DkmsModuleInfo.pm')
-rw-r--r--lib/Youri/Submit/Action/DkmsModuleInfo.pm111
1 files changed, 111 insertions, 0 deletions
diff --git a/lib/Youri/Submit/Action/DkmsModuleInfo.pm b/lib/Youri/Submit/Action/DkmsModuleInfo.pm
new file mode 100644
index 0000000..d1dd4a8
--- /dev/null
+++ b/lib/Youri/Submit/Action/DkmsModuleInfo.pm
@@ -0,0 +1,111 @@
+# $Id$
+package Youri::Submit::Action::DkmsModuleInfo;
+
+=head1 NAME
+
+Youri::Submit::Action::DkmsModuleInfo - extract and commit info from dkms package.
+
+=head1 DESCRIPTION
+
+This action plugin extract modalias and description from dkms packages and commit them
+on a SVN module.
+
+=cut
+
+use warnings;
+use strict;
+use Carp;
+use base qw/Youri::Submit::Action/;
+use File::Temp qw/tempdir/;
+use File::Basename;
+use SVN::Client;
+
+#- inlineed from MDK::Common::Various
+sub chomp_ { my @l = @_; chomp @l; wantarray() ? @l : $l[0] }
+
+sub _init {
+ my ($self, %options) = @_;
+
+ croak "undefined svn module" unless $options{svn_module};
+
+ foreach my $var ('svn_module') {
+ $self->{"_$var"} = $options{$var};
+ }
+
+ return $self;
+}
+
+sub run {
+ my ($self, $package, $repository, $target, $define) = @_;
+ croak "Not a class method" unless ref $self;
+
+ my ($dkms_name) = $package->get_canonical_name =~ /^dkms-(.*)$/ or return;
+ my $package_name = $package->get_name;
+ my ($kver) = $package_name =~ /^$dkms_name-kernel-(.*)$/ or return;
+
+ my @files = map { $_->[0] } $package->get_files;
+ my @module_files = grep { m!^(/lib/modules/|/var/lib/dkms-binary/).*\.ko(\.gz)?$! } @files
+ or return;
+
+ print "Submit::Action::DkmsModuleInfo: proceeding with $package_name\n" if $self->{_verbose};
+
+ my $tempdir = tempdir(CLEANUP => 1);
+ my $file = $package->as_file;
+ my $cmd = "rpm2cpio $file | (cd $tempdir ; cpio --quiet -id)";
+ print "Submit::Action::DkmsModuleInfo: doing $cmd\n" if $self->{_verbose};
+ if (system($cmd) != 0) {
+ print "Submit::Action::DkmsModuleInfo: failed!\n" if $self->{_verbose};
+ return;
+ }
+
+ my @fields = qw(description alias);
+
+ my (%modules);
+ foreach my $file (@module_files) {
+ print "Submit::Action::DkmsModuleInfo: extracting $file\n" if $self->{_verbose};
+ my $module = $file;
+ $module =~ s!.*/!!;
+ $module =~ s!\.ko(\.gz)$!!;
+ $modules{$module}{$_} = [ chomp_(`/sbin/modinfo -F $_ $tempdir$file`) ]
+ foreach @fields;
+ }
+
+ eval {
+ my $svn = SVN::Client->new();
+ my $dir = $tempdir . '/' . basename($self->{_svn_module});
+ my $revision = $svn->checkout($self->{_svn_module}, $dir, 'HEAD', 0);
+ my $vdir = $dir . '/' . $kver;
+ $svn->update($vdir, 'HEAD', 0);
+ -d $vdir or $svn->mkdir($vdir);
+ foreach my $module (keys %modules) {
+ print "Submit::Action::DkmsModuleInfo: adding module $module\n" if $self->{_verbose};
+ foreach my $field (@fields) {
+ my $file = "$vdir/$module.$field";
+ $svn->update($file, 'HEAD', 0);
+ my $exists = -f $file;
+ open(my $fh, ">", $file);
+ print $fh map { "$_\n" } @{$modules{$module}{$field}};
+ $svn->add($file, 1) if !$exists;
+ }
+ }
+
+ $svn->log_msg(sub { $_[0] = \"add dkms info for $dkms_name with kernel $kver" });
+ $svn->commit($vdir, 0);
+ };
+ if (my $error = $@) {
+ print "Submit::Action::DkmsModuleInfo: commit to svn failed ($error)!\n" if $self->{_verbose};
+ return;
+ }
+
+ 1;
+}
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2002-2006, YOURI project
+
+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+
+=cut
+
+1;