[Fai-commit] r4829 - in people/faiguy/bugfixes/common: . bin
meissner-guest at alioth.debian.org
meissner-guest at alioth.debian.org
Wed Dec 19 15:54:16 UTC 2007
Author: meissner-guest
Date: 2007-12-19 15:54:16 +0000 (Wed, 19 Dec 2007)
New Revision: 4829
Removed:
people/faiguy/bugfixes/common/install_packages
Modified:
people/faiguy/bugfixes/common/bin/install_packages
Log:
get the actual install_packages and delete the one i copied to the wrong location
Modified: people/faiguy/bugfixes/common/bin/install_packages
===================================================================
--- people/faiguy/bugfixes/common/bin/install_packages 2007-12-19 10:51:30 UTC (rev 4828)
+++ people/faiguy/bugfixes/common/bin/install_packages 2007-12-19 15:54:16 UTC (rev 4829)
@@ -25,7 +25,7 @@
# MA 02111-1307, USA.
#*********************************************************************
-my $version = "Version 4.1.4, 26-aug-2007";
+my $version = "Version 4.1.5, 14-dec-2007";
$0=~ s#.+/##; # remove path from program name
# import variables: $verbose, $MAXPACKAGES, $classes, $FAI, $FAI_ROOT
Deleted: people/faiguy/bugfixes/common/install_packages
===================================================================
--- people/faiguy/bugfixes/common/install_packages 2007-12-19 10:51:30 UTC (rev 4828)
+++ people/faiguy/bugfixes/common/install_packages 2007-12-19 15:54:16 UTC (rev 4829)
@@ -1,512 +0,0 @@
-#!/usr/bin/perl
-
-# $Id$
-#*********************************************************************
-#
-# install_packages -- read package config and install packages via apt-get
-#
-# This script is part of FAI (Fully Automatic Installation)
-# (c) 2000-2007, Thomas Lange, lange at informatik.uni-koeln.de
-#
-#*********************************************************************
-# 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 of the License, 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; see the file COPYING. If not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-# MA 02111-1307, USA.
-#*********************************************************************
-
-my $version = "Version 4.1.5, 14-dec-2007";
-$0=~ s#.+/##; # remove path from program name
-
-# import variables: $verbose, $MAXPACKAGES, $classes, $FAI, $FAI_ROOT
-
-use strict;
-use Getopt::Std;
-
-# global variables
-our ($opt_d,$opt_l,$opt_L,$opt_v,$opt_h,$opt_H,$opt_m,$opt_n,$opt_N,$opt_p);
-my $listonly; # flag, that indicates that only a list of packages will be printed
-our @commands;
-our %command;
-our $atype; # type of action (for apt-get, aptitude,..) that will be performed
-my $dryrun=0;
-my $verbose;
-my $FAI_ROOT;
-my @classes;
-my $classpath;
-my $rootcmd;
-my @preloadlist;
-my @preloadrmlist;
-my $_config;
-my $_system;
-my $hasdebian=0; # some Debian related commands/types are used in package_config
-my %list; # hash of arrays, key=type (yumi,aptitude,..), list of packages
-my %types; # hash containing the types found in all loaded package_config files
-my %classisdef;
-my $maxpl; # maximum length of package list
-my $cache; # instance of AptPkg::Cache
-my @unknown; # unknown packages
-my @known; # list of all known packages
-my $execerrors; # counts execution errors
-my $downloaddir="/var/cache/apt/archives/partial/"; # where to download packages that gets only unpacked
-
-# PRELOAD feature from Thomas Gebhardt <gebhardt at hrz.uni-marburg.de>
-
-$| = 1;
-# order of commands to execute
-
-my $aptopt='-y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"';
- at commands = qw/y2i y2r yast rpmr urpmi urpme yumgroup yumi yumr smarti smartr hold taskrm taskinst clean-internal aptitude aptitude-r install unpack remove dselect-upgrade/;
-%command = (
- "install" => "apt-get $aptopt --fix-missing install",
- "inst-internal" => "apt-get $aptopt --fix-missing -s install",
- "remove" => "apt-get $aptopt --purge remove",
- "dselect-upgrade" => "apt-get $aptopt dselect-upgrade",
- "taskinst" => "tasksel install",
- "taskrm" => "tasksel remove",
- "hold" => "dpkg --set-selections",
- "clean-internal" => "apt-get clean",
- "aptitude" => "aptitude -R $aptopt install",
- "aptitude-r" => "aptitude -r $aptopt install",
- "unpack" => "cd $downloaddir; aptitude download",
- "unpack-internal" => "dpkg --unpack --recursive $downloaddir; rm $downloaddir/*.deb",
- "pending-internal" => "dpkg --configure --pending",
- "dpkgc-internal" => "dpkg -C",
- "urpmi" => "urpmi --auto --foce --allow-force --keep",
- "urpme" => "urpme --auto --foce --allow-force --keep",
- "yumi" => "yum -y install",
- "yumr" => "yum -y remove",
- "yumgroup" => "yum -y groupinstall",
- "y2i" => "y2pmsh isc",
- "y2r" => "y2pmsh remove",
- "yast" => "yast -i",
- "rpmr" => "rpm -e",
- smarti => "smart install -y",
- smartr => "smart remove -y",
- "smartc-internal" => "smart clean",
-);
-
-getopts('dhHvlLm:p:nN');
-
-my $use_aptpkg=0;
-$opt_N || check_aptpkg(); # do not use AptPkg when -N is given
-
-$listonly = $opt_l || $opt_L;
-$opt_h && usage();
-$opt_H && showcommands();
-$verbose=$ENV{verbose} || $opt_v;
-$opt_d && setdownloadonly();
-$maxpl=$ENV{MAXPACKAGES} || $opt_m ;
-$maxpl && $verbose && warn "Maxmimum number of packages installed at a time set to $maxpl\n";
-$maxpl or $maxpl = 99 ; # set default value
-
-my $qopt="-qq" unless $verbose;
-my $devnull=">/dev/null" unless $verbose;
-
-$FAI_ROOT = $ENV{FAI_ROOT};
-$classpath = $opt_p || "$ENV{FAI}/package_config";
-$rootcmd = ($FAI_ROOT eq "/" ) ? '' : "chroot $FAI_ROOT";
- at classes = grep { !/^#|^\s*$/ } split(/[\s\n]+/,$ENV{classes});
-foreach (@classes) { $classisdef{$_}=1;}
-
-# do not use AptPkg if target is not a Debian system
-if ($use_aptpkg) {
- $_config->init; # initialize AptPkg
- $_config->set("Dir",$FAI_ROOT); # simulate "chroot"
- $_config->{quiet}=2; # don't show cache initialization messages
- $_system = $_config->system;
- $cache = new AptPkg::Cache;
-}
-
-warn "$0: reading config files from directory $classpath\n";
-# read all package config files
-foreach (@classes) {
- &readconfig($classpath,$_) if -f "$classpath/$_";
-}
-
-# check if any Debian related commands/types are used in package_config
-my @debiantypes= qw/taskinst aptitude aptitude-r install remove dselect-upgrade smarti/;
-foreach my $dt (@debiantypes) {
- $types{$dt} and $hasdebian=1;
- if ($types{$dt} eq 'smarti') {
- $command{'clean-internal'} = $command{'smartc-internal'};
- $command{'pending-internal'} = "true";
- $command{'dpkgc-internal'} = "true";
- }
-}
-
-# get files which must exist before installing packages
-foreach my $entry (@preloadlist, at preloadrmlist) {
- my ($url, $directory) = @$entry;
- if ($url =~ m!^file:/(.+)!) {
- my $file = $1;
- execute("cp $FAI_ROOT/$file $FAI_ROOT/$directory") unless $listonly;
- } else {
- execute("wget -nv -P$FAI_ROOT/$directory $url") unless $listonly;
- }
-}
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# begin of the big foreach loop
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# call apt-get or tasksel for each type of command whith the list of packages
-foreach $atype (@commands) {
-
- if ($atype eq "clean-internal" && $hasdebian) {
- execute("$rootcmd $command{'clean-internal'}") unless $listonly;
- next;
- }
-
- # skip if empty list
- next unless defined $list{$atype};
-
- if ($atype eq "dselect-upgrade") {
- dselectupgrade($atype);
- next;
- }
-
- my $packlist = join(' ',@{$list{$atype}});
-
- if ($atype eq "hold") {
- my $hold = join " hold\n", @{$list{hold}}, " hold\n";
- execute("echo \"$hold\" | $rootcmd $command{hold}");
- next;
- }
-
- if ($atype eq "install" || $atype eq "smarti" || $atype eq "aptitude" || $atype eq "unpack" || $opt_l || $opt_L) {
-
- mkpackagelist(@{$list{$atype}}); # create lists of known and unknown packages
- if ($opt_l) {
- # only print the package list
- print join ' ', at known,"\n";
- exit 0;
- }
- if ($opt_L) {
- # only print the package list
- execute("$rootcmd $command{'inst-internal'} @known | egrep ^Inst");
- exit 0;
- }
- # pass only maxpl packages to apt-get
- while (@known) {
- my $shortlist = join(' ', splice @known,0,$maxpl);
- # print "SL $shortlist\n";
- execute("$rootcmd $command{$atype} $shortlist") if $shortlist;
- execute("$rootcmd $command{'clean-internal'}") if $hasdebian;
- execute("$rootcmd $command{'unpack-internal'}") if ($atype eq "unpack"); # unpack and rm deb files
- }
- next;
- }
-
- if ($atype eq "taskinst" || $atype eq "taskrm") {
- foreach my $tsk (@{$list{$atype}}) {
- execute("$rootcmd $command{$atype} $tsk");
- }
- next;
- }
-
- # other types
- execute("$rootcmd $command{$atype} $packlist") if $packlist;
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# end of the big foreach loop
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-# remove preloaded files
-foreach my $entry (@preloadrmlist) {
- my ($url, $directory) = @$entry;
- $url =~ m#/([^/]+$)#;
- my $file = "$directory/$1";
- print "rm $file\n" if $verbose;
- unlink $file || warn "Can't remove $file\n";
-}
-
-if ($hasdebian) {
- # in case of unconfigured packages because of apt errors
- # retry configuration
- execute("$rootcmd $command{'pending-internal'}");
- # check if all went right
- execute("$rootcmd $command{'dpkgc-internal'}");
- # clean apt cache
- execute("$rootcmd $command{'clean-internal'}");
-}
-
-if ($execerrors) {
- warn "$execerrors errors during executing of commands\n";
- exit 3;
-}
-
-exit 0; # end of program
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub readconfig {
-
- my ($path,$file) = @_;
- my ($package,$type,$cllist, at oclasses,$doit);
-
- open (FILE,"$path/$file") || warn "ERROR $0: Can't read config file: $path/$file\n";
- warn "$0: read config file $file\n" if $verbose;
-
- while (<FILE>) {
- next if /^#/; # skip comments
- s/#.*$//; # delete comments
- next if /^\s*$/; # skip empty lines
- chomp;
- /^PRELOAD\s+(\S+)\s+(\S+)/ and push(@preloadlist, [$1,$2]),next;
- /^PRELOADRM\s+(\S+)\s+(\S+)/ and push(@preloadrmlist, [$1,$2]),next;
-
- if (/^PACKAGES\s+(\S+)\s*/) {
- ($type,$cllist) = ($1,$');
- warn "WARNING: Unknow action $type after PACKAGES\n." unless defined $command{$type};
- # by default no classes are listed after this command so doit
- $doit = 1;
- if ($cllist) {
- # no classes specified after PACKAGES command
- # so add all packages listed
- # use packages on for a list of classes
- $doit = 0; # assume no class is defined
- @oclasses = split(/\s+/,$cllist);
- # if a listed class is defined, add the packaes, otherwise skip these packages
- foreach (@oclasses) { exists $classisdef{$_} and $doit = 1;}
- }
- next;
- }
-
- # warning if uppercase letters are found (package are always lowercase)
- warn "WARNING: Uppercase character found in package name in line $_\n" if $_ =~ /[A-Z]/;
- warn "ERROR: PACKAGES .. line missing in $file\n",next unless $type;
- push @{$list{$type}}, split if $doit;
- $types{$type}=1 if $doit; # remember which types are used in package_config
- }
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub execute {
-
- # execute a command or only print it
- my @cmds = @_;
-
- # TODO: split cmds into array except when a pipe is found
-
- my $command = join (' ', at cmds);
- my $error;
-
- $dryrun and $verbose = 1;
- $verbose and warn "$0: executing $command\n";
- $dryrun and return;
-
- # @cmds should me more efficient
- $error = system @cmds;
- warn "ERROR: $error $?\n" if $error;
- my $rc = $?>>8;
- warn "ERROR: $cmds[0] return code $rc\n" if $rc;
- $execerrors++ if $rc;
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub dselectupgrade {
-
- my $type = shift;
- my ($package,$action,$list);
- my $tempfile = "$FAI_ROOT/tmp/dpkg-selections.tmp"; # TODO: use better uniq filename
- while (@{$list{$type}}) {
- $package = shift @{$list{$type}};
- $action = shift @{$list{$type}};
- $list .= "$package $action\n";
- }
-
- open TMP,"> $tempfile" || die " Can't write to $tempfile";
- print TMP $list;
- close TMP;
-
- execute("$rootcmd dpkg --set-selections < $tempfile");
- execute("$rootcmd $command{$type}");
- unlink $tempfile;
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub installable {
-
- # ckeck, wether package can be installed.
- # return false for packages which only exist in
- # dpkg status files
-
- my $package = shift;
- # print "Checking wether $package is installable...\n";
-
- # version list of package
- my $vlist = $cache->{$package}{VersionList};
-
- # for each version
- foreach my $version (@$vlist) {
- # list of package files
- my $flist = $version->{FileList};
- foreach my $fitem (@$flist) {
- # if the file is a package index (not a dpkg status file)
- # the package is installable
- return 1 if ($fitem->{File}{IndexType} eq "Debian Package Index");
- }
- }
-
- # no package index file found for the current package
- return 0;
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub mkpackagelist {
-
- my @complete = @_; # copy original list
- my @orig = ();
- @unknown = @known = ();
- my %complete = ();
-
- # create two list of packages
- # @unknown contains the unknown packages
- # @known contains the known packages
-
- # nothing to do, when no Debian types/commands are used at all
- unless ($hasdebian) {
- @known = @complete;
- return;
- }
-
- # no package name checking when using smart
- if ($atype eq "smarti" || $atype eq "smartr") {
- @known=@complete;
- return;
- }
-
- # ignore packages ending with - when using -d
- @complete = grep {!/-$/} @complete if $opt_d;
-
- foreach (reverse @complete) {
- my $pack = $_;
- if ( /^(.+)[_=+-]$/ and $1 and $cache->exists($1)) {
- $pack = $1;
- }
- if (! defined ($complete{$pack})) {
- $complete{$pack} = 1;
- unshift @orig, $_;
- }
- }
-
- # currently we disable the complete checking of package names if aptitude
- # is used. This is because we can't check task names, which are supported by aptitude
- if ($atype eq "aptitude") {
- @known=@orig;
- return;
- }
-
- foreach my $pack (@orig) {
-
-# if ($atype eq "aptitude" && $pack =~ /^~/) {
-# # add to known if is it an aptitude search pattern
-# push @known, $pack;
-# next;
-# }
-# TODO: aptitude also can install tasks. How do we check them? Currently they will push to @unknown
-
- if ($cache->exists($pack)) { # simple package name
- # check for packages with no installation candidates
- # explicitely don't check if the name is provided by some other package:
- # apt-get install <virtual> fails with newer apt
-
- if (installable($pack)) {
- push @known, $pack;
- } else {
- push @unknown, $pack;
- }
-
- }
-
- # simulate APTs and aptitudes understanding of "special" package names
- # suffixed by -, +
- elsif ( $pack =~ /^(.+)[_=+-]$/ and $cache->exists($1)) {
-
- if (defined ($cache->{$1}{VersionList})) {
- push @known, $pack;
- } else {
- push @unknown, $pack;
- }
-
- } else {
- push @unknown, $pack;
- }
- }
- warn "WARNING: These unknown packages are removed from the installation list: " . join(' ',sort @unknown) . "\n" if @unknown;
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub usage {
-
- print << "EOF";
-install_packages $version
-
- Please read the manual pages install_packages(8).
-EOF
- exit 0;
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub setdownloadonly {
-
-# Definitions for install_packages(8) for download only mode
-# Used by fai-mirror(1)
-
-# we are using a variable from %ENV
-# for debugging remove >/dev/null and -q
-
-undef @commands;
-undef %command;
-
-$maxpl=9999;
- at commands = qw/taskinst aptitude aptitude-r install unpack/;
-%command = (
- "install" => "apt-get $qopt -d $ENV{aptoptions} -y --fix-missing install",
- "taskinst" => "aptitude -d $ENV{aptoptions} -y install $devnull",
- "aptitude" => "aptitude -R -d $ENV{aptoptions} -y install $devnull",
- "aptitude-r" => "aptitude -r -d $ENV{aptoptions} -y install $devnull",
- "unpack" => "cd $downloaddir; aptitude download",
- "clean-internal" => 'true',
- "pending-internal" => 'true',
- "dpkgc-internal" => 'true',
-);
-
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub check_aptpkg {
-
- # check if the Perl module is available
- if (eval "require AptPkg::Config") {
- $use_aptpkg=1;
- eval "require AptPkg::System";
- eval "require AptPkg::Cache";
-
- $_config = $AptPkg::Config::_config;
- $_system = $AptPkg::System::_system;
- eval 'import AptPkg::Config $_config';
- eval 'import AptPkg::System $_system';
- eval 'import AptPkg::Cache';
- }
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
-sub showcommands {
-
- # show all available commands
- print "List of known commands for package_config files\n";
- print "Short list:\n";
- foreach (sort keys %command) {
- next if /-internal/; # skip internal commands
- print "$_\n";
- }
-
- print "\nLong list:\n";
- foreach (sort keys %command) {
- next if /-internal/; # skip internal commands
- printf "%15s $command{$_}\n",$_;
- }
- exit 0;
-}
-# - - - - - - - - - - - - - - - - - - - - - - - - - - -
More information about the Fai-commit
mailing list