slitaz-tools annotate lib/libmountbox @ rev 370

mountbox: add loop manager
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Aug 02 20:55:09 2009 +0200 (2009-08-02)
parents d3586136f92a
children 9eafe366717d
rev   line source
pankso@183 1 #!/bin/sh
pankso@183 2 #
MikeDSmith25@252 3 # Libmountbox provides devices list in suitable format for GTK tree
MikeDSmith25@252 4 # and various dialog boxes to mount, umount, etc.
pankso@183 5 #
pascal@369 6 # (C) 2009 - SliTaz GNU/Linux project.
pankso@183 7 #
pankso@183 8
pankso@183 9 # Short usage.
pankso@183 10 usage()
pankso@183 11 {
pankso@183 12 echo -e "\nUsage: $0 command\n
MikeDSmith25@252 13 Output commands:
pankso@183 14 list-mounted List all mounted devices in suitable GTK tree format.
pankso@183 15 list-umounted List all umounted in suitable GTK tree format.
pankso@183 16
pankso@183 17 GTKdialog boxes
pankso@183 18 mounted-fs-infos Display a mounted devices infos with actions.
pankso@183 19 umounted-fs-infos Display a umounted devices infos with actions.\n"
pankso@183 20 }
pankso@183 21
MikeDSmith25@252 22 # Format df -h output for GTK tree.
pankso@183 23 mounted_fs_data()
pankso@183 24 {
pankso@183 25 SIZE=`echo $RES | cut -d " " -f 2`
pankso@183 26 USED=`echo $RES | cut -d " " -f 3`
pankso@183 27 AVAILABLE=`echo $RES | cut -d " " -f 4`
pankso@183 28 PCT=`echo $RES | cut -d " " -f 5`
pankso@183 29 MOUNTED_ON=`echo $RES | cut -d " " -f 6`
pankso@183 30 }
pankso@183 31
pascal@370 32 # Update BLOCKS SIZE UUID TYPE LABEL variables
pascal@369 33 getdevinfo()
pascal@368 34 {
pascal@370 35 local dev
pascal@370 36 dev=${1#/dev/}
pascal@370 37 BLOCKS=0
pascal@370 38 if [ -f /sys/block/$dev/size ]; then
pascal@370 39 BLOCKS=`cat /sys/block/$dev/size`
pascal@370 40 elif [ -f /sys/block/*/$dev/size ]; then
pascal@370 41 BLOCKS=`cat /sys/block/*/$dev/size`
pascal@370 42 fi
pascal@368 43 if [ $BLOCKS -gt 2097152 ]; then
pascal@368 44 unit=G
pascal@370 45 n=$(($BLOCKS * 10 / 2097152))
pascal@368 46 elif [ $BLOCKS -gt 2048 ]; then
pascal@368 47 unit=M
pascal@370 48 n=$(($BLOCKS * 10 / 2048))
pascal@368 49 else
pascal@368 50 unit=K
pascal@370 51 n=$(($BLOCKS * 5))
pascal@368 52 fi
pascal@369 53 SIZE=$(($n/10)).$(($n%10))$unit
pascal@370 54 UUID=`blkid | grep ^/dev/$dev: | grep UUID= | sed 's/.*UUID=\"\([^\"]*\)\".*/\1/'`
pascal@370 55 TYPE=`blkid | grep ^/dev/$dev: | grep TYPE= | sed 's/.*TYPE=\"\([^\"]*\)\".*/\1/'`
pascal@370 56 LABEL=`blkid | grep ^/dev/$dev: | grep LABEL= | sed 's/.*LABEL=\"\([^\"]*\)\".*/\1/'`
pascal@368 57 }
pascal@368 58
pankso@183 59 case $1 in
pankso@183 60 list-mounted)
pankso@183 61 # List all fs found by: df -h
pankso@183 62 #
pascal@368 63 for dev in `df -h | grep ^/dev/ | cut -d " " -f 1`
pankso@183 64 do
pankso@183 65 RES=`df -h $dev | grep ^$dev`
pankso@183 66 mounted_fs_data
pankso@183 67 echo "$dev | $SIZE | $USED | $AVAILABLE | $PCT | $MOUNTED_ON"
pankso@183 68 done ;;
pankso@183 69 list-umounted)
pankso@183 70 # List all umounted fs found by: fdisk -l
pankso@183 71 #
pankso@183 72 for dev in `fdisk -l | grep ^/dev | cut -d " " -f 1`
pankso@183 73 do
pankso@183 74 RES=`fdisk -l | grep $dev | sed s/*//g`
pankso@183 75 START=`echo $RES | cut -d " " -f 2`
pankso@183 76 END=`echo $RES | cut -d " " -f 3`
pankso@183 77 BLOCKS=`echo $RES | cut -d " " -f 4`
pankso@183 78 ID=`echo $RES | cut -d " " -f 5`
pascal@262 79 SYSTEM=`echo $RES | cut -d " " -f 6-`
pankso@183 80 # Bootable...
pankso@183 81 if fdisk -l | grep $dev | grep -q "*"; then
pascal@368 82 BOOT="yes"
pankso@183 83 else
pankso@183 84 BOOT="-"
pankso@183 85 fi
MikeDSmith25@252 86 # Skip swap, extended, and mounted partitions.
pankso@183 87 if echo $RES | grep -q "swap" || echo $RES | grep -q "Extended" ; then
pankso@183 88 continue
pascal@262 89 elif mount | grep -q "^$dev "; then
pankso@183 90 continue
pankso@183 91 else
pascal@370 92 getdevinfo $dev
pascal@368 93 echo "$dev | $SIZE | $SYSTEM | $TYPE | $LABEL | $BOOT | $START | $END | $BLOCKS | $ID | $UUID"
pankso@183 94 fi
pascal@262 95 done
pascal@368 96 for dev in /dev/mapper/* ; do
pascal@368 97 [ -b $dev ] || continue
pascal@368 98 mount | grep -q "^$dev " && continue
pascal@368 99 mdev=dm-$(ls -l $dev | awk '{ print $6 }')
pascal@368 100 mount | grep -q "^/dev/$mdev " && continue
pascal@370 101 getdevinfo /dev/$mdev
pascal@369 102 echo "$dev | $SIZE | - | $TYPE | $LABEL | - | - | - | $BLOCKS | - | $UUID"
pascal@369 103 done
pascal@369 104 for dev in $(losetup | cut -d: -f1); do
pascal@369 105 [ -b $dev ] || continue
pascal@369 106 mount | grep -q "^$dev " && continue
pascal@370 107 getdevinfo $dev
pascal@368 108 echo "$dev | $SIZE | - | $TYPE | $LABEL | - | - | - | $BLOCKS | - | $UUID"
pascal@368 109 done
pascal@368 110 [ -e /dev/cdrom ] &&
pascal@368 111 echo "/dev/cdrom | - | CD/DVD | iso9660 | - | - | - | - | - | - | -"
pascal@262 112 for i in /sys/devices/platform/floppy.*/block:*; do
pascal@263 113 [ -e $i ] && echo "/dev/${i#*block:} | - | - | - | floppy | - | - | - | - | -"
pascal@262 114 done
pascal@262 115 ;;
pankso@183 116 mounted-fs-infos)
MikeDSmith25@252 117 # Mounted fs info and actions, rootfs or other fs.
pankso@183 118 #
pankso@183 119 if [ "$MOUNTED" == "/dev/root" ]; then
pankso@183 120 export MOUNTED_DEVICE="
pankso@183 121 <window title=\"Device: rootfs\" icon-name=\"media-flash\">
pankso@183 122 <vbox>
pankso@183 123 <text use-markup=\"true\" width-chars=\"56\">
pankso@183 124 <label>\"
pankso@183 125 <b>/dev/root</b>
pankso@183 126 \"
pankso@183 127 </label>
pankso@183 128 </text>
pankso@183 129 <text use-markup=\"true\" width-chars=\"56\">
pankso@183 130 <input>df -h / | grep ^rootfs</input>
pankso@183 131 </text>
pankso@183 132 <hbox>
pankso@183 133 <button>
pankso@183 134 <label>Browse</label>
pankso@183 135 <input file icon=\"folder-open\"></input>
pankso@183 136 <action>pcmanfm / &</action>
pankso@183 137 <action type=\"closewindow\">MOUNTED_DEVICE</action>
pankso@183 138 </button>
pankso@183 139 <button>
pankso@183 140 <input file icon=\"gtk-close\"></input>
pankso@183 141 <action type=\"closewindow\">MOUNTED_DEVICE</action>
pankso@183 142 </button>
pankso@183 143 </hbox>
pankso@183 144 </vbox>
pankso@183 145 </window>"
pankso@183 146 gtkdialog --center --program=MOUNTED_DEVICE
pankso@183 147 else
pascal@370 148 getdevinfo $MOUNTED
pankso@183 149 RES=`df -h $MOUNTED | grep ^$MOUNTED`
pankso@183 150 mounted_fs_data
pankso@183 151 export MOUNTED_DEVICE="
pankso@183 152 <window title=\"Device: $MOUNTED\" icon-name=\"media-flash\">
pankso@183 153 <vbox>
pankso@183 154 <text use-markup=\"true\" width-chars=\"56\">
pankso@183 155 <label>\"
pankso@183 156 Device <b>$MOUNTED</b> is mounted on <b>$MOUNTED_ON</b>
pankso@183 157
pascal@370 158 Size: $SIZE
pankso@183 159 UUID: $UUID
pankso@183 160 Type: $TYPE
pascal@263 161 Label: $LABEL
pankso@183 162 \"
pankso@183 163 </label>
pankso@183 164 </text>
pankso@183 165 <hbox>
pankso@183 166 <button>
pankso@183 167 <label>Browse</label>
pankso@183 168 <input file icon=\"folder-open\"></input>
pankso@183 169 <action>pcmanfm $MOUNTED_ON &</action>
pankso@183 170 <action type=\"closewindow\">MOUNTED_DEVICE</action>
pankso@183 171 </button>
pankso@183 172 <button>
pankso@183 173 <label>Umount</label>
pankso@183 174 <input file icon=\"undo\"></input>
pankso@183 175 <action>umount $MOUNTED_ON</action>
pankso@183 176 <action type=\"closewindow\">MOUNTED_DEVICE</action>
pankso@183 177 </button>
pankso@183 178 <button>
pankso@183 179 <input file icon=\"gtk-close\"></input>
pankso@183 180 <action type=\"closewindow\">MOUNTED_DEVICE</action>
pankso@183 181 </button>
pankso@183 182 </hbox>
pankso@183 183 </vbox>
pankso@183 184 </window>"
pankso@183 185 gtkdialog --center --program=MOUNTED_DEVICE
pankso@183 186 fi ;;
pankso@183 187 umounted-fs-infos)
MikeDSmith25@252 188 # Mounted fs info and actions, rootfs or other fs.
pankso@183 189 #
pascal@368 190 case "$DEVICE" in
pascal@368 191 /dev/mapper/*) mdev=/dev/dm-$(ls -l $DEVICE | awk '{ print $6 }');;
pascal@368 192 *) mdev=$DEVICE;;
pascal@368 193 esac
pascal@370 194 getdevinfo $mdev
pankso@183 195 export UMOUNTED_DEVICE="
pankso@183 196 <window title=\"Device: $DEVICE\" icon-name=\"media-flash\">
pankso@183 197 <vbox>
pankso@183 198 <text use-markup=\"true\" width-chars=\"56\">
pankso@183 199 <label>\"
pankso@183 200 Mount <b>$DEVICE</b> on <b>$MOUNT_POINT</b>
pankso@183 201
pascal@370 202 Size: $SIZE
pankso@183 203 UUID: $UUID
pankso@183 204 Type: $TYPE
pascal@263 205 Label: $LABEL
pankso@183 206 \"
pankso@183 207 </label>
pankso@183 208 </text>
pankso@183 209
pankso@183 210 <hbox>
pankso@183 211 <button>
pankso@183 212 <label>Mount</label>
pankso@183 213 <input file icon=\"edit-redo\"></input>
pankso@183 214 <action>mkdir -p $MOUNT_POINT</action>
pankso@183 215 <action>mount $DEVICE $MOUNT_POINT</action>
pankso@183 216 <action type=\"closewindow\">MOUNTED_DEVICE</action>
pascal@368 217 </button>"
pascal@368 218 while read type fsck args; do
pascal@368 219 [ "$TYPE" == "$type" ] || continue
pascal@368 220 which $fsck > /dev/null || continue
pascal@368 221 UMOUNTED_DEVICE="$UMOUNTED_DEVICE
pankso@183 222 <button>
pascal@368 223 <label>$fsck check</label>
pankso@183 224 <input file icon=\"drive-harddisk\"></input>
pascal@368 225 <action>xterm -T \"$fsck $args $DEVICE\" \
pascal@369 226 -geometry 80x12 \
pascal@368 227 -e \"echo; $fsck $args $DEVICE; \
pascal@369 228 echo -e '----\\nENTER to close Terminal'; \
pankso@183 229 read i\" &</action>
pankso@183 230 <action type=\"closewindow\">MOUNTED_DEVICE</action>
pascal@368 231 </button>"
pascal@368 232 done <<EOT
pascal@368 233 ext3 e2fsck -p
pascal@368 234 ext2 e2fsck -p
pascal@368 235 vfat dosfsck -a
pascal@368 236 msdos dosfsck -a
pascal@368 237 xfs fsck.xfs -s
pascal@368 238 reiserfs reiserfsck --fix-fixable
pascal@368 239 jfs jfs_fsck -a
pascal@368 240 EOT
pascal@368 241 UMOUNTED_DEVICE="$UMOUNTED_DEVICE
pankso@183 242 <button>
pankso@183 243 <input file icon=\"gtk-close\"></input>
pankso@183 244 <action type=\"closewindow\">UMOUNTED_DEVICE</action>
pankso@183 245 </button>
pankso@183 246 </hbox>
pankso@183 247 </vbox>
pankso@183 248 </window>"
pankso@183 249 gtkdialog --center --program=UMOUNTED_DEVICE ;;
pascal@370 250 loopmgr)
pascal@370 251 export LOOP_MANAGER="
pascal@370 252 <window title=\"Loop manager\" icon-name=\"media-flash\">
pascal@370 253 <vbox>
pascal@370 254 <tree>
pascal@370 255 <width>420</width><height>120</height>
pascal@370 256 <variable>LOOP_DEV</variable>
pascal@370 257 <label>Device|File|Size|Type|Label|Mounted on|Offset|UUID</label>"
pascal@370 258 while read dev offset file; do
pascal@370 259 DEV=$(echo $dev | cut -d: -f1)
pascal@370 260 MOUNT=$(mount | grep ^$DEV | awk '{ print $3 }')
pascal@370 261 getdevinfo $DEV
pascal@370 262 LOOP_MANAGER="$LOOP_MANAGER
pascal@370 263 <item>$DEV | $file | $SIZE | $TYPE | $LABEL | $MOUNT | $offset | $UUID</item>
pascal@370 264 <action>/usr/lib/slitaz/libmountbox remove-loop</action>
pascal@370 265 <action>/usr/lib/slitaz/libmountbox loopmgr &</action>
pascal@370 266 <action type=\"closewindow\">LOOP_MANAGER</action>
pascal@370 267 "
pascal@370 268 done <<EOT
pascal@370 269 $(losetup)
pascal@370 270 EOT
pascal@370 271 LOOP_MANAGER="$LOOP_MANAGER
pascal@370 272 </tree>
pascal@370 273 <hbox>
pascal@370 274 <text use-markup=\"true\">
pascal@370 275 <label>\"<b>File</b>\"</label>
pascal@370 276 </text>
pascal@370 277 <entry accept=\"filename\">
pascal@370 278 <variable>FILE</variable>
pascal@370 279 </entry>
pascal@370 280 <button>
pascal@370 281 <input file icon=\"folder-open\"></input>
pascal@370 282 <action type=\"fileselect\">FILE</action>
pascal@370 283 </button>
pascal@370 284 </hbox>
pascal@370 285 <hbox>
pascal@370 286 <text use-markup=\"true\" width=\"10\">
pascal@370 287 <label>\"<b>Offset</b>\"</label>
pascal@370 288 </text>
pascal@370 289 <entry>
pascal@370 290 <default>0</default>
pascal@370 291 <variable>OFFSET</variable>
pascal@370 292 </entry>
pascal@370 293 <button>
pascal@370 294 <label>Create</label>
pascal@370 295 <input file icon=\"add\"></input>
pascal@370 296 <action>/usr/lib/slitaz/libmountbox add-loop</action>
pascal@370 297 <action>/usr/lib/slitaz/libmountbox loopmgr &</action>
pascal@370 298 <action type=\"closewindow\">LOOP_MANAGER</action>
pascal@370 299 </button>
pascal@370 300 <button>
pascal@370 301 <input file icon=\"gtk-close\"></input>
pascal@370 302 <action type=\"closewindow\">LOOP_MANAGER</action>
pascal@370 303 </button>
pascal@370 304 </hbox>
pascal@370 305 </vbox>
pascal@370 306 </window>"
pascal@370 307 gtkdialog --center --program=LOOP_MANAGER ;;
pascal@370 308 remove-loop)
pascal@370 309 getdevinfo $LOOP_DEV
pascal@370 310 export REMOVE_DEVICE="
pascal@370 311 <window title=\"Device: $LOOP_DEV\" icon-name=\"media-flash\">
pascal@370 312 <vbox>
pascal@370 313 <text use-markup=\"true\" width-chars=\"56\">
pascal@370 314 <label>\"
pascal@370 315 Disable <b>$LOOP_DEV</b> ?
pascal@370 316
pascal@370 317 Size: $SIZE
pascal@370 318 UUID: $UUID
pascal@370 319 Type: $TYPE
pascal@370 320 Label: $LABEL
pascal@370 321 \"
pascal@370 322 </label>
pascal@370 323 </text>
pascal@370 324 <hbox>
pascal@370 325 <button yes>
pascal@370 326 <action>umount $LOOP_DEV</action>
pascal@370 327 <action>losetup -d $LOOP_DEV</action>
pascal@370 328 <action type=\"closewindow\">LOOP_MANAGER</action>
pascal@370 329 <action>/usr/lib/slitaz/libmountbox loopmgr &</action>
pascal@370 330 <action type=\"closewindow\">REMOVE_DEVICE</action>
pascal@370 331 </button>
pascal@370 332 <button no>
pascal@370 333 <action type=\"closewindow\">REMOVE_DEVICE</action>
pascal@370 334 </button>
pascal@370 335 </hbox>
pascal@370 336 </vbox>
pascal@370 337 </window>"
pascal@370 338 gtkdialog --center --program=REMOVE_DEVICE ;;
pascal@370 339 add-loop)
pascal@370 340 losetup -o $OFFSET $(losetup -f) $FILE
pascal@370 341 ;;
pankso@183 342 *)
pankso@183 343 usage ;;
pankso@183 344 esac
pankso@183 345
pankso@183 346 exit 0