#!/bin/bash # xdialog kullanımını kolaylaştıran yordamlar. ## milisarge <milisarge@gmail.com> ## brokenman <brokenman@porteus.org> librokenman betiğinden yararlanılmıştır. ################################### ## READ THE COMMENTS CAREFULLY TO ## KNOW THE ARGUMENTS REQUIRED !! ################################### ## In most cases script returns variable $answ ## In this case 0=yes 1=no ## E.g is_64bit ($answ returns 0 then yes it is a 64bit machine) script=${0##*/} ### This is the users script name, not this one scriptpath="$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")" ### Full script path answ=/tmp/.answ log=/var/log/libmilisdialog.log # Generic output for errors error(){ echo $1 >> $log } # Find which window desktop session we are in. It returns wm= get_desktop_session(){ # get desktop info startx=`ps x | grep -c /usr/bin/startx` if [ $startx -eq 2 ]; then lxde=`ps x | grep -v grep | grep -c /usr/bin/lxsession` trinity=`ps x | grep -v grep | grep tdeinit` kde4=`ps x | grep -v grep | grep -c /usr/bin/starttde` xfce=`ps x | grep -v grep | grep -c xfdesktop` else lxde=`ps aux | sed '/X '$(echo $DISPLAY|cut -d. -f1)'/,$ !d' | sed '1,/X / !d' | grep -c /usr/bin/lxsession` trinity=`ps aux | sed '/ '$DISPLAY' /,$ !d' | sed '1,/X / !d' | grep tdeinit` kde4=`ps aux | sed '/ '$DISPLAY' /,$ !d' | sed '1,/X / !d' | grep -c /usr/bin/startkde` xfce=`ps aux | sed '/ '$(echo $DISPLAY|cut -d. -f1)' /,$ !d' | sed '1,/X / !d' | grep -c xfdesktop` fi if [ "$lxde" -eq 1 ]; then wm=lxde elif [ "$trinity" ]; then wm=tde elif [ "$kde4" -eq 1 -a -z "$trinity" ]; then wm=kde4 elif [ "$xfce" -eq 1 ]; then wm=xfce fi [ -z $wm ] && error "There was a problem finding the desktop session" } # milis mimari tipi is_64bit(){ [ `uname -m|egrep "64"` ] && answ=0 || answ=1 } # Silently kill a named process (number) kills(){ # Check that $1 was given if [ $1 ]; then kill $1 2>/dev/null & wait $1 2>/dev/null else answ=3 error "You must supply a process ID to kill!" return fi } # Unpack a compressed file to current dir # $1=compressed file unpack_file(){ if [ ! $1 ]; then answ=3 error "You must supply a compressed file" cyan "Supported files: .zip .tar.gz .tar.bz2 .xzm" return fi # Make sure file has valid extension local chkf local ext local nam local nam2 chkf=`echo $1|egrep "*.tar.gz|.tar.bz2|.zip|.xzm|.tar.xz|.txz|.tgz"` if [ -z $chkf ]; then answ=3 error "ERROR:" "This type of file is not supported!" return fi # Get extension ext=${chkf##*.} nam=${1##*/} case $ext in gz ) tar zxvf $1 >/dev/null|| answ=3 && error "ERROR unpacking $1" ;; bz2 ) tar xvjf $1 >/dev/null|| bzip2 -d $1 || answ=3 && error "ERROR unpacking $1" ;; zip ) unzip $1 >/dev/null|| answ=3 && error "ERROR unpacking $1" ;; xzm ) unsquashfs $1 >/dev/null 2>&1 answ=3 && error "ERROR unpacking $1" ;; xz ) tar -Jxf $1 >/dev/null || answ=3 && error "ERROR unpacking $1" ;; txz ) mktemp -d ./unpacked.XXXXXX local targ targ=`ls|grep unpacked` installpkg -root $targ $1 >/dev/null 2>&1 || answ=3 && error "ERROR unpacking $1" ;; tgz ) mktemp -d ./unpacked.XXXXXX || answ=3 && error "ERROR unpacking $1" local targ targ=`ls|grep unpacked` installpkg -root $targ $1 >/dev/null 2>&1 || answ=3 && error "ERROR unpacking $1" ;; esac } # Make a posix test # $1=dir make_posix_test(){ f1=$1/._test1 f2=$1/._test2 touch $f1 ln -s $f1 $f2 2>/dev/null && chmod +x $f1 2>/dev/null && [ -x $f1 ] && chmod -x $f1 2>/dev/null && [ ! -x $f1 ] && rm -f $f1 $f2 if [ $? -ne 0 ]; then answ=1 rm -f $f1 $f2 >/dev/null 2>&1 else answ=0 fi } # Remove duplicates # $1=file remove_duplicates(){ if [ ! $1 ]; then answ=3 && error "You must supply a valid list" return elif [ ! -f $1 ]; then error "Could not find $1" $FUNCNAME $LINENO cyan "Make sure the file exists and is a list" exit else sort -u $1 > /tmp/.hold rm $1 mv /tmp/.hold $1 fi } # A simple Xdialog download gauge # $1=title $2=text $3=link $4=rc-file download() { if [ $# -lt 4 ]; then error "You must supply 4 args to: $FUNCNAME" $FUNCNAME $LINENO cyan "\$1=title, \$2=text, \$3=link \$4=rc-file" cyan "If you don't have an rc-file just put anything" exit else touch /tmp/.dload dl=/tmp/.dload wget $3 -o $dl & ( while [ "$i" != "98" -a "$f" == "" ]; do echo $i i=$(cat $dl 2>/dev/null| grep "%" |awk '{print $(NF-2)}'|sed 's/\(.*\)./\1/'|tail -n1) f=$(grep "100%" $dl) sleep 0.1 done ) | Xdialog --title "$1" --rc-file "$4" --icon "$5" --gauge "Downloading $2...." 400x150 [ -f $dl ] && rm -f $dl fi [ -f $dl ] && rm $dl } # Check that a filename is slackware compatible # If name is bad will return badname=1 # If field has -lt 4 will return $badflds # If $PKG_ARCH is -ne i486,x86_64,noarch,fw will return $badarch check_slackware_name(){ if [ $# -eq 0 ]; then error "You must supply a slackware file name!" $FUNCNAME $LINENO else local FILE=${1##*/} # Make sure all is in lower case FILE=`echo $FILE|tr "[:upper:]" "[:lower:]"` # Make sure there are no less than 4 fields local flds=`awk -F- '{print NF}' $FILE` [ $flds -lt 4 ] && { answ=1; return; } # Split package name to individual elements eval $(echo $FILE | sed 's/\(.*\)-\([^-]*\)-\([^-]*\)-\([0-9]*\)\(.*\)*/\ PKG_NAME=\1 PKG_VER=\2 PKG_ARCH=\3 PKG_BUILD=\4 PKG_TAG=\5/') # Check that package arch is legit [ ! `echo $PKG_ARCH|egrep "i*86|x86_64|noarch|fw"` ] && { answ=1; return; } answ=0 fi } # makes sure that is a directory is chosen, it is not on aufs # unless in tmp or home folder (never in root) # This function returns nopermit=1 if dir is bad. is_on_aufs(){ if [ $# -ne 1 ]; then answ=3 return else [ ! -d $1 ] && { answ=3; return; } [ "`df -T $1|tail -n1|awk '{print$1}'`" == "aufs" ] && answ=0 || answ=1 fi } # Verify that this is a milis module & identify squashfs version # $1=module path # Returns: badext=1 bad extension | sq=4 squashfs4 | sq=3 squashfs3 | sq=0 not valid is_squash4(){ if [ ! $1 ]; then error "You must supply the path to a valid Milis module" $FUNCNAME $LINENO return else mname=$1 ftype=`file $mname|egrep -o "endian|data"` [ -z $ftype ] && answ=0 || answ=1 fi } # Silently mount a module on loopback and check is module # Mount module to /mnt/loop mount_module(){ if [ ! $1 ]; then answ=3 return else is_squash4 if [ $answ -eq 1 ]; then answ=3 else mloop "$1" >/dev/null 2>&1 && answ=0 || answ=3 fi fi } # Check if a website is online and working (silently) # Returns url=0 if it is avaiable silent_check_url(){ if [ $# -lt 1 ]; then answ=3 error "You must supply a URL to:" $FUNCNAME $LINENO exit else if (wget -q --spider --force-html --inet4-only "$1" >/dev/null 2>&1); then answ=0 else answ=1 fi fi } # Check if a website is online and working (silently) # Returns url=0 if it is avaiable has_internet(){ if (wget -q --spider --force-html --inet4-only http://www.google.com >/dev/null 2>&1); then answ=0 else answ=1 fi } # Check that writable flag is set is_writable(){ [ -w $1 ] && answ=0 || answ=1 } # Get the last field in a given string with given delimiter # $1=delimiter get_last_field(){ awk -F"$1" '{print$NF}' } # Get the field count for given string with given delimiter get_field_count(){ awk -F"$1" '{print NF}' } # Make a free loop if one is not present check_free_loop_device(){ x=`grep /dev/loop /proc/mounts | tail -n1 | cut -d " " -f1 | sed 's@/dev/loop@@'`; let y=x+1 loop=/dev/loop$y if [ ! -e $loop ]; then mknod $loop b 7 $y; fi unset x loop y } # Green colored output green() { echo -e "\033[01;32m$@\033[00m" } # Yellow colored output yellow() { echo -e "\033[01;33m$@\033[00m" } # Red colored output function redd() { echo -e "\033[01;31m$@\033[00m" } # Cyan colored output cyan() { echo -e "\033[01;36m$@\033[00m" } # Blue colored output blue() { echo -e "\033[01;34m$@\033[00m" } # Magenta colored output magenta() { echo -e "\033[01;35m$@\033[00m" } ### GTKDIALOG LIBRARIES ## Use manual progress update like so: ## echo "My message goes here" > /tmp/.message ## manual_progress "My title goes here" ## sleep 5 (or other code) ## echo "Second update goes here" > /tmp/.message ## sleep 3 (or other code) ## kill_manual_progress manual_progress(){ # Open a window for progress export MANUAL_PROGRESS=' <window title="Milis message" icon-name="cdr" resizable="false" width-request="400" window_position="1"> <vbox> <frame> <text use-markup="true" width-request="310"> <label>"'$1'"</label> <variable>PROGRESS_TXT</variable> </text> <progressbar visible="true"> <variable>PROGRESS_BAR</variable> <label>...</label> <input>prog_counter</input> </progressbar> </frame> </vbox> </window> ' gtkdialog -c -p MANUAL_PROGRESS 2>/tmp/.progress_trap & }; export -f manual_progress ## This is called by the manual_progress function. prog_counter(){ case $STATE in MANUAL ) while [ A != B ]; do MSG=`cat /tmp/.message` echo $MSG sleep 0.3 done echo "ALL DONE" unset STATE ;; DOWNLOAD ) while [ A != B ]; do if [ -f /tmp/.cdload ]; then M=`cat /tmp/.cdload`; echo "$M"; fi sleep 0.3 [ `grep "100%" /tmp/.message` ] && echo 1 i=$(grep -o "[^ ]*%[^ ]*" /tmp/.message|sed "s/%//g"|tail -n1) [ "$i" == "100" ] && i=1 [ "$i" != "" ] && echo "$i" sleep 0.3 done echo "ALL DONE" unset STATE ;; BUILDMODULE ) while [ A != B ]; do if [ ! -f /tmp/.message ]; then echo "Waiting ..."; fi [ `grep "100%" /tmp/.message` ] && echo Finished i=$(grep -o ...% /tmp/.message|sed -e "s/%//g" -e 's/ //g'|tail -n1) [ "$i" != "" ] && echo "$i" sleep 0.3 done echo "ALL DONE" unset STATE ;; * ) while [ A != B ]; do MSG=`cat /tmp/.message` echo $MSG sleep 0.3 done echo "ALL DONE" unset STATE ;; esac [ -f /tmp/.cdload ] && rm /tmp/.cdload 2>&- [ -f /tmp/.message ] && rm /tmp/.message 2>&- }; export -f prog_counter kill_manual_progress() { myself=`ps ax|grep MANUAL_PROGRESS|awk '{print$1}'|head -n1` for children in `ps -o pid --ppid $myself|sed '/PID/d'`; do kill $children >/dev/null 2>&- done kill $myself >/dev/null 2>&- [ -f /tmp/.message ] && rm /tmp/.message [ -f /tmp/.progress_trap ] && rm /tmp/.progress_trap }; export -f kill_manual_progress gtk_message(){ echo ' <window window_position="1" title="Milis mesaj" icon-name="cdr" allow-shrink="false" width-request="'$2'"> <vbox> <hbox> <frame> <pixmap icon_size="6"> <input file stock="'$3'"></input> </pixmap> </frame> <frame> <text wrap="true"><label>"'$1'"</label></text> </frame> </hbox> <hbox> <button ok></button> </hbox> </vbox> <action signal="hide">exit:abort main window by X</action> </window> ' | gtkdialog -s } ## $1=message $2=width $3=icon(file) gtk_message_custom(){ echo ' <window window_position="1" title="Milis mesaj" icon-name="cdr" allow-shrink="false" width-request="'$2'"> <vbox> <hbox> <frame> <pixmap icon_size="6"> <input file>'$3'</input> </pixmap> </frame> <frame> <text use-markup="true" wrap="true"><label>"'$1'"</label></text> </frame> </hbox> <hbox> <button ok></button> </hbox> </vbox> <action signal="hide">exit:abort main window by X</action> </window> ' | gtkdialog -s } gtk_choose_file(){ echo ' <text label="'$1'"></text> <entry editable="false" fs-title="'$2'" fs-action="'$3'" fs-folder="'$4'" height-request="32"> <variable>'$6'</variable> </entry> <button> <variable>'$5'</variable> <input file stock="gtk-find"></input> <action>fileselect:'$6'</action> </button> ' } start_window(){ echo '<window window_position="1" title="'$1'" icon-name="'$2'" allow-shrink="false" width-request="'$3'" height-request="'$4'"> <vbox margin="10">' } end_window(){ echo '</vbox><action signal="hide">exit:Cancel</action></window>' } txtmarkup(){ echo '<text use-markup="true" width-request="'$1'" selectable="true" can-focus="no"><label>"'$2'"</label></text>' } txtcolor(){ echo '<text use-markup="true" width-request="'$1'"><label>"<span fgcolor='"'$2'"' size='"'$3'"' weight='"'$4'"'>'$5'</span>"</label></text>' } txtfile(){ echo '<text width-request="'$1'" selectable="true" can-focus="no"><label>NoTextFound</label><input file>'$2'</input></text>' } pixmapstock(){ echo '<pixmap><input file stock="'$1'"></input></pixmap>' } pixmapicon(){ echo '<pixmap><height>'$1'</height><width>'$2'</width><input file icon="'$3'"></input></pixmap>' } pixmapfile(){ echo '<pixmap><height>'$1'</height><width>'$2'</width><input file>'$3'</input></pixmap>' } vsep(){ echo '<vseparator></vseparator>' } hsep(){ echo '<hseparator></hseparator>' } butstock(){ echo '<button use-underline="true"><variable>'$1'</variable><label>'$2'</label><input file stock="'$3'"></input>' } buticon(){ echo '<button><variable>'$1'</variable><label>'$2'</label><input file icon="'$3'"></input>' } butok(){ echo '<button ok></button>' } butcancel(){ echo '<button cancel></button>' } butyes(){ echo '<button yes></button>' } butno(){ echo '<button no></button>' } butreturn(){ echo '<button tooltip-text="'$1'" use-underline="true"><label>_Return</label><input file stock="gtk-go-back"></input><sensitive>'$2'</sensitive>' } butcustom(){ echo '<button tooltip-text="'$1'" sensitive="'$6'"><label>'$2'</label><variable>'$3'</variable><input file '$4'="'$5'"></input>' } rbut(){ echo '<radiobutton active="'$1'"><variable>'$2'</variable><label>'$3'</label>' } chkbox(){ echo '<checkbox active="'$1'"><label>"'$3'"</label><variable>'$2'</variable>' } blankline(){ echo '<text><label>""</label></text>' } entry(){ echo '<entry sensitive="'$1'" tooltip-text="'$2'"><default>"'$3'"</default><variable>'$4'</variable>' } table(){ echo '<table><variable>'$1'</variable><label>"'$4'"</label><height>'$2'</height><width>'$3'</width>' } if [ "$1" == "-h" ]; then yellow start_window blue "WindowTitle WindowIcon width height" yellow "txtmarkup" blue "width text" yellow "txtcolor" blue "width color size weight text" yellow txtfile blue "width file" yellow pixmapstock blue "gtk-name" yellow pixmapicon blue "height width icon" yellow pixmapfile blue "height width file" yellow vsep blue "vertical seperator (nothing required)" yellow hsep blue "horizontal seperator (nothing required)" yellow butok blue "nothing required" yellow butcancel blue "nothing required" yellow butyes blue "nothing required" yellow butno blue "nothing required" yellow butstock blue "variable label gtk-icon" cyan "must be closed with </button>" yellow buticon blue "variable label icon" cyan "must be closed with </button>" yellow butreturn blue "tooltip-text sensitive (true/false)" cyan "must be closed with </button>" yellow butcustom blue "tooltip label variable stock/icon gtk-icon/iconname sensitive (true/false)" cyan "must be closed with </button>" yellow rbut blue "active (true/false) variable label" cyan "must be closed with </radiobutton>" yellow chbox blue "active (true/false) variable label" cyan "must be closed with </checkbox>" yellow blankline blue "makes a blank line" yellow entry blue "sensitive tooltip-text defaulttext variable" cyan "must be closed with </entry>" yellow table blue "variable height width label" cyan "enter <item>something</item>" cyan "Must be closed with </table>" fi