5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # This tool is meant to stop processes running in a given directory.
18 # Evacuate its contents to a temp location.
19 # Mount a given LVM to the Directory
20 # optionally change ownership of the root of the LVM
21 # Start those services again
23 #arg1: Directory to evacuate
24 #arg2: Volume dev path to mount
25 #arg3/arg4 (optional, must provide both): owner/group of root directory of new mount
27 exec >> /tmp/vol_mgmt_logfile
35 elif [[ $# == 2 ]]; then
38 # they didn't provide a u/g. use the owner of the mountpoint if
39 # it exists or our own user/group (almost certaimly root) if not.
40 owner=`stat -c '%U' ${evac_dir} 2>/dev/null || id -un`
41 group=`stat -c '%G' ${evac_dir} 2>/dev/null || id -gn`
43 echo "Improper number of arguments passed!!"
47 echo "Trying to mount $mount_vol_dev on $evac_dir"
49 # Run partprobe to load new volumes
52 if [ ! -d $evac_dir ];then
53 echo "Provided directory $evac_dir does not exist, so lets create it."
57 # mirror the permissions of the existing directory
58 oPerm=`stat -c '%a' ${evac_dir}`
60 if [ ! -b $mount_vol_dev ];then
61 echo "Provided volume $mount_vol_dev is not a block device!!"
65 # check if given directory is already mounted from needed volume
66 df -k $evac_dir | grep $mount_vol_dev > /dev/null 2>&1
68 echo "$evac_dir is already mounted from $mount_vol_dev"
72 running_process_list=`lsof | grep ${evac_dir} | awk -F " " {'print $2'}| uniq`
73 systemd_service_list=`systemctl --state=active --type=socket,service | grep "loaded active" | awk -F " " {'print $1'}`
75 declare -a matching_systemd_services
76 for process in ${running_process_list}; do
77 for systemd_service in ${systemd_service_list}; do
78 systemd_MainPID=`systemctl show -p MainPID ${systemd_service} | awk -F "MainPID=" {'print $2'}`
79 if [[ $process == $systemd_MainPID ]];then
80 matching_systemd_services+=(${systemd_service})
86 # Stop running services which were using old dir
87 echo "Stopping services ${matching_systemd_services[@]}"
88 for service_name in ${matching_systemd_services[@]}; do
89 systemctl stop $service_name > /dev/null 2>&1
91 service_base_name=`echo $service_name | awk -F ".service" {'print $1'}`
92 service $service_base_name stop > /dev/null 2>&1
97 while [[ $service_wait_count != 0 && $systemd_status == 0 ]]; do
98 echo "waiting for $service_name to stop"
100 ((service_wait_count--))
101 systemctl status $service_name > /dev/null 2>&1
105 if [[ $service_wait_count == 0 ]];then
106 echo "$service_name did not stop gracefully. Stopping it forcefully."
107 systemctl -f stop $service_name > /dev/null 2>&1
111 # Move old dir contents to tmp location
112 tmp_dir="/tmp/`basename ${evac_dir}`"
114 cp -rpf ${evac_dir}/* $tmp_dir
117 # Mount the volume on dir
120 chown ${owner}:${group} ${evac_dir}
121 chmod ${oPerm} ${evac_dir}
123 cp -rpf $tmp_dir/* ${evac_dir}/
126 # Start the services again
127 echo "Starting services ${matching_systemd_services[@]}"
128 for service_name in ${matching_systemd_services[@]}; do
129 systemctl start $service_name > /dev/null 2>&1