version 1.77, 2007/07/25 23:17:43
|
version 1.81, 2013/08/22 09:30:21
|
Line 74 use IO::File;
|
Line 74 use IO::File;
|
use HTML::TokeParser; |
use HTML::TokeParser; |
use GDBM_File; |
use GDBM_File; |
use POSIX qw(strftime mktime); |
use POSIX qw(strftime mktime); |
|
use Mail::Send; |
|
use Apache::loncommon(); |
|
|
use Apache::lonnet(); |
use Apache::lonnet(); |
|
|
Line 123 my %oldnames = (
|
Line 125 my %oldnames = (
|
'portfolio' => 'portfolio_metadata', |
'portfolio' => 'portfolio_metadata', |
'access' => 'portfolio_access', |
'access' => 'portfolio_access', |
'addedfields' => 'portfolio_addedfields', |
'addedfields' => 'portfolio_addedfields', |
'allusers' => 'allusers', |
'allusers' => 'allusers', |
); |
); |
|
|
my %newnames; |
my %newnames; |
Line 135 foreach my $key (keys(%oldnames)) {
|
Line 137 foreach my $key (keys(%oldnames)) {
|
# |
# |
# Only run if machine is a library server |
# Only run if machine is a library server |
exit if ($Apache::lonnet::perlvar{'lonRole'} ne 'library'); |
exit if ($Apache::lonnet::perlvar{'lonRole'} ne 'library'); |
|
my $hostid = $Apache::lonnet::perlvar{'lonHostID'}; |
|
|
# |
# |
# Make sure this process is running from user=www |
# Make sure this process is running from user=www |
my $wwwid=getpwnam('www'); |
my $wwwid=getpwnam('www'); |
Line 207 foreach my $dom (@domains) {
|
Line 211 foreach my $dom (@domains) {
|
if ($oneuser) { |
if ($oneuser) { |
@homeusers=($oneuser); |
@homeusers=($oneuser); |
} |
} |
|
|
# |
# |
# Loop through the users |
# Loop through the users |
foreach my $user (@homeusers) { |
foreach my $user (@homeusers) { |
Line 223 foreach my $dom (@domains) {
|
Line 228 foreach my $dom (@domains) {
|
}, join('/',($Apache::lonnet::perlvar{'lonDocRoot'},'res',$dom,$user)) ); |
}, join('/',($Apache::lonnet::perlvar{'lonDocRoot'},'res',$dom,$user)) ); |
} |
} |
# Search for all users and public portfolio files |
# Search for all users and public portfolio files |
my (%allusers,%portusers); |
my (%allusers,%portusers,%courses); |
if ($oneuser) { |
if ($oneuser) { |
%portusers = ( |
%portusers = ( |
$oneuser => '', |
$oneuser => '', |
Line 231 foreach my $dom (@domains) {
|
Line 236 foreach my $dom (@domains) {
|
%allusers = ( |
%allusers = ( |
$oneuser => '', |
$oneuser => '', |
); |
); |
|
%courses = &courseiddump($dom,'.',1,'.','.',$oneuser,undef, |
|
undef,'.'); |
} else { |
} else { |
|
# get courseIDs for domain on current machine |
|
%courses=&Apache::lonnet::courseiddump($dom,'.',1,'.','.','.',1,[$hostid],'.'); |
my $dir = $Apache::lonnet::perlvar{lonUsersDir}.'/'.$dom; |
my $dir = $Apache::lonnet::perlvar{lonUsersDir}.'/'.$dom; |
&descend_tree($dom,$dir,0,\%portusers,\%allusers); |
&descend_tree($dom,$dir,0,\%portusers,\%allusers); |
} |
} |
foreach my $uname (keys(%portusers)) { |
foreach my $uname (keys(%portusers)) { |
my $urlstart = '/uploaded/'.$dom.'/'.$uname; |
my $urlstart = '/uploaded/'.$dom.'/'.$uname; |
my $pathstart = &propath($dom,$uname).'/userfiles'; |
my $pathstart = &propath($dom,$uname).'/userfiles'; |
my $is_course = &Apache::lonnet::is_course($dom,$uname); |
my $is_course = ''; |
|
if (exists($courses{$dom.'_'.$uname})) { |
|
$is_course = 1; |
|
} |
my $curr_perm = &Apache::lonnet::get_portfile_permissions($dom,$uname); |
my $curr_perm = &Apache::lonnet::get_portfile_permissions($dom,$uname); |
my %access = &Apache::lonnet::get_access_controls($curr_perm); |
my %access = &Apache::lonnet::get_access_controls($curr_perm); |
foreach my $file (keys(%access)) { |
foreach my $file (keys(%access)) { |
Line 261 foreach my $dom (@domains) {
|
Line 273 foreach my $dom (@domains) {
|
&portfolio_logging(%portmetalog); |
&portfolio_logging(%portmetalog); |
} |
} |
} |
} |
|
my (%names_by_id,,%ids_by_name,%idstodelete,%idstoadd,%duplicates); |
|
unless ($simulate || $oneuser) { |
|
my $idshashref; |
|
$idshashref = &tie_domain_hash($dom, "ids", &GDBM_WRCREAT()); |
|
if (ref($idshashref) eq 'HASH') { |
|
%names_by_id = %{$idshashref}; |
|
while (my ($id,$uname) = each(%{$idshashref}) ) { |
|
$id = &unescape($id); |
|
$uname = &unescape($uname); |
|
$names_by_id{$id} = $uname; |
|
push(@{$ids_by_name{$uname}},$id); |
|
} |
|
&untie_domain_hash($idshashref); |
|
} |
|
} |
# Update allusers |
# Update allusers |
foreach my $uname (keys(%allusers)) { |
foreach my $uname (keys(%allusers)) { |
|
next if (exists($courses{$dom.'_'.$uname})); |
my %userdata = |
my %userdata = |
&Apache::lonnet::get('environment',['firstname','lastname', |
&Apache::lonnet::get('environment',['firstname','lastname', |
'middlename','generation','id','permanentemail'],$dom,$uname); |
'middlename','generation','id','permanentemail'],$dom,$uname); |
|
unless ($simulate || $oneuser) { |
|
my $addid; |
|
if ($userdata{'id'} ne '') { |
|
$addid = $userdata{'id'}; |
|
$addid=~tr/A-Z/a-z/; |
|
} |
|
if (exists($ids_by_name{$uname})) { |
|
if (ref($ids_by_name{$uname}) eq 'ARRAY') { |
|
if (scalar(@{$ids_by_name{$uname}}) > 1) { |
|
&log(0,"Multiple employee/student IDs found in ids.db for $uname:$dom -- ".join(', ',@{$ids_by_name{$uname}})); |
|
} |
|
foreach my $id (@{$ids_by_name{$uname}}) { |
|
if ($id eq $userdata{'id'}) { |
|
undef($addid); |
|
} else { |
|
$idstodelete{$id} = $uname; |
|
} |
|
} |
|
} |
|
} |
|
if ($addid ne '') { |
|
if (exists($idstoadd{$addid})) { |
|
push(@{$duplicates{$addid}},$uname); |
|
} else { |
|
$idstoadd{$addid} = $uname; |
|
} |
|
} |
|
} |
|
|
$userdata{'username'} = $uname; |
$userdata{'username'} = $uname; |
$userdata{'domain'} = $dom; |
$userdata{'domain'} = $dom; |
my %alluserslog = |
my %alluserslog = |
Line 275 foreach my $dom (@domains) {
|
Line 332 foreach my $dom (@domains) {
|
&log(0,$alluserslog{$item}); |
&log(0,$alluserslog{$item}); |
} |
} |
} |
} |
|
unless ($simulate || $oneuser) { |
|
if (keys(%idstodelete) > 0) { |
|
my %resulthash = &Apache::lonnet::iddel($dom,\%idstodelete,$hostid); |
|
if ($resulthash{$hostid} eq 'ok') { |
|
foreach my $id (sort(keys(%idstodelete))) { |
|
&log(0,"Record deleted from ids.db for $dom -- $id => ".$idstodelete{$id}); |
|
} |
|
} else { |
|
&log(0,"Error: '$resulthash{$hostid}' occurred when attempting to delete records from ids.db for $dom"); |
|
} |
|
} |
|
if (keys(%idstoadd) > 0) { |
|
my $idmessage = ''; |
|
my %newids; |
|
foreach my $addid (sort(keys(%idstoadd))) { |
|
if ((exists($names_by_id{$addid})) && ($names_by_id{$addid} ne $idstoadd{$addid}) && !($idstodelete{$addid})) { |
|
&log(0,"Two usernames associated with a single ID $addid in domain: $dom: $names_by_id{$addid} (current) and $idstoadd{$addid}\n"); |
|
$idmessage .= "$addid,$names_by_id{$addid},$idstoadd{$addid}\n"; |
|
} else { |
|
$newids{$addid} = $idstoadd{$addid}; |
|
} |
|
} |
|
if (keys(%newids) > 0) { |
|
my $putresult = &Apache::lonnet::put_dom('ids',\%idstoadd,$dom,$hostid); |
|
if ($putresult eq 'ok') { |
|
foreach my $id (sort(keys(%idstoadd))) { |
|
&log(0,"Record added to ids.db for $dom -- $id => ".$idstoadd{$id}); |
|
} |
|
} else { |
|
&log(0,"Error: '$putresult' occurred when attempting to add records to ids.db for $dom"); |
|
} |
|
} |
|
if ($idmessage) { |
|
my $to = &Apache::loncommon::build_recipient_list(undef,'idconflictsmail',$dom); |
|
if ($to ne '') { |
|
my $msg = new Mail::Send; |
|
$msg->to($to); |
|
$msg->subject('LON-CAPA studentIDs conflict'); |
|
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
|
my $hostname = &Apache::lonnet::hostname($lonhost); |
|
my $replytoaddress = 'do-not-reply@'.$hostname; |
|
$msg->add('Reply-to',$replytoaddress); |
|
$msg->add('From',"www@$hostname"); |
|
$msg->add('Content-type','text/plain; charset=UTF-8'); |
|
if (my $fh = $msg->open()) { |
|
print $fh |
|
'The following IDs are used for more than one user in your domain:'."\n". |
|
'Each row contains: Student/Employee ID, Current username in ids.db file, '. |
|
'Additional username'."\n\n". |
|
$idmessage; |
|
$fh->close; |
|
} |
|
} |
|
} |
|
} |
|
if (keys(%duplicates) > 0) { |
|
foreach my $id (sort(keys(%duplicates))) { |
|
&log(0,"Duplicate IDs found for entries to add to ids.db in $dom -- $id => $idstodelete{$id}"); |
|
} |
|
} |
|
} |
} |
} |
|
|
# |
# |
Line 346 sub descend_tree {
|
Line 464 sub descend_tree {
|
&descend_tree($dom,$dir.'/'.$item,$depth,$allportusers,$alldomusers); |
&descend_tree($dom,$dir.'/'.$item,$depth,$allportusers,$alldomusers); |
} else { |
} else { |
if (-e $dir.'/'.$item.'/file_permissions.db') { |
if (-e $dir.'/'.$item.'/file_permissions.db') { |
$$allportusers{$item} = ''; |
$$allportusers{$item} = ''; |
} |
} |
if (!&Apache::lonnet::is_course($dom,$item)) { |
if (-e $dir.'/'.$item.'/passwd') { |
$$alldomusers{$item} = ''; |
$$alldomusers{$item} = ''; |
} |
} |
} |
} |