Router settings for TATA Indicom Broadband connection.

I have a Netgear ADSL Wifi router. The router provided to me by TATA Indicom was below par so I decided to use my router. Below are the settings you need to configure your router. Note that you need a router with ADSL modem (like my Netgear DG834G).

Multiplexing method: LLC-Based
DSL Mode: ADSL2+
VPI: 0
VCI: 32
Encapsulation: PPPoE (Point to Point Protocol over Ethernet)
Login: (e.g. chitran@vsnl.com, check the receipt given to you for your email ID)
Password: (default is reset123)
That’s it. These the critical values you need. Particularly if you set VPI and VCI values to anything but the ones listed above then you will not be able to connect to the net.
Happy surfing!
PS: If your plan provides static IP address then chances are that you will be using completely different protocol, e.g. maybe MER (MAC Encapsulated Routing) instead of PPPoE. In that case the above giude is not useful for you.

Asynchronously call a remote web page without the complexity of AJAX

Let me first give me my scenario where I needed such a thing, so that it may clear what I mean by the title of this post.

Scenario:-
For a J2EE Online Library project of mine I needed to display a list of books that can be issued. Each book’s entry had a corresponding check box which when clicked by the user is added to the cart of the user. Now the list of items in cart is kept at server side which meant that I have to call a JSP page or a servlet from the client side without actually navigating to that page. This is usually accomplished using AJAX, which is not a trivial task. Hence, I devised simple trick.

The Trick:-
I thought if somehow I could load the called page into an iframe rather than the whole window then that will solve my problem, and it worked! Then make the iframe hidden. Below is the code snippet.

License: GNU Public License version 3.

Code:

[code lang=”html”]
<html>
<pre id="codebox-pseudo-ajax"><code>  <head>
    <title>Pseudo AJAX call trick by AppleGrew</title>
    <script type=’text/javascript’>
        function callUpdate(chkbox) {
                <strong>frames[‘proxy’].location.href = ‘ServletController?pg=updateCart&itemId=’ + chkbox.value + "&chosen=" + chkbox.checked;</strong>
                //alert(frames[‘proxy’].document.body.innerHTML); //Use to retrieve the value returned by ServletController.
        }
        </script>
  </head>
  <body>
            <br/>
            <br/>
            <br/>
            <br/>
            <br/>
            <center>
            <input name="itemId" type="checkbox" value="1" <strong>onclick="javascript:callUpdate(this);"</strong> /> Item1<br/>
            <br/>
            <input name="itemId" type="checkbox" value="2" <strong>onclick="javascript:callUpdate(this);"</strong> /> Item2<br/>
            </center>
           
           
            <!–The purpose of this iframe is to imitate a sort of AJAX call. The javascript calls the ServletController and
            the loaded page is loaded into this iframe w/o replacing the current page –>
            <strong><iframe id="proxy" name="proxy" style="display:none;"></iframe></strong>
  </body>
</html></code>[/code]

Where ServletController is the servelt controller of your project or just any other page. Note that if you need to retrieve any value returned from ServletController then it must return generated page as below.

<html>
<head></head>
<body>Put the value to be returned here.</body>
</html>

Using Airtel Edge/GPRS Micromax MMX 610U USB device to surf the internet from Linux

This has been a major headache for me to reboot to Windows just to surf my net, and to update my Linux machine I had to forward the internet connection from a Windows computer to my Linux machine. None-the-less I eventually managed to make it work to day. 🙂

Note that I managed to make it work, and I provide no guarantee that it will work on your computer, but I will share my computer’s configuration so that it may help you.

So, first my computer’s configuration. I have Kubuntu Hardy Heron installed (8.04). My current kernel is 2.6.24-19-generic (installed from the official Ubuntu server). Mine is a 32-bit system. The USB modem I have is Micromax MMX 610U.

Now the steps to setup your USB modem:-

  1. Plug-in your USB modem. A green light will start blinking. If the light is blue then you have PIN set and I have no idea how to enter PIN code from Linux. In that case, reboot to Windows and from the provided Airtel’s software enter the PIN code and reboot to Linux or disable the PIN altogether.
  2. Now run the command lsusb in the console the output will be like as below.Bus 005 Device 003: ID 0d49:7410 Maxtor
    Bus 005 Device 001: ID 0000:0000
    Bus 004 Device 001: ID 0000:0000
    Bus 003 Device 002: ID 046d:c016 Logitech, Inc. M-UV69a Optical Wheel Mouse
    Bus 003 Device 001: ID 0000:0000
    Bus 002 Device 001: ID 0000:0000
    Bus 001 Device 004: ID 12d1:1001 Huawei Technologies Co., Ltd. E620 USB Modem
    Bus 001 Device 001: ID 0000:0000

    An Important Note:-
    As I have found out that hot plugging of this USB modem doesn’t work. The modem will be detected by the kernel but for some reason wvdial won’t be able to locate the modem, hence, when you insert the modem into your USB drive then reboot your computer (or plug it in before turning on your computer).

    Note the bolded text above. That’s your modem.

  3. Now run sudo wvdialconf. This will create the file /etc/wvdial.conf with some of the necessary values.
  4. Now whatever values the file /etc/wvdial.conf keep that as such except for the ones shown below. If any settings shown below already existed then replace that with the ones below, if they didn’t exist then just add them to the file, but they must appear below the line [Dialer Defaults]. Note that will need to open the file /etc/wvdial.conf as a root. Try using sudo nano /etc/wvdial.conf.Init1 = AT+CGDCONT=1,”IP”,”airtelgprs.com”,””,0,0
    Baud = 460800
    stupid mode = 1
    Phone = *99#
    Password = a
    ;No need to change this to anything else. This is immaterial, and note that no semicolon before Password =.
    Username = a ;No need to change this to anything else. This is immaterial, and note that no semicolon before Username =.
  5. Now create a file connAir in your home directory. Copy and paste the following code into it and give it execute permission.
    [code lang=”bash”]#!/bin/bash
    # BY AppleGrew @ http://blog.applegrew.com (All rigths
    # reserved)

    pid=`pgrep wvdial`
    if [ -z $pid ]
    then

    sudo route del default
    echo "CONNECTING TO Airtel…"
    wvdial &

    sleep 10s

    IP=`ifconfig ppp0|grep -o  ‘inet addr:\([.0-9]*\)’`
    IP=`echo $IP|sed  ‘s/inet addr:\([.0-9]*\)/\1/g’`
    echo "YOUR CURRENT IP IS ‘$IP’".
    if [ -z $IP ]
    then
    echo "CONNECTION TO Airtel TIMED-OUT…….. : ("
    else
    echo "CONNECTED TO Airtel. : )"
    fi
    sudo route add default gw $IP

    else
    echo "A CONNECTION IS ALREADY IN PROGRESS."
    fi[/code]

  6. Now create another file disconnAir in your home directory. Copy and paste the following code into it and give it execute permission.
    [code lang=”bash”]#!/bin/bash
    # BY AppleGrew @ http://blog.applegrew.com (All rigths
    # reserved)

    pid=`pgrep wvdial`
    if [ -z $pid ]
    then
    echo "NO CONNECTION IN PROGRESS."
    else
    echo "DISCONECTTING FROM Airtel…"
    kill -INT $pid

    sleep 6s
    pid=`pgrep wvdial`
    if [ -z $pid ]
    then
    echo "DISCONNECTED."
    else
    echo "DISCONNECTION MAY HAVE FAILED."
    fi
    fi[/code]

Connecting to Airtel:-

  1. Open console and type ./connAir.

Disconnecting from Airtel:-

  1. Open console and type ./disconnAir.

Hope this helps.

Find the number of lines of code your project has.

After completing a big and satisfying project you may want to collect various stats about your project. One of them is the total number of lines of code your project has. As with all big projects it will probably have large number of files tucked into various directories and sub-directories and sub-sub-directories,…. you get the idea; this is very tedious to do manually.

In Linux you have a cool trick to do just that! Run the following in the directory with contains your source code.

find . -type f -exec cat ‘{}’ \;|wc -l

If the directory also contains files other than the source code, e.g. .class files along with .java files, then you can ask find to choose files with a particular pattern using the following command

find . -type f -iname “*.java” -exec cat ‘{}’ \;|wc -l

The above command will choose only .java files.

magic_shutdown: Shutdown computer remotely using Magic Packet

The title says it all. If you don’t know what a Magic Packet is then read here. Below is the code of a shell script (I call magic_shutdown) that uses tcpdump to listen for Magic Packets. When it receives on then the shell script verifies its content to make sure that this packet was meant for this computer. Note this script doesn’t require that your network interface card support Wake-on-LAN. It has no special hardware dependencies.

All-in-all, this script lets you create create a shortcut which will act as remote power button for your computer. Press it to turn the computer ON. Press it again to turn the computer OFF.

Get magic_shutdown‘s code
License: GNU Public License version 3.

[code lang=”bash”]#!/bin/bash
#Author:AppleGrew
#License:GPL version 3

listenPort=9
interface="eth0"

#Forking to daemonize…
if [[ "$2" != "forked" ]]
then
echo "Forking $0…"
"$0" "$1" forked &
echo "Forked."
exit 0
fi

#Creating pid file
ppid=$$
echo $ppid >"$1"

echo "Started"
mac=`ifconfig "$interface"|head -n1|sed -e ‘s/.*HWaddr \([0-9:a-fA-F]*\)/\1/g’ -e ‘s/://g’`
pckt_expect=`echo "ff ff ff ff ff ff $mac $mac $mac $mac $mac $mac $mac $mac"|sed ‘s/ //g’|tr ‘A-Z’ ‘a-z’`
while `true`
do
pckt_data=`tcpdump -i "$interface" -x -c 1 udp port ${listenPort}`
if [[ $? != 0 ]]
then
echo "tcpdump returned error."
exit 1
fi

pckt_data=`echo "$pckt_data" | \
grep ‘0x[0-9]*:’| \
tr ‘A-Z’ ‘a-z’| \
sed ‘s/[ \t]//g’| \
sed ‘s/0x[0-9]*:\([0-9a-f]*\)/\1/g’| \
tr -d ‘\n\r’| \
cut -c 57-`
if [[ "$pckt_data" == "$pckt_expect" ]]
then
echo "Matched! Received Magic packet shutting down…"
shutdown -P now #Not recommended
#For Gnome #Doesn’t work dunno why?
#dbus-send –session –dest=org.gnome.PowerManager \
# –type=method_call –print-reply –reply-timeout=2000 \
# /org/gnome/PowerManager org.gnome.PowerManager.Shutdown
#For KDE 3.5
#dcop `dcop|grep power-manager` power-manager shutdown
exit 0
fi
done

echo "EXITED"
exit 0[/code]

Below is the startup script that must be used to launch magic_shutdown script.

Get launch_magic_shutdown‘s code
License: GNU Public License version 3.

[code lang=”bash”]#!/bin/bash
#Author:AppleGrew
#License:GPL version 3

SCRIPT="/opt/magic_shutdown"
PID_FILE="/var/run/magic_shutdown.pid"
case "$1" in
start)
test -f "$PID_FILE" && echo "Already Running…" && exit 1
"$SCRIPT" "$PID_FILE"
echo "Started"
;;
stop)
pid=`cat "$PID_FILE"`

tcpPid=`pgrep -P $pid tcpdump`
kill -9 $pid
kill -2 $tcpPid
if [ -f "$PID_FILE" ] && ! ps -p $pid >/dev/null
then
rm -f "$PID_FILE"
else
echo "Failed to delete pid file. Maybe its already deleted."
fi
echo "Stopped"
;;
esac[/code]

Installations:-
Assuming that you have downloaded the above two codes into your home directory. Now run the following commands.

sudo cp launch_magic_shutdown /etc/init.d
sudo chmod a+x /etc/init.d/launch_magic_shutdown
cd /etc/rc2.d
sudo ln -s ../init.d/launch_magic_shutdown S99launch_magic_shutdown

sudo cp magic_shutdown /opt/magic_shutdown
sudo chmod a+x /opt/magic_shutdown

Hope this helps. Report in the comments section if you encounter any problem.


Update: Stuart’s Script
Stuart (see comment section) posted his version of magic_shutdown script. If the above one doesn’t work then maybe you should give this one a try.
[code lang=”bash”]#!/bin/sh
#Author: Stuart
#Original Author:AppleGrew
#License:GPL version 3

#Forking to daemonize…
if [[ "$2" != "forked" ]]
then
echo "Forking $0…"
"$0" "$1" forked &amp;
echo "Forked."
exit 0
fi

#Creating pid file
ppid=$$
echo $ppid &gt;"$1"

echo "Started"
interface=`route -n | grep "^0.0.0.0" | awk -F " " ‘{print $8}’`
mac=`ifconfig "$interface"|head -n1|sed -e ‘s/.*HWaddr \([0-9:a-fA-F]*\)/\1/g’ -e ‘s/://g’`
pckt_expect=`echo "$mac $mac $mac $mac $mac $mac $mac $mac $mac $mac $mac $mac $mac $mac $mac $mac"|sed ‘s/ //g’|tr ‘A-Z’ ‘a-z’`
while `true`
do
pckt_data=`tcpdump -i "$interface" -s 0 -x -c 1 \( \(ether dst "$mac" and not ip and not arp and not rarp\) or \(udp port 9\) \)`
if [[ $? != 0 ]]
then
echo "tcpdump returned error."
exit 1
fi
pckt_data=`echo "$pckt_data" | \
grep ‘0x[0-9]*:’| \
tr ‘A-Z’ ‘a-z’| \
sed ‘s/[ \t]//g’| \
sed ‘s/0x[0-9]*:\([0-9a-f]*\)/\1/g’| \
tr -d ‘\n\r’ | \
awk -F "ffffffffffff" ‘{print $2}’`
if [[ "$pckt_data" == "$pckt_expect" ]]
then
echo "Matched! Received Magic packet shutting down…"
rm -f $1
/sbin/poweroff
exit 0
fi
done

echo "EXITED"
exit 0[/code]

Turn on (power on) your computer remotely

I was scanning the net today for ways to turn on any computer remotely. The solution I stumbled upon was Wake-On-LAN (WOL). (Read more) What’s more good, is that most of the computers sold today support this feature.

To know if your system supports this feature or not run the following command

sudo ethtool eth0

You will get output similar to the one below.

Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 32
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
Link detected: yes

In the above please substitute eth0 with the network interface card’s name you want to listen for “Magic Packets“. The Supports Wake-on gives the methods your card supports to wake your computer up. In the output above, this card supports waking on any physical activity, on unicast message, on multicast message, on broadcast message and “Magic Packets” respectively. A value of d for Supports Wake-on means that your card doesn’t support WOL. (For the full list of meanings for these letters see ethtool‘s manpage under the wol portion.) In the output above Wake-on is g, which means that WOL for eth0 is enabled and is set to listen for “Magic Packets” only.

Useful links:-

  1. On Wkipedia, has steps to enable WOL via Windows.
  2. How-to for Ubuntu users.
  3. Very useful resource on WOL.
  4. Shutdown remote computers using Magic Packets.