From 3ac841c96c190239d41b43d3d808a2d1f33abe24 Mon Sep 17 00:00:00 2001 From: asirxing Date: Mon, 8 Oct 2012 08:55:58 +0000 Subject: [PATCH] Fix code error and update the codes according to review/testing comments git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13954 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT/xCAT/CFMUtils.pm | 261 ++++--------------------------------- 1 file changed, 25 insertions(+), 236 deletions(-) diff --git a/perl-xCAT/xCAT/CFMUtils.pm b/perl-xCAT/xCAT/CFMUtils.pm index 98c01ca0c..6c5e28e24 100644 --- a/perl-xCAT/xCAT/CFMUtils.pm +++ b/perl-xCAT/xCAT/CFMUtils.pm @@ -123,27 +123,16 @@ sub updateUserInfo { my @userfiles = ("/etc/passwd", "/etc/shadow", "/etc/group"); - # LKV:checked before the call , no need to check again - #if (! -d $cfmdir) - #{ - # my $rsp = {}; - # $rsp->{error}->[0] = "The CFM directory($cfmdir) does not exist."; - # xCAT::MsgUtils->message("E", $rsp, $::CALLBACK); - # return 1; - #} - my @osfiles = glob("$cfmdir/*.OS"); if (!@osfiles) { if ($::VERBOSE) { my $rsp = {}; - $rsp->{data}->[0] = - "Skiping the update of the /etc/passwd, shadow, group merge - files under the CFM directory."; + $rsp->{data}->[0] = "Skiping the update of the /etc/passwd, shadow, group merge files under the CFM directory."; xCAT::MsgUtils->message("I", $rsp, $::CALLBACK); - return 0; } + return 0; } foreach my $file (@userfiles) @@ -182,8 +171,7 @@ sub updateUserInfo { } # update the merge file - # LKV my $mergefile = $cfmdir."/".$file.".merge"; - my $mergefile = $cfmdir.$file.".merge"; + my $mergefile = $cfmdir."/".$file.".merge"; my @diff = xCAT::CFMUtils->arrayops("D", \@newrecords, \@oldrecords); # output the diff to merge files if (@diff) @@ -236,13 +224,13 @@ sub setCFMSynclistFile { if ($records->{'cfmdir'}) {$cfmdir = $records->{'cfmdir'}} if ($records->{'synclists'}) {$synclists = $records->{'synclists'}} } else { - if ($::VERBOSE) - { + if ($::VERBOSE) + { my $rsp = {}; $rsp->{data}->[0] = "There are no records for cfmdir and synclists attribute in the osimage:$img. There is nothing to process."; xCAT::MsgUtils->message("I", $rsp, $::CALLBACK); - return; - } + } + return; } # no cfmdir defined, return directly @@ -274,17 +262,6 @@ sub setCFMSynclistFile { # set the synclists attribute $osimage_t->setAttribs({imagename=>$img}, {'synclists' => $synclists}); } - # LKV: we don't get here because we return if no $cfmdir - # but CFM synclist file should not be there if no $cfmdir, whatever - # removes cfmdir attribute must also clean up synclist file. This - # maybe should be in a cleanupscript - # if ($found and !$cfmdir) - # { - # the cfmdir is disabled, but the CFM synclist file - #is defined, remove it from $synclists - # $synclists = join(',', delete $lists[$index]); - # $osimage_t->setAttribs({imagename=>$img}, {'synclists' => $synclists}); - #} } else { # no synclists defined, set it to CFM synclist file if ($cfmdir) { $synclists = $cfmsynclist; } @@ -358,22 +335,15 @@ sub updateCFMSynclistFile { my $cfmsynclist = "/install/osimages/$osimg/synclist.cfm"; if (! -d $cfmdir) { - # skip this one go on to the next image, nothing to do for + # skip this one go on to the next image, nothing to do for # CFMUtils in this image - # LKV: if you need to remove the synclist.cfm from the synclist - # attribute, you need to do it here. next; } - # LKV :check the cfmsynclist file and it's parent directory - # already verified cfmdir exists - #if (! -d dirname($cfmsynclist)) - #{ - # mkpath dirname($cfmsynclist); - #} - #if (! -e $cfmsynclist) # no need to touch the file - #{ - # system("touch $cfmsynclist"); - #} + # create the parent directory of CFM synclist file + if (! -d dirname($cfmsynclist)) + { + mkpath dirname($cfmsynclist); + } # update /etc/passwd, shadow, group merge files my $ret = xCAT::CFMUtils->updateUserInfo($cfmdir); @@ -386,17 +356,6 @@ sub updateCFMSynclistFile { return 1; } - # get the user specified records in synclist file - # LKV should all no user records in the file. It should be - # created new each call. Remove this routine and all associated - # processing of user records - my ($synced_ref, $append_ref, $execute_ref, $executealways_ref, $merge_ref) = getUserSynclistRecords($cfmsynclist, $cfmdir); - my @synced = @$synced_ref; - my @append = @$append_ref; - my @execute = @$execute_ref; - my @executealways = @$executealways_ref; - my @merge = @$merge_ref; - # recursively list the files under cfm directory my @files = (); find ( sub { push @files, $File::Find::name if (! -d) }, $cfmdir); @@ -427,65 +386,29 @@ sub updateCFMSynclistFile { print $fp "$file -> $dest\n"; } } - # output the user specified records for syncing - foreach my $file (@synced) - { - print $fp "$file\n"; - } - # LKV: Only put EXECUTE, EXECUTEALWAYS, etc if there are files - if (@appendfiles || @append ) { - # print $fp "\n\nAPPEND:\n"; - print $fp "APPEND:\n"; + + # output the APPEND records maintained by CFM + if (@appendfiles) { + print $fp "APPEND:\n"; } foreach my $file (@appendfiles) { my $dest = substr($file, length($cfmdir), length($file) - length(".append") - length($cfmdir)); print $fp "$file -> $dest\n"; } - # output the user specified APPEND records - foreach my $file (@append) - { - print $fp "$file\n"; - } - # output the EXECUTE records , if there are any - # LKV need to add check - if (@execute) { - #print $fp "\n\nEXECUTE:\n"; - print $fp "EXECUTE:\n"; - } - foreach my $file (@execute) - { - print $fp "$file\n"; - } - # output the EXECUTEALWAYS records - if (@executealways){ - #print $fp "\n\nEXECUTEALWAYS:\n"; - print $fp "EXECUTEALWAYS:\n"; - } - foreach my $file (@executealways) - { - print $fp "$file\n"; - } - - if (@mergefiles || @merge){ # output the MERGE records maintained by CFM - #print $fp "\n\nMERGE:\n"; - print $fp "MERGE:\n"; + if (@mergefiles) { + print $fp "MERGE:\n"; } foreach my $file (@mergefiles) { + my @userfiles = ("/etc/passwd", "/etc/shadow", "/etc/group"); my $dest = substr($file, length($cfmdir), length($file) - length(".merge") - length($cfmdir)); - print $fp "$file -> $dest\n"; - } - # output the user specified MERGE records - #LKV: you can only merge the /etc/passwd, /etc/shadow - # and /etc/groups. No other files are supported. - # If you have merge files for these three files, the admin should - # not be allowed to also have merge files. - foreach my $file (@merge) - { - print $fp "$file\n"; + # only /etc/passwd, /etc/shadow, /etc/groups merging is supported + if (grep(/$dest/, @userfiles)) { + print $fp "$file -> $dest\n"; + } } # close the file @@ -599,15 +522,11 @@ sub updateCFMPkglistFile { return 1; } - # check the cfmpkglist file and it's parent directory + # check the parent directory of cfmpkglist file if (! -d dirname($cfmpkglist)) { mkpath dirname($cfmpkglist); } - if (! -e $cfmpkglist) - { - system("touch $cfmpkglist"); - } # get previous selected and removed OS packages list from pkglist file my ($pre_selected_ref, $pre_removed_ref) = xCAT::CFMUtils->getPreOSpkgsList($cfmpkglist); @@ -652,136 +571,6 @@ sub updateCFMPkglistFile { return 0; } - -#----------------------------------------------------------------------------- - -=head3 getUserSynclistRecords - Get the user specified records from synclist file. - LKV: This routine should be removed. There will be no user records - - Arguments: - $synclist - the path for synclist file - $cfmdir - the path for CFM directory - Returns: - refs for synced, appened, execute, executealways and merge records arrays - Globals: - none - Error: - none - Example: - my ($synced_ref, $append_ref, $execute_ref, $executealways_ref, $merge_ref) = xCAT::CFMUtils->getUserSynclistRecords($synclist, $cfmdir); - my @synced = @$synced_ref; - my @append = @$append_ref; - my @execute = @$execute_ref; - my @executealways = @$executealways_ref; - my @merge = @$merge_ref; - -=cut - -#----------------------------------------------------------------------------- -sub getUserSynclistRecords { - my ($class, $synclist, $cfmdir) = @_; - - my @records = (); - # flags to identify the record for APPEND, EXECUTE, EXECUTEALWAYS, MERGE - my $isappend = 0; - my $isexecute = 0; - my $isexecutealways = 0; - my $ismerge = 0; - # lists for syncing files, APPEND, EXECUTE, EXECUTEALWAYS, MERGE records - my @synced = (); - my @append = (); - my @execute = (); - my @executealways = (); - my @merge = (); - - my $synclistfp; - open($synclistfp, $synclist); - while (<$synclistfp>) - { - my $line = xCAT::CFMUtils->trim($_); - if (($line =~ /^#/) || ($line =~ /^\s*$/ )) - { #comment line or blank line - next; - } else - { - if ($line =~ /^$cfmdir/) - { # remove the records maintained by CFM - next; - } else - { - push @records, $line; - } - } - } - close($synclistfp); - - # list the records - foreach my $record (@records) - { - if ($record eq "APPEND:") # set flag for APPEND records - { - $isappend = 1; - $isexecute = 0; - $isexecutealways = 0; - $ismerge = 0; - next; - } - if ($record eq "EXECUTE:") # set flag for EXECUTE records - { - $isexecute = 1; - $isappend = 0; - $isexecutealways = 0; - $ismerge = 0; - next; - } - if ($record eq "EXECUTEALWAYS:") # set flag for EXECUTEALWAYS records - { - $isexecutealways = 1; - $isappend = 0; - $isexecute = 0; - $ismerge = 0; - next; - } - if ($record eq "MERGE:") # set flag for MERGE records - { - $ismerge = 1; - $isappend = 0; - $isexecute = 0; - $isexecutealways = 0; - next; - } - - if (! ($isappend || $isexecute || $isexecutealways || $ismerge)) - { # syncing file record - push @synced, $record; - next; - } - if ($isappend && ! ($isexecute || $isexecutealways || $ismerge)) - { # APPEND record - push @append, $record; - next; - } - if ($isexecute && ! ($isappend || $isexecutealways || $ismerge)) - { # EXECUTE record - push @execute, $record; - next; - } - if ($isexecutealways && ! ($isappend || $isexecute || $ismerge)) - { # EXECUTEALWAYS record - push @executealways, $record; - next; - } - if ($ismerge && ! ($isappend || $isexecute || $isexecutealways)) - { # MERGE record - push @merge, $record; - next; - } - } - - return (\@synced, \@append, \@execute, \@executealways, \@merge); -} - #----------------------------------------------------------------------------- =head3 getPreOSpkgsList