#!/usr/local/bin/scripts/sh # #.Y / 70 83 / / / / 105 / / / / / / ;A4_QUER.Y #.YT 3 2 0 0 3 3 1 / / / #.H!a!0:linux//io/disk/mediaAccess/mediaHandlers.d/A8A2BB31_78F0_11E6_B6F3_0000C00A45A9!0.!c # #/******************************************************************************* # io disk mediaAccess mediaHandlers.d/A8A2BB31_78F0_11E6_B6F3_0000C00A45A9 # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # # purpose : media handler for a thin provisioned media # # begin : Wed Jun 7 20:41:30 CEST 2017 # # changes : # # copyright : (C) 2017 by Thomas Bruecker # # email : public@thomas-r-bruecker.ch # # version : -0.0.0 # #*******************************************************************************/ #/*************************************************************************** # * * # * This program is free software; you can redistribute it and/or modify * # * it under the terms of the GNU General Public License as published by * # * the Free Software Foundation; either version 2 of the License, or * # * (at your option) any later version. * # * * # * This program is distributed in the hope that it will be useful, but * # * WITHOUT ANY WARRANTY; without even the implied warranty of * # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * # * General Public License for more details. * # * * # * You should have received a copy of the GNU General Public License * # * along with this program; if not, write to the Free Software * # * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * # * MA 02110-1301 USA. * # * * # ***************************************************************************/ # MyHash("A8A2BB31_78F0_11E6_B6F3_0000C00A45A9") = 0x088A_31 # # * for every function: # * if returned result is not commented, the function returns 0 on no-error. disk_mediaAccess_A8A2BB31_78F0_11E6_B6F3_0000C00A45A9() { # handles a dm-thin media; # $1: command, in { # "2ChildDev", "2ChildMedia", "CP", "CREATE", "DESTROY", "REALIZE", # "RealizeForced", "RM", "SIZE", "VERIFY", "WAIT" # }, # * $1 in { # "2ChildDev", "2ChildMedia", "DESTROY", "REALIZE", "RealizeForced", # "SIZE", "VERIFY", "WAIT" # }: see "../CommonCommandsSpecification.TXT", # * "CP": # create a thin media as a copy of the source thin media # (aka snapshot), # $2: , # $3: , # $4: , # $5: , # $6: ; # * "CPN": # create a thin media as a copy of the source thin media # (aka snapshot), # $2: , # $3: , # $4: , # $6: ; # * "CREATE": # create a thin media, # $2: , # $3: , # $4: ; # * "DELTA": # 'thin_delta'; # $1: , # $2: # $3: ; # * "RM": # irreversibly remove the thin media; # $2: , # $3: , # $4: ; # * "_:": ^verify command, # ^$2: path to the media (device, file, rootFolder of a filsystem), # ^$3: index into container, # * "__:": ^verify command, # $2: media-handler-uuid, # $3: size, # $4: uuid, # $5: prefix, most often: indent; # ^* writes the size-parameter to "stdout". local COMMAND DestIndex DestMedia FORCED INDEX INDEX1 MEDIA1 MediaInfo local ParentMedia ParentMediaPath COMMAND="$1" INDEX="$2" MediaInfo="$3" ParentMedia="$4" ParentMediaPath="$5" # echo $COMMAND >>/dev/stderr # echo $INDEX >>/dev/stderr # echo "$MediaInfo" >>/dev/stderr # echo $ParentMedia >>/dev/stderr # echo $ParentMediaPath >>/dev/stderr # ^pen: wait for compos quick, for verifying and 'wait': disk_mediaAccess__VerifyNoWait "$COMMAND" && return 0 # if ok, return 0; no # waiting for component # medias at all. disk_mediaAccess__RealizeForced2Forced "$COMMAND" # echo FORCED: $FORCED >>/dev/stderr case "$COMMAND" in 2ChildDev) disk_mediaAccess___2ChildDev \ "$INDEX" "$MediaInfo" "$ParentMedia" "$ParentMediaPath" ;; 2ChildMedia) disk_mediaAccess___2ChildMedia0 "$MediaInfo" ;; CHECK|REPAIR) return 0 ;; CP) DestMedia="$6" DestIndex="$7" disk_mediaAccess__0x088A_31_CP \ "$DestIndex" "$DestMedia" "$MediaInfo" ;; # copy 'as snapshot'. CpByIndex) DestIndex="$6" disk_mediaAccess__0x088A_31_CpByIndex \ "$DestIndex" "$ParentMedia" "$MediaInfo" "$ParentMediaPath" ;; # copy 'as snapshot'. CREATE) disk_mediaAccess__0x088A_31_CREATE "$MediaInfo" ;; DELTA) MEDIA1="$6" INDEX1="$7" shift 7 disk_mediaAccess__0x088A_31_DELTA \ "$INDEX1" "$MediaInfo" "$MEDIA1" "$@" ;; # 'thin_delta'. DeltaByIndex) INDEX1="$6" shift 6 disk_mediaAccess__0x088A_31_DeltaByIndex \ "$INDEX1" "$ParentMedia" "$MediaInfo" "$ParentMediaPath" "$@" ;; # 'thin_delta'. DESTROY) disk_mediaAccess___Destroy0 "$MediaInfo" '' ;; REALIZE|RealizeForced) disk_mediaAccess__0x088A_31_REALIZE \ "$FORCED" "$INDEX" "$MediaInfo" "$ParentMediaPath" ;; RM) disk_mediaAccess__0x088A_31_RM "$MediaInfo" ;; # remove. SIZE) disk_mediaAccess__Size1 ;; _DeviceCommand) shift 6 disk_mediaAccess___0x088A_31_DeviceCommand "$MediaInfo" "$@" ;; _GetXlatedMediaInfo) echo "$MediaInfo" ;; _:) shift 1 disk_mediaAccess_0x088A_col__ "$@" ;; # ^ __:) shift 1 disk_mediaAccess_0x088A_col___ "$@" ;; # ^ *) disk_mediaAccess___NoContainer \ "$COMMAND" "$INDEX" "$ParentMedia" \ || return # return on error. disk_mediaAccess__InvalidCommandError \ "$COMMAND" "$INDEX" \ 'A8A2BB31_78F0_11E6_B6F3_0000C00A45A9' \ "$ParentMedia" ;; esac # return result of previous } # command. disk_mediaAccess__0x088A_31_CP() { # ^ create a thin media as a copy of the source thin media (aka snapshot), # takes an index into a container as the ; # $1: , # $2: , # $3: . local DestIndex DestMedia DestMediaInfo SourceMediaInfo DestIndex="$1" DestMedia="$2" SourceMediaInfo="$3" # echo $DestIndex >>/dev/stderr # echo $DestMedia >>/dev/stderr # echo "$SourceMediaInfo" >>/dev/stderr DestMediaInfo="$( disk_mediaAccess___GetMayBeXlatedMediaInfo "$DestIndex" "$DestMedia" )" || return # return on error. # echo "$DestMediaInfo" >>/dev/stderr disk_mediaAccess____0x088A_31_CP \ "$DestMediaInfo" "$SourceMediaInfo" } disk_mediaAccess__0x088A_31_CpByIndex() { # ^ create a thin media as a copy of the source thin media (aka snapshot), # takes an index into a container as the ; # $1: , # $2: , # $3: , # $4: . local DestIndex DestMediaInfo SourceMedia SourceMediaInfo SourceMediaPath DestIndex="$1" SourceMedia="$2" SourceMediaInfo="$3" SourceMediaPath="$4" # echo $DestIndex >>/dev/stderr # echo $SourceMedia >>/dev/stderr # echo "$SourceMediaInfo" >>/dev/stderr # echo $SourceMediaPath >>/dev/stderr DestMediaInfo="$( disk_mediaAccess____GetMediaInfo \ "$DestIndex" "$SourceMedia" "$SourceMediaPath" )" || return # return on error. # echo "$DestMediaInfo" >>/dev/stderr disk_mediaAccess____0x088A_31_CP \ "$DestMediaInfo" "$SourceMediaInfo" } disk_mediaAccess__0x088A_31_CREATE() { # create a thin media; # $1: . # global: DeviceMapperBasePath0x0EAA local MediaInfo ParametersFile # parameters: local PoolMedia ThinId MediaInfo="$1" # echo "$MediaInfo" >>/dev/stderr ParametersFile="$(disk_mediaAccess__Parameters2File "$MediaInfo")" \ || return # return on error. . "$ParametersFile" || return # return on error. # echo $PoolMedia >>/dev/stderr # echo $ThinId >>/dev/stderr disk_mediaAccess____0x088A_31_Message2Pool \ "$MediaInfo" "create_thin $ThinId" } disk_mediaAccess__0x088A_31_DELTA() { # 'thin_delta'; takes a media-index-pairs and an as arguments; # $1: , # $2: , # $3: , # $@: ... . local INDEX1 Media0Info MEDIA1 Media1Info INDEX1="$1" Media0Info="$2" MEDIA1="$3" shift 3 # echo $INDEX1 >>/dev/stderr # echo "$Media0Info" >>/dev/stderr # echo $MEDIA1 >>/dev/stderr # echo "$@" >>/dev/stderr Media1Info="$( disk_mediaAccess___GetMayBeXlatedMediaInfo "$INDEX1" "$MEDIA1" \ )" || return # return on error. # echo "$Media1Info" >>/dev/stderr disk_mediaAccess____0x088A_31_2_MediaOperation \ "$Media0Info" "$Media1Info" 'disk_mediaAccess____0x088A_31_DELTA' "$@" } disk_mediaAccess__0x088A_31_DeltaByIndex() { # 'thin_delta'; takes two media-index-pairs as arguments; # $1: , # $2: , # $3: , # $4: , # $@: ... . local INDEX1 MEDIA0 Media0Info Media0Path MEDIA1 Media1Info INDEX1="$1" MEDIA0="$2" Media0Info="$3" Media0Path="$4" shift 4 # echo $INDEX1 >>/dev/stderr # echo $MEDIA0 >>/dev/stderr # echo "$Media0Info" >>/dev/stderr # echo $Media0Path >>/dev/stderr # echo "$@" >>/dev/stderr Media1Info="$( disk_mediaAccess____GetMediaInfo \ "$INDEX1" "$MEDIA0" "$Media0Path" )" || return # return on error. # echo "$Media1Info" >>/dev/stderr disk_mediaAccess____0x088A_31_2_MediaOperation \ "$Media0Info" "$Media1Info" 'disk_mediaAccess____0x088A_31_DELTA' "$@" } disk_mediaAccess__0x088A_31_REALIZE() { # realize media or realize media forced; # $1: . # $2: , # $3: , # $4: . # global: DeviceMapperBasePath0x0EAA local ChildMediaName FORCED INDEX MediaInfo ParametersFile local ParentMediaPath TABLE # parameters: local COPYRIGHT CopyrightDetails OnlyOnHosts NOTES PoolMedia local RealizationOptions ThinId SIZE URL UUID FORCED="$1" INDEX="$2" MediaInfo="$3" ParentMediaPath="$4" # echo $FORCED >>/dev/stderr # echo $INDEX >>/dev/stderr # echo "$MediaInfo" >>/dev/stderr # echo $ParentMedia >>/dev/stderr # clear global optional not ignored parameters. OnlyOnHosts='' RealizationOptions='' ParametersFile="$(disk_mediaAccess__Parameters2File "$MediaInfo")" \ || return # return on error. . "$ParametersFile" || return # return on error. # echo $COPYRIGHT >>/dev/stderr # echo $CopyrightDetails >>/dev/stderr # echo $OnlyOnHosts >>/dev/stderr # echo $NOTES >>/dev/stderr # echo $PoolMedia >>/dev/stderr # echo $RealizationOptions >>/dev/stderr # echo $ThinId >>/dev/stderr # echo $SIZE >>/dev/stderr # echo $URL >>/dev/stderr # echo $UUID >>/dev/stderr ChildMediaName="$UUID" disk_mediaAccess_isHandled \ "$FORCED" "$OnlyOnHosts" "$RealizationOptions" || return 0 TABLE="0 $SIZE thin ${DeviceMapperBasePath0x0EAA}/$PoolMedia $ThinId" # echo $TABLE >>/dev/stderr echo -n "$TABLE" | disk_mediaAccess__DmCreate \ "$ChildMediaName" "$RealizationOptions" || return # return on error. disk_mediaAccess__LinkAndMap \ "$ChildMediaName" "$INDEX" "$ParentMediaPath" } disk_mediaAccess__0x088A_31_RM() { # irreversibly remove the thin media; # $1: . local MediaInfo ParametersFile # parameters: local PoolMedia ThinId MediaInfo="$1" # echo "$MediaInfo" >>/dev/stderr ParametersFile="$(disk_mediaAccess__Parameters2File "$MediaInfo")" \ || return # return on error. . "$ParametersFile" || return # return on error. # echo $ThinId >>/dev/stderr # echo $PoolMedia >>/dev/stderr disk_mediaAccess____0x088A_31_Message2Pool \ "$MediaInfo" "delete $ThinId" } disk_mediaAccess_0x088A_31_col__() { # $1: size, # $2: uuid, # $3: prefix; most often: indent, # * writes the size-parameter to "stdout". local MediaHandlerUuid PREFIX SIZE UUID PREFIX="$3" PREFIX1=" $PREFIX0" SIZE="$1" UUID="$2" MediaHandlerUuid="$( echo "${FUNCNAME[1]}" \ | string__SearchAndReplace '^disk_mediaAccess_*' '' \ | string_SearchAndReplace '_' '-' \ )" disk_mediaAccess_0x088A_31_col___ \ "$MediaHandlerUuid" "$SIZE" "$UUID" "$PREFIX" } disk_mediaAccess_0x088A_31_col___() { # $1: media-handler-uuid, # $2: size, # $3: uuid, # $4: prefix; most often: indent, # ^* writes the size-parameter to "stdout". local MediaHandlerUuid PREFIX SIZE UUID MediaHandlerUuid="$1" PREFIX0="$4" PREFIX1=" $PREFIX0" SIZE="$2" UUID="$3" START='8' # ^ # ^ sort parameters. disk_mediaAccess_col__METHOD "$MediaHandlerUuid" "$PREFIX0" disk_mediaAccess_col__CommonParameters "$MediaHandlerUuid" "$PREFIX1" disk_mediaAccess_col__SIZE "$SIZE" "$PREFIX1" disk_mediaAccess_col__START "$START" "$PREFIX1" disk_mediaAccess_col__UUID "$UUID" "$PREFIX1" disk_mediaAccess_col__MethodEnd "$PREFIX0" } disk_mediaAccess_col__LINEAR() { # ': _LINEAR' # $1: size, # $2: uuid, # $3: prefix; most often: indent, # * writes the size-parameter to "stdout". disk_mediaAccess__0x088A_31 "_:" "$@" } disk_mediaAccess_col___LINEAR() { # ': __LINEAR' # $1: media-handler-uuid, # $2: size, # $3: uuid, # $4: prefix; most often: indent, # ^* writes the size-parameter to "stdout". disk_mediaAccess__0x088A_31 "__:" "$@" } disk_mediaAccess___0x088A_31_DeviceCommand() { # execute a command on the ; # $1: , # $@: ... . # global: DeviceMapperBasePath0x0EAA DmSetup0x0EAA local ChildMediaName MediaInfo MediaInfo="$1" shift 1 # echo "$MediaInfo" >>/dev/stderr ChildMediaName="$(disk_mediaAccess___2ChildUuid "$MediaInfo")" || return # return on error. "$DmSetup0x0EAA" "$@" "${DeviceMapperBasePath0x0EAA}/$ChildMediaName" } disk_mediaAccess___isThinProvisionedMedia() { # ^ * returns "0" (true) if the media handler uuid may be handled. # ^ purpose : media handler for a thin provisioned media # $1: , # $2: , # $3: . local INDEX ParentMedia ParentMediaPath INDEX="$1" ParentMedia="$2" ParentMediaPath="$3" # echo $INDEX >>/dev/stderr # echo $ParentMedia >>/dev/stderr # echo $ParentMediaPath >>/dev/stderr disk_mediaAccess__isMediaHandlerUuid \ "$INDEX" "$ParentMedia" "$ParentMediaPath" \ 'A8A2BB31_78F0_11E6_B6F3_0000C00A45A9' # return result of last } # command. disk_mediaAccess____0x088A_31_2_MediaOperation() { # ^ create a thin media as a copy of the source thin media (aka snapshot), # takes an index into a container as the ; # $1: , # $2: , # $3: , # $@: ... . local Media0Info Media1Info OPERATION ParametersFile Pool0Media Pool1Media local Thin0Id Thin1Id # parameters: local PoolMedia ThinId Media0Info="$1" Media1Info="$2" OPERATION="$3" shift 3 # echo "$Media0Info" >>/dev/stderr # echo "$Media1Info" >>/dev/stderr # echo $OPERATION >>/dev/stderr # echo "$@" >>/dev/stderr # media0: ParametersFile="$(disk_mediaAccess__Parameters2File "$Media0Info")" \ || return # return on error. . "$ParametersFile" || return # return on error. # echo $PoolMedia >>/dev/stderr # echo $ThinId >>/dev/stderr Pool0Media="$PoolMedia"; Thin0Id="$ThinId" # media1: ParametersFile="$(disk_mediaAccess__Parameters2File "$Media1Info")" \ || return # return on error. . "$ParametersFile" || return # return on error. # echo $PoolMedia >>/dev/stderr # echo $ThinId >>/dev/stderr Pool1Media="$PoolMedia"; Thin1Id="$ThinId" # echo $Pool0Media >>/dev/stderr # echo $Pool1Media >>/dev/stderr # echo $Thin0Id >>/dev/stderr # echo $Thin1Id >>/dev/stderr [ "$Pool0Media" == "$Pool1Media" ] || return '201' "$OPERATION" "$Media0Info" "$Thin0Id" "$Thin1Id" "$@" } disk_mediaAccess____0x088A_31_CP() { # create a thin media as a copy of the source thin media (aka snapshot); # $1: , # $2: . local DestMediaInfo SourceMediaInfo DestMediaInfo="$1" SourceMediaInfo="$2" # echo "$DestMediaInfo" >>/dev/stderr # echo "$SourceMediaInfo" >>/dev/stderr disk_mediaAccess____0x088A_31_2_MediaOperation \ "$SourceMediaInfo" "$DestMediaInfo" 'disk_mediaAccess_____0x088A_31_CP' } disk_mediaAccess____0x088A_31_DELTA() { # 'thin_delta'; # $1: , # $2: , # $3: , # $@: ... . # global: ThinDelta0x0EAA local MediaInfo ParametersFile PoolIndex RESULT Thin0Id Thin1Id local _PoolMedia # parameters: local PoolMedia MediaInfo="$1" Thin0Id="$2" Thin1Id="$3" shift 3 # echo "$MediaInfo" >>/dev/stderr # echo $Thin0Id >>/dev/stderr # echo $Thin1Id >>/dev/stderr # echo "$@" >>/dev/stderr ParametersFile="$(disk_mediaAccess__Parameters2File "$MediaInfo")" \ || return # return on error. . "$ParametersFile" || return # return on error. _PoolMedia="$(disk_mediaAccess__WriteQualifiedUuid "$PoolMedia")" # echo $PoolMedia >>/dev/stderr PoolIndex="$( disk_mediaAccess___2ParentIndex "${_PoolMedia}" )" || return # return on error. # echo $PoolIndex >>/dev/stderr _PoolMedia="$( disk_mediaAccess___2ParentMedia "${_PoolMedia}" )" || return # return on error. # echo ${_PoolMedia} >>/dev/stderr disk_mediaAccess___MediaHandlerCommand \ 'ReserveMetadataSnap' "$PoolIndex" "${_PoolMedia}" "$@" || return # return on error. disk_mediaAccess___MediaHandlerCommand \ '__RunThinTool' "$PoolIndex" "${_PoolMedia}" \ "$ThinDelta0x0EAA" -m --thin1 "$Thin0Id" --thin2 "$Thin1Id" "$@" RESULT="$?" disk_mediaAccess___MediaHandlerCommand \ 'ReleaseMetadataSnap' "$PoolIndex" "${_PoolMedia}" "$@" || return # return on error. return "$RESULT" } disk_mediaAccess____0x088A_31_Message2Pool() { # send a message to the pool of the ; # $1: , # $@: ... . local MediaInfo ParametersFile PoolIndex _PoolMedia # parameters: local PoolMedia MediaInfo="$1" shift 1 # echo "$MediaInfo" >>/dev/stderr ParametersFile="$(disk_mediaAccess__Parameters2File "$MediaInfo")" \ || return # return on error. . "$ParametersFile" || return # return on error. _PoolMedia="$(disk_mediaAccess__WriteQualifiedUuid "$PoolMedia")" # echo $PoolMedia >>/dev/stderr PoolIndex="$( disk_mediaAccess___2ParentIndex "${_PoolMedia}" )" || return # return on error. # echo $PoolIndex >>/dev/stderr _PoolMedia="$( disk_mediaAccess___2ParentMedia "${_PoolMedia}" )" || return # return on error. # echo ${_PoolMedia} >>/dev/stderr disk_mediaAccess___MediaHandlerCommand \ '_MESSAGE' "$PoolIndex" "${_PoolMedia}" "$@" } disk_mediaAccess_____0x088A_31_CP() { # create a thin media as a copy of the source thin media (aka snapshot); # $1: , # $2: (, # $3: (, # $@: ... (not used here). local DestThinId SourceMedia SourceMediaInfo SourceThinId DestThinId="$3" SourceMediaInfo="$1" SourceThinId="$2" # echo $DestThinId >>/dev/stderr # echo "$SourceMediaInfo" >>/dev/stderr # echo $SourceThinId >>/dev/stderr SourceMedia="$(disk_mediaAccess___2ChildMedia0 "$SourceMediaInfo")" \ || return # return on error. # echo $SourceMedia >>/dev/stderr if disk_mediaAccess__isMedia "$SourceMedia"; then # echo used >>/dev/stderr disk_mediaAccess___0x088A_31_DeviceCommand \ "$SourceMediaInfo" 'suspend' || return # return on error. disk_mediaAccess____0x088A_31_Message2Pool \ "$SourceMediaInfo" "create_snap $DestThinId $SourceThinId" disk_mediaAccess___0x088A_31_DeviceCommand \ "$SourceMediaInfo" 'resume' || return # return on error. else # echo not used >>/dev/stderr disk_mediaAccess____0x088A_31_Message2Pool \ "$SourceMediaInfo" "create_snap $DestThinId $SourceThinId" fi }