When the /opt/stack directory is NFS mounted, chown to
the local user might not work. Create safe_chown and
safe_chmod functions that do nothing on NFS filesystems
to avoid spurrious errors.
Change-Id: Iaa68879e867a4426b1990d4d46164769177dc7cc
... | ... |
@@ -1158,6 +1158,51 @@ function service_check() { |
1158 | 1158 |
fi |
1159 | 1159 |
} |
1160 | 1160 |
|
1161 |
+# Returns true if the directory is on a filesystem mounted via NFS. |
|
1162 |
+function is_nfs_directory() { |
|
1163 |
+ local mount_type=`stat -f -L -c %T $1` |
|
1164 |
+ test "$mount_type" == "nfs" |
|
1165 |
+} |
|
1166 |
+ |
|
1167 |
+# Only run the command if the target file (the last arg) is not on an |
|
1168 |
+# NFS filesystem. |
|
1169 |
+function _safe_permission_operation() { |
|
1170 |
+ local args=( $@ ) |
|
1171 |
+ local last |
|
1172 |
+ local sudo_cmd |
|
1173 |
+ local dir_to_check |
|
1174 |
+ |
|
1175 |
+ let last="${#args[*]} - 1" |
|
1176 |
+ |
|
1177 |
+ dir_to_check=${args[$last]} |
|
1178 |
+ if [ ! -d "$dir_to_check" ]; then |
|
1179 |
+ dir_to_check=`dirname "$dir_to_check"` |
|
1180 |
+ fi |
|
1181 |
+ |
|
1182 |
+ if is_nfs_directory "$dir_to_check" ; then |
|
1183 |
+ return 0 |
|
1184 |
+ fi |
|
1185 |
+ |
|
1186 |
+ if [[ $TRACK_DEPENDS = True ]]; then |
|
1187 |
+ sudo_cmd="env" |
|
1188 |
+ else |
|
1189 |
+ sudo_cmd="sudo" |
|
1190 |
+ fi |
|
1191 |
+ |
|
1192 |
+ $sudo_cmd $@ |
|
1193 |
+} |
|
1194 |
+ |
|
1195 |
+# Only change ownership of a file or directory if it is not on an NFS |
|
1196 |
+# filesystem. |
|
1197 |
+function safe_chown() { |
|
1198 |
+ _safe_permission_operation chown $@ |
|
1199 |
+} |
|
1200 |
+ |
|
1201 |
+# Only change permissions of a file or directory if it is not on an |
|
1202 |
+# NFS filesystem. |
|
1203 |
+function safe_chmod() { |
|
1204 |
+ _safe_permission_operation chmod $@ |
|
1205 |
+} |
|
1161 | 1206 |
|
1162 | 1207 |
# ``pip install -e`` the package, which processes the dependencies |
1163 | 1208 |
# using pip before running `setup.py develop` |
... | ... |
@@ -1165,11 +1210,6 @@ function service_check() { |
1165 | 1165 |
# setup_develop directory |
1166 | 1166 |
function setup_develop() { |
1167 | 1167 |
local project_dir=$1 |
1168 |
- if [[ $TRACK_DEPENDS = True ]]; then |
|
1169 |
- SUDO_CMD="env" |
|
1170 |
- else |
|
1171 |
- SUDO_CMD="sudo" |
|
1172 |
- fi |
|
1173 | 1168 |
|
1174 | 1169 |
echo "cd $REQUIREMENTS_DIR; $SUDO_CMD python update.py $project_dir" |
1175 | 1170 |
|
... | ... |
@@ -1181,7 +1221,7 @@ function setup_develop() { |
1181 | 1181 |
|
1182 | 1182 |
pip_install -e $project_dir |
1183 | 1183 |
# ensure that further actions can do things like setup.py sdist |
1184 |
- $SUDO_CMD chown -R $STACK_USER $1/*.egg-info |
|
1184 |
+ safe_chown -R $STACK_USER $1/*.egg-info |
|
1185 | 1185 |
} |
1186 | 1186 |
|
1187 | 1187 |
|
... | ... |
@@ -203,7 +203,7 @@ if [[ $EUID -eq 0 ]]; then |
203 | 203 |
echo "Copying files to $STACK_USER user" |
204 | 204 |
STACK_DIR="$DEST/${TOP_DIR##*/}" |
205 | 205 |
cp -r -f -T "$TOP_DIR" "$STACK_DIR" |
206 |
- chown -R $STACK_USER "$STACK_DIR" |
|
206 |
+ safe_chown -R $STACK_USER "$STACK_DIR" |
|
207 | 207 |
cd "$STACK_DIR" |
208 | 208 |
if [[ "$SHELL_AFTER_RUN" != "no" ]]; then |
209 | 209 |
exec sudo -u $STACK_USER bash -l -c "set -e; bash stack.sh; bash" |
... | ... |
@@ -236,8 +236,8 @@ fi |
236 | 236 |
# Create the destination directory and ensure it is writable by the user |
237 | 237 |
# and read/executable by everybody for daemons (e.g. apache run for horizon) |
238 | 238 |
sudo mkdir -p $DEST |
239 |
-sudo chown -R $STACK_USER $DEST |
|
240 |
-chmod 0755 $DEST |
|
239 |
+safe_chown -R $STACK_USER $DEST |
|
240 |
+safe_chmod 0755 $DEST |
|
241 | 241 |
|
242 | 242 |
# a basic test for $DEST path permissions (fatal on error unless skipped) |
243 | 243 |
check_path_perm_sanity ${DEST} |
... | ... |
@@ -258,7 +258,7 @@ ENABLE_DEBUG_LOG_LEVEL=`trueorfalse True $ENABLE_DEBUG_LOG_LEVEL` |
258 | 258 |
# Destination path for service data |
259 | 259 |
DATA_DIR=${DATA_DIR:-${DEST}/data} |
260 | 260 |
sudo mkdir -p $DATA_DIR |
261 |
-sudo chown -R $STACK_USER $DATA_DIR |
|
261 |
+safe_chown -R $STACK_USER $DATA_DIR |
|
262 | 262 |
|
263 | 263 |
|
264 | 264 |
# Common Configuration |
... | ... |
@@ -954,7 +954,7 @@ if is_service_enabled n-net q-dhcp; then |
954 | 954 |
clean_iptables |
955 | 955 |
rm -rf ${NOVA_STATE_PATH}/networks |
956 | 956 |
sudo mkdir -p ${NOVA_STATE_PATH}/networks |
957 |
- sudo chown -R ${USER} ${NOVA_STATE_PATH}/networks |
|
957 |
+ safe_chown -R ${USER} ${NOVA_STATE_PATH}/networks |
|
958 | 958 |
# Force IP forwarding on, just in case |
959 | 959 |
sudo sysctl -w net.ipv4.ip_forward=1 |
960 | 960 |
fi |