--- /dev/null
+###############################################################################
+# #
+# IPFire.org - A linux based firewall #
+# Copyright (C) 2007-2013 IPFire Team <info@ipfire.org> #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+###############################################################################
+
+# Set histchars to an empty string so we are able to replace an
+# exclamation mark.
+histchars=
+
+echo "Scanning for possible destination drives"
+
+function _mount() {
+ local what=${1}
+
+ # Don't mount if the device does not exist.
+ [ -e "${what}" ] || return 1
+
+ mount ${what} /harddisk 2>/dev/null
+}
+
+function _umount() {
+ umount -l /harddisk 2>/dev/null
+}
+
+function check_source_drive() {
+ local device="/dev/${1}"
+
+ local ret=1
+ local dev
+ for dev in ${device} ${device}1; do
+ # Mount the device (if possible).
+ _mount ${dev} || continue
+
+ if [ -n "$(ls /harddisk/ipfire-*.tlz 2>/dev/null)" ]; then
+ ret=0
+ fi
+
+ _umount
+
+ # Stop if the device has been detected as a source drive.
+ [ "${ret}" = "0" ] && break
+ done
+
+ return ${ret}
+}
+
+for path in /sys/block/*; do
+ device=$(basename ${path})
+
+ # Skip devices which cannot be used.
+ case "${device}" in
+ # Virtual devices.
+ loop*|ram*)
+ continue
+ ;;
+ # Floppy.
+ fd*)
+ continue
+ ;;
+ # Cd/Tape.
+ sr*)
+ continue
+ ;;
+ esac
+
+ # Replace any exclamation marks (e.g. cciss!c0d0).
+ device_=${device//!/\/}
+
+ # Guess if this could be a raid device.
+ for dev in ${device_} ${device_}p1; do
+ if [ -e "/dev/${dev}" ]; then
+ device=${dev}
+ break
+ fi
+ done
+
+ # Check if user want skip by commandline
+ if [ "$(grep "skipdst=${device_}" /proc/cmdline)" ]; then
+ echo "${device_} was skipped via cmdline."
+ continue
+ fi
+
+ echo "Checking ${device_}"
+ if check_source_drive ${device_}; then
+ echo " is source drive - skipping"
+ continue
+ fi
+
+ device_size=$(cat /sys/block/${device}/size)
+ if [ "${device_size}" = "0" ]; then
+ echo " is empty - skipping"
+ continue
+ fi
+
+ # Found it.
+ echo " OK, this is it..."
+ echo -n "${device_}" > /tmp/dest_device
+
+ if [ ${device_size} -gt 0 ]; then
+ # Disk size to GiB.
+ device_size=$(( ${device_size} / 2097152 ))
+
+ # Build string with drive details
+ device_str="/dev/${device_} - ${device_size} GiB -"
+ else
+ device_str="/dev/${device_} -"
+ fi
+ device_str="${device_str} $(cat /sys/block/${device}/device/vendor)"
+ device_str="${device_str} $(cat /sys/block/${device}/device/model)"
+
+ # Remove all whitespace.
+ device_str=$(echo ${device_str})
+
+ echo -n "${device_str}" > /tmp/dest_device_info
+
+ # Exit code table:
+ # 1: sda
+ # 2: RAID
+ # 10: nothing found
+ case "${device_}" in
+ *p1|*c0d0)
+ exit 2
+ ;;
+ *)
+ exit 1
+ ;;
+ esac
+done
+
+# Nothing found.
+exit 10