Useful Scripts
From DD-WRT Wiki
Revision as of 00:18, 3 April 2007 (edit) Bjustjones (Talk | contribs) (→Wireless Network Scanner (scan.sh)) ← Previous diff |
Revision as of 06:49, 3 April 2007 (edit) (undo) Microbug (Talk | contribs) m (GPIO of LaFonera) Next diff → |
||
Line 60: | Line 60: | ||
GPIO 8 n/a Unkown/None | GPIO 8 n/a Unkown/None | ||
GPIO 9 Output Power LED | GPIO 9 Output Power LED | ||
+ | </pre> | ||
+ | |||
+ | ==GPIO Info for LaFonera== | ||
+ | * [http://209.85.129.104/search?q=cache:XNM-Mb4Y5nkJ:kwzs.be/~kevin/ar531x/gpio%2520pinout.txt+pinout+fonera&hl=fr&ct=clnk&cd=2&gl=fr According to this link] | ||
+ | <pre> | ||
+ | Pin Use | ||
+ | 0 TP3 | ||
+ | 1 pin 5 of SW1 | ||
+ | 2 WLAN LED | ||
+ | 3 pin 1 of SW1 | ||
+ | 4 pin 2 of SW1 | ||
+ | 5 RESET (!) | ||
+ | 6 RESET button | ||
+ | 7 pin 6 of SW1 | ||
</pre> | </pre> | ||
Revision as of 06:49, 3 April 2007
Certain scripts can enhance the function of your router with DD-WRT, giving it more features or customizing it towards your needs.
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
GPIO Info for LaFonera
Pin Use 0 TP3 1 pin 5 of SW1 2 WLAN LED 3 pin 1 of SW1 4 pin 2 of SW1 5 RESET (!) 6 RESET button 7 pin 6 of SW1
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 (awk -f scanner)
##################### cat - >scanner # Show scanresults in consistent order with graphical bars. # To be run via telnet to WRT54g running modified firmware. # Do the following. Use your own router address instead of 192.168.1.1 on the following lines # Login via telnet: # telnet 192.168.1.1 # a simple test to make sure you can run this script, type: # wl scan; wl scanresults # and make sure you can run those commands. If not this program will not work. # If you succeeded with the scanresults then # copy and paste this entire text into the terminal window # (the cat - >scanner line will copy the rest of the file into a file named 'scanner') # and then hit return and then ctrl-c to close the file. # then just run script by typing the following line: # awk -f scanner # # I hereby release this into the public domain. Justin Jones, 2005 # # Jan'07 corrected bug from '06 improvement. BEGIN{ IGNORECASE = 1; 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/) { name = $2; rssi = $6;noise= $9; rssi=""; noise="";channel="";bssid="";caps=""} if(/^Mode/) {rssi = $4;noise= $7; channel = $10 } if(/^BSSID/) {bssid = $2; caps = $4" "$5" "$6" "$7" "$8" "$9" "$10 } if(/^Supported/) { name[bssid] = name rssi[bssid] = rssi noise[bssid]= noise channel[bssid] = channel caps[bssid] = caps } } close(command) printf home; ln = 0; print white " Name BSSID Signal Noise Channel Type"; for (x in name) { { #arbitrary strength calc through trial and error... modify as you wish: sigstrength = ((rssi[x] - noise[x])*1.5) + ((rssi[x] +90)*1.5); if (sigstrength <1) sigstrength=0; cStrength = cStrengthLow; 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 %s%-4d %s%-4d %s%-4d %s%2s %s%10s " reset erase2end "\n" erase2end "\n"; printf fmt, cName,name[x],cStrength,0,x,cSignal,rssi[x],cNoise,noise[x],cChannel, channel[x],cCaps,caps[x]; rssi[x] = "-1000 xxxx"; ln++; } } if (ln ==0) print red "No Results - Do you have wl scan capability? \nThis program depends on 'wl scan; wl scanresults' to run. Hit ctrl-c to stop." 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 | awk '/'"$ME"'/ {++x}; END {print x+0}'` 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.
Kleines Sicherheitsscript (Firewall)
#!/bin/sh # Startblock Eintrag vom 25.03.2007 # # ACHTUNG !! Die Funktion von Emule und dergleichen Programme werden von mir nicht # mehr garantiert da ich diese Programme nicht nutze und nutzen werde!!!! # # Bitte versuchen, sollte es doch funktionieren bin ich doch sehr erfreut. # Einfach in diesen Wiki Eintrag einfügen. # # Viel Spass an mehr Sicherheit, # # St. Karitzl # info@user1.walztech.de # http://daywalker81.de.vu echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 1 > /proc/sys/net/ipv4/ip_forward echo 1024 > /proc/sys/net/ipv4/ipfrag_high_thresh echo 512 > /proc/sys/net/ipv4/ipfrag_low_thresh echo 10 > /proc/sys/net/ipv4/ipfrag_time echo 5 > /proc/sys/net/ipv4/icmp_ratelimit echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 0 > /proc/sys/net/ipv4/conf/eth1/accept_source_route echo 0 > /proc/sys/net/ipv4/conf/eth1/accept_redirects echo 1 > /proc/sys/net/ipv4/conf/eth1/log_martians echo 10 > /proc/sys/net/ipv4/neigh/eth1/locktime echo 0 > /proc/sys/net/ipv4/conf/eth1/proxy_arp echo 50 > /proc/sys/net/ipv4/neigh/eth1/gc_stale_time # Nachfolgende Einträge vom : 28.3.2007 # # Diese einträge sichern den letzten kleinen Teil ab und sorgen für einen # relavtiven Schutz gegen getestete Man in The middle Attaken. # Sicher gegen Dos, DDOS Attaken usw. bestätigung kam gerade!!!!!!!!!!!!!! echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth1/secure_redirects echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses echo 5 > /proc/sys/net/ipv4/igmp_max_memberships echo 2 > /proc/sys/net/ipv4/igmp_max_msf echo 1024 > /proc/sys/net/ipv4/tcp_max_orphans echo 2 > /proc/sys/net/ipv4/tcp_syn_retries echo 2 > /proc/sys/net/ipv4/tcp_synack_retries echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout echo 0 > /proc/sys/net/ipv4/route/redirect_number echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter echo 1 > /proc/sys/net/ipv4/conf/eth1/rp_filter echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route echo 61 > /proc/sys/net/ipv4/ip_default_ttl # DoS Prävention durch frisieren der Timeouts echo "1800" > /proc/sys/net/ipv4/tcp_keepalive_time echo "0" > /proc/sys/net/ipv4/tcp_window_scaling echo "0" > /proc/sys/net/ipv4/tcp_sack # Hallo ich bin Windows XP mit einer checkpoint-firewall echo 4096 87380 4194304 >/proc/sys/net/ipv4/tcp_rmem # min default max echo 4096 87380 4194304 >/proc/sys/net/ipv4/tcp_wmem # min default max # Prüfen auf Netzwerküberlastung (Explicit Congestion Notification) echo 1 > /proc/sys/net/ipv4/tcp_ecn # Ändere Portbereich für ausgehende Pakete echo "30000 60000" > /proc/sys/net/ipv4/ip_local_port_range # Die default Schlangenlänge verdoppeln / modifiziert für Wrt da nicht # alle Proc Einträge vorhanden sind echo 4096 > /proc/sys/net/ipv4/ip_conntrack_max # Led Signal das dieses Script initiert wurde und beendet wurde sleep 1 gpio enable 3 sleep 1 gpio disable 3 sleep 1 gpio enable 3 sleep 1 gpio disable 2 sleep 1 gpio enable 2 sleep 1 gpio disable 2 #Um das Webinterface per Script abzuschalten auskommentieren #killall httpd
ACHTUNG !! eth1 evtl. auf die Wan(Extren) Schnittstelle anpassen. Ich kann mich nicht beschweren, is dicht wie ne Betonmauer ;) ausser man macht Löcher (Portforwarding) :P
Installation ganz einfach:
1.) In den WRT einloggen 2.) cd /jffs 3.) vi sec.sh (z.b. Namen sucht Ihr Euch aus) speichern nicht vergessen ;) 4.) Browser öffnen, auf die Weboberfläche vom WRT, Administration -> Commands 5.) in das Startupfeld: /jffs/sec.sh (bzw. den Dateinamen den Ihr dem Script gegeben habt) eingeben 6.) Save Startup klicken und das wars! 7.) Router neustart
Alles gemacht ? einfacher Test pingt den Router an bekommt ihr nen Timeout gehts wenn net Fehler suchen ;)