Annotation of loncom/debugging_tools/move_construction_spaces.pl, revision 1.3
1.1 raeburn 1: #!/usr/bin/perl
2: #
1.3 ! raeburn 3: # The LearningOnline Network
! 4: #
1.1 raeburn 5: # Move Construction Spaces from /home/$user/public_html
6: # to /home/httpd/html/priv/$domain/$user and vice versa
1.3 ! raeburn 7: #
! 8: # $Id: move_construction_spaces.pl,v 1.2 2011/10/26 23:22:20 raeburn Exp $
! 9: #
! 10: # Copyright Michigan State University Board of Trustees
! 11: #
! 12: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
! 13: #
! 14: # LON-CAPA is free software; you can redistribute it and/or modify
! 15: # it under the terms of the GNU General Public License as published by
! 16: # the Free Software Foundation; either version 2 of the License, or
! 17: # (at your option) any later version.
! 18: #
! 19: # LON-CAPA is distributed in the hope that it will be useful,
! 20: # but WITHOUT ANY WARRANTY; without even the implied warranty of
! 21: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 22: # GNU General Public License for more details.
! 23: #
! 24: # You should have received a copy of the GNU General Public License
! 25: # along with LON-CAPA; if not, write to the Free Software
! 26: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 27: #
! 28: # /home/httpd/html/adm/gpl.txt
! 29: #
! 30: # http://www.lon-capa.org/
! 31: #
! 32: #################################################
1.1 raeburn 33:
34: use strict;
35: use lib '/home/httpd/lib/perl/';
36: use LONCAPA::Configuration;
37: use LONCAPA qw(:DEFAULT :match);
38: use Apache::lonlocal;
39: use File::Copy;
40: use GDBM_File;
41:
42: my $lang = &Apache::lonlocal::choose_language();
43: &Apache::lonlocal::get_language_handle(undef,$lang);
1.2 raeburn 44:
45: if ($< != 0) {
1.3 ! raeburn 46: print &mt('You must be root in order to move Construction Spaces.')."\n".
! 47: &mt('Stopping')."\n";
1.2 raeburn 48: exit;
49: }
50:
51: my $perlvar=&LONCAPA::Configuration::read_conf();
1.3 ! raeburn 52: my ($lonuserdir,$londocroot,$londaemons);
1.2 raeburn 53: if (ref($perlvar) eq 'HASH') {
54: $lonuserdir = $perlvar->{'lonUsersDir'};
55: $londocroot = $perlvar->{'lonDocRoot'};
1.3 ! raeburn 56: $londaemons = $perlvar->{'lonDaemons'};
1.2 raeburn 57: }
58: undef($perlvar);
1.1 raeburn 59:
1.3 ! raeburn 60: my $distro;
! 61: if ($londaemons ne '') {
! 62: if (-e "$londaemons/distprobe") {
! 63: if (open(PIPE,"perl $londaemons/distprobe|")) {
! 64: $distro = <PIPE>;
! 65: close(PIPE);
! 66: }
! 67: }
! 68: } else {
! 69: print &mt('Could not determine location of [_1] directory.',"'lonDaemons'")."\n".
! 70: &mt('Stopping')."\n";
! 71: exit;
! 72: }
! 73:
! 74: if ($distro eq '') {
! 75: print &mt('Could not determine Linux distro.')."\n".
! 76: &mt('Stopping')."\n";
! 77: exit;
! 78: } else {
! 79: my $stopapachecmd = '/etc/init.d/httpd stop';
! 80: my $apacheprocess = '/usr/sbin/httpd';
! 81: my $stopapachecmd = '/etc/init.d/httpd stop';
! 82: my $proc_owner = 'root';
! 83: if ($distro =~ /^(suse|sles)/) {
! 84: if ($distro =~ /^(suse|sles)9/) {
! 85: $stopapachecmd = '/etc/init.d/apache stop';
! 86: } else {
! 87: $apacheprocess = '/usr/sbin/httpd2';
! 88: $stopapachecmd = '/etc/init.d/apache2 stop';
! 89: }
! 90: } elsif ($distro =~ /^(?:debian|ubuntu)(\d+)/) {
! 91: $apacheprocess = '/usr/sbin/apache2';
! 92: $stopapachecmd = '/etc/init.d/apache2 stop';
! 93: } elsif ($distro =~ /^(?:fedora)(\d+)/) {
! 94: my $version = $1;
! 95: if ($version >= 16) {
! 96: $stopapachecmd = '/bin/systemctl stop httpd.service';
! 97: }
! 98: }
! 99: if (open(PIPE,"ps -ef |grep '$apacheprocess' |grep -v grep 2>&1 |")) {
! 100: my $status = <PIPE>;
! 101: close(PIPE);
! 102: chomp($status);
! 103: if ($status =~ /^\Q$proc_owner\E\s+\d+\s+/) {
! 104: print "\n".
! 105: &mt('You need to stop the Apache daemon before moving Construction Spaces.')."\n".
! 106: &mt('To do so use the following command: [_1]',"\n\n$stopapachecmd")."\n\n".
! 107: &mt('Now stopping the move_construction_spaces.pl script.')."\n";
! 108: exit;
! 109: }
! 110: } else {
! 111: print &mt('Could not determine if Apache daemon is running.')."\n";
! 112: }
! 113: }
! 114:
! 115: my $stoploncontrol = '/etc/init.d/loncontrol stop';
! 116: if (open(PIPE,"ps -ef |grep lond |grep -v grep 2>&1 |")) {
! 117: my $status = <PIPE>;
! 118: close(PIPE);
! 119: chomp($status);
! 120: if ($status =~ /^www\s+\d+\s+/) {
! 121: print "\n".
! 122: &mt('You need to stop the LON-CAPA daemons before moving Construction Spaces.')."\n".
! 123: &mt('To do so use the following command: [_1]',"\n\n$stoploncontrol")."\n\n".
! 124: &mt('Now stopping the move_construction_spaces.pl script.')."\n";
! 125: exit;
! 126: }
! 127: }
! 128:
1.1 raeburn 129: # Abort if more than one argument.
1.2 raeburn 130:
131: my $parameter=$ARGV[0];
132: $parameter =~ s/^\s+//;
133: $parameter =~ s/\s+$//;
134:
135: if ((@ARGV > 1) || (($parameter ne '') && ($parameter !~ /^(move|undo)$/))) {
1.1 raeburn 136: print &mt('usage: [_1]','move_construction_spaces.pl [move|undo]')."\n\n".
137: &mt('You should enter either no arguments, or just one argument -- either move or undo.')."\n".
1.2 raeburn 138: &mt("move - to move authors' Construction Spaces from: [_1] to [_2].",
139: "'/home'","'$londocroot/priv/'")."\n".
140: &mt('undo - to reverse those changes and move Construction Spaces back from: [_1] to [_2].',
141: "'$londocroot/priv/'","'/home'")."\n".
1.1 raeburn 142: &mt('no argument to do a dry run of the move option, without actually moving anything.')."\n";
143: exit;
144: }
145:
1.2 raeburn 146: print "\n".&mt("Moving authors' Construction Spaces.")."\n".
1.1 raeburn 147: "-----------------------------\n\n".
1.2 raeburn 148: &mt('If run without an argument, the script will report what it would do when moving Construction Spaces from [_1] to [_2].',
149: "'/home'","'$londocroot/priv/'")."\n\n".
150: &mt('If there are ambiguities (i.e., the same username belongs to two domains), this will be flagged, and you will be able to decide how to proceed.')."\n";
1.1 raeburn 151:
152: my $perlvar=&LONCAPA::Configuration::read_conf();
153: my ($lonuserdir,$londocroot);
154: if (ref($perlvar) eq 'HASH') {
155: $lonuserdir = $perlvar->{'lonUsersDir'};
156: $londocroot = $perlvar->{'lonDocRoot'};
157: }
158: undef($perlvar);
159:
160: my (undef,undef,$uid,$gid) = getpwnam('www');
161: my ($action) = ($parameter=~/^(move|undo)$/);
162: if ($action eq '') {
163: $action = 'dryrun';
164: }
165:
166: if ($action eq 'dryrun') {
1.2 raeburn 167: print "\n".
1.3 ! raeburn 168: &mt('Running in exploratory mode ...')."\n\n".
1.2 raeburn 169: &mt('Run with argument [_1] to actually move Construction Spaces to [_2], i.e., [_3]',
1.3 ! raeburn 170: "'move'","'$londocroot/priv'","\n\nperl move_construction_spaces.pl move")."\n\n\n".
1.2 raeburn 171: &mt('Run with argument [_1] to move Construction spaces back to [_2], i.e., [_3]',
1.3 ! raeburn 172: "'undo'","'/home'","\n\nperl move_construction_spaces.pl undo")."\n\n\n".
1.2 raeburn 173: &mt('Continue? ~[y/N~] ');
174: if (!&get_user_selection()) {
175: exit;
1.3 ! raeburn 176: } else {
! 177: print "\n";
1.2 raeburn 178: }
1.1 raeburn 179: } else {
1.3 ! raeburn 180: print "\n *** ".&mt('Running in a mode where changes will be made.')." ***\n";
1.1 raeburn 181: if ($action eq 'move') {
1.2 raeburn 182: print "\n".
183: &mt('Mode is [_1] -- directories will be moved to [_2].',
184: "'$action'","'$londocroot/priv'")."\n";
1.1 raeburn 185: } else {
1.2 raeburn 186: print "\n".
187: &mt('Mode is [_1] -- directories will be moved back to [_2].',
188: "'$action'","'/home'")."\n";
1.1 raeburn 189: }
190: print &mt('Continue? ~[y/N~] ');
191: if (!&get_user_selection()) {
192: exit;
1.3 ! raeburn 193: } else {
! 194: print "\n";
! 195: }
! 196: }
! 197:
! 198: my $logfh;
! 199: if ($action ne 'dryrun') {
! 200: if (!open($logfh,">>$londaemons/logs/move_construction_spaces.log")) {
! 201: print &mt('Could not open log file: [_1] for writing.',
! 202: "'$londaemons/logs/move_construction_spaces.log'")."\n".
! 203: &mt('Stopping.')."\n";
! 204: } else {
! 205: &start_logging($logfh,$action);
1.1 raeburn 206: }
207: }
208:
209: # Authors hosted on this server
210: my %allauthors;
211: my %pubusers;
212:
213: if ($action eq 'move') {
1.3 ! raeburn 214: my $output;
1.1 raeburn 215: if (-d "$londocroot/priv") {
1.3 ! raeburn 216: $output = &mt('New Construction Spaces directory: [_1] already exists.',
! 217: "'$londocroot/priv'")."\n";
! 218: print $output;
! 219: print $logfh $output;
1.1 raeburn 220: } else {
1.3 ! raeburn 221: $output = &mt('Creating new directory: [_1] for Construction Spaces.',
! 222: "'$londocroot/priv'")."\n";
! 223: if (mkdir("$londocroot/priv",0750)) {
1.1 raeburn 224: if (chown($uid,$gid,"$londocroot/priv")) {
1.3 ! raeburn 225: $output .= &mt('Creation Successful')."\n";
! 226: print $output;
! 227: print $logfh $output;
1.1 raeburn 228: } else {
1.3 ! raeburn 229: $output .= &mt('Failed to change ownership to [_1].',"'$uid:$gid'")."\n";
! 230: print $output;
! 231: &stop_logging($logfh,$output);
! 232: print &mt('Stopping')."\n";
1.1 raeburn 233: exit;
234: }
235: } else {
1.3 ! raeburn 236: $output .= &mt('Failed to create directory [_1].',"'$londocroot/priv'")."\n";
! 237: print $output;
! 238: &stop_logging($logfh,$output);
! 239: print &mt('Stopping')."\n";
1.2 raeburn 240: exit;
1.1 raeburn 241: }
242: }
243: }
244:
245: my @machinedoms;
246: if ($lonuserdir) {
1.3 ! raeburn 247: my ($dir,$output);
1.1 raeburn 248: if (opendir($dir,$lonuserdir)) {
249: my @contents = (grep(!/^\.{1,2}$/,readdir($dir)));
250: foreach my $item (@contents) {
251: if (-d "$lonuserdir/$item") {
252: if ($item =~ /^$match_domain$/) {
253: my $domain = $item;
254: unless (grep(/^\Q$domain\E$/,@machinedoms)) {
255: push(@machinedoms,$domain);
256: }
257: my $dom_target="/home/httpd/html/priv/$domain";
258: if ($action eq 'move') {
259: if (!-e $dom_target) {
260: if (mkdir($dom_target,0755)) {
261: chown($uid,$gid,$dom_target);
1.3 ! raeburn 262: $output = &mt('Made [_1].',"'$dom_target'")."\n";
! 263: print $output;
! 264: print $logfh $output;
1.1 raeburn 265: } else {
1.3 ! raeburn 266: $output = &mt('Failed to make [_1].',"'$dom_target'")."\n";
! 267: print $output;
! 268: print $logfh $output;
! 269: &stop_logging($logfh,$output);
! 270: print &mt('Stopping')."\n";
1.1 raeburn 271: exit;
272: }
273: } elsif ($action eq 'dryrun') {
1.2 raeburn 274: print &mt('Would make [_1].',"'$dom_target'")."\n";
1.1 raeburn 275: }
276: }
277: my %authors=();
278: my $fname = "$lonuserdir/$domain/nohist_domainroles.db";
279: my $dbref;
280: if (-e $fname) {
281: $dbref=&LONCAPA::locking_hash_tie($fname,&GDBM_READER());
282: }
283: if (!$dbref) {
1.2 raeburn 284: print &mt('Unable to tie to [_1].',"'$fname'")."\n";
1.1 raeburn 285: } elsif (ref($dbref) eq 'HASH') {
286: foreach my $key (keys(%{$dbref})) {
287: $key = &unescape($key);
288: if ($key =~ /^au\:($match_username)\Q:$domain\E/) {
289: push(@{$allauthors{$1}},$domain);
290: }
291: }
292: &LONCAPA::locking_hash_untie($dbref);
293: }
294: }
295: }
296: }
297: closedir($dir);
298: } else {
1.3 ! raeburn 299: $output = &mt('Could not open [_1].',"'$lonuserdir'")."\n";
! 300: print $output;
! 301: &stop_logging($logfh,$output);
! 302: print &mt('Stopping')."\n";
1.1 raeburn 303: exit;
304: }
305: }
306:
307: if ($londocroot ne '') {
308: if (-d "$londocroot/res") {
309: my ($dir,$domdir);
310: if (opendir($dir,"$londocroot/res")) {
311: my @contents = (grep(!/^\.{1,2}$/,readdir($dir)));
312: foreach my $dom (@contents) {
313: if ((grep(/^\Q$dom\E/,@machinedoms)) && (-d "$londocroot/res/$dom")) {
314: if (opendir($domdir,"$londocroot/res/$dom")) {
315: my @unames = (grep(!/^\.{1,2}$/,readdir($domdir)));
316: foreach my $uname (@unames) {
317: if ($uname =~ /^$match_username$/) {
318: push(@{$pubusers{$uname}},$dom);
319: }
320: }
321: }
322: }
323: }
324: }
325: }
326: }
327:
328: if ($action eq 'undo') {
329: my %privspaces;
330: if ($londocroot ne '') {
331: if (-d "$londocroot/priv") {
332: my ($dir,$domdir);
333: if (opendir($dir,"$londocroot/priv")) {
334: my @contents = (grep(!/^\.{1,2}/,readdir($dir)));
335: foreach my $dom (@contents) {
336: next if (!-d "$londocroot/priv/$dom");
337: if (opendir($domdir,"$londocroot/priv/$dom")) {
338: my @unames = (grep(!/^\.{1,2}$/,readdir($domdir)));
339: foreach my $uname (@unames) {
340: if ($uname =~ /^$match_username$/) {
341: push(@{$privspaces{$uname}},$dom);
342: }
343: }
344: }
345: }
346: }
347: }
348: }
349: foreach my $uname (keys(%privspaces)) {
350: if (ref($privspaces{$uname}) eq 'ARRAY') {
351: if (@{$privspaces{$uname}} > 1) {
1.2 raeburn 352: my $displaydoms = join(', ',@{$privspaces{$uname}});
353: print &mt('Same username used for authors in multiple domains.')."\n".
354: &mt('This configuration is not supported where Construction Spaces are located in [_1].','/home').".\n".
355: &mt('You will be able to move files for just one of the domains, choose which one.')."\n".
356: &mt('The domains to choose from are: [_1].',"'$displaydoms'")."\n".
357: &mt('Enter choice: ');
1.1 raeburn 358: my $choice=<STDIN>;
359: chomp($choice);
360: if (grep(/^\Q$choice\E$/,@{$privspaces{$uname}})) {
1.3 ! raeburn 361: my $output = &move_priv_to_home($londocroot,$uid,$gid,$uname,$choice);
! 362: print $output;
! 363: print $logfh $output;
1.1 raeburn 364: } else {
1.3 ! raeburn 365: print &mt('Invalid choice of domain:')." $choice\n";
! 366: my $output = &mt('Skipping this user: [_1].',"'$uname'")."\n";
! 367: print $output;
! 368: print $logfh $output;
1.1 raeburn 369: next;
370: }
371: } elsif (@{$privspaces{$uname}} == 1) {
1.3 ! raeburn 372: my $output = &move_priv_to_home($londocroot,$uid,$gid,$uname,$privspaces{$uname}[0]);
! 373: print $output;
! 374: print $logfh $output;
1.1 raeburn 375: } else {
1.2 raeburn 376: print &mt('Username [_1] found in [_2] was not within a domain',
377: "'$uname'","'$londocroot/priv'")."\n";
1.3 ! raeburn 378: my $output = &mt('Skipping this user: [_1].',"'$uname'")."\n";
! 379: print $output;
! 380: print $logfh $output;
1.1 raeburn 381: }
382: }
383: }
1.3 ! raeburn 384: &stop_logging($logfh);
! 385: print "\n".&mt('Done')."\n";
1.1 raeburn 386: exit;
387: }
388:
389: # Iterate over directories in /home
390: if (opendir(my $dir,"/home")) {
391: foreach my $item (grep(!/^\.{1,2}$/,readdir($dir))) {
392: next if ($item eq 'www');
1.3 ! raeburn 393: if ((-d "/home/$item") && ($item ne '')) {
1.1 raeburn 394: # Is there a public_html-directory?
395: if (-d "/home/$item/public_html") {
396: my $author = $item;
1.3 ! raeburn 397: my ($domain,$skipped,$output);
1.1 raeburn 398: if (ref($pubusers{$author}) eq 'ARRAY') {
399: ($domain,$skipped) = &choose_domain($action,$author,$pubusers{$author});
400: }
401: if (($domain eq '') && (!$skipped)) {
402: if (ref($allauthors{$author}) eq 'ARRAY') {
403: ($domain,$skipped) = &choose_domain($action,$author,$allauthors{$author});
404: }
405: }
1.3 ! raeburn 406: my $source_path="/home/$author/public_html";
1.1 raeburn 407: if ($domain) {
408: my $target_path="$londocroot/priv/$domain/$author";
409: if ($action eq 'move') {
1.3 ! raeburn 410: if (move($source_path,$target_path)) {
1.1 raeburn 411: chown($uid,$gid,$target_path);
1.3 ! raeburn 412: chmod($target_path,0750);
! 413: $output = &mt('Moved [_1] to [_2].',
! 414: "'$source_path'","'$target_path'")."\n";
! 415: my (undef,undef,$userid,$groupid) = getpwnam($author);
! 416: if ($userid eq '' && $groupid eq '' && $author ne '') {
! 417: &check_for_restore_files($londaemons,$author,$domain);
! 418: if (opendir(my $homedir,"/home/$author")) {
! 419: my @contents =
! 420: grep(!/^\.{1,2}$/,readdir($homedir));
! 421: if (@contents == 0) {
! 422: if (rmdir("/home/$author/")) {
! 423: $output .= &mt('Removed empty directory: [_1]',
! 424: "'/home/$author/'")."\n";
! 425: } else {
! 426: $output .= &mt('Failed to remove directory: [_1]',
! 427: "'/home/$author/'")."\n";
! 428: }
! 429: } else {
! 430: $output .= &mt('Not removing directory [_1] as it still contains: [_2]',
! 431: "'/home/$author/'",
! 432: "\n".join("\n",@contents)."\n");
! 433: }
! 434: }
! 435: } else {
! 436: $output .= &mt('Not removing directory [_1] for UNIX user account',
! 437: "'/home/$author/'")."\n";
! 438: }
! 439: } else {
! 440: $output = &mt('Failed to move [_1] to [_2].',
! 441: "'$source_path'","'$target_path'")."\n";
! 442: }
! 443: print $output;
! 444: print $logfh $output;
1.1 raeburn 445: } elsif ($action eq 'dryrun') {
1.2 raeburn 446: print &mt('Would move [_1] to [_2].',"'$source_path'","'$target_path'")."\n";
1.1 raeburn 447: }
1.3 ! raeburn 448: } elsif ($skipped) {
! 449: if ($action ne 'dryrun') {
! 450: print $logfh &mt('Skipping this user: [_1].',"'$author'")."\n";
! 451: }
! 452: } else {
1.2 raeburn 453: print '*** '.&mt('WARNING: [_1] has no domain.',"'$author'")."\n".
454: &mt('Enter [_1]: do nothing, continue.','1')."\n".
455: &mt('Enter [_2]: stop.','2')."\n".
456: &mt('or enter domain for user to be placed into')."\n".
457: &mt('Your input: ');
1.1 raeburn 458: my $choice=<STDIN>;
459: chomp($choice);
1.3 ! raeburn 460: if ($choice ==1) {
! 461: print $logfh &mt('Skipping -- no domain for user: [_1].',"'$author'")."\n";
! 462: }
1.2 raeburn 463: if ($choice == 2) {
464: print &mt('Stopped.')."\n";
1.3 ! raeburn 465: if ($action ne 'dryrun') {
! 466: my $output = &mt('Stopped by user because of author without domain: [_1].',
! 467: "'$author'")/"\n";
! 468: &stop_logging($logfh,$output);
! 469: }
1.2 raeburn 470: exit;
471: }
1.1 raeburn 472: if ($choice =~ /^$match_domain$/) {
473: my $dompath="$londocroot/priv/$choice";
474: my $newpath="$londocroot/priv/$choice/$author";
475: unless (-e $dompath) {
1.2 raeburn 476: print '*** '.&mt('WARNING: [_1] does not yet exist.',"'$dompath'")."\n";
1.1 raeburn 477: }
478: if ($action eq 'move') {
479: unless (-e $dompath) {
1.3 ! raeburn 480: $output .= &mt('Making [_1].',"'$dompath'")."\n";
! 481: if (mkdir($dompath,0755)) {
! 482: chown($uid,$gid,$dompath);
! 483: }
! 484: }
! 485: if (-e $dompath) {
! 486: if (move($source_path,$newpath)) {
! 487: chown($uid,$gid,$newpath);
! 488: chmod($newpath,0750);
! 489: $output = &mt('Moved [_1] to [_2].',
! 490: "'$source_path'","'$newpath'")."\n";
! 491: } else {
! 492: $output = &mt('Failed to move [_1] to [_2].',
! 493: "'$source_path'","'$newpath'")."\n";
! 494: }
! 495: print $output;
! 496: print $logfh $output;
! 497: } else {
! 498: $output = &mt('Failed to move [_1] to [_2] -- missing [_3].',
! 499: "'$source_path'","'$newpath'","'$dompath'")."\n";
1.1 raeburn 500: }
501: } elsif ($action eq 'dryrun') {
1.2 raeburn 502: print &mt('Would make author [_1] in domain [_2].',"'$author'","'$choice'")."\n";
1.1 raeburn 503: unless (-e $dompath) {
1.2 raeburn 504: print &mt('Would make [_1].',"'$dompath'")."\n";
1.1 raeburn 505: }
1.2 raeburn 506: print &mt('Would make [_1].',"'$newpath'")."\n";
1.1 raeburn 507: }
508: }
509: }
510: }
511: }
512: }
513: }
1.3 ! raeburn 514: if ($action ne 'dryrun') {
! 515: &stop_logging($logfh);
! 516: }
! 517: print "\n".&mt('Done.')."\n";
1.1 raeburn 518:
519: sub choose_domain {
520: my ($action,$author,$domarrayref) = @_;
521: my ($domain,$skipped);
522: if (ref($domarrayref) eq 'ARRAY') {
523: if (@{$domarrayref} > 1) {
1.2 raeburn 524: print '*** '.&mt('ERROR: [_1] found in multiple domains.',"'$author'")."\n".
525: &mt('Enter a number to choose what action to take.')."\n";
1.1 raeburn 526: my $num = 1;
527: for (my $i=0; $i<@{$domarrayref}; $i++) {
1.2 raeburn 528: print &mt('To use: [_1] enter [_2].',$domarrayref->[$i],$num)."\n";
1.1 raeburn 529: $num ++;
530: }
1.2 raeburn 531: print &mt('To skip this user enter: [_1].',$num)."\n".
532: &mt('Your choice:').' ';
1.1 raeburn 533: my $choice=<STDIN>;
534: chomp($choice);
535: if ($choice =~ /^\d+$/) {
536: if (($choice == $num) || ($choice > $num)) {
537: $skipped = 1;
538: } elsif (($choice < $num) && ($choice > 0)) {
539: $domain = $domarrayref->[$choice-1];
540: } else {
1.2 raeburn 541: print &mt('Invalid choice:')." $choice\n";
1.1 raeburn 542: $skipped = 1;
543: }
544: } else {
1.2 raeburn 545: print &mt('Invalid choice:')." $choice\n";
1.1 raeburn 546: $skipped = 1;
547: }
548: } elsif (@{$domarrayref} == 1) {
549: $domain = $domarrayref->[0];
550: }
551: }
552: return ($domain,$skipped);
553: }
554:
555: sub move_priv_to_home {
1.3 ! raeburn 556: my ($londocroot,$uid,$gid,$uname,$domain) = @_;
! 557: my $output;
1.1 raeburn 558: if ($uname =~ /^$match_username$/ && $domain =~ /^$match_domain$/) {
559: my $source_path="$londocroot/priv/$domain/$uname";
560: my $target_path="/home/$uname/public_html";
561: if (!-e "/home/$uname") {
1.3 ! raeburn 562: my (undef,undef,$userid,$groupid) = getpwnam($uname);
! 563: if (mkdir("/home/$uname",0750)) {
! 564: if ($userid ne '' && $groupid ne '') {
! 565: chown($userid,$groupid,"/home/$uname");
! 566: }
1.1 raeburn 567: } else {
1.3 ! raeburn 568: $output = &mt('Failed to create directory [_1] -- not moving [_2].',
1.2 raeburn 569: "'/home/$uname'","'$source_path'")."\n";
1.3 ! raeburn 570: return $output;
1.1 raeburn 571: }
572: }
1.3 ! raeburn 573: if (-e "/home/$uname") {
! 574: if (!-e $target_path) {
! 575: move($source_path,$target_path);
! 576: chown($uid,$gid,$target_path);
! 577: chmod($target_path,2770);
! 578: $output = &mt('Moved [_1] to [_2].',"'$source_path'","'$target_path'")."\n";
! 579: } else {
! 580: $output = &mt('Directory [_1] already exists -- not moving [_2].',
! 581: "'$target_path'","'$source_path'")."\n";
! 582: }
1.1 raeburn 583: }
584: }
1.3 ! raeburn 585: return $output;
1.1 raeburn 586: }
587:
588: sub get_user_selection {
589: my ($defaultrun) = @_;
590: my $do_action = 0;
591: my $choice = <STDIN>;
592: chomp($choice);
593: $choice =~ s/(^\s+|\s+$)//g;
594: my $yes = &mt('y');
595: if ($defaultrun) {
596: if (($choice eq '') || ($choice =~ /^\Q$yes\E/i)) {
597: $do_action = 1;
598: }
599: } else {
600: if ($choice =~ /^\Q$yes\E/i) {
601: $do_action = 1;
602: }
603: }
604: return $do_action;
605: }
606:
1.3 ! raeburn 607: sub start_logging {
! 608: my ($fh,$action) = @_;
! 609: my $start = localtime(time);
! 610: print $fh "*****************************************************\n".
! 611: &mt('[_1] - mode is [_2].',
! 612: 'move_construction_spaces.pl',"'$action'")."\n".
! 613: &mt('Started -- time: [_1]',$start)."\n".
! 614: "*****************************************************\n\n";
! 615: return;
! 616: }
! 617:
! 618: sub stop_logging {
! 619: my ($fh) = @_;
! 620: my $end = localtime(time);
! 621: print $fh "*****************************************************\n".
! 622: &mt('Ended -- time: [_1]',$end)."\n".
! 623: "*****************************************************\n\n\n";
! 624: close($fh);
! 625: return;
! 626: }
! 627:
! 628: sub check_for_restore_files {
! 629: my ($londaemons,$author,$domain) = @_;
! 630: if (opendir(my $homedir,"/home/$author")) {
! 631: my @contents = grep(!/^\.{1,2}$/,readdir($homedir));
! 632: if (@contents > 0) {
! 633: if (grep(/^restore_\d+\.sh$/,@contents)) {
! 634: if (!-e "$londaemons/logs/moved_construction_spaces") {
! 635: mkdir("$londaemons/logs/moved_construction_spaces",0755);
! 636: }
! 637: if (!-e "$londaemons/logs/moved_construction_spaces/$domain") {
! 638: mkdir("$londaemons/logs/moved_construction_spaces/$domain",0755);
! 639: }
! 640: if (-e "$londaemons/logs/moved_construction_spaces/$domain") {
! 641: if (open(my $restorefh,">>$londaemons/logs/moved_construction_spaces/$domain/$author")) {
! 642: foreach my $item (@contents) {
! 643: if ($item =~ /^restore_\d+\.sh$/) {
! 644: my @stats = stat("/home/$author/$item");
! 645: my $lastmod = $stats[9];
! 646: if (open(my $fh,"</home/$author/$item")) {
! 647: print $restorefh
! 648: "*******************************\n".
! 649: "$item -- ".localtime(time)."\n".
! 650: "*******************************\n";
! 651: while (<$fh>) {
! 652: print $restorefh $_;
! 653: }
! 654: print $restorefh
! 655: "*******************************\n\n";
! 656: close($fh);
! 657: unlink("/home/$author/$item");
! 658: }
! 659: }
! 660: }
! 661: close($restorefh);
! 662: }
! 663: }
! 664: }
! 665: }
! 666: }
! 667: return;
! 668: }
! 669:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>