#!/bin/sh
# rcrsn51 2012-07-14

[ $(id -u) -ne 0 ] && exec gtksu "YASSM" "$0" "$@"

TIMEOUTFILE=$HOME/.config/yassm/samba-search.timeout
[ -f $TIMEOUTFILE ] || echo 1 > $TIMEOUTFILE
TIMEOUT=$(cat $TIMEOUTFILE)

PORT=139

DOSHOW () {
  [ -d $HOME/YASSM ] || mkdir $HOME/YASSM
  rox $HOME/YASSM
}
export -f DOSHOW

DOUMOUNT () {
  for M in $HOME/YASSM/*; do
    umount $M  > /dev/null 2>&1
    rmdir $M > /dev/null 2>&1
  done
  Xdialog --title "YASSM" --infobox "All shares unmounted" 0 0 2000
}
export -f DOUMOUNT

DOHELP () {
  defaultbrowser http://www.murga-linux.com/puppy/viewtopic.php?t=63090 &
}
export -f DOHELP

DOSELECT () {

. $SETFILE     # to get the list of options

SHARE=${LISTPICK%@*}
SERVER=${LISTPICK#*@}

LOGFILE=$YASSMDIR/samba-search.log
if [ -f $LOGFILE ]; then
  Xdialog --title "YASSM" -infobox "Logging ..." 0 0 1000 &
  LOGSERVER=$SERVER
  IP=$(nmblookup $LOGSERVER | tail -n 1 | cut -f 1 -d " ")
  if [ "$IP" = "name_query" ]; then
    IP=$LOGSERVER
    LOGSERVER=$(nmblookup -A $IP | grep "<20>" | tr -d "\t" | cut -d " " -f 1)
  fi
  SUBNET=${IP%.*}".0"
  echo $SHARE","$LOGSERVER"?"$SUBNET >> $LOGFILE
fi

rm $SETFILE
[ "$SHARE" = "hidden" ] && SHARE=""
for F in USER PASSWORD SHARE SERVER OPTIONS; do
  eval V=\$$F 
  if [ -n "$V" ]; then
    echo $F=\"$V\" >> $SETFILE
  else
    echo $F=\"\" >> $SETFILE
  fi
done
  
/usr/local/yassm/samba-login &

}
export -f DOSELECT

######################### End of Functions

YASSMDIR=$HOME/.config/yassm
[ -d $YASSMDIR ] || mkdir -p $YASSMDIR
export YASSMDIR

SETFILE=$YASSMDIR/samba-login.set
[ -f $SETFILE ] || cp /usr/local/yassm/samba-login.set $YASSMDIR
export SETFILE

SUBNETFILE=$YASSMDIR/samba-search.subnets	#to search other subnets

MYSUBNET=$(ifconfig | grep inet | grep -m 1 -v "127.0.0.1" | cut -d ":" -f 2 | cut -d "." -f 1-3)

if [ -z "$MYSUBNET" ]; then 
  Xdialog --title "YASSM" --msgbox "No network detected!" 0 0
  exit
else
  MYSUBNET=$MYSUBNET".0"
fi

Xdialog --title "YASSM" --msgbox "Scanning for shares ..." 0 0 &
MSGPID=$!

SUBNETLIST=$MYSUBNET
[ -f "$SUBNETFILE" ] && SUBNETLIST=${SUBNETLIST}" "$(cat $SUBNETFILE)

IPLIST=""
for SUBNET in $SUBNETLIST; do
  PREFIX=${SUBNET%.*}
  IPLIST=${IPLIST}" "$(mpscan -t $TIMEOUT -p $PORT ${PREFIX}.1 - ${PREFIX}.254 | cut -d " " -f 2)
done

SHARELIST=""
for ONEIP in $IPLIST; do
  if [ "${ONEIP%.*}" = "${MYSUBNET%.*}" ]; then
    ONESERVER=$(nmblookup -A $ONEIP | grep "<20>" | tr -d "\t" | cut -d " " -f 1)
  else
    ONESERVER=$ONEIP
  fi
  SHARES=$(smbclient -gNL $ONEIP 2> /dev/null | grep "Disk" | grep -v "$." | cut -d "|" -f 2 | tr -s " " ".")
  if [ -z "$SHARES" ]; then
    SHARELIST=${SHARELIST}" ""hidden@"${ONESERVER}
  else
    for ONESHARE in $SHARES; do
      SHARELIST=${SHARELIST}" "${ONESHARE}"@"${ONESERVER}
    done
  fi
done

kill $MSGPID

LISTITEMS=""
for I in $SHARELIST; do
  LISTITEMS=$LISTITEMS"<item>"$I"</item>"
done

export DIALOG="
<window title=\"YASSM v2.5\" icon-name=\"gtk-connect\">
<vbox>
  <frame Shares>
    <hbox>
     <combobox>
       <variable>LISTPICK</variable>
       $LISTITEMS
     </combobox>
     <button>
       <label>Select</label>
       <action>DOSELECT</action>
     </button>
     <button><label>Quit</label></button>
    </hbox>
  </frame>
  <hbox>
     <button>
       <label>Help</label>
       <action>DOHELP</action>
     </button>
     <text><label>\"  \"</label></text>
     <button>
       <label>Wake</label>
     </button>
     <button>
       <label>Rescan</label>
     </button>
     <button>
       <label>Unmount</label>
       <action>DOUMOUNT</action>
     </button>
     <button>
       <label>Show</label>
       <action>DOSHOW</action>
     </button>
  </hbox>
</vbox>
</window>
"

I=$IFS; IFS=""
for STATEMENTS in  $(gtkdialog3 -c --program DIALOG); do
  eval $STATEMENTS
done
IFS=$I

[ "$EXIT" = "Rescan" ] && exec $0

if [ "$EXIT" = "Wake" ]; then
  Xdialog --title "YASSM" --msgbox "Waking the network ..." 0 0 &
  MSGPID=$!
  sleep 1
  PREFIX=${MYSUBNET%.*}
  for IP in {1..254}; do
    mpscan -t $TIMEOUT -p $PORT ${PREFIX}.$IP > /dev/null 2>&1 &
  done
  sleep 3
  kill $MSGPID
  exec $0
fi
