mirror of
https://github.com/gluster/glusterfs.git
synced 2026-02-06 09:48:44 +01:00
Replace master and slave terminology in geo-replication with primary and secondary respectively. Change-Id: I3eb9242d2ce8340435265b764d28221d50f872c8 Signed-off-by: Ravishankar N <ravishankar@redhat.com>
493 lines
11 KiB
Bash
493 lines
11 KiB
Bash
#!/bin/bash
|
|
|
|
if pidof glusterd > /dev/null 2>&1; then
|
|
GLUSTER_SET_OPTIONS="
|
|
$(for token in `gluster volume set help 2>/dev/null | grep "^Option:" | cut -d ' ' -f 2`
|
|
do
|
|
echo "{$token},"
|
|
done)
|
|
"
|
|
GLUSTER_RESET_OPTIONS="$GLUSTER_SET_OPTIONS"
|
|
fi
|
|
|
|
GLUSTER_TOP_SUBOPTIONS1="
|
|
{nfs},
|
|
{brick},
|
|
{list-cnt}
|
|
"
|
|
GLUSTER_TOP_SUBOPTIONS2="
|
|
{bs
|
|
{__SIZE
|
|
{count}
|
|
}
|
|
},
|
|
{brick},
|
|
{list-cnt}
|
|
"
|
|
GLUSTER_TOP_OPTIONS="
|
|
{open
|
|
[ $GLUSTER_TOP_SUBOPTIONS1 ]
|
|
},
|
|
{read
|
|
[ $GLUSTER_TOP_SUBOPTIONS1 ]
|
|
},
|
|
{write
|
|
[ $GLUSTER_TOP_SUBOPTIONS1 ]
|
|
},
|
|
{opendir
|
|
[ $GLUSTER_TOP_SUBOPTIONS1 ]
|
|
},
|
|
{readdir
|
|
[ $GLUSTER_TOP_SUBOPTIONS1 ]
|
|
},
|
|
{clear
|
|
[ $GLUSTER_TOP_SUBOPTIONS1 ]
|
|
},
|
|
{read-perf
|
|
[ $GLUSTER_TOP_SUBOPTIONS2 ]
|
|
},
|
|
{write-perf
|
|
[ $GLUSTER_TOP_SUBOPTIONS2 ]
|
|
}
|
|
"
|
|
|
|
GLUSTER_QUOTA_OPTIONS="
|
|
{enable},
|
|
{disable},
|
|
{list},
|
|
{remove},
|
|
{default-soft-limit},
|
|
{limit-usage},
|
|
{alert-time},
|
|
{soft-timeout},
|
|
{hard-timeout}
|
|
"
|
|
|
|
GLUSTER_PROFILE_OPTIONS="
|
|
{start},
|
|
{info [
|
|
{peek},
|
|
{incremental
|
|
{peek}
|
|
},
|
|
{cumulative},
|
|
{clear},
|
|
]
|
|
},
|
|
{stop}
|
|
"
|
|
|
|
GLUSTER_BARRIER_OPTIONS="
|
|
{enable},
|
|
{disable}
|
|
"
|
|
|
|
GLUSTER_GEO_REPLICATION_SUBOPTIONS="
|
|
"
|
|
GLUSTER_GEO_REPLICATION_OPTIONS="
|
|
{__VOLNAME [
|
|
{__SECONDARYURL [
|
|
{create [
|
|
{push-pem
|
|
{force}
|
|
},
|
|
{force}
|
|
]
|
|
},
|
|
{start {force} },
|
|
{status {detail} },
|
|
{config},
|
|
{pause {force} },
|
|
{resume {force} },
|
|
{stop {force} },
|
|
{delete {force} }
|
|
]
|
|
},
|
|
{status}
|
|
]
|
|
},
|
|
{status}
|
|
"
|
|
|
|
GLUSTER_VOLUME_OPTIONS="
|
|
{volume [
|
|
{add-brick
|
|
{__VOLNAME}
|
|
},
|
|
{barrier
|
|
{__VOLNAME
|
|
[ $GLUSTER_BARRIER_OPTIONS ]
|
|
}
|
|
},
|
|
{clear-locks
|
|
{__VOLNAME}
|
|
},
|
|
{create},
|
|
{delete
|
|
{__VOLNAME}
|
|
},
|
|
{geo-replication
|
|
[ $GLUSTER_GEO_REPLICATION_OPTIONS ]
|
|
},
|
|
{heal
|
|
{__VOLNAME}
|
|
},
|
|
{help},
|
|
{info
|
|
{__VOLNAME}
|
|
},
|
|
{list},
|
|
{log
|
|
{__VOLNAME}
|
|
},
|
|
{profile
|
|
{__VOLNAME
|
|
[ $GLUSTER_PROFILE_OPTIONS ]
|
|
}
|
|
},
|
|
{quota
|
|
{__VOLNAME
|
|
[ $GLUSTER_QUOTA_OPTIONS ]
|
|
}
|
|
},
|
|
{rebalance
|
|
{__VOLNAME}
|
|
},
|
|
{remove-brick
|
|
{__VOLNAME}
|
|
},
|
|
{replace-brick
|
|
{__VOLNAME}
|
|
},
|
|
{reset
|
|
{__VOLNAME
|
|
[ $GLUSTER_RESET_OPTIONS ]
|
|
}
|
|
},
|
|
{set
|
|
{__VOLNAME
|
|
[ $GLUSTER_SET_OPTIONS ]
|
|
}
|
|
},
|
|
{start
|
|
{__VOLNAME
|
|
{force}
|
|
}
|
|
},
|
|
{statedump
|
|
{__VOLNAME}
|
|
},
|
|
{status
|
|
{__VOLNAME}
|
|
},
|
|
{stop
|
|
{__VOLNAME
|
|
{force}
|
|
}
|
|
},
|
|
{sync
|
|
{__HOSTNAME}
|
|
},
|
|
{top
|
|
{__VOLNAME
|
|
[ $GLUSTER_TOP_OPTIONS ]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
"
|
|
|
|
GLUSTER_COMMAND_TREE="
|
|
{gluster [
|
|
$GLUSTER_VOLUME_OPTIONS ,
|
|
{peer [
|
|
{probe
|
|
{__HOSTNAME}
|
|
},
|
|
{detach
|
|
{__HOSTNAME
|
|
{force}
|
|
}
|
|
},
|
|
{status}
|
|
]
|
|
},
|
|
{pool
|
|
{list}
|
|
},
|
|
{help}
|
|
]
|
|
}"
|
|
|
|
__SIZE ()
|
|
{
|
|
return 0
|
|
}
|
|
|
|
__SECONDARYURL ()
|
|
{
|
|
return 0
|
|
}
|
|
|
|
__HOSTNAME ()
|
|
{
|
|
local zero=0
|
|
local ret=0
|
|
local cur_word="$2"
|
|
|
|
if [ "$1" == "X" ]; then
|
|
return
|
|
|
|
elif [ "$1" == "match" ]; then
|
|
return 0
|
|
|
|
elif [ "$1" == "complete" ]; then
|
|
COMPREPLY=($(compgen -A hostname -- $cur_word))
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
__VOLNAME ()
|
|
{
|
|
local zero=0
|
|
local ret=0
|
|
local cur_word="$2"
|
|
local list=""
|
|
|
|
if [ "X$1" == "X" ]; then
|
|
return
|
|
|
|
elif [ "$1" == "match" ]; then
|
|
return 0
|
|
|
|
elif [ "$1" == "complete" ]; then
|
|
if ! pidof glusterd > /dev/null 2>&1; then
|
|
list='';
|
|
|
|
else
|
|
list=`gluster volume list 2> /dev/null`
|
|
fi
|
|
|
|
else
|
|
return 0
|
|
fi
|
|
|
|
COMPREPLY=($(compgen -W "$list" -- $cur_word))
|
|
return 0
|
|
}
|
|
|
|
_gluster_throw () {
|
|
#echo $1 >&2
|
|
COMPREPLY=''
|
|
exit
|
|
}
|
|
|
|
declare GLUSTER_FINAL_LIST=''
|
|
declare GLUSTER_LIST=''
|
|
declare -i GLUSTER_TOP=0
|
|
_gluster_push () {
|
|
GLUSTER_TOP=$((GLUSTER_TOP + 1))
|
|
return $GLUSTER_TOP
|
|
}
|
|
_gluster_pop () {
|
|
GLUSTER_TOP=$((GLUSTER_TOP - 1))
|
|
return $GLUSTER_TOP
|
|
}
|
|
|
|
_gluster_goto_end ()
|
|
{
|
|
local prev_top=$1
|
|
local top=$1
|
|
local token=''
|
|
|
|
while [ $top -ge $prev_top ]; do
|
|
read -r token
|
|
case $token in
|
|
'{' | '[')
|
|
_gluster_push
|
|
top=$?
|
|
;;
|
|
'}' | ']')
|
|
_gluster_pop
|
|
top=$?
|
|
;;
|
|
esac
|
|
done
|
|
|
|
return
|
|
}
|
|
|
|
_gluster_form_list ()
|
|
{
|
|
local token=''
|
|
local top=0
|
|
local comma=''
|
|
local cur_word="$1"
|
|
|
|
read -r token
|
|
case $token in
|
|
']')
|
|
;;
|
|
'{')
|
|
_gluster_push
|
|
top=$?
|
|
read -r key
|
|
if [ "X$cur_word" == "X" -o "${cur_word:0:1}" == "${key:0:1}" -o "${key:0:1}" == "_" ]; then
|
|
GLUSTER_LIST="$GLUSTER_LIST $key"
|
|
fi
|
|
|
|
_gluster_goto_end $top
|
|
read -r comma
|
|
if [ "$comma" == "," ]; then
|
|
_gluster_form_list $cur_word
|
|
fi
|
|
;;
|
|
*)
|
|
_gluster_throw "Expected '{' but received $token"
|
|
;;
|
|
esac
|
|
|
|
return
|
|
}
|
|
|
|
_gluster_goto_child ()
|
|
{
|
|
local match_string="$1"
|
|
local token=''
|
|
local top=0
|
|
local comma=''
|
|
|
|
read -r token
|
|
case $token in
|
|
'{')
|
|
_gluster_push
|
|
top=$?
|
|
;;
|
|
*)
|
|
_gluster_throw "Expected '{' but received $token"
|
|
;;
|
|
esac
|
|
|
|
read -r token
|
|
case `echo $token` in
|
|
'[' | ']' | '{' | '}')
|
|
_gluster_throw "Expected string but received $token"
|
|
;;
|
|
_*)
|
|
$token "match" $match_string
|
|
ret=$?
|
|
if [ $ret -eq 0 ]; then
|
|
return
|
|
else
|
|
_gluster_goto_end $top
|
|
|
|
read -r comma
|
|
if [ "$comma" == "," ]; then
|
|
_gluster_goto_child $match_string
|
|
fi
|
|
fi
|
|
;;
|
|
|
|
"$match_string")
|
|
return
|
|
;;
|
|
*)
|
|
_gluster_goto_end $top
|
|
|
|
read -r comma
|
|
if [ "$comma" == "," ]; then
|
|
_gluster_goto_child $match_string
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
return
|
|
}
|
|
|
|
_gluster_does_match ()
|
|
{
|
|
local token="$1"
|
|
local key="$2"
|
|
|
|
if [ "${token:0:1}" == "_" ]; then
|
|
$token $2
|
|
return $?
|
|
fi
|
|
|
|
[ "$token" == "$key" ] && return 0
|
|
|
|
return 1
|
|
}
|
|
|
|
_gluster_parse ()
|
|
{
|
|
local i=0
|
|
local token=''
|
|
local tmp_token=''
|
|
local word=''
|
|
|
|
while [ $i -lt $COMP_CWORD ]; do
|
|
read -r token
|
|
case $token in
|
|
'[')
|
|
_gluster_push
|
|
_gluster_goto_child ${COMP_WORDS[$i]}
|
|
;;
|
|
'{')
|
|
_gluster_push
|
|
read -r tmp_token
|
|
_gluster_does_match $tmp_token ${COMP_WORDS[$i]}
|
|
if [ $? -ne 0 ]; then
|
|
_gluster_throw "No match"
|
|
fi
|
|
;;
|
|
esac
|
|
i=$((i+1))
|
|
done
|
|
|
|
read -r token
|
|
if [ "$token" == '[' ]; then
|
|
_gluster_push
|
|
_gluster_form_list ${COMP_WORDS[COMP_CWORD]}
|
|
|
|
elif [ "$token" == '{' ]; then
|
|
read -r tmp_token
|
|
GLUSTER_LIST="$tmp_token"
|
|
fi
|
|
|
|
echo $GLUSTER_LIST
|
|
}
|
|
|
|
_gluster_handle_list ()
|
|
{
|
|
local list="${!1}"
|
|
local cur_word=$2
|
|
local count=0
|
|
local i=0
|
|
|
|
for i in `echo $list`; do
|
|
count=$((count + 1))
|
|
done
|
|
|
|
if [ $count -eq 1 ] && [ "${i:0:1}" == "_" ]; then
|
|
$i "complete" $cur_word
|
|
else
|
|
COMPREPLY=($(compgen -W "$list" -- $cur_word))
|
|
fi
|
|
return
|
|
}
|
|
|
|
_gluster_completion ()
|
|
{
|
|
GLUSTER_FINAL_LIST=`echo $GLUSTER_COMMAND_TREE | \
|
|
egrep -ao --color=never "([A-Za-z0-9_.-]+)|[[:space:]]+|." | \
|
|
egrep -v --color=never "^[[:space:]]*$" | \
|
|
_gluster_parse`
|
|
|
|
ARG="GLUSTER_FINAL_LIST"
|
|
_gluster_handle_list $ARG ${COMP_WORDS[COMP_CWORD]}
|
|
return
|
|
}
|
|
|
|
complete -F _gluster_completion gluster
|