#!/usr/local/bin/scripts/sh # pen: ^ reverse map child-dm-device # * use "disk_mediaAccess__LinearTable()" also in '32'. # #.Y / 70 83 / / / / 105 / / / / / / ;A4_QUER.Y #.YT 3 2 0 0 3 3 1 / / / #.H!a!0:linux//io/disk/mediaAccess/mediaHandlers.d/A8A2BB25_78F0_11E6_B6F3_0000C00A45A9!0.!c # #/******************************************************************************* # io disk mediaAccess mediaHandlers.d/A8A2BB25_78F0_11E6_B6F3_0000C00A45A9 # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # # purpose : media handler for a general filesystem # # begin : Mon Dec 12 18:42:18 CEST 2016 # # changes : # # copyright : (C) 2016 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("A8A2BB25_78F0_11E6_B6F3_0000C00A45A9") = 0x088D_25 # # * for every function: # * if returned result is not commented, the function returns 0 on no-error. disk_mediaAccess_A8A2BB25_78F0_11E6_B6F3_0000C00A45A9() { # * handles a general filesystem; # $1: command, in { # "2ChildDev", "2ChildMedia", "CHECK", "DESTROY", "REALIZE", # "RealizeForced", "SIZE", "VERIFY", "WAIT", "_:", "__:" # }, # * $1 in { # "2ChildDev", "2ChildMedia", "DESTROY", "REALIZE", "RealizeForced", # "SIZE", "VERIFY", "WAIT" # }: see "../CommonCommandsSpecification.TXT", # * "CHECK": # 'fsck'; # $2: , # $3: , # $4: , # $@: . local COMMAND FORCED INDEX MediaInfo 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 # 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__0x088D_25_2ChildDev \ "$MediaInfo" ;; 2ChildMedia) disk_mediaAccess__0x088D_25_2ChildMedia \ "$MediaInfo" ;; CHECK) shift 5 disk_mediaAccess__0x088D_25_CHECK \ "$FORCED" "$MediaInfo" "$ParentMediaPath" "$@" ;; # 'fsck -n'. DESTROY) disk_mediaAccess__0x088D_25_DESTROY \ "$MediaInfo" ;; REALIZE|RealizeForced) disk_mediaAccess__0x088D_25_REALIZE \ "$FORCED" "$INDEX" "$MediaInfo" "$ParentMediaPath" ;; REPAIR) shift 5 disk_mediaAccess__0x088D_25_REPAIR \ "$FORCED" "$MediaInfo" "$ParentMediaPath" "$@" ;; # 'fsck'. SIZE) disk_mediaAccess__Size0 '0' "$MediaInfo" ;; *) disk_mediaAccess___NoContainer \ "$COMMAND" "$INDEX" "$ParentMedia" \ || return # return on error. disk_mediaAccess__InvalidCommandError \ "$COMMAND" "$INDEX" \ 'A8A2BB25_78F0_11E6_B6F3_0000C00A45A9' \ "$ParentMedia" ;; esac # return result of previous } # command. disk_mediaAccess__0x088D_25_CHECK() { # 'fsck -n', # * check the filesystem, but do not repair, # * you may not run it on a mounted filesystem! # $1: , # $2: , # $3: , # $@: . local FORCED MediaInfo ParentMediaPath FORCED="$1" MediaInfo="$2" ParentMediaPath="$3" shift 3 # echo $FORCED >>/dev/stderr # echo "$MediaInfo" >>/dev/stderr # echo $ParentMediaPath >>/dev/stderr # echo "$@" >>/dev/stderr disk_mediaAccess___0x088D_25_CHECK \ "$FORCED" "$MediaInfo" "$ParentMediaPath" -n "$@" } disk_mediaAccess__0x088D_25_DESTROY() { # destroy media; # $1: . # global: DmSetup0x0EAA ReverseMapPath0x0EAA Rm0x0EAA UMount0x0EAA local ChildMediaName ChildMediaPath MediaInfo ParametersFile local _RealizationPoint # parameters: local RealizationPoint UUID MediaInfo="$1" ParametersFile="$(disk_mediaAccess__Parameters2File "$MediaInfo")" \ || return # return on error. . "$ParametersFile" || return # return on error. # echo $RealizationPoint >>/dev/stderr # echo $UUID >>/dev/stderr ChildMediaName="$UUID" ChildMediaPath="$( disk_mediaAccess___0x088D_25_AdjustByRealizationPoint \ "$ChildMediaName" "$RealizationPoint" 'RMM' )" ChildMediaPath="$(f_EscapePath0x05BF "$ChildMediaPath")" # echo $ChildMediaPath >>/dev/stderr _RealizationPoint="$( disk_mediaAccess___0x088D_25_AdjustByRealizationPoint \ "$ChildMediaName" "$RealizationPoint" 'RP' )" "$UMount0x0EAA" "${_RealizationPoint}" # ignore errors. "$DmSetup0x0EAA" remove "$ChildMediaName" # ignore errors. "$Rm0x0EAA" -f "${ReverseMapPath0x0EAA}/$ChildMediaPath" } disk_mediaAccess__0x088D_25_2ChildMedia() { # ^converts the media, denoted by and to the # media-name (UUID) and writes it to "stdout"; # $1: . local ChildMediaName MediaInfo ParametersFile _RealizationPoint # parameters: local RealizationPoint UUID MediaInfo="$1" ParametersFile="$(disk_mediaAccess__Parameters2File "$MediaInfo")" \ || return # return on error. . "$ParametersFile" || return # return on error. ChildMediaName="$UUID" _RealizationPoint="$( disk_mediaAccess___0x088D_25_AdjustByRealizationPoint \ "$ChildMediaName" "$RealizationPoint" 'RP' )" disk_mediaAccess__WriteQualifiedFilesystem "${_RealizationPoint}" } disk_mediaAccess__0x088D_25_2ChildDev() { # ^maps the media (converts the media), denoted by the and # the to the block-device-name that carries the file- # system and writes it to "stdout"; # $1: . local ChildDevicePath ChildMediaName MediaInfo MediaInfo="$1" ChildMediaName="$(disk_mediaAccess___2ChildUuid "$MediaInfo")" || return # return on error. # echo $ChildMediaName >>/dev/stderr ChildDevicePath="$( disk_mediaAccess___Uuid2AbsolutePath1 "$ChildMediaName" )" || return # return on error. disk_mediaAccess__WriteQualifiedDevice "$ChildDevicePath" } disk_mediaAccess__0x088D_25_REALIZE() { # * realizes the media or realize the media forced; # $1: , # $2: , # $3: , # $4: , # global: FsCk0x0EAA Mount0x0EAA local ChildDevPath ChildMediaName ChildMediaPath FORCED INDEX MediaInfo local ParametersFile ParentMediaPath ReadOnly _RealizationPoint # parameters: local COPYRIGHT CopyrightDetails FilesystemType NOTES OnlyOnHosts local RealizationOptions RealizationPoint SIZE START URL UUID FORCED="$1" INDEX="$2" MediaInfo="$3" ParentMediaPath="$4" # echo $FORCED >>/dev/stderr # echo $INDEX >>/dev/stderr # echo "$MediaInfo" >>/dev/stderr # echo $ParentMediaPath >>/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 $FilesystemType >>/dev/stderr # echo $MountOptions >>/dev/stderr # echo $NOTES >>/dev/stderr # echo $OnlyOnHosts >>/dev/stderr # echo $RealizationOptions >>/dev/stderr # echo $RealizationPoint >>/dev/stderr # echo $SIZE >>/dev/stderr # echo $START >>/dev/stderr # echo $URL >>/dev/stderr # echo $UUID >>/dev/stderr ChildMediaName="$UUID" _RealizationPoint="$( disk_mediaAccess___0x088D_25_AdjustByRealizationPoint \ "$ChildMediaName" "$RealizationPoint" 'RP' )" # echo $ChildMediaName >>/dev/stderr # echo ${_RealizationPoint} >>/dev/stderr RealizationOptions+="$MountOptions" disk_mediaAccess_isHandled \ "$FORCED" "$OnlyOnHosts" "$RealizationOptions" || return 0 f_QMkDir "${_RealizationPoint}" || return # return on error. # the realization option "ro" (read-only) should only be handled by the file- # system and not by 'device-mapper': ReadOnly='' disk_mediaAccess__isRealizationOption \ "$RealizationOptions" 'ro' && { ReadOnly='ro' RealizationOptions="$( echo "$RealizationOptions" \ | disk_mediaAccess__DeleteRealizationOption 'ro' )" } disk_mediaAccess____LinearTable \ "$ChildMediaName" \ "$ParentMediaPath" "$RealizationOptions" "$SIZE" "$START" \ || return # return on error. ChildDevPath="$( disk_mediaAccess___Uuid2AbsolutePath1 "$ChildMediaName" )" || return # return on error. # echo $ChildDevPath >>/dev/stderr disk_mediaAccess__isRealizationOption \ "$RealizationOptions" 'mountAfterCheck' && { RealizationOptions="$( echo "$RealizationOptions" \ | disk_mediaAccess__DeleteRealizationOption 'mountAfterCheck' \ )" # must check; mount only if no errors on : # * because of "0:": "-n" avoid reparing any problems, do not use a # terminal. "${FsCk0x0EAA}.$FilesystemType" -fnC0 "$ChildDevPath" >>/dev/stderr \ || return # check not ok. # do not 'generalize' "/sbin/fsck.<...>"; may be, different file- # system packages install it in different folders. } # canonify ; "noauto", "ro" have been 'handled' above. RealizationOptions="$( disk_mediaAccess__DeleteDmRealizationOptions "$RealizationOptions" )" # add "ro" correctly: [ -n "$ReadOnly" ] && { if [ -z "$RealizationOptions" ]; then RealizationOptions="$ReadOnly" else RealizationOptions="${RealizationOptions},${ReadOnly}" fi } # echo "$RealizationOptions" >>/dev/stderr "$Mount0x0EAA" -o "$RealizationOptions" "$ChildDevPath" \ "${_RealizationPoint}" \ || return # return on error. disk_mediaAccess__WriteQualifiedFilesystem "${_RealizationPoint}" ChildMediaPath="$( disk_mediaAccess___0x088D_25_AdjustByRealizationPoint \ "$ChildMediaName" "$RealizationPoint" 'RMM' )" # echo $ChildMediaPath >>/dev/stderr disk_mediaAccess___WriteReverseMapEntry \ "$ChildMediaPath" "$INDEX" "$ParentMediaPath" } disk_mediaAccess__0x088D_25_REPAIR() { # 'fsck -n', # * check the filesystem, and if necessary, repair the filesystem, # * you may not run it on a mounted filesystem! # $1: , # $2: , # $3: , # $@: . local FORCED MediaInfo ParentMedia FORCED="$1" MediaInfo="$2" ParentMedia="$3" shift 3 # echo $FORCED >>/dev/stderr # echo "$MediaInfo" >>/dev/stderr # echo $ParentMediaPath >>/dev/stderr # echo "$@" >>/dev/stderr disk_mediaAccess___0x088D_25_CHECK \ "$FORCED" "$MediaInfo" "$ParentMedia" "$@" } disk_mediaAccess___0x088D_25_AdjustByRealizationPoint() { # takes into consideration and writes 'result' to "stdout"; # $1: , # $2: , # $3: in { "RMM", "RP" }; # * "RMM": result is "ReverseMapMedia", # * "RP": result is "RealizationPoint". # global: DisksByUuidMountPath0x0EAA local ChildMediaName RealizationPoint local -l RealizationPointLC # converts to lower case. local ResultType ReverseMapMedia ChildMediaName="$1" RealizationPoint="$2" ResultType="$3" # echo $ChildMediaName >>/dev/stderr # echo $RealizationPoint >>/dev/stderr if [ -n "$RealizationPoint" ]; then # realization-point is specified. ReverseMapMedia="$RealizationPoint" else RealizationPointLC="$ChildMediaName" RealizationPoint="$DisksByUuidMountPath0x0EAA/$RealizationPointLC" ReverseMapMedia="$ChildMediaName" fi case "$ResultType" in RMM) echo "$ReverseMapMedia" ;; RP) echo "$RealizationPoint" ;; esac } disk_mediaAccess___0x088D_25_CHECK() { # 'fsck', # * check or repair the filesystem, # * you may not run it on a mounted filesystem! # $1: , # check only on corresponding # # host. # $2: , # $3: , # $@: . # global: DmSetup0x0EAA FsCk0x0EAA local ChildDevPath ChildMediaName FORCED MediaInfo ParametersFile local ParentMediaPath # parameters: local COPYRIGHT CopyrightDetails FilesystemType NOTES OnlyOnHosts local RealizationOptions RealizationPoint SIZE START URL UUID FORCED="$1" MediaInfo="$2" ParentMediaPath="$3" shift 3 # echo FORCED: $FORCED >>/dev/stderr # echo "$MediaInfo" >>/dev/stderr # echo $ParentMediaPath >>/dev/stderr # echo $@ >>/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 $FilesystemType >>/dev/stderr # echo $MountOptions >>/dev/stderr # echo $NOTES >>/dev/stderr # echo $OnlyOnHosts >>/dev/stderr # echo $RealizationOptions >>/dev/stderr # echo $RealizationPoint >>/dev/stderr # echo $SIZE >>/dev/stderr # echo $START >>/dev/stderr # echo $URL >>/dev/stderr # echo $UUID >>/dev/stderr ChildMediaName="$UUID" # echo $ChildMediaName >>/dev/stderr RealizationOptions+="$MountOptions" disk_mediaAccess_isHandled \ "$FORCED" "$OnlyOnHosts" "$RealizationOptions" || return 0 # the realization option "ro" (read-only) should only be handled by the file- # system and not by 'device-mapper': RealizationOptions="$( echo "$RealizationOptions" \ | disk_mediaAccess__DeleteRealizationOption 'ro' )" disk_mediaAccess____LinearTable \ "$ChildMediaName" \ "$ParentMediaPath" "$RealizationOptions" "$SIZE" "$START" \ || return # return on error. ChildDevPath="$( disk_mediaAccess___Uuid2AbsolutePath1 "$ChildMediaName" )" || return # return on error. # echo $ChildDevPath >>/dev/stderr "${FsCk0x0EAA}.$FilesystemType" "$@" "$ChildDevPath" RESULT="$?" # wait for releasing the child-media: sleep 1 "$DmSetup0x0EAA" remove "$ChildMediaName" return "$RESULT" }