#!/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!
$