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 |