#!/bin/bash # assume squashfs 4.0 if [ "`id -u`" -ne 0 ]; then PKEXEC="`command -v pkexec`" [ -n "$PKEXEC" ] && exec "$PKEXEC" "$0" "$@" fi . /etc/DISTRO_SPECS export TEXTDOMAIN=filemnt export OUTPUT_CHARSET=UTF-8 . gettext.sh #=================================================================== if [ "$1" = "-m" -o "$1" = "-manager" ] ; then #pupimgfile-manager written by mistfire . /etc/rc.d/PUPSTATE ALLPS="`ps`" OLDPIDS="`echo "$ALLPS" | grep 'gtkdialog' | grep 'PIMGGUI' | tr -s ' ' | sed -e 's%^ %%' | cut -f 1 -d ' ' | tr '\n' ' '`" kill $OLDPIDS 2>/dev/null df | grep ' /mnt/' | grep '/loop' | tr -s ' ' | cut -f 6 -d ' ' > /tmp/mounted-images df | grep ' /media/' | grep '/loop' | tr -s ' ' | cut -f 6 -d ' ' >> /tmp/mounted-images content=`cat /tmp/mounted-images` IMGCNT=1 for d1 in `cat /tmp/mounted-images | sort`; do ONEMNTPT="$d1" LOOP1=`df | grep "$ONEMNTPT" | tr -s ' ' | cut -f 1 -d ' '` FILENAME=`basename $(losetup -a | grep "$LOOP1" | cut -f 3 -d ' ')` if [ "$ONEMNTPT" != "" ];then #not mounted. PARTSGUI="${PARTSGUI}" fi IMGCNT=`echo $(expr $IMGCNT + 1)` done [ "$PARTSGUI" ] || PARTSGUI="" #- WIDTH=600 SRCNXY=$(LANG=C xwininfo -root | grep -o '\-geometry .*' | sed 's/+.*// ; s/-geometry //') SCRN_X=`echo "$SRCNXY" | cut -f 1 -d 'x'` [ "$SCRN_X" -a $SCRN_X -le 640 ] && WIDTH=500 [ "$SCRN_X" -a $SCRN_X -le 500 ] && WIDTH=400 #- export PIMGGUI=" `/usr/lib/gtkdialog/xml_info fixed copy_cd.svg 40 \"Mounted image files\" \"$(gettext 'You can unmount them here')\"` ${PARTSGUI} " RETPARAMS="`gtkdialog --program=PIMGGUI --center --styles=/tmp/gtkrc_xml_info.css`" rm -f /tmp/mounted-images #echo "$RETPARAMS" echo "$RETPARAMS" | grep -q "refresh" && exec sh $0 -m exit fi #=================================================================== imgFile="$1" [ ! -f "$imgFile" ] && echo "No regular file: $imgFile" && exit 1 imgFileBASE=${imgFile##*/} ## imgFileBASE="`basename "$imgFile"`" #BK [ "$(dirname "$imgFile")" = "." ] && imgFile=$(pwd)/${imgFileBASE} [ ! -e /media ] && mkdir /media # may need to replace with /mnt/home... HOMELINK="`readlink /mnt/home`" case $HOMELINK in *initrd*) imgFile="`echo -n "$imgFile" | sed -e "s%${HOMELINK}%/mnt/home%"`" #ex: /initrd/mnt/dev_save/kernel_src-3.0.7-patched.sfs becomes /mnt/home/kernel_src-3.0.7-patched.sfs esac #ex: /mnt/home/kernel_src-3.0.7-patched.sfs becomes /media/+mnt+home+kernel_src-3.0.7-patched.sfs MOUNTPOINT='/media/'"`echo "$imgFile" |sed "s#^\.##g" |sed "s#/#+#g" | tr ' ' '_'`" # SFR, added 'tr' # BK is it already mounted? MNTEDLOOP="$(cat /proc/mounts | grep -F " $MOUNTPOINT " | cut -f 1 -d ' ')" [ ! -z $MNTEDLOOP ] && MNTEDLOOP=$(echo "$MNTEDLOOP" | sed 's|/dev/loop/|/dev/loop|') if [ "$MNTEDLOOP" = "" ];then #not mounted on $MOUNTPOINT Ext=${imgFile##*.} #get file extension ## Ext=`echo "$imgFile" |sed 's/^.*\.//'` Ext=${Ext,,} #convert to lowercase ## Ext=`echo $Ext | tr [:upper:] [:lower:]` Type=$(blkid "$imgFile" | grep -o ' TYPE=.*' | cut -f 2 -d '"') if [ "$Type" = "" ] ; then case ${Ext} in 2fs) Type='ext2' ;; 3fs) Type='ext3' ;; 4fs) Type='ext4' ;; sfs|lzm|xzm|sb|squashfs) Type='squashfs' ;; iso) Type='iso' ;; wim) Type='wim' ;; esac fi if [ "$Type" = "" ] ; then echo "Unrecognized format" exit 1 fi if [ "$Type" = "wim" ] ; then if ! which wimmountrw ; then echo "You must install wimlib - https://wimlib.net/" exit 1 fi fi echo -e "\nType=${Type}\n" if [ "$Type" = "squashfs" ];then . /etc/rc.d/BOOTCONFIG # 140609 add contextual Install/Uninstall button echo $EXTRASFSLIST > /tmp/sfsloaded if [ "`grep $imgFileBASE /tmp/sfsloaded`" != "" ];then LABELINSTALL="$(gettext 'Uninstall SFS')" TEXTINSTALL="$(gettext 'uninstall it')" else LABELINSTALL="$(gettext 'Install SFS')" TEXTINSTALL="$(gettext 'install it')" fi SFSMSG1a="$(eval_gettext "You can choose to mount the ${imgFileBASE} file to view it's contents (read-only), or you can ${TEXTINSTALL}.")" #'geany SFSMSG1b="$(gettext 'Regarding the latter, traditionally SFS files are selected by the BootManager for loading at bootup (see System menu), which you can do, or you can choose to install (load) it now (which will not require a reboot).')" SFSMSG1c="$(gettext 'Note1: If you want to edit the contents of an SFS file, you have to use the commandline utilities unsquashfs and mksquashfs.')" SFSMSG1d="$(gettext 'Note2: In the case of a full HD installation, without a layered filesystem, installation is irreversible. For all other installation modes, the BootManager can be used to unload an installed (loaded) SFS file.')" /usr/lib/gtkdialog/box_yesno --yes-first --yes-label "$(gettext 'View contents')" --no-label "$LABELINSTALL" --extra-button "$(gettext 'Cancel')" --no-icon package_sfs.svg --extra-icon close.svg "${imgFileBASE}" "${SFSMSG1a}" "${SFSMSG1b}" "${SFSMSG1c}" "${SFSMSG1d}" RETVAL=$? [ $RETVAL -eq 1 ] && exec sfs_load "$1" [ $RETVAL -ne 0 ] && exit #120527 else /usr/lib/gtkdialog/box_yesno --yes-first "Filemnt: Mount Image" "Do you want to mount this image?" "$imgFileBASE" if [ $? -ne 0 ]; then exit 0 fi fi echo -e "\n ### Mount: $imgFile\n" mkdir -p "$MOUNTPOINT" #111110 handle encrypted save-files... CRYPTO=""; Err=0 DEVLOOP="`losetup -f`" #next free loop device. case $Type in ext2|ext3|ext4) case $imgFileBASE in *_cryptx*) #light encryption. CRYPTO='-e 1' modprobe cryptoloop ;; *_crypt*) #heavy encryption. CRYPTO='-e aes' modprobe cryptoloop modprobe aes_generic 2>/dev/null #v407 aes name change. modprobe aes 2>/dev/null #for older kernel <2.6.25 modprobe crypto_blkcipher 2>/dev/null #v407 blkcipher name change. modprobe blkcipher 2>/dev/null #old kernel. modprobe cbc ;; esac esac if [ "$CRYPTO" ];then Err=1 MYPASS="$(/usr/lib/gtkdialog/box_passwd "$(gettext 'Password required')" "$(gettext 'Password required to open') ${imgFileBASE}")" if [ $? -eq 0 ] ; then echo "$MYPASS" | losetup-222 -p 0 ${CRYPTO} $DEVLOOP "$imgFile" if [ $? -eq 0 ] ; then mount -t $Type $DEVLOOP "$MOUNTPOINT" && Err=0 fi fi else #normal, no encryption... 130204 mavrothal: fix spaces in imgFile... case $Type in iso|udf|iso9660) #iso img might have more than 1 fs. prefer udf.. mount -r -t udf -o loop "$imgFile" "$MOUNTPOINT" || mount -r -t iso9660 -o loop "$imgFile" "$MOUNTPOINT" ;; exfat) mount -t exfat -o loop "$imgFile" "$MOUNTPOINT" || { # musl static mount.exfat fails # have to set loop device manually... losetup $DEVLOOP "$imgFile" mount.exfat-fuse $DEVLOOP "$MOUNTPOINT" } ;; crypto_LUKS) # /sbin/mount.crypto_LUKS mount.crypto_LUKS file "$imgFile" "$MOUNTPOINT" ;; ntfs) losetup $DEVLOOP "$imgFile" mount -t ntfs $DEVLOOP "$MOUNTPOINT" ;; wim) wimmountrw "$imgFile" "$MOUNTPOINT" || \ wimmount "$imgFile" "$MOUNTPOINT" ;; *) mount -t ${Type} -o loop,rw "$imgFile" "$MOUNTPOINT" ;; esac Err=$? fi if [ $Err -eq 0 ] ;then if grep -q -m1 -i 'pcmanfm' /usr/local/bin/defaultfilemanager ; then defaultfilemanager -n "$MOUNTPOINT" & else defaultfilemanager_x $NEWWINDOW "$MOUNTPOINT" & fi else [ "$CRYPTO" ] && losetup-222 -d $DEVLOOP rmdir "$MOUNTPOINT" #121203 fi #### mounted #### else /usr/lib/gtkdialog/box_yesno --yes-first "Filemnt: Unmount image file" "NOTICE: $imgFileBASE is mounted" "" "" "Do you want to unmount this image file?" if [ $? -ne 0 ]; then exit fi mntinfo=$(mount | grep " $MOUNTPOINT ") ## file's mounted, unmount it echo -e "\n ### UnMount: $imgFile\n" case "$mntinfo" in "/dev/mapper/luksfile"*) . /sbin/umount.crypto_LUKS luks_umount "$mntinfo" ;; *) # better free loop device before calling umount... losetup -d ${MNTEDLOOP} case "$imgFile" in *.[w-W][i-I][m-M]) wimunmount --commit "$MOUNTPOINT" ;; *) umount "$MOUNTPOINT" ;; esac ;; esac Err=$? sync sleep 1 if [ $Err -eq 0 ] ; then rmdir "$MOUNTPOINT" /usr/lib/gtkdialog/box_ok "Filemnt" info "$imgFileBASE is unmounted" & XPID=$!; sleep 3; pkill -P $XPID 2>/dev/null fi fi ## ERROR: mount/unmount if [ $Err -ne 0 ] ;then /usr/lib/gtkdialog/box_splash -timeout 3 -bg red -text "$(gettext 'Failed mounting or unmounting') $imgFileBASE" #BK fi ###END###