# Copyright (C) 2005 Mandriva # Olivier Blin # Copyright (C) 2017 Mageia # Martin Whitaker # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package MGA::DrakISO::Utils; use strict; use MDK::Common; use common; use fs; use run_program; use IPC::Open3; use IO::Select; use Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(directory_usage run_ copy_or_link mount_system_fs umount_all_in_chroot); sub directory_usage { my ($dir, $o_apparent) = @_; my $apparent = $o_apparent && "--apparent-size"; first(split /\s/, `du -s -B 1 $apparent $dir`); } #- expand only if the pattern contains '*' #- and matches dot characters (like shell dotglob) sub glob__ { my ($pattern) = @_; $pattern =~ /\*/ ? glob_($pattern) : $pattern; } sub run_ { my $options = ref $_[0] eq 'HASH' ? shift @_ : {}; my @cmd = @_; $options->{timeout} ||= 'never'; if (arch() !~ /^arm/) { my $targetarch = delete $options->{targetarch}; unshift @cmd, 'setarch', $targetarch if $targetarch; } print "running " . (exists $options->{root} && "(in chroot) ") . join(' ', @cmd) . "\n" if $::verbose > 1; run_program::raw($options, @cmd); } sub device_allocate_file { my ($device, $size) = @_; run_('dd', "of=$device", 'count=0', 'bs=1', "seek=" . removeXiBSuffix($size)); } #- format $device as type $type # FIXME: use fs::format sub device_mkfs { my ($device, $type, $o_label, $o_inode_size) = @_; if ($type eq 'vfat') { run_('mkfs.vfat', if_(defined $o_label, '-n', $o_label), $device); } elsif (member($type, 'ext2', 'ext3', 'ext4')) { run_("mkfs.$type", "-m", 0, if_(defined $o_label, '-L', $o_label), if_($o_inode_size, '-I', $o_inode_size), if_(!-b $device, '-F'), $device); } elsif ($type eq 'swap') { run_('mkswap', if_(defined $o_label, '-L', $o_label), $device); } else { die "unable to mkfs for unsupported media type $type\n"; } } sub copy_or_link { my ($src_file, $dst_file) = @_; # TODO: support remote sources. mkdir_p(dirname($dst_file)); symlinkf($src_file, $dst_file) or die "ERROR: couldn't link $src_file to $dst_file\n"; } sub mount_system_fs { my ($build) = @_; run_('mount', '-t', 'devtmpfs', '/dev', $build->get_system_root . '/dev'); run_('mount', '-t', 'proc', '/proc', $build->get_system_root . '/proc'); run_('mount', '-t', 'sysfs', '/sys', $build->get_system_root . '/sys'); } sub umount_all_in_chroot { my ($build) = @_; my $system_root = Cwd::abs_path($build->get_system_root); my @mounts = grep { $_ =~ $system_root } split("\n", cat_('/proc/mounts')); foreach (reverse(@mounts)) { my @field = split(' ' , $_); fs::mount::umount($field[1]); } } 1;