#!/usr/bin/perl #[SJISGet] Shift-JISで書かれたパス・ファイル名対応のftp getコマンドチックなもの。 #Ver.0.01 .. 初版。 #Ver.0.1 ... レジュームできるようにしてみる。-rn (Resume Noの意)を付ければレジュームしない。 $VERSION = "0.1"; $VERDATE = "2001/5/23"; use Jcode; ### コマンドライン解析 if ($ARGV[0] eq '') { &disp_usage; exit; } foreach $argstr (@ARGV){ $_ = $argstr; chkarg: { /^-u:(.*)/ && do {$username = $1; last chkarg; }; /^-p:(.*)/ && do {$password = $1; last chkarg; }; /^-r(.*)/ && do {$resumemode = $1; last chkarg; }; $url = $_; } } ### 各種チェック if ($url eq '') { print "Require download file URL.\n"; &disp_usage; exit; } if ( !($url =~ m|^ftp://|) ) { print "Illegal ftp URL.\n"; exit; } ### レジュームモード設定 if ($resumemode =~ /^n/){ $resumemode = 0; } else { $resumemode = 1; } ### URL解釈 ($host, $path) = &parse_url ($url); ($directory, $filename) = &parse_path ($path); ### メインルーチン $sjis_directory = jcode($directory)->sjis; $sjis_filename = jcode($filename)->sjis; use Net::FTP; &logwrite ("Connect to host '$host'..."); ($ftp = Net::FTP->new($host, debug => 0)) || &dielog ("Can't connect to host '$host'."); &logwrite ("Login by username '$username'..."); $ftp->login($username, $password) || &dielog ("Can't login by username '$username'."); &logwrite ("Change work directory to '$directory'..."); $ftp->cwd($sjis_directory) || &dielog ("Can't change directory to '$directory'."); &logwrite ("Set transfer mode to binary..."); $ftp->binary() || &dielog ("Can't Set transfer mode to binary."); #ありえるのかな? if (-f $filename && $resumemode){ $filesize = -s $filename; &logwrite ("'$filename' is already exist! Try resume download from $filesize bytes."); &logwrite ("START Transfer '$filename'."); $ftp->get($sjis_filename, $filename, $filesize) || &dielog ("Can't get file '$filename' (by resume download)."); &logwrite ("END Transfer '$filename'."); } else { &logwrite ("START Transfer '$filename'."); $ftp->get($sjis_filename, $filename) || &dielog ("Can't get file '$filename'."); &logwrite ("END Transfer '$filename'."); } &logwrite ("Quit from '$host'..."); $ftp->quit || &dielog ("Quit error!"); &logwrite ("Quit successful."); &logwrite ("The file transfer was successful."); exit; sub logwrite { $logstr = $_[0]; local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); local($logline) = sprintf ("%4d/%02d/%02d %02d:%02d:%02d - %s\n", $year+1900, $mon+1, $mday, $hour,$min, $sec, $logstr); print $logline; } sub dielog { &logwrite ($_[0]); exit(); } sub disp_usage { print <<__END__; Usage: sjisget [-u:] [-p:] [-r] [Get URL] __END__ } #ここから Qz...?氏(qz@ca.sakura.ne.jp)作 # http://www.ca.sakura.ne.jp/~qz/perl-script-junk/body/body_cgi.txtより抜粋・変更。 # フリーソフト。改造・再配布自由、許可不要。との事で有り難く使わせて頂きます。 #URLをHOSTとPATHに分解 sub parse_url { if($_[0] =~ m|^ftp://([-_\.a-zA-Z0-9']+)/?(.*)$|){ $1, "/$2"; }else{ undef; } } #pathとfileに分解 sub parse_path { return $_[0] if($_[0] =~ m!/$!); $_[0] =~ m!(.*/)([^/]*)$!; $1, $2; }