#!/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; ############################################################################### # Actions ############################################################################### sub clean { my ($build) = @_; # make sure no external filesystems are mounted before cleaning umount_external_fs($build); rm_rf($_) foreach grep { -e $_ } $build->get_builddir, $build->get_system_root; } 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_live_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 = $MGA::DrakISO::Config::default_config_root; my $config_path = $MGA::DrakISO::Config::default_config_path; my $settings_path = $MGA::DrakISO::Config::default_settings_path; 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}}, ) 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 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 installation chroot and work directory --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 as live description defaults to "config/live.cfg" --settings use this file as live 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 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 describing the live distribution. 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 builddir: directory hosting build files (initrd, loopbacks, images) chroot: directory hosting chrooted installations 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 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