#!/bin/sh
#(c) Copyright 2008 Barry Kauler puppylinux.com
#2008 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#this is /sbin/pup_event_frontend_d, created June 2008 for Puppy Linux 4.x, by Barry Kauler.
#This script is part of 'pup_event', my (very) light-weight alternative to udev.
#responds to events posted to /tmp/pup_event_backend_s by /sbin/pup_event_backend_d.
#this script is launched from /root/.xinitrc.
#v407 added hotplug support for zip and ls120 diskettes.
#v407 hotplug fix for /dev/hd* optical drives.
#v408 fix for k2.6.21.7, does not set DEVTYPE.
#v408 rewrite, now works by polling /sys/block.
#v410 rerwin: detect optical disc not inserted.
#v410 avoid exact overlapping icons.
#v411 rerwin: avoid icon getting duplicated if it is renamed
#v412 workaround, someone had RAMSAVEINTERVAL not set.
#v408 when testing k2.6.21.7, no DEVTYPE, had to modify udev rules which causes udevd to
#do multiple overlapping writes to /tmp/pup_event_backend_s. Even with 2.6.25.x, plugging
#in two USB drives at once can cause this. So, dropping that, going back to primitive,
#simple polling loop.
sleep 2 #let the dust settle after X has started.
[ "$DISPLAY" = "" ] && exit #X not running.
#v404 /usr/sbin/video-wizard (Xvesa) does create /tmp/pup_event_icon_change_flag
#which /sbin/clean_desk_icons reads via .xinirc when X starts, to wipe all drive icons.
#however I think it would be good to test here also if X mode not yet settled on...
if [ -f /tmp/videomode ];then #only exists during X resolution setup.
if [ "`readlink /usr/X11R7/bin/X`" = "Xvesa" ];then
while [ -f /tmp/videomode ];do
sleep 1
done
fi
fi
TOGGLE=1
SAVECNT=0
ZDRV='';ZDRVINIT='no' #these usually set in PUPSTATE.
. /etc/rc.d/PUPSTATE
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R7/bin"
KERNVER="`uname -r`"
. /etc/eventmanager #has RAMSAVEINTERVAL, ICONDESK, HOTPLUGNOISY, ICONPARTITIONS, BACKENDON
. /etc/rc.d/functions4puppy4
SCRNXY="`xwininfo -root | grep -o '\-geometry .*' | tr -s ' ' | cut -f 2 -d ' ' | cut -f 1 -d '+'`"
SCRN_X="`echo -n "$SCRNXY" | cut -f 1 -d 'x'`"
SCRN_Y="`echo -n "$SCRNXY" | cut -f 2 -d 'x'`"
[ "$RAMSAVEINTERVAL" = "" ] && RAMSAVEINTERVAL=30 #412
RAMSAVEINTERVAL=`expr $RAMSAVEINTERVAL \* 60` #convert minutes to seconds.
SIZE_MODS_M=0
if [ "$ZDRVINIT" = "yes" ];then
#all mods were in initrd at bootup, then moved to main f.s.
SIZE_MODS_M=`du -m -s /lib/modules | cut -f 1`
fi
RETVALm=1
PREVSIZETMPM=0
PREVSIZEFREEM=0
format_size_func() {
[ ! $SIZE ] && SIZE=0
if [ $SIZE -gt 1048576 ];then #1024*1024
SIZE="`dc $SIZE 1048576 \/ p`"
SIZE="`printf "%.1f" $SIZE`GB"
else
if [ $SIZE -gt 99 ];then
SIZE="`expr $SIZE \/ 1024`MB"
else
SIZE="`dc $SIZE 1024 \/ p`"
SIZE="`printf "%.1f" $SIZE`MB"
fi
fi
[ "$SIZE" = "0.0MB" ] && SIZE="0"
}
create_appinfo_func() { #needs INFO, DRV_CATEGORY, MOREITEMS, ONEDRVNAME
echo "
${INFO}
Drive icons are part of Puppy Event Manager, see System menu
Barry Kauler LGPL 2008
${MOREITEMS}
" > /root/.pup_event/drive_${ONEDRVNAME}/AppInfo.xml
}
free_coord() {
#find a free place on desktop. v410 avoid exact overlapping icons...
COORDSGRID="`grep -o ' x="[0-9]*" y="[0-9]*" ' /root/Choices/ROX-Filer/PuppyPin | sed 's/[0-9]"/"/g'`"
COORD_Y=`expr $SCRN_Y - 64`
# Get the pinboard_grid_step value from the Options file. 23-Jun-09 y@s
PIN_GRID_STEP=`grep "pinboard_grid_step" $HOME/.config/rox.sourceforge.net/ROX-Filer/Options | sed -e "s/ *<[^>]*>//g"`
# 5Jun09 by Masaki Shinomiya : snap on the grid
if [ "$PIN_GRID_STEP" ] && [ $PIN_GRID_STEP -gt 0 ];then
PIN_GRID_STEP2=`expr $PIN_GRID_STEP / 2`
COORD_Y=`expr \( $COORD_Y + $PIN_GRID_STEP2 \) / $PIN_GRID_STEP '*' $PIN_GRID_STEP`
fi
COORD_X=32
MAX_X=`expr $SCRN_X - 96`
xPATTERN=" x=\"${COORD_X}\" y=\"${COORD_Y}\" "
while [ 1 ];do
xgPATTERN="`echo -n "$xPATTERN" | sed 's/[0-9]"/"/g'`"
[ "`echo "$COORDSGRID" | grep "$xgPATTERN"`" = "" ] && break
COORD_X=`expr $COORD_X + 64`
xPATTERN=" x=\"${COORD_X}\" y=\"${COORD_Y}\" "
[ $COORD_X -gt $MAX_X ] && break
done
}
add_pinboard_func() { #needs ONEDRVNAME, DRV_CATEGORY, FSTYPE
#ppPATTERN=' label="'"$ONEDRVNAME"'"'
#v411 rerwin: avoid icon getting duplicated if it is renamed...
ppPATTERN="/root/.pup_event/drive_${ONEDRVNAME}<"
[ "`grep "$ppPATTERN" /root/Choices/ROX-Filer/PuppyPin`" != "" ] && return #precaution.
free_coord
echo "
/root/.pup_event/drive_${ONEDRVNAME}
${COORD_X}
${COORD_Y}
${DRV_CATEGORY} ${FSTYPE}
" | rox -R
}
create_icon_func() {
#create desktop icon, and directory with handler script, icon and help...
#requires global variables DRV_NAME, DRV_CATEGORY, DRV_DESCRIPTION.
#if a passed param $1, then PROBEPART already known, inefficient to rerun here each time.
DRVINFO="$DRV_NAME"'|0|0'
if [ "$ICONPARTITIONS" = "true" ];then
#display an icon for each partition...
[ ! $1 ] && PROBEPART="`probepart -k | grep -E '\|ntfs\||\|msdos\||\|vfat\||\|ext2\||\|ext3\||\|iso9660\||\|xfs\||\|reiser'`"
drvPATTERN='^/dev/'"${DRV_NAME}" #important, no space on end!
DRVINFO="`echo "$PROBEPART" | grep "$drvPATTERN" | cut -f 1,2,3 -d '|' | tr '\n' ' '`"
fi
for ONEDRVINFO in $DRVINFO
do
ONEDRVNAME="`echo -n "$ONEDRVINFO" | cut -f 1 -d '|' | cut -f 3 -d '/'`"
FSTYPE="`echo -n "$ONEDRVINFO" | cut -f 2 -d '|'`"
SIZE=`echo -n "$ONEDRVINFO" | cut -f 3 -d '|'`
drvPATTERN='^/dev/'"${ONEDRVNAME}"' ' #important, a space on end!
if [ ! -d /root/.pup_event/drive_${ONEDRVNAME} ];then
mkdir /root/.pup_event/drive_${ONEDRVNAME}
cp -af /usr/local/bin/drive_all /root/.pup_event/drive_${ONEDRVNAME}/AppRun
if [ -e /sys/block/${ONEDRVNAME} ];then
#device is an entire drive.
SIZE=`cat /sys/block/${ONEDRVNAME}/size`
SIZE=$(($SIZE/2)) #get KB.
format_size_func #formats SIZE for display.
INFO="説明: ${DRV_DESCRIPTION} サイズ: ${SIZE}"
else
if [ "$FSTYPE" = "0" -a "$SIZE" = "0" ];then
INFO="Puppy ドライブマネージャ"
else
#pPATTERN=' '"$ONEDRVNAME"'$'
#SIZE=`grep "$pPATTERN" /proc/partitions | tr -s ' ' | cut -f 4 -d ' '`
format_size_func #formats SIZE for display.
INFO="ファイルシステム: $FSTYPE サイズ: $SIZE"
fi
fi
MOREITEMS=" "
create_appinfo_func #needs INFO, DRV_CATEGORY, MOREITEMS, ONEDRVNAME
fi
# if [ "$ICONDESK" = "true" ];then #see /etc/eventmanager.
MNTSTATUS="`df | grep "$drvPATTERN"`"
if [ "$MNTSTATUS" = "" ];then
icon_unmounted_func $ONEDRVNAME $DRV_CATEGORY #see functions4puppy4.
else
icon_mounted_func $ONEDRVNAME $DRV_CATEGORY #see functions4puppy4.
fi
add_pinboard_func #needs ONEDRVNAME, DRV_CATEGORY, FSTYPE.
# fi
done
#always create a handler for entire drive, even if no icon displayed...
if [ ! -d /root/.pup_event/drive_${DRV_NAME} ];then
if [ -e /sys/block/${DRV_NAME} ];then
mkdir /root/.pup_event/drive_${DRV_NAME}
cp -af /usr/local/bin/drive_all /root/.pup_event/drive_${DRV_NAME}/AppRun
SIZE=`cat /sys/block/${DRV_NAME}/size`
SIZE=$(($SIZE/2)) #get KB.
format_size_func #formats SIZE for display.
INFO="説明: ${DRV_DESCRIPTION} サイズ: ${SIZE}"
MOREITEMS=""
ONEDRVNAME="$DRV_NAME"
create_appinfo_func #needs INFO, DRV_CATEGORY, MOREITEMS, ONEDRVNAME
fi
fi
}
remove_pinboard_func() { #needs DRV_NAME (name of entire drive)
ppPATTERN=' label="'"$DRV_NAME"'.*" '
[ "`grep "$ppPATTERN" /root/Choices/ROX-Filer/PuppyPin`" = "" ] && return
ALLNAMES="`grep -o "$ppPATTERN" /root/Choices/ROX-Filer/PuppyPin | cut -f 2 -d '"' | tr '\n' ' '`" #'geany
for ONEDRVNAME in $ALLNAMES
do
echo "
/root/.pup_event/drive_${ONEDRVNAME}
" | rox -R
done
}
#note that init script in initrd takes care of restoring modules if enough space.
delete_func() { #called from free_func() and free_flash_func(). delete modules to create more free space.
#passed param: /pup_rw=delete tmpfs top layer only.
DEL_LAYER=$1
#find out what modules are loaded, keep those...
for ONEKEEP_MOD in `lsmod | cut -f 1 -d ' ' | grep -v 'Module'`
do
ONEKEEP_SPEC="`modinfo -F filename ${ONEKEEP_MOD}`"
ONEKEEP_PATH="`dirname $ONEKEEP_SPEC`"
mkdir -p /tmp${ONEKEEP_PATH}
cp -af ${ONEKEEP_SPEC} /tmp${ONEKEEP_PATH}/
done
if [ "$DEL_LAYER" != "" ];then
rm -rf ${DEL_LAYER}/lib/modules
else
if [ $PUPMODE -eq 3 -o $PUPMODE -eq 7 -o $PUPMODE -eq 13 ];then
rm -rf ${SAVE_LAYER}/lib/modules
fi
rm -rf /lib/modules
fi
cp -af /tmp/lib/modules /lib/modules
depmod -a
}
free_initrd_func() { #UniPup, runs entirely in initramfs.
SIZEFREEK=`free | grep '^Total:' | tr -s ' ' | cut -f 4 -d ' '`
SIZEFREEM=`expr $SIZEFREEK \/ 1024`
[ -s /tmp/pup_event_sizefreem ] && PREVSIZEFREEM=`cat /tmp/pup_event_sizefreem`
[ "$PREVSIZEFREEM" = "$SIZEFREEM" ] && return
#save to a file, freememapplet can read this...
echo "$SIZEFREEM" > /tmp/pup_event_sizefreem
}
free_func() { #called every 4 seconds.
case $PUPMODE in
6|12)
SIZEFREEM=`df -m | grep ' /initrd/pup_rw$' | tr -s ' ' | cut -f 4 -d ' '`
;;
*)
SIZEFREEM=`df -m | grep ' /$' | tr -s ' ' | cut -f 4 -d ' '`
;;
esac
WARNMSG=""
[ -s /tmp/pup_event_sizefreem ] && PREVSIZEFREEM=`cat /tmp/pup_event_sizefreem`
[ $PREVSIZEFREEM -eq $SIZEFREEM ] && return
if [ $SIZEFREEM -lt 10 ];then
if [ -d /initrd/pup_rw/lib/modules/all-firmware -a "$ZDRVINIT" = "yes" ];then
delete_func /initrd/pup_rw #save layer is at top, delete mods.
else
WARNMSG="WARNING: Personal storage getting full, strongly recommend you resize it or delete files!"
fi
fi
VIRTUALFREEM=$SIZEFREEM
if [ "$ZDRVINIT" = "yes" ];then #full set of modules present, moved from initrd.
if [ -d /initrd/pup_rw/lib/modules/all-firmware ];then #have not yet deleted modules.
#calc the "virtual" free space (would have if modules not there...)
VIRTUALFREEM=`expr $SIZEFREEM + $SIZE_MODS_M`
VIRTUALFREEM=`expr $VIRTUALFREEM - 1` #allow for some mods will not be deleted.
fi
fi
#save to a file, freememapplet can read this...
echo "$VIRTUALFREEM" > /tmp/pup_event_sizefreem
[ $PUPMODE -eq 5 -o $PUPMODE -eq 2 ] && return 0 #5=first boot, no msgs at top of screen.
if [ "$WARNMSG" != "" ];then
killall yaf-splash
yaf-splash -margin 2 -bg red -bw 0 -placement top -font "9x15B" -outline 0 -text "$WARNMSG" &
fi
}
free_flash_func() { #PUPMODE 3,7,13. called every 4 seconds.
WARNMSG=""
SIZEFREEM=`df -m | grep ' /initrd/pup_ro1$' | tr -s ' ' | cut -f 4 -d ' '`
SIZETMPM=`df -m | grep ' /initrd/pup_rw$' | tr -s ' ' | cut -f 4 -d ' '`
[ -s /tmp/pup_event_sizefreem ] && PREVSIZEFREEM=`cat /tmp/pup_event_sizefreem`
[ -s /tmp/pup_event_sizetmpm ] && PREVSIZETMPM=`cat /tmp/pup_event_sizetmpm`
[ $PREVSIZEFREEM -eq $SIZEFREEM -a $PREVSIZETMPM -eq $SIZETMPM ] && return
if [ $SIZEFREEM -lt 10 ];then
if [ -d /initrd/pup_ro1/lib/modules/all-firmware -a "$ZDRVINIT" = "yes" ];then
delete_func /initrd/pup_ro1 #delete modules in save layer only.
else
WARNMSG="WARNING: Personal storage file getting full, strongly recommend you resize it or delete files!"
fi
fi
if [ $SIZETMPM -lt 5 ];then
if [ -d /initrd/pup_rw/lib/modules/all-firmware -a "$ZDRVINIT" = "yes" ];then
delete_func /initrd/pup_rw #delete modules in top tmpfs layer only.
else
WARNMSG="WARNING: RAM working space only ${SIZETMPM}MB, recommend a reboot which will flush the RAM"
fi
fi
VIRTUALFREEM=$SIZEFREEM
if [ "$ZDRVINIT" = "yes" ];then #full set of modules present at bootup.
if [ -d /initrd/pup_ro1/lib/modules/all-firmware ];then #have not yet deleted modules.
#calc the "virtual" free space (would have if modules not there...)
VIRTUALFREEM=`expr $SIZEFREEM + $SIZE_MODS_M`
VIRTUALFREEM=`expr $VIRTUALFREEM - 1` #allow for some mods will not be deleted.
fi
fi
echo "$SIZETMPM" > /tmp/pup_event_sizetmpm
#save to a file, freememapplet can read this...
echo "$VIRTUALFREEM" > /tmp/pup_event_sizefreem
if [ "$WARNMSG" != "" ];then
killall yaf-splash
yaf-splash -margin 2 -bg red -bw 0 -placement top -font "9x15B" -outline 0 -text "$WARNMSG" &
fi
}
savepuppy_func() { #called every 4 seconds.
if [ -f /tmp/snapmergepuppyrequest ];then #by request.
rm -f /tmp/snapmergepuppyrequest
yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -placement top -text "Saving RAM to 'pup_save' file..." &
YAFPID=$!
sync
nice -n 19 /usr/sbin/snapmergepuppy
kill $YAFPID
fi
}
#v407 fixed so works for sr* and hd* optical...
probe_optical_func() { #passed param is sr<0-9> or hd
DRV_NAME="$1"
DRV_CATEGORY="optical"
CDSTATUS2="0"
opticalPATTERN='^/dev/'"${DRV_NAME}"' '
[ "`grep "$opticalPATTERN" /proc/mounts`" != "" ] && return #only check cd if unmounted.
cddetect_quick -d/dev/${DRV_NAME} >/dev/null 2>&1 #very fast.
#...returns 0 if disc inserted, else 255.
CDSTATUS2="$?"
[ "$CDSTATUS2" != "0" ] && [ -d /root/.pup_event/drive_${DRV_NAME} ] && rm -rf /root/.pup_event/drive_${DRV_NAME} #v410 ensure no drive directory if drive empty.
echo "$CDSTATUS2" > /tmp/pup_event_frontend_identify2_${DRV_NAME}
[ ! -f /tmp/pup_event_frontend_identify1_${DRV_NAME} ] && cp /tmp/pup_event_frontend_identify2_${DRV_NAME} /tmp/pup_event_frontend_identify1_${DRV_NAME}
CDSTATUS1="`cat /tmp/pup_event_frontend_identify1_${DRV_NAME}`"
[ "$CDSTATUS1" = "$CDSTATUS2" ] && return
cp -f /tmp/pup_event_frontend_identify2_${DRV_NAME} /tmp/pup_event_frontend_identify1_${DRV_NAME}
if [ "$CDSTATUS2" = "0" ];then
#VENDOR="`cat /sys/block/${DRV_NAME}/device/vendor | tr -s ' '`"
#MODEL="`cat /sys/block/${DRV_NAME}/device/model | tr -s ' '`"
#DRV_DESCRIPTION="$VENDOR $MODEL"
opticalPATTERN='^/dev/'"${DRV_NAME}"'|'
DRV_DESCRIPTION="`echo "$PROBEDISK" | grep "$opticalPATTERN" | cut -f 3 -d '|'`"
create_icon_func #requires DRV_NAME, DRV_CATEGORY, DRV_DESCRIPTION.
[ "$HOTPLUGNOISY" = "true" ] && /root/.pup_event/drive_${DRV_NAME}/AppRun optical & #handler script.
else
rm -rf /root/.pup_event/drive_${DRV_NAME} 2>/dev/null
remove_pinboard_func #needs DRV_NAME
fi
}
#v407 detect ls120 and zip disc inserted...
probe_floppy_func() { #passed param is drive name (exs: hdc, sdc)
DRV_NAME="$1"
DRVMAIN="`echo -n "$DRV_NAME" | cut -c 1,2`" #sd or hd.
DRV_CATEGORY="floppy"
floppyPATTERN="^/dev/$DRV_NAME"
[ "`grep "$floppyPATTERN" /proc/mounts`" != "" ] && return #mounted.
if [ "$DRVMAIN" = "hd" ];then
cat /proc/ide/${DRV_NAME}/identify > /tmp/pup_event_frontend_identify2_${DRV_NAME}
else
#this method not as good, as only detects disc if it has a partition...
floppyPATTERN=" ${DRV_NAME}"
grep "$floppyPATTERN" /proc/partitions > /tmp/pup_event_frontend_identify2_${DRV_NAME}
fi
[ ! -f /tmp/pup_event_frontend_identify1_${DRV_NAME} ] && cp /tmp/pup_event_frontend_identify2_${DRV_NAME} /tmp/pup_event_frontend_identify1_${DRV_NAME}
[ "`diff -s /tmp/pup_event_frontend_identify1_${DRV_NAME} /tmp/pup_event_frontend_identify2_${DRV_NAME} | grep ' are identical'`" != "" ] && return
cp -f /tmp/pup_event_frontend_identify2_${DRV_NAME} /tmp/pup_event_frontend_identify1_${DRV_NAME}
FLOPPYSTATUS=1
[ "`disktype /dev/${DRV_NAME} 2>&1 | grep 'I/O error'`" = "" ] && FLOPPYSTATUS=0
if [ "$FLOPPYSTATUS" = "0" ];then
if [ "$DRVMAIN" = "hd" ];then
DRV_DESCRIPTION="`cat /proc/ide/${DRV_NAME}/model`"
else
DRV_DESCRIPTION="`cat /sys/block/${DRV_NAME}/device/model | tr -s ' '`"
fi
create_icon_func #requires DRV_NAME, DRV_CATEGORY, DRV_DESCRIPTION.
[ "$HOTPLUGNOISY" = "true" ] && /root/.pup_event/drive_${DRV_NAME}/AppRun floppy & #handler script.
else
rm -rf /root/.pup_event/drive_${DRV_NAME} 2>/dev/null
remove_pinboard_func #needs DRV_NAME
fi
}
######################################################################
#stuff to setup at entry...
mkdir -p /root/.pup_event
#build the desktop icons...
DRV_CATEGORY='drive'
PROBEDISK="`probedisk2`"
#v407 ls120/zip floppy drives are probed every 4 secs...
DRVS_FLOPPY="`echo "$PROBEDISK" | grep '|floppy|' | cut -f 1 -d '|' | cut -f 3 -d '/'`"
#v407 same thing for all optical drives...
DRVS_OPTICAL="`echo "$PROBEDISK" | grep '|optical|' | cut -f 1 -d '|' | cut -f 3 -d '/'`"
if [ "$ICONDESK" = "false" ];then
#only show a single 'drives' icon on desktop...
DRV_NAME='drives'
DRV_CATEGORY='any' #see pmount.
DRV_DESCRIPTION="all drives"
create_icon_func #needs DRV_NAME, DRV_CATEGORY, DRV_DESCRIPTION.
else
#show all drives on desktop...
PROBEPART="`probepart -k | grep -E '\|ntfs\||\|msdos\||\|vfat\||\|ext2\||\|ext3\||\|iso9660\||\|xfs\||\|reiser'`"
if [ "$FD0ICON" = "true" ];then #see /etc/eventmanager
if [ -e /sys/block/fd0 ];then
PROBEDISK="/dev/fd0|floppy|レガシーフロッピードライブ
$PROBEDISK"
PROBEPART="/dev/fd0|vfat|1440
$PROBEPART"
fi
fi
for ONEDRV in `echo "$PROBEDISK" | cut -f 1,2,3 -d '|' | tr ' ' '_' | tr '\n' ' '`
do
DRV_NAME="`echo -n "$ONEDRV" | cut -f 1 -d '|' | cut -f 3 -d '/'`"
DRV_CATEGORY="`echo -n "$ONEDRV" | cut -f 2 -d '|'`"
DRV_DESCRIPTION="`echo -n "$ONEDRV" | cut -f 3 -d '|' | tr '_' ' '`"
[ "`echo "$PROBEPART" | grep "$DRV_NAME"`" = "" ] && continue #precaution (such as CD not inserted).
create_icon_func startup #needs DRV_NAME, DRV_CATEGORY, DRV_DESCRIPTION, PROBEPART.
done
fi
if [ "$BACKENDON" = "false" ];then #see /etc/eventmanager.
killall hotplug2stdout #pup_event_backend_d #no module/firmware hotplug support.
#...kill hotplug2stdout, as that will cause pup_eventd_backend_d to die.
[ -f /sbin/udevd ] && killall udevd #alternative to pup_event_backend_d.
exit
fi
[ "$HOTPLUGON" = "false" ] && exit #turn off all frontend hotplug support. see /etc/eventmanager.
###################################################################
#now go into a two-second loop...
while [ 1 ]
do
sleep 2
#graceful exit if shutdown X (see /usr/X11R7/bin/restartwm,wmreboot,wmpoweroff)...
[ -f /tmp/wmexitmode.txt ] && break
#test for any change in /sys/block...
ls -1 --hide=ram* --hide=loop* /sys/block > /tmp/pup_event_frontend_block2
[ ! -f /tmp/pup_event_frontend_block1 ] && cp /tmp/pup_event_frontend_block2 /tmp/pup_event_frontend_block1
BLOCKDIFF="`diff /tmp/pup_event_frontend_block1 /tmp/pup_event_frontend_block2`"
#########hotplug block event##########
if [ "$BLOCKDIFF" != "" ];then
cp -f /tmp/pup_event_frontend_block2 /tmp/pup_event_frontend_block1
BLOCKSADD="`echo "$BLOCKDIFF" | grep '^> ' | cut -f 2-9 -d ' ' | tr '\n' ' '`"
BLOCKSREM="`echo "$BLOCKDIFF" | grep '^< ' | cut -f 2-9 -d ' ' | tr '\n' ' '`"
ACTION=add
SUBSYSTEM=block
DEVTYPE=disk
for DRV_NAME in $BLOCKSADD
do
[ ! -e /sys/block/$DRV_NAME ] && continue #precaution
DEVPATH=/block/$DRV_NAME
odPATTERN='^/dev/'"$DRV_NAME"'|'
PROBEDISK="`probedisk2`"
DRVS_OPTICAL="`echo "$PROBEDISK" | grep '|optical|' | cut -f 1 -d '|' | cut -f 3 -d '/'`" #update
DRVS_FLOPPY="`echo "$PROBEDISK" | grep '|floppy|' | cut -f 1 -d '|' | cut -f 3 -d '/'`" #update
DRV_CATEGORY="`echo -n "$PROBEDISK" | grep "$odPATTERN" | cut -f 2 -d '|'`"
DRV_DESCRIPTION="`echo -n "$PROBEDISK" | grep "$odPATTERN" | cut -f 3 -d '|' | tr -s ' '`"
[ "$ICONDESK" = "true" ] && create_icon_func #uses DRV_NAME, DRV_CATEGORY, DRV_DESCRIPTION
[ "$HOTPLUGNOISY" = "true" ] && /root/.pup_event/drive_${DRV_NAME}/AppRun ${DRV_CATEGORY} & #handler script.
done
ACTION=remove
for DRV_NAME in $BLOCKSREM
do
[ -e /sys/block/$DRV_NAME ] && continue #precaution
DRVS_OPTICAL="`echo "$DRVS_OPTICAL" | grep -v "$DRV_NAME"`" #update
DRVS_FLOPPY="`echo "$DRVS_FLOPPY" | grep -v "$DRV_NAME"`" #update
DEVPATH=/block/$DRV_NAME
if [ "`pidof gtkdialog_pmount`" != "" ];then #if pmount running, refresh it.
killall gtkdialog_pmount 2>/dev/null
sleep 0.1
pmount &
fi
remove_pinboard_func #needs DRV_NAME
rm -rf /root/.pup_event/drive_${DRV_NAME}* 2>/dev/null
done
fi
if [ $TOGGLE -eq 0 ];then #slow down to every 4 seconds.
TOGGLE=1
continue
else
TOGGLE=0
fi
#######four second timeout procesing#########
SAVECNT=`expr $SAVECNT + 4`
if [ $RAMSAVEINTERVAL -ne 0 -a $SAVECNT -gt $RAMSAVEINTERVAL ];then
touch /tmp/snapmergepuppyrequest #request to savepuppy_func.
SAVECNT=0
fi
#some apps should not be disturbed by this background stuff...
RUNPS="`ps`"
[ "`echo "$RUNPS" | grep -E 'xine|petget|wget|axel|dotpup|mplayer|gcurl|gimv|burniso2cd|growisofs|cdrecord|pcdripper|xfmedia|xmms|ripoff|pdvdrsab|pburn|mhwaveedit'`" != "" ] && continue
#monitor free memory, periodic save of tmpfs top layer...
case $PUPMODE in
3|7|13)
free_flash_func
savepuppy_func
;;
16|24|17|25) #unipup.
free_initrd_func
;;
*)
free_func
;;
esac
[ "$ICONDESK" = "false" ] && continue #v405 see /etc/eventmanager
#unfortunately, we have to poll at regular intervals to see if a cd is inserted...
for ONEOPTICAL in $DRVS_OPTICAL
do
[ "$ONEOPTICAL" = "" ] && continue #precaution
probe_optical_func $ONEOPTICAL
done
#v407 poll to see if a ls120 or zip floppy diskette inserted...
for ONEFLOPPY in $DRVS_FLOPPY
do
[ "$ONEFLOPPY" = "" ] && continue #precaution
probe_floppy_func $ONEFLOPPY
done
done #2 second loop.
###END###