原始的DAVスクリプト caveman.pl

「脱・ノーチラス宣言」へ


コード全文


#!/usr/bin/perl

use HTTP::DAV;

my $d;
my $url="http://serveraddress/unixshare";
my $dir;
my $workdir;

print("start directory?:");

$startdir=<STDIN>;
chomp $startdir;

if ($startdir eq "."){ #ドットの入力でホームディレクトリ
$dir="/export/home/noniko";
}

elsif($startdir =~ /^\//){ #絶対パスで指定

$dir=$fd;

}

else{

$dir="/export/home/noniko/".$startdir; #ホームディレクトリからの相対パス
}

print ("current path:".$dir."\n");
print ("\n");
cdlocal(); #スタート地点のファイルリスト

for(;;){

print(">");

$word=<STDIN>;
chomp $word;

if($word eq "exit"){
print("bye!\n");
exit;
}

@words=split(/\s/,$word);
$com=$words[0];
$fd=$words[1];


if ($com eq "cd"){

if($fd =~ /^\//){
$dir=$fd;
}

elsif($fd eq ".."){

my $predir;
my @comps=split(/\//,$dir);
$length=@comps;

for($i=0; $i<$length-2; $i++){
$predir .= $comps[$i]."/";
}
$dir=$predir.$comps[$length-2];

if($dir eq ""){
$dir="/";
}

}

else{
$dir=$dir."/".$fd;
}



if(-d $dir){
print ("current path:".$dir."\n");
print ("\n");
cdlocal();
}
else{

if(-f $dir){

print($dir." is a file.\n");
}

else{
print($dir.": Not found.\n");

}
}

}

elsif($com eq "local"){

print ("current path:".$dir."\n");
print ("\n");
cdlocal();

}

elsif($com eq "put"){

if($fd =~ /^\//){

print("Input relative path name.");
#さすがにここでは絶対パスでの入力はやめよう。わけわかんなくなる。

}

else{

$localrootdir=$dir."/".$fd; #ここで絶対パスにする。
$remotetarget=$url.$workdir;

print ("Local directory:".$localrootdir."\n");
print ("Remote target:".$remotetarget."\n");

$d= new HTTP::DAV;
$d->open(-url=>$remotetarget);
my $oldremote=$d->propfind($fd);
if($oldremote){
print("Overwrite ".$fd."? [y/n]");
$overwrite=<STDIN>;
chomp $overwrite;
if($overwrite eq "y"){
$deletetarget=$remotetarget."/".$fd;
print "deleting ".$deletetarget;

$d->delete(-url=>$deletetarget, -callback=>\&cb);
$d->put(-local=>$localrootdir, -url=>$remotetarget,-callback=>\&cb);
}
}
else{
#リソースがまだない場合は何の躊躇もなくput命令
$d->put(-local=>$localrootdir, -url=>$remotetarget,-callback=>\&cb);
}

}
}

elsif($com eq "open"){

if($fd eq ".."){

my $predir2;
my @comps2=split(/\//,$workdir);
$length2=@comps2;

for($i2=0; $i2<$length2-1; $i2++){
$predir2.= "/".$comps2[$i2];
}

$workdir=$predir2;

}

else{

$workdir.="/".$fd;

}

$d= new HTTP::DAV;
$d->open(-url=>$url.$workdir);
my $resource=$d->propfind(@_);

if ($resource) {

if ($resource->is_collection) {
$rp=$resource->get_property('short_ls');
@rps=split(/\n/,$rp);
$count=0;
foreach(@rps){
if(/^\s+/){
$_=$';
}
if($count>0){  #0行目だけは空白で切らない
/\s+/;
$_=$`;
}
print $_."\n";
$count++; #あとのcountは意味ないんだけど・・・
}
} else {

print($fd." is not a directory.");
}

}
else{
print("Connection error.");
}
}

elsif( $com eq "get"){

if($fd =~ /^\//){ 

print("Input relative path name.");

}

else{

$localrootdir=$dir;
$remotetarget=$url.$workdir."/".$fd;

print ("Local directory:".$localrootdir."\n");
print ("Remote target:".$remotetarget."\n");

$d= new HTTP::DAV;
$d->open(-url=>$url.$workdir);

$oldlocal=$localrootdir."/".$fd;


if(-e $oldlocal){

print("Overwrite ".$fd."?");
$overwrite=<STDIN>;
chomp $overwrite;

if($overwrite eq "y"){

print "deleting ".$oldlocal."\n";

if(-d $oldlocal){
$done=`rm -r $oldlocal`;
}
elsif(-f $oldlocal){
unlink($oldlocal);
}
$d->get(-url=>$remotetarget, -to=>$localrootdir, -callback=>\&cb);

}
}
else{
$d->get(-url=>$remotetarget, -to=>$localrootdir, -callback=>\&cb);
}
}

}

}


###Subrouties###

sub cdlocal{

my @cdfil;
my @cddir;

opendir (DIR,$dir);

while ($fname=readdir(DIR)){


if ($fname ne "." && $fname ne ".."){

$rname=$dir."/".$fname;

if(-d $rname){

@cddir=(@cddir,$fname);


}
else {
@cdfil=(@cdfil,$fname);
}

}
}

closedir(DIR);

foreach(@cddir){
print($_."/\n");
}

foreach(@cdfil){
print($_."\n");
}

}

sub cb はヒトの書いたスクリプトまる写しだから転載は控えます。
PerlDAV付属のスクリプトdaveを見てねん。


やりとりの例


$ perl caveman.pl

start directory?:pdav 相対パスで指定する
current path:/export/home/noniko/pdav 念のため絶対パスで確認

folderone/ ファイルリスト
gettest/
old/
putdir2.pl
resourcedoc.txt
httpdavdoc.txt
davedoc.txt
dave
caveman.pl

>cd folderone 一つ下に降りる
current path:/export/home/noniko/pdav/folderone

foldertwo/
folderthree/
textone.txt

>cd foldertwo もう一つ下に降りる
current path:/export/home/noniko/pdav/folderone/foldertwo

textwo.txt
textthree.txt

>cd .. ひとつ上に上がる
current path:/export/home/noniko/pdav/folderone

foldertwo/
folderthree/
textone.txt

>cd .. もうひとつ上に上がって、無事元に戻る
current path:/export/home/noniko/pdav

folderone/
gettest/
old/
putdir2.pl
resourcedoc.txt
httpdavdoc.txt
davedoc.txt
dave
caveman.pl

>open noniko リモートのサブディレクトリnonikoフォルダをいきなり開く
Listing of http://serveraddress/unixshare/noniko/
./
.DS_Store
1007received/
Mail/
Makefile
Network
TheFindByContentFolder/
TheVolumeSettingsFolder/
・・・・・

>open .. ひとつ上に上がる
Listing of http://serveraddress/unixshare/
./
.DS_Store
davtest/
noniko/
share/
usako/

>open davtest 別のサブディレクトリに行く
Listing of http://serveraddress/unixshare/davtest/

>put folderone ローカルディレクトリfolderoneをプットしよう。サーバからの応答は省略〜。
Local directory:/export/home/noniko/pdav/folderone ローカルとリモートの確認
Remote target:http://serveraddress/unixshare//davtest  なぜかスラッシュが余計についてくる〜。

>local ところで今どこにいるんだっけ
current path:/export/home/noniko/pdav

folderone/
gettest/
old/
putdir2.pl
resourcedoc.txt
httpdavdoc.txt
davedoc.txt
dave
caveman.pl

>cd gettest ローカルのディレクトリをひとつ下に降りる
current path:/export/home/noniko/pdav/gettest

>open リモートはどこまで指定したんだっけ
Listing of http://serveraddress/unixshare/davtest/
./
folderone/ さっきプットしたfolderoneがちゃんとある

>get folderone そいつをローカルの別のディレクトリにもう一度読み込む
Local directory:/export/home/noniko/pdav/gettest
Remote target:http://serveraddress/unixshare//davtest//folderone
MKDIR /export/home/noniko/pdav/gettest/folderone (before escape)
mkdir /export/home/noniko/pdav/gettest/folderone (success)
Transferring http://serveraddress/unixshare/davtest/folderone/textone.txt (30
bytes):
[############################################################] 30 bytes
get http://serveraddress/unixshare/davtest/folderone/textone.txt (success)
MKDIR /export/home/noniko/pdav/gettest/folderone/foldertwo (before escape)
mkdir /export/home/noniko/pdav/gettest/folderone/foldertwo (success)
Transferring http://serveraddress/unixshare/davtest/folderone/foldertwo/textwo
.txt (30 bytes):
[############################################################] 30 bytes
get http://serveraddress/unixshare/davtest/folderone/foldertwo/textwo.txt (suc
cess)
Transferring http://serveraddress/unixshare/davtest/folderone/foldertwo/textth
ree.txt (31 bytes):
[############################################################] 31 bytes
get http://serveraddress/unixshare/davtest/folderone/foldertwo/textthree.txt (
success)
MKDIR /export/home/noniko/pdav/gettest/folderone/folderthree (before escape)
mkdir /export/home/noniko/pdav/gettest/folderone/folderthree (success)
Transferring http://serveraddress/unixshare/davtest/folderone/folderthree/text
four.txt (32 bytes):
[############################################################] 32 bytes
get http://serveraddress/unixshare/davtest/folderone/folderthree/textfour.txt
(success)
・・・以下ここは略。

>get folderone //もいっかいやってみよう
Local directory:/export/home/noniko/pdav
Remote target:http://serveraddress/unixshare/davtest/folderone
Overwrite folderone? y

これで上書きコピーしてくれる。

>exit 抜ける
bye!
$