#!/usr/bin/perl -w #################################################################### # # automatic upload of modifed files. # #################################################################### $ftp_server = "ftp.servicios-dpi.com"; $ftp_dir = "/html"; # no backslash at the end! $ftp_uid = "servicios-dpi.com"; $ftp_pw = "sesamo"; #@src_dir = ("/cygdrive/f/myweb/dpi"); @src_dir = ("/myweb/dpi"); @wc_exclude = ("_vti",".mdb","\\bak","\\data","server.inc", ".txt",".tga",".log",".bat",".LOG"); #################################################################### #use strict; use File::Copy; use File::stat; use File::Find; use Net::FTP; #################################################################### $logfilename = removeFilename($0) . '_upload.log'; $log_cnt = 0; LOG(""); LOG(""); LOG("**************************"); LOG(""); $total_files = 0; $processed_files = 0; $skipped_files = 0; $start_date = timeString(time); LOG("connecting to ftp server..."); $ftp = Net::FTP->new($ftp_server) or die "unable to connect: $@\n"; $ftp->login($ftp_uid, $ftp_pw) or die "unable to login: $@\n"; $ftp->binary; LOG("connected!"); #scan files #my %lookup; find(\&processFiles, @src_dir); # report. #$span = calcDeltaSeconds($start_date,timeString(time)); LOG("finished. $total_files files, $processed_files uploaded, $skipped_files skipped."); $ftp->quit() or warn "unable to quit: $@\n"; closeLogfile(); #################################################################### sub processFiles { my $srcdir = fsToBs($File::Find::dir); my $srcpath = fsToBs($File::Find::name); my $base = fsToBs($File::Find::topdir); foreach my $exclude (@wc_exclude) { if ( index($srcpath, $exclude)>-1 ) { $File::Find::prune = 1 if -d $srcpath; return; } } # no DIRECT processing of directories. if ( -d $srcpath ) { return; } my $dstdir = $srcdir; my $dstpath = $srcpath; $dstdir =~ s{\Q$base\E}{$ftp_dir}is; $dstpath =~ s{\Q$base\E}{$ftp_dir}is; $dstdir = bsToFs($dstdir); $dstpath = bsToFs($dstpath); processFile($srcpath,$dstpath,$dstdir); } sub processFile { my ($src,$dst,$dstdir) = @_; $total_files++; LOG("processing file $total_files \"$src\"..."); # -------------------- # check time. my $need_upload = 0; $need_upload = IsModified( $src ); if ( $need_upload>0 ) { $processed_files++; LOG("uploading file \"$src\" to \"$dst\"..."); $ftp->mkdir($dstdir,1); $ftp->put($src, $dst) or die "unable to upload file \"$src\" to \"$dst\" (dst-dir: \"$dstdir\"): $@\n"; #if sucefully uploaded, the file is mark modified MarkModified($src); } else { print "$src skipped\n"; $skipped_files++; } } #################################################################### sub IsModified { my $file = shift @_; my $line; #print "$file modificado?\n"; ($line) = `attrib $file`; if ($line =~ s/^A//) { return 1; } return 0; } sub MarkModified { my $file = shift @_; my $line; $line = `attrib -A $file`; print "archive ok". $line . "\n"; } sub bsToFs { my ($s) = @_; $s =~ s/\\/\//gis; return $s; } sub fsToBs { my ($s) = @_; $s =~ s/\//\\/gis; return $s; } sub timeString { my ($tm) = @_; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($tm); return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec); } sub removeFilename { my ($s) = @_; my $pos = rindex($s,'\\'); return substr($s, 0, $pos); } # format: "2000-09-29 09:09:51". sub scanDate { my ($date) = @_; my ($year, $month, $day, $hour, $minute, $seconds); $year = substr($date, 0, 4); $month = substr($date, 5, 2); $day = substr($date, 8, 2); $hour = substr($date, 11, 2); $minute = substr($date, 14, 2); $seconds = substr($date, 17, 2); return ($year, $month, $day, $hour, $minute, $seconds); } #################################################################### sub LOG { my ($text) = @_; my $time = timeString time; # log to stdout. print "[$time] $text\n"; # log to logfile. my $LOG_STEP = 10; flushLogfile() if ($log_cnt % $LOG_STEP)==0 or $log_cnt==0; $log_cnt++; print HLOG "[$time] $text\r\n"; } sub openLogfile { closeLogfile(); open(HLOG,">>$logfilename") or die("No puedo loguear $logfilename nicht öffnen: $!"); }; sub closeLogfile { close HLOG if defined HLOG; } sub flushLogfile { closeLogfile(); openLogfile(); } ####################################################################