/ /home/httpd/lonUsers use strict; use File::Find; use lib '/home/httpd/lib/perl/'; use LONCAPA::Configuration; use LONCAPA; use GDBM_File; use Storable; use Apache::lonnet; $|=1; sub update_value { my ($value) = @_; if ($value =~ /@/ && $value !~ /:/) { $value =~ tr/@/:/; } return $value; } my $updated=0; my %dirs; my $last; my $total; sub process_gradingqueue_file { my $which = (split('/',$_))[5]; $dirs{$which} = 1; my $count2 = length("$last"); my $count = length("$updated"); my $backup = "\b"x(8+$count2+14+$count+6); if (scalar(keys(%dirs)) > $last) { $last = scalar(keys(%dirs)); print($backup."Updated $last directories, $updated files"); } return if ($_!~m/(gradingqueue|reviewqueue|slots|slot_reservations)\.db$/); my $type='queue'; if ($1 eq 'slots') { $type = 'slots'; } elsif ($1 eq 'slot_reservations') { $type = 'reservation'; } my $count2 = length("$last"); my $count = length("$updated"); my $backup = "\b"x(8+$count2+14+$count+6); $updated++; print($backup."Updated $last directories, $updated files"); my $db = &LONCAPA::locking_hash_tie($_,&GDBM_WRCREAT()); if ($type eq 'queue') { foreach my $key (keys(%{$db})) { my $real_key = &unescape($key); my (@elements) = split("\0",$real_key); if (exists($elements[2])) { $elements[2] = &update_value($elements[2]); } $real_key = join("\0",@elements); my $new_key = &escape($real_key); if ($new_key ne $key) { $db->{$new_key} = $db->{$key}; delete($db->{$key}); } if ($new_key =~ /locked$/) { my $value = $db->{$new_key}; my $new_value = &unescape($value); $new_value = &update_value($new_value); $db->{$new_key} = &escape($new_value); } } } elsif ($type eq 'slots') { foreach my $key (keys(%{$db})) { my $value = $db->{$key}; $value = &Apache::lonnet::thaw_unescape($value); if (exists($value->{'proctor'})) { $value->{'proctor'} = &update_value($value->{'proctor'}); } if (exists($value->{'allowedusers'})) { $value->{'allowedusers'} = &update_value($value->{'allowedusers'}); } $db->{$key} = &Apache::lonnet::freeze_escape($value); } } elsif ($type eq 'reservation') { foreach my $key (keys(%{$db})) { my $value = $db->{$key}; $value = &Apache::lonnet::thaw_unescape($value); if (exists($value->{'name'})) { $value->{'name'} = &update_value($value->{'name'}); } $db->{$key} = &Apache::lonnet::freeze_escape($value); } } else { print("$type unsupported\n"); } &LONCAPA::locking_hash_untie($db); } sub main { my $doupdate; if (-e '/etc/loncapa-release') { if (open(PIPE,"cat /etc/loncapa-release.prev |grep '^LON-CAPA release' |")) { if (<PIPE> =~ /^\QLON-CAPA release \E(CVS_HEAD|\d+\.\d+\.\d+\.?\w*)\-\d+$/) { my $previous = $1; unless ($previous eq 'CVS_HEAD') { my ($major,$minor) = ($previous =~ /^(\d+)\.(\d+)\./); if (($major ne '') && ($minor ne '')) { if (($major == 2) && ($minor < 10)) { $doupdate = 1; } } } } close(PIPE); } } if ($doupdate) { print("Updating grading queue and slot definitions\n"); my $perlvar=LONCAPA::Configuration::read_conf('loncapa.conf'); find( { no_chdir => 1, wanted => \&process_gradingqueue_file, }, $perlvar->{'lonUsersDir'}); print("\n"); } else { print("Update of grading queue and slot definitions not required.\n"); } } &main();