return "unable to read tail (got $br bytes)";
}
+# Check if the status returned by upid_read_status is an error status.
+# If the status could not be parsed it's also treated as an error.
+sub upid_status_is_error {
+ my ($status) = @_;
+
+ return !($status eq 'OK' || $status =~ m/^WARNINGS: \d+$/);
+}
+
# useful functions to store comments in config files
sub encode_text {
my ($text) = @_;
# opts is a hash ref with the following known properties
+# allow_overwrite - if 1, overwriting existing files is allowed, use with care. Default to false
# hash_required - if 1, at least one checksum has to be specified otherwise an error will be thrown
# http_proxy
# https_proxy
print "downloading $url to $dest\n";
- my $tmpdest = "$dest.tmp.$$";
- eval {
- if (-f $dest && $checksum_algorithm) {
+ if (-f $dest) {
+ if ($checksum_algorithm) {
print "calculating checksum of existing file...";
my $checksum_got = get_file_hash($checksum_algorithm, $dest);
if (lc($checksum_got) eq lc($checksum_expected)) {
print "OK, got correct file already, no need to download\n";
return;
+ } elsif ($opts->{allow_overwrite}) {
+ print "checksum mismatch: got '$checksum_got' != expect '$checksum_expected', re-download\n";
} else {
- # we could re-download, but may not be safe so just abort for now..
print "\n"; # the front end expects the error to reside at the last line without any noise
die "checksum mismatch: got '$checksum_got' != expect '$checksum_expected', aborting\n";
}
+ } elsif (!$opts->{allow_overwrite}) {
+ die "refusing to override existing file '$dest'\n";
}
+ }
+ my $tmpdest = "$dest.tmp.$$";
+ eval {
local $SIG{INT} = sub {
unlink $tmpdest or warn "could not cleanup temporary file: $!";
die "got interrupted by signal\n";