#!/usr/local/dist/bin/perl -w ###################################################################### ### ### IMPORTANT! ### Please read the warranty and legal notice ### at the end of this file! ### ###################################################################### require 5.000; use lib '/usr/local/bin',"$ENV{HOME}/bin",'/usr/stud/loescher/bin'; use lib 'd:/bin','c:/mydos','c:/bin'; use slutil; use English; ###################################################################### ### Voreinstellungen ###################################################################### $version = '0.3'; $appname = 'AutoFTPGet'; $logfilename = "$ENV{HOME}/$appname.log"; ###################################################################### ### Hauptprogramm ###################################################################### &Hilfe if ($#ARGV<2); printumlaute Kopf(); die "Kann 'ftp' nicht finden!\n" unless which('ftp'); # Die Eingaben: $host = $ARGV[0]; $path = $ARGV[1]; KillSlashAtEnd($path); $path .= $slash; $file = $ARGV[2]; # Log-File öffnen open (LogFile, ">>$logfilename") || die "Kann Logfile nicht schreiben!\n"; select(LogFile); $|=1; select(STDOUT); # LOG-File nicht puffern $datum = date."\n"; print LogFile "\nStart von $appname (PID: $$) um $datum"; print LogFile "Mit folgenden Parametern: \L$appname\E @ARGV\n"; # Signal-Handler sub catch_signal { my $signame = shift; $datum = date."\n"; print LogFile "Ende von $appname wegen Signal SIG$signame um $datum"; exit; } $SIG{HUP} = \&catch_signal; #1 : Hangup detected on controlling terminal or death of controlling process $SIG{INT} = \&catch_signal; #2 : Interrupt from keyboard $SIG{QUIT} = \&catch_signal; #3 : Quit from keyboard $SIG{ABRT} = \&catch_signal; #6 : Abort signal from abort(3) $SIG{KILL} = \&catch_signal; #9 : Kill signal $SIG{TERM} = \&catch_signal; #15: Termination signal # Filegröße feststellen (mit ftp und Kommando SIZE) # Existiert ein ~/.netrc? if (-e "$ENV{HOME}/.netrc") { @input = ("open $host\n", "binary\n", "size $path$file\n", "quit\n" ); } else { printumlaute 'Bitte erstellen ein File ~/.netrc für anonymous ', "Login.\nInformationen siehe: Anleitung zu 'ftp'.\n", "Beipsiel: default login anonymous password loescher\@gmx.de\n\n"; exit; } open (FTP, "echo '@input' | ftp -v |"); @result = ; @return213 = grep(/^213/, @result); $remoteSize = $return213[0]; $remoteSize =~ s/^213\D+(\d+)/$1/; if ( -e $file ) { $localSize = (stat($file))[7]; } else { $localSize = 0; } print LogFile "Erstmaliger FTP-Start:\n"; if ( $localSize == $remoteSize ) { print LogFile "Das File ist schon im voller Laenge vorhanden. Abbruch.\n"; } while ($localSize < $remoteSize) { print LogFile "Datei: $file, Lokal: $localSize, Remote: $remoteSize\n"; $datum = date."\n"; print LogFile "FTP gestartet um $datum"; # Mit ncftp: system ("ncftp -C $host:$path$file"); # Ohne ncftp: $getkommando = ( (-e $file) ? "reget" : "get"); print $getkommando."\n"; @input = ("open $host\n", "binary\n", "$getkommando $path$file $file\n", "quit\n" ); system("echo '@input' | ftp"); $datum = date."\n"; print LogFile "FTP beendet um $datum"; if ( -e $file ) { $localSize = (stat($file))[7]; } else { $localSize = 0; } } ###################################################################### ### Unterprogramme ###################################################################### sub Kopf { my $head = "$appname $version - von Stephan Löscher"; return "\n$head\n" . '~' x length($head) . "\n"; } sub Hilfe { printumlaute Kopf(). "Syntax: autoftpget host path file Es wird eine Datei per FTP transferiert und bei Abbrüchen per REGET erneut versucht bis die Datei komplett empfangen ist. Beispiel: autoftpget ftp.leo.org /pub/comp/platforms/ index.txt Alle Aktivitäten werden in ~/AutoFTPGet.log protokolliert. "; exit; } ###################################################################### # # Warranty and legal notice # ~~~~~~~~~~~~~~~~~~~~~~~~~ # # Copyright (c) 1997 by Stephan Löscher - all rights reserved # My Address: Stephan Löscher, Dr.Troll-str. 3, 82194 Gröbenzell, Germany # Email: loescher@gmx.de # WWW: http://www.loescher-online.de/ # # This program is freeware. # It is NOT Public-Domain-Software! # The author (Stephan Löscher) does NOT give up his copyright, but he # reserves his copyright. Usage and copying is free of charge for private # use, but NOT for commercial use! # # You may and should copy this program free of charge, use it, # give it to your friends, upload it to a BBS or something similar, under # the following conditions: # * Don't charge any money for it. If you upload it to a BBS, make sure that # it can be downloaded free (without paying for downloading it, except # for usage fees that have to be paid anyway). Small copying fees (up to # 5 DM or 3 $US) may be charged. # * Only distribute the whole original package, with all the files included. # * This program may not be part of any commercial product or service without # the written permission by the author. # * If you want to include this program on a CD-ROM and/or book, please send # me a free copy of the CD/book (this is not a must, but I would appreciate # it very much). # # Distribution of the program is explicitly desired, provided that the above # conditions are accepted. # # YOU ARE USING THIS PROGRAM AT YOUR OWN RISK! THE AUTHOR (STEPHAN LÖSCHER) # IS NOT LIABLE FOR ANY DAMAGE OR DATA-LOSS CAUSED BY THE USE OF THIS PROGRAM # OR BY THE INABILITY TO USE THIS PROGRAM. IF YOU ARE NOT SURE ABOUT THIS, OR # IF YOU DON'T ACCEPT THIS, THEN DO NOT USE THIS PROGRAM! # BECAUSE OF THE VARIOUS HARDWARE AND SOFTWARE ENVIRONMENTS INTO WHICH THIS # PROGRAM MAY BE PUT, NO WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE IS # OFFERED. # GOOD DATA PROCESSING PROCEDURE DICTATES THAT ANY PROGRAM BE THOROUGHLY # TESTED WITH NON-CRITICAL DATA BEFORE RELYING ON IT. # # No part of the documentation may be reproduced, transmitted, transcribed, # stored in any retrieval system, or translated into any other language in # whole or in part, in any form or by any means, whether it be electronic, # mechanical, magnetic, optical, manual or otherwise, without prior written # consent of the author, Stephan Löscher. # # You may not make any changes or modifications to this software or this # manual. You may not decompile, disassemble, or otherwise reverse-engineer # the software in any way. # If you got the source, then you are permitted to modify it if you # contact me and tell me your enhancements. # You also may include the source as a whole or parts of it into other # programs, as long as you don't make profit directly out of selling # the result. If you re-use code of this program then do not remove my name! # If you include this source-code in your projects, mark it clearly as such # "... derived from code XXX by Stephan Löscher". # But don't distribute modified code! # # If you believe your copy of this software has been tampered or altered in # anyway, shape or form, please contact me immediately! Do not hesitate a # moment to inform me. Remember, this software should be available to all, in # the original form, so please do not accept modified or damaged versions of # my software. # # The author reserves his right for taking legal steps if the copyright or the # license agreement is violated. # # All product names mentioned in this software are trademarks or registered # trademarks of their respective owners. # # If you have any questions, ideas, suggestions for improvements or if you find # bugs (I don't hope so.) then feel free to contact me. (Email is appreciated.) # # I'm not a native english speaker. If you are one and discover some strange # sounding parts in this documentation or in the program, please, feel free # to point it out to me and give me suggestions for alteration! # # If the program works for you, and you want to honour my efforts, you are # invited to donate as much as you want... :) # # In any case, if you don't like the restrictions in this license, contact # me, and we can work something out. # ######################################################################