[LON-CAPA-cvs] cvs: loncom /interface domainprefs.pm

raeburn raeburn at source.lon-capa.org
Tue Sep 13 22:59:33 EDT 2011


raeburn		Wed Sep 14 02:59:33 2011 EDT

  Modified files:              
    /loncom/interface	domainprefs.pm 
  Log:
  - Replacement of domain files:
    i.e., custom bubblesheet format file, logo, images on log-in page,
          custom login help file etc.
    via &publishlogo() causes subscribed servers to be notified to fetch
    new file(s) via call to &notifysubscribed() in Cleanup Handler.
  
  
Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.154 loncom/interface/domainprefs.pm:1.155
--- loncom/interface/domainprefs.pm:1.154	Wed Aug 17 11:16:59 2011
+++ loncom/interface/domainprefs.pm	Wed Sep 14 02:59:33 2011
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.154 2011/08/17 11:16:59 raeburn Exp $
+# $Id: domainprefs.pm,v 1.155 2011/09/14 02:59:33 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -171,6 +171,9 @@
 use DateTime::TimeZone;
 use DateTime::Locale;
 
+my $registered_cleanup;
+my $modified_urls;
+
 sub handler {
     my $r=shift;
     if ($r->header_only) {
@@ -190,6 +193,10 @@
         "/adm/domainprefs:mau:0:0:Cannot modify domain settings";
         return HTTP_NOT_ACCEPTABLE;
     }
+
+    $registered_cleanup=0;
+    @{$modified_urls}=();
+
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['phase','actions']);
@@ -5005,8 +5012,15 @@
             if (copy($source,$copyfile)) {
                 print $logfile "\nCopied original source to ".$copyfile."\n";
                 $output = 'ok';
-                &write_metadata($dom,$confname,$formname,$targetdir,$file,$logfile);
                 $logourl = '/res/'.$dom.'/'.$confname.'/'.$fname;
+                push(@{$modified_urls},[$copyfile,$source]);
+                my $metaoutput = 
+                    &write_metadata($dom,$confname,$formname,$targetdir,$file,$logfile);
+                unless ($registered_cleanup) {
+                    my $handlers = $r->get_handlers('PerlCleanupHandler');
+                    $r->set_handlers('PerlCleanupHandler' => [\&notifysubscribed,@{$handlers}]);
+                    $registered_cleanup=1;
+                }
             } else {
                 print $logfile "\nUnable to write ".$copyfile.':'.$!."\n";
                 $output = &mt('Failed to copy file to RES space').", $!";
@@ -5024,8 +5038,15 @@
                             my $copyfile=$targetdir.'/tn-'.$file;
                             if (copy($outfile,$copyfile)) {
                                 print $logfile "\nCopied source to ".$copyfile."\n";
-                                &write_metadata($dom,$confname,$formname,
-                                                $targetdir,'tn-'.$file,$logfile);
+                                my $thumb_metaoutput = 
+                                    &write_metadata($dom,$confname,$formname,
+                                                    $targetdir,'tn-'.$file,$logfile);
+                                push(@{$modified_urls},[$copyfile,$outfile]);
+                                unless ($registered_cleanup) {
+                                    my $handlers = $r->get_handlers('PerlCleanupHandler');
+                                    $r->set_handlers('PerlCleanupHandler' => [\&notifysubscribed,@{$handlers}]);
+                                    $registered_cleanup=1;
+                                }
                             } else {
                                 print $logfile "\nUnable to write ".$copyfile.
                                                ':'.$!."\n";
@@ -5090,30 +5111,79 @@
     {
         print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
         my $mfh;
-        unless (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
+        if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
+            foreach (sort keys %metadatafields) {
+                unless ($_=~/\./) {
+                    my $unikey=$_;
+                    $unikey=~/^([A-Za-z]+)/;
+                    my $tag=$1;
+                    $tag=~tr/A-Z/a-z/;
+                    print $mfh "\n\<$tag";
+                    foreach (split(/\,/,$metadatakeys{$unikey})) {
+                        my $value=$metadatafields{$unikey.'.'.$_};
+                        $value=~s/\"/\'\'/g;
+                        print $mfh ' '.$_.'="'.$value.'"';
+                    }
+                    print $mfh '>'.
+                        &HTML::Entities::encode($metadatafields{$unikey},'<>&"')
+                            .'</'.$tag.'>';
+                }
+            }
+            $output = 'ok';
+            print $logfile "\nWrote metadata";
+            close($mfh);
+        } else {
+            print $logfile "\nFailed to open metadata file";
             $output = &mt('Could not write metadata');
         }
-        foreach (sort keys %metadatafields) {
-            unless ($_=~/\./) {
-                my $unikey=$_;
-                $unikey=~/^([A-Za-z]+)/;
-                my $tag=$1;
-                $tag=~tr/A-Z/a-z/;
-                print $mfh "\n\<$tag";
-                foreach (split(/\,/,$metadatakeys{$unikey})) {
-                    my $value=$metadatafields{$unikey.'.'.$_};
-                    $value=~s/\"/\'\'/g;
-                    print $mfh ' '.$_.'="'.$value.'"';
-                }
-                print $mfh '>'.
-                    &HTML::Entities::encode($metadatafields{$unikey},'<>&"')
-                        .'</'.$tag.'>';
-            }
-        }
-        $output = 'ok';
-        print $logfile "\nWrote metadata";
-        close($mfh);
     }
+    return $output;
+}
+
+sub notifysubscribed {
+    foreach my $targetsource (@{$modified_urls}){
+        next unless (ref($targetsource) eq 'ARRAY');
+        my ($target,$source)=@{$targetsource};
+        if ($source ne '') {
+            if (open(my $logfh,'>>'.$source.'.log')) {
+                print $logfh "\nCleanup phase: Notifications\n";
+                my @subscribed=&subscribed_hosts($target);
+                foreach my $subhost (@subscribed) {
+                    print $logfh "\nNotifying host ".$subhost.':';
+                    my $reply=&Apache::lonnet::critical('update:'.$target,$subhost);
+                    print $logfh $reply;
+                }
+                my @subscribedmeta=&subscribed_hosts("$target.meta");
+                foreach my $subhost (@subscribedmeta) {
+                    print $logfh "\nNotifying host for metadata only ".$subhost.':';
+                    my $reply=&Apache::lonnet::critical('update:'.$target.'.meta',
+                                                        $subhost);
+                    print $logfh $reply;
+                }
+                print $logfh "\n============ Done ============\n";
+                close(logfh);
+            }
+        }
+    }
+    return OK;
+}
+
+sub subscribed_hosts {
+    my ($target) = @_;
+    my @subscribed;
+    if (open(my $fh,"<$target.subscription")) {
+        while (my $subline=<$fh>) {
+            if ($subline =~ /^($match_lonid):/) {
+                my $host = $1;
+                if ($host ne $Apache::lonnet::perlvar{'lonHostID'}) {
+                    unless (grep(/^\Q$host\E$/, at subscribed)) {
+                        push(@subscribed,$host);
+                    }
+                }
+            }
+        }
+    }
+    return @subscribed;
 }
 
 sub check_switchserver {




More information about the LON-CAPA-cvs mailing list