#!/usr/bin/perl # 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. use lib qw(/usr/lib/libDrakX); use strict; use MDK::Common; use common; use Getopt::Long; use Pod::Usage; use MGA::DrakISO::Config; use MGA::DrakISO::LiveBuild; use MGA::DrakISO::Utils; use MGA::DrakISO::BuildRoot; use MGA::DrakISO::BuildBoot; use MGA::DrakISO::BuildLoop; use MGA::DrakISO::BuildISO; ############################################################################### # Globals ############################################################################### $::verbose = 1; ############################################################################### # Actions ############################################################################### sub clean { my ($build) = @_; if (-e ($build->get_system_root)) { # Make sure there's nothing left mounted in the chroot. umount_all_in_chroot($build); system('sudo rm -rf ' . $build->get_system_root); } system('rm -rf ' . $build->get_builddir) if -e ($build->get_builddir); } sub prepare_root { my ($build) = @_; MGA::DrakISO::BuildRoot::install_live_system($build); MGA::DrakISO::BuildRoot::customise_live_system($build); } sub prepare_boot { my ($build) = @_; MGA::DrakISO::BuildBoot::prepare_live_system_boot($build); MGA::DrakISO::BuildBoot::prepare_iso_bootloader($build); } ############################################################################### # Main Program ############################################################################### my @actions = ( { name => 'dump-config', do => \&MGA::DrakISO::Config::dump_config }, { name => 'clean', do => \&clean }, { name => 'root', do => \&prepare_root }, { name => 'root-create', do => \&MGA::DrakISO::BuildRoot::install_live_system }, { name => 'root-customise', do => \&MGA::DrakISO::BuildRoot::customise_live_system }, { name => 'boot', do => \&prepare_boot }, { name => 'boot-system', do => \&MGA::DrakISO::BuildBoot::prepare_live_system_boot }, { name => 'boot-loader', do => \&MGA::DrakISO::BuildBoot::prepare_iso_bootloader }, { name => 'loop', do => \&MGA::DrakISO::BuildLoop::build_live_loopback_files }, { name => 'master', do => \&MGA::DrakISO::BuildISO::build_iso }, ); my @all = qw(root boot loop master); die "you must be root to run this program\n" if $>; my $build_object = 'MGA::DrakISO::LiveBuild'->new; my $config_root = '/etc/draklive'; my $config_path = 'config/build.cfg'; my $settings_path = 'config/settings.cfg'; GetOptions( "help" => sub { Pod::Usage::pod2usage('-verbose' => 1) }, "all" => sub { $_->{to_run} = 1 foreach grep { member($_->{name}, @all) } @actions }, (map { $_->{name} => \$_->{to_run} } @actions), "all-regions" => sub { $build_object->{all_regions} = 1 }, "config-root=s" => \$config_root, "config=s" => \$config_path, "settings=s" => \$settings_path, "define=s" => \%{$build_object->{settings}}, "verbose=i" => \$::verbose, ) or Pod::Usage::pod2usage(); require standalone; every { !$_->{to_run} } @actions and Pod::Usage::pod2usage(); MGA::DrakISO::Config::read_config($build_object, $config_root, $config_path, $settings_path); MGA::DrakISO::Config::check_config($build_object); MGA::DrakISO::Config::complete_config($build_object); foreach my $region ($build_object->{all_regions} ? sort(keys %{$build_object->{regions}}) : $build_object->{settings}{region}) { $region and print qq(=== proceeding with region "$region"\n); $build_object->{settings}{region} = $region; foreach (grep { $_->{to_run} } @actions) { print qq(* entering step "$_->{name}"\n); $_->{do}->($build_object); print qq(* step "$_->{name}" done\n); } } __END__ ############################################################################### # Documentation ############################################################################### =head1 NAME draklive - A live distribution ISO mastering tool =head1 SYNOPSIS draklive [options] Options: --help long help message --root install and customise live system in chroot --boot prepare system boot and ISO bootloader files --loop build compressed loopback files --master build master image --all run all the above steps --clean clean out the working directories --root-install (for debug) run base install of live system --root-customise (for debug) run system customisation steps --boot-system (for debug) prepare kernel and initrd for system boot --boot-loader (for debug) prepare bootloader for ISO --config-root root directory containing config and additional files defaults to current directory if it contains a configuration file, otherwise to "/etc/draklive" --config use this configuration file to control the build defaults to "config/build.cfg" --settings use this file as build settings (key=value format) defaults to "config/settings.cfg" --define key=value set setting "key" to "value" takes precedence over values from a settings file --all-regions proceed with all configured regions --verbose set verbosity level to defaults to 1 Examples: draklive --clean draklive --all draklive --config config/live.cfg --root =head1 OPTIONS =over 8 =item B<--config> Makes draklive use the next argument as a configuration file. This file should contain a hash specifying the ISO makeup. See the "drakiso-live" page on the Mageia Wiki for details. =item B<--settings> Makes draklive load the next argument as a file in key=value format into the $build->{settings} hash ($build being the global configuration hash). Built-in keys: arch: build architecture workdir: directory hosting chrooted installation and all build files region: use the matching set of langs from the regions configuration hash repository: path to the Mandriva distribution repository (ftp/http/local) Example keys: desktop media product =back =head1 DESCRIPTION B builds a live distribution ISO according to a configuration file, creates a master image, and optionally installs it on a device. See L =head1 AUTHORS Olivier Blin Martin Whitaker =cut