From 57bb09a84636453e9251d352ff7d123340d9a77c Mon Sep 17 00:00:00 2001 From: Romain d'Alverny Date: Sun, 26 Feb 2012 16:16:51 +0000 Subject: Move Isocheck lib under MDK namespace, reorganize code in consequence. --- Makefile | 2 +- README.txt | 11 +- image_tests/001_check_file.t | 4 +- image_tests/003_is_hybrid.t | 2 +- image_tests/install_iso/016_check_pubkey.t | 4 +- image_tests/live_iso/000_files_lists.t | 2 +- isocheck.pl | 6 +- lib/MDK/ISOcheck.pm | 160 +++++++++++++++++++++++++++++ t/00_load.t | 6 +- t/parse_image_file_name.t | 2 +- 10 files changed, 184 insertions(+), 15 deletions(-) create mode 100644 lib/MDK/ISOcheck.pm diff --git a/Makefile b/Makefile index bc2719b..fb71d26 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ tar: export rm -rf $(NAME)-$(VERSION) test: - prove t/ + prove -l t/ man: diff --git a/README.txt b/README.txt index b32f970..40f09e1 100644 --- a/README.txt +++ b/README.txt @@ -14,8 +14,16 @@ All ISOs should pass this test suite after being built, before being released. Usage ----- +If packaged: + + $ su + # isocheck path/to/your/Mageia-x-i586.iso + ...logs... + +If straight from source: + $ su - # perl ./isocheck.pl path/to/your/Mageia-x-i586.iso + # perl -Ilib ./isocheck.pl path/to/your/Mageia-x-i586.iso ... logs ... Returns 0 in case of success (and last line of log starts with "PASS"). @@ -72,6 +80,7 @@ TODO - check releases_notes on the ISO - package it - wrap it to produce automatic reports after BCD + - think of grepping the project source for TODO or FIXME too Style ----- diff --git a/image_tests/001_check_file.t b/image_tests/001_check_file.t index b853059..acf09f3 100644 --- a/image_tests/001_check_file.t +++ b/image_tests/001_check_file.t @@ -21,7 +21,7 @@ use Test::Most; use File::Basename; -use Isocheck; +use MDK::ISOcheck; my ($image_path) = @ARGV; @@ -30,7 +30,7 @@ my %info; bail_on_fail; -%info = Isocheck::parse_image_file_name($name); +%info = parse_image_file_name($name); if (scalar %info) { pass 'Image has a valid filename.'; while (my ($k, $v) = each %info) { diff --git a/image_tests/003_is_hybrid.t b/image_tests/003_is_hybrid.t index fc1ebba..8b5322e 100644 --- a/image_tests/003_is_hybrid.t +++ b/image_tests/003_is_hybrid.t @@ -19,7 +19,7 @@ # use Test::Most; -use Isocheck; +use MDK::ISOcheck; bail_on_fail; diff --git a/image_tests/install_iso/016_check_pubkey.t b/image_tests/install_iso/016_check_pubkey.t index 5fa1e9b..30878b8 100644 --- a/image_tests/install_iso/016_check_pubkey.t +++ b/image_tests/install_iso/016_check_pubkey.t @@ -24,11 +24,11 @@ use MDK::Common; use Test::Most; use File::Basename; -use Isocheck; +use MDK::ISOcheck; my ($image_path) = @ARGV; my $name = basename($image_path); -my %info = Isocheck::parse_image_file_name($name); +my %info = parse_image_file_name($name); bail_on_fail; diff --git a/image_tests/live_iso/000_files_lists.t b/image_tests/live_iso/000_files_lists.t index e683823..d684148 100644 --- a/image_tests/live_iso/000_files_lists.t +++ b/image_tests/live_iso/000_files_lists.t @@ -5,4 +5,4 @@ my ($image_path) = @ARGV; bail_on_fail; ok(-r $image_path, '.idx list file is available.'); -ok(-r $image_path, '.lst list file is available.'); \ No newline at end of file +ok(-r $image_path, '.lst list file is available.'); \ No newline at end of file diff --git a/isocheck.pl b/isocheck.pl index df94cb9..7c4f9b7 100644 --- a/isocheck.pl +++ b/isocheck.pl @@ -24,12 +24,12 @@ use 5.010; use MDK::Common; use TAP::Harness; use TAP::Parser::Aggregator; -use Isocheck; +use MDK::ISOcheck; my ($image_path) = @ARGV; if (!defined $image_path) { - print "Usage: ./test_iso.pl [ISO file]\nTry `./test_iso.pl --help' for more information.\n"; + print "Usage: isocheck [ISO file]\nTry `./test_iso.pl --help' for more information.\n"; exit; } @@ -56,7 +56,7 @@ $aggregator->start; $harness->aggregate_tests($aggregator, glob('image_tests/*.t')); my $name = basename($image_path); -my %info = Isocheck::parse_image_file_name($name); +my %info = parse_image_file_name($name); my @testfiles; if (defined $info{variant} && $info{variant} =~ /^LiveCD/) { diff --git a/lib/MDK/ISOcheck.pm b/lib/MDK/ISOcheck.pm new file mode 100644 index 0000000..c560976 --- /dev/null +++ b/lib/MDK/ISOcheck.pm @@ -0,0 +1,160 @@ +# This file is part of the Mageia project +# +# Copyright (C) 2011 Damien Lallement +# (C) 2011 Romain d'Alverny +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# + +=head1 NAME + + MDK::Isocheck - miscellaneous functions + +=head1 SYNOPSIS + + use Isocheck; + +=head1 EXPORTS + +=over + +=item parse_image_file_name(STRING) + +return a populated hash if param is a valid image file name +(see https://wiki.mageia.org/en/Product_naming ). + +return empty hash if invalid. + +=back + +=cut + +package MDK::ISOcheck; + +use strict; +use warnings; + +our $VERSION = '0.2.0'; + +use base 'Exporter'; + +our @EXPORT = qw(parse_image_file_name is_hybrid hybrid1 hybrid2 hybrid3); + +sub parse_image_file_name { + my ($name) = @_; + + return unless $name =~ m/^ + ( + (\w+) # name + - + (\d+) # version + (?:-((?:nightly|alpha|beta|RC)\d*))? # release + (?:-(.+))? # variant + - + (i586|x86_64|dual) # arch + (?:-(CD|DVD|BR))? # medium + (?:-(build_\w+))? # build + ) + \. + (\w+) # extension + $/x; + + my %info = ( + full => $1, + name => $2, + version => $3, + defined $4 ? (release => $4) : (), + defined $5 ? (variant => $5) : (), + arch => $6, + defined $7 ? (medium => $7) : (), + defined $8 ? (build => $8) : (), + ext => $9 + ); + + return %info; +} + +# Verification if the ISO is hybrid +sub is_hybrid { + my ($img, $full) = @_; + + open(my $iso, $img); + my $hybrid = hybrid1($iso); + $hybrid &= hybrid2($iso); + $hybrid &= hybrid3($iso); + if ($full) { + # system "dd if=$img of=/dev/my-pendrive bs=8"; + } + close($iso); + + return $hybrid; +} + + +# Check the first 512 bytes of the iso +sub hybrid1 { + my ($iso) = @_; + my $buffer; + my $hybrid; + + foreach (0 .. 512) { + read($iso, $buffer, 1); + if ($buffer ne '\x00') { + $hybrid = 1; + } + } + + return $hybrid; +} + +#Check the 0x1fe & 0x1ff bytes of the iso +sub hybrid2 { + my ($iso) = @_; + my $hybrid; + my $buffer; + my $byte = "\x55"; + + seek($iso, 0x1fe, 0); + read($iso, $buffer, 1); + if ($buffer eq $byte) { + read($iso, $buffer, 1); + $byte = "\xaa"; + if ($buffer eq $byte) { + $hybrid = 1; + } + } + + return $hybrid; +} + +# check from the 0x200 to the 0x8000 bytes +sub hybrid3 { + my ($iso) = @_; + my $hybrid = 1; + my $buffer; + + seek($iso, 0x200, 0); + foreach (0x200 .. 0x8000) { + read($iso, $buffer, 1); + if ($buffer eq '\x00') { + $hybrid = 0; + } + } + + return $hybrid; +} + +1; \ No newline at end of file diff --git a/t/00_load.t b/t/00_load.t index 4a923e4..a0c0900 100644 --- a/t/00_load.t +++ b/t/00_load.t @@ -3,8 +3,8 @@ use Test::More tests => 2; BEGIN { -use_ok( 'Isocheck' ); -require_ok('Isocheck'); +use_ok('MDK::ISOcheck'); +require_ok('MDK::ISOcheck'); } -diag( "Testing Isocheck $Isocheck::VERSION" ); \ No newline at end of file +diag("Testing MDK::ISOcheck $MDK::ISOcheck::VERSION"); \ No newline at end of file diff --git a/t/parse_image_file_name.t b/t/parse_image_file_name.t index 4243514..0d8f34f 100644 --- a/t/parse_image_file_name.t +++ b/t/parse_image_file_name.t @@ -1,6 +1,6 @@ use Test::Most; -use Isocheck; +use MDK::ISOcheck; bail_on_fail; -- cgit v1.2.1