#!/bin/sh # Frank Schlaefendorf # erstellt am 12.02.2005 # letzte Aenderung am 27.02.2005 # # nach welchen proxports soll gesucht werden? PORTLISTE="3128,8080" # wieviele sekunden soll maximal auf eine webseite gewartet werden? ZEITGRENZE=15 # wo befindet sich die proxydatenbank? PROXYDB="/etc/proxydb" # mit welcher url soll der internettest durchgefuehrt werden? TESTURL="http://www.schlaefendorf.de/datum.php4?zufall=$$" # ist die dateigroesse der testseite bekannt? wenn ja, geben sie die # groesse in bytes ein, damit die seite genau identifiziert werden kann # und nicht faelschlicher weise statusseite des proxys als antwort # gewertet werden. # wenn die groesse unbekannt ist, leer lassen # die datumantwort besteht immer aus 15 bytes TESTURLLEN=15 # wo soll die testseite abgelegt werden TESTSEITE="/tmp/testseite" # systemproxy eintrag SYSTEMPROXY="/etc/HTTP-PROXY" # DEVICE=$1 # vordefinierte werte FOUNDPROXYADDR="" FOUNDPROXYTIME=3600 IPADDR="" BROADCAST="" NETMASK="" NETADDR="" HWADDR="" HOSTNAME="" DOMAIN="" NETMASK2="" # die netzmaske wird von der schreibweise ***.***.***.*** # in die Notation /XX umgewandelt conv_netmask(){ NETMASKE=0 for nummer in `echo $1 | tr '.' ' '` do for wert in 128 64 32 16 8 4 2 1 do if [ "$nummer" -ge "$wert" ]; then let "NETMASKE=NETMASKE+1" let "nummer=nummer-wert" else break fi done if [ "$nummer" -ne "0" ]; then NETMASKE="" break fi done return $NETMASKE } # die proxydatenliste wird neu sortiert proxydb_reorganisieren(){ # existiert die proxydatenbank? if [ -e ${PROXYDB} ]; then sort -d -u -f +0 -7 ${PROXYDB} -o ${PROXYDB}.tmp mv ${PROXYDB}.tmp ${PROXYDB} fi } # testet die erreichbarkeit der seite $2 ueber den proxy $1 url_test(){ http_proxy=$1 TESTURL=$2 TIMEFILE=${TESTSEITE}.time # proxy in die lynx umgebungsvariable eintragen export http_proxy # eventuell vorhandene testseite loeschen if [ -e ${TESTSEITE} ]; then rm ${TESTSEITE} fi # eventuell vorhandenen zeitstempel loeschen if [ -e ${TESTSEITE}.time ]; then rm ${TESTSEITE}.time fi # seite laden und notwendige zeit messen # lynx starten und in den hintergrund schicken # die testseite steht in $TESTSEITE und die zugriffszeiten in $TIMEFILE (time lynx -source ${TESTURL} 2> /dev/null 1> ${TESTSEITE}) 2> ${TIMEFILE} 1> /dev/null & ZEITGEBER=$ZEITGRENZE TIME="" # zeitgeber bis 0 herunterzaehlen while [ "$ZEITGEBER" -gt 0 ] do let "ZEITGEBER=ZEITGEBER-1" # ist lynx fertig? if [ -s ${TIMEFILE} ]; then sleep 1 # zeit auslesen TIME=`cat ${TIMEFILE}` rm ${TIMEFILE} break else sleep 1 fi done # hat die testseite mindestens ein zeichen und wurde eine antwortzeit gemessen? if [ -s ${TESTSEITE} -a "$TIME" != "" ]; then ACCEPT=1 if [ "$TESTURLLEN" != "" ]; then if [ "$( ls -l ${TESTSEITE} | cut -c40-42 )" != " ${TESTURLLEN}" ]; then ACCEPT=0 fi fi if [ "$ACCEPT" == "1" ]; then # realzeit auslesen TIME=`echo $TIME | egrep -o -e "real [0-9]{0,2}[h]{0,1}[0-9]{0,2}[m]{0,1}[0-9]{1,2}\.[0-9]{1,4}s" ` # die einzelnen zeitangaben auslesen und in millisekunden umrechnen STUNDEN=`echo $TIME | egrep -o -e "[0-9]{1,2}[h]{1}"` if [ "$STUNDEN" == "" ]; then STUNDEN=0 else STUNDEN=`echo $STUNDEN | cut -dh -f1` fi MINUTEN=`echo $TIME | egrep -o -e "[0-9]{1,2}[m]{1}"` if [ "$MINUTEN" == "" ]; then MINUTEN=0 else MINUTEN=`echo $MINUTEN | cut -dm -f1` fi VSEKUNDEN=`echo $TIME | egrep -o -e "[0-9]{1,2}\.[0-9]{1,4}s" | cut -ds -f1` if [ "$VSEKUNDEN" == "" ]; then SEKUNDEN=0 MSEKUNDEN=0 else SEKUNDEN=`echo $VSEKUNDEN | cut -d. -f1` MSEKUNDEN=`echo $VSEKUNDEN | cut -d. -f2` fi # echo "${STUNDEN}h ${MINUTEN}m ${SEKUNDEN}s ${MSEKUNDEN}ms" let "ZEIT=STUNDEN*3600+MINUTEN*60+SEKUNDEN" if [ "$ZEIT" != "0" ]; then ZEIT="${ZEIT}${MSEKUNDEN}" else ZEIT=${MSEKUNDEN} fi else ZEIT="" fi else # lynx hat wahrscheinlich keinen kontakt und laeuft noch # killen des hintergrundprozesses lynx, falls dieser sich nicht beendet hat # eventuell anderes kommando !!!!! kill -9 %1 # zeit=="" -> kein kontakt ZEIT="" fi # ZEIT enthaelt die ladezeit von lynx in millisekunden echo $ZEIT } #ermittelt die netzwrkdaten des devices scanne_device(){ DEVICE=$1 if [ "$DEVICE" != "" ]; then IFCONFIG=`ifconfig $DEVICE 2> /dev/null ` if [ "$?" == "0" ]; then # das device ist initialisiert IPADDR=`echo $IFCONFIG | egrep -o -e "inet addr:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" | cut -d: -f2` if [ "$IPADDR" != "" ];then BROADCAST=`echo $IFCONFIG | egrep -o -e "Bcast:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" | cut -d: -f2` NETMASK=`echo $IFCONFIG | egrep -o -e "Mask:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" |cut -d: -f2` HWADDR=`echo $IFCONFIG | egrep -o -e "HWaddr [0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}" | cut -d' ' -f2 ` NETADDR=`/bin/ipmask $NETMASK $IPADDR | cut -d ' ' -f2 ` HOSTNAME=`host -W3 ${IPADDR} | cut -d' ' -f5` DOMAIN=`echo $HOSTNAME | cut -s -d. -f2-` if [ "$DOMAIN" == "" ]; then DOMAIN=none fi conv_netmask $NETMASK NETMASK2=$? return 0 else return 1 fi else # das device existiert nicht IPADDR="" BROADCAST="" NETMASK="" HWADDR="" NETADDR="" HOSTNAME="" DOMAIN="" NETMASK2="" return 1 fi else return 2 fi } # ueber das device wird ein verfuegbarer http proxy gesucht suche_proxy(){ if [ "$IPADDR" != "" ]; then FOUNDPROXYADDR="" FOUNDPROXYTIME=3600 echo "Es werden am Device $DEVICE die Ports ${PORTLISTE} gescannt." HOSTLISTE=`nmap -sS -p T:${PORTLISTE} -n -e $DEVICE ${NETADDR}/${NETMASK2} | tr ' ' '_'` # echo $HOSTLISTE HOST="" PROXYLISTE="" #einlesen der hostliste von nmap for eintrag in $HOSTLISTE do # echo $eintrag # suche nach einer zeile Interesting_ports_on_IP HOSTIP=`echo $eintrag | egrep -o -e "Interesting_ports_on_[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}:"` if [ "$HOSTIP" != "" ]; then # eintragen der ip des hostes in FOUNDHOSTIP FOUNDHOSTIP=`echo $HOSTIP | egrep -o -e "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}:"` echo "Der Host $FOUNDHOSTIP ist aktiv" else # enthaelt die folgezeile einen tcp open eintrag? PORTZEILE=`echo $eintrag | egrep -o -e "[0-9]{1,6}/tcp_open[_]{1,5}[0-9a-zA-Z\-]{1,10}"` if [ "$PORTZEILE" != "" ]; then # auslesen der portnummer PORT=`echo $PORTZEILE | cut -d/ -f1 ` # auslesen des portnamen NAME=`echo $PORTZEILE | cut -d_ -f4 ` ZEIT=`url_test "http://${FOUNDHOSTIP}${PORT}" $TESTURL` if [ "$ZEIT" != "" ]; then echo " Es wird der Proxyservice $NAME mit einer Antwortzeit von ${ZEIT}ms angeboten" # eintrag des Rechners in die proxydatenbank echo "${HWADDR} ${DOMAIN} ${NETMASK} ${NETADDR} ${NETMASK2} ${IPADDR} ${FOUNDHOSTIP}$PORT ${NAME} ${ZEIT} " >> ${PROXYDB} if [ "$ZEIT" -lt "$FOUNDPROXYTIME" ]; then FOUNDPROXYADDR=${FOUNDHOSTIP}${PORT} FOUNDPROXYTIME=$ZEIT fi else echo " Es wird der Proxyservice $NAME mit zu grosser Antwortzeit angeboten" fi rm ${TESTSEITE} fi fi done proxydb_reorganisieren return 0 else return 1 fi } suche_proxy_in_db(){ # wurde das device schon gescannt? if [ "$IPADDR" != "" ]; then ZEIT="" # verfuegbare proxylisteneintraege auslesen if [ -e $PROXYDB ]; then LISTE=`cat $PROXYDB | grep "${HWADDR} ${DOMAIN} ${NETMASK} ${NETADDR} " | sort +8n | tr ' ' ';'` # echo $LISTE for eintrag in ${LISTE} do # echo "eintrag=${eintrag}" # proxyadresse heraustrennen PROXY=`echo $eintrag | cut -d';' -f7` # echo "proxy=${PROXY}" # proxykontakt testen ZEIT=`url_test "http://${PROXY}" $TESTURL 2> /dev/null` # konnte die testurl gelesen werden? if [ "$ZEIT" != "" ]; then # echo "KONTAKT OK" FOUNDPROXYADDR=$PROXY FOUNDPROXYTIME=$ZEIT break fi done if [ "$ZEIT" != "" ]; then # es wurde ein passender proxy in der db gefunden return 0 else # es wurde kein passender proxy in der db gefunden return 2 fi else # es exitiert noch keine datenbank return 3 fi else # das device wurde noch nicht gescannt return 1 fi } # eintragen des proxys in die systemdatei save_proxy(){ echo "${FOUNDPROXYADDR} ${FOUNDPROXYTIME}" echo "http://${FOUNDPROXYADDR}" > ${SYSTEMPROXY} } echo "Scanne Device $DEVICE" scanne_device $DEVICE case $? in 0) ZEIT=`url_test "$http_proxy" $TESTURL` ZEIT="" if [ "$ZEIT" != "" ]; then echo "Die aktuelle Proxyeinstellung ist ausreichend." echo "Die Testseite $TESTURL wurde in ${ZEIT}ms geladen" else echo "IP=${IPADDR}/${NETMASK}" echo "IP=${IPADDR}/${NETMASK2}" echo "BROADCAST=${BROADCAST}" echo "NETZADRESSE=${NETADDR}" echo "HWADRESSE=${HWADDR}" echo "HOSTNAME=${HOSTNAME}" echo "DOMAIN=${DOMAIN}" echo "Suche in der Datenbank nach einem passenden Proxy" suche_proxy_in_db case $? in 0) echo "Treffer" save_proxy exit 0 ;; 1) echo "Das Device $DEVICE ist nicht aktiv" exit 2 ;; 2) echo "Die Datenbank enthaelt keinen passenden Eintrag" echo "Scanne das Netz" suche_proxy case $? in 0) echo -n "Treffer" save_proxy exit 0 ;; *) echo "Es wurde leider kein Proxyzugang gefunden!" exit 3 ;; esac ;; 3) echo "Es existiert keine Proxydatenbank" echo "Scanne das Netz" suche_proxy case $? in 0) echo -n "Treffer" save_proxy exit 0 ;; *) echo "Es wurde leider kein Proxyzugang gefunden!" exit 3 ;; esac ;; esac fi ;; 1) echo "Das Device $DEVICE ist nicht aktiv" exit 1 ;; 2) echo "Sie haben kein Device angegeben" exit 2 ;; esac # returncodes # 0 proxy gefunden und eingetragen # 1 das device ist nicht aktiv # 2 es wurde kein device angegeben # 3 kein proxy gefunden