diff --git a/src/datastore_mad/remotes/fs/cp b/src/datastore_mad/remotes/fs/cp index 3f99bc4324..b7fe2249f7 100755 --- a/src/datastore_mad/remotes/fs/cp +++ b/src/datastore_mad/remotes/fs/cp @@ -39,10 +39,25 @@ source ${DRIVER_PATH}/../libfs.sh DRV_ACTION=$1 ID=$2 -set_up_datastore $DRV_ACTION - XPATH="${DRIVER_PATH}/../xpath.rb -b $DRV_ACTION" -SRC=`$XPATH /DS_DRIVER_ACTION_DATA/IMAGE/PATH` + +unset i XPATH_ELEMENTS + +while IFS= read -r -d '' element; do + XPATH_ELEMENTS[i++]="$element" +done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/RESTRICTED_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/SAFE_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/UMASK \ + /DS_DRIVER_ACTION_DATA/IMAGE/PATH) + +BASE_PATH="${XPATH_ELEMENTS[0]}" +RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}" +SAFE_DIRS="${XPATH_ELEMENTS[2]}" +UMASK="${XPATH_ELEMENTS[3]}" +SRC="${XPATH_ELEMENTS[4]}" + +set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK" DST=`generate_image_path` @@ -53,8 +68,6 @@ http://*) log "Downloading $SRC to the image repository" exec_and_log "$WGET -O $DST $SRC" "Error downloading $SRC" - - exec_and_log "chmod 0660 $DST" ;; *) @@ -67,8 +80,6 @@ http://*) log "Copying local image $SRC to the image repository" exec_and_log "cp -f $SRC $DST" "Error copying $SRC to $DST" - - exec_and_log "chmod 0660 $DST" ;; esac diff --git a/src/datastore_mad/remotes/fs/mkfs b/src/datastore_mad/remotes/fs/mkfs index 5ec61bdb36..7f27552ad6 100755 --- a/src/datastore_mad/remotes/fs/mkfs +++ b/src/datastore_mad/remotes/fs/mkfs @@ -39,20 +39,32 @@ source ${DRIVER_PATH}/../libfs.sh DRV_ACTION=$1 ID=$2 -set_up_datastore $DRV_ACTION +XPATH="${DRIVER_PATH}/../xpath.rb -b $DRV_ACTION" unset i XPATH_ELEMENTS while IFS= read -r -d '' element; do XPATH_ELEMENTS[i++]="$element" -done < <($XPATH /DS_DRIVER_ACTION_DATA/IMAGE/FSTYPE \ +done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/RESTRICTED_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/SAFE_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/UMASK \ + /DS_DRIVER_ACTION_DATA/IMAGE/PATH \ + /DS_DRIVER_ACTION_DATA/IMAGE/FSTYPE \ /DS_DRIVER_ACTION_DATA/IMAGE/SIZE) -FSTYPE="${XPATH_ELEMENTS[0]}" -SIZE="${XPATH_ELEMENTS[1]}" + +BASE_PATH="${XPATH_ELEMENTS[0]}" +RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}" +SAFE_DIRS="${XPATH_ELEMENTS[2]}" +UMASK="${XPATH_ELEMENTS[3]}" +SRC="${XPATH_ELEMENTS[4]}" +FSTYPE="${XPATH_ELEMENTS[5]}" +SIZE="${XPATH_ELEMENTS[6]}" + +set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK" DST=`generate_image_path` - # ------------ Create the image to the repository ------------ MKFS_CMD=`mkfs_command $DST $FSTYPE` @@ -61,7 +73,6 @@ exec_and_log "$DD if=/dev/zero of=$DST bs=1 count=1 seek=${SIZE}M" \ "Could not create image $DST" exec_and_log "$MKFS_CMD" \ "Unable to create filesystem $FSTYPE in $DST" -exec_and_log "chmod 0660 $DST" # ---------------- Get the size of the image ------------ SIZE=`fs_du $DST` diff --git a/src/datastore_mad/remotes/libfs.sh b/src/datastore_mad/remotes/libfs.sh index 4f61c99354..e1b5f67717 100644 --- a/src/datastore_mad/remotes/libfs.sh +++ b/src/datastore_mad/remotes/libfs.sh @@ -17,8 +17,11 @@ #--------------------------------------------------------------------------- # #------------------------------------------------------------------------------ -# Set up environment variables -# @param $1 - template (base 64 encoded) with driver data +# Set up environment variables +# @param $1 - Datastore base_path +# @param $2 - Restricted directories +# @param $3 - Safe dirs +# @param $4 - Umask for new file creation (default: 0007) # @return sets the following environment variables # - RESTRICTED_DIRS: Paths that can not be used to register images # - SAFE_DIRS: Paths that are safe to specify image paths @@ -28,6 +31,11 @@ function set_up_datastore { # # Load the default configuration for FS datastores # + BASE_PATH="$1" + RESTRICTED_DIRS="$2" + SAFE_DIRS="$3" + UMASK="$4" + if [ -z "${ONE_LOCATION}" ]; then VAR_LOCATION=/var/lib/one/ ETC_LOCATION=/etc/one/ @@ -36,24 +44,6 @@ function set_up_datastore { ETC_LOCATION=$ONE_LOCATION/etc/ fi - CONF_FILE=$ETC_LOCATION/datastore/fs.conf - - source $CONF_FILE - - # - # Load attributes from the Datastore - # - XPATH="$VAR_LOCATION/remotes/datastore/xpath.rb -b $1" - eval "DS_BASE_PATH=`$XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH`" - - if [ -z "${DS_BASE_PATH}" ]; then - if [ -z "${BASE_PATH}" ]; then - BASE_PATH="${VAR_LOCATION}/images" - fi - else - BASE_PATH=${DS_BASE_PATH} - fi - # # RESTRICTED AND SAFE DIRS (from default configuration) # @@ -62,6 +52,14 @@ function set_up_datastore { export BASE_PATH export RESTRICTED_DIRS export SAFE_DIRS + + mkdir -p $BASE_PATH + + if [ -n "$UMASK" ]; then + umask $UMASK + else + umask 0007 + fi } #------------------------------------------------------------------------------- @@ -102,6 +100,22 @@ function fs_du { echo "$SIZE" } +#------------------------------------------------------------------------------- +# Computes the size of an image +# @param $1 - Path to the image +# @return size of the image in Mb +#------------------------------------------------------------------------------- +function qemu_size { + DISK="$1" + + SIZE=`$QEMU_IMG info $DISK|grep "^virtual size:"|\ + sed 's/^.*(\([0-9]\+\) bytes.*$/\1/g'` + + SIZE=$(($SIZE/1048576)) + + echo "$SIZE" +} + #------------------------------------------------------------------------------- # Checks if a path is safe for copying the image from # @param $1 - Path to the image diff --git a/src/datastore_mad/remotes/vmware/cp b/src/datastore_mad/remotes/vmware/cp index 069bd89b72..f216d95892 100755 --- a/src/datastore_mad/remotes/vmware/cp +++ b/src/datastore_mad/remotes/vmware/cp @@ -39,10 +39,25 @@ source ${DRIVER_PATH}/../libfs.sh DRV_ACTION=$1 ID=$2 -set_up_datastore $DRV_ACTION - XPATH="${DRIVER_PATH}/../xpath.rb -b $DRV_ACTION" -SRC=`$XPATH /DS_DRIVER_ACTION_DATA/IMAGE/PATH` + +unset i XPATH_ELEMENTS + +while IFS= read -r -d '' element; do + XPATH_ELEMENTS[i++]="$element" +done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/RESTRICTED_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/SAFE_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/UMASK \ + /DS_DRIVER_ACTION_DATA/IMAGE/PATH) + +BASE_PATH="${XPATH_ELEMENTS[0]}" +RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}" +SAFE_DIRS="${XPATH_ELEMENTS[2]}" +UMASK="${XPATH_ELEMENTS[3]}" +SRC="${XPATH_ELEMENTS[4]}" + +set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK" DST=`generate_image_path` @@ -66,8 +81,6 @@ case $SRC in exec_and_log "mv -f $DST/$BASE_DISK_FILE $DST/disk.vmdk" \ "Error renaming disk file $BASE_DISK_FILE to disk.vmdk" fi - - exec_and_log "chmod 0770 $DST" ;; esac diff --git a/src/datastore_mad/remotes/vmware/mkfs b/src/datastore_mad/remotes/vmware/mkfs index e7e623c713..f48f2535d8 100755 --- a/src/datastore_mad/remotes/vmware/mkfs +++ b/src/datastore_mad/remotes/vmware/mkfs @@ -39,19 +39,29 @@ source ${DRIVER_PATH}/../libfs.sh DRV_ACTION=$1 ID=$2 -set_up_datastore $DRV_ACTION - XPATH="${DRIVER_PATH}/../xpath.rb -b $DRV_ACTION" unset i XPATH_ELEMENTS while IFS= read -r -d '' element; do XPATH_ELEMENTS[i++]="$element" -done < <($XPATH /DS_DRIVER_ACTION_DATA/IMAGE/FSTYPE \ +done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/RESTRICTED_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/SAFE_DIRS \ + /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/UMASK \ + /DS_DRIVER_ACTION_DATA/IMAGE/PATH \ + /DS_DRIVER_ACTION_DATA/IMAGE/FSTYPE \ /DS_DRIVER_ACTION_DATA/IMAGE/SIZE) -FSTYPE="${XPATH_ELEMENTS[0]}" -SIZE="${XPATH_ELEMENTS[1]}" +BASE_PATH="${XPATH_ELEMENTS[0]}" +RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}" +SAFE_DIRS="${XPATH_ELEMENTS[2]}" +UMASK="${XPATH_ELEMENTS[3]}" +SRC="${XPATH_ELEMENTS[4]}" +FSTYPE="${XPATH_ELEMENTS[5]}" +SIZE="${XPATH_ELEMENTS[6]}" + +set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK" DST=`generate_image_path` @@ -60,7 +70,6 @@ DISK_TMP=$DISK.tmp IMAGE_FORMAT=vmdk -umask 0007 # ------------ Create the image to the repository ------------ MKFS_CMD=`mkfs_command $DISK_TMP $FSTYPE` @@ -75,13 +84,9 @@ exec_and_log "$QEMU_IMG convert -O $IMAGE_FORMAT $DISK_TMP $DISK" \ "Unable to convert to $IMAGE_FORMAT in $DISK_TMP" exec_and_log "rm -f $DISK_TMP" \ "Unable to remove temporary disk $DISK_TMP" -exec_and_log "chmod 0660 $DISK" # ---------------- Get the size of the image ------------ -SIZE=`$QEMU_IMG info $DISK|grep "^virtual size:"|\ - sed 's/^.*(\([0-9]\+\) bytes.*$/\1/g'` - -SIZE=$(($SIZE/1048576)) +SIZE=`qemu_size $DISK` echo "$DST $SIZE" diff --git a/src/datastore_mad/remotes/xpath.rb b/src/datastore_mad/remotes/xpath.rb index 3cf8af12b5..9a330d7247 100755 --- a/src/datastore_mad/remotes/xpath.rb +++ b/src/datastore_mad/remotes/xpath.rb @@ -47,7 +47,7 @@ xml = REXML::Document.new(tmp).root ARGV.each do |xpath| element = xml.elements[xpath] - values << element.text if !element.nil? + values << element.text.to_s if !element.nil? values << "\0" end