diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 13:46:56 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 13:46:56 +0000 |
commit | 8e79ad9f544d1c4a0476e0d96aef0496ca7fc741 (patch) | |
tree | cda1743f5820600fd8c638ac7f034f917ac8c381 /lib/Sbuild/ChrootInfoSchroot.pm | |
parent | Initial commit. (diff) | |
download | sbuild-8e79ad9f544d1c4a0476e0d96aef0496ca7fc741.tar.xz sbuild-8e79ad9f544d1c4a0476e0d96aef0496ca7fc741.zip |
Adding upstream version 0.85.6.upstream/0.85.6
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/Sbuild/ChrootInfoSchroot.pm')
-rw-r--r-- | lib/Sbuild/ChrootInfoSchroot.pm | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/lib/Sbuild/ChrootInfoSchroot.pm b/lib/Sbuild/ChrootInfoSchroot.pm new file mode 100644 index 0000000..92b4c03 --- /dev/null +++ b/lib/Sbuild/ChrootInfoSchroot.pm @@ -0,0 +1,186 @@ +# +# ChrootInfo.pm: chroot utility library for sbuild +# Copyright © 2005-2009 Roger Leigh <rleigh@debian.org> +# +# 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. If not, see +# <http://www.gnu.org/licenses/>. +# +####################################################################### + +package Sbuild::ChrootInfoSchroot; + +use Sbuild::ChrootInfo; +use Sbuild::ChrootSchroot; + +use strict; +use warnings; + +BEGIN { + use Exporter (); + our (@ISA, @EXPORT); + + @ISA = qw(Exporter Sbuild::ChrootInfo); + + @EXPORT = qw(); +} + +sub new { + my $class = shift; + my $conf = shift; + + my $self = $class->SUPER::new($conf); + bless($self, $class); + + return $self; +} + +sub get_info_from_stream { + my $self = shift; + my $stream = shift; + + my $chroot_type = ''; + my %tmp = ('Namespace' => '', + 'Name' => '', + 'Priority' => 0, + 'Location' => '', + 'Session Purged' => 0); + + while (<$stream>) { + chomp; + + last if ! $_; + + if (/^\s*(───|---) Chroot \1$/ && + $tmp{'Namespace'} eq "") { + $tmp{'Namespace'} = 'chroot'; + } + if (/^\s*(───|---) Session \1$/ && + $tmp{'Namespace'} eq "") { + $tmp{'Namespace'} = 'session'; + } + if (/^\s*(───|---) Source \1$/ && + $tmp{'Namespace'} eq "") { + $tmp{'Namespace'} = 'source'; + } + if (/^\s*Name:?\s+(.*)$/ && + $tmp{'Name'} eq "") { + $tmp{'Name'} = $1; + } + if (/^\s*Type:?\s+(.*)$/) { + $chroot_type = $1; + } + if (/^\s*Location:?\s+(.*)$/ && + $tmp{'Location'} eq "") { + $tmp{'Location'} = $1; + } + if (/^\s*Mount Location:?\s+(.*)$/ && + $tmp{'Location'} eq "") { + $tmp{'Location'} = $1; + } + # Path takes priority over Location and Mount Location. + if (/^\s*Path:?\s+(.*)$/) { + $tmp{'Location'} = $1; + } + if (/^\s*Priority:?\s+(\d+)$/) { + $tmp{'Priority'} = $1; + } + if (/^\s*Session Purged\s+(.*)$/) { + if ($1 eq "true") { + $tmp{'Session Purged'} = 1; + } + } + if (/^\s*Aliases:?\s+(.*)$/) { + $tmp{'Aliases'} = $1; + } + } + + if ($self->get_conf('DEBUG') && $tmp{'Name'}) { + print STDERR "Found schroot chroot: $tmp{'Namespace'}:$tmp{'Name'}\n"; + foreach (sort keys %tmp) { + print STDERR " $_ $tmp{$_}\n"; + } + } + + if (!$tmp{'Name'}) { + return undef; + } + return \%tmp; +} + +sub get_info { + my $self = shift; + my $chroot = shift; + + my $chroot_type = ""; + + # If namespaces aren't supported, try to fall back to old style session. + open CHROOT_DATA, '-|', $self->get_conf('SCHROOT'), '--info', '--chroot', "session:$chroot" or + open CHROOT_DATA, '-|', $self->get_conf('SCHROOT'), '--info', '--chroot', $chroot or + die 'Can\'t run ' . $self->get_conf('SCHROOT') . ' to get chroot data'; + + my $tmp = $self->get_info_from_stream(\*CHROOT_DATA); + + if (!$tmp) { + close CHROOT_DATA; + return undef; + } + + close CHROOT_DATA or die "Can't close schroot pipe getting chroot data"; + + return $tmp; +} + +sub get_info_all { + my $self = shift; + + my $chroots = {}; + + local %ENV; + + $ENV{'LC_ALL'} = 'C'; + $ENV{'LANGUAGE'} = 'C'; + + open CHROOTS, '-|', $self->get_conf('SCHROOT'), '--info' + or die 'Can\'t run ' . $self->get_conf('SCHROOT'); + my $tmp = undef; + while (defined($tmp = $self->get_info_from_stream(\*CHROOTS))) { + my $namespace = $tmp->{'Namespace'}; + $namespace = "chroot" + if !$tmp->{'Namespace'}; + $chroots->{$namespace} = {} + if (!exists($chroots->{$namespace})); + $chroots->{$namespace}->{$tmp->{'Name'}} = $tmp; + foreach my $alias (split(/\s+/, $tmp->{'Aliases'})) { + $chroots->{$namespace}->{$alias} = $tmp; + } + } + close CHROOTS or die "Can't close schroot pipe"; + + $self->set('Chroots', $chroots); +} + +sub _create { + my $self = shift; + my $chroot_id = shift; + + my $chroot = undef; + + if (defined($chroot_id)) { + $chroot = Sbuild::ChrootSchroot->new($self->get('Config'), $chroot_id); + } + + return $chroot; +} + +1; |