2020-06-22 11:33:31 +02:00
#!/bin/sh
# Vars {{{
readonly PROGNAME = $( basename " ${ 0 } " )
readonly PROGDIR = $( readlink -m $( dirname " ${ 0 } " ) )
readonly ARGS = " ${ * } "
readonly NBARGS = " ${# } "
## Test if DEBUG is already defined (by parent script,…)
[ -z " ${ DEBUG } " ] && readonly DEBUG = 0
2020-06-22 12:22:01 +02:00
# Maco temp file
readonly MACO_TMP_FILE = "/tmp/.maco.upgrade"
readonly MACO_TMP_URGENT_FILE = "/tmp/.maco.urgent.upgrade"
# APT temp file to monitor
readonly APT_TMP_FILE = "/tmp/.apt.upgrade"
2020-06-22 11:33:31 +02:00
## Colors
readonly PURPLE = '\033[1;35m'
readonly RED = '\033[0;31m'
readonly RESET = '\033[0m'
readonly COLOR_DEBUG = " ${ PURPLE } "
# }}}
manage_args( ) { # {{{
case " ${ NBARGS } " in
0 )
sge_hostname = " $( hostname -f) "
2020-06-22 12:22:01 +02:00
## Ensure there is no pending upgrades on the local host
CHECK_UPGRADE = "0"
2020-06-22 11:33:31 +02:00
; ;
1 )
sge_hostname = " ${ 1 } "
2020-06-22 12:22:01 +02:00
## No way to monitor pending upgrades on a remote host
CHECK_UPGRADE = "1"
2020-06-22 11:33:31 +02:00
; ;
* )
printf '%b\n' " ${ RED } Expect 1 or 0 argument. ${ RESET } "
printf '%b\n' "---"
usage
exit 1
; ;
esac
}
# }}}
usage( ) { # {{{
cat <<- EOF
usage: $PROGNAME [ hostname]
Try to enable all SGE queues of the current host ( default)
or the one passed as first argument.
EXAMPLES :
- Enable SGE' s queue( s) of the current host
${ PROGNAME }
- Enable SGE' s queue( s) of "marvin.domain.tld" host
${ PROGNAME } marvin.domain.tld
EOF
}
# }}}
debug_message( ) { # {{{
local_debug_message = " ${ 1 } "
## Print message if DEBUG is enable (=0)
[ " ${ DEBUG } " -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' " DEBUG − ${ PROGNAME } : ${ local_debug_message } "
}
# }}}
2020-06-22 12:22:01 +02:00
is_apt_upgrade_present( ) { # {{{
## No pending upgrade by default
return_apt_upgrade_present = "1"
## If we need to watch for upgrades
if [ " ${ CHECK_UPGRADE } " -eq "0" ] ; then
### Check if temp APT upgrade file exists
if [ -f " ${ APT_TMP_FILE } " ] ; then
return_apt_upgrade_present = "0"
debug_message " is_apt_upgrade_absent − \
APT upgrade seems available for this system."
else
return_apt_upgrade_present = "1"
debug_message " is_apt_upgrade_absent − \
NO APT upgrade available for this system."
fi
fi
return " ${ return_apt_upgrade_present } "
}
# }}}
is_maco_upgrade_present( ) { # {{{
## No pending upgrades by default
return_maco_upgrade_present = "1"
## If we need to watch for upgrades
if [ " ${ CHECK_UPGRADE } " -eq "0" ] ; then
## Check if temp Maco upgrade file is present
if [ -f " ${ MACO_TMP_FILE } " ] ; then
return_maco_upgrade_present = "0"
debug_message " is_maco_upgrade_present − \
Maco upgrade seems available."
## Check if temp Maco urgent upgrade file is present
elif [ -f " ${ MACO_TMP_URGENT_FILE } " ] ; then
return_maco_upgrade_present = "0"
debug_message " is_maco_upgrade_present − \
Maco urgent upgrade seems available."
else
debug_message " is_maco_upgrade_present − \
No Maco upgrade require."
fi
fi
return " ${ return_maco_upgrade_present } "
}
# }}}
is_queue_enable( ) { # {{{
2020-06-22 11:33:31 +02:00
local_queue_enable_hostname = " ${ 1 } "
local_queue_enable_name = " ${ 2 } "
## List all queues with 'disable' state and filter to the expected queue name
## with a fake_user to avoid pending jobs for this queue
### And count returned lines
local_queue_enable_test = $( qstat -f -qs d -q " ${ local_queue_enable_name : =/dev/null } @ ${ local_queue_enable_hostname : =/dev/null } " -u fake_user \
| wc -l)
case " ${ local_queue_enable_test } " in
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
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 } "
exit 2
; ;
esac
## Simple debug message to valid current variables
debug_message " is_queue_enable − \
SGE queue: ${ RED } ${ local_queue_enable_name : =/dev/null } ${ COLOR_DEBUG } \
state is: ${ RED } ${ local_sge_queue_state : =/dev/null } ${ COLOR_DEBUG } ."
return " ${ return_queue_enable } "
}
# }}}
is_queue_disable( ) { # {{{
local_queue_disable_hostname = " ${ 1 } "
local_queue_disable_name = " ${ 2 } "
## List all queues with 'disable' state and filter to the expected queue name
## add a fake_user to avoid pending jobs for this queue
### And count returned lines
local_queue_disable_test = $( qstat -f -qs d -q " ${ local_queue_disable_name : =/dev/null } @ ${ local_queue_disable_hostname : =/dev/null } " -u fake_user \
| wc -l)
case " ${ local_queue_disable_test } " in
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
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 } "
exit 3
; ;
esac
## Simple debug message to valid current variables
debug_message " is_queue_disable − \
SGE queue: ${ RED } ${ local_queue_disable_name : =/dev/null } ${ COLOR_DEBUG } \
state is: ${ RED } ${ local_sge_queue_state : =/dev/null } ${ COLOR_DEBUG } ."
return " ${ return_queue_disable } "
}
# }}}
2020-06-22 12:22:01 +02:00
is_all_queue_enable( ) { # {{{
2020-06-22 11:33:31 +02:00
local_all_queue_enable_hostname = " ${ 1 } "
local_all_queue_enable_name = " ${ 2 } "
## By default, all queues are enable
return_all_queue_enable = "0"
## Test all queues one by one
for loop_enable_queue in ${ local_all_queue_enable_name } ; do
### If a queue is not enable
#### Change the return value
is_queue_enable " ${ local_all_queue_enable_hostname } " " ${ loop_enable_queue } " \
|| return_all_queue_enable = "1"
done
return " ${ return_all_queue_enable } "
}
# }}}
2020-06-22 12:22:01 +02:00
enable_sge_queue( ) { # {{{
2020-06-22 11:33:31 +02:00
local_sge_hostname = " ${ 1 } "
local_sge_queue_name = " ${ 2 } "
## Simple debug message to valid current variables
debug_message " enable_sge_queue − \
Try to enable SGE queue: ${ RED } ${ local_sge_queue_name : =/dev/null } @${ local_sge_hostname : =/dev/null } ${ COLOR_DEBUG } ."
## SGE command to enable the queue
qmod --enable " ${ local_sge_queue_name } @ ${ local_sge_hostname } " \
&& return_enable_queue = " ${ ? } "
return " ${ return_enable_queue } "
}
# }}}
main( ) { # {{{
manage_args " ${ ARGS } "
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-22 12:22:01 +02:00
## If APT package upgrade is available
### Exit (wait for APT upgrade to be applied)
is_apt_upgrade_present \
&& exit 0
## If Maco upgrade is present
### Exit (wait for Maco upgrade to be applied)
is_maco_upgrade_present \
&& exit 0
2020-06-22 11:33:31 +02:00
## Simple debug message with color to valid current variables
debug_message " main − Try to manage \
SGE queue( s) : ${ RED } ${ sge_queues_name_print : =/dev/null } ${ COLOR_DEBUG } \
for host: ${ RED } ${ sge_hostname : =/dev/null } ${ COLOR_DEBUG } ."
## If the queue(s) are already enable
### Exit
is_all_queue_enable " ${ sge_hostname } " " ${ sge_queues_name } " \
&& exit 0
## Test all queues one by one
for loop_queue in ${ sge_queues_name } ; do
## If the queue is disable
### Try to enable it
is_queue_disable " ${ sge_hostname } " " ${ loop_queue } " \
&& enable_sge_queue " ${ sge_hostname } " " ${ loop_queue } "
## If the queue is still disable
### Exit with error
is_queue_disable " ${ sge_hostname } " " ${ loop_queue } " \
&& printf '%b\n' " ${ RED } ERROR ${ loop_queue } @ ${ sge_hostname } is still disable. ${ RESET } " \
&& exit 4
done
}
# }}}
main
exit 0