#!/bin/bash set -e usage() { VERBOSE="Y" CMD_NAME="$(basename "$0")" echo "Usage: " echo "$CMD_NAME init|test|update|gendesktop " } COMMAND="$(basename "$0")" ACTION=$1 BASE=`pwd` META_DIR="$BASE/desktop-meta/" GENDESK_DIR="$BASE/generated-desktop/" DESKDBFILE="$BASE/desktops_db" LOGFILE="$BASE"/log #This method make the necessary files and directories init() { if [ ! -d $META_DIR ]; then mkdir $META_DIR fi if [ ! -d $GENDESK_DIR ]; then mkdir $GENDESK_DIR fi if [ ! -e $DESKDBFILE ]; then touch $DESKDBFILE fi } # test() { local listacum listfileswithblank breaktest listnexist listdwm breaktest=0 listnexist='' listacum='' listdwm='' if [ ! -d "$META_DIR" -o ! -d "$GENDESK_DIR" -o ! -e "$DESKDBFILE" ]; then echo "La infraestructura no esta correcta. Ejecuta \"$COMMAND init\"" breaktest=1 fi listfileswithblank='' for fileswithblank in $(rgrep -x "[[:blank:]]*" $META_DIR*.stompy -l);do listfileswithblank=$listfileswithblank$fileswithblank"\n" done for file in `ls $META_DIR*.meta | sed -e "s%$META_DIR\(.*\)\.meta$%\1%g"`; do rc=0 grep "^$file$" $DESKDBFILE && rc=0 || rc=1 if [ $rc -ne 0 ]; then listacum="$listacum $file \n" fi done while read line ;do if [ ! -e "$META_DIR/$line.meta" ]; then listnexist="$listnexist$line " fi done < $DESKDBFILE for metadesktops in `ls $META_DIR*.desktop | sed -e "s%$META_DIR\(.*\)\.desktop$%\1%g"`; do if [ -e "$META_DIR$metadesktops.meta" ]; then grep "^$metadesktops$" $DESKDBFILE && rc1=0 || rc1=1 ISONDKDB="" if [ $rc1 -ne 1 ]; then ISONDKDB="Ademas esta en el fichero desktops_db. Deberia eliminarlo." breaktest=1 fi listdwm=$listdwm"El desktop $metadesktops.desktop tiene un fichero meta."$ISONDKDB"\n" fi done echo -e $listdwm if [ "$listacum" != '' ]; then echo -e "\n\nLos siguientes desktops no han sido incluidos en desktops_db \n$listacum" echo "Comprueba que los nombres no tienen un espacio en blanco al principio o al final del nombre" fi if [ "$listfileswithblank" != '' ]; then echo -e "\n\nLos siguientes desktops contienen lineas en blanco en sus ficheros stompy. Elimina las lineas en blanco para seguir\n\n" echo -e "$listfileswithblank" breaktest=1 fi if [ "$listnexist" != '' ]; then echo -e "Las siguientes entradas del desktops_db no tienen fichero meta. Deberia revisarlas" echo -e "$listnexist" fi if [ $breaktest -eq 1 ]; then exit 1 fi } test_exec(){ local rc EXEC_CANDIDATE PEXEC EXEC_CANDIDATE="" rc=1 while [ "$1" ] ; do if ! echo " $EXCLUDED_CMD " | grep -q " $1 " ; then if ! echo "$1" | grep -q -e "^-" ; then BASE_NAME="$(basename "$1")" #IF PATH IS ABSOLUTE if [ "$1" != "$BASE_NAME" ] ; then PEXEC=$(apt-file search -l -x "^$1$" | head -n 1) if [ "${PEXEC}" != '' ]; then EXEC_CANDIDATE="$PEXEC" fi else #IF PATH IS RELATIVE for abspath in $listpathexec; do PEXEC=$(apt-file search -l -x "^$abspath$1$" | head -n 1) if [ "${PEXEC}" != '' ]; then EXEC_CANDIDATE="$PEXEC" break fi done fi fi fi if [ "$EXEC_CANDIDATE" ] ; then rc=0 break fi shift done echo "$EXEC_CANDIDATE" return $rc } test_tryexec(){ local rc TRYEXEC_CANDIDATE TRYEXEC_CANDIDATE="" rc=1 while [ "$1" ] ; do if ! echo " $EXCLUDED_CMD " |grep -q " $1 " ; then if ! echo "$1" |grep -q -e "^-" ; then BASE_NAME="$(basename "$1")" if [ "$1" != "$BASE_NAME" ] ; then if [ -e $TMPDIR$1 ]; then TRYEXEC_CANDIDATE="$1" else TRYEXEC_CANDIDATE='' fi else TRYEXEC_CANDIDATE=`find ./ -xtype f -executable -name "$1" |head -n 1 | sed -e 's/^\.\(.*\)/\1/g'` fi fi fi if [ "$TRYEXEC_CANDIDATE" ] ; then rc=0 break fi shift done echo "$TRYEXEC_CANDIDATE" return $rc } # This script search desktop file on apt-file for found package contains her. # Also search package contains binary that desktop launch. # Packages update() { local listpathdesktop listpathexec EXCLUDED_CMD list listnb listne listnd listnu REPATH tempdesktopdb listpathdesktop="/usr/share/applications/" listpathexec="/usr/bin/ /usr/sbin/ /usr/games/" tempdesktopdb=`mktemp` EXCLUDED_CMD="gksu gksudo sudo su-to-root xdg-open x-www-browser www-browser sensible-browser sensible-editor sensible-pager %f %F %u %U %i %c %k" list='' listnb='' listne='' listnd='' listnu='' mkdir -p /tmp/kkdget for auxpath in $listpathdesktop; do apt-file search -x "^$auxpath" >> $tempdesktopdb done for PATHFILE in `ls ${META_DIR}*.meta`;do NAMEFILE=$(basename ${PATHFILE} | sed -e 's%\(.*\)\.meta$%\1%g') if [ ! -s ${META_DIR}${NAMEFILE}.meta ]; then desktoppackage=$(grep "${NAMEFILE}$" $tempdesktopdb | cut -d ":" -f 1) if [ "${desktoppackage}" != '' ]; then # Ha encontrado un paquete echo "desktop-package=$desktoppackage" > $META_DIR$NAMEFILE.meta binarypackage="" pushd /tmp/kkdget dget ${desktoppackage% ?} rc1=0 dpkg -x *.deb . pathdesktop=$(find . -name $NAMEFILE.desktop) pathexec=$(grep '^[[:blank:]]*Exec=' $pathdesktop | cut -d '=' -f2) || rc1=$? if [ $rc1 -eq 0 ]; then binarypackage=$(test_exec $pathexec) # # Generacion del protostompy # grep "^Name=" $pathdesktop >> $META_DIR$NAMEFILE.stompy echo "Name[qcv]=" >> $META_DIR$NAMEFILE.stompy grep "\[es\]=" $pathdesktop >> $META_DIR$NAMEFILE.stompy grep "\[ca\]=" $pathdesktop >> $META_DIR$NAMEFILE.stompy grep "^Comment=" $pathdesktop >> $META_DIR$NAMEFILE.stompy echo "Comment[qcv]=" >> $META_DIR$NAMEFILE.stompy grep "^Categories=" $pathdesktop >> $META_DIR$NAMEFILE.stompy grep "^NotShowIn=" $pathdesktop >> $META_DIR$NAMEFILE.stompy grep "^NoDisplay=" $pathdesktop >> $META_DIR$NAMEFILE.stompy grep "^OnlyShowIn=" $pathdesktop >> $META_DIR$NAMEFILE.stompy grep "^Hidden=" $pathdesktop >> $META_DIR$NAMEFILE.stompy if [ "${binarypackage}" != '' ]; then # Lista procesado correctamente list=$list$NAMEFILE"\n" else #lista no contiene binarypackage listnb=$listnb$NAMEFILE"\n" fi else # # Lista no contiene Exec # listne=$listne$NAMEFILE"\n" fi echo "binary-package=$binarypackage" >> $META_DIR$NAMEFILE.meta rm -rf /tmp/kkdget/* popd else #No ha encontrado un paquete donde este el desktop echo "desktop-package=" > $META_DIR$NAMEFILE.meta echo "binary-package=" >> $META_DIR$NAMEFILE.meta listnd=$listnd$NAMEFILE"\n" fi else listnu=$listnu$NAMEFILE" " fi done rm -rf /tmp/kkdget echo "===================" echo "New files processed" echo "===================" echo -e $list echo "============================" echo "Files without binary-package" echo "============================" echo -e $listnb echo "==================" echo "Files without exec" echo "==================" echo -e $listne echo "=====================" echo "Files without desktop" echo "=====================" echo -e $listnd echo "=================" echo "Unprocessed files" echo "=================" echo -e $listnu } gendesktop() { local EXCLUDED_CMD TMPDIR list listnt listnfe listnp rc2 EXCLUDED_CMD="gksu gksudo sudo su-to-root xdg-open x-www-browser www-browser sensible-browser sensible-editor sensible-pager" TMPDIR="$BASE/tmp/" list='' listnt='' listnfe='' listnp='' test if [ -d $TMPDIR ]; then rm -r $TMPDIR fi find "$META_DIR" -name "*.desktop" -exec cp '{}' $GENDESK_DIR \; mkdir $TMPDIR mkdir -p $GENDESK_DIR && echo "generated-desktop created"|| true while read NAMEFILE; do pushd $TMPDIR desktoppackage=$(grep 'desktop-package' $META_DIR$NAMEFILE.meta | cut -d '=' -f2) echo -e "$desktoppackage\n" dget $desktoppackage && okdget=0 || okdget=1 if [ $okdget -eq 0 ]; then dpkg -x *.deb . pathdesktop=$(find . -name $NAMEFILE.desktop -regex ".*usr/share/applications/.*") cp $pathdesktop $GENDESK_DIR && desktopfound=0 || desktopfound=1 if [ $desktopfound -eq 0 ]; then if [ -e $META_DIR$NAMEFILE.stompy ]; then while read line; do echo $line | grep -q "^not(" && delete=0 || delete=1 if [ "$line" != '' ]; then if [ $delete -eq 0 ]; then id=$(echo $line | sed -e "s%^not(\(.*\))%\1%g") sed -i -e "/^$id/d" $GENDESK_DIR$NAMEFILE.desktop else id=$(echo "${line}" | sed -e "s%\(.*\)=\(.*\)%\1=%g") sed -i -e "/^$id/d;\$a$line" $GENDESK_DIR$NAMEFILE.desktop fi fi done < $META_DIR$NAMEFILE.stompy fi rc=0 grep -q '^[[:blank:]]*TryExec=' $GENDESK_DIR$NAMEFILE.desktop || rc=$? if [ $rc -ne 0 ]; then rc1=0 EXEC=$(grep '^[[:blank:]]*Exec=' $GENDESK_DIR$NAMEFILE.desktop | cut -d '=' -f2) || rc1=$? if [ $rc1 -eq 0 ]; then rm -rf $TMPDIR* binarypackage=$(grep 'binary-package' $META_DIR$NAMEFILE.meta | cut -d '=' -f2) dget $binarypackage dpkg -x *.deb . rc2=0 tryexec=$(test_tryexec $EXEC) && rc2=0 || rc2=1 if [ "$rc2" ]; then echo "TryExec="$tryexec >>$GENDESK_DIR$NAMEFILE.desktop list="$list$NAMEFILE\n" else listnt="$listnt$NAMEFILE\n" fi else listnfe="$listnfe$NAMEFILE\n" fi else listnp="$listnp$NAMEFILE\n" fi else echo "desktop no encontrado en el paquete $desktoppackage del desktop $NAMEFILE" >> $LOGFILE fi else echo "packete no subido a ubuntu $desktoppackage falta en el desktop $NAMEFILE " >> $LOGFILE fi popd rm -rf $TMPDIR* done < $DESKDBFILE echo "==================" echo "Desktops processed" echo "==================" echo -e "$list" echo "========================" echo "Desktops without tryexec" echo "========================" echo -e "$listnt" echo "========================" echo "Desktops not found EXEC " echo "========================" echo -e "$listnfe" echo "==================================" echo "Unprocessed desktop (have tryexec) " echo "==================================" echo -e "$listnp" rm -rf $TMPDIR } #MAIN if [ -z "$1" ]; then usage exit 1 fi case $ACTION in "init")init;; "test")test;; "update")update;; "gendesktop")gendesktop;; *);; esac