Azureus extension to schedule download speed by pinging an IP using Java

I have a 128Kbps Internet connection with no download caps. So I often leave torrents downloading huge files on my torrent client overnight or when leaving home. Problem is that this brings the net speed down to a crawl for my roomies who access the net through an HTTP proxy running on my PC. So I’ve also given them access to a web interface of the torrent client through their browser so that they could pause/resume the downloads as needed.

The problem here was that the buggers forgot to resume the downloads once they were done. And this happened almost every time they paused them.

So I decided to to do something about it. I wrote some Java code that pinged my roomies’ machine every few seconds and if there was no reply to the ping, it would resume the torrents at full speed. If the reply to the ping was received, it would do nothing. I didn’t immediately come across any Azureus Plugin that would allow me to do so.

How would one write code to do so? One way would be to get into the Azureus code base (it is open source) and see how to write a plugin. But doing that seemed too much for too little. A much quicker, but dirtier fix comes to mind. I installed the Firebug addon for Firefox. With this plugin enabled, I could see the exact contents of each HTTP – GET or POST request in real time as I used the browser. So I navigated to the web interface for Azureus on my own PC running at some thing like http://127.0.0.1:54323. Once there, I did what one would do to set maximum speed for downloads and noted the GET request sent by the browser to the Azureus web interface server.

Now in less than the time it took to write this post, I put together some Java code which would repeatedly ping my roomies’ machine and send the GET request to Azureus when the machine didn’t reply. Voila! All I had to do was ask my roomies to set the download speed to 1 KB/sec when they needed to use the net instead of pausing the torrent. (That could also be taken care of, but I was feeling lazy.)

Ofcourse, the same could be done for similar functionality with other clients that provide a web interface like uTorrent and eMule.

Here is the code that does the above. It is a dirty hack I threw together in 25 minutes at 2 O’ clock in the night. I usually write code much better. Do not comment on the quality or coding style. I know there are no worth while comments or intuitively named methods or variables. Go on and improve it if you wish. Point to be noted, it works.

import java.net.*;
import java.io.*;

public class AzureusSpeedSetter {

	void setSpeed()
	{

		try
		{
			URL u = new URL("http://127.0.0.1:6886/index.ajax?max_dl=1&max_active=2&max_active_seed=0&max_active_seed_enabled=0&max_conn_pertor=60&max_conn=400&max_dl_speed=0&max_ups=10&max_ups_seed=4&max_auto_up=0&max_ul_speed=12&max_ul_speed_seed=0&max_ul_speed_seed_enabled=0&comp_tab=0&date=" + new java.util.Date().getTime());
			HttpURLConnection conn =  (HttpURLConnection) u.openConnection();

			conn.connect();
			System.out.println(conn.getResponseMessage());
		}
		catch (IOException ioe)
		{
			ioe.printStackTrace();
		}
	}

	void monitor()
	{

		while(true)
		{
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException ie)
			{
				ie.printStackTrace();
			}

			if(isOffline()) {
				setSpeed();
			}
			else
				System.out.println("Is active.");
		}
	}

	boolean isOffline()
	{
		String line;
		try {
			BufferedInputStream br = new BufferedInputStream(Runtime.getRuntime().exec("ping -n 1 192.168.0.3".split("\\\\s")).getInputStream());

			byte[] buf = new byte[10000];
			int count  = 0;
			int offset = 0;

			while( (count = br.read(buf,offset,1000)) != -1 )
				offset += count;

			String s = new String(buf,0,offset);
			if(s.indexOf("Request timed out.") != -1)
				return true;
		}
		catch (Exception e) {
			e.printStackTrace();
		}

		return false;
	}

	public static void main(String[] args) throws Exception
	{
		AzureusSpeedSetter ass = new AzureusSpeedSetter();
		ass.monitor();
	}
}

One Response to “Azureus extension to schedule download speed by pinging an IP using Java”

  1. Onkar Joshi’s blog - Master Index of all posts « Onkar Joshi’s Blog Says:

    [...] Azureus extension to schedule download speed by pinging an IP using Java [...]

Leave a Reply