Files
docker-deluge/scripts/complete.pl
foobar 5ed9459f48 init
2022-10-28 16:51:46 +02:00

122 lines
3.2 KiB
Perl
Executable File

#!/usr/bin/perl
use strict;
use warnings;
use feature qw(say);
use Filesys::Df;
use Data::Dumper;
use File::Find;
use Archive::Zip qw/ :ERROR_CODES :MISC_CONSTANTS /;
use File::Path qw(remove_tree);
use File::Copy;
# VARS
my($torrentid, $torrentname, $torrentpath) = @ARGV;
my($torrent_dir_path, $torrent_dir_path_clean, $zip_path, $zip_temp_path, $zip_name) = (undef) x 5;
# Open log
my $logfile = '/root/logs/' . $torrentname . '.log';
open(my $fh, '>', $logfile);
# Initialize filepaths
&init_vars();
say $fh "torrentid: $torrentid\ntorrentname: $torrentname\ntorrentpath: $torrentpath";
say $fh "torrent_dir_path: $torrent_dir_path\ntorrent_dir_path_clean: $torrent_dir_path_clean\nzip_path: $zip_path\nzip_temp_path: $zip_temp_path";
# Rename dir
rename($torrent_dir_path, $torrent_dir_path_clean);
# Check if zipping is possible
if (&can_extract($torrent_dir_path_clean)) {
say $fh 'Enough space for zipping available.';
# Zip
&zip_torrent($torrent_dir_path_clean, $zip_temp_path);
# Move zip
move($zip_temp_path, $zip_path);
# Set owner
&change_owner('www-data', 'www-data', $zip_path);
# Delete torrent dir
my $removed_count = remove_tree($torrent_dir_path_clean, {
verbose => 1,
safe => 1,
});
}
else {
say $fh 'Not enough space for zipping available.';
die 'Not enough space for zipping available.';
}
# Close log
close($fh);
sub change_owner {
my ($user_name, $group_name, $file_name) = @_;
my $uid = getpwnam $user_name;
my $gid = getgrnam $group_name;
chown $uid, $gid, $file_name;
say $fh 'Successfully changed owner: ' . "$zip_path, User $user_name Group $group_name";
}
sub init_vars {
$torrent_dir_path = $torrentpath . '/' . $torrentname;
$zip_name = $torrentname;
$zip_name =~ s/[^a-zA-Z0-9,]//g;
$torrent_dir_path_clean = $torrentpath . '/' . $zip_name;
$zip_path = '/root/VST/' . $zip_name . '.zip';
$zip_temp_path = $torrentpath . '/' . $zip_name . '.zip';
}
sub zip_torrent {
my ($path, $zip_path) = @_;
# Init
my $zip = Archive::Zip->new();
# Add root dir
$zip->addTree({
root => $path,
select => sub {
say $fh "Storing $_";
1;
},
#compressionLevel = DEFLATING_COMPRESSION_NORMAL,
});
# Save the Zip file
unless ( $zip->writeToFileNamed($zip_path) == AZ_OK ) {
die 'zip write error';
}
say $fh 'Zipping successfully: ' . $zip_path;
}
sub can_extract {
my $torrentpath = shift;
# Free space
my $df_ref = df('/', 1);
my $free_space_mb = &size_in_mb($$df_ref{'bavail'});
say $fh "Free space: " . $free_space_mb;
# Torrent size
my $torrentsize_mb;
find(sub { $torrentsize_mb += -s if -f }, $torrentpath);
$torrentsize_mb = &size_in_mb($torrentsize_mb);
say $fh "Torrentsize: " . $torrentsize_mb;
if ($torrentsize_mb > $free_space_mb) {
return 0;
}
elsif ($torrentsize_mb < $free_space_mb) {
return 1;
}
else {
die "Could not determine file relationships";
}
}
sub size_in_mb {
my $size_in_bytes = shift;
return int($size_in_bytes / (1024 * 1024) + 0.5);
}