Browse code

Only run chmod/chown for local files

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

Doug Hellmann authored on 2013/09/05 21:10:07
Showing 2 changed files
... ...
@@ -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