/[clonezilla-sysresccd]/trunk/create-clonezilla-sysresccd/files/reloc-img
ViewVC logotype

Annotation of /trunk/create-clonezilla-sysresccd/files/reloc-img

Parent Directory Parent Directory | Revision Log Revision Log


Revision 47 - (hide annotations)
Thu May 20 12:12:53 2010 UTC (13 years, 10 months ago) by sng
File size: 43943 byte(s)
adding release scripts

1 sng 47 #!/bin/bash
2     # DEBUG=true
3     versionNumber='0.7'
4    
5     function findDirectories(){
6     #
7     # <- selectedInputPartition
8     #
9     # -> activeDirectory - selected directory
10     #
11    
12     local lines
13     local dialogLines
14     local cur=1
15     local cmdLine=''
16     local thisLine
17    
18     local allDirs="$(find "$1" -maxdepth 1 -type d | sed 's|^\.$|/|' | sed '/ /d' | sed 's|^\./||' | sed "s|$1/||" | sed "s|$1||" | sed 's|^$|/|' | sort)"
19     lines="$(echo "$allDirs" | wc -l | sed 's|[ ]*||g')"
20     if [ "$lines" = "" ] || [ "$lines" = "0" ];then
21     activeDirectory='/'
22     return
23     fi
24    
25    
26     while [ "$cur" -le "$lines" ];do
27     thisLine="$(echo "$allDirs" | sed -n "$cur"p)"
28     cmdLine="$cmdLine"\"$thisLine\"" "
29     if [ "$thisLine" = "/" ];then
30     cmdLine="$cmdLine"" \"Top directory in the local device\" "
31     else
32     cmdLine="$cmdLine"\""$(ls -lad "$1"/"$thisLine" | awk '{print $6 " " $7}')\" "
33     fi
34     ((cur++))
35     done
36    
37     # echo "$cmdLine"
38     # exit
39    
40     if [ "$lines" -gt 10 ];then
41     dialogLines=10
42     else
43     if [ "$lines" -lt 4 ];then
44     dialogLines=4
45     else
46     dialogLines="$lines"
47     fi
48     fi
49    
50     echo "dialog --backtitle \"$backTitle\" --title \" Select directory \" --menu 'Please select the directory that holds your images' $((dialogLines+7)) 78 $dialogLines $cmdLine" > /root/dialog.$$
51    
52     . /root/dialog.$$ 2>/root/selectedDirectory.$$
53    
54     activeDirectory=$(cat /root/selectedDirectory.$$)
55    
56     rm /root/dialog.$$
57     }
58    
59     function findSystemPartitions(){
60     # <- NONE
61     #
62     # -> selectedInputPartition - the partition to scan for images
63     # -> selectedInputPartitionNumber - Index of selectedInputPartition in inputPartition array
64     #
65     # -> diskCount - Number of disks on the system
66     # -> inputDisk - Disks present on the system (array)
67     # -> diskSize - Size of each disk (array)
68     #
69     # -> partitionCount - Number of partitions on the system
70     # -> inputPartition - Partitions present on the system (array)
71     # -> partitionSize - The size of each partition (array)
72     # -> partitionType - The type of each partition (array)
73     # -> CD - Not empty if partition is a CD (array)
74     #
75     allDisks=$(cat /proc/partitions | sed 's|.* ||' | grep -ve '[0-9]$'| grep -v name |grep -ve '^$')
76    
77     [ -z "$allDisks" ] && {
78     dialog --backtitle "$backTitle" --title " No disks found!!! " --msgbox "There seems to be no disk connected to your system, therefore no restoration is possible" 7 70
79     cleanUP
80     exit 1
81     }
82    
83    
84     local cmdLine=''
85     diskCount=$(echo "$allDisks" | wc -l)
86    
87     local fDisks=''
88    
89     local count=1
90     while [ $count -le $diskCount ];do
91     inputDisk[$count]=$(echo "$allDisks" | sed -n ""$count"p")
92     fdisk -l /dev/"${inputDisk[$count]}" 2>/dev/null > /root/clsys-raw-fdisk-"$count".$$
93     # parted /dev/"${inputDisk[$count]}" print > /root/clsys-raw-parted-"$count".$$
94     diskSize[$count]=$(sed -n '1p' /root/clsys-raw-fdisk-"$count".$$ | sed 's|.*, ||' | sed 's| bytes||' | sed 's| ||g')
95     cat /root/clsys-raw-fdisk-"$count".$$ | grep -e '^/' | grep -v "Ext'd" | grep -ve "[Ee]xtended" | grep -ve '[sS][wW][aA][pP]' > /root/clsys-part-"$count".$$
96     ((count++))
97     done
98     # echo 33
99    
100     allPartitions=$(cat /root/clsys-part-*$$ | sed 's| .*||' | sed 's|/dev/||')
101     # allSizes=$(grep -e '^ [0-9]' /root/clsys-raw-parted-*.$$ | awk '{print $4}')
102     partitionCount=$(echo "$allPartitions" | wc -l)
103    
104     local cmdLine=''
105     count=1
106     while [ $count -le $partitionCount ];do
107     inputPartition[$count]=$(echo "$allPartitions" | sed -n ""$count"p")
108     getPartitionSizeFromFdisk "${inputPartition[$count]}"
109     partitionSize[$count]=$( echo "$THIS_PARTITION_SIZE" | sed 's|,|.|')
110     partitionType[$count]=$(grep "${inputPartition[$count]}" /root/clsys-raw-fdisk-*.$$| sed 's|*||' | awk '{printf "%s %s %s %s",$6,$7,$8,$9}' |sed 's| *$||')
111     cmdLine="$cmdLine""${inputPartition[$count]}"" ""\"Size: ${partitionSize[$count]}, Type: ${partitionType[$count]}\""" "
112    
113     ((count++))
114     done
115    
116     # cleanUP
117     # exit
118    
119     # integrate CD-ROMs
120     local theCDs=$(cat /proc/sys/dev/cdrom/info | grep 'drive name' |sed 's|drive name:[ \t]*||' | awk '{for(i=1;i<=NF;i++) print $i}')
121     local cdCount=$(echo "$theCDs" | wc -l)
122    
123     count=1
124     while [ $count -le $cdCount ];do
125     ((partitionCount++))
126     inputPartition[$partitionCount]=$(echo "$theCDs" | sed -n ""$count"p")
127     CD[$partitionCount]=$count
128     cmdLine="$cmdLine""${inputPartition[$partitionCount]}"" ""\"Type: CD-ROM\""" "
129     ((count++))
130     done
131    
132     # integrate samba shares (cifs)
133     local smbShares=$(mount | sort | grep -e '[ ]cifs[ ]'| sed 's|on ||' |sed 's|type ||' | awk '$3 == "cifs" {print $2}')
134     #### DEBUG ####
135     [ -z "$DEBUG" ] || smbShares='/data'
136     #### END DEBUG ####
137    
138     [ -z "$smbShares" ] || {
139     local smbCount=$(echo "$smbShares" | wc -l)
140     count=1
141     while [ $count -le $smbCount ];do
142     ((partitionCount++))
143     inputPartition[$partitionCount]=$(echo "$smbShares" | sed -n ""$count"p")
144     SMB[$count]=$partitionCount
145     cmdLine="$cmdLine"smb"$count"" ""\"Type: Samba Share, $(echo "${inputPartition[$partitionCount]}"|sed 's|.*/||')\""" "
146     ((count++))
147     done
148     }
149    
150    
151     local nfsShares=$(mount | sort | grep -e '[ ]nfs[ ]'| sed 's|on ||' |sed 's|type ||' | awk '$3 == "nfs" {print $2}')
152     #### DEBUG ####
153     [ -z "$DEBUG" ] || nfsShares='/data'
154     #### END DEBUG ####
155     [ -z "$nfsShares" ] || {
156     local nfsCount=$(echo "$nfsShares" | wc -l)
157     count=1
158     while [ $count -le $nfsCount ];do
159     ((partitionCount++))
160     inputPartition[$partitionCount]=$(echo "$nfsShares" | sed -n ""$count"p")
161     NFS[$count]=$partitionCount
162     cmdLine="$cmdLine"nfs"$count"" ""\"Type: NFS Share, $(echo "${inputPartition[$partitionCount]}"|sed 's|.*/||')\""" "
163     ((count++))
164     done
165     }
166     # echo 66
167     selectedInputPartition=''
168    
169     echo "dialog --backtitle \"$backTitle\" --title \" Source Partition \" --menu 'Please select the location of your image file' $((partitionCount+7)) 78 $partitionCount $cmdLine" > /root/dialog.$$
170    
171     . /root/dialog.$$ 2>/root/selectedPartition.$$
172    
173     selectedInputPartition=$(cat /root/selectedPartition.$$)
174    
175     # set -x
176     # cleanUP
177     # exit
178    
179    
180     [ -z "$selectedInputPartition" ] && {
181     cleanUP
182     exit
183     }
184    
185     if [ ! -z $(echo "$selectedInputPartition"|grep -e '^smb[0-9][0-9]*$') ];then
186     local num=$(echo "$selectedInputPartition"|sed 's|smb||')
187     selectedInputPartitionNumber=${SMB[$num]}
188     workingRemote='y'
189     elif [ ! -z $(echo "$selectedInputPartition"|grep -e '^smb[0-9][0-9]*$') ];then
190     local num=$(echo "$selectedInputPartition"|sed 's|nfs||')
191     selectedInputPartitionNumber=${NFS[$num]}
192     workingRemote='y'
193     else
194     count=1
195     while [ "${inputPartition[$count]}" != "$selectedInputPartition" ];do
196     ((count++))
197     done
198     selectedInputPartitionNumber=$count
199     fi
200     # echo 100
201     # echo EOF
202     # read
203     # cleanUP
204     # exit
205    
206     }
207    
208     function findSambaShare(){
209     # used only when -i smb
210     echo 'Looking for Samba Shares (this may take some time)... '
211     partitionCount=0
212     local smbShares=$(mount | sort | awk '/cifs/ {
213     for(x=1; x<=NF; ++x){
214     s=substr($x,1,2)
215     if(s!="//"){
216     s=substr($x,1,1)
217     if(s=="/") mountpoint=$x
218     }if($x=="cifs"){
219     if(mountpoint!="") print mountpoint
220     }}}')
221     #### DEBUG ####
222     [ -z "$DEBUG" ] || smbShares='/data'
223     #### END DEBUG ####
224     [ -z "$smbShares" ] && {
225     echo
226     echo "No Samba Shares mounted"
227     exit 1
228     }
229     local smbCount=$(echo "$nfsShares" | wc -l)
230     count=1
231     while [ $count -le $smbCount ];do
232     ((partitionCount++))
233     inputPartition[$partitionCount]=$(echo "$smbShares" | sed -n ""$count"p")
234     SMB[$count]=$partitionCount
235     ((count++))
236     done
237     local num=1
238     selectedInputPartitionNumber=${SMB[$num]}
239     echo
240     }
241    
242     function findNFSShare(){
243     # used only when -i nfs
244     echo 'Looking for NFS Shares (this may take some time)... '
245     partitionCount=0
246     local nfsShares=$(mount | sort | awk '/nfs/ {
247     for(x=1; x<=NF; ++x){
248     s=substr($x,1,2)
249     if(s!="//"){
250     s=substr($x,1,1)
251     if(s=="/") mountpoint=$x
252     }if($x=="nfs"){
253     if(mountpoint!="") print mountpoint
254     }}}')
255     #### DEBUG ####
256     [ -z "$DEBUG" ] || nfsShares='/data'
257     #### END DEBUG ####
258     [ -z "$nfsShares" ] && {
259     echo
260     echo "No NFS Shares mounted"
261     exit 1
262     }
263    
264     local nfsCount=$(echo "$nfsShares" | wc -l)
265     count=1
266     while [ $count -le $nfsCount ];do
267     ((partitionCount++))
268     inputPartition[$partitionCount]=$(echo "$nfsShares" | sed -n ""$count"p")
269     NFS[$count]=$partitionCount
270     ((count++))
271     done
272     local num=1
273     selectedInputPartitionNumber=${NFS[$num]}
274     echo
275     }
276    
277    
278     function findImages(){
279     # <- folder to scan
280     #
281     # -> selectedInputImage - Number (index) in img array
282     # -> selectedInputImageSize - Size of disk / partition
283     # -> selectedInputImageID - Number - Partition ID (if user selected partition)
284     #
285     # -> imgCount - Number of images found
286     # -> partCount - Number of partitions found
287     #
288     # -> img - image name
289     # -> type - image type (partition/disk)
290     # -> activeItem - name of partition/disk
291     # -> imagePartitionSize - size of partition
292     # -> diskSizeFromImage - disk size
293     # -> partitionIdName - partition id in words
294     # -> id - description
295    
296     if [ -z "$onlyImages" ];then
297     dialog --backtitle "$backTitle" --title " Working " --infobox "Searching for image files" 3 29
298     fi
299     imgCount=0
300     partCount=0
301    
302     local count=1
303     local n
304     local tmp
305     local pCount
306     local tmpImg
307     local hasDisk=0
308     # set -x
309     for n in $(find "$1" -name parts 2>/dev/null);do
310     tmp="$(dirname "$n")"
311     if [ -z "$onlyImages" ];then
312     if [ "$(dirname "$tmp")" != "$1" ];then
313     continue
314     fi
315     fi
316     validateImage "$tmp" || continue
317     img[$count]="$(basename "$tmp")"
318    
319     [ -r "$(dirname "$n")"/disk ] && {
320     # it's a disk image
321     hasDisk=1
322     type[$count]=disk
323     tmp="$(dirname "$n")"/disk
324     activeItem[$count]=$(cat "$tmp")
325     partCount=$(cat "$(dirname "$n")"/parts | awk '{print NF}')
326     tmp=$(dirname "$n")
327     diskSizeFromImage[$count]=$(getDiskSizeFromImage "$tmp")
328     id[$count]="Image: ${img[$count]}, ${type[$count]}: ${activeItem[$count]}"", size: ${diskSizeFromImage[$count]}, parts: $partCount"
329     # scan parts
330     pCount=1
331     tmpImg="${img[$count]}"
332     while [ $pCount -le $partCount ];do
333     ((count++))
334     img[$count]="$tmpImg"
335     type[$count]=part
336     activeItem[$count]=$(cat "$n" | awk '{for(i=1;i<=NF;i++) print $i}' | sed -n ""$pCount"p")
337     # set -x
338     calcInputSize "$tmp" "${activeItem[$count]}"
339     imagePartitionSize[$count]="$THIS_INPUT_SIZE"
340     partitionIdName[$count]=$(getPartitionIdNameFromImage /"$tmp" "${activeItem[$count]}")
341     ((pCount++))
342     id[$count]=" ${type[$count]}: ${activeItem[$count]}, size: ${imagePartitionSize[$count]}, type: ${partitionIdName[$count]}"
343     done
344     } || {
345     # it's a partition image
346     type[$count]=part
347     activeItem[$count]=$(cat "$n")
348     partCount=1
349     calcInputSize /"$tmp" "${activeItem[$count]}"
350     imagePartitionSize[$count]="$THIS_INPUT_SIZE"
351     partitionIdName[$count]=$(getPartitionIdNameFromImage /"$tmp" "${activeItem[$count]}")
352     id[$count]="Image: ${img[$count]}, ${type[$count]}: ${activeItem[$count]}, size: ${imagePartitionSize[$count]}, type: ${partitionIdName[$count]}"
353     }
354     imgCount="$count"
355     ((count++))
356     done
357     # exit
358     [ $imgCount -eq 0 ] &&{
359     local msgType
360     [ -z "${CD[$selectedInputPartitionNumber]}" ] && msgType=Partition || msgType=CD-ROM
361     if [ -n "$(echo "$selectedInputPartition" | grep '/')" ];then
362     msgType=Folder
363     selectedInputPartition=/"$selectedInputPartition"
364     fi
365     if [ -z "$onlyImages" ];then
366     dialog --backtitle "$backTitle" --title " No images found!!! " --msgbox "$msgType"" $selectedInputPartition contains no valid image files
367    
368     Please try again selecting a different location" 7 60
369     else
370     echo "Error: $msgType $selectedInputPartition contains no valid image files!!!"
371     fi
372     cleanUP
373     exit 1
374     }
375     if [ -z "$onlyImages" ];then
376    
377     local cmdLine=''
378    
379     count=1
380     while [ $count -le $imgCount ];do
381     cmdLine="$cmdLine""$count"" \"""${id[$count]}""\" "
382     ((count++))
383     done
384    
385     selectedInputImage=''
386    
387     if [ $hasDisk -eq 1 ];then
388     local tit=" Partition/Disk to Restore "
389     local txt="Please select the partition/disk to restore"
390    
391    
392     # local msg="At least one of the images found contains a full disk backup
393     #
394     # Please use this image file to restore a full disk, ONLY in case the target disk is EXACTLY the same type as the original one (the disk that was backed up)
395     #
396     # In case the target disk is a different (bigger) one, you should NOT perform a full disk restore. Instead, exit this program, partition the target disk manually, in such a way that its partitions represent the partitions of the original disk, and then restore EACH partition seperatelly
397     #
398     # This way you will not have to resize the restored partitions on the target disk, after the entire restoration procedure has ended
399     #
400     # Do you want to continue?"
401     #
402     # dialog --backtitle "$backTitle" --title " Tips on disk restoration " --yesno "$msg" 20 72
403     #
404     # if [ $? -eq 1 ];then
405     # cleanUP
406     # exit
407     # fi
408    
409     else
410     local tit=" Target Partition "
411     local txt="Please select the partition to restore"
412     fi
413    
414     echo "dialog --backtitle \"$backTitle\" --title \""$tit"\" --menu \""$txt"\" $((imgCount+7)) 78 $imgCount $cmdLine" > /root/dialog.$$
415    
416     . /root/dialog.$$ 2>/root/selectedImage.$$
417     selectedInputImage=$(cat /root/selectedImage.$$)
418     [ -z "$selectedInputImage" ] && {
419     cleanUP
420     exit
421     }
422    
423     # set -x
424     # calculate image size and partition ID (if required)
425     if [ "${type[$selectedInputImage]}" = "part" ];then
426     calcInputSize /"$selectedInputPartition"/"${img[$selectedInputImage]}" "${activeItem[$selectedInputImage]}"
427     selectedInputImageSize="$THIS_INPUT_SIZE"
428     calcInputID /"$selectedInputPartition"/"${img[$selectedInputImage]}" "${activeItem[$selectedInputImage]}"
429     selectedInputImageID=$THIS_INPUT_ID
430     else
431     # calcInputSize /"$selectedInputPartition"/"${img[$selectedInputImage]}"
432     selectedInputImageSize="${diskSizeFromImage[$selectedInputImage]}"
433     fi
434     #
435     #
436     # cleanUP
437     # exit
438     else
439     echo "Image files found in: $selectedInputPartition"
440     count=1
441     until [ -z "${id[$count]}" ];do
442     echo " ${id[$count]}"
443     ((count++))
444     done
445     fi
446     }
447    
448     function getPartitionIdNameFromImage(){
449     local id=$(grep "$2" "$1"/*pt.sf | sed 's|.*Id= *||' | sed 's|,.*$||')
450     sfdisk -T |sed 's|^[ ]||' | grep -e "^$id[ \t]" | sed "s|^$id *||"
451     }
452    
453     function getDiskSizeFromImage(){
454     local lin=$(awk 'BEGIN{FS="="
455     count=0}
456     {if (count==0) b=$2
457     else{
458     b=b" * "
459     b=b$2
460     }
461     count++}
462     END{print b}' "$1"/*chs.sf | bc)
463     local size=$(echo "$lin * 512" | bc)
464     toMGByte "$size"
465     }
466    
467     function getDiskSizeFromDisk(){
468     local size=$(fdisk -l /dev/"$1" | grep -e '^Disk /dev/' | sed 's|.*, *||' | sed 's| *bytes||')
469     toMGByte "$size"
470     }
471    
472     function toMGByte(){
473     if [ $(expr length "$1") -le 9 ];then
474     echo $(expr substr "$1" 1 3 )"MB"
475     elif [ $(expr length "$1") -eq 10 ];then
476     echo $(expr substr "$1" 1 2 | sed 's|\([0-9]\)$|.\1|')"GB"
477     elif [ $(expr length "$1") -lt 12 ];then
478     echo $(expr substr "$1" 1 3 | sed 's|\([0-9]\)$|.\1|')"GB"
479     else
480     echo $(expr substr "$1" 1 4 | sed 's|\([0-9]\)$|.\1|')"GB"
481     fi
482     }
483    
484     function validateImage(){
485     [ -d "$1"/parts ] && return 1
486     local sf=$(find "$1" -name "*-chs.sf" 2>/dev/null | wc -l)
487     [ $sf -eq 0 ] && return 1
488     local pt=$(find "$1" -name "*-pt.sf" 2>/dev/null | wc -l)
489     [ $pt -eq 0 ] && return 1
490     # modification to read unsplited images
491     # thanks to Viking (24/11/2008)
492     # local aa=$(find "$1" -name "*.aa" 2>/dev/null | wc -l)
493     # [ $aa -eq 0 ] && return 1
494     return 0
495     }
496    
497     function cleanUP(){
498     if [ ! -z "$selectedInputPartition" ];then
499     [ -z "$workingRemote" ] && umount /"$selectedInputPartition" 2>/dev/null
500     fi
501     cd
502     rm /root/*.$$ 2>/dev/null
503     rm -rf /home/partimag/reloc-image
504     umount /home/partimag 2>/dev/null
505     # umount -a 2>/dev/null
506     [ -z "$onlyImages" ] && clear
507     }
508    
509     function calcInputID(){
510     THIS_INPUT_ID=$(sed -n "/$2/p" "$1"/*-pt.sf | sed 's|.*Id= *||' | sed 's|,.*$||')
511     }
512    
513     function calcInputSize(){
514     local bytesPerSector=512
515     local l
516     local pSize
517     local cylinders
518     local heads
519     local sectors
520     if [ -z "$2" ];then
521     cylinders=$(sed -n '/cylinders=/p' "$1"/*-chs.sf | sed 's|cylinders=||')
522     heads=$(sed -n '/heads=/p' "$1"/*-chs.sf | sed 's|heads=||')
523     sectors=$(sed -n '/sectors=/p' "$1"/*-chs.sf | sed 's|sectors=||')
524     THIS_INPUT_SIZE=$(echo "scale=2; $cylinders * $heads * $sectors * $bytesPerSector" | bc)
525     else
526     pSize=$(sed -n "/$2/p" "$1"/*-pt.sf | sed 's|.*size= *||' | sed 's|,.*||')
527     THIS_INPUT_SIZE=$(echo "scale=2; $pSize * $bytesPerSector" | bc)
528     fi
529    
530     l=$(expr length $THIS_INPUT_SIZE)
531     if [ $l -gt 9 ];then
532     THIS_INPUT_SIZE=$(echo "scale=2; $THIS_INPUT_SIZE / 1024 / 1024 / 1024" | bc)GB
533     else
534     THIS_INPUT_SIZE=$(echo "scale=3; $THIS_INPUT_SIZE / 1024 / 1024" | bc | sed 's|\.000|.00|')MB
535     fi
536     }
537    
538     function getPartitionSizeFromFdisk(){
539     local disk=$(echo "$1" | sed 's|[0-9]||')
540     if [ ! -e /root/closys-fdisk-"$disk".$$ ];then
541     fdisk -l /dev/"$disk" > /root/closys-fdisk-"$disk".$$
542     fi
543     local size=$(sed 's|*||' /root/closys-fdisk-"$disk".$$ | grep "$1" | awk '{print $4}' | sed 's|[+-]||')
544     local gB=$(echo "scale=2; $size / 1024 / 1024 " | bc | sed 's|^\.|0.|')GB
545     local mB=$(echo "scale=2; $size / 1024 " | bc)MB
546     if [ -z $(echo "$gB" | grep -e '^[0]') ];then
547     THIS_PARTITION_SIZE="$gB"
548     else
549     THIS_PARTITION_SIZE="$mB"
550     fi
551     }
552    
553     function getOutputPartition(){
554     ## select target partition
555     dialog --backtitle "$backTitle" --title " Working " --infobox "Searching for valid partitions" 3 34
556     local count=1
557     local cmdLine=''
558     local outputPartitionCount=0
559     local tmpDisk
560     local tmpID
561     local fatpartitions=''
562     local compResult
563     until [ -z "${inputPartition[$count]}" ];do
564     if [ "${inputPartition[$count]}" != "$selectedInputPartition" ] && [ -z "${CD[$count]}" ];then
565     tmpDisk=$(echo "${inputPartition[$count]}" | sed 's|[0-9]||')
566     tmpID=$(fdisk -l /dev/"$tmpDisk" 2>/dev/null| grep "${inputPartition[$count]}" | sed 's|*||' | awk '{print $5}')
567     if [ "$tmpID" = "$selectedInputImageID" ];then
568     comparePartitionsSize "$selectedInputImageSize" "${partitionSize[$count]}"
569     compResult=$?
570     if [ $compResult -eq 0 ];then
571     cmdLine="$cmdLine""${inputPartition[$count]}"" ""\"Size: ${partitionSize[$count]}, Type: ${partitionType[$count]} (identical part)\""" "
572     ((outputPartitionCount++))
573     elif [ $compResult -eq 2 ];then
574     cmdLine="$cmdLine""${inputPartition[$count]}"" ""\"Size: ${partitionSize[$count]}, Type: ${partitionType[$count]}\""" "
575     ((outputPartitionCount++))
576     needsResize[$count]='-r'
577     # echo "count = $count"
578     fi
579     fi
580     if [ "$tmpID" = "b" ] && [ "$selectedInputImageID" = "6" ];then
581     comparePartitionsSize "$selectedInputImageSize" "${partitionSize[$count]}"
582     compResult=$?
583     if [ $compResult -eq 0 ];then
584     cmdLine="$cmdLine""${inputPartition[$count]}"" ""\"Size: ${partitionSize[$count]}, Type: ${partitionType[$count]} (identical part)\""" "
585     ((outputPartitionCount++))
586     elif [ $compResult -eq 2 ];then
587     cmdLine="$cmdLine""${inputPartition[$count]}"" ""\"Size: ${partitionSize[$count]}, Type: ${partitionType[$count]}\""" "
588     ((outputPartitionCount++))
589     needsResize[$count]='-r'
590     # echo "count = $count"
591     fi
592     fi
593     if [ "$tmpID" = "c" ] && [ "$selectedInputImageID" = "6" ];then
594     comparePartitionsSize "$selectedInputImageSize" "${partitionSize[$count]}"
595     compResult=$?
596     if [ $compResult -eq 0 ];then
597     cmdLine="$cmdLine""${inputPartition[$count]}"" ""\"Size: ${partitionSize[$count]}, Type: ${partitionType[$count]} (identical part)\""" "
598     ((outputPartitionCount++))
599     elif [ $compResult -eq 2 ];then
600     cmdLine="$cmdLine""${inputPartition[$count]}"" ""\"Size: ${partitionSize[$count]}, Type: ${partitionType[$count]}\""" "
601     ((outputPartitionCount++))
602     needsResize[$count]='-r'
603     # echo "count = $count"
604     fi
605     fi
606     fi
607     ((count++))
608     done
609    
610     if [ $outputPartitionCount -eq 0 ];then
611     dialog --backtitle "$backTitle" --title " No available partitions!!! " --msgbox "The program found no valid partitions for restoration!!!
612    
613     The selected (backed up) partition size is $selectedInputImageSize, type ${partitionIdName[$selectedInputImage]}, but none of the partitions found on your disks are either this big or of this type
614    
615     This means that you should repartition one of your disks and create a partition with size at least $selectedInputImageSize and type ${partitionIdName[$selectedInputImage]}" 12 70
616     cleanUP
617     exit
618     fi
619    
620     # cleanUP
621     # exit
622     tmpPartName=$(sfdisk -T | sed 's|^[ \t]||' | grep -e "^"$selectedInputImageID" " | sed "s|^"$selectedInputImageID"[ /t]*||" | sed 's|,.*$||')
623     if [ $outputPartitionCount -gt 0 ];then
624    
625     # chech partitions size
626     local thisHeight=$outputPartitionCount
627     local totHeigh=$((outputPartitionCount+8))
628     if [ $totHeigh -gt 20 ];then
629     totHeigh=20
630     thisHeight=$(totHeigh-8)
631     fi
632     echo "dialog --backtitle \"$backTitle\" --title \" Target Partition \" --menu \"Please select the partition where your image file will be restored
633     Original image type: $tmpPartName, size: $selectedInputImageSize\" $totHeigh 78 $thisHeight $cmdLine" > /root/dialog.$$
634    
635     . /root/dialog.$$ 2>/root/outputPartition.$$
636     selectedOutputPartition=$(cat /root/outputPartition.$$)
637     [ -z "$selectedOutputPartition" ] && {
638     cleanUP
639     exit
640     }
641     else
642     dialog --backtitle "$backTitle" --title " No available partitions!!! " --msgbox "The program found no valid partitions for restoration!!!
643    
644     The selected (backed up) partition type is $tmpPartName (ID = $selectedInputImageID), but none of the partitions found on your disks are of this type
645    
646     This means that you should repartition one of your disks and create a $tmpPartName partition with ID $selectedInputImageID, or change an existing ID to $selectedInputImageID" 12 70
647     cleanUP
648     exit 1
649     fi
650     # set -x
651     count=1
652     until [ -z "${inputPartition[$count]}" ];do
653     if [ "${inputPartition[$count]}" = "$selectedOutputPartition" ];then
654     selectedOutputPartitionIndex=$count
655     break
656     fi
657     ((count++))
658     done
659     set +x
660    
661     }
662    
663     function comparePartitionsSize(){
664     #
665     # partition size format: xxxx.x[kMG]B
666     #
667     # <- $1 $2 - the sizes
668     #
669     # -> 0 - equal
670     # -> 1 - $1 > $2
671     # -> 2 - $2 > $1
672     # set -x
673     if [ "$1" = "$2" ];then return 0;fi
674     local count=1
675     while [ $count -le 2 ];do
676     local size[$count]=$(echo "$1" | sed 's|[kMG]B||')
677     # echo "size[$count] = ${size[$count]}"
678     local factor[$count]=$(echo "$1" | sed 's|.*\([kMG]\)B|\1|')
679     # echo "factor[$count] = ${factor[$count]}"
680     getMultiplier ${factor[$count]}
681     local multiplier[$count]=$THIS_MULTIPLIER
682     # echo "multiplier[$count] = ${multiplier[$count]}"
683     shift
684     ((count++))
685     done
686     return $(echo "a=${size[1]} * ${multiplier[1]};
687     b=${size[2]} * ${multiplier[2]};
688     if (a==b) print 0
689     if (a>b) print 1
690     if (a<b) print 2" | bc)
691     }
692    
693     function getMultiplier(){
694     # echo $#
695     case "$1" in
696     k) THIS_MULTIPLIER=1024;;
697     M) THIS_MULTIPLIER=1048576;;
698     G) THIS_MULTIPLIER=1073741824;;
699     esac
700     }
701    
702     function getRestoreParameters(){
703     # used only in disk restore, when disks not equal
704     # # Get restore parameters
705     dialog --separate-output --backtitle "$backTitle" --title " Restore options " --checklist "Please select your restore options" 10 78 3 "-k" "Keep target disk partition table (do not re-partition)" on "-r" "Resize partitions on target disk to maximum size" on "-t" "Do not write the MBR to the target disk" off 2>/root/params.$$
706     if [ $? -ne 0 ];then
707     cleanUP
708     exit
709     fi
710     count=1
711     while [ $count -le 3 ];do
712     param[$count]=$(sed -n ""$count"p" /root/params.$$ | sed 's/[ ]*//' )
713     ((count++))
714     done
715     }
716    
717     function preparePartitionImage(){
718     dialog --backtitle "$backTitle" --title " Working " --infobox "Preparing temporary image file" 3 34
719     if [ -d /home/partimag ];then
720     umount /home/partimag 2>/dev/null
721     rm -rf /home/partimag/* 2>/dev/null
722     else
723     rm -rf /home/partimag 2>/dev/null
724     mkdir /home/partimag
725     fi
726     rm -rf /home/partimag/reloc-image 2>/dev/null
727     mkdir /home/partimag/reloc-image
728     # echo /"$selectedInputPartition"/"${img[$selectedInputImage]}"
729     local inTmpDisk=$(echo "${activeItem[$selectedInputImage]}" | sed 's|[0-9]||')
730     local outTmpDisk=$(echo "$selectedOutputPartition" | sed 's|[0-9]||')
731     local outTmpPartition=$(echo "$selectedOutputPartition" | sed 's|[a-z]*||')
732     local tmpFile
733     local outFile
734     local count
735     #set -x
736     for n in $(find /"$selectedInputPartition"/"${img[$selectedInputImage]}" -name "*");do
737     tmpFile=$(basename "$n")
738     if [ "$tmpFile" != "${img[$selectedInputImage]}" ];then
739     # echo "$tmpFile"
740     outFile=$(echo "$tmpFile" | sed "s|${activeItem[$selectedInputImage]}|$selectedOutputPartition|" |sed "s|$inTmpDisk|$outTmpDisk|")
741     # echo "${activeItem[$selectedInputImage]} => $selectedOutputPartition"
742     # echo ln -s "$n" /home/partimag/reloc-image/"$outFile"
743     ln -s "$n" /home/partimag/reloc-image/"$outFile"
744     fi
745     done
746     if [ "${activeItem[$selectedInputImage]}" != "$selectedOutputPartition" ];then
747     [ -e /home/partimag/reloc-image/disk ] && {
748     rm /home/partimag/reloc-image/disk
749     echo "$outTmpDisk" > /home/partimag/reloc-image/disk
750     }
751     sed "s|${activeItem[$selectedInputImage]}|$selectedOutputPartition|" /home/partimag/reloc-image/parts | sed "s|$inTmpDisk|$outTmpDisk|" > /home/partimag/reloc-image/parts.tmp
752     rm /home/partimag/reloc-image/parts
753     mv /home/partimag/reloc-image/parts.tmp /home/partimag/reloc-image/parts
754     rm /home/partimag/reloc-image/"$outTmpDisk"-pt.sf
755     echo "# partition table of /dev/"$outTmpDisk"" > /home/partimag/reloc-image/"$outTmpDisk"-pt.sf
756     echo "unit: sectors" >> /home/partimag/reloc-image/"$outTmpDisk"-pt.sf
757     echo >> /home/partimag/reloc-image/"$outTmpDisk"-pt.sf
758     count=1
759     while [ $count -lt $outTmpPartition ];do
760     echo "/dev/"$outTmpDisk""$count" : start= 0, size= 0, Id= 0" >> /home/partimag/reloc-image/"$outTmpDisk"-pt.sf.tmp
761     ((count++))
762     done
763     grep "${activeItem[$selectedInputImage]}" /home/partimag/reloc-image/"$outTmpDisk"-pt.sf | sed "s|${activeItem[$selectedInputImage]}|$selectedOutputPartition|" >> /home/partimag/reloc-image/"$outTmpDisk"-pt.sf.tmp
764     rm /home/partimag/reloc-image/"$outTmpDisk"-pt.sf
765     mv /home/partimag/reloc-image/"$outTmpDisk"-pt.sf.tmp /home/partimag/reloc-image/"$outTmpDisk"-pt.sf
766     fi
767     }
768    
769     function doPartitionRestore(){
770     # set -x
771     if [ -z "${needsResize[$selectedOutputPartitionIndex]}" ];then
772     msg="The temporary image file is now ready, and you are about to start the Restore operation
773    
774     Are you sure you want to restore
775     the backup of partition ${activeItem[$selectedInputImage]}
776     to
777     partition $selectedOutputPartition?"
778     else
779     msg="The temporary image file is now ready, and you are about to start the Restore operation
780    
781     Are you sure you want to restore and resize
782     the backup of partition ${activeItem[$selectedInputImage]}
783     to
784     partition $selectedOutputPartition?"
785     fi
786     dialog --backtitle "$backTitle" --title "Ready to Restore" --yesno "$msg" 11 70
787    
788     if [ $? -eq 0 ];then
789     # Do restore
790     COMMAND="ocs-sr -p true -k -t "${needsResize[$selectedOutputPartitionIndex]}" -b restoreparts reloc-image $selectedOutputPartition"
791     fi
792     }
793    
794     function getOutputDisk(){
795     #
796     # -> diskGeometry - system disk geometry (array)
797     # item empty if disk smaller than image
798     # or not same number of partitions
799     # or partitions not same type
800     # -> equalDisk - denotes an equal disk geometry (array)
801     # item ont empty if disk is equal to image disk
802     # -> diskToRestoreCount - Number of available disks to restore
803     local cmdLine
804     diskToRestoreCount=0
805     getDiskGeometry
806     selectedImageDiskGeometry=$THIS_GEOMETRY
807    
808     local count=1
809     local mountedDisk=$(echo "$selectedInputPartition" | sed 's|[0-9]||')
810     # set -x
811     while [ $count -le $diskCount ];do
812     if [ "${inputDisk[$count]}" != "$mountedDisk" ];then
813     getDiskGeometry /dev/"${inputDisk[$count]}"
814     if [ "$THIS_GEOMETRY" = "$selectedImageDiskGeometry" ];then
815     # we have two identical disks
816     diskGeometry[$count]="$THIS_GEOMETRY"
817     equalDisk[$count]=1
818     ((diskToRestoreCount++))
819     cmdLine="$cmdLine""\"""${inputDisk[$count]}""\""" ""\"""Size: $(getDiskSizeFromDisk ${inputDisk[$count]}) (identical disk)""\" "
820     else
821     # disks are different
822     local selGeo=$(echo "$selectedImageDiskGeometry" |sed 's|,|*|g')
823     local thisGeo=$(echo "$THIS_GEOMETRY" |sed 's|,|*|g')
824     local compResult=$(echo "a=$selGeo;
825     b=$thisGeo;
826     if (a==b) print 0
827     if (a>b) print 1
828     if (a<b) print 2" | bc)
829     if [ $compResult -eq 2 ];then
830     # disk is large enough
831     # do we have same number of partitions and same type?
832     compResult=$(checkDisksPartitions)
833     if [ $compResult -eq 0 ];then
834     diskGeometry[$count]="$THIS_GEOMETRY"
835     ((diskToRestoreCount++))
836     cmdLine="$cmdLine""\"""${inputDisk[$count]}""\""" ""\"""Size: $(getDiskSizeFromDisk ${inputDisk[$count]})""\" "
837     fi
838     fi
839     fi
840    
841     fi
842     ((count++))
843     done
844     if [ $diskToRestoreCount -eq 0 ];then
845     dialog --backtitle "$backTitle" --title " No disks found!!! " --msgbox "Your system has no valid disks to restore this image file!!!
846    
847     In order to perform a disk restoration, you must have:
848    
849     a. A disk with the same geometry as the source disk
850     In this case you will perform a full disk restore, creating
851     partitions and restoring the MBR, or
852    
853     b. A prepartitioned larger disk which contains exactly the same
854     partitions as the source disk (same partition number and id)
855     In this case no partition creation will take place, but the
856     target partitions will be resized to maximum size" 16 70
857     cleanUP
858     exit
859     fi
860    
861     # make dialog
862     echo "dialog --backtitle \"$backTitle\" --title \" Target Disk \" --menu \"Please select the disk where your image file will be restored
863     Original image: ${img[$selectedInputImage]}, disk: ${activeItem[$selectedInputImage]}, size: $selectedInputImageSize\" $((diskToRestoreCount+8)) 78 $diskToRestoreCount $cmdLine" > /root/dialog.$$
864    
865     . /root/dialog.$$ 2>/root/selectedDisk.$$
866     selectedOutputDisk=$(cat /root/selectedDisk.$$)
867    
868     [ -z "$selectedOutputDisk" ] && {
869     cleanUP
870     exit
871     }
872    
873    
874     }
875    
876     function getDiskGeometry(){
877     if [ -z "$1" ];then
878     # get image disk geometry
879     THIS_GEOMETRY=$(awk 'BEGIN{FS="="
880     count=0}
881     {if (count==0) b=$2
882     else{
883     b=b","
884     b=b$2
885     }
886     count++}
887     END{print b}' /"$selectedInputPartition"/"${img[$selectedInputImage]}"/*-chs.sf)
888     else
889     # get disk geometry
890     THIS_GEOMETRY=$(sfdisk -g "$1" | sed 's|^.*:||' | sed 's|cylinders||' | sed 's|heads||' | sed 's|sectors/track||' | sed 's| *||g')
891     fi
892    
893     }
894    
895     function checkDisksPartitions(){
896     local imgData=$(grep -e '^/dev/' /"$selectedInputPartition"/"${img[$selectedInputImage]}"/*-pt.sf | sed 's| : .*Id= *|:|')
897    
898     local diskData=$(sfdisk -l /dev/${inputDisk[$count]} 2>/dev/null| grep -e '^/dev/' | awk '{
899     if ($2=="*")
900     print $1 ":" $7 ", bootable"
901     else
902     print $1 ":" $6}' | sed "s|${inputDisk[$count]}|${activeItem[$selectedInputImage]}|")
903    
904     if [ "$imgData" != "$diskData" ];then
905     echo 1
906     return
907     fi
908    
909     # check partitions size
910     local numOfPartitions=$(grep 'size=' /"$selectedInputPartition"/"${img[$selectedInputImage]}"/*-pt.sf | wc -l)
911     local imgPartitionSize
912     local diskPartitionSize
913     local partCount=1
914    
915     sfdisk -d /dev/${inputDisk[$count]} > /root/disk-${inputDisk[$count]}.$$
916     while [ $partCount -le $numOfPartitions ];do
917     imgPartitionSize=$(grep 'size=' /"$selectedInputPartition"/"${img[$selectedInputImage]}"/*-pt.sf | sed -n ""$partCount"p"| sed 's|.*size= *||' | sed 's|,.*$||' | sed 's|[+-]||')
918     diskPartitionSize=$(grep 'size=' /root/disk-${inputDisk[$count]}.$$ | sed -n ""$partCount"p"| sed 's|.*size= *||' | sed 's|,.*$||' | sed 's|[+-]||')
919     local compResult=$(echo "a=$imgPartitionSize;
920     b=$diskPartitionSize;
921     if (a==b) print 0
922     if (a>b) print 1
923     if (a<b) print 2" | bc)
924     if [ $compResult -eq 2 ];then
925     echo 1
926     return
927     fi
928     ((partCount++))
929     done
930     echo 0
931     }
932    
933    
934    
935     function prepareDiskImage(){
936     dialog --backtitle "$backTitle" --title " Working " --infobox "Preparing temporary image file" 3 34
937     if [ -d /home/partimag ];then
938     umount /home/partimag 2>/dev/null
939     rm -rf /home/partimag/* 2>/dev/null
940     else
941     rm -rf /home/partimag 2>/dev/null
942     mkdir /home/partimag
943     fi
944     rm -rf /home/partimag/reloc-image 2>/dev/null
945     mkdir /home/partimag/reloc-image
946    
947     # count is not local, will be used in doDiskRestore
948     count=1
949     until [ -z "${inputDisk[$count]}" ];do
950     # if [ "${activeItem[$count]}" = "$selectedOutputDisk" ];then
951     if [ "${inputDisk[$count]}" = "$selectedOutputDisk" ];then
952     break
953     fi
954     ((count++))
955     done
956    
957     local tmpFile
958     for n in $(find /"$selectedInputPartition"/"${img[$selectedInputImage]}" -name "*");do
959     tmpFile=$(basename "$n")
960     if [ "$tmpFile" != "${img[$selectedInputImage]}" ];then
961     outFile=$(echo "$tmpFile" |sed "s|${activeItem[$selectedInputImage]}|$selectedOutputDisk|")
962     ln -s "$n" /home/partimag/reloc-image/"$outFile"
963     fi
964     done
965    
966     if [ "${activeItem[$selectedInputImage]}" != "$selectedOutputDisk" ];then
967     rm /home/partimag/reloc-image/disk
968     echo "$selectedOutputDisk" > /home/partimag/reloc-image/disk
969     rm /home/partimag/reloc-image/parts
970     echo "$(cat /"$selectedInputPartition"/"${img[$selectedInputImage]}"/parts | sed "s|${activeItem[$selectedInputImage]}|$selectedOutputDisk|")" > /home/partimag/reloc-image/parts
971     rm /home/partimag/reloc-image/"$selectedOutputDisk"-pt.sf
972     sfdisk -d /dev/"$selectedOutputDisk" > /home/partimag/reloc-image/"$selectedOutputDisk"-pt.sf
973     if [ -z "${equalDisk[$count]}" ];then
974     rm /home/partimag/reloc-image/"$selectedOutputDisk"-chs.sf
975     sfdisk -d /dev/"$selectedOutputDisk" > /home/partimag/reloc-image/"$selectedOutputDisk"-chs.sf
976     fi
977     fi
978     }
979    
980     function doDiskRestore(){
981     if [ -z "${equalDisk[$count]}" ];then
982     getRestoreParameters
983     # disks not equal, do resize, restore MBR, don't create partitions
984    
985     msg="The temporary image file is now ready, and you are about to start the Restore operation
986    
987     You are about to restore
988     the backup of disk ${activeItem[$selectedInputImage]}
989     to
990     disk $selectedOutputDisk
991    
992     Info: The target disk is larger than the backed up disk
993     Selected Restore options will be be applied
994    
995     Do you want to continue?"
996     dialog --backtitle "$backTitle" --title "Ready to Restore" --yesno "$msg" 16 70
997    
998     if [ $? -eq 0 ];then
999     # Do restore
1000     COMMAND="ocs-sr -p true -e -b "${param[1]}" "${param[2]}" "${param[3]}" restoredisk reloc-image $selectedOutputDisk"
1001     fi
1002     else
1003     # disks are equal, restore MBR, do partitioning, no resize
1004     msg="The temporary image file is now ready, and you are about to start the Restore operation
1005    
1006     You are about to restore
1007     the backup of disk ${activeItem[$selectedInputImage]}
1008     to
1009     disk $selectedOutputDisk
1010    
1011     Info: The disks are identical, so the target disk will be
1012     partitioned and the MBR will be restored
1013    
1014     Do you want to continue?"
1015     dialog --backtitle "$backTitle" --title "Ready to Restore" --yesno "$msg" 16 70
1016    
1017     if [ $? -eq 0 ];then
1018     # Do restore
1019     COMMAND="ocs-sr -p true -e -b restoredisk reloc-image $selectedOutputDisk"
1020     fi
1021     fi
1022     }
1023    
1024     function testRoot(){
1025     if [ "$(whoami)" != "root" ];then
1026     printVersion
1027     echo "Error: This script must be executed by root..."
1028     exit
1029     fi
1030     }
1031    
1032     function printVersion(){
1033     echo "Clonezilla Live Image Restoration with Relocation
1034     $(basename $0) v. $versionNumber - (C) 2007-2008 S. Georgaras <sng@hellug.gr>
1035     "
1036     }
1037    
1038     function printHelp(){
1039     printVersion
1040     echo "Usage: $(basename $0) <options>
1041    
1042     Available options:
1043     i [location] Print info about Clonezilla Live Image files found in [location]
1044     [location] may be a hard disk partition, a CD-ROM device name or
1045     smb - the first Samba Share
1046     nfs - the first NFS Share
1047     Remote shares must be mounted beforehand
1048     v Print version info and exit
1049     h Print this screen and exit"
1050     }
1051    
1052     #
1053     #
1054     # Script starts here
1055     #
1056     #
1057    
1058     # findDirectories /home/spiros/multibootcd/files
1059     # #findDirectories /home/partimag
1060     #
1061     # exit
1062    
1063    
1064     #toMGByte "$1"
1065     #exit
1066    
1067    
1068    
1069    
1070     # grep -e '^/dev/' /data/test-img/hda-pt.sf | sed 's| : .*Id= *|:|'
1071     #
1072     #
1073     # sfdisk -l /dev/hda 2>/dev/null| grep -e '^/dev/' | awk '{
1074     # if ($2=="*")
1075     # print $1 ":" $7 ", bootable"
1076     # else
1077     # print $1 ":" $6}'
1078     # exit
1079    
1080    
1081     # getPartitionIdNameFromImage /data/usb250-img sda4
1082     # exit
1083    
1084     # set -x
1085     # getDiskSizeFromImage /data/usb250-img
1086     # exit
1087    
1088     # echo "$partitionList"
1089     # exit
1090    
1091     # getMultiplier M f g
1092     # echo "$THIS_MULTIPLIER"
1093    
1094     # set -x
1095     # comparePartitionsSize 2GB 2GB
1096     # echo $?
1097     # exit
1098     # set -x
1099     # getPartitionSizeFromFdisk hda1
1100     # echo "$THIS_PARTITION_SIZE"
1101     # exit
1102    
1103    
1104     # mountedInputPartition=/data
1105     # # set -x
1106     # findImages "$mountedInputPartition"
1107    
1108     # set -x
1109     # count=1
1110     # until [ -z "${img[$count]}" ];do
1111     # echo "${id[$count]}"
1112     # ((count++))
1113     # done
1114     #
1115     # exit
1116    
1117    
1118     # calcInputSize /data/usb250-img
1119     # calcInputSize /data/usb250-img sda4
1120     # calcInputID /data/usb250-img sda4
1121     # exit
1122    
1123     while getopts hvi: opt
1124     do
1125     case "$opt" in
1126     i)
1127     onlyImages=true
1128     diskToScan=$(echo "$OPTARG" | sed 's|^/dev/||')
1129     ;;
1130     v)
1131     printVersion
1132     exit;;
1133     h)
1134     printHelp
1135     exit;;
1136     esac
1137     done
1138     shift $(( OPTIND - 1 ))
1139    
1140     testRoot
1141     backTitle="Clonezilla Live Image Restoration with Relocation"
1142    
1143     for CHK_DIR in /home/partimag /tmp/local-dev;do
1144     CHK_HOME_PARTIMAG="$(mount | grep "$CHK_DIR")"
1145     if [ -n "$CHK_HOME_PARTIMAG" ];then
1146     CHK_MSG="
1147     A local partition or shared folder is already mounted
1148     under "$CHK_DIR". reloc-img will now terminate to
1149     prevent loss of data
1150    
1151     Please unmount it and try again"
1152     CHK_TITLE=" "$CHK_DIR" already mounted!!! "
1153    
1154     if [ -z "$onlyImages" ];then
1155    
1156     dialog --backtitle "$backTitle" --title "$CHK_TITLE" --msgbox "$CHK_MSG" 10 66
1157     else
1158     echo "$CHK_MSG"
1159     echo
1160     fi
1161     # Don't use cleanUP here, we want user to see the mounted partition
1162     # cleanUP
1163     exit
1164     fi
1165     done
1166    
1167    
1168     trap cleanUP 2
1169    
1170     if [ ! -z "$onlyImages" ];then
1171     printVersion
1172    
1173    
1174     if [ "$diskToScan" = "smb" ];then
1175     # if [ $(mount |grep cifs | wc -l) -eq 0 ];then
1176     # echo "Error: No Samba Share mounted!!!"
1177     # cleanUP
1178     # exit
1179     # fi
1180     # set -x
1181     selectedInputPartition=smb1
1182     workingRemote='y'
1183     findSambaShare
1184     elif [ "$diskToScan" = "nfs" ];then
1185     if [ $(mount |grep nfs | wc -l) -eq 0 ];then
1186     echo "Error: No NFS Share mounted!!!"
1187     cleanUP
1188     exit
1189     fi
1190     selectedInputPartition=nfs1
1191     workingRemote='y'
1192     findNFSShare
1193     else
1194     test1=$(cat /proc/partitions | grep "$diskToScan")
1195     if [ -z "$test1" ];then
1196     # It is not a disk partition
1197     # Is it a CD-ROM?
1198     test1=$(cat /proc/sys/dev/cdrom/info | grep 'drive name' |sed 's|drive name:[ \t]*||' | awk '{for(i=1;i<=NF;i++) print $i}' | grep "$diskToScan")
1199     if [ -z "$test1" ];then
1200     echo "Error: No such partition or CD-ROM: $diskToScan"
1201     cleanUP
1202     exit
1203     fi
1204     fi
1205     selectedInputPartition="$diskToScan"
1206     fi
1207     else
1208    
1209    
1210    
1211    
1212     msg="This program is part of Clonezilla-SysRescCD, and is provided with the hope that it will be error-free and useful. If you have found a bug, or the program does not behave as expected, please report it to
1213     Spiros Georgaras <sng@hellug.gr>
1214    
1215     It will help you restore a Clonezilla Image file to a disk/partition different from the one originally backed up.
1216    
1217     For example, you will be able to restore your backed up hdb disk to a (new) disk, hdc, or your backed up hda4 partition to a (new) partition, hdb3.
1218    
1219     The target disk/partition must be the same partition type and at least equal (size-wise) to the old - backed up - disk/partition
1220    
1221     Please make sure all removable devices are connected to the system before pressing OK, and that no local partition is mounted
1222    
1223     All data in the target disk/partition will be OVERWRITTEN!!!
1224    
1225     ----------------------
1226     THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY!
1227     USE AT YOUR OWN RISK!
1228     ----------------------"
1229    
1230     msg1="Do you want to continue?"
1231     dialog --backtitle "$backTitle" --title " Wellcome " \
1232     --msgbox "$msg" 20 72 \
1233     --and-widget --yesno "$msg1" 5 45 || {
1234     clear
1235     exit
1236     }
1237    
1238     dialog --backtitle "$backTitle" --title " Working " --infobox "Determining system disks and partitions" 3 43
1239    
1240     findSystemPartitions
1241     # mount selectedInputPartition
1242     dialog --backtitle "$backTitle" --title " Working " --infobox "Mounting selected device" 3 28
1243    
1244     fi
1245    
1246    
1247    
1248    
1249     [ -z "$selectedInputPartition" ] && {
1250     cleanUP
1251     echo "Error: selectedInputPartition is empty!!!"
1252     exit 1
1253     }
1254     # set -x
1255     if [ -z "$workingRemote" ];then
1256     # mount partition
1257     mkdir /"$selectedInputPartition" 2>/dev/null
1258     [ -d /"$selectedInputPartition" ] || {
1259     cleanUP
1260     echo "Error: Could not create folder: /$selectedInputPartition"
1261     exit 1
1262     }
1263     #set -x
1264     if [ -z "$DEBUG" ];then
1265     mkdir /"$selectedInputPartition" 2>/dev/null
1266     if [ -z "${CD[$selectedInputPartitionNumber]}" ];then
1267     # This is a disk partition
1268     mount /dev/"$selectedInputPartition" /"$selectedInputPartition" 2>/dev/null
1269     mountResult=$?
1270     else
1271     # This is a CD
1272     # Is it mounted?
1273     rm /home/partimag 2>/dev/null
1274     mkdir /home/partimag 2>/dev/null
1275     if [ -z "$(mount | grep "/dev/$selectedInputPartition")" ];then
1276     # No it's not, mount it
1277     echo "mount /dev/\"$selectedInputPartition\" /\"$selectedInputPartition\"" > /root/mountCommand.$$
1278     . /root/mountCommand.$$ && mountResult=0 || mountResult=1
1279     else
1280     # Yes it is ,mount through bind
1281     bindDir=$(mount | grep "/dev/$selectedInputPartition" | sed 's|.* on ||' | sed 's| type.*||')
1282     # echo "mount --bind \"$bindDir\" /\"$selectedInputPartition\" 2>/dev/null" > /root/mountCommand.$$
1283    
1284    
1285     if [ -d "$bindDir"/home/partimag ]; then bindDir="$bindDir"/home/partimag;fi
1286    
1287     echo "mount --bind \"$bindDir\" /\"$selectedInputPartition\" 2>/dev/null" > /root/mountCommand.$$
1288    
1289    
1290    
1291     chmod +x /root/mountCommand.$$
1292     . /root/mountCommand.$$ && mountResult=0 || mountResult=1
1293     fi
1294     fi
1295     else
1296     ### start DEBUG section
1297     mount --bind /data /"$selectedInputPartition"
1298     mountResult=$?
1299     ### end DEBUG section
1300     fi
1301     #read
1302    
1303     # Chech mounting result
1304     if [ $mountResult -ne 0 ];then
1305     if [ -z "$onlyImages" ];then
1306     if [ -z "${CD[$selectedInputPartitionNumber]}" ];then
1307     dialog --backtitle "$backTitle" --title " Mount error!!! " --msgbox "Partition $selectedInputPartition could not be mounted
1308    
1309     Please unmount all local partitions, and try again" 7 70
1310     cleanUP
1311     exit 1
1312     else
1313     while [ $mountResult -ne 0 ];do
1314     dialog --backtitle "$backTitle" --title " Mount error!!! " --yesno "CD-ROM $selectedInputPartition could not be mounted. This may be caused because you did not load the disk in the CD-ROM drive. Make sure the disk is in the drive and press Yes
1315    
1316     Do you want to try again?" 9 70
1317     if [ $? -eq 0 ];then
1318     dialog --backtitle "$backTitle" --title " Working " --infobox "Mounting selected device" 3 28
1319     . /root/mountCommand.$$ && mountResult=0 || mountResult=1
1320     else
1321     cleanUP
1322     exit 1
1323     fi
1324     done
1325     fi
1326     else
1327     echo "Error: Could not mount $selectedInputPartition"
1328     cleanUP
1329     exit 1
1330     fi
1331    
1332     fi
1333     else
1334     selectedInputPartition=$(echo "${inputPartition[$selectedInputPartitionNumber]}" | sed 's|^/||')
1335     fi
1336    
1337    
1338     ########################################################
1339     #
1340     # find directories...
1341     #
1342     ########################################################
1343     if [ -z "$onlyImages" ];then
1344     findDirectories /"$selectedInputPartition"
1345     if [ -z "$activeDirectory" ];then
1346     cleanUP
1347     exit
1348     fi
1349    
1350     if [ "$activeDirectory" != "/" ];then
1351     selectedInputPartition="$selectedInputPartition"/"$activeDirectory"
1352     fi
1353     fi
1354     ########################################################
1355    
1356    
1357     findImages /"$selectedInputPartition"
1358    
1359     if [ ! -z "$onlyImages" ];then
1360     cleanUP
1361     exit
1362     fi
1363    
1364    
1365     if [ "${type[$selectedInputImage]}" = "part" ];then
1366     getOutputPartition
1367     preparePartitionImage
1368     doPartitionRestore
1369     else
1370     getOutputDisk
1371     prepareDiskImage
1372     doDiskRestore
1373     fi
1374     # checking=aaa
1375     if [ ! -z "$COMMAND" ];then
1376     if [ -z "$checking" ];then
1377     $COMMAND
1378     else
1379     echo "The command that would be executed is:
1380     $COMMAND"
1381     # read
1382     fi
1383     fi
1384     cleanUP

Properties

Name Value
svn:executable *

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26