#!/bin/bash # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. . /etc/rc.d/init.d/functions #set -x usage() { printf "\nThe tool stopping/starting running system vms and domain routers \n\nUsage: %s: [-d] [-u] [-p] [-m] [-s] [-r] [-a] [-t] [-e]\n\n -d - cloud DB server ip address, defaulted to localhost if not specified \n -u - user name to access cloud DB, defaulted to "root" if not specified \n -p - cloud DB user password, defaulted to no password if not specified \n\n -m - the ip address of management server, defaulted to localhost if not specified\n\n -s - stop then start all running SSVMs and Console Proxies \n -r - stop then start all running Virtual Routers\n -a - stop then start all running SSVMs, Console Proxies, and Virtual Routers \n -e - restart all Guest networks \n -t - number of parallel threads used for stopping Domain Routers. Default is 10.\n -l - log file location. Default is cloud.log under current directory.\n\n" $(basename $0) >&2 } system= router= all= db=localhost ms=localhost user=root password= help= maxthreads=10 LOGFILE=cloud.log while getopts 'sarhnd:m:u:p:t:l:' OPTION do case $OPTION in s) system=1 ;; r) router=1 ;; n) redundant=1 ;; a) all=1 ;; d) db="$OPTARG" ;; u) user="$OPTARG" ;; p) password="$OPTARG" ;; h) help=1 ;; m) ms="$OPTARG" ;; t) maxthreads="$OPTARG" ;; l) LOGFILE="$OPTARG" esac done stop_start_system() { secondary=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select id from vm_instance where state=\"Running\" and type=\"SecondaryStorageVm\""`) console=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select id from vm_instance where state=\"Running\" and type=\"ConsoleProxy\""`) length_secondary=(${#secondary[@]}) length_console=(${#console[@]}) echo -e "\nStopping and starting $length_secondary secondary storage vm(s)..." echo -e "Stopping and starting $length_secondary secondary storage vm(s)..." >>$LOGFILE for d in "${secondary[@]}"; do echo "INFO: Stopping secondary storage vm with id $d" >>$LOGFILE jobresult=$(send_request stopSystemVm $d) if [ "$jobresult" != "1" ]; then echo -e "ERROR: Failed to stop secondary storage vm with id $d \n" echo "ERROR: Failed to stop secondary storage vm with id $d" >>$LOGFILE else echo "INFO: Starting secondary storage vm with id $d" >>$LOGFILE jobresult=$(send_request startSystemVm $d SSVM) if [ "$jobresult" != "1" ]; then echo "ERROR: Failed to start secondary storage vm with id $d" >>$LOGFILE echo "ERROR: Failed to start secondary storage vm with id $d" >>$LOGFILE fi fi done if [ "$length_secondary" == "0" ];then echo -e "No running secondary storage vms found \n" else echo -e "Done stopping and starting secondary storage vm(s)" echo -e "Done stopping and starting secondary storage vm(s)." >>$LOGFILE fi echo -e "\nStopping and starting $length_console console proxy vm(s)..." echo -e "Stopping and starting $length_console console proxy vm(s)..." >>$LOGFILE for d in "${console[@]}"; do echo "INFO: Stopping console proxy with id $d" >>$LOGFILE jobresult=$(send_request stopSystemVm $d) if [ "$jobresult" != "1" ]; then echo -e "ERROR: Failed to stop console proxy vm with id $d \n" echo "ERROR: Failed to stop console proxy vm with id $d" >>$LOGFILE else echo "INFO: Starting console proxy vm with id $d" >>$LOGFILE jobresult=$(send_request startSystemVm $d consoleProxy) if [ "$jobresult" != "1" ]; then echo -e "ERROR: Failed to start console proxy vm with id $d \n" echo "ERROR: Failed to start console proxy vm with id $d" >>$LOGFILE fi fi done if [ "$length_console" == "0" ];then echo -e "No running console proxy vms found \n" else echo "Done stopping and starting console proxy vm(s)." echo "Done stopping and starting console proxy vm(s)." >>$LOGFILE fi } stop_start_router() { router=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select id from vm_instance where state=\"Running\" and type=\"DomainRouter\""`) length_router=(${#router[@]}) echo -e "\nStopping and starting $length_router running routing vm(s)... " echo -e "Stopping and starting $length_router running routing vm(s)... " >>$LOGFILE #Spawn reboot router in parallel - run commands in chunks - number of threads is configurable pids=() for d in "${router[@]}"; do reboot_router $d & pids=( "${pids[@]}" $! ) length_pids=(${#pids[@]}) unfinishedPids=(${#pids[@]}) if [ $maxthreads -gt $length_router ]; then maxthreads=$length_router fi if [ $length_pids -ge $maxthreads ]; then while [ $unfinishedPids -gt 0 ]; do sleep 10 count=0 for (( i = 0 ; i < $length_pids; i++ )); do if ! ps ax | grep -v grep | grep ${pids[$i]} > /dev/null; then count=`expr $count + 1` fi done if [ $count -eq $unfinishedPids ]; then unfinishedPids=0 fi done #remove all elements from pids if [ $unfinishedPids -eq 0 ]; then pids=() length_pids=(${#pids[@]}) fi fi done if [ "$length_router" == "0" ];then echo -e "No running router vms found \n" >>$LOGFILE else while [ $unfinishedPids -gt 0 ]; do sleep 10 done echo -e "Done restarting router(s). \n" echo -e "Done restarting router(s). \n" >>$LOGFILE fi } stop_start_all() { stop_start_system stop_start_router } send_request(){ jobid=`curl -sS "http://$ms:8096/?command=$1&id=$2&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F: {'print $3'}` if [ "$jobid" == "" ]; then echo 2 return fi jobresult=$(query_async_job_result $jobid) echo $jobresult } reboot_router(){ echo "INFO: Restarting router with id $1" >>$LOGFILE jobid=`curl -sS "http://$ms:8096/?command=rebootRouter&id=$1&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F: {'print $3'}` if [ "$jobid" == "" ]; then echo "ERROR: Failed to restart domainRouter with id $1" >>$LOGFILE echo 2 return fi jobresult=$(query_async_job_result $jobid) if [ "$jobresult" != "1" ]; then echo -e "ERROR: Failed to restart domainRouter with id $1 \n" echo "ERROR: Failed to restart domainRouter with id $1" >>$LOGFILE exit 0 else echo "INFO: Successfully restarted domainRouter with id $1" >>$LOGFILE exit 0 fi } restart_networks(){ networks=(`mysql -h $db --user=$user --password=$password --skip-column-names -U cloud -e "select n.id from networks n, network_offerings no where n.network_offering_id = no.id and no.system_only = 0 and n.removed is null"`) length_networks=(${#networks[@]}) echo -e "\nRestarting networks... " echo -e "Restarting networks... " >>$LOGFILE #Spawn restart network in parallel - run commands in chunks - number of threads is configurable pids=() for d in "${networks[@]}"; do restart_network $d & pids=( "${pids[@]}" $! ) length_pids=(${#pids[@]}) unfinishedPids=(${#pids[@]}) if [ $maxthreads -gt $length_networks ]; then maxthreads=$length_networks fi if [ $length_pids -ge $maxthreads ]; then while [ $unfinishedPids -gt 0 ]; do sleep 10 count=0 for (( i = 0 ; i < $length_pids; i++ )); do if ! ps ax | grep -v grep | grep ${pids[$i]} > /dev/null; then count=`expr $count + 1` fi done if [ $count -eq $unfinishedPids ]; then unfinishedPids=0 fi done #remove all elements from pids if [ $unfinishedPids -eq 0 ]; then pids=() length_pids=(${#pids[@]}) fi fi done if [ "$length_networks" == "0" ];then echo -e "No networks found \n" >>$LOGFILE else while [ $unfinishedPids -gt 0 ]; do sleep 10 done echo -e "Done restarting networks. \n" echo -e "Done restarting networks. \n" >>$LOGFILE fi } restart_network(){ jobid=`curl -sS "http://$ms:8096/?command=restartNetwork&id=$1&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F: {'print $3'}` if [ "$jobid" == "" ]; then echo "ERROR: Failed to restart network with id $1" >>$LOGFILE echo 2 return fi jobresult=$(query_async_job_result $jobid) if [ "$jobresult" != "1" ]; then echo "ERROR: Failed to restart network with id $1" >>$LOGFILE else echo "INFO: Successfully restarted network with id $1" >>$LOGFILE fi } query_async_job_result() { while [ 1 ] do jobstatus=`curl -sS "http://$ms:8096/?command=queryAsyncJobResult&jobId=$1&response=json" | sed 's/\"//g' | sed 's/ //g' | sed 's/{//g' | sed 's/}//g' | awk -F, {'print $4'} | awk -F: {'print $2'}` if [ "$jobstatus" != "0" ]; then echo $jobstatus break fi sleep 5 done } if [ "$system$router$all$help$redundant" == "" ] then usage exit fi if [ "$help" == "1" ] then usage exit fi if [ "$all" == "1" ] then stop_start_all exit fi if [ "$system" == "1" ] then stop_start_system fi if [ "$router" == "1" ] then stop_start_router fi if [ "$redundant" == "1" ] then restart_networks fi