Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-ports
Path: blob/main/Tools/scripts/pkg-stash/pkg-stash.pl
18157 views
1
#!/usr/bin/perl -wT
2
3
use strict;
4
5
use Sys::Hostname;
6
use File::Basename;
7
use Getopt::Std;
8
use POSIX qw(strftime);
9
10
sub usage() {
11
12
die("Usage:\n"
13
."\tpkg-stash [-D base] [-d dir] [-g group] [-o owner] [-cfNn] filename..\n"
14
."\tpkg-stash [-D base] [-d dir] [-g group] [-o owner] -p\n");
15
}
16
17
sub stashfile($ %) {
18
my ($path, %args) = @_;
19
my ($dir, $base, $ext);
20
my ($ts, $fname);
21
my (@opts, @cmd);
22
23
($base, $dir, $ext) = fileparse($path, '\.tgz', '\.tar\.gz', '\.tbz', '\.tbz2');
24
if ($args{'nostamp'}) {
25
$ts = "";
26
} else {
27
$ts = "-ts".strftime("%Y%m%d%H%M", localtime());
28
}
29
$fname = "$base$ts$ext";
30
31
@cmd = ("install");
32
push(@cmd, '-v') if ($args{'verbose'});
33
push(@cmd, $args{'copy'}) if ($args{'copy'} ne "");
34
push(@cmd, $args{'owner'}) if ($args{'owner'} ne "");
35
push(@cmd, $args{'group'}) if ($args{'group'} ne "");
36
push(@cmd, $path, "$args{dir}/$fname");
37
38
if ($args{'noact'}) {
39
print join(' ', @cmd)."\n";
40
return 1;
41
}
42
if (system(@cmd) != 0) {
43
warn "Installing $path to $args{dir}/$fname failed: $?\n";
44
}
45
if (system('rm', $path) != 0) {
46
warn "Removing %path failed: $?\n";
47
}
48
}
49
50
MAIN:{
51
my %stashargs = (
52
"base" => "/var/backups/packages/",
53
"copy" => "",
54
"dir" => "",
55
"group" => "",
56
"noact" => 0,
57
"nostamp" => 0,
58
"owner" => "",
59
"verbose" => 0,
60
);
61
my $printonly = 0;
62
my %opts;
63
my $path;
64
65
getopts("CcD:d:fg:Nno:pv", \%opts) or
66
usage();
67
$stashargs{'base'} = $opts{'D'} if (defined($opts{'D'}));
68
$stashargs{'copy'} = 'c' if (defined($opts{'c'}));
69
$stashargs{'copy'} = 'C' if (defined($opts{'C'}));
70
$stashargs{'dir'} = $opts{'d'} if (defined($opts{'d'}));
71
$stashargs{'force'} = 1 if (defined($opts{'f'}));
72
$stashargs{'group'} = "-g $opts{g}" if (defined($opts{'g'}));
73
$stashargs{'nostamp'} = 1 if (defined($opts{'N'}));
74
$stashargs{'noact'} = 1 if (defined($opts{'n'}));
75
$stashargs{'owner'} = "-o $opts{o}" if (defined($opts{'o'}));
76
$stashargs{'verbose'} = 1 if (defined($opts{'v'}));
77
$printonly = 1 if (defined($opts{'p'}));
78
79
if ($stashargs{'dir'} eq "") {
80
my $hostname = hostname();
81
82
$hostname =~ s/\..*//;
83
$stashargs{'dir'} = $stashargs{'base'}.$hostname;
84
}
85
86
# Do nada?
87
if ($printonly) {
88
print $stashargs{'dir'}."\n";
89
exit(0);
90
}
91
92
# Force taint mode into submission
93
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
94
$ENV{'PATH'} = '/bin:/usr/bin';
95
96
# Okay, process the arguments..
97
if ($#ARGV == -1) {
98
usage();
99
}
100
foreach $path (@ARGV) {
101
stashfile($path, %stashargs);
102
}
103
}
104
105