Created
September 22, 2014 08:09
-
-
Save pramodbiradar89/9b6501a4c7a94edf1915 to your computer and use it in GitHub Desktop.
usr/share/rear/lib/global-functions.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# global-functions.sh | |
# | |
# global functions for Relax-and-Recover | |
# | |
# Relax-and-Recover 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 2 of the License, or | |
# (at your option) any later version. | |
# Relax-and-Recover 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 Relax-and-Recover; if not, write to the Free Software | |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
# | |
# | |
function read_and_strip_file () { | |
# extracts content from config files. In other words: strips the comments and new lines | |
if test -s "$1" ; then | |
sed -e '/^[[:space:]]/d;/^$/d;/^#/d' "$1" | |
fi | |
} | |
function is_numeric () { | |
# simple test if var is an integer | |
if expr $1 + 0 >/dev/null 2>&1 ; then | |
echo $1 | |
else | |
echo 0 | |
fi | |
} | |
###### | |
### Functions for dealing with URLs | |
###### | |
url_scheme() { | |
local url=$1 | |
local scheme=${url%%://*} | |
# rsync scheme does not have to start with rsync:// it can also be scp style | |
echo $scheme | grep -q ":" && echo rsync || echo $scheme | |
} | |
url_host() { | |
local url=$1 | |
local host=${url#*//} | |
echo ${host%%/*} | |
} | |
url_path() { | |
local url=$1 | |
local path=${url#*//} | |
echo /${path#*/} | |
} | |
backup_path() { | |
local scheme=$1 | |
local path=$2 | |
case $scheme in | |
(tape) # no path for tape required | |
path="" | |
;; | |
(file) # type file needs a local path (must be mounted by user) | |
path="$path/${NETFS_PREFIX}" | |
;; | |
(iso) | |
if [[ "$WORKFLOW" = "recover" ]]; then | |
# The backup is located inside the ISO mount point when we do a recover | |
path="${BUILD_DIR}/outputfs${path}" | |
else | |
# The backup will be located on the ISO temporary dir | |
path="${TMP_DIR}/isofs${path}" | |
fi | |
;; | |
(*) # nfs, cifs, usb, a.o. need a temporary mount-path | |
path="${BUILD_DIR}/outputfs/${NETFS_PREFIX}" | |
;; | |
esac | |
echo "$path" | |
} | |
output_path() { | |
local scheme=$1 | |
local path=$2 | |
case $scheme in | |
(tape) # no path for tape required | |
path="" | |
;; | |
(file) # type file needs a local path (must be mounted by user) | |
path="$path/${OUTPUT_PREFIX}" | |
;; | |
(*) # nfs, cifs, usb, a.o. need a temporary mount-path | |
path="${BUILD_DIR}/outputfs/${OUTPUT_PREFIX}" | |
;; | |
esac | |
echo "$path" | |
} | |
### Mount URL $1 at mountpoint $2[, with options $3] | |
mount_url() { | |
local url=$1 | |
local mountpoint=$2 | |
local defaultoptions="rw,noatime,nolock" | |
local options=${3:-"$defaultoptions"} | |
### Generate a mount command | |
local mount_cmd | |
case $(url_scheme $url) in | |
(tape|file|rsync|fish|ftp|ftps|hftp|http|https|sftp) | |
### Don't need to mount anything for these | |
return 0 | |
;; | |
(iso) | |
if [[ "$WORKFLOW" = "recover" ]]; then | |
mount_cmd="mount /dev/disk/by-label/${ISO_VOLID} $mountpoint" | |
else | |
return 0 | |
fi | |
;; | |
(var) | |
### The mount command is given by variable in the url host | |
local var=$(url_host $url) | |
mount_cmd="${!var} $mountpoint" | |
;; | |
(cifs) | |
if [ x"$options" = x"$defaultoptions" ];then | |
mount_cmd="mount $v -o $options,guest //$(url_host $url)$(url_path $url) $mountpoint" | |
else | |
mount_cmd="mount $v -o $options //$(url_host $url)$(url_path $url) $mountpoint" | |
fi | |
;; | |
(usb) | |
mount_cmd="mount $v -o $options $(url_path $url) $mountpoint" | |
;; | |
(sshfs) | |
mount_cmd="sshfs $(url_host $url):$(url_path $url) $mountpoint -o $options" | |
;; | |
(davfs) | |
mount_cmd="mount $v -t davfs http://$(url_host $url)$(url_path $url) $mountpoint" | |
;; | |
(*) | |
mount_cmd="mount $v -t $(url_scheme $url) -o $options $(url_host $url):$(url_path $url) $mountpoint" | |
;; | |
esac | |
Log "Mounting with '$mount_cmd'" | |
$mount_cmd >&2 | |
StopIfError "Mount command '$mount_cmd' failed." | |
AddExitTask "umount -f $v '$mountpoint' >&2" | |
return 0 | |
} | |
### Unmount url $1 at mountpoint $2 | |
umount_url() { | |
local url=$1 | |
local mountpoint=$2 | |
case $(url_scheme $url) in | |
(tape|file|rsync|fish|ftp|ftps|hftp|http|https|sftp) | |
### Don't need to umount anything for these | |
return 0 | |
;; | |
(iso) | |
if [[ "$WORKFLOW" != "recover" ]]; then | |
return 0 | |
fi | |
;; | |
(sshfs) | |
umount_cmd="fusermount -u $mountpoint" | |
;; | |
(davfs) | |
umount_cmd="umount $mountpoint" | |
# Wait for 3 sek. then remove the cache-dir /var/cache/davfs | |
sleep 30 | |
# ToDo: put in here the cache-dir from /etc/davfs2/davfs.conf | |
# and delete only the just used cache | |
#rm -rf /var/cache/davfs2/*<mountpoint-hash>* | |
rm -rf /var/cache/davfs2/*outputfs* | |
;; | |
(var) | |
local var=$(url_host $url) | |
umount_cmd="${!var} $mountpoint" | |
Log "Unmounting with '$umount_cmd'" | |
$umount_cmd | |
StopIfError "Unmounting failed." | |
RemoveExitTask "umount -f $v '$mountpoint' >&2" | |
return 0 | |
;; | |
esac | |
umount_mountpoint $mountpoint | |
StopIfError "Unmounting '$mountpoint' failed." | |
RemoveExitTask "umount -f $v '$mountpoint' >&2" | |
return 0 | |
} | |
### Unmount mountpoint $1 | |
umount_mountpoint() { | |
local mountpoint=$1 | |
### First, try a normal unmount, | |
Log "Unmounting '$mountpoint'" | |
umount $v $mountpoint >&2 | |
if [[ $? -eq 0 ]] ; then | |
return 0 | |
fi | |
### otherwise, try to kill all processes that opened files on the mount. | |
# TODO: actually implement this | |
### If that still fails, force unmount. | |
Log "Forced unmount of '$mountpoint'" | |
umount $v -f $mountpoint >&2 | |
if [[ $? -eq 0 ]] ; then | |
return 0 | |
fi | |
Log "Unmounting '$mountpoint' failed." | |
return 1 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# global-functions.sh | |
# | |
# global functions for Relax-and-Recover | |
# | |
# Relax-and-Recover 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 2 of the License, or | |
# (at your option) any later version. | |
# Relax-and-Recover 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 Relax-and-Recover; if not, write to the Free Software | |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
# | |
# | |
function read_and_strip_file () { | |
# extracts content from config files. In other words: strips the comments and new lines | |
if test -s "$1" ; then | |
sed -e '/^[[:space:]]/d;/^$/d;/^#/d' "$1" | |
fi | |
} | |
function is_numeric () { | |
# simple test if var is an integer | |
if expr $1 + 0 >/dev/null 2>&1 ; then | |
echo $1 | |
else | |
echo 0 | |
fi | |
} | |
###### | |
### Functions for dealing with URLs | |
###### | |
url_scheme() { | |
local url=$1 | |
local scheme=${url%%://*} | |
# rsync scheme does not have to start with rsync:// it can also be scp style | |
echo $scheme | grep -q ":" && echo rsync || echo $scheme | |
} | |
url_host() { | |
local url=$1 | |
local host=${url#*//} | |
echo ${host%%/*} | |
} | |
url_path() { | |
local url=$1 | |
local path=${url#*//} | |
echo /${path#*/} | |
} | |
backup_path() { | |
local scheme=$1 | |
local path=$2 | |
case $scheme in | |
(tape) # no path for tape required | |
path="" | |
;; | |
(file) # type file needs a local path (must be mounted by user) | |
path="$path/${NETFS_PREFIX}" | |
;; | |
(iso) | |
if [[ "$WORKFLOW" = "recover" ]]; then | |
# The backup is located inside the ISO mount point when we do a recover | |
path="${BUILD_DIR}/outputfs${path}" | |
else | |
# The backup will be located on the ISO temporary dir | |
path="${TMP_DIR}/isofs${path}" | |
fi | |
;; | |
(*) # nfs, cifs, usb, a.o. need a temporary mount-path | |
path="${BUILD_DIR}/outputfs/${NETFS_PREFIX}" | |
;; | |
esac | |
echo "$path" | |
} | |
output_path() { | |
local scheme=$1 | |
local path=$2 | |
case $scheme in | |
(tape) # no path for tape required | |
path="" | |
;; | |
(file) # type file needs a local path (must be mounted by user) | |
path="$path/${OUTPUT_PREFIX}" | |
;; | |
(*) # nfs, cifs, usb, a.o. need a temporary mount-path | |
path="${BUILD_DIR}/outputfs/${OUTPUT_PREFIX}" | |
;; | |
esac | |
echo "$path" | |
} | |
### Mount URL $1 at mountpoint $2[, with options $3] | |
mount_url() { | |
local url=$1 | |
local mountpoint=$2 | |
local defaultoptions="rw,noatime" | |
local options=${3:-"$defaultoptions"} | |
### Generate a mount command | |
local mount_cmd | |
case $(url_scheme $url) in | |
(tape|file|rsync|fish|ftp|ftps|hftp|http|https|sftp) | |
### Don't need to mount anything for these | |
return 0 | |
;; | |
(iso) | |
if [[ "$WORKFLOW" = "recover" ]]; then | |
mount_cmd="mount /dev/disk/by-label/${ISO_VOLID} $mountpoint" | |
else | |
return 0 | |
fi | |
;; | |
(var) | |
### The mount command is given by variable in the url host | |
local var=$(url_host $url) | |
mount_cmd="${!var} $mountpoint" | |
;; | |
(cifs) | |
if [ x"$options" = x"$defaultoptions" ];then | |
mount_cmd="mount $v -o $options,guest //$(url_host $url)$(url_path $url) $mountpoint" | |
else | |
mount_cmd="mount $v -o $options //$(url_host $url)$(url_path $url) $mountpoint" | |
fi | |
;; | |
(usb) | |
mount_cmd="mount $v -o $options $(url_path $url) $mountpoint" | |
;; | |
(sshfs) | |
mount_cmd="sshfs $(url_host $url):$(url_path $url) $mountpoint -o $options" | |
;; | |
(davfs) | |
mount_cmd="mount $v -t davfs http://$(url_host $url)$(url_path $url) $mountpoint" | |
;; | |
(*) | |
mount_cmd="mount $v -t $(url_scheme $url) -o $options $(url_host $url):$(url_path $url) $mountpoint" | |
;; | |
esac | |
Log "Mounting with '$mount_cmd'" | |
$mount_cmd >&2 | |
StopIfError "Mount command '$mount_cmd' failed." | |
AddExitTask "umount -f $v '$mountpoint' >&2" | |
return 0 | |
} | |
### Unmount url $1 at mountpoint $2 | |
umount_url() { | |
local url=$1 | |
local mountpoint=$2 | |
case $(url_scheme $url) in | |
(tape|file|rsync|fish|ftp|ftps|hftp|http|https|sftp) | |
### Don't need to umount anything for these | |
return 0 | |
;; | |
(iso) | |
if [[ "$WORKFLOW" != "recover" ]]; then | |
return 0 | |
fi | |
;; | |
(sshfs) | |
umount_cmd="fusermount -u $mountpoint" | |
;; | |
(davfs) | |
umount_cmd="umount $mountpoint" | |
# Wait for 3 sek. then remove the cache-dir /var/cache/davfs | |
sleep 30 | |
# ToDo: put in here the cache-dir from /etc/davfs2/davfs.conf | |
# and delete only the just used cache | |
#rm -rf /var/cache/davfs2/*<mountpoint-hash>* | |
rm -rf /var/cache/davfs2/*outputfs* | |
;; | |
(var) | |
local var=$(url_host $url) | |
umount_cmd="${!var} $mountpoint" | |
Log "Unmounting with '$umount_cmd'" | |
$umount_cmd | |
StopIfError "Unmounting failed." | |
RemoveExitTask "umount -f $v '$mountpoint' >&2" | |
return 0 | |
;; | |
esac | |
umount_mountpoint $mountpoint | |
StopIfError "Unmounting '$mountpoint' failed." | |
RemoveExitTask "umount -f $v '$mountpoint' >&2" | |
return 0 | |
} | |
### Unmount mountpoint $1 | |
umount_mountpoint() { | |
local mountpoint=$1 | |
### First, try a normal unmount, | |
Log "Unmounting '$mountpoint'" | |
umount $v $mountpoint >&2 | |
if [[ $? -eq 0 ]] ; then | |
return 0 | |
fi | |
### otherwise, try to kill all processes that opened files on the mount. | |
# TODO: actually implement this | |
### If that still fails, force unmount. | |
Log "Forced unmount of '$mountpoint'" | |
umount $v -f $mountpoint >&2 | |
if [[ $? -eq 0 ]] ; then | |
return 0 | |
fi | |
Log "Unmounting '$mountpoint' failed." | |
return 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment