2020-06-03 13:41:29 +02:00
#!/bin/sh
# Vars {{{
readonly PROGNAME = $( basename " ${ 0 } " )
readonly PROGDIR = $( readlink -m $( dirname " ${ 0 } " ) )
readonly ARGS = " ${ * } "
readonly NBARGS = " ${# } "
2020-06-04 11:22:50 +02:00
## Test if DEBUG is already defined (by parent script,…)
2020-06-24 14:07:23 +02:00
[ -z " ${ DEBUG } " ] && DEBUG = 1
2020-06-03 13:41:29 +02:00
## Colors
readonly PURPLE = '\033[1;35m'
readonly RED = '\033[0;31m'
readonly RESET = '\033[0m'
readonly COLOR_DEBUG = " ${ PURPLE } "
# }}}
usage( ) { # {{{
cat <<- EOF
2020-06-24 14:07:23 +02:00
usage: $PROGNAME [ --help] [ -d| -h] [ hostname]
2020-06-03 13:41:29 +02:00
2020-06-05 10:53:51 +02:00
Try to disable all SGE queues of the current host ( default)
2020-06-03 13:41:29 +02:00
or the one passed as first argument.
EXAMPLES :
2020-06-05 10:53:51 +02:00
- Disable SGE' s queue( s) of the current host
2020-06-03 13:41:29 +02:00
${ PROGNAME }
2020-06-05 10:53:51 +02:00
- Disable SGE' s queue( s) of "marvin.domain.tld" host
2020-06-03 13:41:29 +02:00
${ PROGNAME } marvin.domain.tld
2020-06-24 14:07:23 +02:00
${ PROGNAME } -h marvin.domain.tld
OPTIONS :
-d,--debug
Enable debug messages.
--help
Print this help message.
-h,--host,--hostname SGE_HOST_TO_MANAGE
Manage SGE' s queue( s) of "SGE_HOST_TO_MANAGE" host.
EOF
2020-06-03 13:41:29 +02:00
2020-06-04 11:31:13 +02:00
}
# }}}
debug_message( ) { # {{{
2020-06-05 10:53:51 +02:00
local_debug_message = " ${ 1 } "
2020-06-04 11:31:13 +02:00
## Print message if DEBUG is enable (=0)
2020-06-05 10:53:51 +02:00
[ " ${ DEBUG } " -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' " DEBUG − ${ PROGNAME } : ${ local_debug_message } "
2020-06-04 11:31:13 +02:00
2020-06-24 14:14:08 +02:00
}
# }}}
define_vars( ) { # {{{
## If sge_hostname wasn't defined
if [ -z " ${ sge_hostname } " ] ; then
## Use local host for sge_hostname
sge_hostname = " $( hostname -f) "
fi
2020-06-24 14:53:53 +02:00
## If the host to manage is the current one
if is_current_host " ${ sge_hostname } " ; then
debug_message " define_vars − \
${ sge_hostname } is the current host."
LOCAL_HOST = "0"
else ## In case of a remote host
debug_message " define_vars − \
${ sge_hostname } is not the current host."
LOCAL_HOST = "1"
fi
2020-06-24 14:14:08 +02:00
## Get all queues name
sge_queues_name = " $( qhost -h " ${ sge_hostname : =/dev/null } " -q -xml \
| grep "queue name" \
| cut -d"'" -f2 ) "
sge_queues_name_print = " $( qhost -h " ${ sge_hostname : =/dev/null } " -q -xml \
| grep "queue name" \
| cut -d"'" -f2 \
| tr -s '\n' ' ' ) "
2020-06-24 14:53:53 +02:00
}
# }}}
is_current_host( ) { # {{{
local_current_host = " ${ 1 } "
local_current_fqdn = $( hostname -f)
## Test if the sge_host to manage is the current host
if [ " ${ local_current_host } " = " ${ local_current_fqdn } " ] ; then
local_current_host_return = "0"
else
local_current_host_return = "1"
fi
return " ${ local_current_host_return } "
2020-06-03 13:41:29 +02:00
}
# }}}
is_queue_enable( ) { # {{{
2020-06-05 10:53:51 +02:00
local_queue_enable_hostname = " ${ 1 } "
local_queue_enable_name = " ${ 2 } "
2020-06-04 16:39:50 +02:00
## List all queues with 'disable' state and filter to the expected queue name
2020-06-05 07:32:03 +02:00
## with a fake_user to avoid pending jobs for this queue
### And count returned lines
2020-06-05 10:53:51 +02:00
local_queue_enable_test = $( qstat -f -qs d -q " ${ local_queue_enable_name : =/dev/null } @ ${ local_queue_enable_hostname : =/dev/null } " -u fake_user \
2020-06-05 07:32:03 +02:00
| wc -l)
2020-06-03 13:41:29 +02:00
2020-06-05 10:53:51 +02:00
case " ${ local_queue_enable_test } " in
2020-06-03 13:41:29 +02:00
0 ) ## No result so the queue is enable
local_sge_queue_state = "enable"
return_queue_enable = "0"
; ;
3 ) ## Results (header + queue name) so the queue is disable
local_sge_queue_state = "disable"
return_queue_enable = "1"
; ;
* ) ## Unexpected result
2020-06-05 10:53:51 +02:00
printf '%b\n' " ${ RED } Not able to determine the state of ${ local_sge_queue_name : =/dev/null } @ ${ local_queue_enable_hostname : =/dev/null } queue (command return ${ local_queue_enable_test } lines). ${ RESET } "
2020-06-03 13:41:29 +02:00
exit 2
; ;
esac
## Simple debug message to valid current variables
2020-06-04 11:31:13 +02:00
debug_message " is_queue_enable − \
2020-06-05 10:53:51 +02:00
SGE queue: ${ RED } ${ local_queue_enable_name : =/dev/null } ${ COLOR_DEBUG } \
2020-06-03 13:41:29 +02:00
state is: ${ RED } ${ local_sge_queue_state : =/dev/null } ${ COLOR_DEBUG } ."
return " ${ return_queue_enable } "
}
# }}}
is_queue_disable( ) { # {{{
2020-06-05 10:19:34 +02:00
local_queue_disable_hostname = " ${ 1 } "
local_queue_disable_name = " ${ 2 } "
2020-06-04 16:39:50 +02:00
## List all queues with 'disable' state and filter to the expected queue name
2020-06-05 10:19:34 +02:00
## add a fake_user to avoid pending jobs for this queue
2020-06-05 07:32:03 +02:00
### And count returned lines
2020-06-05 10:19:34 +02:00
local_queue_disable_test = $( qstat -f -qs d -q " ${ local_queue_disable_name : =/dev/null } @ ${ local_queue_disable_hostname : =/dev/null } " -u fake_user \
2020-06-05 07:32:03 +02:00
| wc -l)
2020-06-03 13:41:29 +02:00
2020-06-05 10:19:34 +02:00
case " ${ local_queue_disable_test } " in
2020-06-03 13:41:29 +02:00
0 ) ## No result so the queue is enable
local_sge_queue_state = "enable"
return_queue_disable = "1"
; ;
3 ) ## Results (header + queue name) so the queue is disable
local_sge_queue_state = "disable"
return_queue_disable = "0"
; ;
* ) ## Unexpected result
2020-06-05 10:19:34 +02:00
printf '%b\n' " ${ RED } Not able to determine the state of ${ local_queue_disable_name : =/dev/null } @ ${ local_queue_disable_hostname : =/dev/null } queue (command return ${ local_queue_disable_test } lines). ${ RESET } "
2020-06-03 17:51:04 +02:00
exit 3
2020-06-03 13:41:29 +02:00
; ;
esac
## Simple debug message to valid current variables
2020-06-04 11:31:13 +02:00
debug_message " is_queue_disable − \
2020-06-05 10:19:34 +02:00
SGE queue: ${ RED } ${ local_queue_disable_name : =/dev/null } ${ COLOR_DEBUG } \
2020-06-03 13:41:29 +02:00
state is: ${ RED } ${ local_sge_queue_state : =/dev/null } ${ COLOR_DEBUG } ."
return " ${ return_queue_disable } "
2020-06-05 10:19:34 +02:00
}
# }}}
is_all_queue_disable( ) { # {{{
local_all_queue_disable_hostname = " ${ 1 } "
local_all_queue_disable_name = " ${ 2 } "
## By default, all queues are disable
return_all_queue_disable = "0"
## Test all queues one by one
for loop_disable_queue in ${ local_all_queue_disable_name } ; do
### If a queue is not disable
#### Change the return value
is_queue_disable " ${ local_all_queue_disable_hostname } " " ${ loop_disable_queue } " \
|| return_all_queue_disable = "1"
done
return " ${ return_all_queue_disable } "
2020-06-03 13:41:29 +02:00
}
# }}}
disable_sge_queue( ) { # {{{
local_sge_hostname = " ${ 1 } "
local_sge_queue_name = " ${ 2 } "
## Simple debug message to valid current variables
2020-06-04 11:31:13 +02:00
debug_message " disable_sge_queue − \
2020-06-03 13:41:29 +02:00
Try to disable SGE queue: ${ RED } ${ local_sge_queue_name : =/dev/null } @${ local_sge_hostname : =/dev/null } ${ COLOR_DEBUG } ."
## SGE command to disable the queue
2020-06-24 14:53:53 +02:00
## and get returned value
## and create a file for local queue
2020-06-24 10:39:45 +02:00
qmod --disable " ${ local_sge_queue_name } @ ${ local_sge_hostname } " > /dev/null \
2020-06-24 14:53:53 +02:00
&& return_disable_queue = " ${ ? } " \
&& {
[ " ${ LOCAL_HOST } " -eq "0" ] && printf '%s' " by ${ PROGNAME } script " > " ${ sge_queue_deactivator } "
}
2020-06-03 13:41:29 +02:00
return " ${ return_disable_queue } "
}
# }}}
main( ) { # {{{
2020-06-24 14:14:08 +02:00
## Define all vars according the selected options
define_vars
2020-06-03 13:41:29 +02:00
## Simple debug message with color to valid current variables
2020-06-04 11:31:13 +02:00
debug_message " main − Try to manage \
2020-06-05 10:19:34 +02:00
SGE queue( s) : ${ RED } ${ sge_queues_name_print : =/dev/null } ${ COLOR_DEBUG } \
2020-06-03 13:41:29 +02:00
for host: ${ RED } ${ sge_hostname : =/dev/null } ${ COLOR_DEBUG } ."
2020-06-05 10:53:51 +02:00
## If the queue(s) are already disable
2020-06-03 17:51:04 +02:00
### Exit
2020-06-05 10:19:34 +02:00
is_all_queue_disable " ${ sge_hostname } " " ${ sge_queues_name } " \
2020-06-03 17:51:04 +02:00
&& exit 0
2020-06-05 10:53:51 +02:00
## Test all queues one by one
for loop_queue in ${ sge_queues_name } ; do
2020-06-24 14:07:23 +02:00
## File that says this queue was disabled by a script
## Can be used by other script to verify the queue wasn't disable by a user/admin
sge_queue_deactivator = " /etc/.sge. ${ loop_queue } .disable "
2020-06-05 10:53:51 +02:00
## If the queue is enable
### Try to disable it
is_queue_enable " ${ sge_hostname } " " ${ loop_queue } " \
&& disable_sge_queue " ${ sge_hostname } " " ${ loop_queue } "
## If the queue is still enable
### Exit with error
is_queue_enable " ${ sge_hostname } " " ${ loop_queue } " \
&& printf '%b\n' " ${ RED } ERROR ${ loop_queue } @ ${ sge_hostname } is still enable. ${ RESET } " \
&& exit 4
2020-06-03 13:41:29 +02:00
2020-06-05 10:53:51 +02:00
done
2020-06-03 17:51:31 +02:00
2020-06-03 13:41:29 +02:00
}
# }}}
2020-06-24 14:07:23 +02:00
# Manage arguments # {{{
# This code can't be in a function due to arguments
if [ ! " ${ NBARGS } " -eq "0" ] ; then
manage_arg = "0"
## If the first argument is not an option
if ! printf -- '%s' " ${ 1 } " | grep -q -E -- "^-+" ;
then
## Use this argument for sge_hostname
sge_hostname = " ${ 1 } "
## Switch to the next argument
shift
manage_arg = $(( manage_arg+1))
fi
# Parse all options (start with a "-") one by one
while printf -- '%s' " ${ 1 } " | grep -q -E -- "^-+" ; do
case " ${ 1 } " in
-d| --debug ) ## debug
DEBUG = 0
; ;
--help ) ## help
usage
## Exit after help informations
exit 0
; ;
-h| --host| --hostname ) ## Specify a different host to manage
## Move to the next argument
shift
## Override previous definition of sge_hostname
sge_hostname = " ${ 1 } "
; ;
-- ) ## End of options list
## End the while loop
break
; ;
* ) ## unknow option
printf '%b\n' " ${ RED } Invalid option: ${ 1 } ${ RESET } "
printf '%b\n' "---"
usage
exit 1
; ;
esac
debug_message " Arguments management − \
${ RED } ${ 1 } ${ COLOR_DEBUG } option managed."
## Move to the next argument
shift
manage_arg = $(( manage_arg+1))
done
debug_message " Arguments management − \
${ RED } ${ manage_arg } ${ COLOR_DEBUG } argument( s) successfully managed."
else
debug_message " Arguments management − \
No arguments/options to manage."
fi
# }}}
2020-06-03 13:41:29 +02:00
main
exit 0