Hi all,

attached is some work I've done regarding bittorrent...

Since this seems to work and since it can be useful also for those that
are working for the bittorrent porting (in particular for Bernard) I've decided to post this patch (based on the developer trunk).

I've used the standard bt client (written in python) both for clients and image server, so I've included both the python interpreter and bittorrent scripts in BOEL binaries.

Bernard is using libBt, it seems more light since it doesn't require python, maybe it could be interesting do some tests to evaluate the difference in performances between the two products.

To use my bittorrent patch you've to start the tracker and the first seeder on the image server, simply using the following command:

# si_startbttrack --image_server <ip_image_server> --image <image_name>

This command creates also a single tar file for the image specified by comdline; run with --update_image to update the tar file.

I've not written the si_stopbttrack command, even if it is very
simple... but for now you have to stop it only killing the tracker and
the seeder manually... ;-)

For the client side I don't use flamethrower, the bt client works alone without further packages (except python, of course).

You must only define BITTORRENT_STAGING=<dir_path> as a kernel boot parameter. In this way the bittorrent protocol is used to deploy the image in the clients. First of all the image is downloaded in a staging directory (the path is specified by the parameter), then it is untarred in /a/ (the root directory of the installed fs) and the tar is removed when the exctraction is completed.

If the client has not a lot of memory, like my test machine :-(, you can
deploy the tar file using the client disk space, for example I usually use BITTORRENT_STAGE=/a/tmp... otherwise if you have enough RAM, to increase performance, is better to deploy the tar file in tmpfs (for example using /tmp - we can assume this as the default option).

If you can do some tests let me know your feedback... in particular for
Bernard that it's working hardly with bittorrent... ;-)

Best regards and happy new year!
-Andrea
diff -urN trunk/etc/autoinstallscript.template bittorrent/etc/autoinstallscript.template
--- trunk/etc/autoinstallscript.template	2006-01-02 09:40:53.671461104 +0100
+++ bittorrent/etc/autoinstallscript.template	2006-01-02 09:44:25.384275864 +0100
@@ -216,6 +216,29 @@
     if [ ! -z $MONITOR_SERVER ]; then
         stop_report_task 100
     fi
+elif [ ! -z $BITTORRENT_STAGING ]; then
+    bittorrent_log=/tmp/bittorrent.log
+    bittorrent_polling_time=30
+    logmsg "Start downloading image using torrent ${IMAGENAME}.tar.torrent"
+    cd ${BITTORRENT_STAGING} && /usr/bin/python /usr/bin/bittorrent-console --no_start_trackerless_client --max_upload_rate
+    pid=$!
+    while :; do
+        status=`grep "percent done:" $bittorrent_log | sed -ne '$p' | sed 's/percent done: *//'`
+        [ -z "$status" ] && status=0.0
+        echo "percent done: $status %"
+        if [ "$status" = "100.0" ]; then
+            kill -9 $pid
+            unset bittorrent_log pid
+            break
+        fi
+        sleep $bittorrent_polling_time
+    done
+    unset bittorrent_polling_time
+    if [ ! -z $MONITOR_SERVER ]; then
+        stop_report_task 100
+    fi
+    logmsg "Extracting image ${IMAGENAME}.tar ..."
+    cd /a/ && tar -xvf ${BITTORRENT_STAGING}/${IMAGENAME}.tar && rm -f ${BITTORRENT_STAGING}/${IMAGENAME}.tar
 else 
     # Use rsync 
     if [ $NO_LISTING ]; then
diff -urN trunk/initrd_source/skel/etc/init.d/functions bittorrent/initrd_source/skel/etc/init.d/functions
--- trunk/initrd_source/skel/etc/init.d/functions	2006-01-02 09:40:53.388504120 +0100
+++ bittorrent/initrd_source/skel/etc/init.d/functions	2006-01-02 09:44:40.177027024 +0100
@@ -193,6 +193,8 @@
     echo "MONITOR_SERVER=$MONITOR_SERVER"      	>> /tmp/variables.txt
     echo "MONITOR_PORT=$MONITOR_PORT"          	>> /tmp/variables.txt
     echo "MONITOR_CONSOLE=$MONITOR_CONSOLE"    	>> /tmp/variables.txt
+
+    echo "BITTORRENT_STAGING=$BITTORRENT_STAGING"    	>> /tmp/variables.txt
 }
 #
 ################################################################################
diff -urN trunk/make.d/bittorrent.rul bittorrent/make.d/bittorrent.rul
--- trunk/make.d/bittorrent.rul	1970-01-01 01:00:00.000000000 +0100
+++ bittorrent/make.d/bittorrent.rul	2006-01-02 09:49:50.227892128 +0100
@@ -0,0 +1,31 @@
+#
+#	2005-12-28 Andrea Righi
+#   	- Bittorrent binaries
+#
+
+
+BITTORRENT_VERSION      := 4.3.4
+BITTORRENT_DIR          := BitTorrent-$(BITTORRENT_VERSION)
+BITTORRENT_TARBALL      := BitTorrent-$(BITTORRENT_VERSION).tar.gz
+BITTORRENT_URL          := http://www.bittorrent.com/dl/$(BITTORRENT_TARBALL)
+BITTORRENT_BINARY       := $(SRC_DIR)/$(BITTORRENT_DIR)/bittorrent.py
+
+PHONY += bittorrent
+
+bittorrent:  $(BITTORRENT_BINARY)
+
+$(BITTORRENT_BINARY): $(SRC_DIR)/$(BITTORRENT_TARBALL)
+	rm -rf $(SRC_DIR)/$(BITTORRENT_DIR)
+	cd $(SRC_DIR) && tar -xvzf $(BITTORRENT_TARBALL)
+
+$(SRC_DIR)/$(BITTORRENT_TARBALL):
+	[ -d $(SRC_DIR) ] || mkdir -p $(SRC_DIR)
+	$(GETSOURCE) $(BITTORRENT_URL) $(SRC_DIR)
+
+ALL_SOURCE += $(SRC_DIR)/$(BITTORRENT_TARBALL)
+
+PHONY += bittorrent_clean
+bittorrent_clean:
+	rm -rf $(SRC_DIR)/$(BITTORRENT_DIR)
+
+# /* vi: set noet ts=4: */
diff -urN trunk/make.d/python.rul bittorrent/make.d/python.rul
--- trunk/make.d/python.rul	1970-01-01 01:00:00.000000000 +0100
+++ bittorrent/make.d/python.rul	2006-01-02 09:48:55.530207440 +0100
@@ -0,0 +1,33 @@
+#
+#	2005-12-20 Andrea Righi
+#   	- Python interpreter
+#
+
+
+PYTHON_VERSION      := 2.4.2
+PYTHON_DIR          := Python-$(PYTHON_VERSION)
+PYTHON_TARBALL      := Python-$(PYTHON_VERSION).tar.bz2
+PYTHON_URL          := http://www.python.org/ftp/python/2.4.2/$(PYTHON_TARBALL)
+PYTHON_BINARY       := $(SRC_DIR)/$(PYTHON_DIR)/python
+
+PHONY += python
+python:  $(PYTHON_BINARY)
+$(PYTHON_BINARY): $(SRC_DIR)/$(PYTHON_TARBALL)
+	rm -rf $(SRC_DIR)/$(PYTHON_DIR)
+	cd $(SRC_DIR) && tar -xvjf $(PYTHON_TARBALL)
+	cd $(SRC_DIR)/$(PYTHON_DIR) && \
+        ./configure --prefix=/usr --disable-shared --disable-ipv6 --disable-profiling --without-tsc --without-pymalloc --disable-toolbox-glue CFLAGS="-Os"
+	export CFLAGS="-Os"
+	$(MAKE) -C $(SRC_DIR)/$(PYTHON_DIR) CFLAGS="-Os"
+
+$(SRC_DIR)/$(PYTHON_TARBALL):
+	[ -d $(SRC_DIR) ] || mkdir -p $(SRC_DIR)
+	$(GETSOURCE) $(PYTHON_URL) $(SRC_DIR)
+
+ALL_SOURCE += $(SRC_DIR)/$(PYTHON_TARBALL)
+
+PHONY += python_clean
+python_clean:
+	rm -rf $(SRC_DIR)/$(PYTHON_DIR)
+
+# /* vi: set noet ts=4: */
diff -urN trunk/Makefile bittorrent/Makefile
--- trunk/Makefile	2006-01-02 09:40:53.766446664 +0100
+++ bittorrent/Makefile	2006-01-02 09:45:23.339465336 +0100
@@ -164,7 +164,7 @@
 PXE_CONF_DEST     = $(ETC)/systemimager/pxelinux.cfg
 
 BINARIES := si_mkautoinstallcd si_mkautoinstalldiskette si_mkbootmedia
-SBINARIES := si_addclients si_cpimage si_getimage si_mkdhcpserver si_mkdhcpstatic si_mkautoinstallscript si_mkbootserver si_mvimage si_pushupdate si_rmimage si_mkrsyncd_conf si_mkclientnetboot si_netbootmond si_imagemanip si_mkbootpackage si_monitor si_monitortk
+SBINARIES := si_addclients si_cpimage si_getimage si_mkdhcpserver si_mkdhcpstatic si_mkautoinstallscript si_mkbootserver si_mvimage si_pushupdate si_rmimage si_mkrsyncd_conf si_mkclientnetboot si_netbootmond si_imagemanip si_mkbootpackage si_monitor si_monitortk si_startbttrack
 CLIENT_SBINARIES  := si_updateclient si_prepareclient
 COMMON_BINARIES   = si_lsimage
 
@@ -314,6 +314,9 @@
 
 	$(SI_INSTALL) -d -m 755 $(FLAMETHROWER_STATE_DIR)
 
+	# Install server-side BitTorrent.
+	cd $(SRC_DIR)/$(BITTORRENT_DIR) && $(PYTHON) setup.py install --prefix /usr
+
 # install client-only files
 .PHONY:	install_client
 install_client: install_client_man install_client_libs
@@ -497,6 +500,8 @@
 				$(OPENSSH_BINARIES) \
 				$(OPENSSH_CONF_FILES) \
 				$(LVM_BINARY) \
+				$(PYTHON_BINARY) \
+				$(BITTORRENT_BINARY) \
 				$(SRC_DIR)/modules_build-stamp
 	#
 	# Put binaries in the boel_binaries_tarball...
@@ -535,6 +540,12 @@
 	#
 	cd $(BOEL_BINARIES_DIR)/sbin && $(foreach binary,$(shell cat $(SRC_DIR)/$(LVM_DIR)/tools/.commands),ln -s -f lvm $(binary) && ) /bin/true
 
+	# Python installation
+	cd $(SRC_DIR)/$(PYTHON_DIR) && export DESTDIR=$(BOEL_BINARIES_DIR) && make install
+
+	# BitTorrent installation (refquire python-devel and python-xml packages)
+	cd $(SRC_DIR)/$(BITTORRENT_DIR) && $(BOEL_BINARIES_DIR)/usr/bin/python setup.py install --prefix $(PREFIX) --root $(BOEL_BINARIES_DIR)
+
 	mkdir -m 755 -p $(BOEL_BINARIES_DIR)/lib
 	test ! -d /lib64 || mkdir -m 755 -p $(BOEL_BINARIES_DIR)/lib64
 
@@ -590,7 +601,7 @@
 	TGTLIBDIR=lib ; \
 	test ! -d /lib64 || TGTLIBDIR=lib64 ; \
 	cd $(BOEL_BINARIES_DIR) \
-		&& $(PYTHON) $(TOPDIR)/initrd_source/mklibs -L $(SRC_DIR)/$(PARTED_DIR)/libparted/.libs:$(SRC_DIR)/$(DISCOVER_DIR)/lib/.libs:$(SRC_DIR)/$(DEVMAPPER_DIR)/lib/ioctl:$(SRC_DIR)/$(E2FSPROGS_DIR)/lib:/lib64:/usr/lib64:/usr/kerberos/lib64:/lib:/usr/lib:/usr/kerberos/lib -v -d $$TGTLIBDIR bin/* sbin/*
+		&& $(PYTHON) $(TOPDIR)/initrd_source/mklibs -L $(SRC_DIR)/$(PARTED_DIR)/libparted/.libs:$(SRC_DIR)/$(DISCOVER_DIR)/lib/.libs:$(SRC_DIR)/$(DEVMAPPER_DIR)/lib/ioctl:$(SRC_DIR)/$(E2FSPROGS_DIR)/lib:/lib64:/usr/lib64:/usr/kerberos/lib64:/lib:/usr/lib:/usr/kerberos/lib -v -d $$TGTLIBDIR bin/* sbin/* usr/bin/*
 	#
 	# Include other files required by openssh that apparently aren't 
 	# picked up by mklibs for some reason. -BEF-
diff -urN trunk/sbin/si_startbttrack bittorrent/sbin/si_startbttrack
--- trunk/sbin/si_startbttrack	1970-01-01 01:00:00.000000000 +0100
+++ bittorrent/sbin/si_startbttrack	2006-01-02 09:45:37.262348736 +0100
@@ -0,0 +1,139 @@
+#!/usr/bin/perl -w
+#
+#  "SystemImager"
+#
+#  Copyright (C) 2005 Andrea Righi <[EMAIL PROTECTED]>
+
+use lib "USR_PREFIX/lib/systemimager/perl";
+use strict;
+use Getopt::Long;
+use vars qw($config $VERSION);
+use constant DEFAULT_TRACKER_PORT => 6969;
+
+my $VERSION = "SYSTEMIMAGER_VERSION_STRING";
+my $program_name = "si_startbttrack";
+my $version_info = << "EOF";
+$program_name (part of SystemImager) v$VERSION
+
+Copyright (C) 1999-2001 Andrea Righi <[EMAIL PROTECTED]>
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+EOF
+
+my $get_help = "\n       Try \"--help\" for more options.";
+
+my $help_info = $version_info . <<"EOF";
+
+Usage: $program_name --image_server <Hostname|IP> --image <IMAGE>
+        [OPTION]...
+
+Options: (options can be presented in any order and may be abbreviated)
+ --help                 Display this output.
+
+ --version              Display version and copyright information.
+
+ --image_server HOSTNAME | IP
+                        Specify the hostname or ip of the image server.
+
+ --image        IMAGENAME
+                        Specify the name of the image to distribute.
+
+ --tracker_port PORT    Specify an optional tracker port (default 6969).
+
+ --update_image         Update image tar file.
+
+ --quiet                Run image server seeder in background.
+
+Download, report bugs, and make suggestions at:
+http://systemimager.org/
+
+EOF
+
+my ($help, $version, $quiet, $update_image, $image_server, $image_name, $tracker_port);
+GetOptions(
+    "help"      => \$help,
+    "version"   => \$version,
+    "quiet"     => \$quiet,
+    "update_image" => \$update_image,
+    "image_server=s" => \$image_server,
+    "tracker_port=s" => \$tracker_port,
+    "image=s" => \$image_name,
+) or die "$help_info";
+
+### BEGIN evaluate commad line options ###
+if ($help) {
+    print "$help_info";
+    exit(0);
+}
+
+if ($version) {
+    print "$version_info";
+    exit(0);
+}
+
+unless ($image_server) {
+    die "\n$program_name: --image_server HOSTNAME | IP must be specified.\n$get_help\n\n";
+}
+
+unless ($image_name) {
+    die "\n$program_name: --image IMAGENAME must be specified.\n$get_help\n\n";
+}
+
+unless ($tracker_port) {
+    $tracker_port = DEFAULT_TRACKER_PORT;
+}
+
+my $IMAGE_DIR = "/var/lib/systemimager/images";
+my $SCRIPTS_DIR = "/var/lib/systemimager/scripts";
+
+unless (-d "$IMAGE_DIR/$image_name") {
+    die "\n$program_name --image $image_name: not a valid image!.\n$get_help\n\n";
+}
+
+# Prepare tar file.
+print "Preparing tar file for $image_name...\n";
+if ($update_image) {
+    unlink("$IMAGE_DIR/$image_name.tar");
+}
+unless (-f "$IMAGE_DIR/$image_name.tar") {
+    system "cd $IMAGE_DIR/$image_name && tar -cf $IMAGE_DIR/$image_name.tar .";
+    if ($?) {
+        die "error: cannot create image tar file!\n";
+    }
+}
+print "done.\n";
+
+# Prepare torrent file.
+print "Preparing torrent file for $image_name...\n";
+if ($update_image) {
+    unlink("$SCRIPTS_DIR/$image_name.tar.torrent");
+}
+unless (-f "$SCRIPTS_DIR/$image_name.tar.torrent") {
+    system "maketorrent-console --target $SCRIPTS_DIR/$image_name.tar.torrent http://$image_server:$tracker_port/announce $IMAGE_DIR/$image_name.tar";
+    if ($?) {
+        die "error: cannot create torrent file!\n";
+    }
+}
+print "done.\n";
+
+# Start tracker.
+print "Starting tracker...\n";
+unlink('/tmp/dstate', '/var/log/systemimager/tracker.log');
+system "bittorrent-tracker --port $tracker_port --dfile /tmp/dstate --logfile /var/log/systemimager/tracker.log &";
+if ($?) {
+    die "error: cannot start tracker!\n";
+}
+print "done.\n";
+
+print "Starting first seeder...\n";
+if ($quiet) {
+    $quiet = '>/dev/null 2>&1 &';
+} else {
+    $quiet = '';
+}
+system "cd $IMAGE_DIR && bittorrent-console --no_start_trackerless_client --max_upload_rate 0 $SCRIPTS_DIR/$image_name.tar.torrent $quiet";
+print "done.\n";
+
+# Well done.
+exit(0);
+

Reply via email to