Index: systemimager.patched/lib/SystemImager/Server.pm
===================================================================
--- systemimager.patched/lib/SystemImager/Server.pm	(revisione 4471)
+++ systemimager.patched/lib/SystemImager/Server.pm	(copia locale)
@@ -28,10 +28,10 @@
 #   _imageexists 
 #   _in_script_add_standard_header_stuff 
 #   _read_partition_info_and_prepare_parted_commands 
-#   _read_partition_info_and_prepare_soft_raid_devs -AR- 
-#   _read_partition_info_and_prepare_pvcreate_commands -AR-
-#   _write_lvm_groups_commands -AR-
-#   _write_lvm_volumes_commands -AR-
+#   _read_partition_info_and_prepare_soft_raid_devs -AR-  
+#   _read_partition_info_and_prepare_pvcreate_commands -AR- -MC-
+#   _write_lvm_groups_commands -AR- -MC-
+#   _write_lvm_volumes_commands -AR- -MC-
 #   _write_boel_devstyle_entry
 #   _write_elilo_conf
 #   _write_out_mkfs_commands 
@@ -940,10 +940,29 @@
                                 if ($lvm_group_name->{name} eq $vg_name) {
                                     $cmd = "Initializing partition $part for use by LVM.";
                                     print $out qq(logmsg "$cmd"\n);
+                                    
+                                    # If recreate attribute eq "no" in any LV, Don't Touch PV ! -MC-
+                                    my $donotrecreate=0;					
+                                    foreach my $lv (@{$lvm_group_name->{lv}}) {
+                                        my $lv_recreate = $lv->{recreate} if defined $lv->{recreate};
+					$donotrecreate=1 if ((defined($lv_recreate))&&($lv_recreate eq "no"));
+                                    }                                    
+                                    $cmd = "pvcreate -M${version} -ff -y $part || shellout";
+				    
+                                    if ($donotrecreate) {	
+                                        my $precmd = "pvdisplay -c $part >/dev/null 2>&1"; 
 
-                                    $cmd = "pvcreate -M${version} -ff -y $part || shellout";
-                                    print $out qq(logmsg "$cmd"\n);
-                                    print $out "$cmd\n";
+                                        my $cond = "if [ \$? -gt 0 ];then ";
+                                        $cmd=$cond.$cmd.";fi"; 
+					
+					$cmd="$precmd;$cmd";
+                                        print $out qq(logmsg "$cmd"\n);
+                                        print $out "$cmd\n";
+                                    } else {
+                                    
+                                        print $out qq(logmsg "$cmd"\n);
+                                        print $out "$cmd\n";
+                                    }
                                     goto part_done;
                                 }
                             }
@@ -972,9 +991,29 @@
             }
             foreach my $lvm_group_name (@{$lvm->{lvm_group}}) {
                 if ($lvm_group_name->{name} eq $vg_name) {
+
+                    # If recreate attribute eq "no" in any LV, Don't Touch PV ! -MC-
+                    my $donotrecreate=0;
+                    foreach my $lv (@{$lvm_group_name->{lv}}) {
+                        my $lv_recreate = $lv->{recreate} if defined $lv->{recreate};
+                        $donotrecreate=1 if ((defined($lv_recreate))&&($lv_recreate eq "no"));
+                    }
                     $cmd = "pvcreate -M${version} -ff -y $md || shellout";
-                    print $out qq(logmsg "$cmd"\n);
-                    print $out "$cmd\n";
+
+                    if ($donotrecreate) {
+                        my $precmd = "pvdisplay -c $md >/dev/null 2>&1";
+
+                        my $cond = "if [ \$? -gt 0 ];then ";
+                        $cmd=$cond.$cmd.";fi";
+
+			$cmd="$precmd;$cmd";
+                        print $out qq(logmsg "$cmd"\n);
+                        print $out "$cmd\n";
+                    } else {
+                                    
+                        print $out qq(logmsg "$cmd"\n);
+                        print $out "$cmd\n";
+                    }
                 }
             }
         }
@@ -1070,11 +1109,49 @@
                     $vg_phys_extent_size = ""; 
                 }
                 # Remove previous volume groups with $group_name if already present.
-                $cmd = "lvremove -f /dev/${group_name} >/dev/null 2>&1 && vgremove $group_name >/dev/null 2>&1";
+                #$cmd = "lvremove -f /dev/${group_name} >/dev/null 2>&1 && vgremove $group_name >/dev/null 2>&1";
+
+                #Remove only LV with recreate ne "no" -MC-
+
+                # If recreate attribute eq "no" in any LV, Don't Touch LV ! -MC-
+                # else remove it
+                foreach my $lv (@{$lvm->{lvm_group}->{$group_name}->{lv}}) {
+		    my $lv_name = $lv->{name};
+                    my $lv_recreate = $lv->{recreate};
+                    unless ((defined($lv_recreate))&&($lv_recreate eq "no")) {
+                        $cmd = "lvremove -f /dev/${group_name}/${lv_name} &> /dev/null || shellout";
+                        my $precmd = "lvdisplay -c /dev/${group_name}/${lv_name} >/dev/null 2>&1";
+
+
+                        my $cond = "if [ \$? -eq 0 ];then ";
+                        $cmd = $cond.$cmd.";fi";
+
+			$cmd="$precmd;$cmd";
+                        print $out qq(logmsg "$cmd"\n);
+                        print $out "$cmd\n"; 							
+                    }
+                }
+		#remove VG if it exists and it's empty
+                $cmd = "vgremove $group_name >/dev/null 2>&1 || shellout";
+		my $precmd = "lvdisplay -c /dev/${group_name} >/dev/null 2>&1 && ! ( lvdisplay -c /dev/${group_name} | grep -c /dev/${group_name} >/dev/null 2>&1 )";
+
+
+                my $cond = "if [ \$? -eq 0 ];then ";
+                $cmd = $cond.$cmd.";fi";
+ 
+		$cmd="$precmd;$cmd";
                 print $out qq(logmsg "$cmd"\n);
-                print $out "$cmd\n";
-                # Write the command to create the volume group -AR-
+                print $out "$cmd\n"; 							
+		
+                # Write the command to create the volume group if not exists -MC-
                 $cmd = "vgcreate -M${version} ${vg_max_log_vols}${vg_max_phys_vols}${vg_phys_extent_size}${group_name}${part_list} || shellout";
+                $precmd = "lvdisplay -c /dev/${group_name} >/dev/null 2>&1";
+
+
+                $cond = "if [ \$? -ne 0 ];then ";
+                $cmd = $cond."sleep 10;".$cmd.";fi";
+
+		$cmd="$precmd;$cmd";
                 print $out qq(logmsg "$cmd"\n);
                 print $out "$cmd\n";
             } else {
@@ -1125,15 +1202,35 @@
                 $lv_options = "";
             }
 
-            # Create the logical volume -AR-
-            $cmd = "lvcreate $lv_options $lv_size -n $lv_name $group_name || shellout";
-            print $out qq(logmsg "$cmd"\n);
-            print $out "$cmd\n";
+            # Check Recreate Option -MC-
+            my $lv_recreate = $lv->{recreate};
+            unless (defined($lv_recreate)&&($lv_recreate eq "no")) { 
+                # Create the logical volume -AR-
+                $cmd = "lvcreate $lv_options $lv_size -n $lv_name $group_name || shellout";
+                print $out qq(logmsg "$cmd"\n);
+                print $out "$cmd\n";
             
-            # Enable the logical volume -AR-
-            $cmd = "lvscan > /dev/null; lvchange -a y /dev/$group_name/$lv_name || shellout";
-            print $out qq(logmsg "$cmd"\n);
-            print $out "$cmd\n";
+                # Enable the logical volume -AR-
+                $cmd = "lvscan > /dev/null; lvchange -a y /dev/$group_name/$lv_name || shellout";
+                print $out qq(logmsg "$cmd"\n);
+                print $out "$cmd\n";
+            } else {
+                $cmd = "lvcreate $lv_options $lv_size -n $lv_name $group_name || shellout";
+		my $precmd = "lvdisplay -c /dev/${group_name}/${lv_name} >/dev/null 2>&1";
+
+
+                my $cond = "if [ \$? -ne 0 ];then ";
+                $cmd = $cond.$cmd.";fi";
+
+		$cmd="$precmd;$cmd";
+                print $out qq(logmsg "$cmd"\n);
+                print $out "$cmd\n";
+
+                # Enable the logical volume -AR-
+                $cmd = "lvscan > /dev/null; lvchange -a y /dev/$group_name/$lv_name || shellout";
+                print $out qq(logmsg "$cmd"\n);
+                print $out "$cmd\n";
+            }
         }
     }
 }
