#!/bin/bash
#rcrsn51 2012-08-10

export TEXTDOMAIN=peasyport
export OUTPUT_CHARSET=UTF-8

DOHELP () {
Xdialog --title "PeasyPort" --msgbox "$(gettext 'Enter the IP and Port as single values or as ranges.\neg.  IP  192.168.2.10-254   Port  1-1024\nYou cannot scan an IP range and a Port range at the same time.\nBut you can enter a list of ports using commas or spaces.\neg.  Port  21,23 80 139\nThe Names button finds the NETBIOS names of machines\nthat are sharing files.\nUse Turbo mode to scan large port ranges (1-65535) of\nfast devices like other Linux computers.')" 0 0
}
export -f DOHELP

DOSPEED () {

. $SPEEDFILE

TRD=false;TFD=false;TSD=false
case $TIMEOUT in
  1000) TRD=true;;
  100)  TFD=true;;
  2000) TSD=true;;
esac

SRD=false;SFD=false;SSD=false
case $SCANWAIT in
  3) SRD=true;;
  1) SFD=true;;
  4) SSD=true;;
esac

EPD=false;EMD=false
case $ENGINE in
  pnscan) EPD=true;;
  mpscan) EMD=true;;
esac

export SPEEDDIALOG="
<window title=\"PeasyPort\">
<vbox>
  <frame $(gettext 'Network device speeds')>
    <hbox>
      <radiobutton>
        <label>$(gettext 'Regular')</label>
        <default>$TRD</default>
        <variable>TR</variable>
      </radiobutton>
      <radiobutton> 
        <label>$(gettext 'Fast')</label>
        <default>$TFD</default>
        <variable>TF</variable>
      </radiobutton>
      <radiobutton> 
        <label>$(gettext 'Slow')</label>
        <default>$TSD</default>
        <variable>TS</variable>
      </radiobutton>
    </hbox>
  </frame>
  <frame $(gettext 'Your computer speed')>
    <hbox>
      <radiobutton>
        <label>$(gettext 'Regular')</label>
        <default>$SRD</default>
        <variable>SR</variable>
      </radiobutton>
      <radiobutton> 
        <label>$(gettext 'Fast')</label>
        <default>$SFD</default>
        <variable>SF</variable>
      </radiobutton>
      <radiobutton> 
        <label>$(gettext 'Slow')</label>
        <default>$SSD</default>
        <variable>SS</variable>
      </radiobutton>
    </hbox>
  </frame>
  <frame $(gettext 'Scanning Engine')>
    <hbox>
      <radiobutton>
        <label>$(gettext 'Regular')</label>
        <default>$EPD</default>
        <variable>EP</variable>
      </radiobutton>
      <radiobutton> 
        <label>$(gettext 'Turbo')</label>
        <default>$EMD</default>
        <variable>EM</variable>
      </radiobutton>
      <text><label>\"           \"</label></text>
    </hbox>
  </frame>
  <hbox>
    <button><label>$(gettext 'OK')</label></button>
    <button><label>$(gettext 'Cancel')</label></button>
  </hbox>
</vbox>
</window>"

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

[ "$EXIT" = "$(gettext 'Cancel')" -o "$EXIT" = "abort" ] && exit

echo -n "TIMEOUT=" > $SPEEDFILE
[ "$TR" = "true" ] && echo 1000 >> $SPEEDFILE
[ "$TF" = "true" ] && echo 100 >> $SPEEDFILE
[ "$TS" = "true" ] && echo 2000 >> $SPEEDFILE
echo -n "SCANWAIT=" >> $SPEEDFILE
[ "$SR" = "true" ] && echo 3 >> $SPEEDFILE
[ "$SF" = "true" ] && echo 1 >> $SPEEDFILE
[ "$SS" = "true" ] && echo 4 >> $SPEEDFILE
echo -n "ENGINE=" >> $SPEEDFILE
[ "$EP" = "true" ] && echo pnscan >> $SPEEDFILE
[ "$EM" = "true" ] && echo mpscan >> $SPEEDFILE
}
export -f DOSPEED

DOSCAN () {

if [ -z "$IPS" -o -z "$PORTS" ]; then
  Xdialog --title " " --msgbox "$(gettext 'Enter an IP and a Port!')" 0 0
  exit
fi

IPRANGE=$(echo $IPS | grep "-")
PORTRANGE=$(echo $PORTS | grep "-")

if [ -n "$IPRANGE" -a -n "$PORTRANGE" ]; then
  Xdialog --title " " --msgbox "$(gettext 'You cannot scan an IP range and a\nPort range at the same time!')" 0 0
  exit
elif [ -n "$PORTRANGE" ]; then
  DOPORTSCAN
else
  DOIPSCAN
fi

}
export -f DOSCAN

DOPORTSCAN (){

. $SPEEDFILE
case $ENGINE in
  pnscan) DOPNSCAN;;
  mpscan) DOMPSCAN;;
esac
}
export -f DOPORTSCAN


DOPNSCAN (){

. $SPEEDFILE
rm -f /tmp/peasyport.txt

ONEIP=$(echo $IPS | tr -d " ")
PORTS=$(echo $PORTS | tr -d " ")
FIRSTPORT=$(echo $PORTS | cut -d "-" -f 1)
LASTPORT=$(echo $PORTS | cut -d "-" -f 2)

let RANGE=LASTPORT-FIRSTPORT
if [ "$RANGE" -gt 10000 ]; then
  Xdialog --title " " --msgbox "$(gettext 'Pick a smaller port range\nor switch to Turbo mode!')" 0 0
  exit
fi

Xdialog --no-buttons --title " " --infobox "$(gettext 'Scanning ...')" 0 0 120000 &
MSGPID=$!

for ((P=$FIRSTPORT;P<=$LASTPORT;++P)); do
  pnscan -t $TIMEOUT -v $ONEIP $P >> /tmp/peasyport.txt 2>&1 &
done

sleep $SCANWAIT
kill $MSGPID

grep -v -E "refused|connect|route" /tmp/peasyport.txt | tr -s " " | cut -d " " -f 1-3 | sort -k3,3n | Xdialog --no-buttons --title "PeasyPort" --textbox - 15 30

}
export -f DOPNSCAN

DOMPSCAN (){

ONEIP=$(echo $IPS | tr -d " ")
PORTS=$(echo $PORTS | tr -d " ")
FIRSTPORT=$(echo $PORTS | cut -d "-" -f 1)
LASTPORT=$(echo $PORTS | cut -d "-" -f 2)

Xdialog --no-buttons --title " " --infobox "$(gettext 'Scanning ...')" 0 0 120000 &
MSGPID=$!
mpscan -p $FIRSTPORT -e $LASTPORT $ONEIP > /tmp/peasyport.txt
kill $MSGPID

cut -d " " -f 2,3 /tmp/peasyport.txt | sort -k 2,2n | sed 's/ / : /' | Xdialog --no-buttons --title "PeasyPort" --textbox - 15 30

}
export -f DOMPSCAN

DOIPSCAN () {

. $SPEEDFILE
rm -f /tmp/peasyport.txt

IPS=$(echo $IPS | tr -d " ")
FIRSTIP=$(echo $IPS | cut -d "-" -f 1)
LASTIP=$(echo $IPS | cut -d "-" -f 2)
if [ "$LASTIP" = "$FIRSTIP" ]; then
  LASTIP=""
else
  LASTIP=${FIRSTIP%.*}"."$LASTIP
fi

Xdialog --no-buttons --title " " --infobox "$(gettext 'Scanning ...')" 0 0 120000 &
MSGPID=$!

PORTS=$(echo $PORTS | tr "," " ")
for ONEPORT in $PORTS; do
  LINE="pnscan -t $TIMEOUT -v "$FIRSTIP
  [ -n "$LASTIP" ] && LINE=$LINE":"$LASTIP
  LINE=$LINE" "$ONEPORT
  $LINE >> /tmp/peasyport.txt 2>&1
done

kill $MSGPID

grep -v -E "refused|connect|route" /tmp/peasyport.txt | tr -s " " | cut -d " " -f 1-3 | sort -k1,1 -k3,3n | Xdialog --no-buttons --title "PeasyPort" --textbox - 15 30

}
export -f DOIPSCAN

DONAMES () {

. $SPEEDFILE

if [ -z "$IPS" ]; then
  Xdialog --title " " --msgbox "$(gettext 'Enter an IP!')" 0 0
  exit
fi

IPS=$(echo $IPS | tr -d " ")
FIRSTIP=$(echo $IPS | cut -d "-" -f 1)
LASTIP=$(echo $IPS | cut -d "-" -f 2)
if [ "$LASTIP" = "$FIRSTIP" ]; then
  LASTIP=""
else
  LASTIP=${FIRSTIP%.*}"."$LASTIP
fi

LINE="pnscan -t $TIMEOUT -v "$FIRSTIP
[ -n "$LASTIP" ] && LINE=$LINE":"$LASTIP
LINE=$LINE" 139"

Xdialog --no-buttons --title " " --infobox "$(gettext 'Scanning Port 139 ...')" 0 0 120000 &
MSGPID=$!
$LINE > /tmp/peasyport.txt 2>&1

IPLIST=$(grep -v -E "refused|connect|route" /tmp/peasyport.txt | tr -s " " | cut -d " " -f 1)

rm -f /tmp/peasyport.txt

for IP in $IPLIST; do
  SERVER=$(nmblookup -A $IP | grep "<20>" | tr -d "\t" | cut -d " " -f 1)
  echo $IP " : " $SERVER  >> /tmp/peasyport.txt
done

kill $MSGPID

sort -k1,1 /tmp/peasyport.txt | Xdialog --no-buttons --title "PeasyPort" --textbox - 20 45

}
export -f DONAMES

############################ End of functions

export SPEEDFILE=$HOME/.peasyport
if [ ! -f $SPEEDFILE ]; then
  echo TIMEOUT=1000 > $SPEEDFILE
  echo SCANWAIT=3 >> $SPEEDFILE
  echo ENGINE=pnscan >> $SPEEDFILE
fi

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

export DIALOG="
<window width-request=\"350\" title=\"PeasyPort v1.9\">
  <vbox>
    <frame>
      <hbox>
        <text><label>$(gettext 'IP')</label></text>
        <entry>
          <variable>IPS</variable>
          <default>$MYSUBNET</default>
        </entry>
        <text><label>$(gettext 'Port')</label></text>
        <entry><variable>PORTS</variable></entry>
      </hbox>
    </frame>
    <hbox>
      <button>
        <label>$(gettext 'Help')</label>
        <action>DOHELP &</action>
      </button>
      <text><label>\"   \"</label></text>
      <button>
        <label>$(gettext 'Speed')</label>
        <action>DOSPEED &</action>
      </button>
      <button>
        <label>$(gettext 'Names')</label>
        <action>DONAMES &</action>
      </button>
      <button>
        <label>$(gettext 'Scan')</label>
        <action>DOSCAN &</action>
      </button>
      <button><label>$(gettext 'Quit')</label></button>
    </hbox>
  </vbox>
</window>"

gtkdialog3 -p DIALOG -G -1x-1+600+300

killall mpscan 2> /dev/null  # pnscan too hard to kill
