Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package mksusecd for openSUSE:Factory checked in at 2025-04-18 16:21:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/mksusecd (Old) and /work/SRC/openSUSE:Factory/.mksusecd.new.30101 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "mksusecd" Fri Apr 18 16:21:24 2025 rev:90 rq:1270606 version:3.8 Changes: -------- --- /work/SRC/openSUSE:Factory/mksusecd/mksusecd.changes 2025-03-21 20:23:52.694394268 +0100 +++ /work/SRC/openSUSE:Factory/.mksusecd.new.30101/mksusecd.changes 2025-04-20 20:03:54.734939813 +0200 @@ -1,0 +2,7 @@ +Thu Apr 17 17:16:59 UTC 2025 - wfe...@opensuse.org + +- merge gh#openSUSE/mksusecd#86 +- add red hat/fedora media support to verifymedia (bsc#1241374) +- 3.8 + +-------------------------------------------------------------------- Old: ---- mksusecd-3.7.tar.xz New: ---- mksusecd-3.8.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mksusecd.spec ++++++ --- /var/tmp/diff_new_pack.fHUWtu/_old 2025-04-20 20:03:55.194958995 +0200 +++ /var/tmp/diff_new_pack.fHUWtu/_new 2025-04-20 20:03:55.194958995 +0200 @@ -18,7 +18,7 @@ Name: mksusecd -Version: 3.7 +Version: 3.8 Release: 0 Summary: Tool to create SUSE Linux installation ISOs License: GPL-3.0+ ++++++ mksusecd-3.7.tar.xz -> mksusecd-3.8.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-3.7/VERSION new/mksusecd-3.8/VERSION --- old/mksusecd-3.7/VERSION 2025-03-21 14:34:30.000000000 +0100 +++ new/mksusecd-3.8/VERSION 2025-04-17 19:16:59.000000000 +0200 @@ -1 +1 @@ -3.7 +3.8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-3.7/changelog new/mksusecd-3.8/changelog --- old/mksusecd-3.7/changelog 2025-03-21 14:34:30.000000000 +0100 +++ new/mksusecd-3.8/changelog 2025-04-17 19:16:59.000000000 +0200 @@ -1,3 +1,7 @@ +2025-04-17: 3.8 + - merge gh#openSUSE/mksusecd#86 + - add red hat/fedora media support to verifymedia (bsc#1241374) + 2025-03-21: 3.7 - merge gh#openSUSE/mksusecd#85 - adjust verifymedia to use new initrd unpacking code diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-3.7/mksusecd new/mksusecd-3.8/mksusecd --- old/mksusecd-3.7/mksusecd 2025-03-21 14:34:30.000000000 +0100 +++ new/mksusecd-3.8/mksusecd 2025-04-17 19:16:59.000000000 +0200 @@ -4670,7 +4670,7 @@ } for (reverse split /\./, $sub_type) { - if(/^(gz|xz|zst|rpm)$/) { + if(/^(bz2|gz|xz|zst|rpm)$/) { my $c; if($1 eq 'gz') { $c = 'gzip --quiet -dc'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-3.7/mksusecd_man.adoc new/mksusecd-3.8/mksusecd_man.adoc --- old/mksusecd-3.7/mksusecd_man.adoc 2025-03-21 14:34:30.000000000 +0100 +++ new/mksusecd-3.8/mksusecd_man.adoc 2025-04-17 19:16:59.000000000 +0200 @@ -774,6 +774,10 @@ == See Also +*verifymedia*(1), *checkmedia*(1), *tagmedia*(1). + +== Links + - more documentation: `/usr/share/doc/packages/mksusecd` + - get latest version: https://github.com/openSUSE/mksusecd?tab=readme-ov-file#downloads + - mksusecd web site: https://github.com/openSUSE/mksusecd + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-3.7/verifymedia new/mksusecd-3.8/verifymedia --- old/mksusecd-3.7/verifymedia 2025-03-21 14:34:30.000000000 +0100 +++ new/mksusecd-3.8/verifymedia 2025-04-17 19:16:59.000000000 +0200 @@ -178,6 +178,8 @@ sub get_media_variant; sub get_arch; sub get_expected_media_layout; +sub get_expected_suse_media_layout; +sub get_expected_rh_media_layout; sub stat_file; sub is_dir; sub is_file; @@ -204,7 +206,7 @@ my $opt_ignore_list = [ "UEFI boot image exists", "ISO digest is md5", - "boot partition is EFI System Partition" + "boot partition type is EFI System Partition" ]; my $tmp; @@ -353,16 +355,22 @@ "'initrd.siz' must exist and have non-zero size."; show_conditional + $media->{initrd_addrsize}, + chk_file_exists($media->{initrd_addrsize}), + "initrd.addrsize exists", + "'initrd.addrsize' must exist and have non-zero size."; + +show_conditional $media->{cd_ikr}, chk_file_exists($media->{cd_ikr}), - "cd.ikr exists", - "'cd.ikr' must exist and have non-zero size."; + "boot image exists", + "'$media->{cd_ikr}' must exist and have non-zero size."; show_conditional $media->{suse_ins}, chk_file_exists($media->{suse_ins}), - "suse.ins exists", - "'suse.ins' must exist and have non-zero size."; + "ins file exists", + "'$media->{suse_ins}' must exist and have non-zero size."; show_conditional $media->{isolinux_cfg}, @@ -467,40 +475,61 @@ print "- partition data:\n", Dumper($media->{parti}) if $media->{parti} && $opt_verbose >= 2; -if($media->{hybrid_mode}) { - my $hybrid; +my $hybrid; +my $has_partitions; + +if($media->{hybrid_mode}) { $hybrid = chk_hybrid_chrp($media) if $media->{hybrid_mode} eq 'chrp'; $hybrid = chk_hybrid_efi($media) if $media->{hybrid_mode} eq 'efi'; print "- hybrid data:\n", Dumper($hybrid) if $hybrid && $opt_verbose >= 2; if($media->{hybrid_mode} eq 'efi') { + $has_partitions = $hybrid && !$hybrid->{apple} && ($hybrid->{mbr} || $hybrid->{gpt}); + show - $hybrid && !$hybrid->{apple} && ($hybrid->{mbr} || $hybrid->{gpt}), + $has_partitions, "has MBR or GPT partition table", "To be bootable as disk image, there must be an MBR or GPT partition table."; - show - $hybrid && $hybrid->{efi_partition}, - "has boot partition with VFAT file system", - "To be UEFI bootable, there must be a VFAT boot partition."; - - show_conditional - $hybrid && $hybrid->{efi_partition}, - $hybrid->{efi_partition_is_esp}, - "boot partition is EFI System Partition", - "The boot partition type should be EFI System Partition."; - - show - $hybrid && $hybrid->{data_partition}, - "has partition pointing to ISO image data", - "There must be a data partition pointing to the same file system you get\nwhen acessing the entire ISO image."; - - show - $hybrid && !$hybrid->{invalid_partition}, - "no invalid partition entries", - "Other partition table entries must have valid data or be completely empty."; + if($has_partitions) { + show + $hybrid && $hybrid->{efi_partition}, + "has boot partition with VFAT file system", + "To be UEFI bootable as disk, there must be a VFAT boot partition."; + + show_conditional + $hybrid && $hybrid->{efi_partition}, + $hybrid && $hybrid->{efi_partition_is_esp}, + "boot partition type is EFI System Partition", + "The boot partition type should be EFI System Partition."; + + if($hybrid && $hybrid->{efi_partition}) { + my $stat = stat_file $media->{efi_image}; + + show_conditional + $stat, + $stat && $stat->{start} * 4 == $hybrid->{efi_partition_start} && $stat->{size} == $hybrid->{efi_partition_size} * 512, + "boot partition refers to UEFI boot image file", + "There is a UEFI boot image file but it is not used as UEFI boot partition."; + } + + show + $hybrid && $hybrid->{data_partition}, + "has data partition pointing to ISO image", + "There must be a data partition pointing to the same file system you get\nwhen acessing the entire ISO image."; + + show + $hybrid && !$hybrid->{data_partition_at_0}, + "ISO data partition has non-zero offset", + "ISO data partition should not start at block 0 as this breaks partitioning tools."; + + show + $hybrid && !$hybrid->{invalid_partition}, + "no invalid partition entries", + "All partition table entries must have either valid data or be completely empty."; + } } if($media->{hybrid_mode} eq 'chrp') { @@ -532,8 +561,8 @@ show_conditional $media->{eltorito_legacy}, $eltorito->{legacy}, - "El Torito legacy bootable", - "ISO boot catalog must have El Torito entry for legacy boot (pointing to grub or isolinux)."; + "El Torito x86 legacy bootable", + "ISO boot catalog must have an El Torito entry for x86 legacy boot (pointing to grub or isolinux)."; show_conditional $media->{eltorito_efi}, @@ -542,6 +571,12 @@ "ISO boot catalog must have El Torito entry for an EFI System Partition image."; show_conditional + $media->{eltorito_efi} && $hybrid && $hybrid->{efi_partition} && $has_partitions, + $hybrid && $eltorito->{efi_start} == $hybrid->{efi_partition_start} && $eltorito->{efi_size} == $hybrid->{efi_partition_size}, + "El Torito UEFI entry points to boot partition", + "El Torito UEFI image should be the same as the UEFI boot partition."; + +show_conditional $media->{eltorito_s390x}, $eltorito->{s390x}, "El Torito S390X bootable", @@ -806,8 +841,9 @@ my $grub; - if($data =~ /,([^,]+)<\/boot-script>/) { + if($data =~ /:([^:]+)<\/boot-script>/) { $grub = $1; + $grub =~ s/^1,//; $grub =~ tr#\\#/#; $grub =~ s#^/##; } @@ -825,9 +861,11 @@ my $cfg = $grub; $cfg =~ s#[^/]*$#grub.cfg#; - if($cfg ne $media->{grub_cfg} && $cfg ne $media->{grub_earlyboot_cfg} ) { - $error_detail = "expecting grub config $cfg for $grub"; - return 0; + if($media->{grub_earlyboot_cfg}) { + if($cfg ne $media->{grub_cfg} && $cfg ne $media->{grub_earlyboot_cfg} ) { + $error_detail = "expecting grub config $cfg for $grub"; + return 0; + } } return 1; @@ -845,7 +883,7 @@ $error_detail .= "$f\n" if stat_file $f; } - return $error_detail ? 2 : 1; + return $error_detail ? 0 : 1; } @@ -856,7 +894,7 @@ my $sig; - $sig->{block_digest} = 'md5' if get_tag $media->{tags}, 'md5sum'; + $sig->{block_digest} = 'md5' if get_tag($media->{tags}, 'md5sum') || get_tag($media->{tags}, 'iso md5sum'); $sig->{block_digest} = 'sha256' if get_tag $media->{tags}, 'sha256sum'; my $sig_block = get_tag $media->{tags}, 'signature'; @@ -938,15 +976,20 @@ $hybrid->{invalid_partition} = 1, next if $hybrid->{mbr} && !$p->{attributes}{valid}; if($p->{first_lba} != 0 && $p->{filesystem} && $p->{filesystem}{type} eq 'vfat') { $hybrid->{efi_partition} = 1; + $hybrid->{efi_partition_start} = $p->{first_lba}; + $hybrid->{efi_partition_size} = $p->{size}; $hybrid->{efi_partition_is_esp} = 1 if $p->{type_name} eq "efi" || $p->{type_name} eq "efi system"; } - $hybrid->{data_partition} = 1 if - $p->{first_lba} != 0 && + if( $p->{filesystem} && $p->{filesystem}{type} eq 'iso9660' && ( ($p->{filesystem}{uuid} && $p->{filesystem}{uuid} eq $uuid) || ($p->{filesystem}{label} && $p->{filesystem}{label} eq $label) - ); + ) + ) { + $hybrid->{data_partition} = 1; + $hybrid->{data_partition_at_0} = 1 if $p->{first_lba} == 0; + } } } @@ -968,7 +1011,12 @@ for my $c (@{$parti->{eltorito}{catalog}}) { next if $c->{media_type} ne 'no emulation'; $eltorito->{legacy} = 1, next if $c->{boot_info_table}; - $eltorito->{efi} = 1, next if $c->{filesystem} && $c->{filesystem}{type} eq 'vfat'; + if($c->{filesystem} && $c->{filesystem}{type} eq 'vfat') { + $eltorito->{efi} = 1; + $eltorito->{efi_start} = $c->{first_lba}; + $eltorito->{efi_size} = $c->{size}; + next; + } $eltorito->{s390x} = 1 if $c->{s390x_parm} || $c->{file_name} =~ /\.ikr$/; } } @@ -1086,12 +1134,10 @@ # sub get_media_style { - if(is_dir "isolinux" || is_file ".discinfo" || is_dir 'Packages') { - return 'rh'; - } + return 'rh' if is_file(".discinfo") || is_file("Fedora-Legal-README.txt"); - for my $stream ('BaseOS', 'AppStream') { - return 'rh' if is_dir "$stream/Packages"; + for my $dir ("isolinux", "Packages", "BaseOS/Packages", "AppStream/Packages") { + return 'rh' if is_dir $dir; } return 'suse'; @@ -1168,26 +1214,48 @@ return 'aarch64' if is_file "EFI/BOOT/BOOTAA64.EFI"; return 'aarch64' if is_file "EFI/BOOT/bootaa64.efi"; + return 'ppc64le' if is_file "ppc/bootinfo.txt"; + + return 's390x' if is_file "generic.ins"; + return $arch; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Note: uses global var $iso_ls_rockridge. +# sub get_expected_media_layout { my $media = $_[0]; - my $arch = $media->{arch}; - - return unless $arch; - - return unless $media->{style} eq 'suse'; - # files that should not really be there for my $f (qw ( glump ppc/os-chooser )) { $media->{garbage_files}{$f} = 1; } + for my $f (keys %{$iso_ls_rockridge->{by_name}}) { + $media->{garbage_files}{$f} = 1 if $f =~ /(^|\/)TRANS\.TBL$/; + } + + if($media->{style} eq 'suse') { + get_expected_suse_media_layout $media; + } + elsif($media->{style} eq 'rh') { + get_expected_rh_media_layout $media; + } +} + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub get_expected_suse_media_layout +{ + my $media = $_[0]; + + my $arch = $media->{arch}; + + return unless $arch; + if($media->{variant} eq 'install') { if($arch eq 'aarch64') { $media->{initrd} = "boot/aarch64/initrd"; @@ -1340,6 +1408,106 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub get_expected_rh_media_layout +{ + my $media = $_[0]; + + my $arch = $media->{arch}; + + return unless $arch; + + if($media->{variant} eq 'install') { + if($arch eq 'aarch64') { + $media->{initrd} = "images/pxeboot/initrd.img"; + $media->{kernel} = "images/pxeboot/vmlinuz"; + $media->{efi_image} = "images/efiboot.img"; + $media->{efi_loader} = "EFI/BOOT/BOOTAA64.EFI"; + $media->{efi_grub_cfg} = "EFI/BOOT/grub.cfg"; + $media->{hybrid_mode} = 'efi'; + $media->{eltorito_efi} = 1; + } + elsif($arch eq 'i386') { + $media->{el_torito_image} = "images/eltorito.img"; + $media->{initrd} = "images/pxeboot/initrd.img"; + $media->{kernel} = "images/pxeboot/vmlinuz"; + $media->{efi_image} = "images/efiboot.img"; + $media->{efi_loader} = "EFI/BOOT/BOOTIA32.EFI"; + $media->{efi_grub_cfg} = "EFI/BOOT/grub.cfg"; + $media->{hybrid_mode} = 'efi'; + $media->{eltorito_legacy} = 1; + $media->{eltorito_efi} = 1; + } + elsif($arch eq 'ppc64le') { + $media->{initrd} = "ppc/ppc64/initrd.img"; + $media->{kernel} = "ppc/ppc64/vmlinuz"; + $media->{bootinfo_txt} = "ppc/bootinfo.txt"; + $media->{grub_cfg} = "boot/grub/grub.cfg"; + $media->{hybrid_mode} = 'chrp'; + } + elsif($arch eq 's390x') { + $media->{initrd} = "images/initrd.img"; + $media->{initrd_addrsize} = "images/initrd.addrsize"; + $media->{kernel} = "images/kernel.img"; + $media->{cd_ikr} = "images/cdboot.img"; + $media->{suse_ins} = "generic.ins"; + $media->{eltorito_s390x} = 1; + } + elsif($arch eq 'x86_64') { + $media->{el_torito_image} = "images/eltorito.img"; + $media->{initrd} = "images/pxeboot/initrd.img"; + $media->{kernel} = "images/pxeboot/vmlinuz"; + $media->{efi_image} = "images/efiboot.img"; + $media->{efi_loader} = "EFI/BOOT/BOOTX64.EFI"; + $media->{efi_grub_cfg} = "EFI/BOOT/grub.cfg"; + $media->{hybrid_mode} = 'efi'; + $media->{eltorito_legacy} = 1; + $media->{eltorito_efi} = 1; + } + } + elsif($media->{variant} eq 'live') { + $media->{expect_signature_file} = 1; + + if($arch eq 'aarch64') { + $media->{initrd} = "images/pxeboot/initrd.img"; + $media->{kernel} = "images/pxeboot/vmlinuz"; + $media->{efi_image} = "images/efiboot.img"; + $media->{efi_loader} = "EFI/BOOT/BOOTAA64.EFI"; + $media->{efi_grub_cfg} = "EFI/BOOT/grub.cfg"; + $media->{hybrid_mode} = 'efi'; + $media->{eltorito_efi} = 1; + } + elsif($arch eq 'ppc64le') { + $media->{initrd} = "ppc/ppc64/initrd.img"; + $media->{kernel} = "ppc/ppc64/vmlinuz"; + $media->{bootinfo_txt} = "ppc/bootinfo.txt"; + $media->{grub_cfg} = "boot/grub/grub.cfg"; + $media->{hybrid_mode} = 'chrp'; + } + elsif($arch eq 's390x') { + $media->{initrd} = "images/initrd.img"; + $media->{initrd_addrsize} = "images/initrd.addrsize"; + $media->{kernel} = "images/kernel.img"; + $media->{cd_ikr} = "images/cdboot.img"; + $media->{suse_ins} = "generic.ins"; + $media->{eltorito_s390x} = 1; + } + elsif($arch eq 'x86_64') { + $media->{grub_cfg} = "boot/grub2/grub.cfg"; + $media->{el_torito_image} = "images/eltorito.img"; + $media->{initrd} = "images/pxeboot/initrd.img"; + $media->{kernel} = "images/pxeboot/vmlinuz"; + $media->{efi_image} = "images/efiboot.img"; + $media->{efi_loader} = "EFI/BOOT/BOOTX64.EFI"; + $media->{efi_grub_cfg} = "EFI/BOOT/grub.cfg"; + $media->{hybrid_mode} = 'efi'; + $media->{eltorito_legacy} = 1; + $media->{eltorito_efi} = 1; + } + } +} + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Note: uses global var $iso_ls_rockridge. # sub stat_file @@ -1939,7 +2107,7 @@ } for (reverse split /\./, $sub_type) { - if(/^(gz|xz|zst|rpm)$/) { + if(/^(bz2|gz|xz|zst|rpm)$/) { my $c; if($1 eq 'gz') { $c = 'gzip --quiet -dc'; @@ -2047,7 +2215,7 @@ { my $file = $_[0]; - return undef unless is_file($file); + return undef unless is_file $file; extract_file $file; @@ -2088,7 +2256,7 @@ { my $media = $_[0]; - my $grub_cfg = read_file $media->{grub_cfg}; + my $grub_cfg = read_file($media->{grub_cfg} || $media->{efi_grub_cfg}); return $1 if $grub_cfg =~ /^\s*\$?linux .* root=(\S+)/m;