Useful Scripts

From DD-WRT Wiki

(Difference between revisions)
Jump to: navigation, search
Revision as of 18:48, 6 February 2007 (edit)
Tin-man (Talk | contribs)
m (Speak Your Signal Strength)
← Previous diff
Revision as of 02:50, 15 February 2007 (edit) (undo)
Whiteboy (Talk | contribs)
(Links)
Next diff →
Line 435: Line 435:
Now I just run this script and turn up the volume on my computer when I need to move the antenna. Now I just run this script and turn up the volume on my computer when I need to move the antenna.
-=Links=+=See also=
[[Startup Scripts]]<br> [[Startup Scripts]]<br>
[[Script Examples]] [[Script Examples]]
-[[Category:basic HOWTO]] 
[[Category:English documentation]] [[Category:English documentation]]
 +[[Category:Tutorials]]

Revision as of 02:50, 15 February 2007

This page is intended to house useful scripts that help monitor or enhance the features of your DD-WRT capable router.

Contents

Startup Scripts

See Startup Scripts instructions on how to configure and save startup scripts.

Modifying PATH at Startup

This will add whatever paths you want for PATH and LD_LIBRARY_PATH before the default system path. Change the paths to whatever you like. Have a good reason for doing this, it should be considered a hack until the feature is implemented permanently.

rm -f /tmp/newProfile
head -n1 /etc/profile | sed s!=!=/mmc/bin:/whatever/bin:! >> /tmp/newProfile
tail -n1 /etc/profile | sed s!=!=/mmc/lib:/whatever/lib:! >> /tmp/newProfile
mount --bind /tmp/newProfile /etc/profile

If you're adding /mmc/lib before the system library, in some circumstances you'll also need to do this on startup (after ensuring that the ldconfig on /mmc is up to date and happy):

mount --bind /mmc/etc/ld.so.conf /etc/ld.so.conf
mount --bind /mmc/etc/ld.so.cache /etc/ld.so.cache

Note: Only do this if you're recieving Segmentation Faults or your applications are failing to run, and even then only if you feel that this hack is imperitive. Also note that if you're attempting this with Optware, the files are ld-opt.so.conf and ld-opt.so.cache

Make sure you're familiar with what you're doing before attempting this, if you end up seeing a lot of 'Segmentation fault' when running things like ls, cat, cp, etc, than you'll want to either adjust the above commands, or else put those things into a script and run them manually when you enter your shell.

LED Scripts

The example LED scripts below are written using the GPIO info for the Linksys WRT. Remember to change them for whatever router you have.

GPIO Info for Linksys WRT

Pin	Direction	Name		Use
GPIO 0	Output		WLAN LED	(LED - Wireless)
GPIO 1	Output		POWER LED	(LED - Power)
GPIO 2	Output		ADM_EECS 	(LED - White, Cisco Button V3.0+)
GPIO 3	Output		ADM_EESK 	(LED - Amber, Cisco Button V3.0+)
GPIO 4	Input		ADM_EEDO 	(Button - Cisco Button V3.0+)
GPIO 5	Output		ADM_EEDI 	(Unknown) Seems to cycle all LED colors disabled.
GPIO 6	Input		RESET		(Button - Reset Button)
GPIO 7	Output		DMZ LED		(LED - DMZ)

GPIO Info for Linksys WRTSL54GS

This is for the WRTSL54GS model only.

Pin     Direction       Name            Use
GPIO 5  OUTPUT          SES LED         (Cisco White LED)
GPIO 7  OUTPUT          SES LED         (Cisco AMBER LED)

GPIO Info for Buffalo WHR

Pin	Direction	Use
GPIO 0	Input		AOSS Button
GPIO 1	Output		Bridge LED
GPIO 2	Output		WLAN LED
GPIO 3	Output		Extra LED between bridge and WLAN
GPIO 4	Input		Reset Button
GPIO 5	Input		Bridge/Auto Switch
GPIO 6	Output		AOSS LED
GPIO 7	Output		DIAG LED
GPIO 8	n/a		Unkown/None
GPIO 9	Output		Power LED

Display Load via LED (load.sh)

  • Uses front button LED to display current load on router.
#!/bin/sh
gpio="gpio"

amber=3
white=2

delay=3

meltdown=400
overload=100
highload=70
medload=30

while sleep $delay
do
   set -- $(cat /proc/loadavg)
   load="${1%.*}${1#*.}"

   if [ $load -gt $meltdown ]
   then
       $gpio disable $amber
       usleep 50000
       $gpio disable $white
       usleep 50000
       reboot
   elif [ $load -gt $overload ]
   then
      $gpio disable $amber
      usleep 50000
   elif [ $load -gt $highload ]
   then
      $gpio disable $amber
      usleep 12500
      $gpio enable $amber
      usleep 12500
      $gpio disable $amber
      usleep 12500
      $gpio enable $amber
      usleep 12500
      $gpio disable $amber
      usleep 12500
      $gpio enable $amber
      usleep 12500
   elif [ $load -gt $medload ]
   then
      $gpio enable $amber
      $gpio disable $white
      usleep 25000
      $gpio enable $white
      usleep 25000
      $gpio disable $white
      usleep 25000
      $gpio enable $white
      usleep 25000
   else
      $gpio disable $white
      usleep 50000
      $gpio enable $white
      usleep 50000
   fi
done

WLAN Status (wlan.sh)

  • Uses front button LED to show WLAN state. Amber LED indicates one or more associated clients, white LED flashes when data is sent over WLAN.
#!/bin/sh
I=`nvram get wl0_ifname`

while sleep 1; do
  if [ "`wl assoclist`" != "" ]; then
    XFER=`ifconfig $I|grep bytes`
    if [ "$XFER" != "$PXFER" ]; then
      LED='gpio disable 3 ; gpio disable 2'
      PXFER=$XFER
    else
      LED='gpio disable 3 ; gpio enable 2'
    fi
  else
    LED='gpio enable 3 ; gpio enable 2'
  fi
  
  if [ "$LED" != "$PLED" ]; then
    eval $LED
    PLED=$LED
  fi
done

WLAN Status (wlan.sh) - Buffalo Routers

  • AOSS led to show WLAN is associated with clients.
  • Bridge led flashes when data is transmitted over WLAN.
#!/bin/sh
I=`nvram get wl0_ifname`

while sleep 1; do
  if [ "`wl assoclist`" != "" ]; then
    XFER=`ifconfig $I|grep bytes`
    if [ "$XFER" != "$PXFER" ]; then
      LED='gpio disable 1 ; gpio enable 1 ; gpio disable 6'
      PXFER=$XFER
    else
      LED='gpio disable 6'
    fi
  else
    LED='gpio enable 6'
  fi

  if [ "$LED" != "$PLED" ]; then
    eval $LED
    PLED=$LED
  fi
done

Misc Scripts

Auto Random MAC Address

  • will change your eth1 MAC address to a random address, then will apply it to the system and restart the interfaces.
#!/bin/ash
MAC=`(date; cat /proc/interrupts) | md5sum | sed -r 's/^(.{10}).*$/\1/; s/([0-9a-f]{2})/\1:/g; s/:$//;'`
echo "00:${MAC}"
ifconfig eth1 hw ether 00:${MAC}
nvram set def_hwaddr="00:${MAC}"
nvram set wan_hwaddr="00:${MAC}"
stopservice wan
startservice wan
  • Created by Exiles.

SSH User Display (ssh_users.sh)

  • Displays when someone is connected using SSH.

Remove lines starting with '# ' (hash + blank).

#!/bin/sh 

led=2
interval=5 


on=0
/sbin/gpio enable $led 

while sleep $interval 
do 
# Make sure we get local port 22 and not any port starting with 22:
   users=$(/bin/netstat -n | /usr/bin/awk '$4~/:22$/ {++x}; END {print x+0}')
   if [ $users -gt 0 ]; then 
      if [ $on -eq 0 ]; then 
          /sbin/gpio disable $led
          on=1 
      fi 
   else 
      if [ $on -eq 1 ]; then 
          /sbin/gpio enable $led
          on=0 
      fi 
   fi 
done

Wireless Network Scanner (scan.sh)

BEGIN{
command = "wl scan 2> /dev/null ; wl scanresults 2> /dev/null";
red = "\x1b[31m"; green = "\x1b[32m";
greenback="\x1b[42m"; yellow = "\x1b[33m";
cyan = "\x1b[36m"; blue = "\x1b[34m";
blueback = "\x1b[44m"; white = "\x1b[37m";
whiteback = "\x1b[47m"; reset = "\x1b[0m";
underscore = "\x1b[4m"; clear = "\x1b[2J";
home = "\x1b[0;0H"; erase2end = "\x1b[K";
cName = white; cSignal = green;
cNoise = red; cCaps = green;
cStrengthLow = blue blueback; cChannel = green; 
cStrengthMed = white whiteback;
cStrengthHi = green greenback;
cStrengthAged = red;

print clear;
for(;;)
{
while (command|getline)
{
if(/^SSID/) {cn = $2; name[cn] = cn; rssi[cn] = $6;noise[cn]= $9}
if(/^Mode/) {rssi[cn] = $4;noise[cn]= $7; channel[cn] = $10 }
if(/^BSSID/) {caps[cn] = $4" "$5" "$6" "$7" "$8" "$9" "$10 }
}
close(command)
printf home;
ln = 0;
print white " Name Signal Noise Channel Type";
for (x in name)
{
sigstrength = ((rssi[x] - noise[x])*1.5) + ((rssi[x] +90)*1.5);
if (sigstrength 4) cStrength = cStrengthMed;
if(sigstrength>7) cStrength = cStrengthHi;
if(age[x]=0) cStrength = cStrengthAged;

fmt = "%s%-15s %s%0"sigstrength"d "reset erase2end "\n %s%-4d %s%-4d %s%-4d %s%2s %s%10s " reset erase2end "\n" erase2end "\n";
printf fmt, cName,name[x],cStrength,0,cSignal,rssi[x],cNoise,noise[x],cChannel, channel[x],cCaps,caps[x]; 
rssi[x] = -100;
ln++;
} 
print erase2end;
}
}

Name based WOL (wake.sh)

  • Enables you to power on a LAN computer by name instead of IP address/MAC, based on DHCP lease table (mandatory).
    Usage: /path/to/wake.sh <hostname>
    (Default hostname is desktop)
STATION=mm
WOL=/usr/sbin/wol
STATICS=/tmp/udhcpd.statics
DEV=br0

if [ -n  "$1" ]; then
   STATION=$1
fi

while read LINE
do
   IP=`echo $LINE | awk '{print $1}'`
   MAC=`echo $LINE | awk '{print $2}'`
   FOUND=`ip neigh | grep "$IP.*REACHABLE"`
   if [ -z "$FOUND" ]; then
      echo Creating ARP entry for $IP $MAC
      ip neigh add $IP lladdr $MAC dev $DEV nud reachable 2> /dev/null
      ip neigh change $IP lladdr $MAC dev $DEV nud reachable 2> /dev/null
   fi
done < $STATICS


LEASE=`cat $STATICS | grep "\b$STATION\b$"`
if [ -n "$LEASE" ]; then
   IP=`echo $LEASE | awk '{print $1}'`
   MAC=`echo $LEASE | awk '{print $2}'`
   $WOL -i $IP $MAC
else
   echo Unable to find \"$STATION\" in DHCP static file $STATICS, please use \"$0 \<hostname\>\"
fi

Automatic Connection Repair (always_on.sh)

  • Pings your default gateway every time and force a DHCP renew if no packets are received.
    Usage: /path/to/always_on.sh &
#!/bin/sh
INTERVAL=10
PACKETS=1
UDHCPC="udhcpc -i vlan1 -p /var/run/udhcpc.pid -s /tmp/udhcpc"
IFACE=vlan1


ME=`basename $0`
RUNNING=`ps | grep $ME | wc -l`
if [ "$RUNNING" -gt 3 ]; then
   echo "Another instance of \"$ME\" is running"
   exit
fi

while sleep $INTERVAL
do
   TARGET=`ip route | awk '/default via/ {print $3}'`
   RET=`ping -c $PACKETS $TARGET 2> /dev/null | awk '/packets received/ {print $4}'`

   if [ "$RET" -ne "$PACKETS" ]; then
      echo Ping failed, releasing IP address: $IFACE
	#send a RELEASE signal
      kill -USR2 `cat /var/run/udhcpc.pid` 2> /dev/null
	#ensure udhcpc is not running
      killall udhcpc 2> /dev/null
      echo Renewing IP address: $IFACE
      $UDHCPC
      echo Waiting 10 s ...
      sleep 10
   else
      echo Network is up via $TARGET
   fi
done

Modifying PATH Manually (path.sh)

  • Enables adjustment of paths on a per-use basis (i.e. When you're running a terminal and need the new paths, run this script.).
#!/bin/sh
export PATH=$PATH:/mmc/bin:/whatever/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mmc/lib:/whatever/lib

Alternatively, if you want to give priority to you're personally installed applications (i.e. You've installed a more robust version of grep, and want to use it by default), add the new paths before $PATH and $LD_LIBRARY_PATH, as shown below.

#!/bin/sh
export PATH=/mmc/bin:/whatever/bin:$PATH
export LD_LIBRARY_PATH=/mmc/lib:/whatever/lib:$LD_LIBRARY_PATH


View Logfile in Browser without local syslogd (log.sh)

  • View the last 1000 lines from your Router-Logfile in your favorite browser without the need of a locally running syslogd (i.e. Kiwi).

Note: This Script is not from myself, CaScAdE created it. (Initial posts in German Forum: SOLVED: messages (logdatei) formatiert über browser aufrufen)

#!/bin/sh
echo '<HTML><HEAD><TITLE>Logfile</TITLE></HEAD>'
echo '<BODY>'<br />nvram get router_name
echo ' Logfile:<br><pre>'
/usr/bin/tail -n 1000 /var/log/messages
echo '</pre></BODY></HTML>'

To use this script you first need to enable Syslog on your Router without stating an IP. Then the log will be saved under /var/log/messages. You can do this under Administration->Services and then scroll down to the "System Log" section. Click "Enable" and let "Remote Server" empty. After you saved the script under /tmp/www/ as "log.sh" you must mark it as executable with "chmod +x /tmp/www/log.sh".

To view the log in your Browser point it to "http://<routerip>/user/log.sh"

Speak Your Signal Strength

I use my WRT in client mode to connect to an Access Point, but I don't have a particularly good signal quality and I often need to re adjust the position of the WRT and its antenna. Unfortunately my computer is not in sight of the WRT and I had to keep going backwards and forwards from my computer to the WRT making adjustments then checking the signal strength on the screen of my computer. This can take ages to to set up properly, so I decided to get my computer to use the `festival` speech synthesis program to tell me what the current signal level is.

#! /bin/bash
# Use `festival` to say out loud how much signal strength we have

# The ip address of the wrt
ip_addr="192.168.1.1"

# The username and password for the wrt
user="root"
pass="admin"

# Tempory file used to hold the data from the wrt
tmp_file=/tmp/wrt.status

echo
echo "The signal level is :-"
echo
echo "The signal level is" | festival --tts

while true ; do
       wget --http-user=$user --http-password=$pass http://$ip_addr/Status_Wireless.live.asp -O $tmp_file -o /dev/null
 
        signal=`cat $tmp_file | grep active_wireless |awk  -F "'" '{ print  $8 }'`
 
        echo $signal | awk '{printf"Signal  :  "$1"\t";for(;j<$1;j++)printf"=";printf"\n"}'

        if [[ -n $signal ]] ; then 
                echo $signal | festival --tts
        else
                echo "Not associated" | festival --tts
        fi
done

This works by using the same process as the 'Status-->Wireless' page ie it gets a chunk of data by wget'ing the Status_Wireless.live.asp 'page' from the WRT then running grep and awk to get the relevant chunk of data (the signal strength) and then piping that into the festival speech engine.

Now I just run this script and turn up the volume on my computer when I need to move the antenna.

See also

Startup Scripts
Script Examples