#!/usr/bin/perl # Make sure this points to your perl executable # String::CRC32 is required you can install using cpan use String::CRC32; # Wing Server SFV Checker v1.00b - benny / clarjl3@students.fscj.edu # # I put this together because the sfv checker that comes with Wing Server isn't recursive # and wont check sub directories inside the specified sfv checking directory # # Apologies for the sloppy code I wanted a working sfv checker quick, ill try and clean it # up and add more features when I have more time. # # Known bugs / Irrelevant issues? # - As of now this will only check files in a sfv against the files uploaded # to the directory that your uploading to, so if any file not in the sfv is uploaded # it will just be ignored and possible to just have misc unwanted files laying around.. # # - The $home variable could cause issues with multiple domains and users depending on your setup.. # on my setup i have all my files going to /usr/files and my one user having a home directory of /usr/files # so everything sent to this script would be /Dircreated/Files.. which would be # ($home/Dircreated/Files) -> /usr/files/Dircreated/Files # - I'll add a more flexable $home in the future! # # - If there is more than one sfv this script will just exit.. # # Using / Installing this # - You will need to run cpan and install String::CRC32 # - Put this perl script somewhere you can find it later # - chmod +x /path/to/where/you/put/checker # # - Goto the Wing Server http admin panel and click on a domain # - Click on Ftp Events # - Double Click OnFileUploaded # - Check mark "Enable Execute Program" # - Program Path is /path/to/where/you/put/checker you did earlier # - For Paramaters put: %Dir # - Press OK! # # Conclusion # - I would recommend having your ftp client set a priority on sending sfv first but on a side # note even if you sent a few files first and then uploaded the sfv how this scans files apon upload # it will check the previous files you uploaded and add them to the cached files # # - Enjoy and let me know if you have troubles or like this! # my $home = "/usr/files"; my $sfiles = 0; my $tfiles = 0; # For creating empty missing/bad files sub touch { if ($#_ != 0) { return; } if ( -f $_[0] ) { return; } open tch, ">$_[0]"; close tch; } opendir(SFVCHK, ${home}.$ARGV[0]); my @SFVFIN = grep(/\.sfv/, readdir(SFVCHK)); closedir(SFVCHK); opendir(SFVCHK, ${home}.$ARGV[0]); my @CMPCHK = grep(/^\[.*COMPLETE\s\]$/, readdir(SFVCHK)); closedir(SFVCHK); # If there isn't a sfv or more than 1 just exit if (@SFVFIN != 1) { exit; } # Keep a hidden verified file to prevent double checking and system load my @CHECKED = (); if ( -e "${home}$ARGV[0]/.chk" ) { open CKSFV, "<${home}$ARGV[0]/.chk"; while () { chomp($_); push(@CHECKED, $_); } close CKSFV; } # Open file for appending anymore valid files we might come across open CKSFV, ">>${home}$ARGV[0]/.chk"; # Open the sfv and log the files that are suppose to be here # before we run the sfv checker to compare open SFVFD, "<${home}$ARGV[0]/$SFVFIN[0]"; while () { chomp($_); push(@LINES, $_); } close SFVFD; foreach my $deldir (@CMPCHK) { rmdir "${home}$ARGV[0]/$deldir"; } foreach my $line (@LINES) { chomp($line); if ($line =~ /^;/) { next; } my @SP = split(/ /, $line); my $rel = uc($SP[1]); $tfiles++; $rel =~ s/(\W)//g; # Make sure the crc string doesnt contain any control characters if ( -e "${home}$ARGV[0]/$SP[0]" ) { my $LFILE = $SP[0]; if (grep(/$LFILE/, @CHECKED)) { $sfiles++; next; } open(CRCK, "${home}$ARGV[0]/$SP[0]"); my $crc = crc32(*CRCK); close(CRCK); my $hex = sprintf "%x", $crc; $hex = uc($hex); if (length($hex) < 8) { $hex = "0".$hex; } if (length($rel) < 8) { $rel = "0".$rel; } if ($hex eq $rel) { if ( -e "${home}$ARGV[0]/$SP[0]-missing" ) { unlink("${home}$ARGV[0]/$SP[0]-missing"); } if ( -e "${home}$ARGV[0]/$SP[0]-bad" ) { unlink("${home}$ARGV[0]/$SP[0]-bad"); } print CKSFV "$LFILE\n"; $sfiles++; } else { if ( ! -e "${home}$ARGV[0]/$SP[0]-bad" ) { touch("${home}$ARGV[0]/$SP[0]-bad"); } } } else { if ( -e "${home}$ARGV[0]/$SP[0]-missing" ) { next; } touch("${home}$ARGV[0]/$SP[0]-missing"); } } close CKSFV; my $newdir = sprintf "[ %iF %iF FILES - 0.00%% COMPLETE ]", $sfiles, $tfiles; if ($sfiles != 0) { $newdir = sprintf "[ %iF of %iF - %.1f%% COMPLETE ]", $sfiles, $tfiles, (($sfiles / $tfiles) * 100); } if ($sfiles == $tfiles) { $newdir = "[ ${tfiles}F COMPLETE ]"; } mkdir "${home}$ARGV[0]/$newdir";