#!/bin/bash # (C) 2006, 2007, 2008 Gluster Inc. # # 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 () { # log level definitions LOG_NONE=NONE; LOG_CRITICAL=CRITICAL; LOG_ERROR=ERROR; LOG_WARNING=WARNING; LOG_NORMAL=NORMAL LOG_DEBUG=DEBUG; LOG_TRACE=TRACE; # set default log level to NORMAL log_level=$LOG_NORMAL; prefix="@prefix@"; exec_prefix=@exec_prefix@; cmd_line=$(echo "@sbindir@/glusterfs"); } start_glusterfs () { if [ -n "$log_level_str" ]; then case "$log_level_str" in "ERROR") log_level=$LOG_ERROR; ;; "NORMAL") log_level=$LOG_NORMAL ;; "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 "$read_only" ]; then cmd_line=$(echo "$cmd_line --read-only"); fi 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 "$direct_io_mode" ]; then 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 "$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 [ -z "$volfile_loc" ]; then if [ -n "$server_ip" ]; then 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 "$volume_id" ]; then cmd_line=$(echo "$cmd_line --volfile-id=$volume_id"); fi if [ -n "$backupvolfile_server" ]; then cmd_line1=$(echo "$cmd_line --volfile-server=$backupvolfile_server"); fi cmd_line=$(echo "$cmd_line --volfile-server=$server_ip"); fi else cmd_line=$(echo "$cmd_line --volfile=$volfile_loc"); fi cmd_line=$(echo "$cmd_line $mount_point"); $cmd_line; # retry the failover if [ $? != "0" ]; then if [ -n "$cmd_line1" ]; then cmd_line1=$(echo "$cmd_line1 $mount_point"); $cmd_line1 fi fi } usage () { echo "Usage: mount.glusterfs : -o Options: man 8 mount.glusterfs To display the version number of the mount helper: mount.glusterfs --version" } main () { helper=$(echo "$@" | sed -n 's/.*\--[ ]*\([^ ]*\).*/\1/p'); options=$(echo "$@" | sed -n 's/.*\-o[ ]*\([^ ]*\).*/\1/p'); new_log_level=$(echo "$options" | sed -n 's/.*log-level=\([^,]*\).*/\1/p'); [ -n "$new_log_level" ] && { log_level_str="$new_log_level"; } log_file=$(echo "$options" | sed -n 's/.*log-file=\([^,]*\).*/\1/p'); read_only=$(echo "$options" | sed -n 's/.*\(ro\)[^,]*.*/\1/p'); transport=$(echo "$options" | sed -n 's/.*transport=\([^,]*\).*/\1/p'); direct_io_mode=$(echo "$options" | sed -n 's/.*direct-io-mode=\([^,]*\).*/\1/p'); volume_name=$(echo "$options" | sed -n 's/.*volume-name=\([^,]*\).*/\1/p'); volume_id=$(echo "$options" | sed -n 's/.*volume_id=\([^,]*\).*/\1/p'); volfile_check=$(echo "$options" | sed -n 's/.*volfile-check=\([^,]*\).*/\1/p'); 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/\([^\:]*\).*/\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=""; } [ -n "$server_port" ] || { server_port="6996"; } 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/[,]*ro[^,]*//' \ -e 's/[,]*log-server-port=[^,]*//'); # [ -n "$helper" ] && { cmd_line=$(echo "$cmd_line --$helper"); exec $cmd_line; exit 0; } 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 " $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 fs_options=$(echo "$fs_options,$new_fs_options"); start_glusterfs; sleep 3; } _init "$@" && main "$@";