[LON-CAPA-cvs] cvs: loncom /lonnet/perl lonnet.pm
raeburn
lon-capa-cvs-allow@mail.lon-capa.org
Wed, 16 Apr 2008 22:59:37 -0000
raeburn Wed Apr 16 18:59:37 2008 EDT
Modified files:
/loncom/lonnet/perl lonnet.pm
Log:
&diskusage() modified to use lond::du2(), but to fallback to lond::du() if lond on himeserver side is running legacy LON-CAPA.
&dirlist() modified to use lond::du3() to get directory listings, but falls back to lond::ls2(), or even lond::ls() if homserver side is running legacy versions of LON-CAPA.
&GetFileTimestamp() modified to use new &dirlist(), and eliminate the assumption about the directory structure of the homeserver for the student.
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.954 loncom/lonnet/perl/lonnet.pm:1.955
--- loncom/lonnet/perl/lonnet.pm:1.954 Fri Apr 4 12:56:11 2008
+++ loncom/lonnet/perl/lonnet.pm Wed Apr 16 18:59:36 2008
@@ -1,7 +1,7 @@
# The LearningOnline Network
# TCP networking package
#
-# $Id: lonnet.pm,v 1.954 2008/04/04 16:56:11 raeburn Exp $
+# $Id: lonnet.pm,v 1.955 2008/04/16 22:59:36 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -5803,9 +5803,17 @@
# ------------------------------------------------------------ Disk usage
sub diskusage {
- my ($udom,$uname,$directoryRoot)=@_;
- $directoryRoot =~ s/\/$//;
- my $listing=&reply('du:'.$directoryRoot,homeserver($uname,$udom));
+ my ($udom,$uname,$directorypath,$getpropath)=@_;
+ $directorypath =~ s/\/$//;
+ my $listing=&reply('du2:'.&escape($directorypath).':'
+ .&escape($getpropath).':'.&escape($uname).':'
+ .&escape($udom),homeserver($uname,$udom));
+ if ($listing eq 'unknown_cmd') {
+ if ($getpropath) {
+ $directorypath = &propath($udom,$uname).'/'.$directorypath;
+ }
+ $listing = &reply('du:'.$directorypath,homeserver($uname,$udom));
+ }
return $listing;
}
@@ -6222,30 +6230,49 @@
# ------------------------------------------------------------ Directory lister
sub dirlist {
- my ($uri,$userdomain,$username,$alternateDirectoryRoot)=@_;
-
+ my ($uri,$userdomain,$username,$getpropath,$getuserdir,$alternateRoot)=@_;
$uri=~s/^\///;
$uri=~s/\/$//;
my ($udom, $uname);
- (undef,$udom,$uname)=split(/\//,$uri);
- if(defined($userdomain)) {
+ if ($getuserdir) {
$udom = $userdomain;
- }
- if(defined($username)) {
$uname = $username;
+ } else {
+ (undef,$udom,$uname)=split(/\//,$uri);
+ if(defined($userdomain)) {
+ $udom = $userdomain;
+ }
+ if(defined($username)) {
+ $uname = $username;
+ }
}
+ my ($dirRoot,$listing,@listing_results);
- my $dirRoot = $perlvar{'lonDocRoot'};
- if(defined($alternateDirectoryRoot)) {
- $dirRoot = $alternateDirectoryRoot;
+ $dirRoot = $perlvar{'lonDocRoot'};
+ if (defined($getpropath)) {
+ $dirRoot = &propath($udom,$uname);
$dirRoot =~ s/\/$//;
+ } elsif (defined($getuserdir)) {
+ my $subdir=$uname.'__';
+ $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
+ $dirRoot = $Apache::lonnet::perlvar{'lonUsersDir'}
+ ."/$udom/$subdir/$uname";
+ } elsif (defined($alternateRoot)) {
+ $dirRoot = $alternateRoot;
}
if($udom) {
if($uname) {
- my $listing = &reply('ls2:'.$dirRoot.'/'.$uri,
- &homeserver($uname,$udom));
- my @listing_results;
+ $listing = &reply('ls3:'.&escape('/'.$uri).':'.$getpropath.':'
+ .$getuserdir.':'.&escape($alternateRoot)
+ .':'.&escape($uname).':'.&escape($udom),
+ &homeserver($uname,$udom));
+ if ($listing eq 'unknown_cmd') {
+ $listing = &reply('ls2:'.$dirRoot.'/'.$uri,
+ &homeserver($uname,$udom));
+ } else {
+ @listing_results = map { &unescape($_); } split(/:/,$listing);
+ }
if ($listing eq 'unknown_cmd') {
$listing = &reply('ls:'.$dirRoot.'/'.$uri,
&homeserver($uname,$udom));
@@ -6254,13 +6281,18 @@
@listing_results = map { &unescape($_); } split(/:/,$listing);
}
return @listing_results;
- } elsif(!defined($alternateDirectoryRoot)) {
+ } elsif(!$alternateRoot) {
my %allusers;
my %servers = &get_servers($udom,'library');
- foreach my $tryserver (keys(%servers)) {
- my $listing = &reply('ls2:'.$perlvar{'lonDocRoot'}.'/res/'.
- $udom, $tryserver);
- my @listing_results;
+ foreach my $tryserver (keys(%servers)) {
+ $listing = &reply('ls3:'.&escape("/res/$udom").':::::'.
+ &escape($udom),$tryserver);
+ if ($listing eq 'unknown_cmd') {
+ $listing = &reply('ls2:'.$perlvar{'lonDocRoot'}.'/res/'.
+ $udom, $tryserver);
+ } else {
+ @listing_results = map { &unescape($_); } split(/:/,$listing);
+ }
if ($listing eq 'unknown_cmd') {
$listing = &reply('ls:'.$perlvar{'lonDocRoot'}.'/res/'.
$udom, $tryserver);
@@ -6287,13 +6319,13 @@
} else {
return ('missing user name');
}
- } elsif(!defined($alternateDirectoryRoot)) {
+ } elsif(!defined($getpropath)) {
my @all_domains = sort(&all_domains());
- foreach my $domain (@all_domains) {
- $domain = $perlvar{'lonDocRoot'}.'/res/'.$domain.'/&domain';
- }
- return @all_domains;
- } else {
+ foreach my $domain (@all_domains) {
+ $domain = $perlvar{'lonDocRoot'}.'/res/'.$domain.'/&domain';
+ }
+ return @all_domains;
+ } else {
return ('missing domain');
}
}
@@ -6303,23 +6335,13 @@
# when it was last modified. It will also return an error of -1
# if an error occurs
-##
-## FIXME: This subroutine assumes its caller knows something about the
-## directory structure of the home server for the student ($root).
-## Not a good assumption to make. Since this is for looking up files
-## in user directories, the full path should be constructed by lond, not
-## whatever machine we request data from.
-##
sub GetFileTimestamp {
- my ($studentDomain,$studentName,$filename,$root)=@_;
+ my ($studentDomain,$studentName,$filename,$getuserdir)=@_;
$studentDomain = &LONCAPA::clean_domain($studentDomain);
$studentName = &LONCAPA::clean_username($studentName);
- my $subdir=$studentName.'__';
- $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
- my $proname="$studentDomain/$subdir/$studentName";
- $proname .= '/'.$filename;
- my ($fileStat) = &Apache::lonnet::dirlist($proname, $studentDomain,
- $studentName, $root);
+ my ($fileStat) =
+ &Apache::lonnet::dirlist($filename,$studentDomain,$studentName,
+ undef,$getuserdir);
my @stats = split('&', $fileStat);
if($stats[0] ne 'empty' && $stats[0] ne 'no_such_dir') {
# @stats contains first the filename, then the stat output
@@ -6333,12 +6355,11 @@
my ($uri) = @_;
$uri = &clutter_with_no_wrapper($uri);
- my ($udom,$uname,$file,$dir);
+ my ($udom,$uname,$file);
if ($uri =~ m-^/(uploaded|editupload)/-) {
($udom,$uname,$file) =
($uri =~ m-/(?:uploaded|editupload)/?($match_domain)/?($match_name)/?(.*)-);
$file = 'userfiles/'.$file;
- $dir = &propath($udom,$uname);
}
if ($uri =~ m-^/res/-) {
($udom,$uname) =
@@ -6351,7 +6372,8 @@
return ();
}
- my ($result) = &dirlist($file,$udom,$uname,$dir);
+ my $getpropath = 1;
+ my ($result) = &dirlist($file,$udom,$uname,$getpropath);
my @stats = split('&', $result);
if($stats[0] ne 'empty' && $stats[0] ne 'no_such_dir') {
@@ -8104,8 +8126,7 @@
my @ids=¤t_machine_ids();
foreach my $id (@ids) { if ($id eq $home) { $is_me=1; } }
if ($is_me) {
- $location=&propath($udom,$uname).
- '/userfiles/'.$filename;
+ $location=&propath($udom,$uname).'/userfiles/'.$filename;
} else {
$location=$Apache::lonnet::perlvar{'lonDocRoot'}.'/userfiles/'.
$udom.'/'.$uname.'/'.$filename;