diff options
Diffstat (limited to 'xlators/mount')
| -rwxr-xr-x | xlators/mount/fuse/utils/mount.glusterfs.in | 527 | 
1 files changed, 321 insertions, 206 deletions
diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index bf89e9d528d..d5993618c5f 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -1,20 +1,12 @@ -#!/bin/sh -# (C) 2006, 2007, 2008 Gluster Inc. <http://www.gluster.com> +#!/bin/bash  # -# 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. +# Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> +# This file is part of GlusterFS.  # -# 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 +# 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.  _init ()  { @@ -33,28 +25,43 @@ _init ()      exec_prefix=@exec_prefix@;      cmd_line=$(echo "@sbindir@/glusterfs"); -    case `uname -s` in -    NetBSD) -        getinode="stat -f %i" -        getdev="stat -f %d" -        lgetinode="${getinode} -L" -        lgetdev="${getdev} -L" - -        mounttab=/proc/mounts -        ;; -    Linux) -        getinode="stat -c %i $i" -        getdev="stat -c %d $d" -        lgetinode="${getinode} -L" -        lgetdev="${getdev} -L" - -        mounttab=/etc/mtab -        ;; +    # check whether getfattr exists +    getfattr=$(which getfattr 2>/dev/null); +    if [ $? -ne 0 ]; then +        echo "WARNING: getfattr not found, certain checks will be skipped.." +    fi + +    alias lsL='ls -L' +    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 @@ -63,40 +70,43 @@ parse_backup_volfile_servers ()      servers=$(echo ${server_list} | sed 's/\:/ /g')      for server in ${servers}; do -        length=$(echo $server | wc -c) -        if [ ${length} -gt ${HOST_NAME_MAX} ]; then -            echo "Hostname:${server} provided is too long.. skipping" +        is_valid_hostname ${server} +        if [ $? -eq 1 ]; then              continue          fi -        new_servers=$(echo "$new_servers $server") +        new_servers=$(echo "${new_servers} ${server}")      done +      echo ${new_servers}  } -parse_backupvolfile_server () +parse_volfile_servers ()  { -    local server=$1 +    local server_list=$1 +    local servers="" +    local new_servers="" -    length=$(echo $server | wc -c) -    if [ ${length} -gt ${HOST_NAME_MAX} ]; then -       echo "Hostname:${server} provided is too long.. exiting" -       exit 1 -    fi +    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 ${server} +    echo ${new_servers}  }  start_glusterfs ()  { -    # lets the comparsion be case insensitive for all strings -      if [ -n "$log_level_str" ]; then -        case "$( echo $log_level_str | tr '[a-z]' '[A-Z]')" in +        case "$( echo $log_level_str | awk '{print toupper($0)}')" in              "ERROR")                  log_level=$LOG_ERROR;                  ;;              "INFO") -                log_level=$LOG_INFO +                log_level=$LOG_INFO;                  ;;              "DEBUG")                  log_level=$LOG_DEBUG; @@ -120,7 +130,7 @@ start_glusterfs ()          esac      fi -#options without values start here +    # options without values start here      if [ -n "$read_only" ]; then          cmd_line=$(echo "$cmd_line --read-only");      fi @@ -130,7 +140,7 @@ start_glusterfs ()      fi      if [ -n "$selinux" ]; then -        cmd_line=$(echo "$cmd_line --selinux"); +         cmd_line=$(echo "$cmd_line --selinux");      fi      if [ -n "$enable_ino32" ]; then @@ -157,7 +167,7 @@ start_glusterfs ()          cmd_line=$(echo "$cmd_line --aux-gfid-mount");      fi -#options with values start here +    # options with values start here      if [ -n "$log_level" ]; then          cmd_line=$(echo "$cmd_line --log-level=$log_level");      fi @@ -207,8 +217,7 @@ start_glusterfs ()      fi      if [ -n "$xlator_option" ]; then -        xlator_option=$(echo $xlator_option | sed s/"xlator-option="/"--xlator-option "/g) -        cmd_line=$(echo "$cmd_line $xlator_option"); +        cmd_line=$(echo "$cmd_line --xlator-option=$xlator_option");      fi      # for rdma volume, we have to fetch volfile with '.rdma' added @@ -218,18 +227,31 @@ start_glusterfs ()      if [ -z "$volfile_loc" ]; then          if  [ -n "$server_ip" ]; then -            cmd_line=$(echo "$cmd_line --volfile-server=$server_ip"); +            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 +                echo "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 -                    server=$(parse_backupvolfile_server ${backupvolfile_server}) -                    cmd_line=$(echo "$cmd_line --volfile-server=$server"); +                    is_valid_hostname ${backupvolfile_server}; +                    if [ $? -eq 1 ]; then +                        echo "ERROR: Invalid backup server specified.. exiting" +                        exit 1 +                    fi +                    cmd_line=$(echo "$cmd_line --volfile-server=$backupvolfile_server");                  fi              fi              if [ -n "$backup_volfile_servers" ]; then -                servers=$(parse_backup_volfile_servers ${backup_volfile_servers}) -                for i in $(echo ${servers}); do +                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              fi @@ -261,205 +283,307 @@ start_glusterfs ()      fi      cmd_line=$(echo "$cmd_line $mount_point"); -    err=0; -    $cmd_line; +    $cmd_line;      inode=$( ${getinode} $mount_point 2>/dev/null); -      # this is required if the stat returns error -    if [ -z "$inode" ]; then -        inode="0"; -    fi - -    if [ $inode -ne 1 ]; then -        err=1; -    fi - -    if [ $err -eq "1" ]; then -            echo "Mount failed. Please check the log file for more details." -            umount $mount_point > /dev/null 2>&1; -            exit 1; +    if [ $? -ne 0 ]; then +        echo "Mount failed. Please check the log file for more details." +        umount $mount_point > /dev/null 2>&1; +        exit 1;      fi  } -usage () +print_usage ()  { - -echo "Usage:  mount.glusterfs <volumeserver>:<volumeid/volumeport> -o <options> <mountpoint> +cat << EOF +Usage: $0 <volumeserver>:<volumeid/volumeport> -o<options> <mountpoint>  Options: -man 8 mount.glusterfs - -To display the version number of the mount helper: -mount.glusterfs --version" - +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 ()  {      if [ $1 = "/" ]; then -        echo Cannot mount over root; +        echo "Cannot mount over root";          exit 2;      fi +      # GFID check first      # remove trailing / from mount point      mnt_dir=${1%/}; -    export PATH; -    # check whether getfattr exists -    which getfattr > /dev/null 2>&1; -    if [ $? -ne 0 ]; then -        return; -    fi - -    getfattr -n trusted.gfid $mnt_dir 2>/dev/null | grep -iq "trusted.gfid="; -    if [ $? -eq 0 ]; then -        echo "ERROR: $mnt_dir is in use as a brick of a gluster volume"; -        exit 2; +    if [ -n ${getfattr} ]; then +        ${getfattr} -n trusted.gfid $mnt_dir 2>/dev/null | grep -iq "trusted.gfid="; +        if [ $? -eq 0 ]; then +            echo "ERROR: $mnt_dir is in use as a brick of a gluster volume"; +            exit 2; +        fi      fi      # check if the mount point is a brick's parent directory      GLUSTERD_WORKDIR="/var/lib/glusterd"; -    ls -L "$GLUSTERD_WORKDIR"/vols/*/bricks/* > /dev/null 2>&1; +    lsL "$GLUSTERD_WORKDIR"/vols/*/bricks/* > /dev/null 2>&1;      if [ $? -ne 0 ]; then          return;      fi -    brick_path=`grep ^path "$GLUSTERD_WORKDIR"/vols/*/bricks/* | cut -d "=" -f 2`; +    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 +    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 -        getfattr -n trusted.gfid "$brick" 2>/dev/null | grep -iq "trusted.gfid="; -        if [ $? -ne 0 ]; then -            continue; + +        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 +                        echo "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 -            # 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 -                    echo 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; +            continue;          fi      done;  } -main () +with_options()  { -    helper=$(echo "$@" | sed -n 's/.*\--[ ]*\([^ ]*\).*/\1/p'); -    in_opt="no" -    pos_args=0 -    for opt in "$@"; do -        if [ "$in_opt" = "yes" ]; then -            for pair in $(echo "$opt" | tr "," " "); do -                # Handle options without values. -                case "$pair" 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")  ;; -                    *) -                        key=$(echo "$pair" | cut -f1 -d'='); -                        value=$(echo "$pair" | cut -f2- -d'='); - -                        # 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 ;; -                            ## Place-holder backward compatibility -                            "backupvolfile-server") backupvolfile_server=$value ;; -                            "congestion-threshold")  cong_threshold=$value ;; -                            "xlator-option")  xlator_option=$xlator_option" "$pair ;; -                            "fuse-mountopts")  fuse_mountopts=$value ;; -                            "use-readdirp") use_readdirp=$value ;; -                            *) -                                # Passthru -                                [ -z "$fuse_mountopts" ] || fuse_mountopts="$fuse_mountopts," -                                fuse_mountopts="$fuse_mountopts$pair" -                                ;; -                        esac -                esac -            done -            in_opt="no" -        elif [ "$opt" = "-o" ]; then -            in_opt="yes" +    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 +            ;; +        "congestion-threshold") +            cong_threshold=$value +            ;; +        "xlator-option") +            xlator_option=$value +            ;; +        "fuse-mountopts") +            fuse_mountopts=$value +            ;; +        "use-readdirp") +            use_readdirp=$value +            ;; +        *) +            echo "Invalid option: $key" +            exit 0 +            ;; +    esac +} + +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") +            ;; +        *) +            echo "Invalid option $option"; +            exit 0 +            ;; +    esac +} + +parse_options() +{ +    local optarg=${1} +    for pair in $(echo ${optarg//,/ }); do +        key=$(echo "$pair" | cut -f1 -d'='); +        value=$(echo "$pair" | cut -f2- -d'='); +        if [ "$key" = "$value" ]; then +            without_options $pair;          else -            case $pos_args in -                0)      volfile_loc=$opt ;; -                1)      mount_point=$opt ;; -                *)      echo "extra arguments at end (ignored)" ;; -            esac -            pos_args=$((pos_args+1)) +            with_options $key $value;          fi      done -    if [ $in_opt = "yes" -o $pos_args -lt 2 ]; then -        usage -        exit 1 -    fi +} + +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 +    } +} + +main () +{ + +    volfile_loc=$1 +    mount_point=$2 + +    ## `mount` specifies options as a last argument +    shift 2; +    while getopts "Vo:h" opt; do +        case "${opt}" in +            o) +                parse_options ${OPTARG}; +                ;; +            V) +                ${cmd_line} -V; +                exit 0; +                ;; +            h) +                print_usage; +                exit 0; +                ;; +            ?) +                print_usage; +                exit 0; +                ;; +        esac +    done      [ -r "$volfile_loc" ] || {          server_ip=$(echo "$volfile_loc" | sed -n 's/\([a-zA-Z0-9:.\-]*\):.*/\1/p'); -        test_str=$(echo "$volfile_loc" | sed -n 's/.*:\([^ ]*\).*/\1/p'); -        [ -n "$test_str" ] && { -            volume_id="$test_str"; +        volume_str=$(echo "$volfile_loc" | sed -n 's/.*:\([^ ]*\).*/\1/p'); +        [ -n "$volume_str" ] && { +            volume_id="$volume_str";          }          volfile_loc="";      } -    # -    [ -n "$helper" ] && { -        cmd_line=$(echo "$cmd_line --$helper"); -        exec $cmd_line; +    [ -z "$volume_id" -o -z "$server_ip" ] && { +        cat <<EOF +ERROR: Server name/volume name unspecified cannot proceed further.. +Please specify correct format +Usage: +man 8 $0 +EOF +        exit 0; +    } + +    grep_ret=$(echo ${mount_point} | grep '^\-o'); +    [ "x" != "x${grep_ret}" ] && { +        cat <<EOF +ERROR: -o options cannot be specified in either first two arguments.. +Please specify correct style +Usage: +man 8 $0 +EOF          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" ] && { -        echo "ERROR: Mount point does not exist." -        usage; +        cat <<EOF +ERROR: Mount point does not exist +Please specify a mount point +Usage: +man 8 $0 +EOF          exit 0;      } @@ -472,16 +596,7 @@ main ()      check_recursive_mount "$mount_point"; -    # Append fuse.glusterfs to PRUNEFS variable in updatedb.conf(5). updatedb(8) -    # should not index files under GlusterFS, indexing will slow down GlusteFS -    # if the filesystem is several TB in size. -    test -f $UPDATEDBCONF && { -        if ! grep -q 'glusterfs' $UPDATEDBCONF; then -            sed 's/\(PRUNEFS.*\)"/\1 fuse.glusterfs"/' $UPDATEDBCONF \ -                > ${UPDATEDBCONF}.bak -            mv -f ${UPDATEDBCONF}.bak $UPDATEDBCONF -        fi -    } +    update_updatedb;      start_glusterfs;  }  | 
