diff options
Diffstat (limited to 'xlators/mount/fuse/utils/mount.glusterfs.in')
| -rwxr-xr-x | xlators/mount/fuse/utils/mount.glusterfs.in | 721 |
1 files changed, 156 insertions, 565 deletions
diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index 4348533b1a2..bf43525ec00 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -1,19 +1,20 @@ -#!/bin/sh -# -# Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> -# Copyright (c) 2015 ungleich GmbH <http://www.ungleich.ch> -# -# This file is part of GlusterFS. -# -# This file is licensed to you under your choice of the GNU Lesser -# General Public License, version 3 or any later version (LGPLv3 or -# later), or the GNU General Public License, version 2 (GPLv2), in all -# cases as published by the Free Software Foundation. - -warn () -{ - echo "$@" >&2 -} +#!/bin/bash +# (C) 2006, 2007, 2008 Gluster Inc. <http://www.gluster.com> +# +# 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 2 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, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301 USA _init () { @@ -22,626 +23,216 @@ _init () LOG_CRITICAL=CRITICAL; LOG_ERROR=ERROR; LOG_WARNING=WARNING; - LOG_INFO=INFO + LOG_NORMAL=NORMAL LOG_DEBUG=DEBUG; LOG_TRACE=TRACE; - HOST_NAME_MAX=64; - + # set default log level to NORMAL + log_level=$LOG_NORMAL; prefix="@prefix@"; exec_prefix=@exec_prefix@; cmd_line=$(echo "@sbindir@/glusterfs"); - - # check whether getfattr exists - export PATH - getfattr=$(which getfattr 2>/dev/null); - if [ $? -ne 0 ]; then - warn "WARNING: getfattr not found, certain checks will be skipped.." - fi - - mounttab=/proc/mounts - uname_s=`uname -s` - case ${uname_s} in - NetBSD) - getinode="stat -f %i" - getdev="stat -f %d" - lgetinode="${getinode} -L" - lgetdev="${getdev} -L" - ;; - Linux) - getinode="stat -c %i" - getdev="stat -c %d" - lgetinode="${getinode} -L" - lgetdev="${getdev} -L" - ;; - esac - - UPDATEDBCONF=/etc/updatedb.conf -} - -is_valid_hostname () -{ - local server=$1 - - length=$(echo $server | wc -c) - if [ ${length} -gt ${HOST_NAME_MAX} ]; then - return 1 - fi -} - -parse_backup_volfile_servers () -{ - local server_list=$1 - local servers="" - local new_servers="" - - servers=$(echo ${server_list} | sed 's/\:/ /g') - for server in ${servers}; do - is_valid_hostname ${server} - if [ $? -eq 1 ]; then - continue - fi - new_servers=$(echo "${new_servers} ${server}") - done - - echo ${new_servers} -} - -parse_volfile_servers () -{ - local server_list=$1 - local servers="" - local new_servers="" - - servers=$(echo ${server_list} | sed 's/,/ /g') - for server in ${servers}; do - is_valid_hostname ${server} - if [ $? -eq 1 ]; then - continue - fi - new_servers=$(echo "${new_servers} ${server}") - done - - echo ${new_servers} } start_glusterfs () { if [ -n "$log_level_str" ]; then - case "$( echo $log_level_str | awk '{print toupper($0)}')" in - "ERROR") - log_level=$LOG_ERROR; - ;; - "INFO") - log_level=$LOG_INFO; - ;; - "DEBUG") - log_level=$LOG_DEBUG; - ;; - "CRITICAL") - log_level=$LOG_CRITICAL; - ;; - "WARNING") - log_level=$LOG_WARNING; + case "$log_level_str" in + "ERROR") + log_level=$LOG_ERROR; + ;; + "NORMAL") + log_level=$LOG_NORMAL ;; - "TRACE") - log_level=$LOG_TRACE; - ;; - "NONE") - log_level=$LOG_NONE; - ;; - *) - warn "invalid log level $log_level_str, using INFO"; - log_level=$LOG_INFO; - ;; - esac - fi - - # options without values start here - if [ -n "$read_only" ]; then - cmd_line=$(echo "$cmd_line --read-only"); - fi - - if [ -n "$acl" ]; then - cmd_line=$(echo "$cmd_line --acl"); - fi - - if [ -n "$selinux" ]; then - cmd_line=$(echo "$cmd_line --selinux"); - fi - - if [ -n "$enable_ino32" ]; then - cmd_line=$(echo "$cmd_line --enable-ino32"); - fi - - if [ -n "$worm" ]; then - cmd_line=$(echo "$cmd_line --worm"); - fi - if [ -n "$volfile_max_fetch_attempts" ]; then - cmd_line=$(echo "$cmd_line --volfile-max-fetch-attempts=$volfile_max_fetch_attempts") - fi - - if [ -n "$fopen_keep_cache" ]; then - cmd_line=$(echo "$cmd_line --fopen-keep-cache"); + "DEBUG") + log_level=$LOG_DEBUG; + ;; + "CRITICAL") + log_level=$LOG_CRITICAL; + ;; + "WARNING") + log_level=$LOG_WARNING; + ;; + "TRACE") + log_level=$LOG_TRACE; + ;; + "NONE") + log_level=$LOG_NONE; + ;; + *) + echo "invalid log level $log_level_str, using NORMAL"; + log_level=$LOG_NORMAL; + ;; + esac + fi + cmd_line=$(echo "$cmd_line --log-level=$log_level"); + + if [ -n "$log_file" ]; then + cmd_line=$(echo "$cmd_line --log-file=$log_file"); fi if [ -n "$volfile_check" ]; then - cmd_line=$(echo "$cmd_line --volfile-check"); - fi - - if [ -n "$mem_accounting" ]; then - cmd_line=$(echo "$cmd_line --mem-accounting"); - fi - - if [ -n "$aux_gfid_mount" ]; then - cmd_line=$(echo "$cmd_line --aux-gfid-mount"); - fi - - if [ -n "$no_root_squash" ]; then - cmd_line=$(echo "$cmd_line --no-root-squash"); - fi - -#options with values start here - if [ -n "$log_level" ]; then - cmd_line=$(echo "$cmd_line --log-level=$log_level"); - fi - - if [ -n "$log_file" ]; then - cmd_line=$(echo "$cmd_line --log-file=$log_file"); + cmd_line=$(echo "$cmd_line --volfile-check"); fi if [ -n "$direct_io_mode" ]; then - cmd_line=$(echo "$cmd_line --direct-io-mode=$direct_io_mode"); - fi - - if [ -n "$use_readdirp" ]; then - cmd_line=$(echo "$cmd_line --use-readdirp=$use_readdirp"); + cmd_line=$(echo "$cmd_line --disable-direct-io-mode"); fi if [ -n "$volume_name" ]; then cmd_line=$(echo "$cmd_line --volume-name=$volume_name"); fi - - if [ -n "$attribute_timeout" ]; then - cmd_line=$(echo "$cmd_line --attribute-timeout=$attribute_timeout"); - fi - - if [ -n "$entry_timeout" ]; then - cmd_line=$(echo "$cmd_line --entry-timeout=$entry_timeout"); - fi - - if [ -n "$negative_timeout" ]; then - cmd_line=$(echo "$cmd_line --negative-timeout=$negative_timeout"); - fi - - if [ -n "$gid_timeout" ]; then - cmd_line=$(echo "$cmd_line --gid-timeout=$gid_timeout"); - fi - - if [ -n "$bg_qlen" ]; then - cmd_line=$(echo "$cmd_line --background-qlen=$bg_qlen"); - fi - - if [ -n "$cong_threshold" ]; then - cmd_line=$(echo "$cmd_line --congestion-threshold=$cong_threshold"); - fi - - if [ -n "$fuse_mountopts" ]; then - cmd_line=$(echo "$cmd_line --fuse-mountopts=$fuse_mountopts"); - fi - - if [ -n "$xlator_option" ]; then - cmd_line=$(echo "$cmd_line --xlator-option=$xlator_option"); + + if [ -n "$log_server" ]; then + if [ -n "$log_server_port" ]; then + cmd_line=$(echo "$cmd_line \ +--log-server=$log_server \ +--log-server-port=$log_server_port"); + fi fi - # if trasnport type is specified, we have to append it to - # volume name, so that it fetches the right client vol file - if [ -z "$volfile_loc" ]; then if [ -n "$server_ip" ]; then - - servers=$(parse_volfile_servers ${server_ip}); - if [ -n "$servers" ]; then - for i in $(echo ${servers}); do - cmd_line=$(echo "$cmd_line --volfile-server=$i"); - done - else - warn "ERROR: No valid servers found on command line.. exiting" - print_usage - exit 1 - fi - - if [ -n "$backupvolfile_server" ]; then - if [ -z "$backup_volfile_servers" ]; then - is_valid_hostname ${backupvolfile_server}; - if [ $? -eq 1 ]; then - warn "ERROR: Invalid backup server specified.. exiting" - exit 1 - fi - cmd_line=$(echo "$cmd_line --volfile-server=$backupvolfile_server"); - fi + cmd_line=$(echo "$cmd_line --volfile-server-port=$server_port"); + if [ -n "$transport" ]; then + cmd_line=$(echo "$cmd_line --volfile-server-transport=$transport"); fi - - if [ -n "$backup_volfile_servers" ]; then - backup_servers=$(parse_backup_volfile_servers ${backup_volfile_servers}) - for i in $(echo ${backup_servers}); do - cmd_line=$(echo "$cmd_line --volfile-server=$i"); - done + if [ -n "$volume_id" ]; then + cmd_line=$(echo "$cmd_line --volfile-id=$volume_id"); fi - if [ -n "$server_port" ]; then - cmd_line=$(echo "$cmd_line --volfile-server-port=$server_port"); + if [ -n "$backupvolfile_server" ]; then + cmd_line1=$(echo "$cmd_line --volfile-server=$backupvolfile_server"); fi - if [ -n "$volume_id" ]; then - if [ -n "$transport" ]; then - volume_id="$volume_id.$transport"; - cmd_line=$(echo "$cmd_line --volfile-server-transport=$transport"); - fi - cmd_line=$(echo "$cmd_line --volfile-id=$volume_id"); - fi + cmd_line=$(echo "$cmd_line --volfile-server=$server_ip"); fi else cmd_line=$(echo "$cmd_line --volfile=$volfile_loc"); fi - - if [ -n "$fuse_mountopts" ]; then - cmd_line=$(echo "$cmd_line --fuse-mountopts=$fuse_mountopts"); - fi - + cmd_line=$(echo "$cmd_line $mount_point"); $cmd_line; - if [ $? -ne 0 ]; then - warn "Mount failed. Please check the log file for more details." - exit 1; - fi - - inode=$( ${getinode} $mount_point 2>/dev/null); - # this is required if the stat returns error - if [ $? -ne 0 ]; then - warn "Mount failed. Please check the log file for more details." - umount $mount_point > /dev/null 2>&1; - exit 1; + # retry the failover + if [ $? != "0" ]; then + if [ -n "$cmd_line1" ]; then + cmd_line1=$(echo "$cmd_line1 $mount_point"); + $cmd_line1 + fi fi -} -print_usage () -{ -cat << EOF -Usage: $0 <volumeserver>:<volumeid/volumeport> -o<options> <mountpoint> -Options: -man 8 $0 -To display the version number of the mount helper: $0 -V -EOF } -# check for recursive mounts. i.e, mounting over an existing brick -check_recursive_mount () +usage () { - if [ $1 = "/" ]; then - warn "Cannot mount over root"; - exit 2; - fi - # GFID check first - # remove trailing / from mount point - mnt_dir=${1%/}; +echo "Usage: mount.glusterfs <volumeserver>:<volumeid/volumeport> -o <options> <mountpoint> +Options: +man 8 mount.glusterfs - if [ -n "${getfattr}" ]; then - ${getfattr} -n trusted.gfid $mnt_dir 2>/dev/null | grep -iq "trusted.gfid="; - if [ $? -eq 0 ]; then - warn "ERROR: $mnt_dir is in use as a brick of a gluster volume"; - exit 2; - fi - fi +To display the version number of the mount helper: +mount.glusterfs --version" - # check if the mount point is a brick's parent directory - GLUSTERD_WORKDIR="@GLUSTERD_WORKDIR@"; +} - ls -L "${GLUSTERD_WORKDIR}"/vols/*/bricks/* > /dev/null 2>&1; - if [ $? -ne 0 ]; then - return; - fi +main () +{ + helper=$(echo "$@" | sed -n 's/.*\--[ ]*\([^ ]*\).*/\1/p'); - brick_path=`grep ^path "$GLUSTERD_WORKDIR"/vols/*/bricks/* 2>/dev/null | cut -d "=" -f 2`; - root_inode=`${lgetinode} /`; - root_dev=`${lgetdev} /`; - mnt_inode=`${lgetinode} $mnt_dir`; - mnt_dev=`${lgetdev} $mnt_dir`; - for brick in "$brick_path"; do - # evaluate brick path to see if this is local, if non-local, skip iteration - ls $brick > /dev/null 2>&1; - if [ $? -ne 0 ]; then - continue; - fi + options=$(echo "$@" | sed -n 's/.*\-o[ ]*\([^ ]*\).*/\1/p'); - if [ -n "${getfattr}" ]; then - ${getfattr} -n trusted.gfid "$brick" 2>/dev/null | grep -iq "trusted.gfid="; - if [ $? -eq 0 ]; then - # brick is local - while [ 1 ]; do - tmp_brick="$brick"; - brick="$brick"/..; - brick_dev=`${lgetdev} $brick`; - brick_inode=`${lgetinode} $brick`; - if [ "$mnt_inode" -eq "$brick_inode" \ - -a "$mnt_dev" -eq "$brick_dev" ]; then - warn "ERROR: ${mnt_dir} is a parent of the brick ${tmp_brick}"; - exit 2; - fi - [ "$root_inode" -ne "$brick_inode" \ - -o "$root_dev" -ne "$brick_dev" ] || break; - done; - else - continue; - fi - else - continue; - fi - done; -} + new_log_level=$(echo "$options" | sed -n 's/.*log-level=\([^,]*\).*/\1/p'); + + [ -n "$new_log_level" ] && { + log_level_str="$new_log_level"; + } -with_options() -{ - local key=$1 - local value=$2 - - # Handle options with values. - case "$key" in - "log-level") - log_level_str=$value - ;; - "log-file") - log_file=$value - ;; - "transport") - transport=$value - ;; - "direct-io-mode") - direct_io_mode=$value - ;; - "volume-name") - volume_name=$value - ;; - "volume-id") - volume_id=$value - ;; - "volfile-check") - volfile_check=$value - ;; - "server-port") - server_port=$value - ;; - "attribute-timeout") - attribute_timeout=$value - ;; - "entry-timeout") - entry_timeout=$value - ;; - "negative-timeout") - negative_timeout=$value - ;; - "gid-timeout") - gid_timeout=$value - ;; - "background-qlen") - bg_qlen=$value - ;; - "backup-volfile-servers") - backup_volfile_servers=$value - ;; - "backupvolfile-server") - backupvolfile_server=$value - ;; - "fetch-attempts") - volfile_max_fetch_attempts=$value - ;; - "congestion-threshold") - cong_threshold=$value - ;; - "xlator-option") - xlator_option=$value - ;; - "fuse-mountopts") - fuse_mountopts=$value - ;; - "use-readdirp") - use_readdirp=$value - ;; - "no-root-squash") - if [ $value = "yes" ] || - [ $value = "on" ] || - [ $value = "enable" ] || - [ $value = "true" ] ; then - no_root_squash=1; - fi ;; - "root-squash") - if [ $value = "no" ] || - [ $value = "off" ] || - [ $value = "disable" ] || - [ $value = "false" ] ; then - no_root_squash=1; - fi ;; - *) - warn "Invalid option: $key" - exit 1 - ;; - esac -} + log_file=$(echo "$options" | sed -n 's/.*log-file=\([^,]*\).*/\1/p'); -without_options() -{ - local option=$1 - # Handle options without values. - case "$option" in - "ro") - read_only=1 - ;; - "acl") - acl=1 - ;; - "selinux") - selinux=1 - ;; - "worm") - worm=1 - ;; - "fopen-keep-cache") - fopen_keep_cache=1 - ;; - "enable-ino32") - enable_ino32=1 - ;; - "mem-accounting") - mem_accounting=1 - ;; - "aux-gfid-mount") - if [ ${uname_s} = "Linux" ]; then - aux_gfid_mount=1 - fi - ;; - # "mount -t glusterfs" sends this, but it's useless. - "rw") - ;; - # these ones are interpreted during system initialization - "noauto") - ;; - "_netdev") - ;; - *) - warn "Invalid option $option"; - exit 1 - ;; - esac -} + transport=$(echo "$options" | sed -n 's/.*transport=\([^,]*\).*/\1/p'); -parse_options() -{ - local optarg=${1} - for pair in $(echo ${optarg}|sed 's/,/ /g'); do - key=$(echo "$pair" | cut -f1 -d'='); - value=$(echo "$pair" | cut -f2- -d'='); - if [ "$key" = "$value" ]; then - without_options $pair; - else - with_options $key $value; - fi - done -} + direct_io_mode=$(echo "$options" | sed -n 's/.*direct-io-mode=\([^,]*\).*/\1/p'); -update_updatedb() -{ - # Append fuse.glusterfs to PRUNEFS variable in updatedb.conf(5). - # updatedb(8) should not index files under GlusterFS, indexing - # GlusterFS is not necessary and should be avoided. - # Following code disables updatedb crawl on 'glusterfs' - test -f $UPDATEDBCONF && { - if ! grep -q 'glusterfs' $UPDATEDBCONF; then - sed 's/\(PRUNEFS.*\)"/\1 fuse.glusterfs"/' $UPDATEDBCONF \ - > ${UPDATEDBCONF}.bak - mv -f ${UPDATEDBCONF}.bak $UPDATEDBCONF - fi - } -} + volume_name=$(echo "$options" | sed -n 's/.*volume-name=\([^,]*\).*/\1/p'); -main () -{ - if [ "x${uname_s}" = "xLinux" ] ; then - volfile_loc=$1 - mount_point=$2 + volume_id=$(echo "$options" | sed -n 's/.*volume_id=\([^,]*\).*/\1/p'); - ## `mount` specifies options as a last argument - shift 2; - fi - while getopts "Vo:hn" opt; do - case "${opt}" in - o) - parse_options ${OPTARG}; - shift 2; - ;; - n) - shift 1; - ;; - V) - ${cmd_line} -V; - exit 0; - ;; - h) - print_usage; - exit 0; - ;; - ?) - print_usage; - exit 0; - ;; - esac - done + volfile_check=$(echo "$options" | sed -n 's/.*volfile-check=\([^,]*\).*/\1/p'); - if [ "x${uname_s}" = "xNetBSD" ] ; then - volfile_loc=$1 - mount_point=$2 - fi + server_port=$(echo "$options" | sed -n 's/.*server-port=\([^,]*\).*/\1/p'); + backupvolfile_server=$(echo "$options" | sed -n 's/.*backupvolfile-server=\([^,]*\).*/\1/p'); + log_server=$(echo "$options" | sed -n 's/.*log-server=\([^,]*\).*/\1/p'); + + log_server_port=$(echo "$options" | sed -n 's/.*log-server-port=\([^,]*\).*/\1/p'); + + volfile_loc="$1"; + [ -r "$volfile_loc" ] || { - server_ip=$(echo "$volfile_loc" | sed -n 's/\([a-zA-Z0-9:.\-]*\):.*/\1/p'); - volume_str=$(echo "$volfile_loc" | sed -n 's/.*:\([^ ]*\).*/\1/p'); - [ -n "$volume_str" ] && { - volume_id="$volume_str"; - } - volfile_loc=""; + server_ip=$(echo "$volfile_loc" | sed -n 's/\([^\:]*\).*/\1/p'); + test_str=$(echo "$volfile_loc" | sed -n 's/.*:\([^ ]*\).*/\1/p'); + [ -n "$test_str" ] && { + # Backward compatibility + test_str1=$(echo "$test_str" | sed -e 's/[0-9]//g'); + [ -n "$test_str1" ] && { + volume_id="$test_str"; + } || { + server_port=$test_str; + } + } + volfile_loc=""; } - [ -z "$volume_id" -o -z "$server_ip" ] && { - cat <<EOF >&2 -ERROR: Server name/volume name unspecified cannot proceed further.. -Please specify correct format -Usage: -man 8 $0 -EOF - exit 1; + [ -n "$server_port" ] || { + server_port="6996"; } - grep_ret=$(echo ${mount_point} | grep '^\-o'); - [ "x" != "x${grep_ret}" ] && { - cat <<EOF >&2 -ERROR: -o options cannot be specified in either first two arguments.. -Please specify correct style -Usage: -man 8 $0 -EOF - exit 1; + new_fs_options=$(echo "$options" | sed -e 's/[,]*log-file=[^,]*//' \ + -e 's/[,]*log-level=[^,]*//' \ + -e 's/[,]*volume-name=[^,]*//' \ + -e 's/[,]*direct-io-mode=[^,]*//' \ + -e 's/[,]*volfile-check=[^,]*//' \ + -e 's/[,]*transport=[^,]*//' \ + -e 's/[,]*backupvolfile-server=[^,]*//' \ + -e 's/[,]*server-port=[^,]*//' \ + -e 's/[,]*volume-id=[^,]*//' \ + -e 's/[,]*log-server=[^,]*//' \ + -e 's/[,]*log-server-port=[^,]*//'); + + # + [ -n "$helper" ] && { + cmd_line=$(echo "$cmd_line --$helper"); + exec $cmd_line; + exit 0; } - # No need to do a ! -d test, it is taken care while initializing the - # variable mount_point - [ -z "$mount_point" -o ! -d "$mount_point" ] && { - cat <<EOF >&2 -ERROR: Mount point does not exist -Please specify a mount point -Usage: -man 8 $0 -EOF - exit 1; + mount_point="" + for arg in "$@"; do + [ -d "$arg" ] && { + mount_point=$arg + } + done + + [ -z "$mount_point" ] && { + usage; + exit 0; } # Simple check to avoid multiple identical mounts - if grep -q "[[:space:]+]${mount_point}[[:space:]+]fuse" $mounttab; then - warn "$0: according to mtab, GlusterFS is already mounted on" \ - "$mount_point" - exit 32; + if grep -q " $mount_point fuse" /etc/mtab; then + echo -n "$0: according to mtab, GlusterFS is already mounted on " + echo "$mount_point" + sleep 1; + exit 0; fi - #Snapshot volumes are mounted read only - case $volume_id in - /snaps/* ) read_only=1 - esac - - check_recursive_mount "$mount_point"; - - update_updatedb; - + fs_options=$(echo "$fs_options,$new_fs_options"); + start_glusterfs; + + sleep 3; } _init "$@" && main "$@"; + |
