[LON-CAPA-cvs] cvs: loncom /debugging_tools move_construction_spaces.pl
raeburn
raeburn at source.lon-capa.org
Wed Oct 26 23:31:50 EDT 2011
raeburn Thu Oct 27 03:31:50 2011 EDT
Modified files:
/loncom/debugging_tools move_construction_spaces.pl
Log:
- Add LON-CAPA boilerplate (GPL etc.).
- Check if Apache is running -- if so provide directions on stopping httpd, and exit.
- Check if lond is running -- if so provide directions on stopping loncontrol, and exit.
- Add logging to /home/httpd/perl/logs/move_construction_spaces.log
- Moving from /home to /home/httpd/html/priv
- Checks for "restore_O.sh" files in /home/<user> created by lchtmldir
- writes content to /home/httpd/perl/logs/move_construction_spaces/<domain>/<user>
- unlinks restore_O.sh file
- Removes empty /home/<user> directory unless <user> has UNIX account on the server.
-------------- next part --------------
Index: loncom/debugging_tools/move_construction_spaces.pl
diff -u loncom/debugging_tools/move_construction_spaces.pl:1.2 loncom/debugging_tools/move_construction_spaces.pl:1.3
--- loncom/debugging_tools/move_construction_spaces.pl:1.2 Wed Oct 26 17:35:10 2011
+++ loncom/debugging_tools/move_construction_spaces.pl Thu Oct 27 03:31:50 2011
@@ -1,8 +1,35 @@
#!/usr/bin/perl
#
+# The LearningOnline Network
+#
# Move Construction Spaces from /home/$user/public_html
# to /home/httpd/html/priv/$domain/$user and vice versa
-#
+#
+# $Id: move_construction_spaces.pl,v 1.3 2011/10/27 03:31:50 raeburn Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+#################################################
use strict;
use lib '/home/httpd/lib/perl/';
@@ -16,19 +43,89 @@
&Apache::lonlocal::get_language_handle(undef,$lang);
if ($< != 0) {
- print(&mt('You must be root in order to move Construction Spaces.').
- "\n");
+ print &mt('You must be root in order to move Construction Spaces.')."\n".
+ &mt('Stopping')."\n";
exit;
}
my $perlvar=&LONCAPA::Configuration::read_conf();
-my ($lonuserdir,$londocroot);
+my ($lonuserdir,$londocroot,$londaemons);
if (ref($perlvar) eq 'HASH') {
$lonuserdir = $perlvar->{'lonUsersDir'};
$londocroot = $perlvar->{'lonDocRoot'};
+ $londaemons = $perlvar->{'lonDaemons'};
}
undef($perlvar);
+my $distro;
+if ($londaemons ne '') {
+ if (-e "$londaemons/distprobe") {
+ if (open(PIPE,"perl $londaemons/distprobe|")) {
+ $distro = <PIPE>;
+ close(PIPE);
+ }
+ }
+} else {
+ print &mt('Could not determine location of [_1] directory.',"'lonDaemons'")."\n".
+ &mt('Stopping')."\n";
+ exit;
+}
+
+if ($distro eq '') {
+ print &mt('Could not determine Linux distro.')."\n".
+ &mt('Stopping')."\n";
+ exit;
+} else {
+ my $stopapachecmd = '/etc/init.d/httpd stop';
+ my $apacheprocess = '/usr/sbin/httpd';
+ my $stopapachecmd = '/etc/init.d/httpd stop';
+ my $proc_owner = 'root';
+ if ($distro =~ /^(suse|sles)/) {
+ if ($distro =~ /^(suse|sles)9/) {
+ $stopapachecmd = '/etc/init.d/apache stop';
+ } else {
+ $apacheprocess = '/usr/sbin/httpd2';
+ $stopapachecmd = '/etc/init.d/apache2 stop';
+ }
+ } elsif ($distro =~ /^(?:debian|ubuntu)(\d+)/) {
+ $apacheprocess = '/usr/sbin/apache2';
+ $stopapachecmd = '/etc/init.d/apache2 stop';
+ } elsif ($distro =~ /^(?:fedora)(\d+)/) {
+ my $version = $1;
+ if ($version >= 16) {
+ $stopapachecmd = '/bin/systemctl stop httpd.service';
+ }
+ }
+ if (open(PIPE,"ps -ef |grep '$apacheprocess' |grep -v grep 2>&1 |")) {
+ my $status = <PIPE>;
+ close(PIPE);
+ chomp($status);
+ if ($status =~ /^\Q$proc_owner\E\s+\d+\s+/) {
+ print "\n".
+ &mt('You need to stop the Apache daemon before moving Construction Spaces.')."\n".
+ &mt('To do so use the following command: [_1]',"\n\n$stopapachecmd")."\n\n".
+ &mt('Now stopping the move_construction_spaces.pl script.')."\n";
+ exit;
+ }
+ } else {
+ print &mt('Could not determine if Apache daemon is running.')."\n";
+ }
+}
+
+my $stoploncontrol = '/etc/init.d/loncontrol stop';
+if (open(PIPE,"ps -ef |grep lond |grep -v grep 2>&1 |")) {
+ my $status = <PIPE>;
+ close(PIPE);
+ chomp($status);
+ if ($status =~ /^www\s+\d+\s+/) {
+ print "\n".
+ &mt('You need to stop the LON-CAPA daemons before moving Construction Spaces.')."\n".
+ &mt('To do so use the following command: [_1]',"\n\n$stoploncontrol")."\n\n".
+ &mt('Now stopping the move_construction_spaces.pl script.')."\n";
+ exit;
+ }
+}
+
# Abort if more than one argument.
my $parameter=$ARGV[0];
@@ -68,17 +165,19 @@
if ($action eq 'dryrun') {
print "\n".
- &mt('Running in exploratory mode.')."\n".
+ &mt('Running in exploratory mode ...')."\n\n".
&mt('Run with argument [_1] to actually move Construction Spaces to [_2], i.e., [_3]',
- "'move'","'$londocroot/priv'","\nperl move_construction_spaces.pl move")."\n\n".
+ "'move'","'$londocroot/priv'","\n\nperl move_construction_spaces.pl move")."\n\n\n".
&mt('Run with argument [_1] to move Construction spaces back to [_2], i.e., [_3]',
- "'undo'","'/home'","\nperl move_construction_spaces.pl undo")."\n\n".
+ "'undo'","'/home'","\n\nperl move_construction_spaces.pl undo")."\n\n\n".
&mt('Continue? ~[y/N~] ');
if (!&get_user_selection()) {
exit;
+ } else {
+ print "\n";
}
} else {
- print "\n ***".&mt('Running in a mode where changes will be made.')."\n";
+ print "\n *** ".&mt('Running in a mode where changes will be made.')." ***\n";
if ($action eq 'move') {
print "\n".
&mt('Mode is [_1] -- directories will be moved to [_2].',
@@ -91,6 +190,19 @@
print &mt('Continue? ~[y/N~] ');
if (!&get_user_selection()) {
exit;
+ } else {
+ print "\n";
+ }
+}
+
+my $logfh;
+if ($action ne 'dryrun') {
+ if (!open($logfh,">>$londaemons/logs/move_construction_spaces.log")) {
+ print &mt('Could not open log file: [_1] for writing.',
+ "'$londaemons/logs/move_construction_spaces.log'")."\n".
+ &mt('Stopping.')."\n";
+ } else {
+ &start_logging($logfh,$action);
}
}
@@ -99,25 +211,32 @@
my %pubusers;
if ($action eq 'move') {
+ my $output;
if (-d "$londocroot/priv") {
- print "\n".
- &mt('New Construction Spaces directory: [_1] already exists.',
- "'$londocroot/priv'")."\n";
+ $output = &mt('New Construction Spaces directory: [_1] already exists.',
+ "'$londocroot/priv'")."\n";
+ print $output;
+ print $logfh $output;
} else {
- print "\n".
- &mt('Creating new directory: [_1] for Construction Spaces.',
- "'$londocroot/priv'")."\n";
- if (mkdir("$londocroot/priv",0755)) {
+ $output = &mt('Creating new directory: [_1] for Construction Spaces.',
+ "'$londocroot/priv'")."\n";
+ if (mkdir("$londocroot/priv",0750)) {
if (chown($uid,$gid,"$londocroot/priv")) {
- print &mt('Creation Successful')."\n";
+ $output .= &mt('Creation Successful')."\n";
+ print $output;
+ print $logfh $output;
} else {
- print &mt('Failed to change ownership to [_1].',"'$uid:$gid'")."\n".
- &mt('Stopping')."\n";
+ $output .= &mt('Failed to change ownership to [_1].',"'$uid:$gid'")."\n";
+ print $output;
+ &stop_logging($logfh,$output);
+ print &mt('Stopping')."\n";
exit;
}
} else {
- print &mt('Failed to create directory [_1].',"'$londocroot/priv'")."\n".
- &mt('Stopping')."\n";
+ $output .= &mt('Failed to create directory [_1].',"'$londocroot/priv'")."\n";
+ print $output;
+ &stop_logging($logfh,$output);
+ print &mt('Stopping')."\n";
exit;
}
}
@@ -125,7 +244,7 @@
my @machinedoms;
if ($lonuserdir) {
- my $dir;
+ my ($dir,$output);
if (opendir($dir,$lonuserdir)) {
my @contents = (grep(!/^\.{1,2}$/,readdir($dir)));
foreach my $item (@contents) {
@@ -140,10 +259,15 @@
if (!-e $dom_target) {
if (mkdir($dom_target,0755)) {
chown($uid,$gid,$dom_target);
- print &mt('Made [_1].',"'$dom_target'")."\n";
+ $output = &mt('Made [_1].',"'$dom_target'")."\n";
+ print $output;
+ print $logfh $output;
} else {
- print &mt('Failed to make [_1].',"'$dom_target'")."\n".
- &mt('Stopping')."\n";
+ $output = &mt('Failed to make [_1].',"'$dom_target'")."\n";
+ print $output;
+ print $logfh $output;
+ &stop_logging($logfh,$output);
+ print &mt('Stopping')."\n";
exit;
}
} elsif ($action eq 'dryrun') {
@@ -172,8 +296,10 @@
}
closedir($dir);
} else {
- print &mt('Could not open [_1].',"'$lonuserdir'")."\n".
- &mt('Stopping')."\n";
+ $output = &mt('Could not open [_1].',"'$lonuserdir'")."\n";
+ print $output;
+ &stop_logging($logfh,$output);
+ print &mt('Stopping')."\n";
exit;
}
}
@@ -232,21 +358,31 @@
my $choice=<STDIN>;
chomp($choice);
if (grep(/^\Q$choice\E$/,@{$privspaces{$uname}})) {
- &move_priv_to_home($londocroot,$uname,$choice);
+ my $output = &move_priv_to_home($londocroot,$uid,$gid,$uname,$choice);
+ print $output;
+ print $logfh $output;
} else {
- print &mt('Invalid choice of domain:')." $choice\n".
- &mt('Skipping this user: [_1].',"'$uname'")."\n";
+ print &mt('Invalid choice of domain:')." $choice\n";
+ my $output = &mt('Skipping this user: [_1].',"'$uname'")."\n";
+ print $output;
+ print $logfh $output;
next;
}
} elsif (@{$privspaces{$uname}} == 1) {
- &move_priv_to_home($londocroot,$uname,$privspaces{$uname}[0]);
+ my $output = &move_priv_to_home($londocroot,$uid,$gid,$uname,$privspaces{$uname}[0]);
+ print $output;
+ print $logfh $output;
} else {
print &mt('Username [_1] found in [_2] was not within a domain',
"'$uname'","'$londocroot/priv'")."\n";
+ my $output = &mt('Skipping this user: [_1].',"'$uname'")."\n";
+ print $output;
+ print $logfh $output;
}
}
}
- print &mt('Done')."\n";
+ &stop_logging($logfh);
+ print "\n".&mt('Done')."\n";
exit;
}
@@ -254,11 +390,11 @@
if (opendir(my $dir,"/home")) {
foreach my $item (grep(!/^\.{1,2}$/,readdir($dir))) {
next if ($item eq 'www');
- if (-d "/home/$item") {
+ if ((-d "/home/$item") && ($item ne '')) {
# Is there a public_html-directory?
if (-d "/home/$item/public_html") {
my $author = $item;
- my ($domain,$skipped);
+ my ($domain,$skipped,$output);
if (ref($pubusers{$author}) eq 'ARRAY') {
($domain,$skipped) = &choose_domain($action,$author,$pubusers{$author});
}
@@ -267,18 +403,53 @@
($domain,$skipped) = &choose_domain($action,$author,$allauthors{$author});
}
}
+ my $source_path="/home/$author/public_html";
if ($domain) {
- my $source_path="/home/$author/public_html";
my $target_path="$londocroot/priv/$domain/$author";
if ($action eq 'move') {
- move($source_path,$target_path);
+ if (move($source_path,$target_path)) {
chown($uid,$gid,$target_path);
- chmod($target_path,0755);
- print &mt('Moved [_1] to [_2].',"'$source_path'","'$target_path'")."\n";
+ chmod($target_path,0750);
+ $output = &mt('Moved [_1] to [_2].',
+ "'$source_path'","'$target_path'")."\n";
+ my (undef,undef,$userid,$groupid) = getpwnam($author);
+ if ($userid eq '' && $groupid eq '' && $author ne '') {
+ &check_for_restore_files($londaemons,$author,$domain);
+ if (opendir(my $homedir,"/home/$author")) {
+ my @contents =
+ grep(!/^\.{1,2}$/,readdir($homedir));
+ if (@contents == 0) {
+ if (rmdir("/home/$author/")) {
+ $output .= &mt('Removed empty directory: [_1]',
+ "'/home/$author/'")."\n";
+ } else {
+ $output .= &mt('Failed to remove directory: [_1]',
+ "'/home/$author/'")."\n";
+ }
+ } else {
+ $output .= &mt('Not removing directory [_1] as it still contains: [_2]',
+ "'/home/$author/'",
+ "\n".join("\n", at contents)."\n");
+ }
+ }
+ } else {
+ $output .= &mt('Not removing directory [_1] for UNIX user account',
+ "'/home/$author/'")."\n";
+ }
+ } else {
+ $output = &mt('Failed to move [_1] to [_2].',
+ "'$source_path'","'$target_path'")."\n";
+ }
+ print $output;
+ print $logfh $output;
} elsif ($action eq 'dryrun') {
print &mt('Would move [_1] to [_2].',"'$source_path'","'$target_path'")."\n";
}
- } elsif (!$skipped) {
+ } elsif ($skipped) {
+ if ($action ne 'dryrun') {
+ print $logfh &mt('Skipping this user: [_1].',"'$author'")."\n";
+ }
+ } else {
print '*** '.&mt('WARNING: [_1] has no domain.',"'$author'")."\n".
&mt('Enter [_1]: do nothing, continue.','1')."\n".
&mt('Enter [_2]: stop.','2')."\n".
@@ -286,9 +457,16 @@
&mt('Your input: ');
my $choice=<STDIN>;
chomp($choice);
- next if ($choice ==1);
+ if ($choice ==1) {
+ print $logfh &mt('Skipping -- no domain for user: [_1].',"'$author'")."\n";
+ }
if ($choice == 2) {
print &mt('Stopped.')."\n";
+ if ($action ne 'dryrun') {
+ my $output = &mt('Stopped by user because of author without domain: [_1].',
+ "'$author'")/"\n";
+ &stop_logging($logfh,$output);
+ }
exit;
}
if ($choice =~ /^$match_domain$/) {
@@ -298,15 +476,28 @@
print '*** '.&mt('WARNING: [_1] does not yet exist.',"'$dompath'")."\n";
}
if ($action eq 'move') {
- print &mt('Making author [_1] in domain [_2].',"'$author'","'$choice'")."\n";
unless (-e $dompath) {
- print &mt('Making [_1].',"'$dompath'")."\n";
- mkdir($dompath,0755);
- chown($uid,$gid,$dompath);
+ $output .= &mt('Making [_1].',"'$dompath'")."\n";
+ if (mkdir($dompath,0755)) {
+ chown($uid,$gid,$dompath);
+ }
+ }
+ if (-e $dompath) {
+ if (move($source_path,$newpath)) {
+ chown($uid,$gid,$newpath);
+ chmod($newpath,0750);
+ $output = &mt('Moved [_1] to [_2].',
+ "'$source_path'","'$newpath'")."\n";
+ } else {
+ $output = &mt('Failed to move [_1] to [_2].',
+ "'$source_path'","'$newpath'")."\n";
+ }
+ print $output;
+ print $logfh $output;
+ } else {
+ $output = &mt('Failed to move [_1] to [_2] -- missing [_3].',
+ "'$source_path'","'$newpath'","'$dompath'")."\n";
}
- print &mt('Making [_1].',"'$newpath'")."\n";
- mkdir($newpath,0755);
- chown($uid,$gid,$newpath);
} elsif ($action eq 'dryrun') {
print &mt('Would make author [_1] in domain [_2].',"'$author'","'$choice'")."\n";
unless (-e $dompath) {
@@ -320,7 +511,10 @@
}
}
}
-print "\nDone.\n";
+if ($action ne 'dryrun') {
+ &stop_logging($logfh);
+}
+print "\n".&mt('Done.')."\n";
sub choose_domain {
my ($action,$author,$domarrayref) = @_;
@@ -359,29 +553,36 @@
}
sub move_priv_to_home {
- my ($londocroot,$uname,$domain) = @_;
+ my ($londocroot,$uid,$gid,$uname,$domain) = @_;
+ my $output;
if ($uname =~ /^$match_username$/ && $domain =~ /^$match_domain$/) {
my $source_path="$londocroot/priv/$domain/$uname";
my $target_path="/home/$uname/public_html";
if (!-e "/home/$uname") {
- if (mkdir("/home/$uname",0755)) {
- chown($uid,$gid,"/home/$uname");
+ my (undef,undef,$userid,$groupid) = getpwnam($uname);
+ if (mkdir("/home/$uname",0750)) {
+ if ($userid ne '' && $groupid ne '') {
+ chown($userid,$groupid,"/home/$uname");
+ }
} else {
- print &mt('Failed to create directory [_1] -- not moving [_2].',
+ $output = &mt('Failed to create directory [_1] -- not moving [_2].',
"'/home/$uname'","'$source_path'")."\n";
+ return $output;
}
}
- if (!-e $target_path) {
- move($source_path,$target_path);
- chown($uid,$gid,$target_path);
- chmod($target_path,0755);
- print &mt('Moved [_1] to [_2].',"'$source_path'","'$target_path'")."\n";
- } else {
- print &mt('Directory [_1] already exists -- not moving [_2].',
- "'$target_path'","'$source_path'")."\n";
+ if (-e "/home/$uname") {
+ if (!-e $target_path) {
+ move($source_path,$target_path);
+ chown($uid,$gid,$target_path);
+ chmod($target_path,2770);
+ $output = &mt('Moved [_1] to [_2].',"'$source_path'","'$target_path'")."\n";
+ } else {
+ $output = &mt('Directory [_1] already exists -- not moving [_2].',
+ "'$target_path'","'$source_path'")."\n";
+ }
}
}
- return;
+ return $output;
}
sub get_user_selection {
@@ -403,3 +604,66 @@
return $do_action;
}
+sub start_logging {
+ my ($fh,$action) = @_;
+ my $start = localtime(time);
+ print $fh "*****************************************************\n".
+ &mt('[_1] - mode is [_2].',
+ 'move_construction_spaces.pl',"'$action'")."\n".
+ &mt('Started -- time: [_1]',$start)."\n".
+ "*****************************************************\n\n";
+ return;
+}
+
+sub stop_logging {
+ my ($fh) = @_;
+ my $end = localtime(time);
+ print $fh "*****************************************************\n".
+ &mt('Ended -- time: [_1]',$end)."\n".
+ "*****************************************************\n\n\n";
+ close($fh);
+ return;
+}
+
+sub check_for_restore_files {
+ my ($londaemons,$author,$domain) = @_;
+ if (opendir(my $homedir,"/home/$author")) {
+ my @contents = grep(!/^\.{1,2}$/,readdir($homedir));
+ if (@contents > 0) {
+ if (grep(/^restore_\d+\.sh$/, at contents)) {
+ if (!-e "$londaemons/logs/moved_construction_spaces") {
+ mkdir("$londaemons/logs/moved_construction_spaces",0755);
+ }
+ if (!-e "$londaemons/logs/moved_construction_spaces/$domain") {
+ mkdir("$londaemons/logs/moved_construction_spaces/$domain",0755);
+ }
+ if (-e "$londaemons/logs/moved_construction_spaces/$domain") {
+ if (open(my $restorefh,">>$londaemons/logs/moved_construction_spaces/$domain/$author")) {
+ foreach my $item (@contents) {
+ if ($item =~ /^restore_\d+\.sh$/) {
+ my @stats = stat("/home/$author/$item");
+ my $lastmod = $stats[9];
+ if (open(my $fh,"</home/$author/$item")) {
+ print $restorefh
+ "*******************************\n".
+ "$item -- ".localtime(time)."\n".
+ "*******************************\n";
+ while (<$fh>) {
+ print $restorefh $_;
+ }
+ print $restorefh
+ "*******************************\n\n";
+ close($fh);
+ unlink("/home/$author/$item");
+ }
+ }
+ }
+ close($restorefh);
+ }
+ }
+ }
+ }
+ }
+ return;
+}
+
More information about the LON-CAPA-cvs
mailing list