summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespie <espie@openbsd.org>2010-06-06 11:00:40 +0000
committerespie <espie@openbsd.org>2010-06-06 11:00:40 +0000
commite26a8e59ab86d74a51549b6935ac881b9824e6a6 (patch)
tree6a5d9dd61b428e8da32aa4c3ce7a50def56d4de7
parenttypo in comment (diff)
downloadwireguard-openbsd-e26a8e59ab86d74a51549b6935ac881b9824e6a6.tar.xz
wireguard-openbsd-e26a8e59ab86d74a51549b6935ac881b9824e6a6.zip
clean-up into smaller functions
-rw-r--r--usr.sbin/pkg_add/OpenBSD/PkgCreate.pm378
1 files changed, 224 insertions, 154 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm b/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm
index 9efbf70ac72..13e08e4aa39 100644
--- a/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm
+++ b/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm
@@ -1,6 +1,6 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
-# $OpenBSD: PkgCreate.pm,v 1.4 2010/06/05 12:27:40 espie Exp $
+# $OpenBSD: PkgCreate.pm,v 1.5 2010/06/06 11:00:40 espie Exp $
#
# Copyright (c) 2003-2010 Marc Espie <espie@openbsd.org>
#
@@ -30,6 +30,7 @@ sub init
$self->{stash} = {};
$self->SUPER::init(@_);
+ $self->{simple_status} = 0;
}
sub stash
@@ -45,6 +46,33 @@ sub error
$self->errsay(@_);
}
+sub set_status
+{
+ my ($self, $status) = @_;
+ if ($self->{simple_status}) {
+ print "\n$status";
+ } else {
+ if ($self->progress->set_header($status)) {
+ $self->progress->message;
+ } else {
+ $| = 1;
+ print "$status...";
+ $self->{simple_status} = 1;
+ }
+ }
+}
+
+sub end_status
+{
+ my $self = shift;
+
+ if ($self->{simple_status}) {
+ print "\n";
+ } else {
+ $self->progress->clear;
+ }
+}
+
package OpenBSD::PkgCreate;
use OpenBSD::PackingList;
@@ -541,18 +569,194 @@ sub add_description
}
}
-my (@contents, %dependencies, %wantlib, @signature_params);
+sub add_signature
+{
+ my ($self, $plist, $cert, $privkey) = @_;
+
+ require OpenBSD::x509;
+
+ my $sig = OpenBSD::PackingElement::DigitalSignature->new_x509;
+ $sig->add_object($plist);
+ $sig->{b64sig} = OpenBSD::x509::compute_signature($plist,
+ $cert, $privkey);
+}
+
+sub create_archive
+{
+ my ($self, $filename, $dir) = @_;
+ open(my $fh, "|-", OpenBSD::Paths->gzip, "-f", "-o", $filename);
+ return OpenBSD::Ustar->new($fh, $dir);
+}
+
+sub sign_existing_package
+{
+ my ($self, $pkgname, $cert, $privkey) = @_;
+
+ require OpenBSD::PackageLocator;
+
+ my $true_package = OpenBSD::PackageLocator->find($pkgname);
+ die "No such package $pkgname" unless $true_package;
+ my $dir = $true_package->info;
+ my $plist = OpenBSD::PackingList->fromfile($dir.CONTENTS);
+ $plist->set_infodir($dir);
+ $self->add_signature($plist, $cert, $privkey);
+ $plist->save;
+ my $tmp = OpenBSD::Temp::permanent_file(".", "pkg");
+ my $wrarc = $self->create_archive($tmp, ".");
+ $plist->copy_over($wrarc, $true_package);
+ $wrarc->close;
+ $true_package->wipe_info;
+ unlink($plist->pkgname.".tgz");
+ rename($tmp, $plist->pkgname.".tgz") or
+ die "Can't create final signed package $!\n";
+}
+
+sub add_extra_info
+{
+ my ($self, $plist, $subst) = @_;
-my $regen_package = 0;
-my $sign_only = 0;
-my ($cert, $privkey);
+ my $fullpkgpath = $subst->value('FULLPKGPATH');
+ my $cdrom = $subst->value('PERMIT_PACKAGE_CDROM') ||
+ $subst->value('CDROM');;
+ my $ftp = $subst->value('PERMIT_PACKAGE_FTP') ||
+ $subst->value('FTP');
+ if (defined $fullpkgpath || defined $cdrom || defined $ftp) {
+ $fullpkgpath //= '';
+ $cdrom //= 'no';
+ $ftp //= 'no';
+ $cdrom = 'yes' if $cdrom =~ m/^yes$/io;
+ $ftp = 'yes' if $ftp =~ m/^yes$/io;
+
+ OpenBSD::PackingElement::ExtraInfo->add($plist,
+ $fullpkgpath, $cdrom, $ftp);
+ } else {
+ Warn "Package without FULLPKGPATH\n";
+ }
+}
+
+sub add_elements
+{
+ my ($self, $plist, $state, $dep, $want) = @_;
+
+ my $subst = $state->{subst};
+ add_description($subst, $plist, DESC, $state->opt('d'));
+ add_special_file($subst, $plist, DISPLAY, $state->opt('M'));
+ add_special_file($subst, $plist, UNDISPLAY, $state->opt('U'));
+ if (defined $state->opt('p')) {
+ OpenBSD::PackingElement::Cwd->add($plist, $state->opt('p'));
+ } else {
+ Usage "Prefix required";
+ }
+ for my $d (sort keys %$dep) {
+ OpenBSD::PackingElement::Dependency->add($plist, $d);
+ }
+
+ for my $w (sort keys %$want) {
+ OpenBSD::PackingElement::Wantlib->add($plist, $w);
+ }
+
+ if (defined $state->opt('A')) {
+ OpenBSD::PackingElement::Arch->add($plist, $state->opt('A'));
+ }
+
+ if (defined $state->opt('L')) {
+ OpenBSD::PackingElement::LocalBase->add($plist, $state->opt('L'));
+ }
+ $self->add_extra_info($plist, $subst);
+}
+
+sub create_plist
+{
+ my ($self, $state, $pkgname, $frags, $dep, $want) = @_;
+
+ my $plist = OpenBSD::PackingList->new;
+
+ if ($pkgname =~ m|([^/]+)$|o) {
+ $pkgname = $1;
+ $pkgname =~ s/\.tgz$//o;
+ }
+ $plist->set_pkgname($pkgname);
+ print "Creating package $pkgname\n"
+ if !(defined $state->opt('q')) && $state->opt('v');
+ if (!$state->opt('q')) {
+ $plist->set_infodir(OpenBSD::Temp->dir);
+ }
+
+ $self->add_elements($plist, $state, $dep, $want);
+ unless (defined $state->opt('q') && defined $state->opt('n')) {
+ $state->set_status("reading plist");
+ }
+ for my $contentsfile (@$frags) {
+ read_fragments($state, $plist, $contentsfile) or
+ Fatal "Can't read packing list $contentsfile";
+ }
+ return $plist;
+}
+
+sub make_plist_with_sum
+{
+ my ($self, $state, $plist) = @_;
+ my $p2 = OpenBSD::PackingList->new;
+ $state->progress->visit_with_count($plist, 'makesum_plist', $p2, $state);
+ $p2->set_infodir($plist->infodir);
+ return $p2;
+}
+
+sub read_existing_plist
+{
+ my ($self, $contents) = @_;
+
+ my $plist = OpenBSD::PackingList->new;
+ if (-d $contents && -f $contents.'/'.CONTENTS) {
+ $plist->set_infodir($contents);
+ $contents .= '/'.CONTENTS;
+ } else {
+ $plist->set_infodir(dirname($contents));
+ }
+ $plist->fromfile($contents) or
+ Fatal "Can't read packing list $contents";
+ return $plist;
+}
+
+sub create_package
+{
+ my ($self, $state, $plist, $wname) = @_;
+
+ print "Creating gzip'd tar ball in '$wname'\n" if $state->opt('v');
+ my $h = sub {
+ unlink $wname;
+ my $caught = shift;
+ $SIG{$caught} = 'DEFAULT';
+ kill $caught, $$;
+ };
+
+ local $SIG{'INT'} = $h;
+ local $SIG{'QUIT'} = $h;
+ local $SIG{'HUP'} = $h;
+ local $SIG{'KILL'} = $h;
+ local $SIG{'TERM'} = $h;
+ $state->{archive} = $self->create_archive($wname, $plist->infodir);
+ $state->set_status("archiving");
+ $state->progress->visit_with_size($plist, 'create_package', $state);
+ $state->end_status;
+ $state->{archive}->close;
+ if ($state->{bad}) {
+ unlink($wname);
+ exit(1);
+ }
+}
sub parse_and_run
{
my $self = shift;
+ my ($cert, $privkey);
+ my $regen_package = 0;
+ my $sign_only = 0;
+ my (@contents, %dependencies, %wantlib, @signature_params);
+
+
my $state = OpenBSD::PkgCreate::State->new;
- my $plist = new OpenBSD::PackingList;
$state->{opt} = {
'f' =>
@@ -577,8 +781,6 @@ sub parse_and_run
'[-s x509 -s cert -s priv] [-U undisplayfile] [-W wantedlib]',
'-d desc -D COMMENT=value -f packinglist -p prefix pkg-name');
- my $subst = $state->{subst};
-
if (@ARGV == 0) {
$regen_package = 1;
} elsif (@ARGV != 1) {
@@ -589,7 +791,6 @@ sub parse_and_run
}
try {
-
if (@signature_params > 0) {
if (@signature_params != 3 || $signature_params[0] ne 'x509' ||
!-f $signature_params[1] || !-f $signature_params[2]) {
@@ -611,112 +812,23 @@ sub parse_and_run
}
}
- my $cont = 0;
+ my $plist;
if ($regen_package) {
if (@contents != 1) {
Usage "Exactly one single packing list is required";
}
- if (-d $contents[0] && -f $contents[0].'/'.CONTENTS) {
- $plist->set_infodir($contents[0]);
- $contents[0] .= '/'.CONTENTS;
- } else {
- $plist->set_infodir(dirname($contents[0]));
- }
- $plist->fromfile($contents[0]) or
- Fatal "Can't read packing list $contents[0]";
+ $plist = $self->read_existing_plist($contents[0]);
} elsif ($sign_only) {
if ($state->not) {
Fatal "Can't pretend to sign existing packages";
}
for my $pkgname (@ARGV) {
- require OpenBSD::PackageLocator;
- require OpenBSD::x509;
-
- my $true_package = OpenBSD::PackageLocator->find($pkgname);
- die "No such package $pkgname" unless $true_package;
- my $dir = $true_package->info;
- my $plist = OpenBSD::PackingList->fromfile($dir.CONTENTS);
- $plist->set_infodir($dir);
- my $sig = OpenBSD::PackingElement::DigitalSignature->new_x509;
- $sig->add_object($plist);
- $sig->{b64sig} = OpenBSD::x509::compute_signature($plist,
- $cert, $privkey);
- $plist->save;
- my $tmp = OpenBSD::Temp::permanent_file(".", "pkg");
- open( my $outfh, "|-", OpenBSD::Paths->gzip, "-o", $tmp);
-
- my $wrarc = OpenBSD::Ustar->new($outfh, ".");
- $plist->copy_over($wrarc, $true_package);
- $wrarc->close;
- $true_package->wipe_info;
- unlink($plist->pkgname.".tgz");
- rename($tmp, $plist->pkgname.".tgz") or
- die "Can't create final signed package $!";
+ $self->sign_existing($pkgname, $cert, $privkey);
}
exit(0);
} else {
- print "Creating package $ARGV[0]\n" if !(defined $state->opt('q')) && $state->opt('v');
- if (!$state->opt('q')) {
- $plist->set_infodir(OpenBSD::Temp->dir);
- }
- add_description($subst, $plist, DESC, $state->opt('d'));
- add_special_file($subst, $plist, DISPLAY, $state->opt('M'));
- add_special_file($subst, $plist, UNDISPLAY, $state->opt('U'));
- if (defined $state->opt('p')) {
- OpenBSD::PackingElement::Cwd->add($plist, $state->opt('p'));
- } else {
- Usage "Prefix required";
- }
- for my $d (sort keys %dependencies) {
- OpenBSD::PackingElement::Dependency->add($plist, $d);
- }
-
- for my $w (sort keys %wantlib) {
- OpenBSD::PackingElement::Wantlib->add($plist, $w);
- }
-
- if (defined $state->opt('A')) {
- OpenBSD::PackingElement::Arch->add($plist, $state->opt('A'));
- }
-
- if (defined $state->opt('L')) {
- OpenBSD::PackingElement::LocalBase->add($plist, $state->opt('L'));
- }
- if ($ARGV[0] =~ m|([^/]+)$|o) {
- my $pkgname = $1;
- $pkgname =~ s/\.tgz$//o;
- $plist->set_pkgname($pkgname);
- }
- my $fullpkgpath = $subst->value('FULLPKGPATH');
- my $cdrom = $subst->value('PERMIT_PACKAGE_CDROM') ||
- $subst->value('CDROM');;
- my $ftp = $subst->value('PERMIT_PACKAGE_FTP') ||
- $subst->value('FTP');
- if (defined $fullpkgpath || defined $cdrom || defined $ftp) {
- $fullpkgpath //= '';
- $cdrom //= 'no';
- $ftp //= 'no';
- $cdrom = 'yes' if $cdrom =~ m/^yes$/io;
- $ftp = 'yes' if $ftp =~ m/^yes$/io;
-
- OpenBSD::PackingElement::ExtraInfo->add($plist,
- $fullpkgpath, $cdrom, $ftp);
- } else {
- Warn "Package without FULLPKGPATH\n";
- }
- unless (defined $state->opt('q') && defined $state->opt('n')) {
- if ($state->progress->set_header("reading plist")) {
- $state->progress->message;
- } else {
- $| = 1;
- print "Reading plist...";
- $cont = 1;
- }
- }
- for my $contentsfile (@contents) {
- read_fragments($state, $plist, $contentsfile) or
- Fatal "Can't read packing list $contentsfile";
- }
+ $plist = $self->create_plist($state, $ARGV[0], \@contents,
+ \%dependencies, \%wantlib);
}
@@ -730,25 +842,16 @@ sub parse_and_run
$state->{base} = $base;
unless (defined $state->opt('q') && defined $state->opt('n')) {
- if ($cont) {
- print "\nChecksumming...";
- } else {
- $state->progress->set_header("checksumming");
- }
+ $state->set_status("checksumming");
if ($regen_package) {
$state->progress->visit_with_count($plist, 'verify_checksum', $state);
} else {
- my $p2 = OpenBSD::PackingList->new;
- $state->progress->visit_with_count($plist, 'makesum_plist', $p2, $state);
- $p2->set_infodir($plist->infodir);
- $plist = $p2;
- }
- if ($cont) {
- print "\n";
+ $plist = $self->make_plist_with_sum($state, $plist);
}
+ $state->end_status;
}
- if (!defined $plist->{name}) {
+ if (!defined $plist->pkgname) {
$state->error("Can't write unnamed packing list");
exit 1;
}
@@ -770,16 +873,13 @@ sub parse_and_run
$plist->avert_duplicates_and_other_checks($state);
$state->{stash} = {};
- if ($state->{bad} && $subst->empty('REGRESSION_TESTING')) {
+ if ($state->{bad} && $state->{subst}->empty('REGRESSION_TESTING')) {
exit 1;
}
$state->{bad} = 0;
if (defined $cert) {
- my $sig = OpenBSD::PackingElement::DigitalSignature->new_x509;
- $sig->add_object($plist);
- require OpenBSD::x509;
- $sig->{b64sig} = OpenBSD::x509::compute_signature($plist, $cert, $privkey);
+ $self->add_signature($plist, $cert, $privkey);
$plist->save if $regen_package;
}
@@ -795,39 +895,9 @@ sub parse_and_run
$state->{archive} = OpenBSD::Ustar->new(undef, $plist->infodir);
$plist->pretend_to_archive($state);
} else {
- print "Creating gzip'd tar ball in '$wname'\n" if $state->opt('v');
- my $h = sub {
- unlink $wname;
- my $caught = shift;
- $SIG{$caught} = 'DEFAULT';
- kill $caught, $$;
- };
-
- local $SIG{'INT'} = $h;
- local $SIG{'QUIT'} = $h;
- local $SIG{'HUP'} = $h;
- local $SIG{'KILL'} = $h;
- local $SIG{'TERM'} = $h;
- open(my $fh, "|-", OpenBSD::Paths->gzip, "-f", "-o", $wname);
- $state->{archive} = OpenBSD::Ustar->new($fh, $plist->infodir);
-
- if ($cont) {
- print "Archiving...";
- } else {
- $state->progress->set_header("archiving");
- }
- $state->progress->visit_with_size($plist, 'create_package', $state);
- if ($cont) {
- print "\n";
- }
- $state->progress->clear;
- $state->{archive}->close;
- if ($state->{bad}) {
- unlink($wname);
- exit(1);
- }
- }
- } catch {
+ $self->create_package($state, $plist, $wname);
+ }
+ }catch {
print STDERR "$0: $_\n";
exit(1);
};