This file is indexed.

/usr/share/drbl/samples/mdisks-checksum is in clonezilla 3.27.16-2.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
#!/bin/bash
# License: GPL
# Author: Steven Shiau <steven _at_ stevenshiau org>
# Program to save or restore disk with checksum mechanism enabled.
# Features:
#***Save***
# Another copy of the checksum file will be put in /home/partimag/ after saving, with file name $image_name-$time.md5, like: myimg_22Feb16-032304.md5
#***Restore***
# (1) Restore an image to multiple disks
# (2) Label a sequential names for all the partitions on the restored destination disks, like my-image_01p1, my-image_01p2 for disk /dev/sda1, and /dev/sda2, respectively."
# (3) The inspection results for all the regular files in a partition will be put in /home/partimag/, and another copy in the restored partition. Its file name format: ${image_name}_${label}_${checksum}_results.txt, like myimg_Tiger_01p1_md5_results.txt
#***Check***
# The inspection results for all the regular files in a partition will be put in /home/partimag/, and another copy in the restored partition. Its file name format: ${image_name}_${label}_${checksum}_results.txt, like myimg_Tiger_01p1_md5_results.txt
#***Check-then-label***
# do all tasks as restore mode, except restore the image.

#
DRBL_SCRIPT_PATH="${DRBL_SCRIPT_PATH:-/usr/share/drbl}"
. $DRBL_SCRIPT_PATH/sbin/drbl-conf-functions
. /etc/drbl/drbl-ocs.conf
. $DRBL_SCRIPT_PATH/sbin/ocs-functions

# Load the config in ocs-live.conf. This is specially for Clonezilla live. It will overwrite some settings of /etc/drbl/drbl-ocs.conf, such as $DIA...
[ -e "/etc/ocs/ocs-live.conf" ] && . /etc/ocs/ocs-live.conf
# Settings
ocs_batch_mode="off"
# For saving mode, default to turn on TUI.
nogui="off"   
# Initial number for labeling the disk, default is from 1, e.g. disk01, disk02
initial_no_def="1"
ocs_parallel_mode="yes"
resize="yes"

# Functions
USAGE() {
  echo "$ocs - To save, restore or check disk with checksum mechanism enabled"
  echo "Usage:"
  echo "To run $ocs:"
  echo "$ocs [OPTION] MODE IMAGE_NAME DEVICE"
  echo "Options:"
  echo "-b, --batch-mode   Run image checking in batch mode"
  echo "-i, --initial-no NO  Set the initial number for the label, and it is appended to the prefix assigned by option -p or --label-prefix. By default the initial number is set as $initial_no_def. e.g. my-image_01, my-image_02..."
  echo "-nogui, --nogui    Do not show GUI (TUI) of Partclone or Partimage, use text only. In this program, only works for saving mode, not restoring mode because for multiple disks deployment, TUI is always off."
  echo "-n, --no-resize    Do not resize in the destination disk. Keep the size as that from source image. This implies the options '-k1 -r -icds' will not be used for clonezilla's program ocs-sr."
  echo "-r, --no-parallel  Do not run the checksum inspection in parallel. By default the inspection for all partitions in a disk will be run in parallel. Maybe it's not a good idea to run in parallel if too many partitions so it might casue too many I/Os then less effiency."
  echo "-p, --label-prefix PREFIX  Set the label prefix for the destination partitions when restoring. This is only for modes 'restore' and 'check-then-label', and it will be used to create a sequential label names for all the partitions on destination disks, like my-image_01p1, my-image_01p2 for disk /dev/sda1, and /dev/sda2, respectively."
  echo "MODE is for saving, restoring, checking, labeling. Available: save, restore, check, check-then-label (or ctl)."
  echo "IMAGE_NAME is the image dir name, not absolute path"
  echo "DEVICE is the device name, e.g. sda, sda... When MODE is 'save', only one disk is allowed. While when MODE is 'restore', more than one disks are accetable."
  echo "If IMAGE_NAME and DEVICE are not assigned. An dialog menu will be shown to allow inputing or choosing."
  echo "Ex:"
  echo "To save disk /dev/sda as the image \"my-image\" with checksum for all files generated, run"
  echo "   $ocs save my-image sda"
  echo "To restore the image \"my-image\" to disks /dev/sda, /dev/sdb and inspect the checksum for all files. Also label the destination partition with prefix 'Tiger', run"
  echo "   $ocs -p Tiger_ restore my-image sda sdb"
  echo "To inspect the checksum file in the image \"my-image\" to the files in disks /dev/sda, /dev/sdb, run"
  echo "   $ocs check my-image sda sdb"
  echo
} # end of USAGE
do_save_mode_ask_image_dev_if_required() {
  # output: img_name, disk
  if [ "$img_name" = "ask_user" ]; then
    get_target_dir_name_when_saving  # get $target_dir
    img_name="$target_dir"
  fi
  if [ "$disk" = "ask_user" ]; then
    # To get $target_hd
    get_target_hd_name_from_local_machine "$msg_local_source_disk \n$msg_linux_disk_naming $msg_press_space_to_mark_selection"
    disk="$(select_VG "$target_hd")"
  fi
} # end of do_save_mode_ask_image_dev_if_required
#
do_restore_or_check_mode_ask_image_dev_if_required() {
  # output: img_name, disk
  if [ "$img_name" = "ask_user" ]; then
    get_target_dir_name_when_checking_img_checksum # output: target_dir
    img_name="$target_dir"
  fi
  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
  echo "$msg_the_image_to_be_cheked: $img_name"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  
  if [ "$disk" = "ask_user" ]; then
    # To get $target_hd
    get_target_hd_name_from_local_machine "$msg_local_source_disk \n$msg_linux_disk_naming $msg_press_space_to_mark_selection"
    disk="$(select_VG "$target_hd")"
  elif [ "$disk" = "all" ]; then
    get_not_busy_disks_or_parts harddisk "" ""  # we will get dev_list
    disk="$dev_list"
  fi
} # end of do_restore_or_check_mode_ask_image_dev_if_required
#
do_save_mode_check() {
  echo "Checking input parameters for saving mode..."
  if [ -z "$disk" ]; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "No source disk is assigned."
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    echo "$msg_program_stop!"
    USAGE
    exit 1
  elif [ "$(LC_ALL=C echo "$disk" | wc -w)" -ne 1 ]; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "Only one source disk is supported!"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    echo "$msg_program_stop!"
    USAGE
    exit 1
  elif [ -z "$(LC_ALL=C grep -Ew "$disk" /proc/partitions)" ]; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "No destination disk $disk found on this system!"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    echo "Available disks and partitions on this system:"
    echo $msg_delimiter_star_line
    cat /proc/partitions
    echo $msg_delimiter_star_line
    echo "$msg_program_stop!"
    exit 1
  else
    if ! is_whole_disk $disk; then
      [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
      echo "Source disk $disk is not a disk."
      [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
      echo "$msg_program_stop!"
      exit 1
    fi
  fi 
  if [ -z "$img_name" ]; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "No image name is assigned."
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    echo "$msg_program_stop!"
    exit 1
  fi
} # end of do_save_mode_check
#
do_restore_or_check_mode_check() {
  # Check if image exists
  # Check if destination disk exists
  # Show warning if no part_label_prefix when mode is restore, but skip it when mode is check.
  if [ "$task_mode" = "restore" ]; then
    if [ -z "$part_label_prefix" ]; then
      [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
      echo "No label prefix for destination disk(s)."
      [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
      if [ "$ocs_batch_mode" != "on" ]; then
        echo -n "$msg_press_enter_to_continue..."
        read
      fi
    fi
  fi
  if [ ! -d "$ocsroot/$img_name" ]; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "No image $img_name found in $ocsroot!"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    echo "$msg_program_stop!"
    exit 1
  fi
  for idsk in $disk; do
    if [ -z "$(LC_ALL=C grep -Ew "$idsk" /proc/partitions)" ]; then
      [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
      echo "No destination disk \"$idsk\" found on this system!"
      [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
      echo "Available disks and partitions on this system:"
      echo $msg_delimiter_star_line
      cat /proc/partitions
      echo $msg_delimiter_star_line
      echo "$msg_program_stop!"
      exit 1
    fi
  done
} # end of do_restore_or_check_mode_check
#
do_mdisk_restore_task() {
  # (1) Deploy the image to multiple destination disks
  # (2) Label the destination partitions
  # (3) Put checksum results in image repository and destination disk.
  #     Format: ${image}_${part_label}_md5_results.txt (e.g. Speed_LA01p1_md5_results.txt
  local img="$1"
  local dest_dsk="$2"
  local tmpd_dest
  rm -f /var/log/*sum-results.log
  ocs-restore-mdisks $batch_opt -p "-g auto $resize_opt -e1 auto -e2 -nogui -j2 -cmf -scr -p true" $img $dest_dsk | tee -a /var/log/${ocs}.log
  for idsk in $dest_dsk; do 
    echo "Searching for data partition(s)..." | tee -a /var/log/${ocs}-${idsk}.log
    BACKUP_DEVS=""
    get_known_partition_proc_format $idsk data
    target_parts="$BACKUP_DEVS"
    # Strip the single white space which should be nothing. Thanks to Borksoft.
    target_parts="$(echo $target_parts | sed -e "s/^  *$//")"
    tmpd_dest="$(mktemp -d /tmp/tmpd_dest.XXXXXX)"
    trap "[ -d "$tmpd_dest" ] && umount $tmpd_dest &>/dev/null" HUP INT QUIT TERM EXIT
    for iprt in $target_parts; do
      pt="$(get_part_number "$iprt")"
      initial_no="$(LC_ALL=C printf "%.2u" $initial_no)"  # e.g. 2 -> 02
      part_label=${part_label_prefix}${initial_no}p${pt}
      echo "Labeling /dev/${idsk}${pt} as $part_label" | tee -a /var/log/${ocs}-${idsk}.log
      ocs-label-dev /dev/${idsk}${pt} $part_label | tee -a /var/log/${ocs}-${idsk}.log

      # Find the checksum 
      # Output for get_chksum_info_from_img: chksum_cmd, chksum_file
      get_chksum_info_from_img "$ocsroot/$img" "*" 
      if [ -z "$chksum_cmd" ]; then
        [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
        echo "No any checksum file for files in /dev/$iprt was found in image dir $ocsroot/$img." | tee --append ${OCS_LOGFILE}
        echo "No way to copy checksum to $ocsroot and /dev/$iprt." | tee --append ${OCS_LOGFILE}
        [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
        continue
      fi
  
      if [ -e "/var/log/${iprt}-${chksum_cmd}-results.log" ]; then
        cp /var/log/${iprt}-${chksum_cmd}-results.log $ocsroot/${img}_${part_label}_md5_results.txt 2>&1 | tee -a /var/log/${ocs}-${idsk}.log
        mount /dev/$iprt $tmpd_dest | tee -a /var/log/${ocs}-${idsk}.log
        cp /var/log/${iprt}-${chksum_cmd}-results.log $tmpd_dest/${img}_${part_label}_md5_results.txt 2>&1 | tee -a /var/log/${ocs}-${idsk}.log
        umount /dev/$iprt | tee -a /var/log/${ocs}-${idsk}.log
      else
        fs="$(LC_ALL=C ocs-get-part-info /dev/${iprt} fs)"
        [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
        echo "File /var/log/${iprt}-${chksum_cmd}-results.log not found." | tee -a /var/log/${ocs}-${idsk}.log
        [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
	echo "Maybe the file system \"$fs\" in ${iprt} is not supported by Linux kernel?" | tee -a /var/log/${ocs}-${idsk}.log
      fi
      initial_no="$(echo "scale=0; $initial_no + 1" | bc)"
    done
    if [ -d "$tmpd_dest" -a "$(echo "$tmpd_dest" | grep -E /tmp/tmpd_dest\.)" ]; then
      rm -rf $tmpd_dest
    fi
  done
} # end of do_mdisk_restore_task
#
do_mdisk_checksum_match_task() {
  # (1) Inspect the checksum for destination disks.
  # (2) Put checksum results in image repository and destination disk.
  #     Format: ${image}_${part_label}_md5_results.txt (e.g. Speed_LA01p1_md5_results.txt
  local img="$1"
  local dest_dsk="$2"
  local tmpd_dest LABEL
  rm -f /var/log/*sum-results.log
  ocs-match-checksum $parallel_opt $img $dest_dsk | tee -a /var/log/${ocs}.log
  for idsk in $dest_dsk; do 
    echo "Searching for data partition(s)..." | tee -a /var/log/${ocs}-${idsk}.log
    BACKUP_DEVS=""
    get_known_partition_proc_format $idsk data
    target_parts="$BACKUP_DEVS"
    # Strip the single white space which should be nothing. Thanks to Borksoft.
    target_parts="$(echo $target_parts | sed -e "s/^  *$//")"
    tmpd_dest="$(mktemp -d /tmp/tmpd_dest.XXXXXX)"
    trap "[ -d "$tmpd_dest" ] && umount $tmpd_dest &>/dev/null" HUP INT QUIT TERM EXIT
    for iprt in $target_parts; do
      # Obtain the label
      LC_ALL=C blkid -o export /dev/$iprt > $tmpd_dest/blkid_output
      LABEL=""
      . $tmpd_dest/blkid_output  # Obtain "$LABEL"
  
      # Find the checksum
      # Output for get_chksum_info_from_img: chksum_cmd, chksum_file
      get_chksum_info_from_img "$ocsroot/$img" "*" 
      if [ -z "$chksum_cmd" ]; then
        [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
        echo "No any checksum file for files in /dev/$iprt was found in image dir $ocsroot/$img." | tee --append ${OCS_LOGFILE}
        echo "No way to copy checksum to $ocsroot and /dev/$iprt." | tee --append ${OCS_LOGFILE}
        [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
        continue
      fi
      if [ -e "/var/log/${iprt}-${chksum_cmd}-results.log" ]; then
        cp /var/log/${iprt}-${chksum_cmd}-results.log $ocsroot/${img}_${LABEL}_md5_results.txt 2>&1 | tee -a /var/log/${ocs}-${idsk}.log
        mount /dev/$iprt $tmpd_dest | tee -a /var/log/${ocs}-${idsk}.log
        cp /var/log/${iprt}-${chksum_cmd}-results.log $tmpd_dest/${img}_${LABEL}_md5_results.txt 2>&1 | tee -a /var/log/${ocs}-${idsk}.log
        umount /dev/$iprt | tee -a /var/log/${ocs}-${idsk}.log
      else
        fs="$(LC_ALL=C ocs-get-part-info /dev/${iprt} fs)"
        [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
        echo "File /var/log/${iprt}-${chksum_cmd}-results.log not found." | tee -a /var/log/${ocs}-${idsk}.log
        [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
	echo "Maybe the file system \"$fs\" in /dev/${iprt} is not supported by Linux kernel? Or there are no any regular files in /dev/${iprt}?" | tee -a /var/log/${ocs}-${idsk}.log
      fi
    done
    if [ -d "$tmpd_dest" -a "$(echo "$tmpd_dest" | grep -E /tmp/tmpd_dest\.)" ]; then
      rm -rf $tmpd_dest
    fi
  done
} # end of do_mdisk_checksum_match_task
#
do_mdisk_checksum_match_and_label_task() {
  # (1) Inspect the checksum for destination disks.
  # (2) Label the destination partitions
  # (3) Put checksum result in image repository and destination disk.
  #     Format: ${image}_${part_label}_md5_results.txt (e.g. Speed_LA01p1_md5_results.txt
  local img="$1"
  local dest_dsk="$2"
  local tmpd_dest LABEL
  rm -f /var/log/*sum-results.log
  ocs-match-checksum $parallel_opt $img $dest_dsk | tee -a /var/log/${ocs}.log
  for idsk in $dest_dsk; do 
    echo "Searching for data partition(s)..." | tee -a /var/log/${ocs}-${idsk}.log
    BACKUP_DEVS=""
    get_known_partition_proc_format $idsk data
    target_parts="$BACKUP_DEVS"
    # Strip the single white space which should be nothing. Thanks to Borksoft.
    target_parts="$(echo $target_parts | sed -e "s/^  *$//")"
    tmpd_dest="$(mktemp -d /tmp/tmpd_dest.XXXXXX)"
    trap "[ -d "$tmpd_dest" ] && umount $tmpd_dest &>/dev/null" HUP INT QUIT TERM EXIT
    for iprt in $target_parts; do
      pt="$(get_part_number "$iprt")"
      initial_no="$(LC_ALL=C printf "%.2u" $initial_no)"  # e.g. 2 -> 02
      part_label=${part_label_prefix}${initial_no}p${pt}
      echo "Labeling /dev/${idsk}${pt} as $part_label" | tee -a /var/log/${ocs}-${idsk}.log
      ocs-label-dev /dev/${idsk}${pt} $part_label | tee -a /var/log/${ocs}-${idsk}.log
  
      # Find the checksum
      # Output for get_chksum_info_from_img: chksum_cmd, chksum_file
      get_chksum_info_from_img "$ocsroot/$img" "*" 
      if [ -z "$chksum_cmd" ]; then
        [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
        echo "No any checksum file for files in /dev/$iprt was found in image dir $ocsroot/$img." | tee --append ${OCS_LOGFILE}
        echo "No way to copy checksum to $ocsroot and /dev/$iprt." | tee --append ${OCS_LOGFILE}
        [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
        continue
      fi
      if [ -e "/var/log/${iprt}-${chksum_cmd}-results.log" ]; then
        cp /var/log/${iprt}-${chksum_cmd}-results.log $ocsroot/${img}_${part_label}_md5_results.txt 2>&1 | tee -a /var/log/${ocs}-${idsk}.log
        mount /dev/$iprt $tmpd_dest | tee -a /var/log/${ocs}-${idsk}.log
        cp /var/log/${iprt}-${chksum_cmd}-results.log $tmpd_dest/${img}_${part_label}_md5_results.txt 2>&1 | tee -a /var/log/${ocs}-${idsk}.log
        umount /dev/$iprt | tee -a /var/log/${ocs}-${idsk}.log
      else
        fs="$(LC_ALL=C ocs-get-part-info /dev/${iprt} fs)"
        [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
        echo "File /var/log/${iprt}-${chksum_cmd}-results.log not found." | tee -a /var/log/${ocs}-${idsk}.log
        [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
	echo "Maybe the file system \"$fs\" in /dev/${iprt} is not supported by Linux kernel? Or there are no any regular files in /dev/${iprt}?" | tee -a /var/log/${ocs}-${idsk}.log
      fi
      initial_no="$(echo "scale=0; $initial_no + 1" | bc)"
    done
    if [ -d "$tmpd_dest" -a "$(echo "$tmpd_dest" | grep -E /tmp/tmpd_dest\.)" ]; then
      rm -rf $tmpd_dest
    fi
  done
} # end of do_mdisk_checksum_match_and_label_task
#
do_mdisk_save_task() {
  # (1) Save the image from source device
  # (2) Put checksum file in image repository.
  #     File name format: $image_name-$time (e.g. HOWL_09Oct15-171023.md5)
  #     Merge them to one file if more than one checksum files exist.
  local img="$1"
  local src_dsk="$2"
  # (1) Save the disk as image
  ocs-sr -q2 $batch_opt $nogui_opt -j2 -gmf -z1p -i 4096 -p true savedisk $img $src_dsk
  #
  time_now="$(LC_ALL=C date +%d%b%y-%H%M%S)"
  rm -f $ocsroot/${img}-${time_now}.md5
  echo "Preparing checksum file $ocsroot/${img}_${time_now}.md5... "
  for ifile in $ocsroot/$img/*sum.info.gz; do
    [ ! -e "$ifile" ] && continue
    # checksum file
    # Clean the temp mount point in checksum file.
    sum_part_tmpd="$(LC_ALL=C zcat $ifile | head -n 1 | awk -F" " '{print $2}' | grep -E -o "/tmp/chksum_tmpd.[[:alnum:]]{6}")"
    if [ -n "$sum_part_tmpd" ]; then
      zcat $ifile | perl -p -e "s|$sum_part_tmpd|CHKSUM_TMPD|g" >> $ocsroot/${img}_${time_now}.md5
    fi
  done
  echo "done!"
} # end of do_mdisk_save_task
#
show_unknown_mode_then_exit() {
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo "Unknown mode \"$task_mode\". Only 'save' or 'restore' is supported."
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo "$msg_program_stop!"
  USAGE
  exit 1
} # end of show_unknown_mode_then_exit

################
##### Main #####
################
ocs_file="$0"
ocs=`basename $ocs_file`
#
while [ $# -gt 0 ]; do
 case "$1" in
   -b|--batch) ocs_batch_mode="on"; shift;;
   -i|--initial-no)
           # overwrite the ocsroot in drbl.conf
           shift; 
           if [ -z "$(echo $1 |grep ^-.)" ]; then
             # skip the -xx option, in case 
             initial_no="$1"
             shift;
           fi
           [ -z "$initial_no" ] && USAGE && exit 1
           ;;
   -nogui|--nogui) nogui="on"; shift; ;;
   -r|--no-parallel)  ocs_parallel_mode="no"; shift;;
   -n|--no-resize) resize="no"; shift;;
   -p|--label-prefix)
           # overwrite the ocsroot in drbl.conf
           shift; 
           if [ -z "$(echo $1 |grep ^-.)" ]; then
             # skip the -xx option, in case 
             part_label_prefix="$1"
             shift;
           fi
           [ -z "$part_label_prefix" ] && USAGE && exit 1
           ;;
   -*)     echo "${0}: ${1}: invalid option" >&2
           USAGE >& 2
           exit 2 ;;
   *)      break ;;
 esac
done

task_mode="$1"
shift
img_name="$1"
shift
disk="$*"

#
check_if_root
ask_and_load_lang_set

#
case "$ocs_batch_mode" in
  on)  batch_opt="-b";;
  off) batch_opt="";;
esac
case "$nogui" in
  on)  nogui_opt="-nogui";;
  off) nogui_opt="";;
esac
case "$resize" in
  yes) resize_opt="-k1 -r -icds";;
  *)   resize_opt="";;
esac
case "$ocs_parallel_mode" in
  yes) parallel_opt="-p";;
  *)   parallel_opt="";;
esac
[ -z "$initial_no" ] && initial_no=$initial_no_def

# Check if initial_no a positive integer
if [ "${initial_no//[0-9]}" != "" ]; then
  # Natural number, i.e. positive integer
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo "Input initial number \"${initial_no}\" is not a positive integer!"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo "$msg_program_stop" | tee --append ${OCS_LOGFILE}
  exit 1
fi

if [ -z "$task_mode" ]; then
  show_unknown_mode_then_exit
else
  # Check the input
  case "$task_mode" in
    "save"|"restore"|"check"|"ctl"|"check-then-label") true;;
    *)  show_unknown_mode_then_exit;;
  esac
fi

# imagedir is a variable which ask_user related function need
imagedir="$ocsroot"
[ -z "$img_name" ] && img_name="ask_user"
[ -z "$disk" ] && disk="ask_user"

case "$task_mode" in
  save)    do_save_mode_ask_image_dev_if_required;;
  restore) do_restore_or_check_mode_ask_image_dev_if_required;;
  check)   do_restore_or_check_mode_ask_image_dev_if_required;;
  ctl|check-then-label)   
	   do_restore_or_check_mode_ask_image_dev_if_required;;
esac

# check if the device exists
ANS_TMP=`mktemp /tmp/ocs_chkdev.XXXXXX`
trap "[ -f "$ANS_TMP" ] && rm -f $ANS_TMP" HUP INT QUIT TERM EXIT
check_if_input_device_exist $ANS_TMP $disk 
disk="$(cat $ANS_TMP | tr -d \")"
[ -f "$ANS_TMP" ] && rm -f $ANS_TMP

# Do the real job
case "$task_mode" in
  save)    do_save_mode_check 
           do_mdisk_save_task "$img_name" "$disk"
	   ;;
  restore) do_restore_or_check_mode_check
           do_mdisk_restore_task "$img_name" "$disk"
	   ;;
  check)   do_restore_or_check_mode_check
           do_mdisk_checksum_match_task "$img_name" "$disk"
	   ;;
  ctl|check-then-label)   
	   do_restore_or_check_mode_check
           do_mdisk_checksum_match_and_label_task "$img_name" "$disk"
	   ;;
  *)       show_unknown_mode_then_exit
	   ;;
esac